diff --git a/README.md b/README.md index 7ec226f6e..4d23640e3 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,6 @@ Whether you're novice or pro, the CodeCombat team is ready to help you implement ---------- -[![](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/challengepost.png)](http://codecombat.challengepost.com/?utm_source-github&utm_medium-oswidget&utm_campaign-codecombat) +[![](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/challengepost.png)](http://codecombat.challengepost.com/?utm_source=github&utm_medium=oswidget&utm_campaign=codecombat) [![](http://1-ps.googleusercontent.com/x/s.google-melange.appspot.com/www.google-melange.com/soc/content/2-1-20140225/images/gsoc/logo/920x156xbanner-gsoc2014.png.pagespeed.ic.gdr4t3Igca.png)](http://www.google-melange.com/gsoc/homepage/google/gsoc2014) \ No newline at end of file diff --git a/app/application.coffee b/app/application.coffee index 6b0c7f80b..caf648679 100644 --- a/app/application.coffee +++ b/app/application.coffee @@ -44,8 +44,14 @@ Application = initialize: -> }, (t) => @router = new Router() @router.subscribe() - Object.freeze this if typeof Object.freeze is 'function' - @router = Router + onIdleChanged = (to) => => Backbone.Mediator.publish 'application:idle-changed', idle: @userIsIdle = to + @idleTracker = new Idle + onAway: onIdleChanged true + onAwayBack: onIdleChanged false + onHidden: onIdleChanged true + onVisible: onIdleChanged false + awayTimeout: 5 * 60 * 1000 + @idleTracker.start() module.exports = Application window.application = Application diff --git a/app/assets/images/jquery.minicolors.png b/app/assets/images/jquery.minicolors.png new file mode 100644 index 000000000..8fa1e9d90 Binary files /dev/null and b/app/assets/images/jquery.minicolors.png differ diff --git a/app/assets/images/level/hud_info_icons.png b/app/assets/images/level/hud_info_icons.png new file mode 100644 index 000000000..bff087119 Binary files /dev/null and b/app/assets/images/level/hud_info_icons.png differ diff --git a/app/assets/images/level/info_icons.png b/app/assets/images/level/info_icons.png deleted file mode 100644 index de9ecfb6f..000000000 Binary files a/app/assets/images/level/info_icons.png and /dev/null differ diff --git a/app/assets/images/level/loading_left_wing.png b/app/assets/images/level/loading_left_wing.png new file mode 100644 index 000000000..5b7ba04a7 Binary files /dev/null and b/app/assets/images/level/loading_left_wing.png differ diff --git a/app/assets/images/level/loading_right_wing.png b/app/assets/images/level/loading_right_wing.png new file mode 100644 index 000000000..7f7ff29da Binary files /dev/null and b/app/assets/images/level/loading_right_wing.png differ diff --git a/app/assets/images/level/prop_health.png b/app/assets/images/level/prop_health.png deleted file mode 100644 index 87f3c8407..000000000 Binary files a/app/assets/images/level/prop_health.png and /dev/null differ diff --git a/app/assets/images/level/prop_inventory.png b/app/assets/images/level/prop_inventory.png deleted file mode 100644 index 37f147521..000000000 Binary files a/app/assets/images/level/prop_inventory.png and /dev/null differ diff --git a/app/assets/images/level/prop_pos.png b/app/assets/images/level/prop_pos.png deleted file mode 100644 index d3461a8e2..000000000 Binary files a/app/assets/images/level/prop_pos.png and /dev/null differ diff --git a/app/assets/images/level/prop_target.png b/app/assets/images/level/prop_target.png deleted file mode 100644 index 0f2b411ac..000000000 Binary files a/app/assets/images/level/prop_target.png and /dev/null differ diff --git a/app/assets/images/pages/contribute/archmage/glen_small.png b/app/assets/images/pages/about/glen_small.png similarity index 100% rename from app/assets/images/pages/contribute/archmage/glen_small.png rename to app/assets/images/pages/about/glen_small.png diff --git a/app/assets/images/pages/base/background_texture.png b/app/assets/images/pages/base/background_texture.png index a94fb9c17..6521dea8b 100644 Binary files a/app/assets/images/pages/base/background_texture.png and b/app/assets/images/pages/base/background_texture.png differ diff --git a/app/assets/images/pages/base/repeat-tile.png b/app/assets/images/pages/base/repeat-tile.png index ccf8400da..16186dbee 100644 Binary files a/app/assets/images/pages/base/repeat-tile.png and b/app/assets/images/pages/base/repeat-tile.png differ diff --git a/app/assets/images/pages/base/sky_repeater.png b/app/assets/images/pages/base/sky_repeater.png new file mode 100644 index 000000000..824fb83f8 Binary files /dev/null and b/app/assets/images/pages/base/sky_repeater.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_easy.png b/app/assets/images/pages/play/ladder/humans_ladder_easy.png new file mode 100644 index 000000000..ea34dcc5b Binary files /dev/null and b/app/assets/images/pages/play/ladder/humans_ladder_easy.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_hard.png b/app/assets/images/pages/play/ladder/humans_ladder_hard.png new file mode 100644 index 000000000..8cd03225d Binary files /dev/null and b/app/assets/images/pages/play/ladder/humans_ladder_hard.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_medium.png b/app/assets/images/pages/play/ladder/humans_ladder_medium.png new file mode 100644 index 000000000..f4b5fdf94 Binary files /dev/null and b/app/assets/images/pages/play/ladder/humans_ladder_medium.png differ diff --git a/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png b/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png new file mode 100644 index 000000000..8e34fc924 Binary files /dev/null and b/app/assets/images/pages/play/ladder/humans_ladder_tutorial.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_easy.png b/app/assets/images/pages/play/ladder/ogres_ladder_easy.png new file mode 100644 index 000000000..d5e4695ff Binary files /dev/null and b/app/assets/images/pages/play/ladder/ogres_ladder_easy.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_hard.png b/app/assets/images/pages/play/ladder/ogres_ladder_hard.png new file mode 100644 index 000000000..36204caf5 Binary files /dev/null and b/app/assets/images/pages/play/ladder/ogres_ladder_hard.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_medium.png b/app/assets/images/pages/play/ladder/ogres_ladder_medium.png new file mode 100644 index 000000000..5e327d74b Binary files /dev/null and b/app/assets/images/pages/play/ladder/ogres_ladder_medium.png differ diff --git a/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png b/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png new file mode 100644 index 000000000..16e952728 Binary files /dev/null and b/app/assets/images/pages/play/ladder/ogres_ladder_tutorial.png differ diff --git a/app/collections/ComponentsCollection.coffee b/app/collections/ComponentsCollection.coffee index d5b2d4837..14db7a2b6 100644 --- a/app/collections/ComponentsCollection.coffee +++ b/app/collections/ComponentsCollection.coffee @@ -2,6 +2,5 @@ LevelComponent = require 'models/LevelComponent' CocoCollection = require 'models/CocoCollection' module.exports = class ComponentsCollection extends CocoCollection - url: '/db/level_component/search' + url: '/db/level.component/search' model: LevelComponent - diff --git a/app/lib/AudioPlayer.coffee b/app/lib/AudioPlayer.coffee index b5eb4f70d..40b07974d 100644 --- a/app/lib/AudioPlayer.coffee +++ b/app/lib/AudioPlayer.coffee @@ -38,6 +38,7 @@ class AudioPlayer extends CocoClass constructor: () -> super() @ext = if createjs.Sound.getCapability('mp3') then '.mp3' else '.ogg' + @camera = null @listenToSound() @createNewManifest() @soundsToPlayWhenLoaded = {} @@ -51,6 +52,14 @@ class AudioPlayer extends CocoClass # So for now, we'll just load through SoundJS instead. createjs.Sound.on 'fileload', @onSoundLoaded + applyPanning: (options, pos) -> + sup = @camera.worldToSurface pos + svp = @camera.surfaceViewport + pan = Math.max -1, Math.min 1, ((sup.x - svp.x) - svp.width / 2) / svp.width + dst = @camera.distanceRatioTo pos + vol = Math.min 1, options.volume / Math.pow (dst + 0.2), 2 + volume: options.volume, delay: options.delay, pan: pan + # PUBLIC LOADING METHODS soundForDialogue: (message, soundTriggers) -> @@ -78,8 +87,11 @@ class AudioPlayer extends CocoClass @preloadInterfaceSounds [name] unless filename of cache @soundsToPlayWhenLoaded[name] = volume - playSound: (name, volume=1, delay=0) -> - instance = createjs.Sound.play name, {volume: (me.get('volume') ? 1) * volume, delay: delay} + playSound: (name, volume=1, delay=0, pos=null) -> + audioOptions = {volume: (me.get('volume') ? 1) * volume, delay: delay} + unless @camera is null or pos is null + audioOptions = @applyPanning audioOptions, pos + instance = createjs.Sound.play name, audioOptions instance # # TODO: load Interface sounds somehow, somewhere, somewhen diff --git a/app/lib/CocoClass.coffee b/app/lib/CocoClass.coffee index 22dc25f64..67a8e4cac 100644 --- a/app/lib/CocoClass.coffee +++ b/app/lib/CocoClass.coffee @@ -20,6 +20,7 @@ module.exports = class CocoClass destroy: -> # teardown subscriptions, prevent new ones @stopListening?() + @off() @unsubscribeAll() @stopListeningToShortcuts() @[key] = undefined for key of @ diff --git a/app/lib/God.coffee b/app/lib/God.coffee index ff92f7e31..3839013a6 100644 --- a/app/lib/God.coffee +++ b/app/lib/God.coffee @@ -30,7 +30,7 @@ module.exports = class God @createWorld() fillWorkerPool: => - return unless Worker + return unless Worker and not @dead @workerPool ?= [] if @workerPool.length < @maxWorkerPoolSize @workerPool.push @createWorker() @@ -227,7 +227,7 @@ class Angel _.delay -> worker.terminate() worker.removeEventListener 'message', onWorkerMessage - , 2000 + , 3000 @worker = null @ diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee index 52865a8b1..5651917a5 100644 --- a/app/lib/LevelLoader.coffee +++ b/app/lib/LevelLoader.coffee @@ -27,6 +27,7 @@ module.exports = class LevelLoader extends CocoClass @opponentSessionID = options.opponentSessionID @team = options.team @headless = options.headless + @spectateMode = options.spectateMode ? false @loadSession() @loadLevelModels() @@ -70,6 +71,7 @@ module.exports = class LevelLoader extends CocoClass @session.loaded and ((not @opponentSession) or @opponentSession.loaded) onSessionLoaded: -> + return if @destroyed # TODO: maybe have all non versioned models do this? Or make it work to PUT/PATCH to relative urls if @session.loaded @session.url = -> '/db/level.session/' + @id @@ -115,7 +117,7 @@ module.exports = class LevelLoader extends CocoClass @updateCompleted = true denormalizeSession: -> - return if @sessionDenormalized + return if @sessionDenormalized or @spectateMode patch = 'levelName': @level.get('name') 'levelID': @level.get('slug') or @level.id @@ -171,6 +173,7 @@ module.exports = class LevelLoader extends CocoClass t0 = new Date() @spriteSheetsToBuild += 1 thangType.once 'build-complete', => + return if @destroyed @spriteSheetsBuilt += 1 @notifyProgress() console.log "Built", thangType.get('name'), 'after', ((new Date()) - t0), 'ms' @@ -227,6 +230,7 @@ module.exports = class LevelLoader extends CocoClass notifyProgress: -> Backbone.Mediator.publish 'level-loader:progress-changed', progress: @progress() @initWorld() if @allDone() + @trigger 'progress' @trigger 'loaded-all' if @progress() is 1 destroy: -> diff --git a/app/lib/LoadingScreen.coffee b/app/lib/LoadingScreen.coffee index eab51094b..18889f240 100644 --- a/app/lib/LoadingScreen.coffee +++ b/app/lib/LoadingScreen.coffee @@ -2,7 +2,7 @@ CocoClass = require 'lib/CocoClass' module.exports = class LoadingScreen extends CocoClass progress: 0 - + constructor: (canvas) -> super() @width = canvas.width @@ -93,12 +93,12 @@ module.exports = class LoadingScreen extends CocoClass @text.text = "BUILDING" if @progress is 1 @progressBar.scaleX = @progress @stage.update() - + showReady: -> @text.text = 'READY' @text.regX = @text.getMeasuredWidth() / 2 @stage.update() - + destroy: -> @stage.canvas = null - super() \ No newline at end of file + super() diff --git a/app/lib/Router.coffee b/app/lib/Router.coffee index 43d53c479..db70b8c74 100644 --- a/app/lib/Router.coffee +++ b/app/lib/Router.coffee @@ -19,7 +19,7 @@ module.exports = class CocoRouter extends Backbone.Router 'editor/:model(/:slug_or_id)(/:subview)': 'editorModelView' # Experimenting with direct links - 'play/ladder/:levelID/team/:team': go('play/ladder/team_view') +# 'play/ladder/:levelID/team/:team': go('play/ladder/team_view') # db and file urls call the server directly 'db/*path': 'routeToServer' @@ -90,7 +90,7 @@ module.exports = class CocoRouter extends Backbone.Router @cache[route].fromCache = true return @cache[route] view = @getView(route) - @cache[route] = view unless view and view.cache is false + @cache[route] = view if view?.cache return view routeDirectly: (path, args) -> diff --git a/app/lib/auth.coffee b/app/lib/auth.coffee index 2af810b37..df2b2b6c3 100644 --- a/app/lib/auth.coffee +++ b/app/lib/auth.coffee @@ -43,7 +43,12 @@ init = -> module.exports.me = window.me = new User(storedUser) me.url = -> '/auth/whoami' me.fetch() + + retry = -> me.fetch() # blindly try again + error = -> setTimeout(retry, 1000) # blindly try again + me.on 'error', error, @ me.on 'sync', -> + me.off 'error', error, @ if firstTime me.url = -> "/db/user/#{me.id}" trackFirstArrival() if firstTime if me and not me.get('testGroupNumber')? diff --git a/app/lib/errors.coffee b/app/lib/errors.coffee index 372507d0c..8e7fe4203 100644 --- a/app/lib/errors.coffee +++ b/app/lib/errors.coffee @@ -21,7 +21,7 @@ module.exports.genericFailure = (jqxhr) -> if existingForm[0] missingErrors = applyErrorsToForm(existingForm, [error]) for error in missingErrors - existingForm.append($('
').text(error.message)) + existingForm.append($('
').text(error.message)) else res = errorModalTemplate( status:jqxhr.status diff --git a/app/lib/scripts/SpriteScriptModule.coffee b/app/lib/scripts/SpriteScriptModule.coffee index bc4514061..84585e0f3 100644 --- a/app/lib/scripts/SpriteScriptModule.coffee +++ b/app/lib/scripts/SpriteScriptModule.coffee @@ -1,5 +1,6 @@ ScriptModule = require './ScriptModule' {me} = require 'lib/auth' +utils = require 'lib/utils' module.exports = class SpritesScriptModule extends ScriptModule @neededFor: (noteGroup) -> @@ -35,10 +36,10 @@ module.exports = class SpritesScriptModule extends ScriptModule responses = sprite.say.responses responses = [] unless script.skippable or responses for response in responses ? [] - response.text = response.i18n?[me.lang()]?.text ? response.text - text = sprite.say.i18n?[me.lang()]?.text or sprite.say.text - blurb = sprite.say.i18n?[me.lang()]?.blurb or sprite.say.blurb - sound = sprite.say.sound?[me.lang()]?.sound or sprite.say.sound + response.text = utils.i18n response, 'text' + text = utils.i18n sprite.say, 'text' + blurb = utils.i18n sprite.say, 'blurb' + sound = sprite.say.sound # TODO support sound i18n note = channel: 'level-sprite-dialogue' event: diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee index 521e810c7..38463114c 100644 --- a/app/lib/simulator/Simulator.coffee +++ b/app/lib/simulator/Simulator.coffee @@ -11,6 +11,11 @@ module.exports = class Simulator @retryDelayInSeconds = 10 @taskURL = '/queue/scoring' + destroy: -> + @off() + @cleanupSimulation() + # TODO: More teardown? + fetchAndSimulateTask: => @trigger 'statusUpdate', 'Fetching simulation data!' $.ajax @@ -20,17 +25,21 @@ module.exports = class Simulator success: @setupSimulationAndLoadLevel handleFetchTaskError: (errorData) => - console.log "There were no games to score. Error: #{JSON.stringify errorData}" - console.log "Retrying in #{@retryDelayInSeconds}" - @trigger 'statusUpdate', 'There were no games to simulate! Trying again in 10 seconds.' + console.error "There was a horrible Error: #{JSON.stringify errorData}" + @trigger 'statusUpdate', 'There was an error fetching games to simulate. Retrying in 10 seconds.' + @simulateAnotherTaskAfterDelay() + handleNoGamesResponse: -> + @trigger 'statusUpdate', 'There were no games to simulate--nice. Retrying in 10 seconds.' @simulateAnotherTaskAfterDelay() simulateAnotherTaskAfterDelay: => + console.log "Retrying in #{@retryDelayInSeconds}" retryDelayInMilliseconds = @retryDelayInSeconds * 1000 _.delay @fetchAndSimulateTask, retryDelayInMilliseconds - setupSimulationAndLoadLevel: (taskData) => + setupSimulationAndLoadLevel: (taskData, textStatus, jqXHR) => + return @handleNoGamesResponse() if jqXHR.status is 204 @trigger 'statusUpdate', 'Setting up simulation!' @task = new SimulationTask(taskData) @supermodel = new SuperModel() @@ -99,7 +108,7 @@ module.exports = class Simulator @fetchAndSimulateTask() cleanupSimulation: -> - @god.destroy() + @god?.destroy() @god = null @world = null @level = null @@ -207,7 +216,12 @@ module.exports = class Simulator transpileSpell: (thang, spellKey, methodName) -> slugifiedThangID = _.string.slugify thang.id source = @currentUserCodeMap[[slugifiedThangID,methodName].join '/'] ? "" - @spells[spellKey].thangs[thang.id].aether.transpile source + aether = @spells[spellKey].thangs[thang.id].aether + try + aether.transpile source + catch e + console.log "Couldn't transpile #{spellKey}:\n#{source}\n", e + aether.transpile '' createAether: (methodName, method) -> aetherOptions = diff --git a/app/lib/sprites/SpriteParser.coffee b/app/lib/sprites/SpriteParser.coffee index 75288c5fa..15fe749cd 100644 --- a/app/lib/sprites/SpriteParser.coffee +++ b/app/lib/sprites/SpriteParser.coffee @@ -2,7 +2,10 @@ module.exports = class SpriteParser constructor: (@thangTypeModel) -> # Create a new ThangType, or work with one we've been building @thangType = _.cloneDeep(@thangTypeModel.attributes.raw) - @thangType ?= {shapes: {}, containers: {}, animations: {}} + @thangType ?= {} + @thangType.shapes ?= {} + @thangType.containers ?= {} + @thangType.animations ?= {} # Internal parser state @shapeLongKeys = {} @@ -24,6 +27,11 @@ module.exports = class SpriteParser @animationLongKeys[longKey] = shortKey parse: (source) -> + # Grab the library properties' width/height so we can subtract half of each from frame bounds + properties = source.match(/.*lib\.properties = \{\n.*?width: (\d+),\n.*?height: (\d+)/im) + @width = parseInt(properties?[1] ? "0", 10) + @height = parseInt(properties?[2] ? "0", 10) + options = {loc: false, range: true} ast = esprima.parse source, options blocks = @findBlocks ast, source @@ -178,11 +186,18 @@ module.exports = class SpriteParser else if arg.type is 'AssignmentExpression' bounds = @grabFunctionArguments argSource.replace('rect=', ''), true lastRect = bounds + else if arg.type is 'Literal' and arg.value is null + bounds = [0, 0, 1, 1] # Let's try this. frameBounds.push bounds else console.log "Didn't have multiframe bounds for this movie clip!" frameBounds = [nominalBounds] + # Subtract half of width/height parsed from lib.properties + for bounds in frameBounds + bounds[0] -= @width / 2 + bounds[1] -= @height / 2 + functionExpressions.push {name: name, bounds: nominalBounds, frameBounds: frameBounds, expression: node.parent.parent, kind: kind} @walk ast, null, gatherFunctionExpressions functionExpressions diff --git a/app/lib/surface/Camera.coffee b/app/lib/surface/Camera.coffee index 6c5ec946f..6427caec1 100644 --- a/app/lib/surface/Camera.coffee +++ b/app/lib/surface/Camera.coffee @@ -5,8 +5,8 @@ CocoClass = require 'lib/CocoClass' r2d = (radians) -> radians * 180 / Math.PI d2r = (degrees) -> degrees / 180 * Math.PI -MAX_ZOOM = 8 -MIN_ZOOM = 0.1 +MAX_ZOOM = 4 +MIN_ZOOM = 0.05 DEFAULT_ZOOM = 2.0 DEFAULT_TARGET = {x:0, y:0} DEFAULT_TIME = 1000 @@ -42,6 +42,7 @@ module.exports = class Camera extends CocoClass 'level:restarted': 'onLevelRestarted' 'sprite:mouse-down': 'onMouseDown' 'sprite:dragged': 'onMouseDragged' + 'camera-zoom-to': 'onZoomTo' # TODO: Fix tests to not use mainLayer constructor: (@canvasWidth, @canvasHeight, angle=Math.asin(0.75), hFOV=d2r(30)) -> @@ -164,12 +165,13 @@ module.exports = class Camera extends CocoClass target = {x: newTargetX, y:newTargetY} else target = @target - @zoomTo target, newZoom, 0 + if not(newZoom >= MAX_ZOOM or newZoom <= Math.max(@minZoom, MIN_ZOOM)) + @zoomTo target, newZoom, 0 onMouseDown: (e) -> return if @dragDisabled @lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY} - + onMouseDragged: (e) -> return if @dragDisabled target = @boundTarget(@target, @zoom) @@ -180,7 +182,7 @@ module.exports = class Camera extends CocoClass @zoomTo newPos, @zoom, 0 @lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY} Backbone.Mediator.publish 'camera:dragged' - + onLevelRestarted: -> @setBounds(@firstBounds, false) @@ -220,7 +222,7 @@ module.exports = class Camera extends CocoClass newTarget ?= {x:0, y:0} newTarget = (@newTarget or @target) if @locked newZoom = Math.min((Math.max @minZoom, newZoom), MAX_ZOOM) - + thangType = @target?.sprite?.thangType if thangType @offset = _.clone(thangType.get('positions')?.torso or {x: 0, y:0}) @@ -229,7 +231,7 @@ module.exports = class Camera extends CocoClass @offset.y *= scale else @offset = {x: 0, y:0} - + return if @zoom is newZoom and newTarget is newTarget.x and newTarget.y is newTarget.y @finishTween(true) @@ -240,14 +242,14 @@ module.exports = class Camera extends CocoClass @newZoom = newZoom @tweenProgress = 0.01 createjs.Tween.get(@) - .to({tweenProgress: 1.0}, time, createjs.Ease.getPowInOut(3)) + .to({tweenProgress: 1.0}, time, createjs.Ease.getPowOut(4)) .call @finishTween else @target = newTarget @zoom = newZoom @updateZoom true - + focusedOnSprite: -> return @target?.name @@ -308,3 +310,6 @@ module.exports = class Camera extends CocoClass createjs.Tween.removeTweens @ @finishTween = null super() + + onZoomTo: (pos, time) -> + @zoomTo(@worldToSurface(pos), @zoom, time) diff --git a/app/lib/surface/CocoSprite.coffee b/app/lib/surface/CocoSprite.coffee index 008519599..9b6b68804 100644 --- a/app/lib/surface/CocoSprite.coffee +++ b/app/lib/surface/CocoSprite.coffee @@ -62,6 +62,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass @actionQueue = [] @marks = {} @labels = {} + @handledAoEs = {} @age = 0 @displayObject = new createjs.Container() if @thangType.get('actions') @@ -75,6 +76,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass @stillLoading = false @actions = @thangType.getActions() @buildFromSpriteSheet @buildSpriteSheet() + @createMarks() destroy: -> mark.destroy() for name, mark of @marks @@ -82,6 +84,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass @imageObject?.off 'animationend', @playNextAction @playNextAction = null @displayObject?.off() + clearInterval @effectInterval if @effectInterval super() toString: -> "" @@ -166,18 +169,46 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass @imageObject?.play?() mark.play() for name, mark of @marks - update: -> + update: (frameChanged) -> # Gets the sprite to reflect what the current state of the thangs and surface are return if @stillLoading @updatePosition() - @updateScale() - @updateAlpha() - @updateRotation() - @updateAction() - @updateStats() + if frameChanged + @updateScale() # must happen before rotation + @updateAlpha() + @updateRotation() + @updateAction() + @updateStats() + @updateGold() + @showAreaOfEffects() @updateMarks() @updateLabels() - @updateGold() + + showAreaOfEffects: -> + return unless @thang?.currentEvents + for event in @thang.currentEvents + continue unless event.startsWith 'aoe-' + continue if @handledAoEs[event] + + @handledAoEs[event] = true + args = JSON.parse(event[4...]) + pos = @options.camera.worldToSurface {x:args[0], y:args[1]} + circle = new createjs.Shape() + circle.graphics.beginFill(args[3]).drawCircle(0, 0, args[2]*Camera.PPM) + circle.x = pos.x + circle.y = pos.y + circle.scaleY = @options.camera.y2x * 0.7 + circle.scaleX = 0.7 + circle.alpha = 0.2 + circle + @options.groundLayer.addChild circle + createjs.Tween.get(circle) + .to({alpha: 0.6, scaleY: @options.camera.y2x, scaleX: 1}, 100, createjs.Ease.circOut) + .to({alpha: 0, scaleY: 0, scaleX: 0}, 700, createjs.Ease.circIn) + .call => + return if @destroyed + @options.groundLayer.removeChild circle + delete @handledAoEs[event] cache: -> bounds = @imageObject.getBounds() @@ -188,14 +219,18 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass return 0 unless @thang.bobHeight @thang.bobHeight * (1 + Math.sin(@age * Math.PI / @thang.bobTime)) - updatePosition: -> - return unless @thang?.pos and @options.camera? - [p0, p1] = [@lastPos, @thang.pos] + getWorldPosition: -> + p1 = @thang.pos if bobOffset = @getBobOffset() p1 = p1.copy?() or _.clone(p1) p1.z += bobOffset + x: p1.x, y: p1.y, z: if @thang.isLand then 0 else p1.z - @thang.depth / 2 + + updatePosition: -> + return unless @thang?.pos and @options.camera? + wop = @getWorldPosition() + [p0, p1] = [@lastPos, @thang.pos] return if p0 and p0.x is p1.x and p0.y is p1.y and p0.z is p1.z and not @options.camera.tweeningZoomTo - wop = x: p1.x, y: p1.y, z: if @thang.isLand then 0 else p1.z - @thang.depth / 2 sup = @options.camera.worldToSurface wop [@displayObject.x, @displayObject.y] = [sup.x, sup.y] @lastPos = p1.copy?() or _.clone(p1) @@ -246,13 +281,15 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass return unless @currentAction return if _.string.endsWith(@currentAction.name, 'back') return if _.string.endsWith(@currentAction.name, 'fore') - @imageObject.scaleX *= -1 if Math.abs(rotation) >= 90 + imageObject.scaleX *= -1 if Math.abs(rotation) >= 90 ################################################## updateAction: -> action = @determineAction() - isDifferent = action isnt @currentRootAction - console.error "action is", action, "for", @thang?.id, "from", @currentRootAction, @thang.action, @thang.getActionName?() if not action and @thang?.actionActivated and @thang.id is 'Artillery' + isDifferent = action isnt @currentRootAction or action is null + if not action and @thang?.actionActivated and not @stopLogging + console.error "action is", action, "for", @thang?.id, "from", @currentRootAction, @thang.action, @thang.getActionName?() + @stopLogging = true @queueAction(action) if isDifferent or (@thang?.actionActivated and action.name isnt 'move') @updateActionDirection() @@ -321,7 +358,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass return if @thang.health is @lastHealth @lastHealth = @thang.health healthPct = Math.max(@thang.health / @thang.maxHealth, 0) - bar.scaleX = healthPct + bar.scaleX = healthPct / bar.baseScale healthOffset = @getOffset 'aboveHead' [bar.x, bar.y] = [healthOffset.x - bar.width / 2, healthOffset.y] @@ -350,7 +387,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass bar = @healthBar = createProgressBar(healthColor, healthOffset.y) bar.x = healthOffset.x - bar.width / 2 bar.name = 'health bar' - bar.cache 0, -bar.height / 2, bar.width, bar.height + bar.cache 0, -bar.height * bar.baseScale / 2, bar.width * bar.baseScale, bar.height * bar.baseScale @displayObject.addChild bar getActionProp: (prop, subProp, def=null) -> @@ -369,18 +406,79 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass scale *= @options.resolutionFactor if prop is 'registration' pos.x *= scale pos.y *= scale + if @thang and prop isnt 'registration' + scaleFactor = @thang.scaleFactor ? 1 + pos.x *= @thang.scaleFactorX ? scaleFactor + pos.y *= @thang.scaleFactorY ? scaleFactor pos + createMarks: -> + if @thang + allProps = [] + allProps = allProps.concat (@thang.hudProperties ? []) + allProps = allProps.concat (@thang.programmableProperties ? []) + allProps = allProps.concat (@thang.moreProgrammableProperties ? []) + + @addMark('voiceradius') if 'voiceRange' in allProps + @addMark('visualradius') if 'visualRange' in allProps + @addMark('attackradius') if 'attackRange' in allProps + + @addMark('bounds').toggle true if @thang?.drawsBounds + @addMark('shadow').toggle true unless @thangType.get('shadow') is 0 + updateMarks: -> return unless @options.camera - @addMark 'repair', null, @options.markThangTypes.repair if @thang?.errorsOut + @addMark 'repair', null, 'repair' if @thang?.errorsOut @marks.repair?.toggle @thang?.errorsOut - @addMark('bounds').toggle true if @thang?.drawsBounds - @addMark('shadow').toggle true unless @thangType.get('shadow') is 0 + + if @selected + @marks.voiceradius?.toggle true + @marks.visualradius?.toggle true + @marks.attackradius?.toggle true + else + @marks.voiceradius?.toggle false + @marks.visualradius?.toggle false + @marks.attackradius?.toggle false + mark.update() for name, mark of @marks + #@thang.effectNames = ['berserk', 'confuse', 'control', 'curse', 'fear', 'poison', 'paralyze', 'regen', 'sleep', 'slow', 'haste'] + @updateEffectMarks() if @thang?.effectNames?.length or @previousEffectNames?.length + + updateEffectMarks: -> + return if _.isEqual @thang.effectNames, @previousEffectNames + for effect in @thang.effectNames + mark = @addMark effect, @options.floatingLayer, effect + mark.statusEffect = true + mark.toggle 'on' + mark.show() + + if @previousEffectNames + for effect in @previousEffectNames + continue if effect in @thang.effectNames + mark = @marks[effect] + mark.toggle false + + if @thang.effectNames.length > 1 and not @effectInterval + @rotateEffect() + @effectInterval = setInterval @rotateEffect, 1500 + + else if @effectInterval and @thang.effectNames.length <= 1 + clearInterval @effectInterval + @effectInterval = null + + @previousEffectNames = @thang.effectNames + + rotateEffect: => + effects = (m.name for m in _.values(@marks) when m.on and m.statusEffect and m.mark) + return unless effects.length + effects.sort() + @effectIndex ?= 0 + @effectIndex = (@effectIndex + 1) % effects.length + @marks[effect].hide() for effect in effects + @marks[effects[@effectIndex]].show() setHighlight: (to, delay) -> - @addMark 'highlight', @options.floatingLayer, @options.markThangTypes.highlight if to + @addMark 'highlight', @options.floatingLayer, 'highlight' if to @marks.highlight?.highlightDelay = delay @marks.highlight?.toggle to and not @dimmed @@ -475,6 +573,6 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass return null unless sound delay = if withDelay and sound.delay then 1000 * sound.delay / createjs.Ticker.getFPS() else 0 name = AudioPlayer.nameForSoundReference sound - instance = AudioPlayer.playSound name, volume, delay + instance = AudioPlayer.playSound name, volume, delay, @getWorldPosition() # console.log @thang?.id, "played sound", name, "with delay", delay, "volume", volume, "and got sound instance", instance instance diff --git a/app/lib/surface/CoordinateDisplay.coffee b/app/lib/surface/CoordinateDisplay.coffee index 7fe570b4e..5f07fd67f 100644 --- a/app/lib/surface/CoordinateDisplay.coffee +++ b/app/lib/surface/CoordinateDisplay.coffee @@ -4,6 +4,7 @@ module.exports = class CoordinateDisplay extends createjs.Container 'surface:mouse-moved': 'onMouseMove' 'surface:mouse-out': 'onMouseOut' 'surface:mouse-over': 'onMouseOver' + 'surface:stage-mouse-down': 'onMouseDown' 'camera:zoom-updated': 'onZoomUpdated' constructor: (options) -> @@ -22,7 +23,7 @@ module.exports = class CoordinateDisplay extends createjs.Container build: -> @mouseEnabled = @mouseChildren = false - @addChild @label = new createjs.Text("", "20px Arial", "#003300") + @addChild @label = new createjs.Text("", "40px Arial", "#003300") @label.name = 'position text' @label.shadow = new createjs.Shadow("#FFFFFF", 1, 1, 0) @@ -30,6 +31,10 @@ module.exports = class CoordinateDisplay extends createjs.Container onMouseOut: (e) -> @mouseInBounds = false onMouseMove: (e) -> + if @mouseInBounds and key.shift + $('#surface').addClass('flag-cursor') unless $('#surface').hasClass('flag-cursor') + else if @mouseInBounds + $('#surface').removeClass('flag-cursor') if $('#surface').hasClass('flag-cursor') wop = @camera.canvasToWorld x: e.x, y: e.y wop.x = Math.round(wop.x) wop.y = Math.round(wop.y) @@ -38,6 +43,13 @@ module.exports = class CoordinateDisplay extends createjs.Container @hide() @show() # debounced + onMouseDown: (e) -> + return unless key.shift + wop = @camera.canvasToWorld x: e.x, y: e.y + wop.x = Math.round wop.x + wop.y = Math.round wop.y + Backbone.Mediator.publish 'surface:coordinate-selected', wop + onZoomUpdated: (e) -> @hide() @show() diff --git a/app/lib/surface/DebugDisplay.coffee b/app/lib/surface/DebugDisplay.coffee index a53059bf4..925d98592 100644 --- a/app/lib/surface/DebugDisplay.coffee +++ b/app/lib/surface/DebugDisplay.coffee @@ -25,10 +25,10 @@ module.exports = class DebugDisplay extends createjs.Container build: -> @mouseEnabled = @mouseChildren = false - @addChild @frameText = new createjs.Text "...", "20px Arial", "#FFF" + @addChild @frameText = new createjs.Text "...", "40px Arial", "#FFF" @frameText.name = 'frame text' - @frameText.x = @canvasWidth - 50 - @frameText.y = @canvasHeight - 25 + @frameText.x = @canvasWidth - 100 + @frameText.y = @canvasHeight - 50 @frameText.alpha = 0.5 updateFrame: (currentFrame) -> @@ -42,4 +42,4 @@ module.exports = class DebugDisplay extends createjs.Container @framesRenderedThisSecond = 0 @frameText.text = Math.round(currentFrame) + (if @fps? then " - " + @fps + ' fps' else '') - @frameText.x = @canvasWidth - @frameText.getMeasuredWidth() - 10 + @frameText.x = @canvasWidth - @frameText.getMeasuredWidth() - 20 diff --git a/app/lib/surface/Label.coffee b/app/lib/surface/Label.coffee index 3b7a37de6..1427dbb75 100644 --- a/app/lib/surface/Label.coffee +++ b/app/lib/surface/Label.coffee @@ -59,7 +59,7 @@ module.exports = class Label extends CocoClass o.fontWeight = {D: "bold", S: "bold", N: "bold"}[st] o.shadow = {D: false, S: true, N: true}[st] o.shadowColor = {D: "#FFF", S: "#000", N: "#FFF"}[st] - o.fontSize = {D: 25, S: 12, N: 12}[st] + o.fontSize = {D: 50, S: 24, N: 24}[st] fontFamily = {D: "Arial", S: "Arial", N: "Arial"}[st] o.fontDescriptor = "#{o.fontWeight} #{o.fontSize}px #{fontFamily}" o.fontColor = {D: "#000", S: "#FFF", N: "#00a"}[st] diff --git a/app/lib/surface/Mark.coffee b/app/lib/surface/Mark.coffee index c012b537c..dc7568b12 100644 --- a/app/lib/surface/Mark.coffee +++ b/app/lib/surface/Mark.coffee @@ -1,5 +1,7 @@ CocoClass = require 'lib/CocoClass' Camera = require './Camera' +ThangType = require 'models/ThangType' +markThangTypes = {} module.exports = class Mark extends CocoClass subscriptions: {} @@ -20,6 +22,7 @@ module.exports = class Mark extends CocoClass destroy: -> @mark?.parent?.removeChild @mark @markSprite?.destroy() + @thangType?.off 'sync', @onLoadedThangType, @ @sprite = null super() @@ -27,7 +30,9 @@ module.exports = class Mark extends CocoClass toggle: (to) -> return @ if to is @on + return @toggleTo = to unless @mark @on = to + delete @toggleTo if @on @layer.addChild @mark @layer.updateLayerOrder() @@ -50,9 +55,12 @@ module.exports = class Mark extends CocoClass if @name is 'bounds' then @buildBounds() else if @name is 'shadow' then @buildShadow() else if @name is 'debug' then @buildDebug() + else if @name is 'voiceradius' then @buildRadius('voice') + else if @name is 'visualradius' then @buildRadius('visual') + else if @name is 'attackradius' then @buildRadius('attack') else if @thangType then @buildSprite() else console.error "Don't know how to build mark for", @name - @mark.mouseEnabled = false + @mark?.mouseEnabled = false @ buildBounds: -> @@ -76,7 +84,7 @@ module.exports = class Mark extends CocoClass shape.graphics.endStroke() shape.graphics.endFill() - text = new createjs.Text "" + index, "20px Arial", color.replace('0.5', '1') + text = new createjs.Text "" + index, "40px Arial", color.replace('0.5', '1') text.regX = text.getMeasuredWidth() / 2 text.regY = text.getMeasuredHeight() / 2 text.shadow = new createjs.Shadow("#000000", 1, 1, 0) @@ -109,8 +117,59 @@ module.exports = class Mark extends CocoClass @mark.layerIndex = 10 #@mark.cache 0, 0, diameter, diameter # not actually faster than simple ellipse draw - buildRadius: -> - return # not implemented + buildRadius: (type) -> + return if type is 'voice' and @sprite.thang.voiceRange > 9000 + return if type is 'visual' and @sprite.thang.visualRange > 9000 + return if type is 'attack' and @sprite.thang.attackRange > 9000 + + colors = + voice: "rgba(0, 145, 0, alpha)" + visual: "rgba(0, 0, 145, alpha)" + attack: "rgba(145, 0, 0, alpha)" + + color = colors[type] + + @mark = new createjs.Shape() + @mark.graphics.beginFill color.replace('alpha', 0.4) + + if type is 'voice' + r = @sprite.thang.voiceRange + ranges = [ + r, + if 'visualradius' of @sprite.marks and @sprite.thang.visualRange < 9001 then @sprite.thang.visualRange else 0, + if 'attackradius' of @sprite.marks and @sprite.thang.attackRange < 9001 then @sprite.thang.attackRange else 0 + ] + else if type is 'visual' + r = @sprite.thang.visualRange + ranges = [ + r, + if 'attackradius' of @sprite.marks and @sprite.thang.attackRange < 9001 then @sprite.thang.attackRange else 0, + if 'voiceradius' of @sprite.marks and @sprite.thang.voiceRange < 9001 then @sprite.thang.voiceRange else 0, + ] + else if type is 'attack' + r = @sprite.thang.attackRange + ranges = [ + r, + if 'voiceradius' of @sprite.marks and @sprite.thang.voiceRange < 9001 then @sprite.thang.voiceRange else 0, + if 'visualradius' of @sprite.marks and @sprite.thang.visualRange < 9001 then @sprite.thang.visualRange else 0 + ] + + # Draw the outer circle + @mark.graphics.drawCircle 0, 0, r * Camera.PPM + + # Cut out the inner circle + if Math.max(ranges['1'], ranges['2']) < r + @mark.graphics.arc 0, 0, Math.max(ranges['1'], ranges['2']) * Camera.PPM, Math.PI*2, 0, true + else if Math.min(ranges['1'], ranges['2']) < r + @mark.graphics.arc 0, 0, Math.min(ranges['1'], ranges['2']) * Camera.PPM, Math.PI*2, 0, true + + # Add perspective + @mark.scaleY *= @camera.y2x + + @mark.graphics.endStroke() + @mark.graphics.endFill() + + return buildDebug: -> @mark = new createjs.Shape() @@ -126,15 +185,35 @@ module.exports = class Mark extends CocoClass @mark.graphics.endFill() buildSprite: -> - #console.log "building", @name, "with thangtype", @thangType + if _.isString @thangType + thangType = markThangTypes[@thangType] + return @loadThangType() if not thangType + @thangType = thangType + + return @thangType.once 'sync', @onLoadedThangType, @ if not @thangType.loaded CocoSprite = require './CocoSprite' markSprite = new CocoSprite @thangType, @thangType.spriteOptions markSprite.queueAction 'idle' @mark = markSprite.displayObject @markSprite = markSprite + loadThangType: -> + name = @thangType + @thangType = new ThangType() + @thangType.url = -> "/db/thang.type/#{name}" + @thangType.once 'sync', @onLoadedThangType, @ + @thangType.fetch() + markThangTypes[name] = @thangType + window.mtt = markThangTypes + + onLoadedThangType: -> + @build() + @toggle(@toggleTo) if @toggleTo? + Backbone.Mediator.publish 'sprite:loaded' + update: (pos=null) -> - return false unless @on + return false unless @on and @mark + @mark.visible = not @hidden @updatePosition pos @updateRotation() @updateScale() @@ -156,10 +235,11 @@ module.exports = class Mark extends CocoClass pos ?= @sprite?.displayObject @mark.x = pos.x @mark.y = pos.y - if @name is 'highlight' + if @statusEffect or @name is 'highlight' offset = @sprite.getOffset 'aboveHead' @mark.x += offset.x @mark.y += offset.y + @mark.y -= 3 if @statusEffect updateRotation: -> if @name is 'debug' or (@name is 'shadow' and @sprite.thang?.shape in ["rectangle", "box"]) @@ -187,3 +267,5 @@ module.exports = class Mark extends CocoClass stop: -> @markSprite?.stop() play: -> @markSprite?.play() + hide: -> @hidden = true + show: -> @hidden = false diff --git a/app/lib/surface/MusicPlayer.coffee b/app/lib/surface/MusicPlayer.coffee index 13cca1a17..57ff7c72e 100644 --- a/app/lib/surface/MusicPlayer.coffee +++ b/app/lib/surface/MusicPlayer.coffee @@ -23,7 +23,7 @@ module.exports = class MusicPlayer extends CocoClass src = e.file if src src = "/file#{src}#{AudioPlayer.ext}" - return @currentMusic.play() if src is @currentMusic?.src + return @currentMusic.play('none', 0, 0, -1, 0.3) if src is @currentMusic?.src media = AudioPlayer.getStatus(src) if not media?.loaded AudioPlayer.preloadSound(src) diff --git a/app/lib/surface/PlaybackOverScreen.coffee b/app/lib/surface/PlaybackOverScreen.coffee index b92691795..dba87def5 100644 --- a/app/lib/surface/PlaybackOverScreen.coffee +++ b/app/lib/surface/PlaybackOverScreen.coffee @@ -1,6 +1,6 @@ CocoClass = require 'lib/CocoClass' -module.exports = class PlaybackoverScreen extends CocoClass +module.exports = class PlaybackOverScreen extends CocoClass constructor: (options) -> super() options ?= {} @@ -10,7 +10,7 @@ module.exports = class PlaybackoverScreen extends CocoClass console.error @toString(), "needs a layer." unless @layer @build() - toString: -> "" + toString: -> "" build: -> @dimLayer = new createjs.Container() @@ -23,18 +23,16 @@ module.exports = class PlaybackoverScreen extends CocoClass @layer.addChild @dimLayer show: -> - console.log 'show playback over screen', @showing return if @showing @showing = true - + @dimLayer.alpha = 0 createjs.Tween.removeTweens @dimLayer createjs.Tween.get(@dimLayer).to({alpha:1}, 500) hide: -> - console.log 'hide playback over screen', @showing return unless @showing @showing = false - + createjs.Tween.removeTweens @dimLayer createjs.Tween.get(@dimLayer).to({alpha:0}, 500) diff --git a/app/lib/surface/RegionChooser.coffee b/app/lib/surface/RegionChooser.coffee index d0dbdc82a..7d28131d4 100644 --- a/app/lib/surface/RegionChooser.coffee +++ b/app/lib/surface/RegionChooser.coffee @@ -7,7 +7,6 @@ module.exports = class RegionChooser extends CocoClass @options.stage.addEventListener 'stagemousedown', @onMouseDown @options.stage.addEventListener 'stagemousemove', @onMouseMove @options.stage.addEventListener 'stagemouseup', @onMouseUp - @options.camera.dragDisabled = true destroy: -> @options.stage.removeEventListener 'stagemousedown', @onMouseDown @@ -18,6 +17,7 @@ module.exports = class RegionChooser extends CocoClass onMouseDown: (e) => return unless key.shift @firstPoint = @options.camera.canvasToWorld {x: e.stageX, y: e.stageY} + @options.camera.dragDisabled = true onMouseMove: (e) => return unless @firstPoint @@ -30,6 +30,7 @@ module.exports = class RegionChooser extends CocoClass Backbone.Mediator.publish 'choose-region', points: [@firstPoint, @secondPoint] @firstPoint = null @secondPoint = null + @options.camera.dragDisabled = false restrictRegion: -> RATIO = 1.56876 # 924 / 589 diff --git a/app/lib/surface/SpriteBoss.coffee b/app/lib/surface/SpriteBoss.coffee index 130d017b7..7e3fc29a7 100644 --- a/app/lib/surface/SpriteBoss.coffee +++ b/app/lib/surface/SpriteBoss.coffee @@ -22,6 +22,7 @@ module.exports = class SpriteBoss extends CocoClass 'god:new-world-created': 'onNewWorld' 'tome:cast-spells': 'onCastSpells' 'camera:dragged': 'onCameraDragged' + 'sprite:loaded': -> @update(true) constructor: (@options) -> super() @@ -48,10 +49,6 @@ module.exports = class SpriteBoss extends CocoClass thangTypeFor: (type) -> _.find @options.thangTypes, (m) -> m.get('original') is type or m.get('name') is type - markThangTypes: -> - highlight: @thangTypeFor "Highlight" - repair: @thangTypeFor "Repair" - createLayers: -> @spriteLayers = {} for [name, priority] in [ @@ -87,11 +84,11 @@ module.exports = class SpriteBoss extends CocoClass sprite createMarks: -> - @targetMark = new Mark name: 'target', camera: @camera, layer: @spriteLayers["Ground"], thangType: @thangTypeFor("Target") - @selectionMark = new Mark name: 'selection', camera: @camera, layer: @spriteLayers["Ground"], thangType: @thangTypeFor("Selection") + @targetMark = new Mark name: 'target', camera: @camera, layer: @spriteLayers["Ground"], thangType: 'target' + @selectionMark = new Mark name: 'selection', camera: @camera, layer: @spriteLayers["Ground"], thangType: 'selection' createSpriteOptions: (options) -> - _.extend options, camera: @camera, resolutionFactor: 4, groundLayer: @spriteLayers["Ground"], textLayer: @surfaceTextLayer, floatingLayer: @spriteLayers["Floating"], markThangTypes: @markThangTypes(), spriteSheetCache: @spriteSheetCache, showInvisible: @options.showInvisible + _.extend options, camera: @camera, resolutionFactor: 4, groundLayer: @spriteLayers["Ground"], textLayer: @surfaceTextLayer, floatingLayer: @spriteLayers["Floating"], spriteSheetCache: @spriteSheetCache, showInvisible: @options.showInvisible createIndieSprites: (indieSprites, withWizards) -> unless @indieSprites @@ -113,7 +110,13 @@ module.exports = class SpriteBoss extends CocoClass createOpponentWizard: (opponent) -> # TODO: colorize name and cloud by team, colorize wizard by user's color config, level-specific wizard spawn points sprite = @createWizardSprite thangID: opponent.id, name: opponent.name - sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28} + if not opponent.levelSlug or opponent.levelSlug is "brawlwood" + sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28} + else if opponent.levelSlug is "dungeon-arena" + sprite.targetPos = if opponent.team is 'ogres' then {x:72, y: 39} else {x: 9, y:39} + else + sprite.targetPos = if opponent.team is 'ogres' then {x:52, y: 28} else {x: 20, y:28} + createWizardSprite: (options) -> sprite = new WizardSprite @thangTypeFor("Wizard"), @createSpriteOptions(options) @@ -154,15 +157,17 @@ module.exports = class SpriteBoss extends CocoClass removeSprite: (sprite) -> sprite.displayObject.parent.removeChild sprite.displayObject + thang = sprite.thang delete @sprites[sprite.thang.id] sprite.destroy() + sprite.thang = thang # Keep around so that we know which thang the destroyed thang was for updateSounds: -> sprite.playSounds() for thangID, sprite of @sprites # hmm; doesn't work for sprites which we didn't add yet in adjustSpriteExistence update: (frameChanged) -> @adjustSpriteExistence() if frameChanged - sprite.update() for thangID, sprite of @sprites + sprite.update frameChanged for thangID, sprite of @sprites @updateSelection() @spriteLayers["Default"].updateLayerOrder() @cache() @@ -185,11 +190,10 @@ module.exports = class SpriteBoss extends CocoClass sprite.hasMoved = false @removeSprite sprite if missing @cache true if updateCache and @cached - + # mainly for handling selecting thangs from session when the thang is not always in existence if @willSelectThang and @sprites[@willSelectThang[0]] @selectThang @willSelectThang... - @willSelectThang = null cache: (update=false) -> return if @cached and not update @@ -216,12 +220,12 @@ module.exports = class SpriteBoss extends CocoClass @play() onCastSpells: -> @stop() - + play: -> sprite.imageObject.play() for thangID, sprite of @sprites @selectionMark?.play() @targetMark?.play() - + stop: -> sprite.imageObject.stop() for thangID, sprite of @sprites @selectionMark?.stop() @@ -242,25 +246,25 @@ module.exports = class SpriteBoss extends CocoClass @dragged += 1 onSpriteMouseUp: (e) -> - return if key.shift and @options.choosing + return if key.shift #and @options.choosing return @dragged = 0 if @dragged > 3 @dragged = 0 sprite = if e.sprite?.thang?.isSelectable then e.sprite else null @selectSprite e, sprite onStageMouseDown: (e) -> - return if key.shift and @options.choosing + return if key.shift #and @options.choosing @selectSprite e if e.onBackground - selectThang: (thangID, spellName=null) -> + selectThang: (thangID, spellName=null, treemaThangSelected = null) -> return @willSelectThang = [thangID, spellName] unless @sprites[thangID] - @selectSprite null, @sprites[thangID], spellName + @selectSprite null, @sprites[thangID], spellName, treemaThangSelected - selectSprite: (e, sprite=null, spellName=null) -> + selectSprite: (e, sprite=null, spellName=null, treemaThangSelected = null) -> return if e and (@disabled or @selectLocked) # Ignore clicks for selection/panning/wizard movement while disabled or select is locked worldPos = sprite?.thang?.pos worldPos ?= @camera.canvasToWorld {x: e.originalEvent.rawX, y: e.originalEvent.rawY} if e - if worldPos and (@options.navigateToSelection or not sprite) + if worldPos and (@options.navigateToSelection or not sprite or treemaThangSelected) @camera.zoomTo(sprite?.displayObject or @camera.worldToSurface(worldPos), @camera.zoom, 1000) sprite = null if @options.choosing # Don't select sprites while choosing if sprite isnt @selectedSprite @@ -276,6 +280,8 @@ module.exports = class SpriteBoss extends CocoClass originalEvent: e worldPos: worldPos + @willSelectThang = null if sprite # Now that we've done a real selection, don't reselect some other Thang later. + if alive and not @suppressSelectionSounds instance = sprite.playSound 'selected' if instance?.playState is 'playSucceeded' @@ -283,15 +289,18 @@ module.exports = class SpriteBoss extends CocoClass instance.addEventListener 'complete', -> Backbone.Mediator.publish 'thang-finished-talking', thang: sprite?.thang + # Marks updateSelection: -> if @selectedSprite?.thang and (not @selectedSprite.thang.exists or not @world.getThangByID @selectedSprite.thang.id) - @selectSprite null, null, null + thangID = @selectedSprite.thang.id + @selectedSprite = null # Don't actually trigger deselection, but remove the selected sprite. @selectionMark?.toggle false + @willSelectThang = [thangID, null] @updateTarget() return unless @selectionMark - @selectedSprite = null unless @selectedSprite?.thang + @selectedSprite = null if @selectedSprite and (@selectedSprite.destroyed or not @selectedSprite.thang) @selectionMark.toggle @selectedSprite? @selectionMark.setSprite @selectedSprite @selectionMark.update() diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee index 5ce3bf29c..a19812a6c 100644 --- a/app/lib/surface/Surface.coffee +++ b/app/lib/surface/Surface.coffee @@ -117,7 +117,8 @@ module.exports = Surface = class Surface extends CocoClass @updateState true if @loaded # TODO: synchronize both ways of choosing whether to show coords (@world via UI System or @options via World Select modal) if @world.showCoordinates and @options.coords - @surfaceTextLayer.addChild new CoordinateDisplay camera: @camera + @coordinateDisplay = new CoordinateDisplay camera: @camera + @surfaceTextLayer.addChild @coordinateDisplay @onFrameChanged() Backbone.Mediator.publish 'surface:world-set-up' @@ -208,10 +209,12 @@ module.exports = Surface = class Surface extends CocoClass @onFramesScrubbed() # For performance, don't play these for instant transitions. onTweenEnd() + return unless @loaded @updateState true @onFrameChanged() onFramesScrubbed: (e) => + return unless @loaded if e # Gotta play all the sounds when scrubbing (but not when doing an immediate transition). rising = @currentFrame > @lastFrame @@ -302,7 +305,7 @@ module.exports = Surface = class Surface extends CocoClass world: @world ) - if @lastFrame < @world.totalFrames and @currentFrame >= @world.totalFrames + if @lastFrame < @world.totalFrames and @currentFrame >= @world.totalFrames - 1 @spriteBoss.stop() @playbackOverScreen.show() @ended = true @@ -320,6 +323,10 @@ module.exports = Surface = class Surface extends CocoClass @wasPlayingWhenCastingBegan = @playing Backbone.Mediator.publish 'level-set-playing', { playing: false } + if @coordinateDisplay? + @surfaceTextLayer.removeChild @coordinateDisplay + @coordinateDisplay.destroy() + createjs.Tween.removeTweens(@surfaceLayer) createjs.Tween.get(@surfaceLayer).to({alpha:0.9}, 1000, createjs.Ease.getPowOut(4.0)) @@ -360,6 +367,7 @@ module.exports = Surface = class Surface extends CocoClass canvasHeight = parseInt(@canvas.attr('height'), 10) @camera?.destroy() @camera = new Camera canvasWidth, canvasHeight + AudioPlayer.camera = @camera @layers.push @surfaceLayer = new Layer name: "Surface", layerPriority: 0, transform: Layer.TRANSFORM_SURFACE, camera: @camera @layers.push @surfaceTextLayer = new Layer name: "Surface Text", layerPriority: 1, transform: Layer.TRANSFORM_SURFACE_TEXT, camera: @camera @layers.push @screenLayer = new Layer name: "Screen", layerPriority: 2, transform: Layer.TRANSFORM_SCREEN, camera: @camera @@ -447,8 +455,11 @@ module.exports = Surface = class Surface extends CocoClass @gridLayer?.parent? onToggleGrid: (e) -> + # TODO: figure out a better way of managing grid / debug so it's not split across PlaybackView and Surface e?.preventDefault?() if @gridShowing() then @hideGrid() else @showGrid() + flag = $('#grid-toggle i.icon-ok') + flag.toggleClass 'invisible', not @gridShowing() onSetGrid: (e) -> if e.grid then @showGrid() else @hideGrid() @@ -496,12 +507,15 @@ module.exports = Surface = class Surface extends CocoClass # seems to be a bug where only one object can register with the Ticker... oldFrame = @currentFrame oldWorldFrame = Math.floor oldFrame + lastFrame = @world.totalFrames - 1 while true Dropper.tick() @trailmaster.tick() if @trailmaster # Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet) - frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2 - @currentFrame += @world.frameRate / @options.frameRate if frameAdvanced and @playing + frameAdvanced = (@playing and @currentFrame < lastFrame) or @totalFramesDrawn < 2 + if frameAdvanced and @playing + @currentFrame += @world.frameRate / @options.frameRate + @currentFrame = Math.min @currentFrame, lastFrame newWorldFrame = Math.floor @currentFrame worldFrameAdvanced = newWorldFrame isnt oldWorldFrame if worldFrameAdvanced diff --git a/app/lib/surface/WizardSprite.coffee b/app/lib/surface/WizardSprite.coffee index 665a93bf4..cf07adc68 100644 --- a/app/lib/surface/WizardSprite.coffee +++ b/app/lib/surface/WizardSprite.coffee @@ -22,6 +22,12 @@ module.exports = class WizardSprite extends IndieSprite 'echo-self-wizard-sprite': 'onEchoSelfWizardSprite' 'echo-all-wizard-sprites': 'onEchoAllWizardSprites' + shortcuts: + 'up': 'onMoveKey' + 'down': 'onMoveKey' + 'left': 'onMoveKey' + 'right': 'onMoveKey' + constructor: (thangType, options) -> if options?.isSelf options.colorConfig = _.cloneDeep(me.get('wizard')?.colorConfig) or {} @@ -102,7 +108,7 @@ module.exports = class WizardSprite extends IndieSprite defaultPos: -> x: 35, y: 24, z: @thang.depth / 2 + @thang.bobHeight move: (pos, duration) -> @setTarget(pos, duration) - setTarget: (newTarget, duration) -> + setTarget: (newTarget, duration, isLinear=false) -> # ignore targets you're already heading for targetPos = @getPosFromTarget(newTarget) return if @targetPos and @targetPos.x is targetPos.x and @targetPos.y is targetPos.y @@ -114,11 +120,20 @@ module.exports = class WizardSprite extends IndieSprite @shoveOtherWizards(true) if @targetSprite @targetSprite = if isSprite then newTarget else null - @targetPos = targetPos - @beginMoveTween(duration) + @targetPos = @boundWizard targetPos + @beginMoveTween(duration, isLinear) @shoveOtherWizards() Backbone.Mediator.publish('self-wizard:target-changed', {sender:@}) if @isSelf + boundWizard: (target) -> + # Passed an {x, y} in world coordinates, returns {x, y} within world bounds + return target unless @options.camera.bounds + @bounds = @options.camera.bounds + surfaceTarget = @options.camera.worldToSurface target + x = Math.min(Math.max(surfaceTarget.x, @bounds.x), @bounds.x + @bounds.width) + y = Math.min(Math.max(surfaceTarget.y, @bounds.y), @bounds.y + @bounds.height) + return @options.camera.surfaceToWorld {x: x, y: y} + getPosFromTarget: (target) -> """ Could be null, a vector, or sprite object. Get the position from any of these. @@ -127,7 +142,7 @@ module.exports = class WizardSprite extends IndieSprite return target if target.x? return target.thang.pos - beginMoveTween: (duration=1000) -> + beginMoveTween: (duration=1000, isLinear=false) -> # clear the old tween createjs.Tween.removeTweens(@) @@ -140,8 +155,11 @@ module.exports = class WizardSprite extends IndieSprite @updatePosition() @endMoveTween() return + if isLinear + ease = createjs.Ease.linear + else + ease = createjs.Ease.getPowInOut(3.0) - ease = createjs.Ease.getPowInOut(3.0) createjs.Tween .get(@) .to({tweenPercentage:0.0}, duration, ease) @@ -225,3 +243,22 @@ module.exports = class WizardSprite extends IndieSprite updateMarks: -> super() if @displayObject.visible # not if we hid the wiz + + + onMoveKey: (e) -> + return unless @isSelf + e?.preventDefault() + yMovement = 0 + xMovement = 0 + yMovement += 2 if key.isPressed('up') + yMovement -= 2 if key.isPressed('down') + xMovement += 2 if key.isPressed('right') + xMovement -= 2 if key.isPressed('left') + @moveWizard xMovement, yMovement + + moveWizard: (x, y) -> + interval = 500 + position = {x: @targetPos.x + x, y: @targetPos.y + y} + @setTarget(position, interval, true) + @updatePosition() + Backbone.Mediator.publish 'camera-zoom-to', position, interval diff --git a/app/lib/surface/sprite_utils.coffee b/app/lib/surface/sprite_utils.coffee index 6d106e0aa..68984f370 100644 --- a/app/lib/surface/sprite_utils.coffee +++ b/app/lib/surface/sprite_utils.coffee @@ -1,16 +1,28 @@ PROG_BAR_WIDTH = 20 PROG_BAR_HEIGHT = 2 +PROG_BAR_SCALE = 2.5 +EDGE_SIZE = 0.3 module.exports.createProgressBar = createProgressBar = (color, y, width=PROG_BAR_WIDTH, height=PROG_BAR_HEIGHT) -> g = new createjs.Graphics() g.setStrokeStyle(1) + + sWidth = width * PROG_BAR_SCALE + sHeight = height * PROG_BAR_SCALE + sEdge = EDGE_SIZE * PROG_BAR_SCALE + + g.beginFill(createjs.Graphics.getRGB(0, 0, 0)) + g.drawRect(0, -sHeight/2, sWidth, sHeight, sHeight) g.beginFill(createjs.Graphics.getRGB(color...)) - g.drawRoundRect(0, -1, width, height, height) + g.drawRoundRect(sEdge, sEdge - sHeight/2, sWidth-sEdge*2, sHeight-sEdge*2, sHeight-sEdge*2) s = new createjs.Shape(g) s.x = -width / 2 s.y = y s.z = 100 + s.baseScale = PROG_BAR_SCALE + s.scaleX = 1 / PROG_BAR_SCALE + s.scaleY = 1 / PROG_BAR_SCALE s.width = width s.height = height return s diff --git a/app/lib/utils.coffee b/app/lib/utils.coffee index 8fe47dbee..9b44dd320 100644 --- a/app/lib/utils.coffee +++ b/app/lib/utils.coffee @@ -28,8 +28,8 @@ module.exports.normalizeFunc = (func_thing, object) -> console.error("Could not find method", func_thing, 'in object', @) return => null # always return a func, or Mediator will go boom func_thing = func - return func_thing - + return func_thing + module.exports.hexToHSL = (hex) -> rgbToHsl(hexToR(hex), hexToG(hex), hexToB(hex)) @@ -37,11 +37,33 @@ hexToR = (h) -> parseInt (cutHex(h)).substring(0, 2), 16 hexToG = (h) -> parseInt (cutHex(h)).substring(2, 4), 16 hexToB = (h) -> parseInt (cutHex(h)).substring(4, 6), 16 cutHex = (h) -> (if (h.charAt(0) is "#") then h.substring(1, 7) else h) - + module.exports.hslToHex = (hsl) -> '#' + (toHex(n) for n in hslToRgb(hsl...)).join('') - + toHex = (n) -> h = Math.floor(n).toString(16) h = '0'+h if h.length is 1 - h \ No newline at end of file + h + +module.exports.i18n = (say, target, language=me.lang(), fallback='en') -> + generalResult = null + fallbackResult = null + fallforwardResult = null # If a general language isn't available, the first specific one will do + matches = (/\w+/gi).exec(language) + generalName = matches[0] if matches + + for localeName, locale of say.i18n + if target of locale + result = locale[target] + else continue + return result if localeName == language + generalResult = result if localeName == generalName + fallbackResult = result if localeName == fallback + fallforwardResult = result if localeName.indexOf(language) == 0 and not fallforwardResult? + + return generalResult if generalResult? + return fallforwardResult if fallforwardResult? + return fallbackResult if fallbackResult? + return say[target] if target of say + null diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee index 850b06859..b017482b8 100644 --- a/app/lib/world/GoalManager.coffee +++ b/app/lib/world/GoalManager.coffee @@ -105,7 +105,6 @@ module.exports = class GoalManager extends CocoClass notifyGoalChanges: -> overallStatus = @checkOverallStatus() event = {goalStates: @goalStates, goals: @goals, overallStatus: overallStatus} - #console.log JSON.stringify(event), "new goal states" Backbone.Mediator.publish('goal-manager:new-goal-states', event) checkOverallStatus: (ignoreIncomplete=false) -> @@ -126,6 +125,10 @@ module.exports = class GoalManager extends CocoClass keyFrame: 0 # when it became a 'success' or 'failure' } @initGoalState(state, [goal.killThangs, goal.saveThangs], 'killed') + for getTo in goal.getAllToLocations ? [] + @initGoalState(state,[ getTo.getToLocation?.who , [] ], 'arrived') + for keepFrom in goal.keepAllFromLocations ? [] + @initGoalState(state,[ [] , keepFrom.keepFromLocation?.who], 'arrived') @initGoalState(state, [goal.getToLocations?.who, goal.keepFromLocations?.who], 'arrived') @initGoalState(state, [goal.leaveOffSides?.who, goal.keepFromLeavingOffSides?.who], 'left') @initGoalState(state, [goal.collectThangs?.who, goal.keepFromCollectingThangs?.who], 'collected') @@ -143,7 +146,13 @@ module.exports = class GoalManager extends CocoClass onThangTouchedGoal: (e, frameNumber) -> for goal in @goals ? [] @checkArrived(goal.id, goal.getToLocations.who, goal.getToLocations.targets, e.actor, e.touched.id, frameNumber) if goal.getToLocations? + if goal.getAllToLocations? + for getTo in goal.getAllToLocations + @checkArrived(goal.id, getTo.getToLocation.who, getTo.getToLocation.targets, e.actor, e.touched.id, frameNumber) @checkArrived(goal.id, goal.keepFromLocations.who, goal.keepFromLocations.targets, e.actor, e.touched.id, frameNumber) if goal.keepFromLocations? + if goal.keepAllFromLocations? + for keepFrom in goal.keepAllFromLocations + @checkArrived(goal.id, keepFrom.keepFromLocation.who , keepFrom.keepFromLocation.targets, e.actor, e.touched.id, frameNumber ) checkArrived: (goalID, who, targets, thang, touchedID, frameNumber) -> return unless touchedID in targets @@ -191,6 +200,7 @@ module.exports = class GoalManager extends CocoClass initGoalState: (state, whos, progressObjectName) -> # 'whos' is an array of goal 'who' values. # This inits the progress object for the goal tracking. + arrays = (prop for prop in whos when prop?.length) return unless arrays.length state[progressObjectName] = {} @@ -240,7 +250,9 @@ module.exports = class GoalManager extends CocoClass killThangs: 1 saveThangs: 0 getToLocations: 1 + getAllToLocations: 1 keepFromLocations: 0 + keepAllFromLocations: 0 leaveOffSides: 1 keepFromLeavingOffSides: 0 collectThangs: 1 diff --git a/app/lib/world/names.coffee b/app/lib/world/names.coffee index d47f92425..385d2f630 100644 --- a/app/lib/world/names.coffee +++ b/app/lib/world/names.coffee @@ -44,6 +44,7 @@ module.exports.thangNames = thangNames = "Huburt" "Sterling" "Alistair" + "Cid" "Remy" "Stormy" "Halle" @@ -57,6 +58,12 @@ module.exports.thangNames = thangNames = "Nikita" "Alana" "Lana" + "Joan" + "Helga" + "Annie" + "Lukaz" + "Gorgin" + "Coco" ] "Peasant": [ "Yorik" @@ -79,6 +86,12 @@ module.exports.thangNames = thangNames = "Bernadette" "Hershell" "Gawain" + "Durfkor" + "Paps" + ] + "Peasant F": [ + "Hilda" + "Icey" ] "Archer F": [ "Phoebe" @@ -104,6 +117,12 @@ module.exports.thangNames = thangNames = "Alden" "Cairn" "Jensen" + "Yilitha" + "Mirana" + "Lina" + "Luna" + "Alleria" + "Vereesa" ] "Archer M": [ "Brian" @@ -111,6 +130,19 @@ module.exports.thangNames = thangNames = "Roman" "Hunter" "Simon" + "Robin" + "Quinn" + "Arty" + "Gimsley" + "Fidsdale" + "Slyvos" + "Logos" + "Denin" + "Lycan" + "Loco" + "Vican" + "Mars" + "Dev" ] "Ogre Munchkin M": [ "Brack" @@ -132,6 +164,7 @@ module.exports.thangNames = thangNames = "Thabt" "Snortt" "Kog" + "Ursa" ] "Ogre Munchkin F": [ "Iyert" @@ -139,6 +172,9 @@ module.exports.thangNames = thangNames = "Shmeal" "Gurzunn" "Yugark" + "Dosha" + "Inski" + "Lacos" ] "Ogre M": [ "Krogg" @@ -150,13 +186,23 @@ module.exports.thangNames = thangNames = "Trung" "Axe Ox" "Vargutt" + "Grumus" + "Gug" + "Tarlok" + "Gurulax" + "Mokrul" ] "Ogre F": [ "Nareng" "Morthrug" "Glonc" "Marghurk" - + "Martha" + "Holkam" + "Alkaz" + "Gar'ah" + "Mak'rah" + "Marnag" ] "Ogre Brawler": [ "Grul'thock" @@ -171,6 +217,9 @@ module.exports.thangNames = thangNames = "Borgag" "Grognar" "Ironjaw" + "Tuguro" + "York" + "Ork'han" ] "Ogre Fangrider": [ "Dreek" @@ -186,6 +235,7 @@ module.exports.thangNames = thangNames = "Gurzthrot" "Murgark" "Muttin" + "Bortrok" ] "Ogre Shaman": [ "Sham'uk" @@ -205,6 +255,11 @@ module.exports.thangNames = thangNames = "Zo'Goroth" "Mogadishu" "Nazgareth" + "Gror" + "Grek" + "Gom" + "Gogg" + "Ghuk" ] "Ogre Thrower": [ "Kyrgg" @@ -222,3 +277,19 @@ module.exports.thangNames = thangNames = "Rakash" "Drumbaa" ] + "Burl": [ + "Borlit" + "Burlosh" + ] + "Griffin Rider": [ + "Aeoldan" + ] + "Potion Master": [ + "Snake" + ] + "Librarian": [ + "Hushbaum" + ] + "Equestrian": [ + "Reynaldo" + ] diff --git a/app/lib/world/thang.coffee b/app/lib/world/thang.coffee index 6e909cb2f..0cd586412 100644 --- a/app/lib/world/thang.coffee +++ b/app/lib/world/thang.coffee @@ -23,7 +23,7 @@ module.exports = class Thang name @resetThangIDs: -> Thang.remainingThangNames = {} - + isThang: true apiProperties: ['id', 'spriteName', 'health', 'pos', 'team'] constructor: (@world, @spriteName, @id) -> diff --git a/app/lib/world/thang_state.coffee b/app/lib/world/thang_state.coffee index 964f25eda..7ea6a9687 100644 --- a/app/lib/world/thang_state.coffee +++ b/app/lib/world/thang_state.coffee @@ -50,8 +50,12 @@ module.exports = class ThangState value = @thang.world.getThangByID @specialKeysToValues[specialKey] else if type is 'array' specialKey = storage[@frameIndex] - value = @specialKeysToValues[specialKey] - value = value.split('\x1E') # Record Separator + valueString = @specialKeysToValues[specialKey] + if valueString and valueString.length > 1 + # Trim leading Group Separator and trailing Record Separator, split by Record Separators, restore string array. + value = valueString.substring(1, valueString.length - 1).split '\x1E' + else + value = [] else value = storage[@frameIndex] value @@ -133,7 +137,11 @@ module.exports = class ThangState storage[frameIndex] = specialKey storage[frameIndex] = specialKey else if type is 'array' - value = value.join '\x1E' # Record Separator + # We make sure the array keys won't collide with any string keys by using some unprintable characters. + stringPieces = ['\x1D'] # Group Separator + for element in value + stringPieces.push element, '\x1E' # Record Separator(s) + value = stringPieces.join('') specialKey = specialValuesToKeys[value] unless specialKey specialKey = specialKeysToValues.length diff --git a/app/lib/world/world_script_note.coffee b/app/lib/world/world_script_note.coffee index 680c9ee6a..2786cee49 100644 --- a/app/lib/world/world_script_note.coffee +++ b/app/lib/world/world_script_note.coffee @@ -1,7 +1,5 @@ {clone} = require './world_utils' {scriptMatchesEventPrereqs} = require './script_event_prereqs' -Thang = require './thang' -Vector = require './vector' module.exports = class WorldScriptNote @className: "WorldScriptNote" @@ -18,11 +16,11 @@ module.exports = class WorldScriptNote serialize: -> o = {channel: @channel, event: {}} for key, value of @event - if value instanceof Thang + if value?.isThang value = {isThang: true, id: value.id} else if _.isArray value for subval, i in value - if subval instanceof Thang + if subval?.isThang value[i] = {isThang: true, id: subval.id} o.event[key] = value o diff --git a/app/lib/world/world_utils.coffee b/app/lib/world/world_utils.coffee index c89f08f9c..95e22c323 100644 --- a/app/lib/world/world_utils.coffee +++ b/app/lib/world/world_utils.coffee @@ -39,9 +39,7 @@ module.exports.clone = clone = (obj, skipThangs=false) -> if (obj instanceof Vector) or (obj instanceof Rectangle) return obj.copy() - # We don't have Thang class here, but we can fake it to avoid the circular import - #if skipThangs and obj instanceof Thang - if skipThangs and obj.id? and obj.trackedPropertiesKeys? + if skipThangs and obj.isThang return obj if ArrayBufferView and obj instanceof ArrayBufferView diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee index b1d899a65..09fcff581 100644 --- a/app/locale/ar.coffee +++ b/app/locale/ar.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee index 72ca47fca..3ad52cddd 100644 --- a/app/locale/bg.coffee +++ b/app/locale/bg.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "български език", englishDescri # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "български език", englishDescri # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "български език", englishDescri # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "български език", englishDescri # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "български език", englishDescri # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "български език", englishDescri # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "български език", englishDescri # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Преглед" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "български език", englishDescri # body: "Body" version: "Версия" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" results: "Резултати" description: "Описание" or: "или" email: "Email" +# password: "Password" message: "Съобщение" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "български език", englishDescri # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "български език", englishDescri # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "български език", englishDescri # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee index aa32f0aa2..28a2c2e07 100644 --- a/app/locale/cs.coffee +++ b/app/locale/cs.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr campaign_player_created: "Uživatelsky vytvořené úrovně" campaign_player_created_description: "...ve kterých bojujete proti kreativitě ostatních Zdatných Kouzelníků." level_difficulty: "Obtížnost: " +# play_as: "Play As " contact: contact_us: "Konktujte CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr wizard_tab: "Kouzelník" password_tab: "Heslo" emails_tab: "Emaily" +# admin: "Admin" gravatar_select: "Zvolte kterou Gravatar fotografii použít" gravatar_add_photos: "Přidat náhledy a fotografie do Gravatar účtu pro zvolení obrázku" gravatar_add_more_photos: "Přidat do vašeho Gravatar účtu další fotografie." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr new_password_verify: "Potvrdit" email_subscriptions: "Doručovat emailem" email_announcements: "Oznámení" +# email_notifications: "Notifications" email_notifications_description: "Zasílat na váš účet opakovaná oznámení." email_announcements_description: "Zasílat emaily o posledních novinkách a o postupu ve vývoji CodeCombat." contributor_emails: "Emaily pro přispívatele" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr victory_sign_up: "Přihlásit se pro uložení postupu" victory_sign_up_poke: "Chcete uložit váš kód? Vytvořte si účet zdarma!" victory_rate_the_level: "Ohodnoťte tuto úroveň: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Hrát další úroveň" victory_go_home: "Přejít domů" victory_review: "Připomínky!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr tome_available_spells: "Dostupná kouzla" hud_continue: "Pokračovat (stiskněte shift-mezera)" spell_saved: "Kouzlo uloženo" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Administrátorský pohled" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr contact_us: "kontaktujte nás!" hipchat_prefix: "Můžete nás také najít v naší" hipchat_url: "HipChat diskusní místnosti." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Volby?" level_tab_thangs: "Thangy" level_tab_scripts: "Skripty" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr level_components_title: "Zpět na všechny Thangy" level_components_type: "Druh" level_component_edit_title: "Editovat komponentu" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Editovat systém" create_system_title: "Vytvořit nový systém" new_component_title: "Vytvořit novou komponentu" new_component_field_system: "Systém" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Náhled" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr body: "Tělo" version: "Verze" commit_msg: "Popisek ukládání" +# history: "History" version_history_for: "Verze historie pro: " +# result: "Result" results: "Výsledky" description: "Popis" or: "nebo" email: "Email" +# password: "Password" message: "Zpráva" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Kdo je CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr artisan_join_step4: "Zveřejněte vaši úroveň na fóru pro připomínkování." more_about_artisan: "Dozvědět se více o tom, jak se stát kreativním Řemeslníkem" artisan_subscribe_desc: "Dostávat emailem oznámení a informace o aktualizacích editoru úrovní." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_introduction: "Ujasněme si dopředu jednu věc o vaší roli: budete jako tank. Projdete ohněm. Potřebujeme někoho, kdo odzkouší zbrusu nové úrovně a pomůže identifikovat kde je možno je zlepšit. Ten boj bude ohromný - tvorba her je dlouhý proces, který nikdo nezvládne na první pokus. Máte-li na to a vydržíte-li to, pak toto je vaše skupina." adventurer_attribute_1: "Touha po učení se. Vy se chcete naučit programovat a my vás to chceme naučit. Jenom, v tomto případě to budete vy, kdo bude vyučovat." adventurer_attribute_2: "Charismatický. Buďte mírný a pečlivě artikulujte co a jak je potřeba zlepšit." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr more_about_adventurer: "Dozvědět se více o tom, jak se stát statečným Dobrodruhem" adventurer_subscribe_desc: "Dostávat emailem oznámení a informace nových úrovních k testování." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_introduction_pref: "CodeCombat nebude pouze kupa úrovní. Bude také zahrnovat informační zdroje a wiki programovacích konceptů na které se úrovně mohou navázat. Takto, namísto toho aby každý Řemeslník musel sám do detailu popsatco který operátor dělá, mohou jednoduše nalinkovat svoji úroveň na článek existující k edukaci hráčů. Něco ve stylu " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: ". Jestliže vás baví popisovat a předávat koncept programování v Markdown editoru, pak tato role může být právě pro vás." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr ambassador_title_description: "(Podpora)" counselor_title: "Poradce" counselor_title_description: "(Odborník)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/da.coffee b/app/locale/da.coffee index 727e8d713..94b36bccc 100644 --- a/app/locale/da.coffee +++ b/app/locale/da.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans campaign_player_created: "Spillerkreerede" campaign_player_created_description: "... hvor du kæmper mod dine med-Kunsthåndværker-troldmænds kreativitet." level_difficulty: "Sværhedsgrad: " +# play_as: "Play As " contact: contact_us: "Kontakt CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans wizard_tab: "Troldmand" password_tab: "Password" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Vælg hvilket Gravatar-billede du vil bruge" gravatar_add_photos: "Tilføj thumbnails og billeder til en Gravatar-konto for din email for at kunne vælge et billede." gravatar_add_more_photos: "Tilføj flere billeder til din Gravatar-konto for at tilgå dem her." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans new_password_verify: "Bekræft" email_subscriptions: "Emailtilmeldinger" email_announcements: "Nyheder" +# email_notifications: "Notifications" email_notifications_description: "Få periodevise meldinger om din konto." email_announcements_description: "Få emails om de seneste nyheder og udvikling på CodeCombat." contributor_emails: "Bidragsklasse-emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans victory_sign_up: "Opret dig for at gemme dit fremskridt" victory_sign_up_poke: "Ønsker du at gemme din kode? Opret en gratis konto!" victory_rate_the_level: "Bedøm denne bane: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spil næste bane" victory_go_home: "Gå hjem" victory_review: "Fortæl os mere!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans tome_available_spells: "Tilgængelige trylleformularer" hud_continue: "Fortsæt (tryk skift-mellemrum)" spell_saved: "Trylleformularen er gemt" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans contact_us: "kontact os!" hipchat_prefix: "Du kan også finde os på vores" hipchat_url: "HipChat kanal." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # level_components_title: "Back to All Thangs" # level_components_type: "Type" level_component_edit_title: "Redigér komponent" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Redigér system" create_system_title: "Opret nyt system" new_component_title: "Opret ny komponent" new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Forhåndsvisning" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans body: "krop" version: "version" commit_msg: "ændringsnotat" +# history: "History" version_history_for: "versionhistorie for: " +# result: "Result" results: "resultater" description: "beskrivelse" or: "eller" email: "e-mail" +# password: "Password" message: "Besked" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Hvem er CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans ambassador_title_description: "(Brugerstøtte)" counselor_title: "Rådgiver" counselor_title_description: "(Ekspert/Lærer)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/de.coffee b/app/locale/de.coffee index aebfcccbb..155669e56 100644 --- a/app/locale/de.coffee +++ b/app/locale/de.coffee @@ -13,7 +13,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra play: "Abspielen" modal: - close: "Schliessen" + close: "Schließen" okay: "Okay" not_found: @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra campaign_player_created: "Von Spielern erstellt" campaign_player_created_description: "... in welchem Du gegen die Kreativität eines Artisan Zauberers kämpfst." level_difficulty: "Schwierigkeit: " +# play_as: "Play As " contact: contact_us: "Kontaktiere CodeCombat" @@ -104,14 +105,14 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra wizard_settings: title: "Zauberer Einstellungen" customize_avatar: "Individualisiere deinen Avatar" -# clothes: "Clothes" -# trim: "Trim" -# cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" -# hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + clothes: "Kleidung" + trim: "Applikationen" + cloud: "Wolke" + spell: "Zauber" + boots: "Stiefel" + hue: "Farbton" + saturation: "Sättigung" + lightness: "Helligkeit" account_settings: title: "Accounteinstellungen" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra wizard_tab: "Zauberer" password_tab: "Passwort" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Wähle ein Gravatar Bild aus" gravatar_add_photos: "Füge Vorschaubilder und Fotos zu Deinem Gravatar Account (für Deine Email) hinzu, um ein Bild auswählen zu können" gravatar_add_more_photos: "Füge mehr Fotos bei deinem Gravatar Account hinzu, um hier mehr Bilder wählen zu können" @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra new_password_verify: "Passwort verifizieren" email_subscriptions: "Email Abonnements" email_announcements: "Ankündigungen" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Erhalte regelmäßig Mitteilungen für deinen Account." contributor_emails: "Unterstützer Email" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra victory_sign_up: "Melde Dich an, um Fortschritte zu speichern" victory_sign_up_poke: "Möchtest Du Neuigkeiten per Mail erhalten? Erstelle einen kostenlosen Account und wir halten Dich auf dem Laufenden." victory_rate_the_level: "Bewerte das Level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spiel das nächste Level" victory_go_home: "Geh auf die Startseite" victory_review: "Erzähl uns davon!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra tome_available_spells: "Verfügbare Zauber" hud_continue: "Weiter (drücke Shift + Leertaste)" spell_saved: "Zauber gespeichert" + skip_tutorial: "Überspringen (Esc)" + editor_config: "Editor Einstellungen" + editor_config_title: "Editor Einstellungen" + editor_config_keybindings_label: "Tastenbelegung" + editor_config_keybindings_default: "Standard (Ace)" + editor_config_keybindings_description: "Fügt zusätzliche Tastenkombinationen, bekannt aus anderen Editoren, hinzu" + editor_config_invisibles_label: "Zeige unsichtbare Zeichen" + editor_config_invisibles_description: "Zeigt unsichtbare Zeichen wie Leertasten an." + editor_config_indentguides_label: "Zeige Einrückungshilfe" + editor_config_indentguides_description: "Zeigt vertikale Linien an um Einrückungen besser zu sehen." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Administrator Übersicht" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra contact_us: "setze dich mit uns in Verbindung!" hipchat_prefix: "Besuche uns auch in unserem" hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Einige Einstellungsmöglichkeiten?" level_tab_thangs: "Thangs" level_tab_scripts: "Skripte" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra level_components_title: "Zurück zu allen Thangs" level_components_type: "Typ" level_component_edit_title: "Komponente bearbeiten" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "System bearbeiten" create_system_title: "neues System erstellen" new_component_title: "Neue Komponente erstellen" new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Vorschau" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra body: "Inhalt" version: "Version" commit_msg: "Commit Nachricht" +# history: "History" version_history_for: "Versionsgeschichte für: " +# result: "Result" results: "Ergebnisse" description: "Beschreibung" or: "oder" email: "Email" +# password: "Password" message: "Nachricht" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Wer ist CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra ambassador_title_description: "(Support)" counselor_title: "Berater" counselor_title_description: "(Experte/Lehrer)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/el.coffee b/app/locale/el.coffee index 5425164b7..01e907b39 100644 --- a/app/locale/el.coffee +++ b/app/locale/el.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." level_difficulty: "Δυσκολία: " +# play_as: "Play As " contact: contact_us: "Επικοινωνήστε μαζί μας" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre wizard_tab: "Μάγος" password_tab: "Κωδικός" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Επέλεξε φωτογραφία \"Gravatar\" για να χρησιμοποιήσεις" gravatar_add_photos: "Πρόσθεσε μικρογραφίες και φωτογραφίες σε έναν λογαριασμό \"Gravatar\" για το email σου διάλεξε μια φωτογραφία" gravatar_add_more_photos: "Προσθέστε περισσότερες φωτογραφίες στο Gravatar λογαριασμό σας για να αποκτήσετε πρόσβαση σε αυτά από εδώ." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre new_password_verify: " Επαλήθευση Κωδικού" email_subscriptions: "Συνδρομές Email" email_announcements: "Ανακοινώσεις" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Λάβετε emails για τα τελευταία νέα και τις εξελίξεις του CodeCombat." contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre victory_sign_up: "Εγγραφείτε για ενημερώσεις" victory_sign_up_poke: "Θέλετε να λαμβάνετε τα τελευταία νέα μέσω e-mail; Δημιουργήστε έναν δωρεάν λογαριασμό και θα σας κρατάμε ενήμερους!" victory_rate_the_level: "Βαθμολογήστε το επίπεδο: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Παίξε το επόμενο επίπεδο" victory_go_home: "Πηγαίνετε στην Αρχική" victory_review: "Πείτε μας περισσότερα!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee index 9c115d83d..8486acbc4 100644 --- a/app/locale/en-AU.coffee +++ b/app/locale/en-AU.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee index 12bac5e6f..757a7012b 100644 --- a/app/locale/en-GB.coffee +++ b/app/locale/en-GB.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index e34074395..027e45419 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 63b228460..204317e0b 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr campaign_player_created: "Player-Created" campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." level_difficulty: "Difficulty: " + play_as: "Play As " contact: contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr wizard_tab: "Wizard" password_tab: "Password" emails_tab: "Emails" + admin: "Admin" gravatar_select: "Select which Gravatar photo to use" gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr new_password_verify: "Verify" email_subscriptions: "Email Subscriptions" email_announcements: "Announcements" + email_notifications: "Notifications" email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Get emails on the latest news and developments at CodeCombat." contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr victory_sign_up: "Sign Up to Save Progress" victory_sign_up_poke: "Want to save your code? Create a free account!" victory_rate_the_level: "Rate the level: " + victory_rank_my_game: "Rank My Game" + victory_ranking_game: "Submitting..." + victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Play Next Level" victory_go_home: "Go Home" victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr tome_select_spell: "Select a Spell" tome_select_a_thang: "Select Someone for " tome_available_spells: "Available Spells" - hud_continue: "Continue (press shift-space)" + hud_continue: "Continue (shift+space)" spell_saved: "Spell Saved" + skip_tutorial: "Skip (esc)" + editor_config: "Editor Config" + editor_config_title: "Editor Configuration" + editor_config_keybindings_label: "Key Bindings" + editor_config_keybindings_default: "Default (Ace)" + editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." + editor_config_invisibles_label: "Show Invisibles" + editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." + editor_config_indentguides_label: "Show Indent Guides" + editor_config_indentguides_description: "Displays vertical lines to see indentation better." + editor_config_behaviors_label: "Smart Behaviors" + editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr contact_us: "contact us!" hipchat_prefix: "You can also find us in our" hipchat_url: "HipChat room." + revert: "Revert" + revert_models: "Revert Models" level_some_options: "Some Options?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr level_components_title: "Back to All Thangs" level_components_type: "Type" level_component_edit_title: "Edit Component" + level_component_config_schema: "Config Schema" + level_component_settings: "Settings" level_system_edit_title: "Edit System" create_system_title: "Create New System" new_component_title: "Create New Component" new_component_field_system: "System" + new_article_title: "Create a New Article" + new_thang_title: "Create a New Thang Type" + new_level_title: "Create a New Level" + article_search_title: "Search Articles Here" + thang_search_title: "Search Thang Types Here" + level_search_title: "Search Levels Here" article: edit_btn_preview: "Preview" @@ -257,12 +285,28 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr body: "Body" version: "Version" commit_msg: "Commit Message" + history: "History" version_history_for: "Version History for: " + result: "Result" results: "Results" description: "Description" or: "or" email: "Email" + password: "Password" message: "Message" + code: "Code" + ladder: "Ladder" + when: "When" + opponent: "Opponent" + rank: "Rank" + score: "Score" + win: "Win" + loss: "Loss" + tie: "Tie" + easy: "Easy" + medium: "Medium" + hard: "Hard" + about: who_is_codecombat: "Who is CodeCombat?" @@ -285,6 +329,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." + glen_description: "Glen, describe thyself!" legal: page_title: "Legal" @@ -389,7 +434,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr artisan_join_step4: "Post your levels on the forum for feedback." more_about_artisan: "Learn More About Becoming an Artisan" artisan_subscribe_desc: "Get emails on level editor updates and announcements." - adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." + adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +444,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr more_about_adventurer: "Learn More About Becoming an Adventurer" adventurer_subscribe_desc: "Get emails when there are new levels to test." scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " - scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." + scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +501,35 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr ambassador_title_description: "(Support)" counselor_title: "Counselor" counselor_title_description: "(Expert/Teacher)" + + ladder: + please_login: "Please log in first before playing a ladder game." + my_matches: "My Matches" + simulate: "Simulate" + simulation_explanation: "By simulating games you can get your game ranked faster!" + simulate_games: "Simulate Games!" + simulate_all: "RESET AND SIMULATE GAMES" + leaderboard: "Leaderboard" + battle_as: "Battle as " + summary_your: "Your " + summary_matches: "Matches - " + summary_wins: " Wins, " + summary_losses: " Losses" + rank_no_code: "No New Code to Rank" + rank_my_game: "Rank My Game!" + rank_submitting: "Submitting..." + rank_submitted: "Submitted for Ranking" + rank_failed: "Failed to Rank" + rank_being_ranked: "Game Being Ranked" + code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." + no_ranked_matches_pre: "No ranked matches for the " + no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." + choose_opponent: "Choose an Opponent" + tutorial_play: "Play Tutorial" + tutorial_recommended: "Recommended if you've never played before" + tutorial_skip: "Skip Tutorial" + tutorial_not_sure: "Not sure what's going on?" + tutorial_play_first: "Play the Tutorial first." + simple_ai: "Simple AI" + warmup: "Warmup" + vs: "VS" diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index 476b9fa7d..a494a2e63 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip campaign_player_created: "Creados-Por-Jugadores" campaign_player_created_description: "... en los que luchas contra la creatividad de tus compañeros Hechiceros Artesanales." level_difficulty: "Dificultad: " +# play_as: "Play As " contact: contact_us: "Contacta a CodeCombat" @@ -101,17 +102,17 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip learn_more: "Aprende más sobre ser un Diplomático" subscribe_as_diplomat: "Suscribete como un Diplomático" -# wizard_settings: -# title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" + wizard_settings: + title: "Configuración del mago" + customize_avatar: "Personaliza tu avatar" + clothes: "Ropa" # trim: "Trim" -# cloud: "Cloud" + cloud: "Nube" # spell: "Spell" -# boots: "Boots" + boots: "Botas" # hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + saturation: "Saturación" + lightness: "Brillo" account_settings: title: "Configuración de la Cuenta" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip wizard_tab: "Hechicero" password_tab: "Contraseña" emails_tab: "Correos" +# admin: "Admin" gravatar_select: "Seleccione que foto de Gravatar usar" gravatar_add_photos: "Añadir imágenes en miniatura y fotos a una cuenta de Gravatar para su correo electrónico para elegir una imagen." gravatar_add_more_photos: "Añada más fotos a su cuenta de Gravatar para accederlas aquí." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip new_password_verify: "Verificar" email_subscriptions: "Suscripciones de Email" email_announcements: "Noticias" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Recibe correos electrónicos con las últimas noticias y desarrollos de CodeCombat." contributor_emails: "Emails Clase Contribuyente" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip victory_sign_up: "Registrate para recibir actualizaciones" victory_sign_up_poke: "¿Quieres recibir las ultimas noticias por correo? ¡Crea una cuenta gratuita y te mantendremos informado!" victory_rate_the_level: "Valora el nivel: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jugar Próximo Nivel" victory_go_home: "Ir al Inicio" victory_review: "¡Cuéntanos más!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip tome_available_spells: "Hechizos Disponibles" hud_continue: "Continuar (presionar shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index 5b911e4b1..4b5307600 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis campaign_player_created: "Creaciones de los Jugadores" campaign_player_created_description: "... en las que luchas contra la creatividad de tus compañeros Magos Artesanos." level_difficulty: "Dificultad: " +# play_as: "Play As " contact: contact_us: "Contacta con CodeCombat" @@ -110,8 +111,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # spell: "Spell" boots: "Botas" # hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + saturation: "Saturación" + lightness: "Brillo" account_settings: title: "Ajustes de la cuenta" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis wizard_tab: "Mago" password_tab: "Contraseña" emails_tab: "Correos electrónicos" +# admin: "Admin" gravatar_select: "Selecciona una foto de Gravatar para usar" gravatar_add_photos: "Añade fotos a la cuenta de Gravatar asociada a tu correo electrónico para elegir la imagen." gravatar_add_more_photos: "Añade más fotos a tu cuenta de Gravatar para tener acceso a ellas aquí." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis new_password_verify: "Verificar" email_subscriptions: "Suscripciones de correo electrónico" email_announcements: "Noticias" +# email_notifications: "Notifications" email_notifications_description: "Recibe notificaciones periódicas en tu cuenta." email_announcements_description: "Recibe correos electrónicos con las últimas noticias y desarrollos de CodeCombat." contributor_emails: "Correos para colaboradores" @@ -144,11 +147,11 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis account_profile: edit_settings: "Ajustes" profile_for_prefix: "Perfil de " -# profile_for_suffix: "" + profile_for_suffix: "" profile: "Perfil" user_not_found: "No se encontró al usuario. ¿Comprueba la URL?" gravatar_not_found_mine: "No podemos encontrar el perfil asociado con:" -# gravatar_not_found_email_suffix: "." + gravatar_not_found_email_suffix: "." gravatar_signup_prefix: "¡Suscribete a " gravatar_signup_suffix: " para ponerte en marcha!" gravatar_not_found_other: "Vaya, no hay un perfil asociado a la dirección de correo electrónico de esta persona." @@ -177,6 +180,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis victory_sign_up: "Regístrate para recibir actualizaciones." victory_sign_up_poke: "¿Quieres recibir las últimas noticias en tu correo electrónico? ¡Crea una cuente gratuita y te mantendremos informado!" victory_rate_the_level: "Puntúa este nivel: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jugar el siguiente nivel" victory_go_home: "Ir a Inicio" victory_review: "¡Cuéntanos más!" @@ -200,8 +206,20 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis tome_available_spells: "Hechizos disponibles" hud_continue: "Continuar (pulsa Shift+Space)" spell_saved: "Hechizo guardado" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." -# admin: + admin: # av_title: "Admin Views" av_entities_sub_title: "Entidades" av_entities_users_url: "Usuarios" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis contact_us: "¡Contacta con nosotros!" hipchat_prefix: "También puedes encontrarnos en nuestra" hipchat_url: "sala de HipChat." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "¿Algunas opciones?" level_tab_thangs: "Objetos" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis level_components_title: "Volver a Todos los Objetos" level_components_type: "Tipo" level_component_edit_title: "Editar Componente" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Editar Sistema" create_system_title: "Crear Nuevo Sistema" new_component_title: "Crear Nuevo Componente" new_component_field_system: "Sistema" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Vista preliminar" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis body: "Cuerpo" version: "Versión" commit_msg: "Mensaje de Asignación o Commit" +# history: "History" version_history_for: "Historial de las versiones de: " +# result: "Result" results: "Resultados" description: "Descripción" or: "o" email: "Correo electrónico" +# password: "Password" message: "Mensaje" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "¿Qué es CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis artisan_join_step4: "Publica tus niveles en el foro para recibir comentarios críticos." more_about_artisan: "Aprende más sobre convertirte en un Artesano creativo" artisan_subscribe_desc: "Recibe correos sobre actualizaciones del editor de niveles y anuncios." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_introduction: "Hablemos claro sobre tu papel: eres el tanque. Vas a recibir fuertes daños. Necesitamos gente para probar nuestros flamantes niveles y ayudar a mejorarlos. El dolor será enorme; hacer buenos juegos es un proceso largo y nadie lo consigue a la primera. Si puedes resistir y tener una puntuación alta en Resistencia, entonces esta Clase es para ti." adventurer_attribute_1: "Estar sediento de conocimientos. Quieres aprender a programar y nosotros queremos enseñarte cómo hacerlo. Aunque en este caso es más probable que seas tú el que esté haciendo la mayor parte de la enseñanza." adventurer_attribute_2: "Carismático. Se amable pero claro a la hora de desglosar qué necesita ser mejorado y sugiere de qué formas podría hacerse." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis more_about_adventurer: "Aprende más sobre cómo convertirte en un bravo Aventurero" adventurer_subscribe_desc: "Recibe correos cuando haya nuevos niveles para testar." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_introduction_pref: "CodeCombat no será solo un montón de niveles. También será una fuente de conocimientos, una wiki de conceptos de programación a la que los niveles se engancharan. De esa forma, en lugar de que cada Artesano tenga que describir en detalle qué es un operador de comparación, podrá simplemente enlazar el nivel al Artículo que los describe y que ya ha sido escrito para edificación del jugador. Algo en la línea de lo que la " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: " ha construido. Si tu idea de diversión es articular los conceptos de la programación de una forma sencilla, entonces esta clase es para ti." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis ambassador_title_description: "(Soporte)" counselor_title: "Consejero" counselor_title_description: "(Experto/Profesor)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/es.coffee b/app/locale/es.coffee index fabd7b970..6e71b9c7b 100644 --- a/app/locale/es.coffee +++ b/app/locale/es.coffee @@ -4,7 +4,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t saving: "Guardando..." sending: "Enviando..." cancel: "Cancelar" -# save: "Guardar" + save: "Guardar" delay_1_sec: "1 segundo" delay_3_sec: "3 segundos" delay_5_sec: "5 segundos" @@ -31,15 +31,15 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t about: "Sobre" contact: "Contacto" twitter_follow: "Seguir" -# employers: "Empleados" + employers: "Empleados" -# versions: -# save_version_title: "Guardar Nueva Versión" -# new_major_version: "New Major Version" -# cla_prefix: "Para poder guardar los cambios, primero debes aceptar nuestra" -# cla_url: "CLA" -# cla_suffix: "." -# cla_agree: "ACEPTO" + versions: + save_version_title: "Guardar Nueva Versión" + new_major_version: "New Major Version" + cla_prefix: "Para poder guardar los cambios, primero debes aceptar nuestra" + cla_url: "CLA" + cla_suffix: "." + cla_agree: "ACEPTO" login: sign_up: "Crear Cuenta" @@ -47,12 +47,12 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t log_out: "Cerrar Sesión" recover: "recuperar cuenta" -# recover: -# recover_account_title: "Recuperar cuenta" -# send_password: "Enviar contraseña olvidada" + recover: + recover_account_title: "Recuperar cuenta" + send_password: "Enviar contraseña olvidada" signup: -# create_account_title: "Crea una cuenta para guardar el progreso" + create_account_title: "Crea una cuenta para guardar el progreso" description: "Es gratis. Solo necesitas un par de cosas y estarás listo para comenzar:" email_announcements: "Recibe noticias por email" coppa: "más de 13 años o fuera de los Estados Unidos" @@ -81,6 +81,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t campaign_player_created: "Creados-Por-Jugadores" campaign_player_created_description: "... en los que luchas contra la creatividad de tus compañeros Hechiceros Artesanales." level_difficulty: "Dificultad: " +# play_as: "Play As " contact: contact_us: "Contacta a CodeCombat" @@ -101,17 +102,17 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t learn_more: "Aprende más sobre ser un Diplomático" subscribe_as_diplomat: "Suscribete como un Diplomático" -# wizard_settings: -# title: "Configuración del mago" -# customize_avatar: "Personaliza tu avatar" -# clothes: "Ropa" -# trim: "Trim" -# cloud: "Nube" -# spell: "Spell" -# boots: "Botas" -# hue: "Hue" -# saturation: "Saturación" -# lightness: "Brillo" + wizard_settings: + title: "Configuración del mago" + customize_avatar: "Personaliza tu avatar" + clothes: "Ropa" + trim: "Trim" + cloud: "Nube" + spell: "Spell" + boots: "Botas" + hue: "Hue" + saturation: "Saturación" + lightness: "Brillo" account_settings: title: "Configuración de la Cuenta" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t wizard_tab: "Hechicero" password_tab: "Contraseña" emails_tab: "Correos" +# admin: "Admin" gravatar_select: "Seleccione que foto de Gravatar usar" gravatar_add_photos: "Añadir imágenes en miniatura y fotos a una cuenta de Gravatar para su correo electrónico para elegir una imagen." gravatar_add_more_photos: "Añada más fotos a su cuenta de Gravatar para accederlas aquí." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t new_password_verify: "Verificar" email_subscriptions: "Suscripciones de Email" email_announcements: "Noticias" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Recibe correos electrónicos con las últimas noticias y desarrollos de CodeCombat." contributor_emails: "Correos Para Colaboradores" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t victory_sign_up: "Regístrate para recibir actualizaciones." victory_sign_up_poke: "¿Buscas recivir las últimas noticias en tu email? Create una cuente gratuita y recibe la correspondencia." victory_rate_the_level: "Puntúa este nivel: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jugar el siguiente nivel" victory_go_home: "Ir a Inicio" victory_review: "¡Cuéntanos más!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t tome_available_spells: "Hechizos Disponibles" hud_continue: "Continuar (presionar shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -211,7 +229,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # u_title: "User List" # lg_title: "Latest Games" -# editor: + editor: # main_title: "CodeCombat Editors" # main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" # article_title: "Article Editor" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -233,7 +253,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # level_tab_thangs_title: "Current Thangs" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" -# level_settings_title: "Ajustes" + level_settings_title: "Ajustes" # level_component_tab_title: "Current Components" # level_component_btn_new: "Create New Component" # level_systems_tab_title: "Current Systems" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "o" email: "Email" +# password: "Password" message: "Mensaje" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee index 36d6b4991..f6e870b6d 100644 --- a/app/locale/fa.coffee +++ b/app/locale/fa.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", campaign_player_created: "ایجاد بازیکن" campaign_player_created_description: "... جایی که در مقابل خلاقیت نیرو هاتون قرار میگیرید جادوگران آرتیزان." level_difficulty: "سختی: " +# play_as: "Play As " contact: contact_us: "CodeCombatتماس با " @@ -122,6 +123,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", wizard_tab: "جادو" password_tab: "کلمه عبور" emails_tab: "ایمیل ها" +# admin: "Admin" gravatar_select: " استفاده شود Gravatar انتخاب کنید کدام تصویر" gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "یا" email: "ایمیل" +# password: "Password" message: "پیام" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee index 35af0bb25..95eebb045 100644 --- a/app/locale/fi.coffee +++ b/app/locale/fi.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index c869fbe8b..b3f01ca55 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t campaign_player_created: "Niveaux créés par les joueurs" campaign_player_created_description: "... Dans laquelle vous serez confrontés à la créativité des votres.Artisan Wizards." level_difficulty: "Difficulté: " +# play_as: "Play As " contact: contact_us: "Contacter CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t wizard_tab: "Magicien" password_tab: "Mot de passe" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Sélectionnez la photo Gravatar à utiliser" gravatar_add_photos: "Ajouter des vignettes et des photos sur un compte Gravatar pour votre e-mail pour choisir une image." gravatar_add_more_photos: "Ajouter plus de photos à votre compte Gravatar pour y accéder ici." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t new_password_verify: "Vérifier" email_subscriptions: "Abonnements" email_announcements: "Annonces" +# email_notifications: "Notifications" email_notifications_description: "Recevoir des notifications périodiques sur votre compte." email_announcements_description: "Recevoir des mails sur les dernières actualités et sur le développement de CodeCombat." contributor_emails: "Emails des contributeurs" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t victory_sign_up: "Inscrivez-vous pour recevoir les mises à jour" victory_sign_up_poke: "Vous voulez recevoir les dernières actualités par mail? Créez un compte gratuitement et nous vous tiendrons informés!" victory_rate_the_level: "Notez ce niveau: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jouer au prochain niveau" victory_go_home: "Retourner à l'accueil" victory_review: "Dites-nous en plus!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "français", englishDescription: "French", t tome_available_spells: "Sorts diponibles" hud_continue: "Continuer (appuie sur shift ou espace)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Vues d'administrateurs" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t contact_us: "contactez nous!" hipchat_prefix: "Vous pouvez aussi nous trouver dans notre " hipchat_url: "conversation HipChat." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Quelques options?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "français", englishDescription: "French", t level_components_title: "Retourner à tous les Thangs" level_components_type: "Type" level_component_edit_title: "Éditer le composant" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Éditer le système" create_system_title: "Créer un nouveau système" new_component_title: "Créer un nouveau composant" new_component_field_system: "Système" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Prévisualiser" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "français", englishDescription: "French", t body: "Corps" version: "Version" commit_msg: "Message de mise à jour" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" results: "Résultats" description: "Description" or: "ou" email: "Email" +# password: "Password" message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Qui est CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t artisan_join_step4: "Postez vos niveaux dans le forum pour avoir des retours." more_about_artisan: "En apprendre plus sur comment devenir un Artisan créatif" artisan_subscribe_desc: "Recevoir un email sur les annonces et mises à jour de l'éditeur de niveaux." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_introduction: "Soyons clair à propos de votre rôle : vous êtes le tank. Vous allez subir beaucoup de dommages. Nous avons besoin de gens pour essayer les nouveaux niveaux et aider à identifier comment améliorer les choses. La douleur sera énorme; faire de bons jeux est une longue tâche et personne n'y arrive du premier coup. Si vous pouvez résister et avez un gros score de constitution, alors cette classe est faite pour vous." adventurer_attribute_1: "Une soif d'apprendre. Vous voulez apprendre à développer et nous voulons vous apprendre. Vous allez toutefois faire la plupart de l'apprentissage." adventurer_attribute_2: "Charismatique. Soyez doux mais exprimez-vous sur ce qui a besoin d'être amélioré, et faites des propositions sur comment l'améliorer." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t more_about_adventurer: "En apprendre plus sur devenir un brave Aventurier" adventurer_subscribe_desc: "Recevoir un email lorsqu'il y a de nouveaux niveaux à tester." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_introduction_pref: "CodeCombat n'est pas seulement un ensemble de niveaux. Il contiendra aussi des ressources pour la connaissance, un wiki des concepts de programmation que les niveaux pourront illustrer. Dans ce but, chaque Artisan pourra, au lieu d'avoir à décrire en détail ce qu'est un opérateur de comparaison, seulement lier son niveau à l'article qui le décrit et qui a été écrit pour aider les joueurs. Quelque chose dans le sens de ce que le " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: " a développé. Si votre définition de l'amusement passe par le format Markdown, alors cette classe est pour vous." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "français", englishDescription: "French", t ambassador_title_description: "(Aide)" counselor_title: "Conseiller" counselor_title_description: "(Expert/Professeur)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/he.coffee b/app/locale/he.coffee index 5d39d1b87..97c562d2e 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee index abaae44c6..9a29a9e68 100644 --- a/app/locale/hi.coffee +++ b/app/locale/hi.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee index 39fb5c38d..62d910253 100644 --- a/app/locale/hu.coffee +++ b/app/locale/hu.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t campaign_player_created: "Játékosok pályái" campaign_player_created_description: "...melyekben Művészi Varázsló társaid ellen kűzdhetsz." level_difficulty: "Nehézség: " +# play_as: "Play As " contact: contact_us: "Lépj kapcsolatba velünk" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t wizard_tab: "Varázsló" password_tab: "Jelszó" emails_tab: "Levelek" +# admin: "Admin" gravatar_select: "Válassz egy Gravatar képet!" gravatar_add_photos: "Adj képeket a Gravatar fiókodhoz" gravatar_add_more_photos: "Adj több képet a Gravatar fiókodhoz, hogy itt is elérd őket" @@ -130,6 +132,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t new_password_verify: "Mégegyszer" email_subscriptions: "Hírlevél feliratkozások" email_announcements: "Bejelentések" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Szeretnél levelet kapni a legújabb fejlesztéseinkről?" contributor_emails: "Hozzájárulóknak szóló levelek" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t victory_sign_up: "Regisztrálj a friss infókért" victory_sign_up_poke: "Szeretnéd, ha levelet küldenénk neked az újításokról? Regisztrálj ingyen egy fiókot, és nem maradsz le semmirtől!" victory_rate_the_level: "Értékeld a pályát: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Következő pálya" victory_go_home: "Vissza a kezdőoldalra" victory_review: "Mondd el a véleményedet!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t tome_available_spells: "Elérhető varázslatok" hud_continue: "Folytatás (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t contact_us: "lépj kapcsolatba velünk!" hipchat_prefix: "Megtalálhatsz bennünket a " hipchat_url: "HipChat szobában." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Néhány beállítás?" level_tab_thangs: "Eszközök" level_tab_scripts: "Kódok" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t level_components_title: "Vissza az összes eszközhöz" level_components_type: "Típus" level_component_edit_title: "Komponens szerkesztése" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Rendszer szerkesztése" create_system_title: "Új rendszer készítése" new_component_title: "Új komponens készítése" new_component_field_system: "Rendszer" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Előnézet" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # body: "Body" # version: "Version" commit_msg: "Megjegyzés" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "vagy " email: "Email cím" +# password: "Password" message: "Üzenet" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/id.coffee b/app/locale/id.coffee index 4c21ab17c..04061d098 100644 --- a/app/locale/id.coffee +++ b/app/locale/id.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/it.coffee b/app/locale/it.coffee index e1ecb580f..98e3c10ad 100644 --- a/app/locale/it.coffee +++ b/app/locale/it.coffee @@ -1,4 +1,4 @@ -module.exports = nativeDescription: "italiano", englishDescription: "Italian", translation: +module.exports = nativeDescription: "Italiano", englishDescription: "Italian", translation: common: loading: "Caricamento in corso..." saving: "Salvataggio in corso..." @@ -9,7 +9,7 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t delay_3_sec: "3 secondi" delay_5_sec: "5 secondi" manual: "Manuale" -# fork: "Fork" + fork: "Fork" play: "Gioca" modal: @@ -20,11 +20,11 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t page_not_found: "Pagina non trovata" nav: - play: "Gioca" + play: "Livelli" editor: "Editor" blog: "Blog" forum: "Forum" - admin: "Admin" + admin: "Amministratore" home: "Pagina iniziale" contribute: "Contribuisci" legal: "Legale" @@ -49,30 +49,30 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t recover: recover_account_title: "Recupera account" - send_password: "Spedisci password di recupero" + send_password: "Invia password di recupero" signup: - create_account_title: "Crea un accounto per salvare le partite" - description: "È gratis. Servono solo un paio di dettagli:" + create_account_title: "Crea un account per salvare le partite" + description: "È gratuito. Servono solo un paio di dettagli e sarai pronto per iniziare:" email_announcements: "Ricevi comunicazioni per email" coppa: "13+ o non-USA" coppa_why: "(Perché?)" creating: "Creazione account..." sign_up: "Registrati" - log_in: "accedi con password" + log_in: "Accedi con la password" home: slogan: "Impara a programmare in JavaScript giocando" - no_ie: "CodeCombat non supporta IE8 o browser precedenti. Ci dispiace!" - no_mobile: "CodeCombat non è stato pensato per dispositivi mobili e potrebbe non funzionare!" + no_ie: "CodeCombat non supporta Internet Explorer 9 o browser precedenti. Ci dispiace!" + no_mobile: "CodeCombat non è stato progettato per dispositivi mobile e potrebbe non funzionare!" play: "Gioca" play: choose_your_level: "Scegli il tuo livello" - adventurer_prefix: "Puoi saltare a qualunque livello qui sotto, o scambiare opinioni sui livelli sul" + adventurer_prefix: "Puoi entrare in qualunque livello qui sotto, o scambiare opinioni su questi livelli sul" adventurer_forum: "forum degli Avventurieri" adventurer_suffix: "." - campaign_beginner: "Campagne facili" + campaign_beginner: "Campagne per principianti" campaign_beginner_description: "... nelle quali imparerai i trucchi della programmazione." campaign_dev: "Livelli difficili casuali" campaign_dev_description: "... nei quali imparerai a usare l'interfaccia facendo qualcosa di un po' più difficile." @@ -81,12 +81,13 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t campaign_player_created: "Creati dai giocatori" campaign_player_created_description: "... nei quali affronterai la creatività dei tuoi compagni Stregoni Artigiani." level_difficulty: "Difficoltà: " + play_as: "Gioca come " contact: contact_us: "Contatta CodeCombat" welcome: "È bello sentirti! Usa questo modulo per mandarci un'email." contribute_prefix: "Se sei interessato a contribuire, dai un'occhiata alla nostra " - contribute_page: "pagina dei contributi" + contribute_page: "pagina Contribuisci" contribute_suffix: "!" forum_prefix: "Per discussioni pubbliche, puoi provare " forum_page: "il nostro forum" @@ -94,24 +95,24 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t send: "Invia feedback" diplomat_suggestion: - title: "Aiuta a tradurre CodeCombat!" - sub_heading: "Abbiamo bisogno di traduttori." - pitch_body: "Noi sviluppiamo CodeCombat in inglese, ma abbiamo già giocatori in tutto il mondo. Molti di loro vorrebbero giocare in italiano, ma non parlano inglese, quindi se tu li conosci entrambi sarebbe fantastico se decidessi di diventare un Diplomatico ed aiutassi a tradurre sia il sito di CodeCombat che tutti i livelli in italiano." - missing_translations: "Finché non riusciamo a tradurre tutto in italiano vedrai alcune parti in inglese, dove l'italiano non è disponibile." - learn_more: "Maggiori dettagli su cosa vuol dire essere un Diplomatico" + title: "Aiutaci a tradurre CodeCombat!" + sub_heading: "Abbiamo bisogno delle tue competenze linguistiche." + pitch_body: "Noi sviluppiamo CodeCombat in inglese, ma abbiamo già giocatori in tutto il mondo. Molti di loro vorrebbero giocare in {Italiano}, ma non parlano inglese, quindi se tu li conosci entrambi sarebbe fantastico se decidessi di diventare un Diplomatico ed aiutassi a tradurre sia il sito di CodeCombat che tutti i livelli in {Italiano}." + missing_translations: "Finché non riusciamo a tradurre tutto in {Italiano} vedrai alcune parti in inglese, dove l'{Italiano} non è disponibile." + learn_more: "Maggiori dettagli su come diventare un Diplomatico" subscribe_as_diplomat: "Diventa un Diplomatico" -# wizard_settings: + wizard_settings: # title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" + customize_avatar: "Personalizza il tuo personaggio" + clothes: "Abbigliamento" # trim: "Trim" # cloud: "Cloud" # spell: "Spell" # boots: "Boots" # hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + saturation: "Saturazione" + lightness: "Luminosità" account_settings: title: "Impostazioni account" @@ -122,16 +123,18 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t wizard_tab: "Stregone" password_tab: "Password" emails_tab: "Email" + admin: "Amministratore" gravatar_select: "Seleziona quale foto di Gravatar usare" - gravatar_add_photos: "Aggiungi delle immagini all'account di Gravatar per la tua email per scegliere un'immagine." + gravatar_add_photos: "Aggiungi delle miniature e delle immagini all'account di Gravatar per la tua email per scegliere un'immagine." gravatar_add_more_photos: "Aggiungi più foto al tuo account di Gravatar per vederle qui." wizard_color: "Colore dei vestiti da Stregone" new_password: "Nuova password" new_password_verify: "Verifica" email_subscriptions: "Sottoscrizioni email" - email_announcements: "Annunci" -# email_notifications_description: "Get periodic notifications for your account." - email_announcements_description: "Ricevi email con le ultime novità e sviluppi a CodeCombat." + email_announcements: "Annunci email" + email_notifications: "Notifiche email" + email_notifications_description: "Ricevi notifiche periodiche del tuo account." + email_announcements_description: "Ricevi email con le ultime novità e sviluppi di CodeCombat." contributor_emails: "Email dei collaboratori" contribute_prefix: "Stiamo cercando persone che si uniscano al nostro gruppo! Dai un'occhiata alla " contribute_page: "pagina dei collaboratori" @@ -144,11 +147,11 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t account_profile: edit_settings: "Modifica impostazioni" profile_for_prefix: "Profilo di " -# profile_for_suffix: "" + profile_for_suffix: "" profile: "Profilo" - user_not_found: "Utente non trovato. Forse l'URL è sbagliato." + user_not_found: "Utente non trovato. Controlla l'URL" gravatar_not_found_mine: "Non abbiamo trovato un profilo associato a:" -# gravatar_not_found_email_suffix: "." + gravatar_not_found_email_suffix: "." gravatar_signup_prefix: "Iscriviti su " gravatar_signup_suffix: " per impostare tutto!" gravatar_not_found_other: "A quanto pare non c'è un profilo associato con l'indirizzo email di questa persona." @@ -172,11 +175,14 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t reload_title: "Ricarica tutto il codice?" reload_really: "Sei sicuro di voler ricominciare il livello?" reload_confirm: "Ricarica tutto" -# victory_title_prefix: "" + victory_title_prefix: "" victory_title_suffix: " Completato" victory_sign_up: "Registrati per gli aggiornamenti" victory_sign_up_poke: "Vuoi ricevere le ultime novità per email? Crea un account gratuito e ti terremo aggiornato!" victory_rate_the_level: "Vota il livello: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Gioca il prossimo livello" victory_go_home: "Torna alla pagina iniziale" victory_review: "Dicci di più!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t tome_available_spells: "Incantesimi disponibili" hud_continue: "Continua (premi Maiusc-Spazio)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Vista amministratore" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t contact_us: "scrivici!" hipchat_prefix: "Ci puoi anche trovare nella nostra" hipchat_url: "stanza HipChat." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Opzioni??" level_tab_thangs: "Thangs" level_tab_scripts: "Script" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t level_components_title: "Torna all'elenco thangs" level_components_type: "Tipo" level_component_edit_title: "Modifica componente" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Modifica sistema" create_system_title: "Crea nuovo sistema" new_component_title: "Crea nuovo componente" new_component_field_system: "Sistema" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Anteprima" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t body: "Testo" version: "Versione" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" results: "Risultati" description: "Descrizione" or: "o" email: "Email" +# password: "Password" message: "Messaggio" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Chi c'è inCodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t # artisan_join_step4: "Post your levels on the forum for feedback." more_about_artisan: "Leggi di più su cosa vuol dire diventare un creativo Artigiano" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t more_about_adventurer: "Leggi di più su cosa vuol dire diventare un coraggioso Avventuriero" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " scribe_introduction_url_mozilla: "Rete di sviluppo di Mozilla" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "italiano", englishDescription: "Italian", t ambassador_title_description: "(Supporto)" counselor_title: "Consigliere" counselor_title_description: "(Esperto/Insegnante)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index 47b10f118..aee267bdc 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." level_difficulty: "難易度: " +# play_as: "Play As " contact: contact_us: "お問い合わせ" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", wizard_tab: "魔法使い" password_tab: "パスワード" emails_tab: "メール" +# admin: "Admin" gravatar_select: "Gravatar" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", new_password_verify: "新パスワードを再入力" email_subscriptions: "ニュースレターの購読" email_announcements: "お知らせ" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "CodeCombatの最新のニュースや進展をメールで受け取る" contributor_emails: "開発を手伝ってくれる人向けのメール" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", victory_sign_up: "進行状況を保存するにはアカウント登録をしてください" victory_sign_up_poke: "あなたのコードを保存してみませんか? 無料アカウント登録!" victory_rate_the_level: "このレベルの評価: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "次のレベル" victory_go_home: "ホームに戻る" victory_review: "フィードバック" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", tome_available_spells: "利用できる呪文" hud_continue: "続く (Shift+Spaceキー)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "管理画面" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", ambassador_title_description: "(サポート)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index 9b0f4c9c4..6e97a6bd4 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -1,274 +1,306 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", translation: common: - loading: "Loading..." -# saving: "Saving..." -# sending: "Sending..." -# cancel: "Cancel" -# save: "Save" -# delay_1_sec: "1 second" -# delay_3_sec: "3 seconds" -# delay_5_sec: "5 seconds" + loading: "로딩중입니다..." + saving: "저장중입니다..." + sending: "보내는 중입니다..." + cancel: "취소" + save: "저장" + delay_1_sec: "1초" + delay_3_sec: "3초" + delay_5_sec: "5초" # manual: "Manual" -# fork: "Fork" -# play: "Play" + fork: "Fork" + play: "시작" -# modal: -# close: "Close" -# okay: "Okay" + modal: + close: "Close" + okay: "Okay" -# not_found: -# page_not_found: "Page not found" + not_found: + page_not_found: "페이지를 찾을 수 없습니다" -# nav: -# play: "Levels" -# editor: "Editor" -# blog: "Blog" -# forum: "Forum" -# admin: "Admin" -# home: "Home" -# contribute: "Contribute" -# legal: "Legal" -# about: "About" -# contact: "Contact" -# twitter_follow: "Follow" -# employers: "Employers" + nav: + play: "레벨" + editor: "에디터" + blog: "블로그" + forum: "포럼" + admin: "관리자" + home: "홈" + contribute: "참여하기" + legal: "법" + about: "소개" + contact: "문의" + twitter_follow: "Follow" + employers: "직원들" -# versions: -# save_version_title: "Save New Version" -# new_major_version: "New Major Version" -# cla_prefix: "To save changes, first you must agree to our" -# cla_url: "CLA" -# cla_suffix: "." -# cla_agree: "I AGREE" + versions: + save_version_title: "새로운 버전을 저장합니다" + new_major_version: "신규 버전" + cla_prefix: "변경사항을 저장하기 위해서는, 먼저 계약사항에 동의 하셔야 합니다." + cla_url: "CLA" + cla_suffix: "." + cla_agree: "동의 합니다" -# login: -# sign_up: "Create Account" -# log_in: "Log In" -# log_out: "Log Out" -# recover: "recover account" + login: + sign_up: "계정 생성" + log_in: "로그인" + log_out: "로그아웃" + recover: "계정 복구" -# recover: -# recover_account_title: "Recover Account" -# send_password: "Send Recovery Password" + recover: + recover_account_title: "계정 복구" + send_password: "복구 비밀번호 전송" -# signup: -# create_account_title: "Create Account to Save Progress" -# description: "It's free. Just need a couple things and you'll be good to go:" -# email_announcements: "Receive announcements by email" -# coppa: "13+ or non-USA " -# coppa_why: "(Why?)" -# creating: "Creating Account..." -# sign_up: "Sign Up" -# log_in: "log in with password" + signup: + create_account_title: "진행 상황을 저장하기 위해서 새 계정을 생성합니다" + description: "이것은 무료입니다. 계속 진행하기 위해서 간단한 몇가지만 적어주세요" + email_announcements: "안내 사항을 메일로 받겠습니다" + coppa: "13살 이상 또는 미국 외 거주자" + coppa_why: "(왜?)" + creating: "계정을 생성 중입니다..." + sign_up: "등록" + log_in: "비밀번호로 로그인" -# home: -# slogan: "Learn to Code JavaScript by Playing a Game" -# no_ie: "CodeCombat does not run in Internet Explorer 9 or older. Sorry!" -# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!" -# play: "Play" + home: + slogan: "쉽고 간단한 게임으로 자바스크립트 배우기" + no_ie: "죄송하지만 코드컴뱃은 인터넷 익스플로러 9에서는 동작하지 않습니다." + no_mobile: "코드 컴뱃은 모바일 기기용으로 제작되지 않았습니다. 아마 동작하지 않을 가능성이 높습니다." + play: "시작" -# play: -# choose_your_level: "Choose Your Level" -# adventurer_prefix: "You can jump to any level below, or discuss the levels on " -# adventurer_forum: "the Adventurer forum" -# adventurer_suffix: "." -# campaign_beginner: "Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." -# campaign_dev: "Random Harder Levels" -# campaign_dev_description: "... in which you learn the interface while doing something a little harder." -# campaign_multiplayer: "Multiplayer Arenas" -# campaign_multiplayer_description: "... in which you code head-to-head against other players." -# campaign_player_created: "Player-Created" -# campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." -# level_difficulty: "Difficulty: " + play: + choose_your_level: "레벨을 선택하세요." + adventurer_prefix: "아래에 있는 어떤 레벨도 바로 시작하실 수 있습니다.또는 포럼에서 레벨에 관해 토론하세요 :" + adventurer_forum: "모험가들의 포럼" + adventurer_suffix: "." + campaign_beginner: "초보자 캠페인" + campaign_beginner_description: "... 이곳에서 당신은 프로그래밍의 마법을 배우게 될 것입니다." + campaign_dev: "상급 레벨 랜덤 선택" + campaign_dev_description: "... 이곳에서 당신은 조금 더 어려운 레벨에 도전할때 필요한 조작 방법을 배울 것입니다." + campaign_multiplayer: "멀티 플레이어 전투장" + campaign_multiplayer_description: "... 이곳에서 당신은 다른 인간 플레이어들과 직접 결투할 수 있습니다." + campaign_player_created: "사용자 직접 제작" + campaign_player_created_description: "... 당신 동료가 고안한 레벨에 도전하세요 Artisan Wizards." + level_difficulty: "난이도: " + play_as: "Play As " -# contact: -# contact_us: "Contact CodeCombat" -# welcome: "Good to hear from you! Use this form to send us email. " -# contribute_prefix: "If you're interested in contributing, check out our " -# contribute_page: "contribute page" -# contribute_suffix: "!" -# forum_prefix: "For anything public, please try " -# forum_page: "our forum" -# forum_suffix: " instead." -# send: "Send Feedback" + contact: + contact_us: "코드컴뱃에 전할말" + welcome: "의견은 언제든지 환영합니다. 이 양식을 이메일에 사용해 주세요!" + contribute_prefix: "혹시 같이 코드컴뱃에 공헌하고 싶으시다면 홈페이지에 들러주세요 " + contribute_page: "참여하기 페이지" + contribute_suffix: "!" + forum_prefix: "공개적으로 논의할 사항이라면 우리 포럼에서 해주세요 : " + forum_page: "포럼" + forum_suffix: " 대신에." + send: "의견 보내기" diplomat_suggestion: -# title: "Help translate CodeCombat!" -# sub_heading: "We need your language skills." + title: "코드 컴뱃 번역을 도와주세요!" + sub_heading: "우리는 당신의 언어 능력이필요합니다." pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Korean 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 Korean." missing_translations: "Until we can translate everything into Korean, you'll see English when Korean isn't available." -# learn_more: "Learn more about being a Diplomat" -# subscribe_as_diplomat: "Subscribe as a Diplomat" + learn_more: "외교관에 대해서 좀더 자세히알기" + subscribe_as_diplomat: "훌륭한 외교관으로써, 정기 구독하기" -# wizard_settings: -# title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" -# trim: "Trim" -# cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" -# hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + wizard_settings: + title: "마법사 설장" + customize_avatar: "당신의 분신을 직접 꾸미세요" + clothes: "옷" + trim: "장식" + cloud: "구름" + spell: "마법" + boots: "장화" + hue: "색조" + saturation: "채도" + lightness: "명도" -# account_settings: -# title: "Account Settings" -# not_logged_in: "Log in or create an account to change your settings." -# autosave: "Changes Save Automatically" -# me_tab: "Me" -# picture_tab: "Picture" -# wizard_tab: "Wizard" -# password_tab: "Password" -# emails_tab: "Emails" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." -# wizard_color: "Wizard Clothes Color" -# new_password: "New Password" -# new_password_verify: "Verify" -# email_subscriptions: "Email Subscriptions" -# email_announcements: "Announcements" -# email_notifications_description: "Get periodic notifications for your account." -# email_announcements_description: "Get emails on the latest news and developments at CodeCombat." + account_settings: + title: "계정 설정" + not_logged_in: "로그인 하시거나 계정을 생성하여 주세요." + autosave: "변경 사항은 자동 저장 됩니다" + me_tab: "나" + picture_tab: "사진" + wizard_tab: "마법사" + password_tab: "비밀번호" + emails_tab: "이메일" + admin: "관리자" + gravatar_select: "사용하기 위한 Gravatar를 선택해 주세요" + gravatar_add_photos: "이미지를 선택하기 위해서는 우선 Gravatar 계정에 썸네일이나 이미지를 추가하여 주세요" + gravatar_add_more_photos: "코드컴뱃에서 더 많은 이미지를 추가하려면 우선 당신의 Gravatar 계정에 좀 더 많은 이미지를 추가해 주세요" + wizard_color: "마법사 옷 색깔" + new_password: "새 비밀번호" + new_password_verify: "승인" + email_subscriptions: "이메일 구독" + email_announcements: "공지사항" + email_notifications: "알람" + email_notifications_description: "계정을 위해서 정기적으로 구독하세요" + email_announcements_description: "코드 컴뱃의 개발 또는 진행상황을 이메일로 구독 하세요" # contributor_emails: "Contributor Class Emails" -# contribute_prefix: "We're looking for people to join our party! Check out the " -# contribute_page: "contribute page" -# contribute_suffix: " to find out more." -# email_toggle: "Toggle All" -# error_saving: "Error Saving" -# saved: "Changes Saved" -# password_mismatch: "Password does not match." + contribute_prefix: "우리는 언제나 당신의 참여를 환영 합니다 : " + contribute_page: "참여하기 페이지" + contribute_suffix: " 좀 더 찾기 위해." + email_toggle: "모두 토글" + error_saving: "오류 저장" + saved: "변경사항 저장 완료" + password_mismatch: "비밀번호가 일치하지 않습니다." -# account_profile: -# edit_settings: "Edit Settings" -# profile_for_prefix: "Profile for " -# profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " + account_profile: + edit_settings: "설정사항 변경" + profile_for_prefix: "프로필 " + profile_for_suffix: "" + profile: "프로필" + user_not_found: "유저를 찾을 수 없습니다 URL은 체크 하셨죠?" + gravatar_not_found_mine: "죄송하지만 귀하의 이메일 주소를 찾을 수 없습니다 :" + gravatar_not_found_email_suffix: "." + gravatar_signup_prefix: "등록" # gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" + gravatar_not_found_other: "이 사람의 이메일 주소와 관련된 어떤것도 찾을 수 없습니다." + gravatar_contact: "연락처" + gravatar_websites: "웹사이트" # gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" + gravatar_profile_link: "전체 Gravatar 프로필" -# play_level: -# level_load_error: "Level could not be loaded: " -# done: "Done" -# grid: "Grid" -# customize_wizard: "Customize Wizard" -# home: "Home" -# guide: "Guide" -# multiplayer: "Multiplayer" -# restart: "Restart" -# goals: "Goals" -# action_timeline: "Action Timeline" -# click_to_select: "Click on a unit to select it." -# reload_title: "Reload All Code?" -# reload_really: "Are you sure you want to reload this level back to the beginning?" -# reload_confirm: "Reload All" -# victory_title_prefix: "" -# victory_title_suffix: " Complete" -# victory_sign_up: "Sign Up to Save Progress" -# victory_sign_up_poke: "Want to save your code? Create a free account!" -# victory_rate_the_level: "Rate the level: " -# victory_play_next_level: "Play Next Level" -# victory_go_home: "Go Home" -# victory_review: "Tell us more!" -# victory_hour_of_code_done: "Are You Done?" -# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!" -# multiplayer_title: "Multiplayer Settings" -# multiplayer_link_description: "Give this link to anyone to have them join you." -# multiplayer_hint_label: "Hint:" -# multiplayer_hint: " Click the link to select all, then press ⌘-C or Ctrl-C to copy the link." -# multiplayer_coming_soon: "More multiplayer features to come!" -# guide_title: "Guide" -# tome_minion_spells: "Your Minions' Spells" -# tome_read_only_spells: "Read-Only Spells" -# tome_other_units: "Other Units" -# tome_cast_button_castable: "Cast Spell" -# tome_cast_button_casting: "Casting" -# tome_cast_button_cast: "Spell Cast" -# tome_autocast_delay: "Autocast Delay" -# tome_select_spell: "Select a Spell" -# tome_select_a_thang: "Select Someone for " -# tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" -# spell_saved: "Spell Saved" + play_level: + level_load_error: "레벨 로딩 실패 : " + done: "완료" + grid: "그리드" + customize_wizard: "사용자 정의 마법사" + home: "홈" + guide: "가이드" + multiplayer: "멀티 플레이어" + restart: "재시작" + goals: "목표" + action_timeline: "액션 타임라인" + click_to_select: "유닛을 선택하기 위해서 유닛을 마우스로 클릭하세요." + reload_title: "모든 코드가 다시 로딩 되었나요?" + reload_really: "모든 레벨 초기화합니다. 확실한가요?" + reload_confirm: "모두 초기화" + victory_title_prefix: "" + victory_title_suffix: " 완료" + victory_sign_up: "진행사항 저장을 위해 등록하세요" + victory_sign_up_poke: "코드를 저장하고 싶으세요? 지금 등록하세요!" + victory_rate_the_level: "이번 레벨 평가: " + victory_rank_my_game: "내이름 순위 등록" + victory_ranking_game: "제출 중..." + victory_return_to_ladder: "레더로 돌아가기" + victory_play_next_level: "다음 레벨 플레이 하기" + victory_go_home: "홈으로" + victory_review: "리뷰를 남겨주세요" + victory_hour_of_code_done: "정말 종료합니까?" + victory_hour_of_code_done_yes: "네 내 Hour of Code™ 완료했습니다!" + multiplayer_title: "멀티 플레이어 설정" + multiplayer_link_description: "당신에게 참여를 원하는 사람에게 이 링크를 주세요." + multiplayer_hint_label: "힌트:" + multiplayer_hint: " 모두 선택하려면 링크를 클릭하세요, 그리고 ⌘-C 또는 Ctrl-C 를 눌러서 링크를 복사하세요." + multiplayer_coming_soon: "곧 좀 더 다양한 멀티플레이어 모드가 업데이트 됩니다!" + guide_title: "가이드" + tome_minion_spells: "당신 미니언의' 마법" + tome_read_only_spells: "읽기 전용 마법" + tome_other_units: "다른 유닛들" + tome_cast_button_castable: "마법 캐스팅" + tome_cast_button_casting: "캐스팅 중" + tome_cast_button_cast: "마법 캐스팅" + tome_autocast_delay: "자동 마법 캐스팅 딜레이" + tome_select_spell: "마법을 선택 하세요" + tome_select_a_thang: "누군가를 선택하세요. " + tome_available_spells: "마법 사용 가능하므로" + hud_continue: "계속진행 (shift+space)" + spell_saved: "마법 저장 완료" + skip_tutorial: "넘기기 (esc)" -# admin: -# av_title: "Admin Views" -# av_entities_sub_title: "Entities" -# av_entities_users_url: "Users" -# av_entities_active_instances_url: "Active Instances" + admin: + av_title: "관리자 뷰" + av_entities_sub_title: "속성들" + av_entities_users_url: "유저들" + av_entities_active_instances_url: "액티브 인스턴스들" # av_other_sub_title: "Other" -# av_other_debug_base_url: "Base (for debugging base.jade)" -# u_title: "User List" -# lg_title: "Latest Games" + av_other_debug_base_url: "베이스 (for debugging base.jade)" + u_title: "유저 목록" + lg_title: "가장 최근 게임" -# editor: -# main_title: "CodeCombat Editors" -# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" -# article_title: "Article Editor" + editor: + main_title: "코드 컴뱃 에디터들" + main_description: "당신의 레벨들, 캠페인들, 유닛 그리고 교육 컨텐츠들을 구축하세요. 우리는 당신이 필요한 모든 도구들을 제공합니다!" + article_title: "기사 에디터들" # article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns." -# thang_title: "Thang Editor" + thang_title: "Thang 에디터" # thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics." -# level_title: "Level Editor" + level_title: "레벨 에디터" # level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!" # security_notice: "Many major features in these editors are not currently enabled by default. As we improve the security of these systems, they will be made generally available. If you'd like to use these features sooner, " -# contact_us: "contact us!" -# hipchat_prefix: "You can also find us in our" + contact_us: "연락히기!" + hipchat_prefix: "당신은 또한 우리를 여기에서 찾을 수 있습니다 : " # hipchat_url: "HipChat room." -# level_some_options: "Some Options?" -# level_tab_thangs: "Thangs" -# level_tab_scripts: "Scripts" -# level_tab_settings: "Settings" -# level_tab_components: "Components" -# level_tab_systems: "Systems" + revert: "되돌리기" + revert_models: "모델 되돌리기" + level_some_options: "다른 옵션들?" + level_tab_thangs: "Thangs" + level_tab_scripts: "스크립트들" + level_tab_settings: "설정" + level_tab_components: "요소들" + level_tab_systems: "시스템" # level_tab_thangs_title: "Current Thangs" # level_tab_thangs_conditions: "Starting Conditions" # level_tab_thangs_add: "Add Thangs" -# level_settings_title: "Settings" -# level_component_tab_title: "Current Components" -# level_component_btn_new: "Create New Component" -# level_systems_tab_title: "Current Systems" -# level_systems_btn_new: "Create New System" -# level_systems_btn_add: "Add System" + level_settings_title: "설정" + level_component_tab_title: "현재 요소들" + level_component_btn_new: "새로운 요소들 생성" + level_systems_tab_title: "현재 시스템" + level_systems_btn_new: "새로운 시스템생성" + level_systems_btn_add: "새로운 시스템 추가" # level_components_title: "Back to All Thangs" # level_components_type: "Type" -# level_component_edit_title: "Edit Component" -# level_system_edit_title: "Edit System" -# create_system_title: "Create New System" -# new_component_title: "Create New Component" -# new_component_field_system: "System" + level_component_edit_title: "요소 편집" + level_component_config_schema: "환경 설정" + level_component_settings: "설정" + level_system_edit_title: "시스템 편집" + create_system_title: "새로운 시스템 생성" + new_component_title: "새로운 요소들 생성" + new_component_field_system: "시스템" + new_article_title: "새로운 기사 작성" + new_thang_title: "새로운 Thang type 시작" + new_level_title: "새로운 레벨 시작" + article_search_title: "기사들은 여기에서 찾으세요" + thang_search_title: "Thang 타입들은 여기에서 찾으세요" + level_search_title: "레벨들은 여기에서 찾으세요" -# article: -# edit_btn_preview: "Preview" -# edit_article_title: "Edit Article" + article: + edit_btn_preview: "미리보기" + edit_article_title: "기사 편집하기" -# general: -# and: "and" -# name: "Name" -# body: "Body" -# version: "Version" -# commit_msg: "Commit Message" -# version_history_for: "Version History for: " -# results: "Results" -# description: "Description" -# or: "or" -# email: "Email" -# message: "Message" + general: + and: "그리고" + name: "이름" + body: "구성" + version: "버전" + commit_msg: "커밋 메세지" + history: "히스토리" + version_history_for: "버전 히스토리 : " + result: "결과" + results: "결과들" + description: "설명" + or: "또한" + email: "이메일" + password: "비밀번호" + message: "메시지" + code: "코드" + ladder: "레더" + when: "언제" + opponent: "상대" + rank: "랭크" + score: "점수" + win: "승" + loss: "패" + tie: "비김" + easy: "쉬움" + medium: "중간" + hard: "어려" # about: # who_is_codecombat: "Who is CodeCombat?" # why_codecombat: "Why CodeCombat?" # who_description_prefix: "together started CodeCombat in 2013. We also created " -# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." +# who_description_suffix: "in 2008, growing it to the 1 web and iOS application for learning to write Chinese and Japanese characters." # who_description_ending: "Now it's time to teach people to write code." # why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." # why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." @@ -285,7 +317,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." # jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." # michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." - +# # legal: # page_title: "Legal" # opensource_intro: "CodeCombat is free to play and completely open source." @@ -346,7 +378,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # nutshell_title: "In a Nutshell" # nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." # canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence." - +# # contribute: # page_title: "Contributing" # character_classes_title: "Character Classes" @@ -389,7 +421,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +431,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -440,7 +472,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # brave_adventurers: "Our Brave Adventurers:" # translating_diplomats: "Our Translating Diplomats:" # helpful_ambassadors: "Our Helpful Ambassadors:" - +# # classes: # archmage_title: "Archmage" # archmage_title_description: "(Coder)" @@ -456,3 +488,35 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" +# +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee index a562a051c..fef80fa08 100644 --- a/app/locale/lt.coffee +++ b/app/locale/lt.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ms-BA.coffee b/app/locale/ms-BA.coffee index 861bce18e..721cf870a 100644 --- a/app/locale/ms-BA.coffee +++ b/app/locale/ms-BA.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "atau" email: "Emel" +# password: "Password" message: "Mesej" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee index 92ac6f932..c0997bb67 100644 --- a/app/locale/nb.coffee +++ b/app/locale/nb.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg campaign_player_created: "Spiller-Lagde" campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende Artisan Trollmenn." level_difficulty: "Vanskelighetsgrad: " +# play_as: "Play As " contact: contact_us: "Kontakt CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg wizard_tab: "Trollmann" password_tab: "Passord" emails_tab: "Epost" +# admin: "Admin" gravatar_select: "Velg hvilket Gravatar bilde du ønsker å bruke" gravatar_add_photos: "Legg til miniatyrbilder og bildertil en Gravatar konto for at du skal kunne velge et bilde for din epost." gravatar_add_more_photos: "Legg til flere bilder til din Gravatar konto for å kunne aksessere dem her." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg new_password_verify: "Verifiser" email_subscriptions: "Epost Abonnement" email_announcements: "Kunngjøringer" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Få epost om siste nytt og utvikling fra CodeCombat." contributor_emails: "Contributor Klasse Epost" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg victory_sign_up: "Tegn deg på for Oppdateringer" victory_sign_up_poke: "Vil du ha siste nytt på epost? Opprett en gratis konto, så vil vi holde deg oppdatert!" victory_rate_the_level: "Bedøm nivået: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spill Neste Nivå" victory_go_home: "Gå Hjem" victory_review: "Fortell oss mer!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg tome_available_spells: "Tilgjenglige Trylleformularer" hud_continue: "Fortsett (trykk shift-mellomrom)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "eller" email: "Epost" +# password: "Password" message: "Melding" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index 57a366206..463e559fb 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -8,7 +8,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t delay_1_sec: "1 seconde" delay_3_sec: "3 secondes" delay_5_sec: "5 secondes" - manual: "Handboek" + manual: "Handleiding" fork: "Fork" play: "Spelen" @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t campaign_player_created: "Door-spelers-gemaakt" campaign_player_created_description: "... waarin je ten strijde trekt tegen de creativiteit van andere Ambachtelijke Tovenaars." level_difficulty: "Moeilijkheidsgraad: " +# play_as: "Play As " contact: contact_us: "Contact opnemen met CodeCombat" @@ -103,7 +104,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t wizard_settings: title: "Tovenaar instellingen" - customize_avatar: "Bewerk jouw avatar" + customize_avatar: "Bewerk je avatar" clothes: "Kleren" trim: "Trim" cloud: "Wolk" @@ -116,12 +117,13 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t account_settings: title: "Account Instellingen" not_logged_in: "Log in of maak een account om je instellingen aan te passen." - autosave: "Aanpassingen Worden Automatisch Opgeslagen" + autosave: "Aanpassingen Automatisch Opgeslagen" me_tab: "Ik" picture_tab: "Afbeelding" wizard_tab: "Tovenaar" password_tab: "Wachtwoord" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Selecteer welke Gravatar foto je wilt gebruiken" gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen." gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t new_password_verify: "Verifieer" email_subscriptions: "E-mail Abonnementen" email_announcements: "Aankondigingen" + email_notifications: "Notificaties" email_notifications_description: "Krijg periodieke meldingen voor jouw account." email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat." contributor_emails: "Medewerker Klasse emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t victory_sign_up: "Schrijf je in om je progressie op te slaan" victory_sign_up_poke: "Wil je jouw code opslaan? Maak een gratis account aan!" victory_rate_the_level: "Beoordeel het level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Speel Volgend Level" victory_go_home: "Ga naar Home" victory_review: "Vertel ons meer!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t tome_available_spells: "Beschikbare spreuken" hud_continue: "Ga verder (druk shift-space)" spell_saved: "Spreuk Opgeslagen" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Administrator panels" @@ -215,15 +233,17 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t main_title: "CodeCombat Editors" main_description: "Maak je eigen levels, campagnes, eenheden en leermateriaal. Wij bieden alle programma's aan die u nodig heeft!" article_title: "Artikel Editor" - article_description: "Schrijf artikels dat spelers een overzicht geven over programmeer concepten die kunnen gebruikt worden over een variëteit van levels en campagnes." + article_description: "Schrijf artikels die spelers een overzicht geven over programmeer concepten die kunnen gebruikt worden over een variëteit van levels en campagnes." thang_title: "Thang Editor" - thang_description: "Maak eenheden, beschrijf hun default logica, graphics en audio. Momenteel is enkel het importeren van vector graphics geëxporteerd in Flash ondersteund." + thang_description: "Maak eenheden, beschrijf hun standaard logica, graphics en audio. Momenteel is enkel het importeren van vector graphics geëxporteerd in Flash ondersteund." level_title: "Level Editor" - level_description: "Bevat het programma om te programmeren, audio te uploaden en aangepaste logica om alle soorten levels te maken. Het is alles wat wijzelf ook gebruiken!" + level_description: "Bevat het programma om te programmeren, audio te uploaden en aangepaste logica te creëren om alle soorten levels te maken. Het is alles wat wijzelf ook gebruiken!" security_notice: "Veel belangrijke elementen in deze editors zijn momenteel niet actief. Met dat wij de veiligheid van deze systemen verbeteren, zullen ook deze elementen beschikbaar worden. Indien u deze elementen al eerder wil gebruiken, " contact_us: "contacteer ons!" hipchat_prefix: "Je kan ons ook vinden in ons" hipchat_url: "(Engelstalig) HipChat kanaal." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Enkele opties?" level_tab_thangs: "Elementen" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t level_components_title: "Terug naar Alle Elementen" level_components_type: "Type" level_component_edit_title: "Wijzig Component" + level_component_config_schema: "Schema" + level_component_settings: "Instellingen" level_system_edit_title: "Wijzig Systeem" create_system_title: "Maak een nieuw Systeem aan" new_component_title: "Maak een nieuw Component aan" new_component_field_system: "Systeem" + new_article_title: "Maak een Nieuw Artikel" + new_thang_title: "Maak een Nieuw Thang Type" + new_level_title: "Maak een Nieuw Level" + article_search_title: "Zoek Artikels Hier" + thang_search_title: "Zoek Thang Types Hier" + level_search_title: "Zoek Levels Hier" article: edit_btn_preview: "Voorbeeld" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t body: "Inhoud" version: "Versie" commit_msg: "Commit Bericht" + history: "Geschiedenis" version_history_for: "Versie geschiedenis voor: " + result: "Resultaat" results: "Resultaten" description: "Beschrijving" or: "of" email: "Email" +# password: "Password" message: "Bericht" + code: "Code" + ladder: "Ladder" + when: "Wanneer" +# opponent: "Opponent" + rank: "Rang" + score: "Score" + win: "Win" + loss: "Verlies" + tie: "Gelijk" + easy: "Gemakkelijk" + medium: "Medium" + hard: "Moeilijk" about: who_is_codecombat: "Wie is CodeCombat?" @@ -349,7 +392,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t contribute: page_title: "Bijdragen" - character_classes_title: "Karakter Klassen" + character_classes_title: "Karakterklassen" introduction_desc_intro: "We hebben hoge verwachtingen over CodeCombat." introduction_desc_pref: "We willen zijn waar programmeurs van alle niveaus komen om te leren en samen te spelen, anderen introduceren aan de wondere wereld van code, en de beste delen van de gemeenschap te reflecteren. We kunnen en willen dit niet alleen doen; wat projecten zoals GitHub, Stack Overflow en Linux groots en succesvol maken, zijn de mensen die deze software gebruiken en verbeteren. Daartoe, " introduction_desc_github_url: "CodeCombat is volledig open source" @@ -389,49 +432,49 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t artisan_join_step4: "Maak een bericht over jouw level op ons forum voor feedback." more_about_artisan: "Leer meer over hoe je een Creatieve Ambachtsman kan worden." artisan_subscribe_desc: "Ontvang e-mails met nieuws over de Level Editor." - adventurer_sumamry: "Laten we duidelijk zijn over je rol: jij bent de tank. Jij krijgt de zware klappen te verduren. We hebben mensen nodig om spiksplinternieuwe levels te proberen en te kijken hoe deze beter kunnen. De pijn zal groot zijn, het maken van een goede game is een lang proces en niemand doet het de eerste keer goed. Als jij dit kan verduren en een hoge constitution score hebt, dan is dit de klasse voor jou." + adventurer_summary: "Laten we duidelijk zijn over je rol: jij bent de tank. Jij krijgt de zware klappen te verduren. We hebben mensen nodig om spiksplinternieuwe levels te proberen en te kijken hoe deze beter kunnen. De pijn zal groot zijn, het maken van een goede game is een lang proces en niemand doet het de eerste keer goed. Als jij dit kan verduren en een hoge constitution score hebt, dan is dit de klasse voor jou." adventurer_introduction: "Laten we duidelijk zijn over je rol: jij bent de tank. Jij krijgt de zware klappen te verduren. We hebben mensen nodig om spiksplinternieuwe levels te proberen en te kijken hoe deze beter kunnen. De pijn zal groot zijn, het maken van een goede game is een lang proces en niemand doet het de eerste keer goed. Als jij dit kan verduren en een hoge constitution score hebt, dan is dit de klasse voor jou." adventurer_attribute_1: "Een wil om te leren. Jij wilt leren hoe je programmeert en wij willen het jou leren. Je zal overigens zelf het meeste leren doen." adventurer_attribute_2: "Charismatisch. Wees netjes maar duidelijk over wat er beter kan en geef suggesties over hoe het beter kan." - adventurer_join_pref: "Werk samen met een Ambachtsman of recruteer er een, of tik het veld hieronder aan om e-mails te ontvangen wanneer er nieuwe levels zijn om te testen. We zullen ook posten over levels die beoordeeld moeten worden op onze netwerken zoals" + adventurer_join_pref: "Werk samen met een Ambachtsman of recruteer er een, of tik het veld hieronder aan om e-mails te ontvangen wanneer er nieuwe levels zijn om te testen. We zullen ook posten over levels die beoordeeld moeten worden op onze netwerken zoals" adventurer_forum_url: "ons forum" - adventurer_join_suf: "dus als je liever op deze manier wordt geïnformeerd, schrijf je daar in!" + adventurer_join_suf: "dus als je liever op deze manier wordt geïnformeerd, schrijf je daar in!" more_about_adventurer: "Leer meer over hoe je een dappere avonturier kunt worden." adventurer_subscribe_desc: "Ontvang e-mails wanneer er nieuwe levels zijn die getest moeten worden." scribe_summary_pref: "CodeCombat is meer dan slechts een aantal levels, het zal ook een bron van kennis kennis zijn en een wiki met programmeerconcepten waar levels op in kunnen gaan. Op die manier zal een Ambachtslied een link kunnen geven naar een artikel wat past bij een level. Net zoiets als het " - scribe_summary_sufx: " heeft gebouwd. Als jij het leuk vindt programmeerconcepten uit te leggen, dan is deze klasse iets voor jou." - scribe_introduction_pref: "CodeCombat is meer dan slechts een aantal levels, het zal ook een bron van kennis kennis zijn en een wiki met programmeerconcepten waar levels op in kunnen gaan. Op die manier zal elk Ambachtslied niet in detail hoeven uit te leggen wat een vergelijkingsoperator is, maar een link kunnen geven naar een artikel wat deze informatie bevat voor de speler. Net zoiets als het " + scribe_summary_suf: " heeft gebouwd. Als jij het leuk vindt programmeerconcepten uit te leggen, dan is deze klasse iets voor jou." + scribe_introduction_pref: "CodeCombat is meer dan slechts een aantal levels, het zal ook een bron van kennis kennis zijn en een wiki met programmeerconcepten waar levels op in kunnen gaan. Op die manier zal elk Ambachtslied niet in detail hoeven uit te leggen wat een vergelijkingsoperator is, maar een link kunnen geven naar een artikel wat deze informatie bevat voor de speler. Net zoiets als het " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: " heeft gebouwd. Als jij het leuk vindt om programmeerconcepten uit te leggen in Markdown-vorm, dan is deze klasse wellicht iets voor jou." scribe_attribute_1: "Taal-skills zijn praktisch alles wat je nodig hebt. Niet alleen grammatica of spelling, maar ook moeilijke ideeën overbrengen aan anderen." contact_us_url: "Contacteer ons" - scribe_join_description: "vertel ons wat over jezelf, je ervaring met programmeren en over wat voor soort dingen je graag zou schrijven. Verder zien we wel!" - more_about_scribe: "Leer meer over het worden van een ijverige Klerk." - - scribe_subscribe_desc: "Ontvang e-mails met aankondigingen over het schrijven van artikelen." + scribe_join_description: "vertel ons wat over jezelf, je ervaring met programmeren en over wat voor soort dingen je graag zou schrijven. Verder zien we wel!" + more_about_scribe: "Leer meer over het worden van een ijverige Klerk." + scribe_subscribe_desc: "Ontvang e-mails met aankondigingen over het schrijven van artikelen." diplomat_summary: "Er is grote interesse in CodeCombat in landen waar geen Engels wordt gesproken! We zijn op zoek naar vertalers wie tijd willen spenderen aan het vertalen van de site's corpus aan woorden zodat CodeCombat zo snel mogelijk toegankelijk wordt voor heel de wereld. Als jij wilt helpen met CodeCombat internationaal maken, dan is dit de klasse voor jou." - diplomat_introduction_pref: "Dus, als er iets is wat we geleerd hebben van de " + diplomat_introduction_pref: "Dus, als er iets is wat we geleerd hebben van de " diplomat_launch_url: "release in oktober" diplomat_introduction_suf: "dan is het wel dat er een significante interesse is in CodeCombat in andere landen, vooral Brazilië! We zijn een corps aan vertalers aan het creëren dat ijverig de ene set woorden in een andere omzet om CodeCombat zo toegankelijk te maken als mogelijk in heel de wereld. Als jij het leuk vindt glimpsen op te vangen van aankomende content en deze levels zo snel mogelijk naar je landgenoten te krijgen, dan is dit de klasse voor jou." diplomat_attribute_1: "Vloeiend Engels en de taal waar naar je wilt vertalen kunnen spreken. Wanneer je moeilijke ideeën wilt overbrengen, is het belangrijk beide goed te kunnen!" - diplomat_join_pref_github: "Vind jouw taal haar locale bestand " + diplomat_join_pref_github: "Vind van jouw taal het locale bestand " diplomat_github_url: "op GitHub" diplomat_join_suf_github: ", edit het online, en submit een pull request. Daarnaast kun je hieronder aanvinken als je up-to-date wilt worden gehouden met nieuwe internationalisatie-ontwikkelingen." more_about_diplomat: "Leer meer over het worden van een geweldige Diplomaat" diplomat_subscribe_desc: "Ontvang e-mails over i18n ontwikkelingen en levels om te vertalen." ambassador_summary: "We proberen een gemeenschap te bouwen en elke gemeenschap heeft een supportteam nodig wanneer er problemen zijn. We hebben chats, e-mails en sociale netwerken zodat onze gebruikers het spel kunnen leren kennen. Als jij mensen wilt helpen betrokken te raken, plezier te hebben en wat te leren programmeren, dan is dit wellicht de klasse voor jou." +# ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." ambassador_attribute_1: "Communicatieskills. Problemen die spelers hebben kunnen identificeren en ze helpen deze op te lossen. Verder zul je ook de rest van ons geïnformeerd houden over wat de spelers zeggen, wat ze leuk vinden, wat ze minder vinden en waar er meer van moet zijn!" - ambassador_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag zou doen. We zien verder wel!" + ambassador_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag zou doen. We zien verder wel!" ambassador_join_note_strong: "Opmerking" - ambassador_join_note_desc: "Een van onze topprioriteiten is om een multiplayer te bouwen waar spelers die moeite hebben een level op te lossen een wizard met een hoger level kunnen oproepen om te helpen. Dit zal een goede manier zijn voor ambassadeurs om hun ding te doen. We houden je op de hoogte!" + ambassador_join_note_desc: "Een van onze topprioriteiten is om een multiplayer te bouwen waar spelers die moeite hebben een level op te lossen een wizard met een hoger level kunnen oproepen om te helpen. Dit zal een goede manier zijn voor ambassadeurs om hun ding te doen. We houden je op de hoogte!" more_about_ambassador: "Leer meer over het worden van een behulpzame Ambassadeur" - ambassador_subscribe_desc: "Ontvang e-mails met updates over ondersteuning en multiplayer-ontwikkelingen." + ambassador_subscribe_desc: "Ontvang e-mails met updates over ondersteuning en multiplayer-ontwikkelingen." counselor_summary: "Geen van de rollen hierboven in jouw interessegebied? Maak je geen zorgen, we zijn op zoek naar iedereen die wil helpen met het ontwikkelen van CodeCombat! Als je geïnteresseerd bent in lesgeven, gameontwikkeling, open source management of iets anders waarvan je denkt dat het relevant voor ons is, dan is dit de klasse voor jou." counselor_introduction_1: "Heb jij levenservaring? Een afwijkend perspectief op zaken die ons kunnen helpen CodeCombat te vormen? Van alle rollen neemt deze wellicht de minste tijd in, maar individueel maak je misschien het grootste verschil. We zijn op zoek naar wijze tovenaars, vooral in het gebied van lesgeven, gameontwikkeling, open source projectmanagement, technische recrutering, ondernemerschap of design." - counselor_introduction_2: "Of eigenlijk alles wat relevant is voor de ontwikkeling van CodeCombat. Als jij kennis hebt en deze wilt dezen om dit project te laten groeien, dan is dit misschien de klasse voor jou." + counselor_introduction_2: "Of eigenlijk alles wat relevant is voor de ontwikkeling van CodeCombat. Als jij kennis hebt en deze wilt dezen om dit project te laten groeien, dan is dit misschien de klasse voor jou." counselor_attribute_1: "Ervaring, in enig van de bovenstaande gebieden of iets anders waarvan je denkt dat het behulpzaam zal zijn." counselor_attribute_2: "Een beetje vrije tijd!" - counselor_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag wilt doen. We zullen je in onze contactlijst zetten en je benaderen wanneer we je advies kunnen gebruiken (niet te vaak)." + counselor_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag wilt doen. We zullen je in onze contactlijst zetten en je benaderen wanneer we je advies kunnen gebruiken (niet te vaak)." more_about_counselor: "Leer meer over het worden van een waardevolle Raadgever" changes_auto_save: "Veranderingen worden automatisch opgeslagen wanneer je het vierkantje aan- of afvinkt." diligent_scribes: "Onze ijverige Klerks:" @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t ambassador_title_description: "(Ondersteuning)" counselor_title: "Raadgever" counselor_title_description: "(Expert/Leraar)" + + ladder: + please_login: "Log alstublieft eerst in voordat u een ladderspel speelt." + my_matches: "Mijn Wedstrijden" + simulate: "Simuleer" + simulation_explanation: "Door spellen te simuleren kan je zelf sneller beoordeeld worden!" + simulate_games: "Simuleer spellen!" + simulate_all: "RESET EN SIMULEER SPELLEN" + leaderboard: "Leaderboard" + battle_as: "Vecht als " + summary_your: "Jouw " + summary_matches: "Wedstrijden - " + summary_wins: " Overwinningen, " + summary_losses: " Nederlagen" + rank_no_code: "Geen nieuwe code om te Beoordelen!" + rank_my_game: "Beoordeel mijn spel!" + rank_submitting: "Verzenden..." + rank_submitted: "Verzonden voor Beoordeling" + rank_failed: "Beoordeling mislukt" + rank_being_ranked: "Spel wordt Beoordeeld" + code_being_simulated: "Uw nieuwe code wordt gesimuleerd door andere spelers om te beoordelen. Dit wordt vernieuwd zodra nieuwe matches binnenkomen." + no_ranked_matches_pre: "Geen beoordeelde wedstrijden voor het" + no_ranked_matches_post: " team! Speel tegen enkele tegenstanders en kom terug hier om uw spel te laten beoordelen." + choose_opponent: "Kies een tegenstander" + tutorial_play: "Speel de Tutorial" + tutorial_recommended: "Aanbevolen als je nog niet eerder hebt gespeeld" + tutorial_skip: "Sla Tutorial over" + tutorial_not_sure: "Niet zeker wat er aan de gang is?" + tutorial_play_first: "Speel eerst de Tutorial." + simple_ai: "Simpele AI" + warmup: "Opwarming" + vs: "tegen" diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee index ceea3a0ea..437e89e76 100644 --- a/app/locale/nn.coffee +++ b/app/locale/nn.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/no.coffee b/app/locale/no.coffee index 4dcd77714..9312bf07b 100644 --- a/app/locale/no.coffee +++ b/app/locale/no.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr campaign_player_created: "Spiller-Lagde" campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende Artisan Trollmenn." level_difficulty: "Vanskelighetsgrad: " +# play_as: "Play As " contact: contact_us: "Kontakt CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr wizard_tab: "Trollmann" password_tab: "Passord" emails_tab: "Epost" +# admin: "Admin" gravatar_select: "Velg hvilket Gravatar bilde du ønsker å bruke" gravatar_add_photos: "Legg til miniatyrbilder og bildertil en Gravatar konto for at du skal kunne velge et bilde for din epost." gravatar_add_more_photos: "Legg til flere bilder til din Gravatar konto for å kunne aksessere dem her." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr new_password_verify: "Verifiser" email_subscriptions: "Epost Abonnement" email_announcements: "Kunngjøringer" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Få epost om siste nytt og utvikling fra CodeCombat." contributor_emails: "Contributor Klasse Epost" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr victory_sign_up: "Tegn deg på for Oppdateringer" victory_sign_up_poke: "Vil du ha siste nytt på epost? Opprett en gratis konto, så vil vi holde deg oppdatert!" victory_rate_the_level: "Bedøm nivået: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spill Neste Nivå" victory_go_home: "Gå Hjem" victory_review: "Fortell oss mer!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr tome_available_spells: "Tilgjenglige Trylleformularer" hud_continue: "Fortsett (trykk shift-mellomrom)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "eller" email: "Epost" +# password: "Password" message: "Melding" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee index 826e5669c..86dd96046 100644 --- a/app/locale/pl.coffee +++ b/app/locale/pl.coffee @@ -1,20 +1,20 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish", translation: common: loading: "Ładowanie..." - saving: "Zapisuję..." + saving: "Zapisywanie..." sending: "Wysyłanie…" cancel: "Anuluj" -# save: "Save" + save: "Zapisz" delay_1_sec: "1 sekunda" - delay_3_sec: "3 sekunda" - delay_5_sec: "5 sekunda" + delay_3_sec: "3 sekundy" + delay_5_sec: "5 sekund" manual: "Ręcznie" -# fork: "Fork" + fork: "Fork" play: "Graj" modal: close: "Zamknij" - okay: "Ok" + okay: "OK" not_found: page_not_found: "Strona nie istnieje" @@ -27,131 +27,134 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish admin: "Admin" home: "Główna" contribute: "Współpraca" - legal: "Dewiza" + legal: "Nota prawna" about: "O nas" contact: "Kontakt" - twitter_follow: "Podążaj" -# employers: "Employers" + twitter_follow: "Subskrybuj" + employers: "Pracodawcy" -# versions: -# save_version_title: "Save New Version" -# new_major_version: "New Major Version" -# cla_prefix: "To save changes, first you must agree to our" -# cla_url: "CLA" -# cla_suffix: "." -# cla_agree: "I AGREE" + versions: + save_version_title: "Zapisz nową wersję" + new_major_version: "Nowa wersja główna" + cla_prefix: "Aby zapisać zmiany, musisz najpierw zaakceptować naszą" + cla_url: "umowę licencyjną dla współtwórców (CLA)" + cla_suffix: "." + cla_agree: "AKCEPTUJĘ" login: - sign_up: "Stwórz Konto" + sign_up: "Stwórz konto" log_in: "Zaloguj się" log_out: "Wyloguj się" recover: "odzyskaj konto" recover: - recover_account_title: "odzyskaj konto" -# send_password: "Send Recovery Password" + recover_account_title: "Odzyskaj konto" + send_password: "Wyślij hasło tymczasowe" signup: -# create_account_title: "Create Account to Save Progress" + create_account_title: "Stwórz konto, aby zapisać postępy" description: "Poświęć chwilę na bezpłatne założenie nowego konta." - email_announcements: "Odbieraj powiadomienia na email" - coppa: "13+ lub jesteś spoza USA" - coppa_why: "(Dlaczego?)" - creating: "Tworzenie konta" + email_announcements: "Otrzymuj powiadomienia na e-mail" + coppa: "Mam powyżej 13 lat lub jestem spoza USA " + coppa_why: "(dlaczego?)" + creating: "Tworzenie konta..." sign_up: "Zarejestruj" log_in: "zaloguj się używając hasła" home: - slogan: "Naucz się JavaScript grając." + slogan: "Naucz się JavaScript grając" no_ie: "CodeCombat nie działa na Internet Explorer 9 lub starszym. Przepraszamy!" - no_mobile: "CodeCombat nie został zaprojektowany dla użądzeń przenośnych, więc może nie działać!" + no_mobile: "CodeCombat nie został zaprojektowany dla użądzeń przenośnych więc może nie działać!" play: "Graj" play: choose_your_level: "Wybierz poziom" - adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów, lub omówić to na " + adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić to na " adventurer_forum: "forum podróżników" adventurer_suffix: "." campaign_beginner: "Kampania dla początkujących" - campaign_beginner_description: "... W której nauczysz się magii programowania" - campaign_dev: "Losowe Trudniejsze Poziomy" + campaign_beginner_description: "... w której nauczysz się magii programowania" + campaign_dev: "Losowe trudniejsze poziomy" campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego." - campaign_multiplayer: "Pola Walki Dla Wielu Graczy" - campaign_multiplayer_description: "W których ścierasz się z innymi graczami. " - campaign_player_created: "Stworzone Przez Graczy" + campaign_multiplayer: "Pola walki dla wielu graczy" + campaign_multiplayer_description: "... w których konkurujesz z innymi graczami." + campaign_player_created: "Stworzone przez graczy" campaign_player_created_description: "... w których walczysz przeciwko dziełom Czarodziejów Rękodzielnictwa" level_difficulty: "Poziom trudności: " + play_as: "Graj jako " contact: contact_us: "Kontakt z CodeCombat" - welcome: "Miło Cię widzieć! Użyj tego formularza żeby wysłać do nas wiadomość. " - contribute_prefix: "Jeśli jesteś zainteresowany wsparciem projektu, zapoznaj się z naszą" + welcome: "Miło Cię widzieć! Użyj tego formularza, żeby wysłać do nas wiadomość. " + contribute_prefix: "Jeśli jesteś zainteresowany wsparciem projektu, zapoznaj się z naszą " contribute_page: "stroną współpracy" contribute_suffix: "!" - forum_prefix: "W sprawach ogólnych skorzystaj z" + forum_prefix: "W sprawach ogólnych, skorzystaj z " forum_page: "naszego forum" forum_suffix: "." - send: "Wyślij Wiadomość" + send: "Wyślij wiadomość" diplomat_suggestion: title: "Pomóż w tłumaczeniu CodeCombat!" sub_heading: "Potrzebujemy twoich zdolności językowych." - pitch_body: "Tworzymy CodeCombat w języku angielskim, Jadnak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, i gry." + pitch_body: "Tworzymy CodeCombat w języku angielskim, jednak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, jak i samej gry." missing_translations: "Dopóki nie przetłumaczymy wszystkiego na polski, będziesz widział niektóre napisy w języku angielskim." - learn_more: "Dowiedz się więcej o Dyplomatach." - subscribe_as_diplomat: "Dołącz do dyplomatów" + learn_more: "Dowiedz się więcej o Dyplomatach" + subscribe_as_diplomat: "Dołącz do Dyplomatów" -# wizard_settings: -# title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" -# trim: "Trim" -# cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" -# hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + wizard_settings: + title: "Ustawienia czarodzieja" + customize_avatar: "Personalizuj swój awatar" + clothes: "Ubrania" + trim: "Dodatki" + cloud: "Chmura" + spell: "Zaklęcie" + boots: "Buty" + hue: "Odcień" + saturation: "Nasycenie" + lightness: "Jasność" account_settings: title: "Ustawienia Konta" - not_logged_in: "Zaloguj się lub stwórz konto by dostosować ustawienia." + not_logged_in: "Zaloguj się lub stwórz konto, by dostosować ustawienia." autosave: "Zmiany zapisują się automatycznie" me_tab: "Ja" picture_tab: "Zdjęcie" wizard_tab: "Czarodziej" password_tab: "Hasło" emails_tab: "Powiadomienia" + admin: "Administrator" gravatar_select: "Wybierz fotografię z Gravatar" - gravatar_add_photos: "Dodaj zdjęcia i miniatury do swojego konta Gravatar by móc wybrać zdjęcie." - gravatar_add_more_photos: "Dodaj więcej zdjęć do swojego konta Gravatar, by móc je użyć tutaj." + gravatar_add_photos: "Dodaj zdjęcia i miniatury do swojego konta Gravatar, by móc wybrać zdjęcie." + gravatar_add_more_photos: "Dodaj więcej zdjęć do swojego konta Gravatar, by móc ich użyć." wizard_color: "Kolor ubrań czarodzieja" new_password: "Nowe hasło" new_password_verify: "Zweryfikuj" email_subscriptions: "Powiadomienia email" email_announcements: "Ogłoszenia" -# email_notifications_description: "Get periodic notifications for your account." + email_notifications: "Powiadomienia" + email_notifications_description: "Otrzymuj okresowe powiadomienia dotyczące twojego konta." email_announcements_description: "Otrzymuj powiadomienia o najnowszych wiadomościach i zmianach w CodeCombat." contributor_emails: "Powiadomienia asystentów" - contribute_prefix: "Szukamy osób, które chciałyby do nas dołączyć! Sprawdź" - contribute_page: "stronę asystentów" - contribute_suffix: "aby dowiedzieć się więcej." + contribute_prefix: "Szukamy osób, które chciałyby do nas dołączyć! Sprawdź " + contribute_page: "stronę współpracy" + contribute_suffix: ", aby dowiedzieć się więcej." email_toggle: "Zmień wszystkie" error_saving: "Błąd zapisywania" saved: "Zmiany zapisane" - password_mismatch: "Nieprawidłowe hasło" + password_mismatch: "Hasła róznią się od siebie" account_profile: - edit_settings: "Edytuj Ustawienia" + edit_settings: "Edytuj ustawienia" profile_for_prefix: "Profil" -# profile_for_suffix: "" + profile_for_suffix: "" profile: "Profil" - user_not_found: "Nieznaleziono użytkownika. Sprawdź odnośnik URL?" + user_not_found: "Nie znaleziono użytkownika. Sprawdź odnośnik URL." gravatar_not_found_mine: "Nie udało nam się znaleźć profilu powiązanego z:" gravatar_not_found_email_suffix: "." - gravatar_signup_prefix: "Utwórz konto w" - gravatar_signup_suffix: "aby rozpocząć!" - gravatar_not_found_other: "Niestety nie ma profilu powiązanego z tym adresem email." + gravatar_signup_prefix: "Utwórz konto w " + gravatar_signup_suffix: ", aby rozpocząć!" + gravatar_not_found_other: "Niestety, nie ma profilu powiązanego z tym adresem email." gravatar_contact: "Kontakt" gravatar_websites: "Strony WWW" # gravatar_accounts: "As Seen On" @@ -161,298 +164,370 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish level_load_error: "Nie udało się wczytać poziomu: " done: "Zrobione" grid: "Siatka" - customize_wizard: "Spersonalizuj Czarodzieja" + customize_wizard: "Spersonalizuj czarodzieja" home: "Strona główna" guide: "Przewodnik" multiplayer: "Multiplayer" restart: "Zacznij od nowa" goals: "Cele" action_timeline: "Oś czasu" - click_to_select: "Kliknij jednostkę by ją zaznaczyć" + click_to_select: "Kliknij jednostkę, by ją zaznaczyć." reload_title: "Przywrócić cały kod?" reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?" reload_confirm: "Przywróć cały kod" -# victory_title_prefix: "" - victory_title_suffix: " Zakończony" - victory_sign_up: "Zapisz się by otrzymywać akutalności" - victory_sign_up_poke: "Chcesz otrzymywać najnowsze wiadomości na email? Załóź darmowe konto i będziemy w kontakcie." - victory_rate_the_level: "Oceń poziom" - victory_play_next_level: "Zagraj w następny poziom" + victory_title_prefix: "" + victory_title_suffix: " ukończony" + victory_sign_up: "Zapisz się, by zapisać postępy" + victory_sign_up_poke: "Chcesz zapisać swój kod? Utwórz bezpłatne konto!" + victory_rate_the_level: "Oceń poziom: " + victory_rank_my_game: "Oceń moją grę" + victory_ranking_game: "Wprowadzanie..." + victory_return_to_ladder: "Powrót do drabinki" + victory_play_next_level: "Przejdź na następny poziom" victory_go_home: "Powrót do strony głównej" victory_review: "Powiedz nam coś więcej!" victory_hour_of_code_done: "Skończyłeś już?" - victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodowania." - multiplayer_title: "Ustawienia Multiplayer" - multiplayer_link_description: "Przekaż ten link, jeśli chcesz by ktoś do Ciebie dołączył" + victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu." + multiplayer_title: "Ustawienia multiplayer" + multiplayer_link_description: "Przekaż ten link, jeśli chcesz, by ktoś do ciebie dołączył." multiplayer_hint_label: "Podpowiedź:" multiplayer_hint: "Klikjnij link by zaznaczyć wszystko, potem wciśnij Cmd-C lub Ctrl-C by skopiować ten link." - multiplayer_coming_soon: "Wkrótce więcej opcji Multiplayer" + multiplayer_coming_soon: "Wkrótce więcej opcji multiplayer" guide_title: "Przewodnik" - tome_minion_spells: "Czary Twojego podopiecznego" + tome_minion_spells: "Czary twojego podopiecznego" tome_read_only_spells: "Czary tylko do odczytu" tome_other_units: "Inne jednostki" tome_cast_button_castable: "Rzuć czar" tome_cast_button_casting: "Rzucam czar" tome_cast_button_cast: "Rzucenie czaru" tome_autocast_delay: "Opóźnienie automatycznego rzucania czaru" - tome_select_spell: "Wybierz Czar" - tome_select_a_thang: "Wybierz kogoś do" + tome_select_spell: "Wybierz czar" + tome_select_a_thang: "Wybierz kogoś do " tome_available_spells: "Dostępne czary" - hud_continue: "Kontynuuj (naciśnij enter)" -# spell_saved: "Spell Saved" + hud_continue: "Kontynuuj (Shift + spacja)" + spell_saved: "Czar zapisany" + skip_tutorial: "Pomiń (esc)" + editor_config: "Konfiguracja edytora" + editor_config_title: "Konfiguracja edytora" + editor_config_keybindings_label: "Przypisania klawiszy" + editor_config_keybindings_default: "Domyślny (Ace)" + editor_config_keybindings_description: "Dodaje skróty znane z popularnych edytorów." + editor_config_invisibles_label: "Pokaż białe znaki" + editor_config_invisibles_description: "Wyświetla białe znaki takie jak spacja czy tabulator." + editor_config_indentguides_label: "Pokaż linijki wcięć" + editor_config_indentguides_description: "Wyświetla pionowe linie, by lepiej zaznaczyć wcięcia." + editor_config_behaviors_label: "Inteligentne zachowania" + editor_config_behaviors_description: "Autouzupełnianie nawiasów, klamer i cudzysłowów." -# admin: -# av_title: "Admin Views" -# av_entities_sub_title: "Entities" -# av_entities_users_url: "Users" -# av_entities_active_instances_url: "Active Instances" -# av_other_sub_title: "Other" -# av_other_debug_base_url: "Base (for debugging base.jade)" -# u_title: "User List" -# lg_title: "Latest Games" + admin: + av_title: "Panel administracyjny" + av_entities_sub_title: "Podmioty" + av_entities_users_url: "Użytkownicy" + av_entities_active_instances_url: "Aktywne podmioty" + av_other_sub_title: "Inne" + av_other_debug_base_url: "Baza (do debuggingu base.jade)" + u_title: "Lista użytkowników" + lg_title: "Ostatnie gry" -# editor: -# main_title: "CodeCombat Editors" -# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" -# article_title: "Article Editor" -# article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns." -# thang_title: "Thang Editor" -# thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics." -# level_title: "Level Editor" -# level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!" -# security_notice: "Many major features in these editors are not currently enabled by default. As we improve the security of these systems, they will be made generally available. If you'd like to use these features sooner, " -# contact_us: "contact us!" -# hipchat_prefix: "You can also find us in our" -# hipchat_url: "HipChat room." -# level_some_options: "Some Options?" -# level_tab_thangs: "Thangs" -# level_tab_scripts: "Scripts" -# level_tab_settings: "Settings" -# level_tab_components: "Components" -# level_tab_systems: "Systems" -# level_tab_thangs_title: "Current Thangs" -# level_tab_thangs_conditions: "Starting Conditions" -# level_tab_thangs_add: "Add Thangs" -# level_settings_title: "Settings" -# level_component_tab_title: "Current Components" -# level_component_btn_new: "Create New Component" -# level_systems_tab_title: "Current Systems" -# level_systems_btn_new: "Create New System" -# level_systems_btn_add: "Add System" -# level_components_title: "Back to All Thangs" -# level_components_type: "Type" -# level_component_edit_title: "Edit Component" -# level_system_edit_title: "Edit System" -# create_system_title: "Create New System" -# new_component_title: "Create New Component" -# new_component_field_system: "System" + editor: + main_title: "Edytory CodeCombat" + main_description: "Stwórz własne poziomy, kampanie, jednostki i materiały edukacyjne. Zapewniamy wszystkie narzędzia, jakich będziesz potrzebował!" + article_title: "Edytor artykułów" + article_description: "Pisz artykuły, które dostarczą graczom wiedzy co do konceptów programistycznych, które będą mogli użyć w poziomach i kampaniach." + thang_title: "Edytor obiektów" + thang_description: "Twórz jednostki, definiuj ich domyślną logikę, grafiki i dźwięki. Aktualnie wspiera wyłącznie importowanie grafik wektorowych wyeksportowanych przez Flash." + level_title: "Edytor poziomów" + level_description: "Zawiera narzędzia do skryptowania, przesyłania dźwięków i konstruowania spersonalizowanych logik, by móc tworzyć najrozmaitsze poziomy. Wszystko to, czego sami używamy!" + security_notice: "Wiele ważnych fukncji nie jest obecnie domyślnie włączonych we wspomnianych edytorach. Wraz z ulepszeniem zabezpieczenia tych narzędzi, staną się one dostępne publicznie. Jeśli chciałbyś użyć ich już teraz, " + contact_us: "skontaktuj się z nami!" + hipchat_prefix: "Możesz nas też spotkać w naszym" + hipchat_url: "pokoju HipChat." + revert: "Przywróć" + revert_models: "Przywróć wersję" + level_some_options: "Trochę opcji?" + level_tab_thangs: "Obiekty" + level_tab_scripts: "Skrypty" + level_tab_settings: "Ustawienia" + level_tab_components: "Komponenty" + level_tab_systems: "Systemy" + level_tab_thangs_title: "Aktualne obiekty" + level_tab_thangs_conditions: "Warunki początkowe" + level_tab_thangs_add: "Dodoaj obiekty" + level_settings_title: "Ustawienia" + level_component_tab_title: "Aktualne komponenty" + level_component_btn_new: "Stwórz nowy komponent" + level_systems_tab_title: "Aktualne systemy" + level_systems_btn_new: "Stwórz nowy system" + level_systems_btn_add: "Dodaj system" + level_components_title: "Powrót do listy obiektów" + level_components_type: "Typ" + level_component_edit_title: "Edytuj komponent" + level_component_config_schema: "Schemat konfiguracji" + level_component_settings: "Ustawienia" + level_system_edit_title: "Edytuj system" + create_system_title: "Stwórz nowy system" + new_component_title: "Stwórz nowy komponent" + new_component_field_system: "System" + new_article_title: "Stwórz nowy artykuł" + new_thang_title: "Stwórz nowy typ obiektu" + new_level_title: "Stwórz nowy poziom" + article_search_title: "Przeszukaj artykuły" + thang_search_title: "Przeszukaj typy obiektów" + level_search_title: "Przeszukaj poziomy" -# article: -# edit_btn_preview: "Preview" -# edit_article_title: "Edit Article" + article: + edit_btn_preview: "Podgląd" + edit_article_title: "Edytuj artykuł" general: -# and: "and" - name: "Imie" -# body: "Body" -# version: "Version" -# commit_msg: "Commit Message" -# version_history_for: "Version History for: " -# results: "Results" -# description: "Description" + and: "i" + name: "Imię" + body: "Zawartość" + version: "Wersja" + commit_msg: "Wiadomość do commitu" + history: "Historia" + version_history_for: "Historia wersji dla: " + result: "Wynik" + results: "Wyniki" + description: "Opis" or: "lub" email: "Email" + password: "Hasło" message: "Wiadomość" + code: "Kod" + ladder: "Drabinka" + when: "kiedy" + opponent: "Przeciwnik" + rank: "Ranking" + score: "Wynik" + win: "Wygrana" + loss: "Przegrana" + tie: "Remis" + easy: "Łatwy" + medium: "Średni" + hard: "Trudny" -# about: -# who_is_codecombat: "Who is CodeCombat?" -# why_codecombat: "Why CodeCombat?" -# who_description_prefix: "together started CodeCombat in 2013. We also created " -# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." -# who_description_ending: "Now it's time to teach people to write code." -# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." -# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." -# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" -# why_paragraph_3_italic: "yay a badge" -# why_paragraph_3_center: "but fun like" -# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" -# why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." -# why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." -# why_ending: "And hey, it's free. " -# why_ending_url: "Start wizarding now!" -# george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere." -# scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one." -# nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." -# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." -# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." + about: + who_is_codecombat: "Czym jest CodeCombat?" + why_codecombat: "Dlaczego CodeCombat?" + who_description_prefix: "założyli CodeCombat w 2013 roku. Stworzyliśmy również " + who_description_suffix: "w roku 2008, doprowadzajac go do pierwszego miejsca wśród aplikacji do nauki zapisu chińskich i japońskich znaków zarówno wśród aplikacji internetowych, jak i aplikcji dla iOS." + who_description_ending: "Teraz nadszedł czas, by nauczyć ludzi programowania." + why_paragraph_1: "Podczas tworzenia Skrittera, George nie umiał programować i ciągle towarzyszyła mu frustracja - nie mógł zaimplementować swoich pomysłów. Próbował się uczyć, lecz lekcje były zbyt wolne. Jego współlokator, chcąc się przebranżowić, spróbował Codeacademy, lecz \"nudziło go to.\" Każdego tygodnia któryś z kolegów podchodził do Codeacadem, by wkrótce potem zrezygnować. Zdaliśmy sobie sprawę, że mamy do czynienia z tym samym problemem, który rozwiązaliśmy Skritterem: ludzie uczący się umiejętności poprzez powolne, ciężkie lekcje, podczas gdy potrzebują oni szybkiej, energicznej praktyki. Wiemy, jak to naprawić." + why_paragraph_2: "Chcesz nauczyć się programowania? Nie potrzeba ci lekcji. Potrzeba ci pisania dużej ilości kodu w sposób sprawiający ci przyjemność." + why_paragraph_3_prefix: "O to chodzi w programowaniu - musi sprawiać radość. Nie radość w stylu" + why_paragraph_3_italic: "hura, nowa odznaka" + why_paragraph_3_center: ", ale radości w stylu" + why_paragraph_3_italic_caps: "NIE MAMO, MUSZĘ DOKOŃCZYĆ TEN POZIOM!" + why_paragraph_3_suffix: "Dlatego właśnie CodeCombat to gra multiplayer, a nie kurs oparty na zgamifikowanych lekcjach. Nie przestaniemy, dopóki ty nie będziesz mógł przestać--tym razem jednak w pozytywnym sensie." + why_paragraph_4: "Jeśli planujesz uzależnić się od jakiejś gry, uzależnij się od tej i zostań jednym z czarodziejów czasu technologii." + why_ending: "Poza tym, to nic nie kosztuje. " + why_ending_url: "Zostań czarodziejem już teraz!" + george_description: "CEO, człowiek od biznesu, web designer, game designer, i mistrz wszystkich początkujących programistów." + scott_description: "Programista niezwykły, software architect, czarodziej kuchenny i mistrz finansów. Scott to ten rozsądny." + nick_description: "Programistyczny czarownik, ekscentryczny magik i eksperymentator pełną gębą. Nich może robić cokolwiek, a decyduje się pracować przy CodeCombat." + jeremy_description: "Magik od kontaktów z klientami, tester użyteczności i organizator społeczności; prawdopodobnie już rozmawiałeś z Jeremym." + michael_description: "Programista, sys-admin, cudowne dziecko studiów technicznych, Michael to osoba utrzymująca nase serwery online." -# legal: -# page_title: "Legal" -# opensource_intro: "CodeCombat is free to play and completely open source." -# opensource_description_prefix: "Check out " -# github_url: "our GitHub" -# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " -# archmage_wiki_url: "our Archmage wiki" -# opensource_description_suffix: "for a list of the software that makes this game possible." -# practices_title: "Respectful Best Practices" -# practices_description: "These are our promises to you, the player, in slightly less legalese." -# privacy_title: "Privacy" -# privacy_description: "We will not sell any of your personal information. We intend to make money through recruitment eventually, but rest assured we will not distribute your personal information to interested companies without your explicit consent." -# security_title: "Security" -# security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems." -# email_title: "Email" -# email_description_prefix: "We will not inundate you with spam. Through" -# email_settings_url: "your email settings" -# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." -# cost_title: "Cost" -# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" -# recruitment_title: "Recruitment" -# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizard–not just in the game, but also in real life." -# url_hire_programmers: "No one can hire programmers fast enough" -# recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you" -# recruitment_description_italic: "a lot" -# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan." -# copyrights_title: "Copyrights and Licenses" -# contributor_title: "Contributor License Agreement" -# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" -# cla_url: "CLA" -# contributor_description_suffix: "to which you should agree before contributing." -# code_title: "Code - MIT" -# code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the" + legal: + page_title: "Nota prawna" + opensource_intro: "CodeCombat jest całkowicie darmowe i całkowicie open source." + opensource_description_prefix: "Zajrzyj na " + github_url: "nasz GitHub" + opensource_description_center: "i pomóż, jeśli tylko masz ochotę! CodeCombat bazuje na dziesiątkach projektów open source - kochamy je wszystkie. Wpadnij na " + archmage_wiki_url: "naszą wiki dla Arcymagów" + opensource_description_suffix: ", by zobaczyć listę oprogramowania, dzięki któremu niniejsza gra może istnieć." + practices_title: "Ludzkim językiem" + practices_description: "Oto nasze obietnice wobec ciebie, gracza, wyrażone po polsku, bez prawniczego żargonu." + privacy_title: "Prywatność" + privacy_description: "Nie będziemy sprzedawać żadnych z twoich prywatnych informacji. Planujemy w pewnym momencie zarobić trochę pieniędzy dzięki rekrutacjom, ale możesz spać spokojnie - nie będziemy rozpowszechniać twoich osobistych informacji zainteresowanym firmom bez twojej jednoznacznej zgody." + security_title: "Bezpieczeństwo" + security_description: "Z całych sił staramy się zabezpieczyć twoje prywatne informacje. Jako że jesteśmy projektem open source, każdy może sprawdzić i ulepszyć nasz system zabezpieczeń." + email_title: "E-mail" + email_description_prefix: "Nie będziemy nękać cię spamem. Poprzez" + email_settings_url: "twoje ustawienia e-mail" + email_description_suffix: "lub poprzez linki w e-mailach, które wysyłamy, możesz zmienić swoje ustawienia i w prosty sposób wypisać się z subskrypcji w dowolnym momencie." + cost_title: "Koszty" + cost_description: "W tym momencie CodeCombat jest w stu procentach darmowe! Jednym z naszych głównych celów jest, by utrzymac taki stan rzeczy, aby jak najwięcej ludzi miało dostęp do gry, bez względu na ich zasobnośc. Jeśli nadejdą gorsze dni, dopuszczamy możliwość wprowadzenia płatnych subskrypcji lub pobierania opłat za część zawartości, ale wolelibyśmy, by tak się nie stało. Przy odrobinie szczęścia, uda nam się podtrzymać obecną sytuację dzięki:" + recruitment_title: "Rekrutacji" + recruitment_description_prefix: "Dzięki CodeCombat, staniesz się potężnym czarodziejem - nie tylko w grze, ale również w prawdziwym życiu." + url_hire_programmers: "Firmy nie nadążają z zatrudnianiem programistów" + recruitment_description_suffix: "więc kiedy tylko odpowiednio się wyszkolisz i wyrazisz zgodę, zaprezentujemy twoje programistyczne dokonania tysiącom pracodawców tylko czekających, by dać ci pracę. Oni płacą nam trochę, tobie" + recruitment_description_italic: "dużo" + recruitment_description_ending: "strona pozostaje darmowa i wszyscy są szczęśliwi. Tak wygląda plan." + copyrights_title: "Prawa autorskie i licencje" + contributor_title: "Umowa licencyjna dla współtwórców (CLA)" + contributor_description_prefix: "Wszyscy współtwórcy, zarówno ci ze strony jak i ci z GitHuba, podlegają naszemu" + cla_url: "CLA" + contributor_description_suffix: ", na które powinieneś wyrazić zgodę przed dodaniem swojego wkładu." + code_title: "Kod - MIT" + code_description_prefix: "Całość kodu posiadanego przez CodeCombat lub hostowanego na codecombat.com, zarówno w repozytorium GitHub, jak i bazie codecombat.com, podlega licencji" # mit_license_url: "MIT license" -# code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels." -# art_title: "Art/Music - Creative Commons " -# art_description_prefix: "All common content is available under the" + code_description_suffix: "Zawiera się w tym całość kodu w systemach i komponentach, które są udostępnione przez CodeCombat w celu tworzenia poziomów." + art_title: "Grafika/muzyka - Creative Commons " + art_description_prefix: "Całość ogólnej treści dostępna jest pod licencją" # cc_license_url: "Creative Commons Attribution 4.0 International License" -# art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:" -# art_music: "Music" -# art_sound: "Sound" -# art_artwork: "Artwork" -# art_sprites: "Sprites" -# art_other: "Any and all other non-code creative works that are made available when creating Levels." -# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." -# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" -# use_list_1: "If used in a movie or another game, include codecombat.com in the credits." -# use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution." -# art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any." -# rights_title: "Rights Reserved" -# rights_desc: "All rights are reserved for Levels themselves. This includes" -# rights_scripts: "Scripts" -# rights_unit: "Unit configuration" -# rights_description: "Description" -# rights_writings: "Writings" -# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." -# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." -# nutshell_title: "In a Nutshell" -# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." -# canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence." + art_description_suffix: "Zawartość ogólna to wszystko, co zostało publicznie udostępnione przez CodeCombat w celu tworzenia poziomów. Wchodzą w to:" + art_music: "Muzyka" + art_sound: "Dźwięki" + art_artwork: "Artworki" + art_sprites: "Sprite'y" + art_other: "Dowolne inne prace niezwiązane z kodem, które są dostępne podczas tworzenia poziomów." + art_access: "Obecnie nie ma uniwersalnego, prostego sposobu, by pozyskać te zasoby. Możesz wejść w ich posiadanie poprzez URL-e, z których korzysta strona, skontaktować się z nami w celu uzyskania pomocy bądź pomóc nam w ulepszeniu strony, aby zasoby te stały się łatwiej dostępne." + art_paragraph_1: "W celu uznania autorstwa, wymień z nazwy i podaj link do codecombat.com w pobliżu miejsca, gdzie znajduje się użyty zasób bądź w miejscu odpowiednim dla twojego medium. Na przykład:" + use_list_1: "W przypadku użycia w filmie lub innej grze, zawrzyj codecombat.com w napisach końcowych." + use_list_2: "W przypadku użycia na stronie internetowej, zawrzyj link w pobliżu miejsca użycia, na przykład po obrazkiem lub na ogólnej stronie poświęconej uznaniu twórców, gdzie możesz również wspomnieć o innych pracach licencjonowanych przy użyciu Creative Commons oraz oprogramowaniu open source używanym na stronie. Coś, co samo w sobie jednoznacznie odnosi się do CodeCombat, na przykład wpis na blogu dotyczący CodeCombat, nie wymaga już dodatkowego uznania autorstwa." + art_paragraph_2: "Jeśli użyte przez ciebie zasoby zostały stworzone nie przez CodeCombat, ale jednego z naszych użytkowników, uznanie autorstwa należy się jemu - postępuj wówczas zgodnie z zasadami uznania autorstwa dostarczonymi wraz z rzeczonym zasobem (o ile takowe występują)." + rights_title: "Prawa zastrzeżone" + rights_desc: "Wszelkie prawa są zastrzeżone dla poziomów jako takich. Zawierają się w tym:" + rights_scripts: "Skrypty" + rights_unit: "Konfiguracje jednostek" + rights_description: "Opisy" + rights_writings: "Teksty" + rights_media: "Multimedia (dźwięki, muzyka) i jakiekolwiek inne typy prac i zasobów stworzonych specjalnie dla danego poziomu, które nie zostały publicznie udostępnione do tworzenia poziomów." + rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie." + nutshell_title: "W skrócie" + nutshell_description: "Wszelkie zasoby, które dostarczamy w Edytorze Poziomów są darmowe w użyciu w jakikolwiek sposób w celu tworzenia poziomów. Jednocześnie, zastrzegamy sobie prawo do ograniczenia rozpowszechniania poziomów (stworzonych przez codecombat.com) jako takich, aby mogła być za nie w przyszłości pobierana opłata, jeśli dojdzie do takiej konieczności." + canonical: "Angielska wersja tego dokumentu jest ostateczna, kanoniczną wersją. Jeśli zachodzą jakieś rozbieżności pomiędzy tłumaczeniami, dokument anglojęzyczny ma pierwszeństwo." -# contribute: -# page_title: "Contributing" -# character_classes_title: "Character Classes" -# introduction_desc_intro: "We have high hopes for CodeCombat." -# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, " -# introduction_desc_github_url: "CodeCombat is totally open source" -# introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours." -# introduction_desc_ending: "We hope you'll join our party!" -# introduction_desc_signature: "- Nick, George, Scott, Michael, and Jeremy" -# alert_account_message_intro: "Hey there!" -# alert_account_message_pref: "To subscribe for class emails, you'll need to " -# alert_account_message_suf: "first." -# alert_account_message_create_url: "create an account" -# archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever." -# archmage_introduction: "One of the best parts about building games is they synthesize so many different things. Graphics, sound, real-time networking, social networking, and of course many of the more common aspects of programming, from low-level database management, and server administration to user facing design and interface building. There's a lot to do, and if you're an experienced programmer with a hankering to really dive into the nitty-gritty of CodeCombat, this class might be for you. We would love to have your help building the best programming game ever." -# class_attributes: "Class Attributes" -# archmage_attribute_1_pref: "Knowledge in " -# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." -# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." -# how_to_join: "How To Join" -# join_desc_1: "Anyone can help out! Just check out our " -# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " -# join_desc_3: ", or find us in our " -# join_desc_4: "and we'll go from there!" -# join_url_email: "Email us" -# join_url_hipchat: "public HipChat room" -# more_about_archmage: "Learn More About Becoming an Archmage" -# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements." -# artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to" -# artisan_summary_suf: "then this class is for you." -# artisan_introduction_pref: "We must construct additional levels! People be clamoring for more content, and we can only build so many ourselves. Right now your workstation is level one; our level editor is barely usable even by its creators, so be wary. If you have visions of campaigns spanning for-loops to" -# artisan_introduction_suf: "then this class might be for you." -# artisan_attribute_1: "Any experience in building content like this would be nice, such as using Blizzard's level editors. But not required!" -# artisan_attribute_2: "A hankering to do a whole lot of testing and iteration. To make good levels, you need to take it to others and watch them play it, and be prepared to find a lot of things to fix." -# artisan_attribute_3: "For the time being, endurance en par with an Adventurer. Our Level Editor is super preliminary and frustrating to use. You have been warned!" -# artisan_join_desc: "Use the Level Editor in these steps, give or take:" -# artisan_join_step1: "Read the documentation." -# artisan_join_step2: "Create a new level and explore existing levels." -# artisan_join_step3: "Find us in our public HipChat room for help." -# artisan_join_step4: "Post your levels on the forum for feedback." -# more_about_artisan: "Learn More About Becoming an Artisan" -# artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." -# adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." -# adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." -# adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." -# adventurer_join_pref: "Either get together with (or recruit!) an Artisan and work with them, or check the box below to receive emails when there are new levels to test. We'll also be posting about levels to review on our networks like" -# adventurer_forum_url: "our forum" -# adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" -# more_about_adventurer: "Learn More About Becoming an Adventurer" -# adventurer_subscribe_desc: "Get emails when there are new levels to test." -# scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." -# scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " -# scribe_introduction_url_mozilla: "Mozilla Developer Network" -# scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." -# scribe_attribute_1: "Skill in words is pretty much all you need. Not only grammar and spelling, but able to convey complicated ideas to others." -# contact_us_url: "Contact us" -# scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!" -# more_about_scribe: "Learn More About Becoming a Scribe" -# scribe_subscribe_desc: "Get emails about article writing announcements." -# diplomat_summary: "There is a large interest in CodeCombat in other countries that do not speak English! We are looking for translators who are willing to spend their time translating the site's corpus of words so that CodeCombat is accessible across the world as soon as possible. If you'd like to help getting CodeCombat international, then this class is for you." -# diplomat_introduction_pref: "So, if there's one thing we learned from the " -# diplomat_launch_url: "launch in October" -# diplomat_introduction_suf: "it's that there is sizeable interest in CodeCombat in other countries! We're building a corps of translators eager to turn one set of words into another set of words to get CodeCombat as accessible across the world as possible. If you like getting sneak peeks at upcoming content and getting these levels to your fellow nationals ASAP, then this class might be for you." -# diplomat_attribute_1: "Fluency in English and the language you would like to translate to. When conveying complicated ideas, it's important to have a strong grasp in both!" -# diplomat_join_pref_github: "Find your language locale file " -# diplomat_github_url: "on GitHub" -# diplomat_join_suf_github: ", edit it online, and submit a pull request. Also, check this box below to keep up-to-date on new internationalization developments!" -# more_about_diplomat: "Learn More About Becoming a Diplomat" -# diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." -# ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you." -# ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." -# ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" -# ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" -# ambassador_join_note_strong: "Note" -# ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" -# more_about_ambassador: "Learn More About Becoming an Ambassador" -# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." -# counselor_summary: "None of the above roles fit what you are interested in? Do not worry, we are on the lookout for anybody who wants a hand in the development of CodeCombat! If you are interested in teaching, game development, open source management, or anything else that you think will be relevant to us, then this class is for you." -# counselor_introduction_1: "Do you have life experience? A different perspective on things that can help us decide how to shape CodeCombat? Of all these roles, this will probably take the least time, but individually you may make the most difference. We're on the lookout for wisened sages, particularly in areas like: teaching, game development, open source project management, technical recruiting, entrepreneurship, or design." -# counselor_introduction_2: "Or really anything that is relevant to the development of CodeCombat. If you have knowledge and want to share it to help grow this project, then this class might be for you." -# counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful." -# counselor_attribute_2: "A little bit of free time!" -# counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)." -# more_about_counselor: "Learn More About Becoming a Counselor" -# changes_auto_save: "Changes are saved automatically when you toggle checkboxes." -# diligent_scribes: "Our Diligent Scribes:" -# powerful_archmages: "Our Powerful Archmages:" -# creative_artisans: "Our Creative Artisans:" -# brave_adventurers: "Our Brave Adventurers:" -# translating_diplomats: "Our Translating Diplomats:" -# helpful_ambassadors: "Our Helpful Ambassadors:" + contribute: + page_title: "Współpraca" + character_classes_title: "Klasy postaci" + introduction_desc_intro: "Pokładamy w CodeCombat duże nadzieje." + introduction_desc_pref: "Chcemy być miejscem, w którym programiści wszelkiej maści wspólnie uczą się i bawią, zapoznają innych ze wspaniałym światem programowania i odzwierciedlają najlepsze elementy społeczności. Nie możemy, ani nie chcemy, robić tego samodzielnie; to, co czyni projekty takie jak GitHub, Stack Overflow czy Linux wielkimi to ludzie, którzy ich używają i tworzą opierając się na nich. W związku z tym, " + introduction_desc_github_url: "CodeCombat jest całkowicie open source" + introduction_desc_suf: " i zamierzamy zapewnić tak wiele sposobów na współpracę w projekcie jak to tylko możliwe, by był on tak samo nasz, jak i wasz." + introduction_desc_ending: "Liczymy, że dołączysz się do nas!" + introduction_desc_signature: "- Nick, George, Scott, Michael i Jeremy" + alert_account_message_intro: "Hej tam!" + alert_account_message_pref: "Aby zapisać się do naszego e-maila klasowego, musisz najpierw " + alert_account_message_suf: "." + alert_account_message_create_url: "założyć konto" + archmage_summary: "Zainteresowany pracą przy grafice, interfejsie użytkownika, organizacji bazy danych oraz serwera, łączności multiplayer, fizyce, dźwięku lub wydajności silnika gry? Chciałbyś dołączyć się do budowania gry, która pomoże innym nauczyć się umiejętności, które sam posiadasz? Mamy wiele do zrobienia i jeśli jesteś doświadczonym programistą chcącym pomóc w rozwoju CodeCombat, ta klasa jest dla ciebie. Twoja pomoc przy budowaniu najlepszej gry programistycznej w historii będzie nieoceniona." + archmage_introduction: "Jedną z najlepszych rzeczy w tworzeniu gier jest to, że syntetyzują one tak wiele różnych spraw. Grafika, dźwięk, łączność w czasie rzeczywistym, social networking i oczywiście wiele innych, bardziej popularnych, aspektów programowania, od niskopoziomowego zarządzania bazami danych i administracji serwerem do interfejsu użytkownika i jego tworzenia. Jest wiele do zrobienia i jeśli jesteś doświadczonym programistą z zacięciem, by zajrzeć do sedna CodeCombat, ta klasa może być dla ciebie. Bylibyśmy niezmiernie szczęśliwi mając twoją pomoc przy budowaniu najlepszej programistycznej gry wszech czasów." + class_attributes: "Atrybuty klasowe" + archmage_attribute_1_pref: "Znajomość " + archmage_attribute_1_suf: " lub chęć do nauki. Większość naszego kodu napisana jest w tym języku. Jeśli jesteś fanem Ruby czy Pythona, poczujesz się jak w domu. To po prostu JavaScript, tyle że z przyjemniejszą składnią." + archmage_attribute_2: "Pewne doświadczenie w programowaniu i własna inicjatywa. Pomożemy ci się połapać, ale nie możemy spędzić zbyt dużo czasu na szkoleniu cię." + how_to_join: "Jak dołączyć" + join_desc_1: "Każdy może pomóc! Zerknij po prostu na nasz " + join_desc_2: ", aby rozpocząć i zaznacz kratkę poniżej, aby określić sie jako mężny Arcymag oraz otrzymywać najświeższe wiadomości przez e-mail. Chcesz porozmawiać na temat tego, co robić lub w jaki sposób dołączyć do współpracy jeszcze wyraźniej? " + join_desc_3: " lub zajrzyj do naszego " + join_desc_4: ", a dowiesz się wszystkiego!" + join_url_email: "Napisz do nas" + join_url_hipchat: "publicznego pokoju HipChat" + more_about_archmage: "Dowiedz się więcej o stawaniu się Arcymagiem" + archmage_subscribe_desc: "Otrzymuj e-maile dotyczące nowych okazji programistycznych oraz ogłoszeń." + artisan_summary_pref: "Chcesz projektować poziomy i rozwijać arsenał CodeCombat? Ludzie grają w dostarczane przez nas zasoby szybciej, niż potrafimy je tworzyć! Obecnie, nasz edytor jest dosyć niemrawy więc czuj się ostrzeżony - tworzenie poziomów przy jego pomocy może być trochę wymagające i zbugowane. Jeśli masz wizję nowych kampanii, od pętli typu for do" + artisan_summary_suf: ", ta klasa jest dla ciebie." + artisan_introduction_pref: "Musimy stworzyć dodatkowe poziomy! Ludzie będą oczekiwać nowych zasobów, a my mamy ograniczone możliwości co do naszych mocy przerobowych. Obecnie, twoja stacja robocza jest na poziomie pierwszym; nasz edytor poziomów jest ledwo używalny nawet przez jego twórców - bądź tego świadom. Jeśli masz wizję nowych kampanii, od pętli typu for do" + artisan_introduction_suf: ", ta klasa może być dla ciebie." + artisan_attribute_1: "Jakiekolwiek doświadczenie w tworzeniu zasobów tego typu byłoby przydatne, na przykład używając edytora poziomów dostarczonego przez Blizzard. Nie jest to jednak wymagane." + artisan_attribute_2: "Zacięcie do całej masy testowania i iteracji. Aby tworzyć dobre poziomy, musisz dostarczyć je innym i obserwować jak grają oraz być przygotowanym na wprowadzanie mnóstwa poprawek." + artisan_attribute_3: "Na dzień dzisiejszy, cierpliwość wraz z naszym Podróżnikiem. Nasz Edytor Poziomów jest jest strasznie prymitywny i frustrujący w użyciu. Zostałeś ostrzeżony!" + artisan_join_desc: "Używaj Edytora Poziomów mniej-więcej zgodnie z poniższymi krokami:" + artisan_join_step1: "Przeczytaj dokumentację." + artisan_join_step2: "Stwórz nowy poziom i przejrzyj istniejące poziomy." + artisan_join_step3: "Zajrzyj do naszego publicznego pokoju HipChat, aby uzyskać pomoc." + artisan_join_step4: "Pokaż swoje poziomy na forum, aby uzyskać opinie." + more_about_artisan: "Dwiedz się więcej na temat stawania się Rzemieślnikiem" + artisan_subscribe_desc: "Otrzymuj e-maile dotyczące aktualności w tworzeniu poziomów i ogłoszeń." + adventurer_summary: "Bądźmy szczerzy co do twojej roli: jesteś tankiem. Będziesz przyjmował ciężkie obrażenia. Potrzebujemy ludzi do testowania nowych poziomów i pomocy w rozpoznawaniu ulepszeń, które będzie można do nich zastosować. Będzie to bolesny proces; tworzenie dobrych gier to długi proces i nikt nie trafia w dziesiątkę za pierwszym razem. Jeśli jesteś wytrzymały i masz wysoki wskaźnik constitution (D&D), ta klasa jest dla ciebie." + adventurer_introduction: "Bądźmy szczerzy co do twojej roli: jesteś tankiem. Będziesz przyjmował ciężkie obrażenia. Potrzebujemy ludzi do testowania nowych poziomów i pomocy w rozpoznawaniu ulepszeń, które będzie można do nich zastosować. Będzie to bolesny proces; tworzenie dobrych gier to długi proces i nikt nie trafia w dziesiątkę za pierwszym razem. Jeśli jesteś wytrzymały i masz wysoki wskaźnik constitution (D&D), ta klasa jest dla ciebie." + adventurer_attribute_1: "Głód wiedzy. Chcesz nauczyć się programować, a my chcemy ci to umożliwić. Prawdopodobnie w tym przypadku, to ty będziesz jednak przez wiele czasu stroną uczącą." + adventurer_attribute_2: "Charyzma. Bądź uprzejmy, ale wyraźnie określaj, co wymaga poprawy, oferując sugestie co do sposobu jej uzyskania." + adventurer_join_pref: "Zapoznaj się z Rzemieślnikiem (lub rekrutuj go!), aby wspólnie pracować lub też zaznacz kratkę poniżej, aby otrzymywać e-maile, kiedy pojawią się nowe poziomy do testowania. Będziemy również pisać o poziomach do sprawdzenia na naszych stronach w sieciach społecznościowych jak" + adventurer_forum_url: "nasze forum" + adventurer_join_suf: "więc jeśli wolałbyś być informowany w ten sposób, zarejestruj się na nich!" + more_about_adventurer: "Dowiedz się więcej o stawaniu się Podróżnikiem" + adventurer_subscribe_desc: "Otrzymuj e-maile, gdy pojawią się nowe poziomy do tesotwania." + scribe_summary_pref: "Codecombat nie będzie tylko zbieraniną poziomów. Będzie też źródłem wiedzy programistycznej, na której gracze będą mogli sie opierać. Dzięki temu, każdy z Rzemieślników będzie mógł podać link do szczegółowego artykułu, który pomoże graczowi: dokumentacji w stylu " + scribe_summary_suf: ". Jeśli lubisz wyjaśniać idee programistyczne, ta klasa jest dla ciebie." + scribe_introduction_pref: "CodeCombat nie będzie tylko zbieraniną poziomów. Będzie też zawierać źródło wiedzy, wiki programistycznych idei, na której będzie można oprzeć poziomy. Dzięki temu, każdy z Rzemieślników zamiast opisywać ze szczegółami, czym jest operator porónania, będzie mógł po prostu podać graczowi w swoim poziomie link do artykułu opisującego go. Mamy na myśli coś podobnego do " + scribe_introduction_url_mozilla: "Mozilla Developer Network" + scribe_introduction_suf: ". Jeśli twoją definicją zabawy jest artykułowanie idei programistycznych przy pomocy składni Markdown, ta klasa może być dla ciebie." + scribe_attribute_1: "Umiejętne posługiwanie się słowem to właściwie wszystko, czego potrzebujesz. Nie tylko gramatyka i ortografia, ale również umiejętnośc tłumaczenia trudnego materiału innym." + contact_us_url: "Skontaktuj się z nami" + scribe_join_description: "powiedz nam coś o sobie, swoim doświadczeniu w programowaniu i rzeczach, o których chciałbyś pisać, a chętnie to z tobą uzgodnimy!" + more_about_scribe: "Dowiedz się więcej o stawaniu się Skrybą" + scribe_subscribe_desc: "Otrzymuj e-maile na temat ogłoszeń dotyczących pisania artykułów." + diplomat_summary: "W krajach nieanglojęzycznych istnieje wielkie zainteresowanie CodeCombat! Szukamy tłumaczy chętnych do poświęcenia swojego czasu na tłumaczenie treści strony, aby CodeCombat było dostępne dla całego świata tak szybko, jak to tylko możliwe. Jeśli chcesz pomóc w sprawieniu, by CodeCombat było prawdziwie międzynarodowe, ta klasa jest dla ciebie." + diplomat_introduction_pref: "Jeśli dowiedzieliśmy jednej rzeczy z naszego " + diplomat_launch_url: "otwarcia w październiku" + diplomat_introduction_suf: ", to jest nią informacja o znacznym zainteresowaniu CodeCombat w innych krajach. Tworzymy zespół tłumaczy chętnych do przemieniania zestawów słów w inne zestawy słów, aby CodeCombat było tak dostępne dla całego świata, jak to tylko możliwe. Jeśli chciabyś mieć wgląd w nadchodzącą zawartość i umożliwić swoim krajanom granie w najnowsze poziomy, ta klasa może być dla ciebie." + diplomat_attribute_1: "Biegła znajomość angielskiego oraz języka, na który chciałbyś tłumaczyć. Kiedy przekazujesz skomplikowane idee, dobrze mieć płynność w obu z nich!" + diplomat_join_pref_github: "Znajdź plik lokalizacyjny dla wybranego języka " + diplomat_github_url: "na GitHubie" + diplomat_join_suf_github: ", edytuj go online i wyślij pull request. Do tego, zaznacz kratkę poniżej, aby być na bieżąco z naszym międzynarodowym rozwojem!" + more_about_diplomat: "Dowiedz się więcej o stawaniu się Dyplomatą" + diplomat_subscribe_desc: "Otrzymuj e-maile na temat postępów i18n i poziomów do tłumaczenia." + ambassador_summary: "Staramy się zbudować społeczność, a każda społeczność potrzebuje zespołu wsparcia, kiedy pojawią się kłopoty. Mamy czaty, e-maile i strony w sieciach społecznościowych, aby nasi użytkownicy mogli zapoznać się z grą. Jeśli chcesz pomóc ludziom w tym, jak do nas dołączyć, dobrze się bawić, a do tego poznać tajniki programowania, ta klasa jest dla ciebie." + ambassador_introduction: "Oto społeczność, którą budujemy, a ty jesteś jej łącznikiem. Mamy czaty, e-maile i strony w sieciach społecznościowych oraz wielu ludzi potrzebujących pomocy w zapoznaniu się z grą oraz uczeniu się za jej pomocą. Jeśli chcesz pomóc ludziom, by do nas dołączyli i dobrze się bawili oraz mieć pełne poczucie tętna CodeCombat oraz kierunku, w którym zmierzamy, ta klasa może być dla ciebie." + ambassador_attribute_1: "Umiejętność komunikacji. Musisz umieć rozpoznać problemy, które mają gracze i pomóc im je rozwiązać. Do tego, informuj resztę z nas, co mówią gracze - na co się skarżą, a czego chcą jeszcze więcej!" + ambassador_join_desc: "powiedz nam coś o sobie, jakie masz doświadczenie i czym byłbyś zainteresowany. Chętnie z tobą porozmawiamy!" + ambassador_join_note_strong: "Uwaga" + ambassador_join_note_desc: "Jednym z naszych priorytetów jest zbudowanie trybu multiplayer, gdzie gracze mający problem z rozwiązywaniem poziomów będą mogli wezwać czarodziejów wyższego poziomu, by im pomogli. Będzie to świetna okazja dla Ambasadorów. Spodziewajcie się ogłoszenia w tej sprawie!" + more_about_ambassador: "Dowiedz się więcej o stawaniu się Ambasadorem" + ambassador_subscribe_desc: "Otrzymuj e-maile dotyczące aktualizacji wsparcia oraz rozwoju trybu multiplayer." + counselor_summary: "Żadna z powyższych ról nie pokrywa się z twoimi zainteresowaniami? Nie przejmuj się, poszukujemy każdego, kto chciałby dołożyć się rozwoju CodeCombat! Jeśli jestes zainteresowany nauczaniem, tworzeniem gier, zarządzaniem projektami open source lub czymkolwiek innym, co, twoim zdaniem, jest dla nas ważne, ta klasa jest dla ciebie." + counselor_introduction_1: "Masz doświadczenie życiowe? Inną perspektywę, która pomoże nam zdecydować, jak formować CodeCombat? Ze wszystkich wspomnianych ról, ta jest prawdopodobnie najmniej czasochłonna, ale na poziomie osobistym, to ty możesz być przyczynkiem do największych zmian. Poszukujemy oświeconych mędrców, głównie w obszarach takich jak: nauczanie, tworzenie gier, zarządzanie projektem open source, rekrutacje w sektorze technicznym, przedsiębiorczość oraz projektowanie." + counselor_introduction_2: "Lub cokolwiek, co jest związane z rozwojem CodeCombat. Jeśli masz wiedzę i chciałbyś się nią podzielić, by pomóc temu projektowi dojrzeć, ta klasa może być dla ciebie." + counselor_attribute_1: "Doświadczenie, w którymkolwiek z powyższych obszarów lub czymś, co uważasz za pomocne." + counselor_attribute_2: "Trochę wolnego czasu" + counselor_join_desc: "powiedz nam coś o sobie, o tym, czego dokonałeś i jak chciałbyś nam pomóc. Dodamy cię do naszej listy kontaktów i damy ci znać, kiedy będziemy potrzebować twojej pomocy (nie za często)." + more_about_counselor: "Dowiedz się więcej o stawaniu się Opiekunem" + changes_auto_save: "Zmiany zapisują się automatycznie po kliknięci kratki." + diligent_scribes: "Nasi pilni Skrybowie:" + powerful_archmages: "Nasi potężni Arcymagowie:" + creative_artisans: "Nasi kreatywni Rzemieślnicy:" + brave_adventurers: "Nasi dzielni Podróżnicy:" + translating_diplomats: "Nasi tłumaczący Dyplomaci:" + helpful_ambassadors: "Nasi pomocni Ambasadorzy:" -# classes: -# archmage_title: "Archmage" -# archmage_title_description: "(Coder)" -# artisan_title: "Artisan" -# artisan_title_description: "(Level Builder)" -# adventurer_title: "Adventurer" -# adventurer_title_description: "(Level Playtester)" -# scribe_title: "Scribe" -# scribe_title_description: "(Article Editor)" -# diplomat_title: "Diplomat" -# diplomat_title_description: "(Translator)" -# ambassador_title: "Ambassador" -# ambassador_title_description: "(Support)" -# counselor_title: "Counselor" -# counselor_title_description: "(Expert/Teacher)" + classes: + archmage_title: "Arcymag" + archmage_title_description: "(programista)" + artisan_title: "Rzemieślnik" + artisan_title_description: "(twórca poziomów)" + adventurer_title: "Podróżnik" + adventurer_title_description: "(playtester)" + scribe_title: "Skryba" + scribe_title_description: "(twórca artykułów)" + diplomat_title: "Dyplomata" + diplomat_title_description: "(tłumacz)" + ambassador_title: "Ambasador" + ambassador_title_description: "(wsparcie)" + counselor_title: "Opiekun" + counselor_title_description: "(ekspert/nauczyciel)" + + ladder: + please_login: "Przed rozpoczęciem gry rankingowej musisz się zalogować." + my_matches: "Moje pojedynki" + simulate: "Symuluj" + simulation_explanation: "Symulując gry możesz szybciej uzyskać ocenę swojej gry!" + simulate_games: "Symuluj gry!" + simulate_all: "RESETUJ I SYMULUJ GRY" + leaderboard: "Tabela rankingowa" + battle_as: "Walcz jako " + summary_your: "Twój " + summary_matches: "Pojedynki - " + summary_wins: " Wygrane, " + summary_losses: " Przegrane" + rank_no_code: "Brak nowego kodu do oceny" + rank_my_game: "Oceń moją grę!" + rank_submitting: "Wysyłanie..." + rank_submitted: "Wysłano do oceny" + rank_failed: "Błąd oceniania" + rank_being_ranked: "Aktualnie oceniane gry" + code_being_simulated: "Twój nowy kod jest aktualnie symulowany przez innych graczy w celu oceny. W miarę pojawiania sie nowych pojedynków, nastąpi odświeżenie." + no_ranked_matches_pre: "Brak ocenionych pojedynków dla drużyny " + no_ranked_matches_post: " ! Zagraj przeciwko kilku oponentom i wróc tutaj, aby uzyskać ocenę gry." + choose_opponent: "Wybierz przeciwnika" + tutorial_play: "Rozegraj samouczek" + tutorial_recommended: "Zalecane, jeśli wcześniej nie grałeś" + tutorial_skip: "Pomiń samouczek" + tutorial_not_sure: "Nie wiesz, co się dzieje?" + tutorial_play_first: "Rozegraj najpierw samouczek." + simple_ai: "Proste AI" + warmup: "Rozgrzewka" +# vs: "VS" diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index e6a285655..114adef31 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: campaign_player_created: "Criados por Jogadores" campaign_player_created_description: "... nos quais você batalhará contra a criatividade dos seus companheiros feiticeiros Artesãos." level_difficulty: "Dificuldade: " +# play_as: "Play As " contact: contact_us: "Contate-nos" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: wizard_tab: "Feiticeiro" password_tab: "Senha" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Selecione qual foto do Gravatar usar" gravatar_add_photos: "Adicione miniaturas e fotos a uma conta do Gravatar ligada ao seu email para poder escolher uma imagem." gravatar_add_more_photos: "Adicione mais fotos à sua conta do Gravatar para acessá-las aqui." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: new_password_verify: "Confirmação" email_subscriptions: "Assinaturas para Notícias por Email" email_announcements: "Notícias" +# email_notifications: "Notifications" email_notifications_description: "Recebe notificações periódicas em sua conta." email_announcements_description: "Receba emails com as últimas notícias e desenvolvimentos do CodeCombat." contributor_emails: "Emails para as Classes de Contribuidores" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: victory_sign_up: "Assine para atualizações" victory_sign_up_poke: "Quer receber as últimas novidades por email? Crie uma conta grátis e nós o manteremos informado!" victory_rate_the_level: "Avalie o estágio: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jogar o próximo estágio" victory_go_home: "Ir à página inicial" victory_review: "Diga-nos mais!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: tome_available_spells: "Feitiços Disponíveis" hud_continue: "Continue (tecle Shift+Space)" spell_saved: "Feitiço Salvo" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Visualização de Administrador" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: contact_us: "entre em contato!" hipchat_prefix: "Você também pode nos encontrar na nossa" hipchat_url: "Sala do HipChat." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Algumas Opções?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: level_components_title: "Voltar para Lista de Thangs" level_components_type: "Tipo" level_component_edit_title: "Editar Componente" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Editar Sistema" create_system_title: "Criar Novo Sistema" new_component_title: "Criar Novo Componente" new_component_field_system: "Sistema" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Prever" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: body: "Principal" version: "Versão" commit_msg: "Mensagem do Commit" +# history: "History" version_history_for: "Histórico de Versão para: " +# result: "Result" results: "Resultados" description: "Descrição" or: "ou" email: "Email" +# password: "Password" message: "Mensagem" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "Quem é CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: artisan_join_step4: "Publique seus níveis no fórum para avaliação." more_about_artisan: "Saiba Mais Sobre Como Se Tornar Um Artesão Criativo" artisan_subscribe_desc: "Receba emails com novidades sobre o editor de níveis e anúncios." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_introduction: "Vamos ser claros sobre o seu papel: você é o tanque. Você vai tomar dano pesado. Precisamos de pessoas para experimentar níveis inéditos e ajudar a identificar como fazer as coisas melhorarem. A dor será enorme, fazer bons jogos é um processo longo e ninguém acerta na primeira vez. Se você pode suportar e ter uma alta pontuação de constituição, então esta classe pode ser para você." adventurer_attribute_1: "Sede de aprendizado. Você quer aprender a codificar e nós queremos ensiná-lo a codificar. Você provavelmente vai fazer a maior parte do ensino neste caso." adventurer_attribute_2: "Carismático. Seja gentil, mas articulado sobre o que precisa melhorar, e ofereça sugestões sobre como melhorar." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: more_about_adventurer: "Saiba Mais Sobre Como Se Tornar Um Valente Aventureiro" adventurer_subscribe_desc: "Receba emails quando houver novos níveis para testar." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_introduction_pref: "O CodeCombat não será apenas um monte de níveis. Ele também irá incluir uma fonte de conhecimento, um wiki de conceitos de programação que os níveis podem se basear. Dessa forma, em vez de cada Artesão ter que descrever em detalhes o que é um operador de comparação, eles podem simplesmente criar um link para o artigo que o descreve. Algo na linha do que a " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: " construiu. Se a sua idéia de diversão é articular os conceitos de programação em Markdown, então esta classe pode ser para você." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: ambassador_title_description: "(Suporte)" counselor_title: "Conselheiro" counselor_title_description: "(Especialista/Professor)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 1ce48a42f..670e8dc77 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P campaign_player_created: "Criados por Jogadores" campaign_player_created_description: "... onde combates contra a criatividade dos teus colegas Feiticeiros Artesãos." level_difficulty: "Dificuldade: " +# play_as: "Play As " contact: contact_us: "Contactar o CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P wizard_tab: "Feiticeiro" password_tab: "Palavra-passe" emails_tab: "E-mails" +# admin: "Admin" gravatar_select: "Seleciona qual fotografia Gravatar a usar" gravatar_add_photos: "Adiciona miniaturas e fotografias a uma conta Gravatar com o teu email para escolheres uma imagem." gravatar_add_more_photos: "Adiciona mais fotografias à tua conta Gravatar para as acederes aqui." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P new_password_verify: "Verificar" email_subscriptions: "Subscrições de E-mail" email_announcements: "Anúncios" +# email_notifications: "Notifications" email_notifications_description: "Recebe notificações periódicas sobre a tua conta." email_announcements_description: "Recebe e-mails sobre as últimas novidades e desenvolvimentos no CodeCombat." contributor_emails: "E-mails para Contribuintes" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P victory_sign_up: "Cria uma conta para guardar o teu progresso" victory_sign_up_poke: "Queres guardar o teu código? Cria uma conta grátis!" victory_rate_the_level: "Classifica este nível: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jogar próximo nível" victory_go_home: "Ir para a Home" victory_review: "Conta-nos mais!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P tome_available_spells: "Feitiços disponíveis" hud_continue: "Continuar (pressiona shift-space)" spell_saved: "Feitiço Guardado" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Visualizações de Admin" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P contact_us: "contacta-nos!" hipchat_prefix: "Podes encontrar-nos no nosso" hipchat_url: "canal HipChat." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Algumas opções?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P level_components_title: "Voltar para Todos os Thangs" level_components_type: "Tipo" level_component_edit_title: "Editar Componente" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Editar Sistema" create_system_title: "Criar novo Sistema" new_component_title: "Criar novo Componente" new_component_field_system: "Sistema" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Visualizar" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P body: "Corpo" version: "Versão" commit_msg: "Mensagem de Commit" +# history: "History" version_history_for: "Histórico de versões por: " +# result: "Result" results: "Resultados" description: "Descrição" or: "ou" email: "E-mail" +# password: "Password" message: "Mensagem" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P ambassador_title_description: "(Suporte)" counselor_title: "Counselor" counselor_title_description: "(Expert/ Professor)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/pt.coffee b/app/locale/pt.coffee index 9aedeae92..d52a82b6a 100644 --- a/app/locale/pt.coffee +++ b/app/locale/pt.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues campaign_player_created: "Criados por Jogadores" campaign_player_created_description: "... nos quais você batalhará contra a criatividade dos seus companheiros feiticeiros Artesãos." level_difficulty: "Dificuldade: " +# play_as: "Play As " contact: contact_us: "Contate-nos" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues wizard_tab: "Feiticeiro" password_tab: "Senha" emails_tab: "Emails" +# admin: "Admin" gravatar_select: "Selecione qual foto do Gravatar usar" gravatar_add_photos: "Adicione miniaturas e fotos a uma conta do Gravatar ligada ao seu email para poder escolher uma imagem." gravatar_add_more_photos: "Adicione mais fotos à sua conta do Gravatar para acessá-las aqui." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues new_password_verify: "Confirmação" email_subscriptions: "Assinaturas para Notícias por Email" email_announcements: "Notícias" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Receba emails com as últimas notícias e desenvolvimentos do CodeCombat." contributor_emails: "Emails para as Classes de Contribuidores" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues victory_sign_up: "Assine para atualizações" victory_sign_up_poke: "Quer receber as últimas novidades por email? Crie uma conta grátis e nós o manteremos informado!" victory_rate_the_level: "Avalie o estágio: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jogar o próximo estágio" victory_go_home: "Ir à página inicial" victory_review: "Diga-nos mais!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues tome_available_spells: "Feitiços Disponíveis" hud_continue: "Continue (tecle Shift+Space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "ou" email: "Email" +# password: "Password" message: "Mensagem" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee index 454278097..2697f5bb3 100644 --- a/app/locale/ro.coffee +++ b/app/locale/ro.coffee @@ -1,384 +1,427 @@ module.exports = nativeDescription: "limba română", englishDescription: "Romanian", translation: common: - loading: "Loading..." -# saving: "Saving..." -# sending: "Sending..." -# cancel: "Cancel" -# save: "Save" -# delay_1_sec: "1 second" -# delay_3_sec: "3 seconds" -# delay_5_sec: "5 seconds" -# manual: "Manual" -# fork: "Fork" -# play: "Play" + loading: "Se incarcă..." + saving: "Se salvează..." + sending: "Se trimite..." + cancel: "Anulează" + save: "Salvează" + delay_1_sec: "1 secundă" + delay_3_sec: "3 secunde" + delay_5_sec: "5 secunde" + manual: "Manual" + fork: "Fork" + play: "Joaca" -# modal: -# close: "Close" -# okay: "Okay" + modal: + close: "Inchide" + okay: "Okay" -# not_found: -# page_not_found: "Page not found" + not_found: + page_not_found: "Pagina nu a fost gasită" -# nav: -# play: "Levels" -# editor: "Editor" -# blog: "Blog" -# forum: "Forum" -# admin: "Admin" -# home: "Home" -# contribute: "Contribute" -# legal: "Legal" -# about: "About" -# contact: "Contact" -# twitter_follow: "Follow" -# employers: "Employers" + nav: + play: "Nivele" + editor: "Editor" + blog: "Blog" + forum: "Forum" + admin: "Admin" + home: "Acasa" + contribute: "Contribuie" + legal: "Confidențialitate și termeni" + about: "Despre" + contact: "Contact" + twitter_follow: "Urmărește" + employers: "Angajați" -# versions: -# save_version_title: "Save New Version" -# new_major_version: "New Major Version" -# cla_prefix: "To save changes, first you must agree to our" -# cla_url: "CLA" -# cla_suffix: "." -# cla_agree: "I AGREE" + versions: + save_version_title: "Salvează noua versiune" + new_major_version: "Versiune nouă majoră" + cla_prefix: "Pentru a salva modificările mai intâi trebuie sa fiți de acord cu" + cla_url: "CLA" + cla_suffix: "." + cla_agree: "SUNT DE ACORD" -# login: -# sign_up: "Create Account" -# log_in: "Log In" -# log_out: "Log Out" -# recover: "recover account" + login: + sign_up: "Crează cont" + log_in: "Log In" + log_out: "Log Out" + recover: "recuperează cont" -# recover: -# recover_account_title: "Recover Account" -# send_password: "Send Recovery Password" + recover: + recover_account_title: "Recuperează Cont" + send_password: "Trimite parolă de recuperare" -# signup: -# create_account_title: "Create Account to Save Progress" -# description: "It's free. Just need a couple things and you'll be good to go:" -# email_announcements: "Receive announcements by email" -# coppa: "13+ or non-USA " -# coppa_why: "(Why?)" -# creating: "Creating Account..." -# sign_up: "Sign Up" -# log_in: "log in with password" + signup: + create_account_title: "Crează cont pentru a salva progresul" + description: "Este gratis. Doar un scurt formular inainte si poți continua:" + email_announcements: "Primește notificări prin emaill" + coppa: "13+ sau non-USA " + coppa_why: "(De ce?)" + creating: "Se crează contul..." + sign_up: "Înscrie-te" + log_in: "loghează-te cu parola" -# home: -# slogan: "Learn to Code JavaScript by Playing a Game" -# no_ie: "CodeCombat does not run in Internet Explorer 9 or older. Sorry!" -# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!" -# play: "Play" + home: + slogan: "Învață sa scri JavaScript jucându-te" + no_ie: "CodeCombat nu merge pe Internet Explorer 9 sau mai vechi. Scuze!" + no_mobile: "CodeCombat nu a fost proiectat pentru dispozitive mobile si s-ar putea sa nu meargâ!" + play: "Joacâ" -# play: -# choose_your_level: "Choose Your Level" -# adventurer_prefix: "You can jump to any level below, or discuss the levels on " -# adventurer_forum: "the Adventurer forum" -# adventurer_suffix: "." -# campaign_beginner: "Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." -# campaign_dev: "Random Harder Levels" -# campaign_dev_description: "... in which you learn the interface while doing something a little harder." -# campaign_multiplayer: "Multiplayer Arenas" -# campaign_multiplayer_description: "... in which you code head-to-head against other players." -# campaign_player_created: "Player-Created" -# campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." -# level_difficulty: "Difficulty: " + play: + choose_your_level: "Alege nivelul" + adventurer_prefix: "Poți să sari la orice nivel de mai jos" + adventurer_forum: "forumul Aventurierului" + adventurer_suffix: "." + campaign_beginner: "Campanie pentru Începători" + campaign_beginner_description: "... în care se învață tainele programării." + campaign_dev: "Nivele aleatoare mai grele" + campaign_dev_description: "... în care se învață interfața, cu o dificultate puțin mai mare." + campaign_multiplayer: "Arene Multiplayer" + campaign_multiplayer_description: "... în care te lupți cap-la-cap contra alti jucători." + campaign_player_created: "Create de jucători" + campaign_player_created_description: "... în care ai ocazia să testezi creativitatea colegilor tai Artisan Wizards." + level_difficulty: "Dificultate: " +# play_as: "Play As " -# contact: -# contact_us: "Contact CodeCombat" -# welcome: "Good to hear from you! Use this form to send us email. " -# contribute_prefix: "If you're interested in contributing, check out our " -# contribute_page: "contribute page" -# contribute_suffix: "!" -# forum_prefix: "For anything public, please try " -# forum_page: "our forum" -# forum_suffix: " instead." -# send: "Send Feedback" + contact: + contact_us: "Contact CodeCombat" + welcome: "Folosiți acest formular pentru a ne trimite email. " + contribute_prefix: "Dacă sunteți interesați in a contribui uitați-vă pe " + contribute_page: "pagina de contribuție" + contribute_suffix: "!" + forum_prefix: "Pentru orice altceva vă rugăm sa incercați " + forum_page: "forumul nostru" + forum_suffix: " în schimb." + send: "Trimite Feedback" diplomat_suggestion: -# title: "Help translate CodeCombat!" -# sub_heading: "We need your language skills." - pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Romanian 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 Romanian." + title: "Ajută-ne să traducem CodeCombat!" + sub_heading: "Avem nevoie de abilitățile tale lingvistice." + pitch_body: "CodeCombat este dezvoltat in limba engleza , dar deja avem jucatări din toate colțurile lumii.Mulți dintre ei vor să joace in română și nu vorbesc engleză.Dacă poți vorbi ambele te rugăm să te gândești dacă ai dori să devi un Diplomat și să ne ajuți sa traducem atât jocul cât și site-ul." missing_translations: "Until we can translate everything into Romanian, you'll see English when Romanian isn't available." -# learn_more: "Learn more about being a Diplomat" -# subscribe_as_diplomat: "Subscribe as a Diplomat" + learn_more: "Află mai multe despre cum să fi un Diplomat" + subscribe_as_diplomat: "Înscrie-te ca Diplomat" -# wizard_settings: -# title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" -# trim: "Trim" -# cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" -# hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + wizard_settings: + title: "Setări Wizard" + customize_avatar: "Personalizează-ți Avatarul" + clothes: "Haine" + trim: "Margine" + cloud: "Nor" + spell: "Vrajă" + boots: "Încălțăminte" + hue: "Culoare" + saturation: "Saturație" + lightness: "Luminozitate" -# account_settings: -# title: "Account Settings" -# not_logged_in: "Log in or create an account to change your settings." -# autosave: "Changes Save Automatically" -# me_tab: "Me" -# picture_tab: "Picture" -# wizard_tab: "Wizard" -# password_tab: "Password" -# emails_tab: "Emails" -# gravatar_select: "Select which Gravatar photo to use" -# gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." -# gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." -# wizard_color: "Wizard Clothes Color" -# new_password: "New Password" -# new_password_verify: "Verify" -# email_subscriptions: "Email Subscriptions" -# email_announcements: "Announcements" -# email_notifications_description: "Get periodic notifications for your account." -# email_announcements_description: "Get emails on the latest news and developments at CodeCombat." -# contributor_emails: "Contributor Class Emails" -# contribute_prefix: "We're looking for people to join our party! Check out the " -# contribute_page: "contribute page" -# contribute_suffix: " to find out more." -# email_toggle: "Toggle All" -# error_saving: "Error Saving" -# saved: "Changes Saved" -# password_mismatch: "Password does not match." + account_settings: + title: "Setări Cont" + not_logged_in: "Loghează-te sau crează un cont nou pentru a schimba setările." + autosave: "Modificările se salvează automat" + me_tab: "Eu" + picture_tab: "Poză" + wizard_tab: "Wizard" + password_tab: "Parolă" + emails_tab: "Email-uri" +# admin: "Admin" + gravatar_select: "Selectează ce poză Gravatar vrei să foloșesti" + gravatar_add_photos: "Adaugă thumbnails și poze la un cont Gravatar pentru email-ul tău pentru a alege o imagine." + gravatar_add_more_photos: "Adaugă mai multe poze la contul tău Gravatar pentru a le accesa aici." + wizard_color: "Culoare haine pentru Wizard" + new_password: "Parolă nouă" + new_password_verify: "Verifică" + email_subscriptions: "Subscripție Email" + email_announcements: "Anunțuri" +# email_notifications: "Notifications" + email_notifications_description: "Primește notificări periodic pentru contul tău." + email_announcements_description: "Primește email-uri cu ultimele știri despre CodeCombat." + contributor_emails: "Contributor Class Emails" + contribute_prefix: "Căutăm oameni să se alăture distracției! Intră pe " + contribute_page: "pagina de contribuție" + contribute_suffix: " pentru a afla mai multe." + email_toggle: "Alege tot" + error_saving: "Salvare erori" + saved: "Modificări salvate" + password_mismatch: "Parola nu se potrivește." -# account_profile: -# edit_settings: "Edit Settings" -# profile_for_prefix: "Profile for " -# profile_for_suffix: "" -# profile: "Profile" -# user_not_found: "No user found. Check the URL?" -# gravatar_not_found_mine: "We couldn't find your profile associated with:" -# gravatar_not_found_email_suffix: "." -# gravatar_signup_prefix: "Sign up at " -# gravatar_signup_suffix: " to get set up!" -# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." -# gravatar_contact: "Contact" -# gravatar_websites: "Websites" -# gravatar_accounts: "As Seen On" -# gravatar_profile_link: "Full Gravatar Profile" + account_profile: + edit_settings: "Modifică setările" + profile_for_prefix: "Profil pentru " + profile_for_suffix: "" + profile: "Profil" + user_not_found: "Utilizator negăsit. Verifică URL-ul??" + gravatar_not_found_mine: "N-am putut găsi profilul asociat cu:" + gravatar_not_found_email_suffix: "." + gravatar_signup_prefix: "Înscrie-te la " + gravatar_signup_suffix: " pentru a fi gata!" + gravatar_not_found_other: "Din păcate nu este asociat nici un profil cu această adresă de email." + gravatar_contact: "Contact" + gravatar_websites: "Website-uri" + gravatar_accounts: "Așa cum apare la" + gravatar_profile_link: "Full Gravatar Profile" -# play_level: -# level_load_error: "Level could not be loaded: " -# done: "Done" -# grid: "Grid" -# customize_wizard: "Customize Wizard" -# home: "Home" -# guide: "Guide" -# multiplayer: "Multiplayer" -# restart: "Restart" -# goals: "Goals" -# action_timeline: "Action Timeline" -# click_to_select: "Click on a unit to select it." -# reload_title: "Reload All Code?" -# reload_really: "Are you sure you want to reload this level back to the beginning?" -# reload_confirm: "Reload All" -# victory_title_prefix: "" -# victory_title_suffix: " Complete" -# victory_sign_up: "Sign Up to Save Progress" -# victory_sign_up_poke: "Want to save your code? Create a free account!" -# victory_rate_the_level: "Rate the level: " -# victory_play_next_level: "Play Next Level" -# victory_go_home: "Go Home" -# victory_review: "Tell us more!" -# victory_hour_of_code_done: "Are You Done?" -# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!" -# multiplayer_title: "Multiplayer Settings" -# multiplayer_link_description: "Give this link to anyone to have them join you." -# multiplayer_hint_label: "Hint:" -# multiplayer_hint: " Click the link to select all, then press ⌘-C or Ctrl-C to copy the link." -# multiplayer_coming_soon: "More multiplayer features to come!" -# guide_title: "Guide" -# tome_minion_spells: "Your Minions' Spells" -# tome_read_only_spells: "Read-Only Spells" -# tome_other_units: "Other Units" -# tome_cast_button_castable: "Cast Spell" -# tome_cast_button_casting: "Casting" -# tome_cast_button_cast: "Spell Cast" -# tome_autocast_delay: "Autocast Delay" -# tome_select_spell: "Select a Spell" -# tome_select_a_thang: "Select Someone for " -# tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" -# spell_saved: "Spell Saved" + play_level: + level_load_error: "Nivelul nu a putut fi încărcat: " + done: "Gata" + grid: "Grilă" + customize_wizard: "Personalizează Wizard-ul" + home: "Acasă" + guide: "Ghid" + multiplayer: "Multiplayer" + restart: "Restart" + goals: "Obiective" + action_timeline: "Timeline-ul acțiunii" + click_to_select: "Apasă pe o unitate pentru a o selecta." + reload_title: "Reîncarcă tot Codul?" + reload_really: "Ești sigur că vrei să reîncarci nivelul de la început?" + reload_confirm: "Reload All" + victory_title_prefix: "" + victory_title_suffix: " Terminat" + victory_sign_up: "Înscrie-te pentru a salva progresul" + victory_sign_up_poke: "Vrei să-ți salvezi codul? Crează un cont gratis!" + victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" + victory_play_next_level: "Joacă nivelul următor" + victory_go_home: "Acasă" + victory_review: "Spune-ne mai multe!" + victory_hour_of_code_done: "Ai terminat?" + victory_hour_of_code_done_yes: "Da, am terminat Hour of Code™!" + multiplayer_title: "Setări Multiplayer" + multiplayer_link_description: "Împărtășește acest link cu cei care vor să ți se alăture." + multiplayer_hint_label: "Hint:" + multiplayer_hint: " Apasă pe link pentru a selecta tot, apoi apasă ⌘-C sau Ctrl-C pentru a copia link-ul." + multiplayer_coming_soon: "Mai multe feature-uri multiplayer în curând!" + guide_title: "Ghid" + tome_minion_spells: "Vrăjile Minion-ilor tăi" + tome_read_only_spells: "Vrăji Read-Only" + tome_other_units: "Alte unități" + tome_cast_button_castable: "Aplică Vraja" + tome_cast_button_casting: "Se încarcă" + tome_cast_button_cast: "Aplică Vraja" + tome_autocast_delay: "Întârziere Autocast" + tome_select_spell: "Alege o vrajă" + tome_select_a_thang: "Alege pe cineva pentru " + tome_available_spells: "Vrăjile disponibile" + hud_continue: "Continuă (apasă shift-space)" + spell_saved: "Vrajă salvată" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." -# admin: -# av_title: "Admin Views" -# av_entities_sub_title: "Entities" -# av_entities_users_url: "Users" -# av_entities_active_instances_url: "Active Instances" -# av_other_sub_title: "Other" -# av_other_debug_base_url: "Base (for debugging base.jade)" -# u_title: "User List" -# lg_title: "Latest Games" + admin: + av_title: "Admin vede" + av_entities_sub_title: "Entități" + av_entities_users_url: "Utilizatori" + av_entities_active_instances_url: "Instanțe active" + av_other_sub_title: "Altele" + av_other_debug_base_url: "Base (pentru debugging base.jade)" + u_title: "Listă utilizatori" + lg_title: "Ultimele jocuri" -# editor: -# main_title: "CodeCombat Editors" -# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" -# article_title: "Article Editor" -# article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns." -# thang_title: "Thang Editor" -# thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics." -# level_title: "Level Editor" -# level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!" -# security_notice: "Many major features in these editors are not currently enabled by default. As we improve the security of these systems, they will be made generally available. If you'd like to use these features sooner, " -# contact_us: "contact us!" -# hipchat_prefix: "You can also find us in our" -# hipchat_url: "HipChat room." -# level_some_options: "Some Options?" -# level_tab_thangs: "Thangs" -# level_tab_scripts: "Scripts" -# level_tab_settings: "Settings" -# level_tab_components: "Components" -# level_tab_systems: "Systems" -# level_tab_thangs_title: "Current Thangs" -# level_tab_thangs_conditions: "Starting Conditions" -# level_tab_thangs_add: "Add Thangs" -# level_settings_title: "Settings" -# level_component_tab_title: "Current Components" -# level_component_btn_new: "Create New Component" -# level_systems_tab_title: "Current Systems" -# level_systems_btn_new: "Create New System" -# level_systems_btn_add: "Add System" -# level_components_title: "Back to All Thangs" -# level_components_type: "Type" -# level_component_edit_title: "Edit Component" -# level_system_edit_title: "Edit System" -# create_system_title: "Create New System" -# new_component_title: "Create New Component" -# new_component_field_system: "System" + editor: + main_title: "Editori CodeCombat" + main_description: "Construiește propriile nivele,campanii,unități și conținut educațional.Noi îți furnizăm toate uneltele necesare!" + article_title: "Editor Articol" + article_description: "Scrie articole care oferă jucătorilor cunoștințe despre conceptele de programare care pot fi folosite pe o varietate de nivele și campanii." + thang_title: "Editor Thang" + thang_description: "Construiește unități ,definește logica lor,grafica și sunetul.Momentan suportă numai importare de grafică vectorială exportată din Flash." + level_title: "Editor Nivele" + level_description: "Include uneltele pentru scriptare, upload audio, și construcție de logică costum pentru toate tipurile de nivele.Tot ce folosim noi înșine!" + security_notice: "Multe setări majore de securitate în aceste editoare nu sunt momentan disponibile.Pe măsură ce îmbunătățim securitatea acestor sisteme, ele vor deveni disponibile. Dacă doriți să folosiți aceste setări mai devrme, " + contact_us: "contactați-ne!" + hipchat_prefix: "Ne puteți de asemenea găsi la" + hipchat_url: "HipChat." +# revert: "Revert" +# revert_models: "Revert Models" + level_some_options: "Opțiuni?" + level_tab_thangs: "Thangs" + level_tab_scripts: "Script-uri" + level_tab_settings: "Setări" + level_tab_components: "Componente" + level_tab_systems: "Sisteme" + level_tab_thangs_title: "Thangs actuali" + level_tab_thangs_conditions: "Condiți inițiale" + level_tab_thangs_add: "Adaugă Thangs" + level_settings_title: "Setări" + level_component_tab_title: "Componente actuale" + level_component_btn_new: "Crează componentă nouă" + level_systems_tab_title: "Sisteme actuale" + level_systems_btn_new: "Crează sistem nou" + level_systems_btn_add: "Adaugă Sistem" + level_components_title: "Înapoi la toți Thangs" + level_components_type: "Tip" + level_component_edit_title: "Editează Componenta" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" + level_system_edit_title: "Editează Sistem" + create_system_title: "Crează sistem nou" + new_component_title: "Crează componentă nouă" + new_component_field_system: "Sistem" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" -# article: -# edit_btn_preview: "Preview" -# edit_article_title: "Edit Article" + article: + edit_btn_preview: "Preview" + edit_article_title: "Editează Articol" -# general: -# and: "and" -# name: "Name" -# body: "Body" -# version: "Version" -# commit_msg: "Commit Message" -# version_history_for: "Version History for: " -# results: "Results" -# description: "Description" -# or: "or" -# email: "Email" -# message: "Message" + general: + and: "și" + name: "Nume" + body: "Corp" + version: "Versiune" + commit_msg: "Înregistrează Mesajul" +# history: "History" + version_history_for: "Versiune istorie pentru: " +# result: "Result" + results: "Resultate" + description: "Descriere" + or: "sau" + email: "Email" +# password: "Password" + message: "Mesaj" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" -# about: -# who_is_codecombat: "Who is CodeCombat?" -# why_codecombat: "Why CodeCombat?" -# who_description_prefix: "together started CodeCombat in 2013. We also created " -# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." -# who_description_ending: "Now it's time to teach people to write code." -# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." -# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." -# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" -# why_paragraph_3_italic: "yay a badge" -# why_paragraph_3_center: "but fun like" -# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" -# why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." -# why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." -# why_ending: "And hey, it's free. " -# why_ending_url: "Start wizarding now!" -# george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere." -# scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one." -# nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." -# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." -# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." + about: + who_is_codecombat: "Cine este CodeCombat?" + why_codecombat: "De ce CodeCombat?" + who_description_prefix: "au pornit împreuna CodeCombat în 2013. Tot noi am creat " + who_description_suffix: "în 2008, dezvoltând aplicația web si iOS #1 de învățat cum să scri caractere Japoneze si Chinezești." + who_description_ending: "Acum este timpul să învățăm oamenii să scrie cod." + why_paragraph_1: "Când am dezolvat Skritter, George nu știa cum să programeze și era mereu frustat de inabilitatea sa de a putea implementa ideile sale. După aceea, a încercat să învețe, dar lecțiile erau prea lente. Colegul său , vrând să se reprofilze și să se lase de predat,a încercat Codecademy, dar \"s-a plictisit.\" În fiecare săptămână un alt prieten a început Codecademy, iar apoi s-a lăsat. Am realizat că este aceeași problemă care am rezolvat-u cu Skritter: oameni încercând să învețe ceva nou prin lecții lente și intensive când defapt ceea ce le trebuie sunt lecții rapide și multă practică. Noi știm cum să rezolvăm asta." + why_paragraph_2: "Trebuie să înveți să programezi? Nu-ți trebuie lecții. Trebuie să scri mult cod și să te distrezi făcând asta." + why_paragraph_3_prefix: "Despre asta este programarea. Trebuie să fie distractiv. Nu precum" + why_paragraph_3_italic: "wow o insignă" + why_paragraph_3_center: "ci" + why_paragraph_3_italic_caps: "TREBUIE SĂ TERMIN ACEST NIVEL!" + why_paragraph_3_suffix: "De aceea CodeCombat este un joc multiplayer, nu un curs transfigurat în joc. Nu ne vom opri până când tu nu te poți opri--și de data asta, e de bine." + why_paragraph_4: "Dacă e să devi dependent de vreun joc, devino dependent de acesta și fi un vrăjitor al noii ere tehnologice." + why_ending: "Nu uita, este totul gratis. " + why_ending_url: "Devino un vrăjitor acum!" + george_description: "CEO, business guy, web designer, game designer, și campion al programatorilor începători." + scott_description: "Programmer extraordinaire, software architect, kitchen wizard, și maestru al finanțelor. Scott este cel rezonabil." + nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick poate să facă orice si a ales să dezvolte CodeCombat." + jeremy_description: "Customer support mage, usability tester, and community organizer; probabil ca ați vorbit deja cu Jeremy." + michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael este cel care ține serverele in picioare." -# legal: -# page_title: "Legal" -# opensource_intro: "CodeCombat is free to play and completely open source." -# opensource_description_prefix: "Check out " -# github_url: "our GitHub" -# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " -# archmage_wiki_url: "our Archmage wiki" -# opensource_description_suffix: "for a list of the software that makes this game possible." -# practices_title: "Respectful Best Practices" -# practices_description: "These are our promises to you, the player, in slightly less legalese." -# privacy_title: "Privacy" -# privacy_description: "We will not sell any of your personal information. We intend to make money through recruitment eventually, but rest assured we will not distribute your personal information to interested companies without your explicit consent." -# security_title: "Security" -# security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems." -# email_title: "Email" -# email_description_prefix: "We will not inundate you with spam. Through" -# email_settings_url: "your email settings" -# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." -# cost_title: "Cost" -# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" -# recruitment_title: "Recruitment" -# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizard–not just in the game, but also in real life." -# url_hire_programmers: "No one can hire programmers fast enough" -# recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you" -# recruitment_description_italic: "a lot" -# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan." -# copyrights_title: "Copyrights and Licenses" -# contributor_title: "Contributor License Agreement" -# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" -# cla_url: "CLA" -# contributor_description_suffix: "to which you should agree before contributing." -# code_title: "Code - MIT" -# code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the" -# mit_license_url: "MIT license" -# code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels." -# art_title: "Art/Music - Creative Commons " -# art_description_prefix: "All common content is available under the" -# cc_license_url: "Creative Commons Attribution 4.0 International License" -# art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:" -# art_music: "Music" -# art_sound: "Sound" -# art_artwork: "Artwork" -# art_sprites: "Sprites" -# art_other: "Any and all other non-code creative works that are made available when creating Levels." -# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." -# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" -# use_list_1: "If used in a movie or another game, include codecombat.com in the credits." -# use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution." -# art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any." -# rights_title: "Rights Reserved" -# rights_desc: "All rights are reserved for Levels themselves. This includes" -# rights_scripts: "Scripts" -# rights_unit: "Unit configuration" -# rights_description: "Description" -# rights_writings: "Writings" -# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." -# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." -# nutshell_title: "In a Nutshell" -# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." -# canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence." + legal: + page_title: "Aspecte Legale" + opensource_intro: "CodeCombat este free-to-play și complet open source." + opensource_description_prefix: "Vizitează " + github_url: "pagina noastră de GitHub" + opensource_description_center: "și ajută-ne dacă îți place! CodeCombat este construit peste o mulțime de proiecte open source, care noi le iubim. Vizitați" + archmage_wiki_url: "Archmage wiki" + opensource_description_suffix: "pentru o listă cu software-ul care face acest joc posibil." + practices_title: "Convenții" + practices_description: "Acestea sunt promisiunile noastre către tine, jucătorul, fără așa mulți termeni legali." + privacy_title: "Confidenţialitate şi termeni" + privacy_description: "Noi nu vom vinde nici o informație personală. Intenționăm să obținem profit prin recrutare eventual, dar stați liniștiți , nu vă vom vinde informațiile personale companiilor interesate fără consimțământul vostru explicit." + security_title: "Securitate" + security_description: "Ne străduim să vă protejăm informațiile personale. Fiind un proiect open-source, site-ul nostru oferă oricui posibilitatea de a ne revizui și îmbunătăți sistemul de securitate." + email_title: "Email" + email_description_prefix: "Noi nu vă vom inunda cu spam. Prin" + email_settings_url: "setările tale de email" + email_description_suffix: " sau prin link-urile din email-urile care vi le trimitem, puteți să schimbați preferințele și să vâ dezabonați oricând." + cost_title: "Cost" + cost_description: "Momentan, CodeCombat este 100% gratis! Unul dintre obiectele noastre principale este să îl menținem așa, astfel încât să poată juca cât mai mulți oameni. Dacă va fi nevoie , s-ar putea să percepem o plată pentru o pentru anumite servici,dar am prefera să nu o facem. Cu puțin noroc, vom putea susține compania cu:" + recruitment_title: "Recrutare" + recruitment_description_prefix: "Aici la CodeCombat, vei deveni un vrăjitor puternic nu doar în joc , ci și în viața reală." + url_hire_programmers: "Nimeni nu poate angaja programatori destul de rapid" + recruitment_description_suffix: "așa că odată ce ți-ai dezvoltat abilitățile și esti de acord, noi vom trimite un demo cu cele mai bune realizări ale tale către miile de angajatori care se omoară să pună mâna pe tine. Pe noi ne plătesc puțin, pe tine te vor plăti" + recruitment_description_italic: "mult" + recruitment_description_ending: "site-ul rămâne gratis și toată lumea este fericită. Acesta este planul." + copyrights_title: "Drepturi de autor și licențe" + contributor_title: "Acord de licență Contributor" + contributor_description_prefix: "Toți contribuitorii, atât pe site cât și pe GitHub-ul nostru, sunt supuși la" + cla_url: "ALC" + contributor_description_suffix: "la care trebuie să fi de accord înainte să poți contribui." + code_title: "Code - MIT" + code_description_prefix: "Tot codul deținut de CodeCombat sau hostat pe codecombat.com, atât pe GitHub cât și în baza de date codecombat.com, este licențiată sub" + mit_license_url: "MIT license" + code_description_suffix: "Asta include tot codul din Systems și Components care este oferit de către CodeCombat cu scopul de a crea nivele." + art_title: "Artă/Muzică - Conținut Comun " + art_description_prefix: "Tot conținutul creativ/artistic este valabil sub" + cc_license_url: "Creative Commons Attribution 4.0 International License" + art_description_suffix: "Conținut comun este orice făcut general valabil de către CodeCombat cu scopul de a crea nivele. Asta include:" + art_music: "Muzică" + art_sound: "Sunet" + art_artwork: "Artwork" + art_sprites: "Sprites" + art_other: "Orice si toate celelalte creații non-cod care sunt disponibile când se crează nivele." + art_access: "Momentan nu există nici un sistem universal,ușor pentru preluarea acestor bunuri. În general, preluați-le precum site-ul din URL-urile folosite, contactați-ne pentru asistență, sau ajutați-ne sa extindem site-ul pentru a face aceste bunuri mai ușor accesibile." + art_paragraph_1: "Pentru atribuire, vă rugăm numiți și lăsați referire link la codecombat.com unde este folosită sursa sau unde este adecvat pentru mediu. De exemplu:" + use_list_1: "Dacă este folosit într-un film sau alt joc, includeți codecombat.com la credite." + use_list_2: "Dacă este folosit pe un site, includeți un link in apropiere, de exemplu sub o imagine, sau in pagina generală de atribuiri unde menționați și alte Bunuri Creative și software open source folosit pe site. Ceva care face referință explicit la CodeCombat, precum o postare pe un blog care menționează CodeCombat, nu trebuie să facă o atribuire separată." + art_paragraph_2: "Dacă conținutul folosit nu este creat de către CodeCombat ci de către un utilizator al codecombat.com,atunci faceți referință către ei, și urmăriți indicațiile de atribuire prevăzute în descrierea resursei dacă există." + rights_title: "Drepturi rezervate" + rights_desc: "Toate drepturile sunt rezervate pentru Nivele în sine. Asta include" + rights_scripts: "Script-uri" + rights_unit: "Configurații de unități" + rights_description: "Descriere" + rights_writings: "Scrieri" + rights_media: "Media (sunete, muzică) și orice alt conținut creativ dezvoltat special pentru acel nivel care nu este valabil în mod normal pentru creat nivele." + rights_clarification: "Pentru a clarifica, orice este valabil in Editorul de Nivele pentru scopul de a crea nivele se află sub CC,pe când conținutul creat cu Editorul de Nivele sau încărcat pentru a face nivelul nu se află." + nutshell_title: "Pe scurt" + nutshell_description: "Orice resurse vă punem la dispoziție în Editorul de Nivele puteți folosi liber cum vreți pentru a crea nivele. Dar ne rezervăm dreptul de a rezerva distribuția de nivele în sine (care sunt create pe codecombat.com) astfel încât să se poată percepe o taxă pentru ele pe vitor, dacă se va ajunge la așa ceva." + canonical: "Versiunea in engleză a acestui document este cea definitivă, versiunea canonică. Dacă există orice discrepanțe între traduceri, documentul in engleză are prioritate." -# contribute: -# page_title: "Contributing" -# character_classes_title: "Character Classes" -# introduction_desc_intro: "We have high hopes for CodeCombat." -# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, " -# introduction_desc_github_url: "CodeCombat is totally open source" -# introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours." -# introduction_desc_ending: "We hope you'll join our party!" -# introduction_desc_signature: "- Nick, George, Scott, Michael, and Jeremy" -# alert_account_message_intro: "Hey there!" -# alert_account_message_pref: "To subscribe for class emails, you'll need to " -# alert_account_message_suf: "first." -# alert_account_message_create_url: "create an account" -# archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever." -# archmage_introduction: "One of the best parts about building games is they synthesize so many different things. Graphics, sound, real-time networking, social networking, and of course many of the more common aspects of programming, from low-level database management, and server administration to user facing design and interface building. There's a lot to do, and if you're an experienced programmer with a hankering to really dive into the nitty-gritty of CodeCombat, this class might be for you. We would love to have your help building the best programming game ever." -# class_attributes: "Class Attributes" -# archmage_attribute_1_pref: "Knowledge in " -# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." -# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." -# how_to_join: "How To Join" -# join_desc_1: "Anyone can help out! Just check out our " -# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " -# join_desc_3: ", or find us in our " -# join_desc_4: "and we'll go from there!" -# join_url_email: "Email us" -# join_url_hipchat: "public HipChat room" -# more_about_archmage: "Learn More About Becoming an Archmage" -# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements." -# artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to" -# artisan_summary_suf: "then this class is for you." -# artisan_introduction_pref: "We must construct additional levels! People be clamoring for more content, and we can only build so many ourselves. Right now your workstation is level one; our level editor is barely usable even by its creators, so be wary. If you have visions of campaigns spanning for-loops to" -# artisan_introduction_suf: "then this class might be for you." + contribute: + page_title: "Contribuțtii" + character_classes_title: "Clase de caractere" + introduction_desc_intro: "Avem speranțe mari pentru CodeCombat." + introduction_desc_pref: "Vrem să fie locul unde programatori de toate rangurile vin să învețe și să se distreze împreună, introduc pe alții in minunata lume a programării, și reflectă cele mai bune părți ale comunității. Nu vrem și nu putem să facem asta singuri; ceea ce face proiectele precum GitHub, Stack Overflow și Linux geniale sunt oameni care le folosesc și construiec peste ele. Cu scopul acesta, " + introduction_desc_github_url: "CodeCombat este complet open source" + introduction_desc_suf: ", și ne propunem să vă punem la dispoziție pe cât de mult posibil modalități de a lua parte la acest proiect pentru a-l face la fel de mult as vostru cât și al nostru." + introduction_desc_ending: "Sperăm să vă placă petrecerea noastră!" + introduction_desc_signature: "- Nick, George, Scott, Michael, și Jeremy" + alert_account_message_intro: "Salutare!" + alert_account_message_pref: "Pentru a te abona la email-uri de clasă, va trebui să " + alert_account_message_suf: "mai întâi." + alert_account_message_create_url: "creați un cont" + archmage_summary: "Interesat să lucrezi la grafica jocului, interfața grafică cu utilizatorul, baze de date și organizare server , multiplayer networking, fizică, sunet, sau performanțe game engine ? Vrei să ajuți la construirea unui joc pentru a învăța pe alții ceea ce te pricepi? Avem o grămadă de făcut dacă ești un programator experimentat și vrei sa dezvolți pentru CodeCombat, această clasă este pentru tine. Ne-ar plăcea să ne ajuți să construim cel mai bun joc de programare făcut vreodată." + archmage_introduction: "Una dintre cele mai bune părți despre construirea unui joc este că sintetizează atât de multe lucruri diferite. Grafică, sunet, networking în timp real, social networking, și desigur multe dintre aspectele comune ale programării, de la gestiune low-level a bazelor de date , și administrare server până la construirea de interfețe. Este mult de muncă, și dacă ești un programator cu experiență, cu un dor de a se arunca cu capul înainte îm CodeCombat, această clasă ți se potrivește. Ne-ar plăcea să ne ajuți să construim cel mai bun joc de programare făcut vreodată." + class_attributes: "Atribute pe clase" + archmage_attribute_1_pref: "Cunoștințe în " + archmage_attribute_1_suf: ", sau o dorință de a învăța. Majoritatea codului este în acest limbaj. Dacă ești fan Ruby sau Python, te vei simți ca acasă. Este JavaScript, dar cu o sintaxă mai frumoasă." + archmage_attribute_2: "Ceva experiență în programare și inițiativă personală. Te vom ajuta să te orientezi, dar nu putem aloca prea mult timp pentru a te pregăti." + how_to_join: "Cum să ni te alături" + join_desc_1: "Oricine poate să ajute! Doar intrați pe " + join_desc_2: "pentru a începe, și bifați căsuța de dedesubt pentru a te marca ca un Archmage curajos și pentru a primi ultimele știri pe email. Vrei să discuți despre ce să faci sau cum să te implici mai mult? " + join_desc_3: ", sau găsește-ne în " + join_desc_4: "și pornim de acolo!" + join_url_email: "Trimite-ne Email" + join_url_hipchat: "public HipChat room" + more_about_archmage: "Învață mai multe despre cum să devi un Archmage" + archmage_subscribe_desc: "Primește email-uri despre noi oportunități de progrmare și anunțuri." + artisan_summary_pref: "Vrei să creezi nivele și să extinzi arsenalul CodeCombat? Oamenii ne termină nivelele mai repede decât putem să le creăm! Momentan, editorul nostru de nivele este rudimentar, așa că aveți grijă. Crearea de nivele va fi o mică provocare și va mai avea câteva bug-uri. Dacă ai viziuni cu campanii care cuprind loop-uri for pentru" + artisan_summary_suf: "atunci asta e clasa pentru tine." + artisan_introduction_pref: "Trebuie să construim nivele adiționale! Oamenii sunt nerăbdători pentru mai mult conținut, și noi putem face doar atât singuri. Momentan editorul de nivele abia este utilizabil până și de creatorii lui, așa că aveți grijă. Dacă ai viziuni cu campanii care cuprind loop-uri for pentru" + artisan_introduction_suf: "atunci aceasta ar fi clasa pentru tine." # artisan_attribute_1: "Any experience in building content like this would be nice, such as using Blizzard's level editors. But not required!" # artisan_attribute_2: "A hankering to do a whole lot of testing and iteration. To make good levels, you need to take it to others and watch them play it, and be prepared to find a lot of things to fix." # artisan_attribute_3: "For the time being, endurance en par with an Adventurer. Our Level Editor is super preliminary and frustrating to use. You have been warned!" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index b1102bc8e..4a9315d28 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi campaign_player_created: "Уровни игроков" campaign_player_created_description: "... в которых вы сражаетесь с креативностью ваших друзей Ремесленников." level_difficulty: "Сложность: " + play_as: "Играть за " contact: contact_us: "Связаться с CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi wizard_tab: "Волшебник" password_tab: "Пароль" emails_tab: "Email-адреса" + admin: "Админ" gravatar_select: "Выберите, какое фото с Gravatar использовать" gravatar_add_photos: "Чтобы выбрать изображение, добавьте фото и уменьшенные изображения в ваш Gravatar-аккаунт." gravatar_add_more_photos: "Добавьте больше фото к вашему аккаунту в Gravatar, чтобы использовать их здесь." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi new_password_verify: "Подтверждение пароля" email_subscriptions: "Email-подписки" email_announcements: "Оповещения" + email_notifications: "Уведомления" email_notifications_description: "Получать периодические уведомления для вашего аккаунта." email_announcements_description: "Получать email-оповещения о последних новостях CodeCombat." contributor_emails: "Рассылки по классам участников" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi victory_sign_up: "Зарегистрироваться" victory_sign_up_poke: "Хотите сохранить ваш код? Создайте бесплатный аккаунт!" victory_rate_the_level: "Оцените уровень:" + victory_rank_my_game: "Оценить мою игру" + victory_ranking_game: "Отправка..." + victory_return_to_ladder: "Вернуться к ладдеру" victory_play_next_level: "Следующий уровень" victory_go_home: "На главную" victory_review: "Расскажите нам больше!" @@ -198,18 +204,30 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi tome_select_spell: "Выбрать заклинание" tome_select_a_thang: "Выбрать кого-нибудь для " tome_available_spells: "Доступные заклинания" - hud_continue: "Продолжить (нажмите Shift+Пробел)" + hud_continue: "Продолжить (Shift+Пробел)" spell_saved: "Заклинание сохранено" + skip_tutorial: "Пропуск (Esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." -# admin: -# av_title: "Admin Views" -# av_entities_sub_title: "Entities" -# av_entities_users_url: "Users" -# av_entities_active_instances_url: "Active Instances" -# av_other_sub_title: "Other" -# av_other_debug_base_url: "Base (for debugging base.jade)" -# u_title: "User List" -# lg_title: "Latest Games" + admin: + av_title: "Админ панель" + av_entities_sub_title: "Сущности" + av_entities_users_url: "Пользователи" + av_entities_active_instances_url: "Активные экземпляры" + av_other_sub_title: "Другое" + av_other_debug_base_url: "База (для отладки base.jade)" + u_title: "Список пользователей" + lg_title: "Последние игры" editor: main_title: "Редакторы CodeCombat" @@ -224,7 +242,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi contact_us: "свяжитесь с нами!" hipchat_prefix: "Также вы можете найти нас в нашей" hipchat_url: "комнате HipChat." -# level_some_options: "Some Options?" + revert: "Откатить" + revert_models: "Откатить Модели" + level_some_options: "Ещё опции" level_tab_thangs: "Объекты" level_tab_scripts: "Скрипты" level_tab_settings: "Настройки" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi level_components_title: "Вернуться ко всем объектам" level_components_type: "Тип" level_component_edit_title: "Редактировать компонент" + level_component_config_schema: "Настройка Schema" + level_component_settings: "Настройки" level_system_edit_title: "Редактировать систему" create_system_title: "Создать новую систему" new_component_title: "Создать новый компонент" new_component_field_system: "Система" + new_article_title: "Создать новую статью" + new_thang_title: "Создать новый тип объектов" + new_level_title: "Создать новый уровень" + article_search_title: "Искать статьи" + thang_search_title: "Искать типы объектов" + level_search_title: "Искать уровни" article: edit_btn_preview: "Предпросмотр" @@ -254,15 +282,30 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi general: and: "и" name: "Имя" -# body: "Body" + body: "Содержание" version: "Версия" commit_msg: "Сопроводительное сообщение" + history: "История" version_history_for: "История версий для: " + result: "Результат" results: "Результаты" description: "Описание" or: "или" email: "Email" + password: "Пароль" message: "Сообщение" + code: "Код" + ladder: "Ладдер" + when: "Когда" + opponent: "Противник" + rank: "Ранг" + score: "Счёт" + win: "Победа" + loss: "Поражение" + tie: "Ничья" + easy: "Просто" + medium: "Нормально" + hard: "Сложно" about: who_is_codecombat: "Кто есть CodeCombat?" @@ -297,7 +340,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi practices_title: "Лучшие уважаемые практики" practices_description: "Это наши обещания тебе, игрок, менее юридическим языком." privacy_title: "Конфиденциальность" - privacy_description: "Мы не будем продавать какой-либо личной информации. Мы намерены заработать деньги с помощью рекрутинга в конечном счете, но будьте уверены, мы не будем распространять вашу личную информацию заинтересованным компаниям без вашего явного согласия." + privacy_description: "Мы не будем продавать какой-либо личной информации. Мы намерены заработать деньги с помощью рекрутинга в конечном счёте, но будьте уверены, мы не будем распространять вашу личную информацию заинтересованным компаниям без вашего явного согласия." security_title: "Безопасность" security_description: "Мы стремимся сохранить вашу личную информацию в безопасности. Как проект с открытым исходным кодом, наш сайт в свободном доступе для всех для пересмотра и совершенствования систем безопасности." email_title: "Email" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi artisan_join_step4: "Разместите свои уровни на форуме для обратной связи." more_about_artisan: "Узнать больше о том, как стать Ремесленником" artisan_subscribe_desc: "Получать email-ы об обновлениях редактора уровней и объявления." - adventurer_sumamry: "Позвольте внести ясность о вашей роли: вы танк. Вы собираетесь принять тяжелые повреждения. Нам нужны люди, чтобы испытать совершенно новые уровни и помочь определить, как сделать лучше. Боль будет огромной; создание хороших игр - длительный процесс и никто не делает это правильно в первый раз. Если вы можете выдержать и имеете высокий балл конституции (D&D), этот класс для вас." + adventurer_summary: "Позвольте внести ясность о вашей роли: вы танк. Вы собираетесь принять тяжелые повреждения. Нам нужны люди, чтобы испытать совершенно новые уровни и помочь определить, как сделать лучше. Боль будет огромной; создание хороших игр - длительный процесс и никто не делает это правильно в первый раз. Если вы можете выдержать и имеете высокий балл конституции (D&D), этот класс для вас." adventurer_introduction: "Позвольте внести ясность о вашей роли: вы танк. Вы собираетесь принять тяжелые повреждения. Нам нужны люди, чтобы испытать совершенно новые уровни и помочь определить, как сделать лучше. Боль будет огромной; создание хороших игр - длительный процесс и никто не делает это правильно в первый раз. Если вы можете выдержать и имеете высокий балл конституции (D&D), этот класс для вас." adventurer_attribute_1: "Жажда обучения. Вы хотите научиться программировать и мы хотим научить вас программировать. Вы, вероятно, проведёте большую часть обучения в процессе." adventurer_attribute_2: "Харизматичность. Будьте нежны, но ясно формулируйте, что нуждается в улучшении и вносите свои предложения по улучшению." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi more_about_adventurer: "Узнать больше о том, как стать Искателем приключений" adventurer_subscribe_desc: "Получать email-ы при появлении новых уровней для тестирования." scribe_summary_pref: "CodeCombat будет не просто кучей уровней. Он также будет ресурсом знаний в области программирования, к которому игроки могут присоединиться. Таким образом, каждый Ремесленник может ссылаться на подробную статью для назидания игрока: документация сродни тому, что создана " - scribe_summary_sufx: ". Если вам нравится объяснять концепции программирования, этот класс для вас." + scribe_summary_suf: ". Если вам нравится объяснять концепции программирования, этот класс для вас." scribe_introduction_pref: "CodeCombat будет не просто кучей уровней. Он также включает в себя ресурс для познания, вики концепций программирования, которые уровни могут включать. Таким образом, вместо того, чтобы каждому Ремесленнику необходимо было подробно описывать, что такое оператор сравнения, они могут просто связать их уровень с уже написанной в назидание игрокам статьёй, описывающей их. Что-то по аналогии с " scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_suf: ". Если ваше представление о веселье это формулирование концепций программирования в форме Markdown, этот класс для вас." @@ -418,22 +461,22 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi diplomat_join_suf_github: ", отредактируйте его онлайн и отправьте запрос на включение изменений. Кроме того, установите флажок ниже, чтобы быть в курсе новых разработок интернационализации!" more_about_diplomat: "Узнать больше о том, как стать Дипломатом" diplomat_subscribe_desc: "Получать email-ы о i18n разработках и уровнях для перевода." -# ambassador_summary: "Мы пытаемся создать сообщество, и каждое сообщество нуждается в службе поддержки, когда есть проблемы. У нас есть чаты, электронная почта и социальные сети, чтобы наши пользователи могли познакомиться с игрой. Если вы хотите помочь людям втянуться, получать удовольствие и учиться программированию, этот класс для вас." # Not done yet -# ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." -# ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" -# ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" -# ambassador_join_note_strong: "Note" -# ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" -# more_about_ambassador: "Узнать больше о том, как стать Ambassador" # Not done yet -# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." -# counselor_summary: "None of the above roles fit what you are interested in? Do not worry, we are on the lookout for anybody who wants a hand in the development of CodeCombat! If you are interested in teaching, game development, open source management, or anything else that you think will be relevant to us, then this class is for you." -# counselor_introduction_1: "Do you have life experience? A different perspective on things that can help us decide how to shape CodeCombat? Of all these roles, this will probably take the least time, but individually you may make the most difference. We're on the lookout for wisened sages, particularly in areas like: teaching, game development, open source project management, technical recruiting, entrepreneurship, or design." -# counselor_introduction_2: "Or really anything that is relevant to the development of CodeCombat. If you have knowledge and want to share it to help grow this project, then this class might be for you." -# counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful." -# counselor_attribute_2: "A little bit of free time!" -# counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)." -# more_about_counselor: "Узнать больше о том, как стать Counselor" # Not done yet -# changes_auto_save: "Changes are saved automatically when you toggle checkboxes." + ambassador_summary: "Мы пытаемся создать сообщество, и каждое сообщество нуждается в службе поддержки, когда есть проблемы. У нас есть чаты, электронная почта и социальные сети, чтобы наши пользователи могли познакомиться с игрой. Если вы хотите помочь людям втянуться, получать удовольствие и учиться программированию, этот класс для вас." + ambassador_introduction: "Это сообщество, которое мы создаём, и вы соединяете. У нас есть Olark чаты, электронная почта и социальные сети с уймой людей, с которыми нужно поговорить, помочь в ознакомлении с игрой и обучении из неё. Если вы хотите помочь людям втянуться, получать удовольствие, наслаждаться и и куда мы идём, этот класс для вас." + ambassador_attribute_1: "Навыки общения. Уметь определять проблемы игроков и помогать решить их. Кроме того, держите всех нас в курсе о том, что игроки говорят, что им нравится, не нравится и чего хотят больше!" + ambassador_join_desc: "расскажите нам немного о себе, чем вы занимались и чем хотели бы заниматься. Отсюда и начнём!" + ambassador_join_note_strong: "Примечание" + ambassador_join_note_desc: "Одним из наших главных приоритетов является создание мультиплеера, где игроки столкнутся с труднорешаемыми уровнями и могут призвать более высокоуровневых волшебников для помощи. Это будет отличным способом для послов делать свое дело. Мы будем держать вас в курсе!" + more_about_ambassador: "Узнать больше о том, как стать Послом" + ambassador_subscribe_desc: "Получать email-ы о разработке мультиплеера и обновлениях в системе поддержки." + counselor_summary: "Ни одна из вышеупомянутых ролей не соответствует тому, в чём вы заинтересованы? Не волнуйтесь, мы в поисках тех, кто хочет приложить руку к разработке CodeCombat! Если вы заинтересованы в обучении, разработке игр, управлением проектами с открытым исходным кодом, или в чём-нибудь ещё, что, как вы думаете, будет актуально для нас, то этот класс для вас." + counselor_introduction_1: "У вас есть жизненный опыт? Другая точка зрения на вещи, которые могут помочь нам решить, как формировать CodeCombat? Из всех этих ролей, эта, возможно, займёт меньше всего времени, но по отдельности, вы можете сделать наибольшие изменения. Мы в поисках морщинистых мудрецов, особенно в таких областях, как: обучение, разработка игр, управление проектами с открытым исходным кодом, технической рекрутинг, предпринимательство или дизайн." + counselor_introduction_2: "Или действительно всё, что имеет отношение к развитию CodeCombat. Если у вас есть знания и вы хотите поделиться ими, чтобы помочь вырастить этот проект, то этот класс для вас." + counselor_attribute_1: "Опыт, в любой из областей выше, или в том, что, как вы думаете, может быть полезным." + counselor_attribute_2: "Немного свободного времени!" + counselor_join_desc: "расскажите нам немного о себе, чем вы занимались и чем хотели бы заниматься. Мы поместим вас в наш список контактов и выйдем на связь, когда нам понадобится совет(не слишком часто)." + more_about_counselor: "Узнать больше о том, как стать Советником" + changes_auto_save: "Изменения сохраняются автоматически при переключении флажков." diligent_scribes: "Наши старательные Писари:" powerful_archmages: "Наши могущественные Архимаги:" creative_artisans: "Наши творческие Ремесленники:" @@ -456,3 +499,35 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi ambassador_title_description: "(поддержка)" counselor_title: "Советник" counselor_title_description: "(эксперт/учитель)" + + ladder: + please_login: "Пожалуйста, перед игрой для ладдера, войдите в аккаунт." + my_matches: "Мои матчи" + simulate: "Симулирование" + simulation_explanation: "Симулированием игр вы сможете быстрее получить оценку игры!" + simulate_games: "Симулировать игры!" + simulate_all: "СБРОСИТЬ И СИМУЛИРОВАТЬ ИГРЫ" + leaderboard: "Таблица лидеров" + battle_as: "Сразиться за " + summary_your: "Ваши " + summary_matches: "матчи - " + summary_wins: " побед, " + summary_losses: " поражений" + rank_no_code: "Нет нового кода для оценки" + rank_my_game: "Оценить мою игру!" + rank_submitting: "Отправка..." + rank_submitted: "Отправлено для оценки" + rank_failed: "Сбой в оценке" + rank_being_ranked: "Игра оценивается" + code_being_simulated: "Ваш новый код участвует в симуляции других игроков для оценки. Обновление будет при поступлении новых матчей." + no_ranked_matches_pre: "Нет оценённых матчей для команды" + no_ranked_matches_post: "! Сыграйте против нескольких противников и возвращайтесь сюда для оценки вашей игры." + choose_opponent: "Выберите противника" + tutorial_play: "Пройти обучение" + tutorial_recommended: "Рекомендуется, если вы раньше никогда не играли" + tutorial_skip: "Пропустить обучение" + tutorial_not_sure: "Не уверены, что делать дальше?" + tutorial_play_first: "Сначала пройдите обучение." + simple_ai: "Простой ИИ" + warmup: "Разминка" + vs: "против" diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee index 9050f2181..74c9e5850 100644 --- a/app/locale/sk.coffee +++ b/app/locale/sk.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", campaign_player_created: "Hráčmi vytvorené levely" campaign_player_created_description: "... v ktorých sa popasujete s kreativitou svojich súdruhov kúzelníkov." level_difficulty: "Obtiažnosť." +# play_as: "Play As " contact: contact_us: "Kontaktujte nás" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "alebo" email: "Email" +# password: "Password" message: "Správa" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee index 97559521a..ca6f003fa 100644 --- a/app/locale/sl.coffee +++ b/app/locale/sl.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee index 179b74906..6630a4d02 100644 --- a/app/locale/sr.coffee +++ b/app/locale/sr.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian campaign_player_created: "Направљено од стране играча" campaign_player_created_description: "... у којима се бориш против креативности својих колега." level_difficulty: "Тежина: " +# play_as: "Play As " contact: contact_us: "Контактирај CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian wizard_tab: "Чаробњак" password_tab: "Шифра" emails_tab: "Мејлови" +# admin: "Admin" gravatar_select: "Изабери Граватар фотографију " gravatar_add_photos: "Додај сличице и фотографије за Граватар налог за свој мејл да изабереш слику." gravatar_add_more_photos: "Додај још слика на свој Граватар налог да би им приступио овде." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian new_password_verify: "Потврди" email_subscriptions: "Мејл претплате" email_announcements: "Обавештења" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Прими мејл за најновије вести и достигнућа на CodeCombat-у" contributor_emails: "Мејлови реда сарадника" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian victory_sign_up: "Пријави се за новости" victory_sign_up_poke: "Желиш ли да примаш најновије вести на мејл? Направи бесплатан налог и ми ћемо те обавештавати!" victory_rate_the_level: "Оцени ниво: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Играј следећи ниво" victory_go_home: "Иди на почетну" victory_review: "Реци нам више!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian tome_available_spells: "Доступне чини" hud_continue: "Настави (притисни ентер)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "или" email: "Мејл" +# password: "Password" message: "Порука" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee index b3868e937..eaa034fe3 100644 --- a/app/locale/sv.coffee +++ b/app/locale/sv.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr campaign_player_created: "Spelarskapade" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." level_difficulty: "Svårighetsgrad: " +# play_as: "Play As " contact: contact_us: "Kontakta CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr wizard_tab: "Trollkarl" password_tab: "Lösenord" emails_tab: "E-postadresser" +# admin: "Admin" gravatar_select: "Välj ett Gravatar foto att använda" gravatar_add_photos: "Lägg till miniatyrbilder och fotografier i ett Gravatar konto kopplat till din mail för att välja profilbild." gravatar_add_more_photos: "Lägg till mer fotografier till i ditt Gravatar konto för att använda dem här." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr new_password_verify: "Verifiera" email_subscriptions: "E-post Prenumerationer" email_announcements: "Meddelanden" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." email_announcements_description: "Få e-post med de senaste nyheterna och utvecklingen på CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr victory_sign_up: "Registrera dig för att få uppdateringar" victory_sign_up_poke: "Vill du ha de senaste nyheterna vi e-post? Skapa ett gratiskonto så håller vi dig informerad!" victory_rate_the_level: "Betygsätt nivån: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spela Nästa Nivå" victory_go_home: "Gå Hem" victory_review: "Berätta mer!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr tome_select_spell: "Välj en Förmåga" tome_select_a_thang: "Välj Någon för " tome_available_spells: "Tillgängliga Förmågor" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/th.coffee b/app/locale/th.coffee index 9fd74d3a0..7a8384608 100644 --- a/app/locale/th.coffee +++ b/app/locale/th.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # wizard_tab: "Wizard" password_tab: "รหัสผ่าน" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" email_announcements: "ประกาศ" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra victory_sign_up: "สมัครสมาชิกเพื่ออัพเดท" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "เล่นด่านถัดไป" victory_go_home: "ไปหน้าแรก" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee index 297c9f50d..2be1a8c1a 100644 --- a/app/locale/tr.coffee +++ b/app/locale/tr.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t campaign_player_created: "Oyuncuların Oluşturdukları" campaign_player_created_description: "Zanaatkâr Büyücülerin yaratıcılıklarına karşı mücadele etmek için..." level_difficulty: "Zorluk: " +# play_as: "Play As " contact: contact_us: "CodeCombat ile İletişim" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t wizard_tab: "Sihirbaz" password_tab: "Şifre" emails_tab: "E-postalar" +# admin: "Admin" gravatar_select: "Kullanılacak Gravatar fotoğrafını seçin" gravatar_add_photos: "Burada resim olarak kullanmak için Gravatar hesabınıza buradaki e-posta adresinin aynısı olacak şekilde resim yükleyin." gravatar_add_more_photos: "Burada kullanmak üzere Gravatar hesabınıza resim yükleyin." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t new_password_verify: "Teyit Et" email_subscriptions: "E-posta Abonelikleri" email_announcements: "Duyurular" +# email_notifications: "Notifications" email_notifications_description: "Düzenli bilgilendirmelere kaydol." email_announcements_description: "CodeCombat ile ilgili son haberlere ve gelişmelere ulaşın." contributor_emails: "İştirakçi Sınıfı E-postaları" @@ -172,11 +175,14 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t reload_title: "Tüm kod yeniden yüklensin mi?" reload_really: "Bu seviyeyi en baştan yüklemek istediğinizden emin misiniz?" reload_confirm: "Tümünü Yeniden Yükle" -# victory_title_prefix: "" + victory_title_prefix: "" victory_title_suffix: "Tamamlandı " victory_sign_up: " Güncellemelere Abone Ol" victory_sign_up_poke: "Son haberleri e-postanızda görmek ister misiniz? Ücretsiz bir hesap oluşturmanız durumunda sizi bilgilendirebiliriz." victory_rate_the_level: "Seviyeyi oyla:" +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Sonraki Seviyeyi Oyna: " victory_go_home: "Anasayfaya Git" victory_review: "Daha detaylı bilgi verebilirsiniz!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t tome_available_spells: "Kullanılabilir Büyüler" hud_continue: "Devam (ÜstKarakter+Boşluk)" spell_saved: "Büyü Kaydedildi" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "Yönetici Görünümleri" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t contact_us: "bize ulaşın!" hipchat_prefix: "Bizi ayrıca" hipchat_url: "HipChat otasında bulabilirsiniz." +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "Bazı Seçenekler?" level_tab_thangs: "Nesneler" level_tab_scripts: "Betikler" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t level_components_title: "Tüm Nesneleri Geri Dön" level_components_type: "Tür" level_component_edit_title: "Bileşen Düzenle" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "Sistem Düzenle" create_system_title: "Yeni Sistem Oluştur" new_component_title: "Yeni Bileşen Oluştur" new_component_field_system: "Sistem" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "Önizleme" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t body: "Gövde" version: "Sürüm" commit_msg: "Gönderme İletisi" +# history: "History" version_history_for: "Sürüm Geçmişi: " +# result: "Result" results: "Sonuçlar" description: "Açıklama" or: "veya" email: "E-posta" +# password: "Password" message: "İleti" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "CodeCombat kimlerden oluşur?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -411,11 +454,11 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # diplomat_summary: "There is a large interest in CodeCombat in other countries that do not speak English! We are looking for translators who are willing to spend their time translating the site's corpus of words so that CodeCombat is accessible across the world as soon as possible. If you'd like to help getting CodeCombat international, then this class is for you." # diplomat_introduction_pref: "So, if there's one thing we learned from the " # diplomat_launch_url: "launch in October" -# diplomat_introduction_suf: "it's that there is sizeable interest in CodeCombat in other countries, particularly Brazil! We're building a corps of translators eager to turn one set of words into another set of words to get CodeCombat as accessible across the world as possible. If you like getting sneak peeks at upcoming content and getting these levels to your fellow nationals ASAP, then this class might be for you." +# diplomat_introduction_suf: "it's that there is sizeable interest in CodeCombat in other countries! We're building a corps of translators eager to turn one set of words into another set of words to get CodeCombat as accessible across the world as possible. If you like getting sneak peeks at upcoming content and getting these levels to your fellow nationals ASAP, then this class might be for you." # diplomat_attribute_1: "Fluency in English and the language you would like to translate to. When conveying complicated ideas, it's important to have a strong grasp in both!" -# diplomat_join_pref: "We've started a lot of initial translations at " -# diplomat_doc_url: "this forum post" -# diplomat_join_suf: "so check it out and add things for your language. Also, check this box below to keep up-to-date on new internationalization developments!" +# diplomat_join_pref_github: "Find your language locale file " +# diplomat_github_url: "on GitHub" +# diplomat_join_suf_github: ", edit it online, and submit a pull request. Also, check this box below to keep up-to-date on new internationalization developments!" # more_about_diplomat: "Learn More About Becoming a Diplomat" # diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." # ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t ambassador_title_description: "(Support)" counselor_title: "Danışman" counselor_title_description: "(Uzman/Öğretmen)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee index 3f3a375c7..57619748b 100644 --- a/app/locale/uk.coffee +++ b/app/locale/uk.coffee @@ -1,16 +1,16 @@ module.exports = nativeDescription: "українська мова", englishDescription: "Ukranian", translation: common: loading: "Завантаження..." -# saving: "Saving..." -# sending: "Sending..." -# cancel: "Cancel" -# save: "Save" -# delay_1_sec: "1 second" -# delay_3_sec: "3 seconds" -# delay_5_sec: "5 seconds" -# manual: "Manual" -# fork: "Fork" -# play: "Play" + saving: "Збереження..." + sending: "Відправлення..." + cancel: "Відміна" + save: "Зберегти" + delay_1_sec: "1 секунда" + delay_3_sec: "3 секунди" + delay_5_sec: "5 секунд" + manual: "Інструкція" + fork: "Форк" + play: "Грати" modal: close: "Закрити" @@ -31,28 +31,28 @@ module.exports = nativeDescription: "українська мова", englishDesc about: "Про нас" contact: "Контакти" twitter_follow: "Фоловити" -# employers: "Employers" + employers: "Зайняті" -# versions: -# save_version_title: "Save New Version" -# new_major_version: "New Major Version" -# cla_prefix: "To save changes, first you must agree to our" -# cla_url: "CLA" -# cla_suffix: "." -# cla_agree: "I AGREE" + versions: + save_version_title: "Зберегти нову версію" + new_major_version: "Зберегти основну версію" + cla_prefix: "Для збереження змін, спочатку треба погодитись з нашим" + cla_url: "CLA" + cla_suffix: "." + cla_agree: "Я Згоден" login: sign_up: "створити акаунт" log_in: "Увійти" -# log_out: "Log Out" + log_out: "Вийти" recover: "відновити акаунт" -# recover: -# recover_account_title: "Recover Account" -# send_password: "Send Recovery Password" + recover: + recover_account_title: "Відновити акаунт" + send_password: "Вислати пароль відновлення" signup: -# create_account_title: "Create Account to Save Progress" + create_account_title: "Створити акаунт, щоб зберегти прогрес" description: "Це безкоштовно. Просто зробіть кілька простих кроків, щоб бути готовим до гри:" email_announcements: "Отримувати анонси на email" coppa: "Ви старші 13 років або живете не в США" @@ -81,6 +81,7 @@ module.exports = nativeDescription: "українська мова", englishDesc campaign_player_created: "Рівні, створені гравцями" campaign_player_created_description: "... у яких ви сражаєтеся проти креативності ваших друзів-Архитекторів." level_difficulty: "Складність: " +# play_as: "Play As " contact: contact_us: "Зв'язатися з CodeCombat" @@ -101,14 +102,14 @@ module.exports = nativeDescription: "українська мова", englishDesc learn_more: "Узнати, як стати Дипломатом" subscribe_as_diplomat: "Записатися у Дипломати" -# wizard_settings: -# title: "Wizard Settings" -# customize_avatar: "Customize Your Avatar" -# clothes: "Clothes" + wizard_settings: + title: "Налаштування" + customize_avatar: "Налаштувати аватар" + clothes: "Одяг" # trim: "Trim" # cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" + spell: "аклинанняЗ" + boots: "Черевики" # hue: "Hue" # saturation: "Saturation" # lightness: "Lightness" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "українська мова", englishDesc wizard_tab: "Персонаж" password_tab: "Пароль" emails_tab: "Email-адреси" +# admin: "Admin" gravatar_select: "Оберіть, яке фото з Gravatar використовувати" gravatar_add_photos: "Додайте фото та зменшені зображення до акаунта Gravatar, пов'язаного з вашою email-адресою, щоб обрати зображення" gravatar_add_more_photos: "Додайти більше фото до вашого акаунта Gravatar, щоб вони були доступні тут." @@ -130,7 +132,8 @@ module.exports = nativeDescription: "українська мова", englishDesc new_password_verify: "Підтвердження паролю" email_subscriptions: "Email-підписки" email_announcements: "Оголошення" -# email_notifications_description: "Get periodic notifications for your account." +# email_notifications: "Notifications" + email_notifications_description: "Отримувати періодичні нагадування для Вашого акаунта." email_announcements_description: "Отримувати електронні листи про останні новини CodeCombat." contributor_emails: "Підписки за класами учасників" contribute_prefix: "Нам потрібні люди, які приєднаються до нашої команди! Зайдіть на " @@ -144,11 +147,11 @@ module.exports = nativeDescription: "українська мова", englishDesc account_profile: edit_settings: "Змінити налаштування" profile_for_prefix: "Профіль для " -# profile_for_suffix: "" + profile_for_suffix: "" profile: "Профіль" user_not_found: "Користувача не знайдено. Будь ласка, перевірте URL." gravatar_not_found_mine: "Ми не можемо знайти ваш профіль, пов'язаний з:" -# gravatar_not_found_email_suffix: "." + gravatar_not_found_email_suffix: "." gravatar_signup_prefix: "Зареєструйтеся на " gravatar_signup_suffix: " щоб продовжувати" gravatar_not_found_other: "Нажаль, немає профіля, що пов'язаний з електронною адресою цієї людини." @@ -172,11 +175,14 @@ module.exports = nativeDescription: "українська мова", englishDesc reload_title: "Перезавантажити весь код?" reload_really: "Ви впевнені, що хочете перезавантажити цей рівень і почати спочатку?" reload_confirm: "Перезавантажити все" -# victory_title_prefix: "" + victory_title_prefix: "" victory_title_suffix: " закінчено" victory_sign_up: "Підписатися на оновлення" victory_sign_up_poke: "Хочете отримувати останні новини на email? Створіть безкоштовний акаунт, і ми будемо тримати вас в курсі!" victory_rate_the_level: "Оцінити рівень: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Наступний рівень" victory_go_home: "На головну" victory_review: "Розкажіть нам більше!" @@ -199,19 +205,31 @@ module.exports = nativeDescription: "українська мова", englishDesc tome_select_a_thang: "Оберіть когось для " tome_available_spells: "Доступні закляття" hud_continue: "Продовжити (натисніть shift-space)" -# spell_saved: "Spell Saved" + spell_saved: "Заклинання збережено" + skip_tutorial: "Пропустити (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." -# admin: + admin: # av_title: "Admin Views" # av_entities_sub_title: "Entities" -# av_entities_users_url: "Users" + av_entities_users_url: "користувачі" # av_entities_active_instances_url: "Active Instances" -# av_other_sub_title: "Other" + av_other_sub_title: "Ынше" # av_other_debug_base_url: "Base (for debugging base.jade)" -# u_title: "User List" -# lg_title: "Latest Games" + u_title: "Список користувачів" + lg_title: "Останні ігри" -# editor: + editor: # main_title: "CodeCombat Editors" # main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" # article_title: "Article Editor" @@ -221,9 +239,11 @@ module.exports = nativeDescription: "українська мова", englishDesc # level_title: "Level Editor" # level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!" # security_notice: "Many major features in these editors are not currently enabled by default. As we improve the security of these systems, they will be made generally available. If you'd like to use these features sooner, " -# contact_us: "contact us!" -# hipchat_prefix: "You can also find us in our" + contact_us: "Зв’язатися з нами!" + hipchat_prefix: "Ви можете також знайти нас в нашому" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,40 +262,63 @@ module.exports = nativeDescription: "українська мова", englishDesc # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" # edit_article_title: "Edit Article" -# general: -# and: "and" -# name: "Name" + general: + and: "та" + name: "Ім’я" # body: "Body" -# version: "Version" + version: "Версія" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " -# results: "Results" -# description: "Description" -# or: "or" -# email: "Email" -# message: "Message" +# result: "Result" + results: "Результати" + description: "Опис" + or: "чи" + email: "Email" +# password: "Password" + message: "Повідомлення" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" -# about: -# who_is_codecombat: "Who is CodeCombat?" -# why_codecombat: "Why CodeCombat?" -# who_description_prefix: "together started CodeCombat in 2013. We also created " + about: + who_is_codecombat: "Хто є CodeCombat?" + why_codecombat: "Чому CodeCombat?" + who_description_prefix: "Взагалом розпочався CodeCombat у 2013. Ми також створили " # who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." -# who_description_ending: "Now it's time to teach people to write code." + who_description_ending: "Зараз час вчити людей писати код." # why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." # why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." # why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" # why_paragraph_3_italic: "yay a badge" # why_paragraph_3_center: "but fun like" -# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" + why_paragraph_3_italic_caps: "НІ, МАМО, Я МАЮ ПРОЙТИ РІВЕНЬ!" # why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." # why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." # why_ending: "And hey, it's free. " @@ -286,11 +329,11 @@ module.exports = nativeDescription: "українська мова", englishDesc # jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." # michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." -# legal: -# page_title: "Legal" + legal: + page_title: "Юридичні нотатки" # opensource_intro: "CodeCombat is free to play and completely open source." # opensource_description_prefix: "Check out " -# github_url: "our GitHub" + github_url: "наш GitHub" # opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " # archmage_wiki_url: "our Archmage wiki" # opensource_description_suffix: "for a list of the software that makes this game possible." @@ -389,7 +432,7 @@ module.exports = nativeDescription: "українська мова", englishDesc # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "українська мова", englishDesc # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "українська мова", englishDesc # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee index d36ce12ec..c383d2986 100644 --- a/app/locale/ur.coffee +++ b/app/locale/ur.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee index 99992f8c5..5b956e9af 100644 --- a/app/locale/vi.coffee +++ b/app/locale/vi.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." # level_difficulty: "Difficulty: " +# play_as: "Play As " # contact: # contact_us: "Contact CodeCombat" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" # or: "or" # email: "Email" +# password: "Password" # message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 13c3d3161..c1cafeeba 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -27,11 +27,11 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese admin: "管理" home: "首页" contribute: "贡献" - legal: "法律" + legal: "版权声明" about: "关于" - contact: "联系" + contact: "联系我们" twitter_follow: "关注" - employers: "雇佣我们" + employers: "招募信息" versions: save_version_title: "保存新版本" @@ -81,6 +81,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese campaign_player_created: "创建玩家" campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 技术指导." level_difficulty: "难度:" +# play_as: "Play As " contact: contact_us: "联系我们" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese wizard_tab: "巫师" password_tab: "密码" emails_tab: "邮件" +# admin: "Admin" gravatar_select: "选择使用 Gravatar 照片" gravatar_add_photos: "添加小图和照片到一个 Gravatar 账户供你选择。" gravatar_add_more_photos: "添加更多照片到你的 Gravatar 账户并查看。" @@ -130,6 +132,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese new_password_verify: "核实" email_subscriptions: "邮箱验证" email_announcements: "通知" +# email_notifications: "Notifications" email_notifications_description: "接收来自你的账户的定期通知。" email_announcements_description: "接收关于 CodeCombat 最近的新闻和发展的邮件。" contributor_emails: "贡献者通知" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese victory_sign_up: "保存进度" victory_sign_up_poke: "想保存你的代码?创建一个免费账户吧!" victory_rate_the_level: "评估关卡:" +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "下一关" victory_go_home: "返回主页" victory_review: "给我们反馈!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese tome_available_spells: "可用的法术" hud_continue: "继续(按 Shift-空格)" spell_saved: "咒语已保存" + skip_tutorial: "跳过(esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." admin: av_title: "管理员视图" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese contact_us: "联系我们!" hipchat_prefix: "你也可以在这里找到我们" hipchat_url: "HipChat 房间。" +# revert: "Revert" +# revert_models: "Revert Models" level_some_options: "有些选项?" level_tab_thangs: "物体" level_tab_scripts: "脚本" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese level_components_title: "返回到所有物体主页" level_components_type: "类型" level_component_edit_title: "编辑组件" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" level_system_edit_title: "编辑系统" create_system_title: "创建新的系统" new_component_title: "创建新的组件" new_component_field_system: "系统" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" article: edit_btn_preview: "预览" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese body: "正文" version: "版本" commit_msg: "提交信息" +# history: "History" version_history_for: "版本历史: " +# result: "Result" results: "结果" description: "描述" or: "或" email: "邮件" +# password: "Password" message: "消息" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "什么是 CodeCombat?" @@ -270,16 +313,16 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese who_description_prefix: "在2013年开始一起编写 CodeCombat。在2008年时,我们还创造" who_description_suffix: "并且发展出了首选的学习如何写中文和日文的Web和IOS应用" who_description_ending: "现在是时候教人们如何写代码了。" -# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." -# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." -# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" -# why_paragraph_3_italic: "yay a badge" -# why_paragraph_3_center: "but fun like" -# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" -# why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." -# why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." -# why_ending: "And hey, it's free. " -# why_ending_url: "Start wizarding now!" + why_paragraph_1: "当我们制作 Skritter 的时候,George 不会写程序,对于不能实现他的灵感这一点很苦恼。他试着学了学,但是那些课程都太慢了。他的室友想不再教书学习新技能,试了试 CodeAcademy,但是觉得“太无聊了。”每个星期都会有个熟人尝试 CodeAcademy,然后无一例外地放弃掉。我们发现这和 Skritter 想要解决的是一个问题:人们想要的是高速学习、充分练习,得到的却是缓慢、冗长的课程。我们知道该怎么办了。" + why_paragraph_2: "你想学编程?你不用上课。你需要的是写好多代码,并且享受这个过程。" + why_paragraph_3_prefix: "这才是编程的要义。编程必须要好玩。不是" + why_paragraph_3_italic: "哇又一个奖章诶" + why_paragraph_3_center: "那种“好玩”,而是" + why_paragraph_3_italic_caps: "不老妈,我德先把这关打完!" + why_paragraph_3_suffix: "这就是为什么 CodeCombat 是个多人游戏,而不是一个游戏化的编程课。你不停,我们就不停——但这次这是件好事。" + why_paragraph_4: "如果你一定要对游戏上瘾,那就对这个游戏上瘾,然后成为科技时代的法师吧。" + why_ending: "再说,这游戏还是免费的。" + why_ending_url: "开始学习法术吧!" # george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere." # scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one." # nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." @@ -320,63 +363,63 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese code_title: "代码 - MIT" code_description_prefix: "所有由 CodeCombat 拥有或者托管在 codecombat.com 的代码,在 GitHub 版本库或者 codecombat.com 数据库,以上许可协议都依照" mit_license_url: "MIT 许可证" -# code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels." -# art_title: "Art/Music - Creative Commons " -# art_description_prefix: "All common content is available under the" + code_description_suffix: "这包括所有 CodeCombat 公开的制作关卡用的系统和组件代码。" + art_title: "美术和音乐 - Creative Commons" + art_description_prefix: "所有共通的内容都在" # cc_license_url: "Creative Commons Attribution 4.0 International License" -# art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:" + art_description_suffix: "条款下公开。共通内容是指所有 CodeCombat 发布出来用于制作关卡的内容。这包括:" art_music: "音乐" art_sound: "声效" - art_artwork: "艺术品" - art_sprites: "小妖精" -# art_other: "Any and all other non-code creative works that are made available when creating Levels." -# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." -# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" -# use_list_1: "If used in a movie or another game, include codecombat.com in the credits." -# use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution." -# art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any." + art_artwork: "图画" + art_sprites: "精灵" + art_other: "所有制作关卡时公开的,不是代码的创造性产品。" + art_access: "目前还没有简便通用的下载素材的方式。一般来讲,从网站上使用的URL下载,或者联系我们寻找帮助。当然你也可以帮我们扩展网站,让这些资源更容易下载。" + art_paragraph_1: "关于署名,请说明并在使用处附近,或对媒体形式来说合适的地方提供一个 codecombat.com 的链接。举例:" + use_list_1: "如果是用在电影里或者其他游戏里,请在制作人员表中加入 codecombat.com 。" + use_list_2: "如果用在网站上,将链接在使用的地方附近,比如图片下面,或者一个你放置其他 Creative Commons 署名和开源软件协议的专门页面。如果你的内容明确提到关于 CodeCombat,那你就不需要额外署名。" + art_paragraph_2: "如果你使用的内容不是由 CodeCombat 制作,而是由 codecombat.com 上其他的用户制作的,那你应该给他们署名。如果相应资源的页面上有署名指示,那你应该遵循那些指示。" rights_title: "版权所有" rights_desc: "所有关卡由他们自己版权所有。这包括" rights_scripts: "脚本" rights_unit: "单元配置" rights_description: "描述" rights_writings: "作品" -# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." -# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." -# nutshell_title: "In a Nutshell" -# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." -# canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence." + rights_media: "声音、音乐以及其他专门为某个关卡制作,而不对其他关卡开放的创造性内容" + rights_clarification: "澄清:所有在关卡编辑器里公开用于制作关卡的资源都是在CC协议下发布的,而使用关卡编辑器制作,或者在关卡制作过程中上传的内容则不是。" + nutshell_title: "简而言之" + nutshell_description: "我们在关卡编辑器里公开的任何资源,你都可以在制作关卡时随意使用,但我们保留限制在 codecombat.com 之上创建的关卡本身传播的权利,因为我们以后可能决定为它们收费。" + canonical: "这篇说明的英文版本是权威版本。如果各个翻译版本之间有任何冲突,以英文版为准。" contribute: page_title: "贡献" -# character_classes_title: "Character Classes" -# introduction_desc_intro: "We have high hopes for CodeCombat." -# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, " -# introduction_desc_github_url: "CodeCombat is totally open source" -# introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours." -# introduction_desc_ending: "We hope you'll join our party!" + character_classes_title: "贡献者职业" + introduction_desc_intro: "我们对 CodeCombat 有很高的期望。" + introduction_desc_pref: "我们希望所有的程序员一起来学习和游戏,让其他人也见识到代码的美妙,并且展现出社区的最好一面。我们不能也不想独自完成这个目标:让 GitHub、Stack Overflow 和 Linux 真正伟大的是它们的用户。为了完成这个目标," + introduction_desc_github_url: "我们把 CodeCombat 完全开源" + introduction_desc_suf: ",而且我们希望提供尽可能多的方法让你来参加这个项目,与我们一起创造。" + introduction_desc_ending: "我们希望你也会加入进来!" # introduction_desc_signature: "- Nick, George, Scott, Michael, and Jeremy" -# alert_account_message_intro: "Hey there!" -# alert_account_message_pref: "To subscribe for class emails, you'll need to " -# alert_account_message_suf: "first." -# alert_account_message_create_url: "create an account" -# archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever." -# archmage_introduction: "One of the best parts about building games is they synthesize so many different things. Graphics, sound, real-time networking, social networking, and of course many of the more common aspects of programming, from low-level database management, and server administration to user facing design and interface building. There's a lot to do, and if you're an experienced programmer with a hankering to really dive into the nitty-gritty of CodeCombat, this class might be for you. We would love to have your help building the best programming game ever." -# class_attributes: "Class Attributes" -# archmage_attribute_1_pref: "Knowledge in " -# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." -# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." -# how_to_join: "How To Join" -# join_desc_1: "Anyone can help out! Just check out our " -# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " -# join_desc_3: ", or find us in our " -# join_desc_4: "and we'll go from there!" -# join_url_email: "Email us" -# join_url_hipchat: "public HipChat room" -# more_about_archmage: "Learn More About Becoming an Archmage" -# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements." -# artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to" -# artisan_summary_suf: "then this class is for you." + alert_account_message_intro: "你好!" + alert_account_message_pref: "要订阅贡献者邮件,你得先" + alert_account_message_suf: "。" + alert_account_message_create_url: "创建账号" + archmage_summary: "你对游戏图像、界面设计、数据库和服务器运营、多人在线、物理、声音、游戏引擎性能感兴趣吗?想做一个教别人编程的游戏吗?如果你有编程经验,想要开发 CodeCombat ,那就选择这个职业吧。我们会非常高兴在制作史上最好的编程游戏的过程中得到你的帮助。" + archmage_introduction: "制作游戏的时候,最令人激动人心的事情莫过于整合诸多的要素。图像、音响、实事网络交流、社交网络,以及从底层数据库管理到服务器运维,再到用户界面的设计和实现的各种编程方面。制作游戏有很多事情要做,因此如果你有编程经验,还有深入 CodeCombat 的细节中的干劲,你可能应该选择这个职业。我们会非常高兴在制作史上最好的编程游戏的过程中得到你的帮助。" + class_attributes: "职业特性" + archmage_attribute_1_pref: "了解" + archmage_attribute_1_suf: ",或者想要学习。我们的多数代码都是用它写就的。如果你喜欢 Ruby 或者 Python,那你肯定会感到很熟悉。它就是 JavaScript,但它的语法更友好。" + archmage_attribute_2: "编程经验和干劲。我们可以帮你走上正规,但恐怕没多少时间培训你。" + how_to_join: "如何加入" + join_desc_1: "谁都可以帮忙!先看看我们的" + join_desc_2: ",然后勾上下面的复选框,这样你就会作为勇敢的大法师收到我们的电邮。如果你想和开发人员聊天或者更深入地参与,可以" + join_desc_3: "或者去我们的" + join_desc_4: ",然后我们有话好说!" + join_url_email: "给我们发邮件" + join_url_hipchat: " HipChat 聊天室" + more_about_archmage: "了解成为大法师的方法" + archmage_subscribe_desc: "通过电子邮件获得新的编码机会和公告。" + artisan_summary_pref: "想要设计 CodeCombat 的关卡吗?人们玩的比我们做的快多了!现在我们的关卡编辑器还很基本,所以做起关卡来会有点麻烦,还会有bug。只要你有制作关卡的灵感,不管是简单的for循环还是" + artisan_summary_suf: "这种东西,这个职业都很适合你。" # artisan_introduction_pref: "We must construct additional levels! People be clamoring for more content, and we can only build so many ourselves. Right now your workstation is level one; our level editor is barely usable even by its creators, so be wary. If you have visions of campaigns spanning for-loops to" # artisan_introduction_suf: "then this class might be for you." # artisan_attribute_1: "Any experience in building content like this would be nice, such as using Blizzard's level editors. But not required!" @@ -387,52 +430,52 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # artisan_join_step2: "Create a new level and explore existing levels." # artisan_join_step3: "Find us in our public HipChat room for help." # artisan_join_step4: "Post your levels on the forum for feedback." -# more_about_artisan: "Learn More About Becoming an Artisan" -# artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." + more_about_artisan: "了解成为工匠的方法" + artisan_subscribe_desc: "通过电子邮件获得关卡编辑器更新和公告。" + adventurer_summary: "丑话说在前面,你就是那个挡枪子的,而且你会伤得很重。我们需要人手来测试崭新的关卡,并且提出改进意见。做一个好游戏是一个漫长的过程,没人第一次就能搞对。如果你能忍得了这些,而且身体健壮,那这个职业就是你的了。" # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." # adventurer_join_pref: "Either get together with (or recruit!) an Artisan and work with them, or check the box below to receive emails when there are new levels to test. We'll also be posting about levels to review on our networks like" # adventurer_forum_url: "our forum" # adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" -# more_about_adventurer: "Learn More About Becoming an Adventurer" -# adventurer_subscribe_desc: "Get emails when there are new levels to test." -# scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." + more_about_adventurer: "了解成为冒险家的方法" + adventurer_subscribe_desc: "通过电子邮件获得新关卡通知。" + scribe_summary_pref: "CodeCombat 不只是一堆关卡的集合,它还是玩家们编程知识的来源。这样的话,每个工匠都能链接详尽的文档,以供玩家们学习,类似于" + scribe_summary_suf: "那些。如果你喜欢解释编程概念,那这个职业适合你。" # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." # scribe_attribute_1: "Skill in words is pretty much all you need. Not only grammar and spelling, but able to convey complicated ideas to others." # contact_us_url: "Contact us" # scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!" -# more_about_scribe: "Learn More About Becoming a Scribe" -# scribe_subscribe_desc: "Get emails about article writing announcements." - diplomat_summary: "在其他国家不讲英语,很多人对于CodeCombat有很大的兴趣。我们正在寻找愿意花时间翻译网站语料库的词语的译者,这样 CodeCombat 就能尽快地遍及世界各地。如果你想帮助 CodeCombat 的国际化,那么这个类就是给你的。" - diplomat_introduction_pref: "如果有一件事情是从 " - diplomat_launch_url: "launch in October" - diplomat_introduction_suf: "学来的,Combat有相当大的兴趣在其他国家发展。我们正在构建一个译者兵团把单词一个一个的翻译,让CodeCombat尽可能地访问到世界各地。如果你喜欢偷偷地瞄一眼即将到来的内容,并让你的国民尽快学习到CodeCombat,那么这个类可能适合你。" - diplomat_attribute_1: "会流利的英语和能翻译的语言。当传递复杂思想,难得的是能很好的同时掌握这两个。" - diplomat_join_pref_github: "找到你自己的语言文件 " - diplomat_github_url: "在GitHub网站" - diplomat_join_suf_github: "在线编辑它,然后提交一个合并请求。同时,选中下面这个复选框来关注最新的国际化开发!" - more_about_diplomat: "了解更多“如何成为一名外交官(翻译者)”" + more_about_scribe: "了解成为文书的方法" + scribe_subscribe_desc: "通过电子邮件获得写作新文档的通知。" + diplomat_summary: "很多国家不说英文,但是人们对 CodeCombat 兴致很高!我们需要具有热情的翻译者,来把这个网站上的文字尽快带向全世界。如果你想帮我们走向全球,那这个职业适合你。" + diplomat_introduction_pref: "如果说我们从" + diplomat_launch_url: "十月的发布" + diplomat_introduction_suf: "中得到了什么启发:那就是全球的人对 CodeCombat 都很感兴趣。我们召集了一群翻译者,尽快地把网站上的信息翻译成各国文字。如果你对即将发布的新内容感兴趣,想让你的国家的人们玩上,就快来成为外交官吧。" + diplomat_attribute_1: "既会说流利的英语,也熟悉自己的语言。编程是一件很复杂的事情,而要翻译复杂的概念,你必须对两种语言都在行!" + diplomat_join_pref_github: "在" + diplomat_github_url: "GitHub" + diplomat_join_suf_github: "找到你的语言文件,在线编辑它,然后提交一个合并请求。同时,选中下面这个复选框来关注最新的国际化开发!" + more_about_diplomat: "了解成为外交官的方法" diplomat_subscribe_desc: "接受有关国际化开发和翻译情况的邮件" -# ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you." + ambassador_summary: "我们要建立一个社区,而当社区遇到麻烦的时候,就要支持人员出场了。我们运用 IRC、电邮、社交网站等多种平台帮助玩家熟悉游戏。如果你想帮人们参与进来,学习编程,然后玩的开心,那这个职业属于你。" # ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." # ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" # ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" # ambassador_join_note_strong: "Note" # ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" -# more_about_ambassador: "Learn More About Becoming an Ambassador" -# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." -# counselor_summary: "None of the above roles fit what you are interested in? Do not worry, we are on the lookout for anybody who wants a hand in the development of CodeCombat! If you are interested in teaching, game development, open source management, or anything else that you think will be relevant to us, then this class is for you." -# counselor_introduction_1: "Do you have life experience? A different perspective on things that can help us decide how to shape CodeCombat? Of all these roles, this will probably take the least time, but individually you may make the most difference. We're on the lookout for wisened sages, particularly in areas like: teaching, game development, open source project management, technical recruiting, entrepreneurship, or design." -# counselor_introduction_2: "Or really anything that is relevant to the development of CodeCombat. If you have knowledge and want to share it to help grow this project, then this class might be for you." -# counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful." -# counselor_attribute_2: "A little bit of free time!" -# counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)." -# more_about_counselor: "Learn More About Becoming a Counselor" + more_about_ambassador: "了解成为使节的方法" + ambassador_subscribe_desc: "通过电子邮件获得支持系统的现状,以及多人游戏方面的新进展。" + counselor_summary: "以上的职业都不适合你?没关系,我们欢迎每一个想参与 CodeCombat 开发的人!如果你熟悉教学、游戏开发、开源管理,或者任何你觉得和我们有关的方面,那这个职业属于你。" + counselor_introduction_1: "也许你有人生的经验,也许你对 CodeCombat 的发展有独特的观点。在所有这些角色中,这个角色花费的时间可能最少,但作为个人你的价值却最高。我们在寻找各方面的贤人,尤其是在教学、游戏开发、开源软件管理、技术企业招聘、创业或者设计方面的。" + counselor_introduction_2: "任何和 CodeCombat 的开发有关系的又可以。如果你有知识,并且希望分享给我们,帮这个项目成长,那这个职业属于你。" + counselor_attribute_1: "经验。上述的任何领域,或者你认为对我们有帮助的领域。" + counselor_attribute_2: "一点用来谈笑风生的时间!" + counselor_join_desc: ",向我们介绍以下你自己:你做过什么、对什么有兴趣。当我们需要你的建议的时候,我们会联系你的(不会很经常)。" + more_about_counselor: "了解成为顾问的方式" changes_auto_save: "在您切换复选框时,更改将自动保存。" diligent_scribes: "我们勤奋的文书:" powerful_archmages: "我们强力的大法师:" @@ -456,3 +499,35 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese ambassador_title_description: "(用户支持人员)" counselor_title: "顾问" counselor_title_description: "(专家/导师)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee index aad8bbbf9..2ed2ed41f 100644 --- a/app/locale/zh-HANT.coffee +++ b/app/locale/zh-HANT.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese campaign_player_created: "玩家建立的關卡" campaign_player_created_description: "...挑戰同伴的創意 技術指導." level_difficulty: "難度" +# play_as: "Play As " contact: contact_us: "聯繫我們" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese wizard_tab: "巫師" password_tab: "密碼" emails_tab: "郵件" +# admin: "Admin" gravatar_select: "選擇一個Gravatar" gravatar_add_photos: "上傳頭像到Gravatar" # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese new_password_verify: "確認密碼" email_subscriptions: "訂閱" email_announcements: "通知" +# email_notifications: "Notifications" email_notifications_description: "接收帳號通知" email_announcements_description: "接收關於 CodeCombat 的新聞和開發消息。" contributor_emails: "貢獻者電郵" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese victory_sign_up: "保存進度" victory_sign_up_poke: "想保存你的程式碼?建立一個免費帳號吧!" victory_rate_the_level: "評估關卡: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "下一關" victory_go_home: "返回首頁" victory_review: "給我們回饋!" @@ -200,6 +206,18 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese tome_available_spells: "可用的法術" hud_continue: "繼續 (按 shift-空格)" spell_saved: "咒語已儲存" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "或" # email: "Email" +# password: "Password" message: "訊息" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" about: who_is_codecombat: "什麼是CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/locale/zh.coffee b/app/locale/zh.coffee index f0afbd64b..6847da6ed 100644 --- a/app/locale/zh.coffee +++ b/app/locale/zh.coffee @@ -81,6 +81,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # campaign_player_created: "Player-Created" # campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards." level_difficulty: "难度" +# play_as: "Play As " contact: contact_us: "联系我们" @@ -122,6 +123,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # wizard_tab: "Wizard" # password_tab: "Password" # emails_tab: "Emails" +# admin: "Admin" # gravatar_select: "Select which Gravatar photo to use" # gravatar_add_photos: "Add thumbnails and photos to a Gravatar account for your email to choose an image." # gravatar_add_more_photos: "Add more photos to your Gravatar account to access them here." @@ -130,6 +132,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # new_password_verify: "Verify" # email_subscriptions: "Email Subscriptions" # email_announcements: "Announcements" +# email_notifications: "Notifications" # email_notifications_description: "Get periodic notifications for your account." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # contributor_emails: "Contributor Class Emails" @@ -177,6 +180,9 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # victory_sign_up: "Sign Up to Save Progress" # victory_sign_up_poke: "Want to save your code? Create a free account!" # victory_rate_the_level: "Rate the level: " +# victory_rank_my_game: "Rank My Game" +# victory_ranking_game: "Submitting..." +# victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # victory_go_home: "Go Home" # victory_review: "Tell us more!" @@ -198,8 +204,20 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # tome_select_spell: "Select a Spell" # tome_select_a_thang: "Select Someone for " # tome_available_spells: "Available Spells" -# hud_continue: "Continue (press shift-space)" +# hud_continue: "Continue (shift+space)" # spell_saved: "Spell Saved" +# skip_tutorial: "Skip (esc)" +# editor_config: "Editor Config" +# editor_config_title: "Editor Configuration" +# editor_config_keybindings_label: "Key Bindings" +# editor_config_keybindings_default: "Default (Ace)" +# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." # admin: # av_title: "Admin Views" @@ -224,6 +242,8 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # contact_us: "contact us!" # hipchat_prefix: "You can also find us in our" # hipchat_url: "HipChat room." +# revert: "Revert" +# revert_models: "Revert Models" # level_some_options: "Some Options?" # level_tab_thangs: "Thangs" # level_tab_scripts: "Scripts" @@ -242,10 +262,18 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # level_components_title: "Back to All Thangs" # level_components_type: "Type" # level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" # level_system_edit_title: "Edit System" # create_system_title: "Create New System" # new_component_title: "Create New Component" # new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" # article: # edit_btn_preview: "Preview" @@ -257,12 +285,27 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # body: "Body" # version: "Version" # commit_msg: "Commit Message" +# history: "History" # version_history_for: "Version History for: " +# result: "Result" # results: "Results" # description: "Description" or: "或" email: "邮箱" +# password: "Password" message: "留言" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" # about: # who_is_codecombat: "Who is CodeCombat?" @@ -389,7 +432,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # artisan_join_step4: "Post your levels on the forum for feedback." # more_about_artisan: "Learn More About Becoming an Artisan" # artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." +# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." # adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." # adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." # adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." @@ -399,7 +442,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # more_about_adventurer: "Learn More About Becoming an Adventurer" # adventurer_subscribe_desc: "Get emails when there are new levels to test." # scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " -# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." +# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." # scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " # scribe_introduction_url_mozilla: "Mozilla Developer Network" # scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." @@ -456,3 +499,35 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra # ambassador_title_description: "(Support)" # counselor_title: "Counselor" # counselor_title_description: "(Expert/Teacher)" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulate_games: "Simulate Games!" +# simulate_all: "RESET AND SIMULATE GAMES" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." +# no_ranked_matches_pre: "No ranked matches for the " +# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." +# choose_opponent: "Choose an Opponent" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple AI" +# warmup: "Warmup" +# vs: "VS" diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index f4551b904..834dbe061 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -16,13 +16,15 @@ class CocoModel extends Backbone.Model initialize: -> super() + @constructor.schema ?= new CocoSchema(@urlRoot) if not @constructor.className console.error("#{@} needs a className set.") @markToRevert() if @constructor.schema?.loaded @addSchemaDefaults() else - @loadSchema() + {me} = require 'lib/auth' + @loadSchema() if me?.loaded @once 'sync', @onLoaded, @ @saveBackup = _.debounce(@saveBackup, 500) @@ -51,10 +53,8 @@ class CocoModel extends Backbone.Model @backedUp = {} loadSchema: -> - unless @constructor.schema - @constructor.schema = new CocoSchema(@urlRoot) - @constructor.schema.fetch() - + return if @constructor.schema.loading + @constructor.schema.fetch() @constructor.schema.once 'sync', => @constructor.schema.loaded = true @addSchemaDefaults() @@ -81,8 +81,9 @@ class CocoModel extends Backbone.Model return super attrs, options fetch: -> - super(arguments...) + res = super(arguments...) @loading = true + res markToRevert: -> @_revertAttributes = _.clone @attributes @@ -151,7 +152,7 @@ class CocoModel extends Backbone.Model return null unless schema.links? linkObject = _.find schema.links, rel: "db" return null unless linkObject - return null if linkObject.href.match("thang_type") and not @isObjectID(data) # Skip loading hardcoded Thang Types for now (TODO) + return null if linkObject.href.match("thang.type") and not @isObjectID(data) # Skip loading hardcoded Thang Types for now (TODO) # not fully extensible, but we can worry about that later link = linkObject.href @@ -184,4 +185,25 @@ class CocoModel extends Backbone.Model @isObjectID: (s) -> s.length is 24 and s.match(/[a-z0-9]/gi)?.length is 24 + hasReadAccess: (actor) -> + # actor is a User object + + if @get('permissions')? + for permission in @get('permissions') + if permission.target is 'public' or actor.get('_id') is permission.target + return true if permission.access in ['owner', 'read'] + + return false + + hasWriteAccess: (actor) -> + # actor is a User object + + if @get('permissions')? + for permission in @get('permissions') + if permission.target is 'public' or actor.get('_id') is permission.target + return true if permission.access in ['owner', 'write'] + + return false + + module.exports = CocoModel diff --git a/app/models/Level.coffee b/app/models/Level.coffee index cb82d325a..7832c329a 100644 --- a/app/models/Level.coffee +++ b/app/models/Level.coffee @@ -52,13 +52,14 @@ module.exports = class Level extends CocoModel visit = (c) -> return if c in sorted lc = _.find levelComponents, {original: c.original} - console.error "Couldn't find lc for", c unless lc + console.error thang.id, "couldn't find lc for", c unless lc if lc.name is "Programmable" # Programmable always comes last visit c2 for c2 in _.without thang.components, c else for d in lc.dependencies or [] c2 = _.find thang.components, {original: d.original} + console.error thang.id, "couldn't find dependent Component", d.original, "from", lc.name unless c2 visit c2 if lc.name is "Collides" allied = _.find levelComponents, {name: "Allied"} @@ -111,19 +112,9 @@ module.exports = class Level extends CocoModel if path.match(/\/systems\/\d+\/config\//) and data?.indieSprites?.length # Ugh, we need to make sure we grab the IndieSprite ThangTypes for indieSprite in data.indieSprites - link = "/db/thang_type/#{indieSprite.thangType}/version" + link = "/db/thang.type/#{indieSprite.thangType}/version" model = CocoModel.getOrMakeModelFromLink link, shouldLoadProjection models.push model if model else if path is '/' - # We also we need to make sure we grab the Wizard ThangType and the Marks. Hackitrooooid! - for [type, original] in [ - ["Wizard", "52a00d55cf1818f2be00000b"] - ["Highlight", "529f8fdbdacd325127000003"] - ["Selection", "52aa5f7520fccb0000000002"] - ["Target", "52b32ad97385ec3d03000001"] - ["Repair", "52bcc4591f766a891c000003"] - ] - link = "/db/thang_type/#{original}/version" - model = CocoModel.getOrMakeModelFromLink link, shouldLoadProjection - models.push model if model + models.push ThangType.loadUniversalWizard() models diff --git a/app/models/SuperModel.coffee b/app/models/SuperModel.coffee index 36a7fab72..9ce14c75d 100644 --- a/app/models/SuperModel.coffee +++ b/app/models/SuperModel.coffee @@ -2,6 +2,7 @@ class SuperModel constructor: -> @models = {} @collections = {} + @schemas = {} _.extend(@, Backbone.Events) populateModel: (model) -> @@ -25,8 +26,11 @@ class SuperModel @removeEventsFromModel(model) modelLoaded: (model) -> + model.loadSchema() schema = model.schema() - return schema.once('sync', => @modelLoaded(model)) unless schema.loaded + unless schema.loaded + @schemas[schema.urlRoot] = schema + return schema.once('sync', => @modelLoaded(model)) refs = model.getReferencedModels(model.attributes, schema.attributes, '/', @shouldLoadProjection) refs = [] unless @mustPopulate is model or @shouldPopulate(model) # console.log 'Loaded', model.get('name') @@ -96,9 +100,12 @@ class SuperModel total = 0 loaded = 0 - for key, model of @models + for model in _.values @models total += 1 loaded += 1 if model.loaded + for schema in _.values @schemas + total += 1 + loaded += 1 if schema.loaded return 1.0 unless total return loaded / total diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee index 6aaff80a5..bfd501adf 100644 --- a/app/models/ThangType.coffee +++ b/app/models/ThangType.coffee @@ -1,6 +1,8 @@ CocoModel = require('./CocoModel') SpriteBuilder = require 'lib/sprites/SpriteBuilder' +buildQueue = [] + module.exports = class ThangType extends CocoModel @className: "ThangType" urlRoot: "/db/thang.type" @@ -136,7 +138,8 @@ module.exports = class ThangType extends CocoModel key = @spriteSheetKey(@options) spriteSheet = null if @options.async - @builder.buildAsync() + buildQueue.push @builder + @builder.buildAsync() unless buildQueue.length > 1 @builder.on 'complete', @onBuildSpriteSheetComplete, @, true, key return true console.warn 'Building', @get('name'), @options, 'and blocking the main thread.' @@ -146,6 +149,8 @@ module.exports = class ThangType extends CocoModel spriteSheet onBuildSpriteSheetComplete: (e, key) -> + buildQueue = buildQueue.slice(1) + buildQueue[0]?.buildAsync() @spriteSheets[key] = e.target.spriteSheet delete @building[key] @trigger 'build-complete' @@ -157,7 +162,8 @@ module.exports = class ThangType extends CocoModel for groupName, config of options.colorConfig or {} colorConfigs.push "#{groupName}:#{config.hue}|#{config.saturation}|#{config.lightness}" colorConfigs = colorConfigs.join ',' - "#{@get('name')} - #{options.resolutionFactor} - #{colorConfigs}" + portraitOnly = !!options.portraitOnly + "#{@get('name')} - #{options.resolutionFactor} - #{colorConfigs} - #{portraitOnly}" getPortraitImage: (spriteOptionsOrKey, size=100) -> src = @getPortraitSource(spriteOptionsOrKey, size) @@ -172,7 +178,10 @@ module.exports = class ThangType extends CocoModel key = spriteOptionsOrKey key = if _.isString(key) then key else @spriteSheetKey(@fillOptions(key)) spriteSheet = @spriteSheets[key] - spriteSheet ?= @buildSpriteSheet({portraitOnly:true}) + if not spriteSheet + options = if _.isPlainObject spriteOptionsOrKey then spriteOptionsOrKey else {} + options.portraitOnly = true + spriteSheet = @buildSpriteSheet(options) return unless spriteSheet canvas = $("") stage = new createjs.Stage(canvas[0]) @@ -210,3 +219,12 @@ module.exports = class ThangType extends CocoModel onFileUploaded: => console.log 'Image uploaded' + + @loadUniversalWizard: -> + return @wizardType if @wizardType + wizOriginal = "52a00d55cf1818f2be00000b" + url = "/db/thang.type/#{wizOriginal}/version" + @wizardType = new module.exports() + @wizardType.url = -> url + @wizardType.fetch() + @wizardType diff --git a/app/styles/base.sass b/app/styles/base.sass index 58a8c7a13..166fd23e3 100644 --- a/app/styles/base.sass +++ b/app/styles/base.sass @@ -4,6 +4,10 @@ html background-color: #2f261d +html, body + // For level loading view wings + overflow-x: hidden + // https://github.com/twbs/bootstrap/issues/9237 -- need a version that's not !important .secret display: none @@ -12,6 +16,7 @@ h1 h2 h3 h4 letter-spacing: 2px .main-content-area + box-shadow: 0px 0px 10px position: relative width: 1024px margin: 56px auto 0 @@ -22,6 +27,9 @@ h1 h2 h3 h4 #outer-content-wrapper background: #8cc63f url(/images/pages/base/repeat-tile.png) top center +#intermediate-content-wrapper + background: url(/images/pages/base/sky_repeater.png) repeat-x + #inner-content-wrapper background: url(/images/pages/base/background_texture.png) top center no-repeat @@ -45,7 +53,8 @@ h1 h2 h3 h4 background-color: #2f261d p margin: 0 - padding-top: 25px + padding-top: 10px + padding-bottom: 10px text-align: center .mixpanel-badge, .firebase-badge @@ -67,7 +76,7 @@ a[data-toggle="modal"] cursor: pointer .share-buttons, .partner-badges - margin-top: 10px + padding-bottom: 10px text-align: center @include opacity(0.75) @@ -179,3 +188,6 @@ table.table border: 1px solid black .ui-slider-handle border: 1px solid black !important + +.flag-cursor + cursor: crosshair diff --git a/app/styles/kinds/search.sass b/app/styles/kinds/search.sass index 4829e88fa..872d346ee 100644 --- a/app/styles/kinds/search.sass +++ b/app/styles/kinds/search.sass @@ -3,6 +3,11 @@ a.open-modal-button float: right + input#search + width: 190px + height: 30px + padding-left: 5px + table.table background-color: white .body-row diff --git a/app/styles/not_found.sass b/app/styles/not_found.sass new file mode 100644 index 000000000..677900b6d --- /dev/null +++ b/app/styles/not_found.sass @@ -0,0 +1,9 @@ +@import "bootstrap/mixins" +@import "bootstrap/variables" + +#not-found-view + + .not-found-image + display: block + margin-left: auto + margin-right: auto diff --git a/app/styles/play/ladder.sass b/app/styles/play/ladder.sass index 027e755db..fc9bc6abc 100644 --- a/app/styles/play/ladder.sass +++ b/app/styles/play/ladder.sass @@ -1,4 +1,10 @@ #ladder-view + h1 + text-align: center + + .tab-pane + margin-top: 10px + .score-cell width: 50px @@ -6,19 +12,19 @@ margin-bottom: 10px background-image: none - .intro-button - width: 45% - margin: 0 2.5% - - #simulation-status-text - display: inline - margin-left: 10px - .name-col-cell max-width: 300px text-overflow: ellipsis white-space: nowrap overflow: hidden + tr.stale + opacity: 0.5 + + tr.win .state-cell + color: #172 + tr.loss .state-cell + color: #712 + #must-log-in button - margin-right: 10px \ No newline at end of file + margin-right: 10px diff --git a/app/styles/play/ladder/play_modal.sass b/app/styles/play/ladder/play_modal.sass new file mode 100644 index 000000000..465052114 --- /dev/null +++ b/app/styles/play/ladder/play_modal.sass @@ -0,0 +1,148 @@ +#ladder-play-modal + #noob-view p + font-size: 30px + + #skip-tutorial-button + font-size: 16px + + .tutorial-suggestion + text-align: center + font-size: 18px + margin: 10px 0 30px + + .play-option + margin-bottom: 15px + width: 100% + height: 100px + overflow: hidden + background: white + border: 1px solid #333 + position: relative + + -webkit-transition: opacity 0.3s ease-in-out + -moz-transition: opacity 0.3s ease-in-out + -ms-transition: opacity 0.3s ease-in-out + -o-transition: opacity 0.3s ease-in-out + transition: opacity 0.3s ease-in-out + + opacity: 0.4 + + border-radius: 5px + .only-one + -webkit-transition: opacity 0.3s ease-in-out + -moz-transition: opacity 0.3s ease-in-out + -ms-transition: opacity 0.3s ease-in-out + -o-transition: opacity 0.3s ease-in-out + transition: opacity 0.3s ease-in-out + opacity: 0 + + .play-option:hover + opacity: 1 + .only-one + opacity: 1 + + .my-icon + position: relative + left: 0 + top: -10px + z-index: 1 + + .my-team-icon + height: 60px + position: relative + top: -10px + left: 10px + z-index: 0 + + .opponent-team-icon + height: 60px + position: relative + top: 10px + right: 10px + z-index: 0 + float: right + -moz-transform: scaleX(-1) + -o-transform: scaleX(-1) + -webkit-transform: scaleX(-1) + transform: scaleX(-1) + filter: FlipH + -ms-filter: "FlipH" + + .opponent-icon + position: relative + float: right + right: 0 + top: -10px + -moz-transform: scaleX(-1) + -o-transform: scaleX(-1) + -webkit-transform: scaleX(-1) + transform: scaleX(-1) + filter: FlipH + -ms-filter: "FlipH" + z-index: 1 + + .name-label + border-bottom: 20px solid lightslategray + height: 0 + width: 40% + position: absolute + bottom: 0 + color: black + font-weight: bold + text-align: center + z-index: 2 + + span + position: relative + top: 1px + + .my-name + border-right: 15px solid transparent + left: 0 + span + left: 3px + + .opponent-name + border-left: 15px solid transparent + right: 0 + //text-align: right + span + right: 3px + + .difficulty + border-top: 25px solid darkgray + border-left: 20px solid transparent + border-right: 20px solid transparent + height: 0 + width: 30% + position: absolute + left: 35% + top: 0 + color: black + text-align: center + font-size: 18px + font-weight: bold + + span + position: relative + top: -25px + + .easy-option .difficulty + border-top: 25px solid limegreen + + .medium-option .difficulty + border-top: 25px solid darkorange + + .hard-option .difficulty + border-top: 25px solid black + color: white + + .vs + position: absolute + left: 40% + right: 40% + text-align: center + top: 35px + font-size: 40px + font-weight: bolder + color: black \ No newline at end of file diff --git a/app/styles/play/ladder/team.sass b/app/styles/play/ladder/team.sass deleted file mode 100644 index ca4cc9676..000000000 --- a/app/styles/play/ladder/team.sass +++ /dev/null @@ -1,12 +0,0 @@ -#ladder-team-view - #rank-button - margin-top: 15px - - #competitors-column .well - font-size: 18px - padding: 7px - - #your-score - margin-top: 20px - text-align: center - font-size: 20px \ No newline at end of file diff --git a/app/styles/play/level.sass b/app/styles/play/level.sass index fb93d93a1..d051e9f43 100644 --- a/app/styles/play/level.sass +++ b/app/styles/play/level.sass @@ -18,8 +18,6 @@ display: block z-index: 1 - - //max-width: 1680px // guideline, but for now let's let it stretch out min-width: 1024px position: relative diff --git a/app/styles/play/level/hud.sass b/app/styles/play/level/hud.sass index 7858f0365..b508a3158 100644 --- a/app/styles/play/level/hud.sass +++ b/app/styles/play/level/hud.sass @@ -95,14 +95,38 @@ height: 100px @include user-select(text) - .prop - img - margin-right: 5px - width: 16px - height: 16px - + &.nonexistent + visibility: hidden + .text-prop width: 50% + + .prop-label-icon + $iconSize: 16px + display: inline-block + width: $iconSize + height: $iconSize + margin-right: 5px + background: transparent url(/images/level/hud_info_icons.png) no-repeat + background-size: auto $iconSize + float: left + + &.prop-label-icon-pos + background-position-x: -1 * $iconSize + &.prop-label-icon-target + background-position-x: -2 * $iconSize + &.prop-label-icon-inventory + background-position-x: -3 * $iconSize + &.prop-label-icon-visualRange + background-position-x: -4 * $iconSize + &.prop-label-icon-attackDamage + background-position-x: -5 * $iconSize + &.prop-label-icon-attackRange + background-position-x: -6 * $iconSize + &.prop-label-icon-maxSpeed + background-position-x: -7 * $iconSize + &.prop-label-icon-gold + background-position-x: -8 * $iconSize .prop-value.bar-prop width: 100px @@ -187,11 +211,11 @@ height: 19px div - @include box-sizing(border-box) + border-radius: 1px background-color: #6BA1C8 height: 100% - border-bottom: 2px groove #201B15 - border-right: 1px solid #201B15 + border-bottom: 2px groove darken(#6BA1C8, 30%) + border-right: 1px solid darken(#6BA1C8, 10%) position: absolute top: 0 @@ -230,10 +254,7 @@ .hud-hint font-weight: normal - color: #aaa - position: absolute - top: 0 - right: 4px + color: #999 .enter position: absolute diff --git a/app/styles/play/level/loading.sass b/app/styles/play/level/loading.sass new file mode 100644 index 000000000..71ec1b424 --- /dev/null +++ b/app/styles/play/level/loading.sass @@ -0,0 +1,66 @@ +@import "app/styles/bootstrap/mixins" +@import "app/styles/mixins" + +@mixin sky-background($url: '', $backgroundPosition: left) + $top: #95D9EF + $mid: #FFFFFF + $bot: #8EC643 + $stop: 99.6% + background: $mid + background-image: url($url) // fallback + background-image: url($url), -webkit-linear-gradient(top, $top, $mid $stop, $bot) + background-image: url($url), -ms-linear-gradient(top, $top, $mid $stop, $bot) + background-image: url($url), linear-gradient(to bottom, $top, $mid $stop, $bot) + background-repeat: no-repeat + background-position: top $backgroundPosition + background-size: contain + +#level-loading-view + color: blue + width: 100% + height: 100% + position: absolute + z-index: 20 + $UNVEIL_TIME: 1.2s + pointer-events: none + + .loading-details + position: absolute + top: 20px + left: 50% + $WIDTH: 1000px + width: $WIDTH + margin-left: (-$WIDTH / 2) + z-index: 100 + background-color: rgba(220, 255, 230, 0.5) + border-radius: 30px + padding: 10px + text-align: center + // http://matthewlein.com/ceaser/ Bounce down a bit, then snap up. + -webkit-transition: top $UNVEIL_TIME cubic-bezier(0.285, 0, 0.670, 0) + -webkit-transition: top $UNVEIL_TIME cubic-bezier(0.285, -0.595, 0.670, -0.600) + -moz-transition: top $UNVEIL_TIME cubic-bezier(0.285, -0.595, 0.670, -0.600) + -o-transition: top $UNVEIL_TIME cubic-bezier(0.285, -0.595, 0.670, -0.600) + transition: top $UNVEIL_TIME cubic-bezier(0.285, -0.595, 0.670, -0.600) + + .load-progress + width: 100% + + .progress-bar + width: 1% + transition-duration: 1.2s + + .left-wing, .right-wing + width: 100% + height: 100% + position: absolute + + .left-wing + @include sky-background('/images/level/loading_left_wing.png', right) + left: -50% + transition: all $UNVEIL_TIME ease + + .right-wing + @include sky-background('/images/level/loading_right_wing.png', left) + right: -50% + transition: all $UNVEIL_TIME ease diff --git a/app/styles/play/level/modal/editor_config.sass b/app/styles/play/level/modal/editor_config.sass new file mode 100644 index 000000000..1d97d3965 --- /dev/null +++ b/app/styles/play/level/modal/editor_config.sass @@ -0,0 +1,12 @@ +#level-editor-config-modal + .select-group + display: block + min-height: 20px + margin-top: 10px + margin-bottom: 10px + padding-left: 20px + vertical-align: middle + + label + font-weight: normal + margin-right: 20px \ No newline at end of file diff --git a/app/styles/play/level/modal/victory.sass b/app/styles/play/level/modal/victory.sass index 5e2b9e727..1dc9221f5 100644 --- a/app/styles/play/level/modal/victory.sass +++ b/app/styles/play/level/modal/victory.sass @@ -1,25 +1,35 @@ #level-victory-modal + .victory-banner + float: right + width: 150px + position: relative + + .modal-footer + clear: both + padding-top: 15px + p.sign-up-poke text-align: left margin-bottom: 10px - - .sign-up-button - margin-left: 20px - - .next-level-button - margin-bottom: 10px - margin-right: 30px - float: right + .sign-up-button + float: right + margin-left: 10px + + .next-level-button + float: right + margin-left: 10px + .rating - float: center - margin-right: 22% + float: left + position: relative + top: 5px span margin-right: 5px i cursor: pointer padding: 2px - + .review margin-top: 5px width: 100% @@ -31,23 +41,10 @@ width: 100% height: 80px box-sizing: border-box - + .share-buttons + padding-top: 15px clear: both .modal-header - text-align: left - - .victory-banner - width: 450px - position: absolute - left: -150px - - .modal-dialog - margin-left: 30% - padding-left: 300px - width: 700px - - .modal-footer - margin: 0px - padding: 0px + text-align: center diff --git a/app/styles/play/level/tome/spell.sass b/app/styles/play/level/tome/spell.sass index 9066b4af5..5e480661c 100644 --- a/app/styles/play/level/tome/spell.sass +++ b/app/styles/play/level/tome/spell.sass @@ -58,7 +58,7 @@ @include opacity(80) .ace_cursor @include opacity(20) - + .ace_gutter background-color: rgba(255, 255, 255, 0.25) width: 40px @@ -73,9 +73,10 @@ .executing, .executed, .problem-marker-info, .problem-marker-warning, .problem-marker-error position: absolute .executing - background-color: rgba(216, 255, 255, 0.85) + background-color: rgba(50, 255, 80, 0.35) + @include gradient-striped() .executed - background-color: rgba(245, 255, 6, 0.18) + background-color: rgba(110, 110, 110, 0.12) .problem-marker-info background-color: rgba(196, 163, 184, 0.25) .problem-marker-warning @@ -83,11 +84,21 @@ .problem-marker-error background-color: rgba(110, 45, 27, 0.25) - .ace_gutter-cell.executing:not(.ace_error) + .executing:not(.ace_gutter-cell) + background-size: 40px 40px + text-shadow: 1px 1px 1px #000 + @include animation(progress-bar-stripes 2s linear infinite) + + .ace_gutter-cell.executing:not(.ace_error):not(.ace_warning):not(.ace_info) margin-left: 1px background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMjgwMTE3NDA3MjA2ODExOEE2REU4Q0M1MTM1MkIxRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBQjVEQUNDMzQ4RUIxMUUxOEVGRUUyNzFENDM3RDVFMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBQjVEQUNDMjQ4RUIxMUUxOEVGRUUyNzFENDM3RDVFMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTU1MjE3RDIzMTIwNjgxMThEQkI4NTlBMjQ1QTEwOTUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4MDExNzQwNzIwNjgxMThBNkRFOENDNTEzNTJCMUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7SazaGAAAAiElEQVR42mL8//8/AzUBEwOVweA3kAWboI2jCyhgDwBx4ZH9ey5Qy4UOQHweaHg/EAtQ08sFUIMDqBmGCkC8HmgoCCtQM1ICoK5toGYsg8KzHmjo+UGbDj8AcSMwORkSnQ7xgA3QtPmApISNBTyAGrSBGl6eAMSGxBhGyIVkZT3G0fKQYgAQYACL+C2ZM6PC7AAAAABJRU5ErkJggg==) background-position: 0px center + .ace_gutter-cell.executed:not(.ace_error):not(.ace_warning):not(.ace_info) + margin-left: 1px + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANhJREFUeNpi/P//PwM1ARMDlcHgMrA428MAiANQBEFhSA4uynIXAOJ+dHFKXDgfiDdSxctAbzYAqQ+9U3ccQJdjIcMwByCVD8SGFEcK0DAFILUeiCcCXfeAIgOBhglADfsAxBNwqSPFy/1AbADEiUDXfSApHQJdcx+I9yPxE4AUCB8AGrYAn62M6HkZ6rX3UG4jEG8A4vNQviO2mMXrQqh3GqHcemi4gcACQobhixRQoMNiUQEaEY1k52WoKwuRhHAmE6KTDdCADdDwu4AvmRCMlOFfwAIEGAD4On+N4aXlhgAAAABJRU5ErkJggg==) + background-position: 0px center + .ace_gutter-cell.comment-line background-position: 0px center background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIJJREFUeNpiTF9y4j0DA4MAA5mAiRLNIMACY8yMsWAkRSPQ5Q1Aqp6JgUIwagAVDGAERsd/LOKGwGi9AJRLALL78aUVRhwp0RGIHUDxTNAFaIljP1TjBSA2gAofAOJAoIs+4E2JaACmeQFQYyK5gdhISDM2F3yA4kKg5gXExAJAgAEACuQiMh7vH10AAAAASUVORK5CYII=) @@ -102,5 +113,3 @@ .ace_text-layer .ace_comment color: darken(rgb(103, 164, 200), 5%) - - diff --git a/app/styles/play/level/tome/spell_debug.sass b/app/styles/play/level/tome/spell_debug.sass index d0f97a28f..e02326b55 100644 --- a/app/styles/play/level/tome/spell_debug.sass +++ b/app/styles/play/level/tome/spell_debug.sass @@ -3,6 +3,7 @@ .spell-debug-view position: absolute z-index: 9001 + min-width: 250px max-width: 400px padding: 10px background: transparent url(/images/level/popover_background.png) diff --git a/app/styles/play/spectate.sass b/app/styles/play/spectate.sass new file mode 100644 index 000000000..f04075b79 --- /dev/null +++ b/app/styles/play/spectate.sass @@ -0,0 +1,176 @@ +@import "app/styles/bootstrap/mixins" +@import "app/styles/mixins" + +#spectate-level-view + #playback-view + width: 100% + #restart-button + display: none + #multiplayer-button + display: none + #docs-button + display: none + + #control-bar-view + width: 100% + + .title + position: absolute + display: inline-block + margin-left: 50% + right: 0 + color: #BEBEBE + line-height: 15px + left: 0 + + max-width: 1920px + margin: 0 auto + @include user-select(none) + + #level-loading-view + max-height: 1284px + + .level-content + position: relative + margin: 0px auto + + #canvas-wrapper + height: 100% + position: relative + margin: 0 auto + + canvas#surface + background-color: #ddd + max-height: 93% + max-height: -webkit-calc(100% - 60px) + max-height: calc(100% - 60px) + height: auto + max-width: 100% + display: block + z-index: 1 + margin: 0 auto + + + min-width: 1024px + position: relative + #thang-hud + margin: 0 auto + display: none + + + #pointer + position: absolute + left: 0 + top: 0 + height: 100px + opacity: 0.0 + pointer-events: none + z-index: 10 + + // Level Docs + .ui-effects-transfer + border: 2px dotted gray + + .modal + img + float: right + + img.diagram + float: none + + #multiplayer-join-link + font-size: 12px + + #level-done-button + position: absolute + right: 46% + top: 43px + @include box-shadow(4px 4px 15px black) + + // Custom Buttons + .btn.banner + @include banner-button(#FFF, #333) + @include box-shadow(2px 2px 2px rgba(0, 0, 0, 0.5)) + border: 1px solid black + text-shadow: none + + $buttonConfig: 'primary' #6CA8EA, 'info' #71AACC, 'success' #90B236, 'warning' #CD6800, 'danger' #B43C20, 'inverse' #3A537F + @each $tuple in $buttonConfig + &.btn-#{nth($tuple, 1)} + @include banner-button(nth($tuple, 2), #FFF) + + .footer .footer-link-text a + @include opacity(0.75) + @include transition(opacity .10s linear) + + &:hover, &:active + @include opacity(1) + + $GI: 0.5 // gradient intensity; can tweak this 0-1 + + .gradient + position: absolute + z-index: 10 + + #code-area-gradient + top: 0px + width: 3px + background: linear-gradient(to right, rgba(0,0,0,0) 0%,rgba(0,0,0,$GI) 100%) + left: -3px + bottom: 0 + + #hud-top-gradient + top: -32px + background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) + left: 0 + right: 0 + bottom: 0 + height: 3px + + #canvas-left-gradient + left: 0px + width: 5px + background: linear-gradient(to left, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) + bottom: -30px + top: 0 + + #canvas-top-gradient + top: 0 + height: 5px + left: 0 + right: 0 + background: linear-gradient(to top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) + + #hud-left-gradient + background: linear-gradient(to right, rgba(0,0,0,$GI) 0%,rgba(0,0,0,0) 100%) + left: 0 + top: 0 + height: 100% + width: 2% + + #hud-right-gradient + background: linear-gradient(to right, rgba(0,0,0,0) 0%,rgba(0,0,0,$GI) 100%) + right: 0 + position: absolute + top: 0 + height: 100% + width: 2% + + .footer + @media screen and (min-aspect-ratio: 17/10) + display: none + + &:not(:hover) + @include opacity(0.6) + + .hour-of-code-explanation + margin-top: 5px + color: white + font-size: 12px + + &:not(:hover) + @include opacity(0.75) + + a + color: white + text-decoration: underline diff --git a/app/templates/about.jade b/app/templates/about.jade index e6f0e6afb..848275412 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -151,4 +151,15 @@ block content | and community organizer; you've probably | already spoken with Jeremy. + li.row + + img(src="/images/pages/about/glen_small.png").img-thumbnail + + .col-sm-8 + + h3 Glen De Cauwsemaecker + + p(data-i18n="about.glen_description") + | Glen, describe thyself! + diff --git a/app/templates/account/settings.jade b/app/templates/account/settings.jade index bae178865..91b533b1b 100644 --- a/app/templates/account/settings.jade +++ b/app/templates/account/settings.jade @@ -8,7 +8,7 @@ block content p(data-i18n="account_settings.not_logged_in") Log in or create an account to change your settings. else - button.btn#save-button.disabled.secret(data-i18n="account_settings.saveBackups") Changes Save Automatically + button.btn#save-button.disabled.secret(data-i18n="account_settings.autosave") Changes Save Automatically ul.nav.nav-pills#settings-tabs li @@ -34,7 +34,7 @@ block content input#email.form-control(name="email", type="text", value="#{me.get('email')}") if !isProduction .form-group.checkbox - label(for="email", data-i18n="forms.admin") Admin + label(for="email", data-i18n="account_settings.admin") Admin input#admin(name="admin", type="checkbox", checked=me.get('permissions').indexOf('admin')>-1)) diff --git a/app/templates/base.jade b/app/templates/base.jade index c9ebc9c95..fadb36e0a 100644 --- a/app/templates/base.jade +++ b/app/templates/base.jade @@ -35,10 +35,11 @@ body block outer_content #outer-content-wrapper - #inner-content-wrapper - .main-content-area - block content - p If this is showing, you dun goofed + #intermediate-content-wrapper + #inner-content-wrapper + .main-content-area + block content + p If this is showing, you dun goofed block footer .footer diff --git a/app/templates/contribute/ambassador.jade b/app/templates/contribute/ambassador.jade index ef17d2735..dc1048ac6 100644 --- a/app/templates/contribute/ambassador.jade +++ b/app/templates/contribute/ambassador.jade @@ -31,7 +31,7 @@ block content h4(data-i18n="contribute.how_to_join") How to Join p - a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contact_us_url") + a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contribute.contact_us_url") | Contact us span , span(data-i18n="contribute.ambassador_join_desc") diff --git a/app/templates/contribute/counselor.jade b/app/templates/contribute/counselor.jade index 821a86694..36a79d8cc 100644 --- a/app/templates/contribute/counselor.jade +++ b/app/templates/contribute/counselor.jade @@ -38,7 +38,7 @@ block content h4(data-i18n="contribute.how_to_join") How to Join p - a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contact_us_url") + a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contribute.contact_us_url") | Contact us span , span(data-i18n="contribute.counselor_join_desc") @@ -46,4 +46,4 @@ block content | be interested in doing. We'll put you in our contact list and be in touch | when we could use advice (not too often). - div.clearfix \ No newline at end of file + div.clearfix diff --git a/app/templates/contribute/diplomat.jade b/app/templates/contribute/diplomat.jade index 1c7863680..881ebc42e 100644 --- a/app/templates/contribute/diplomat.jade +++ b/app/templates/contribute/diplomat.jade @@ -70,10 +70,10 @@ block content li Turkish - Nazım Gediz Aydındoğmuş, cobaimelan, wakeup li Brazilian Portuguese - Gutenberg Barros, Kieizroe, Matthew Burt, brunoporto li Portugal Portuguese - Matthew Burt, ReiDuKuduro - li German - Dirk, faabsen, HiroP0, Anon + li German - Dirk, faabsen, HiroP0, Anon, bkimminich li Thai - Kamolchanok Jittrepit li Vietnamese - An Nguyen Hoang Thien - li Dutch - Glen De Cauwsemaecker + li Dutch - Glen De Cauwsemaecker, Guido Zuidhof, Ruben Vereecken li Greek - Stergios li Latin American Spanish - Jesús Ruppel, Matthew Burt, Mariano Luzza li Spain Spanish - Matthew Burt, DanielRodriguezRivero, Anon @@ -81,12 +81,12 @@ block content li Hungarian - ferpeter, csuvsaregal, atlantisguru, Anon li Japanese - g1itch, kengos li Chinese - Adam23, spacepope - li Polish - Anon + li Polish - Anon, Kacper Ciepielewski li Danish - Einar Rasmussen, sorsjen, Anon li Slovak - Anon li Persian - Reza Habibi (Rehb) li Czech - vanous - li Russian - fess89, ser-storchak + li Russian - fess89, ser-storchak, Mr A li Ukrainian - fess89 li Italian - flauta li Norwegian - bardeh diff --git a/app/templates/contribute/scribe.jade b/app/templates/contribute/scribe.jade index 9bd404ad2..eafab49b6 100644 --- a/app/templates/contribute/scribe.jade +++ b/app/templates/contribute/scribe.jade @@ -16,7 +16,7 @@ block content span span(data-i18n="classes.scribe_title_description") (Article Editor) p - span(data-i18n="account_settings.scribe_introduction_pref") + span(data-i18n="contribute.scribe_introduction_pref") | CodeCombat isn't just going to be a bunch of levels. | It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. | That way rather than each Artisan having to describe in detail what a comparison operator is, they @@ -24,7 +24,7 @@ block content | Something along the lines of what the a(href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide", data-i18n="contribute.scribe_introduction_url_mozilla") | Mozilla Developer Network - span(data-i18n="account_settings.scribe_introduction_suf") + span(data-i18n="contribute.scribe_introduction_suf") | has built. If your idea of fun is articulating the concepts of programming in Markdown form, | then this class might be for you. @@ -77,4 +77,4 @@ block content li mattinsler - div.clearfix \ No newline at end of file + div.clearfix diff --git a/app/templates/editor/article/edit.jade b/app/templates/editor/article/edit.jade index a729bf67a..04fe913ff 100644 --- a/app/templates/editor/article/edit.jade +++ b/app/templates/editor/article/edit.jade @@ -6,13 +6,14 @@ block content li a(href="/editor", data-i18n="editor.main_title") CodeCombat Editors li - a(href="/editor/thang", data-i18n="editor.article_title") Article Editor + a(href="/editor/article", data-i18n="editor.article_title") Article Editor li.active | #{article.attributes.name} - button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="revert.revert").btn.btn-primary#revert-button Revert - button(data-i18n="article.edit_btn_preview").btn.btn-primary#preview-button Preview - button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save").btn.btn-primary#save-button Save + button(data-i18n="general.history").btn.btn-primary#history-button History + button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary#revert-button Revert + button(data-i18n="article.edit_btn_preview", disabled=authorized === true ? undefined : "true").btn.btn-primary#preview-button Preview + button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary#save-button Save h3(data-i18n="article.edit_article_title") Edit Article span diff --git a/app/templates/editor/article/table.jade b/app/templates/editor/article/table.jade index c98e17b3f..42b431c32 100755 --- a/app/templates/editor/article/table.jade +++ b/app/templates/editor/article/table.jade @@ -1,21 +1,21 @@ -table.table - tr - th(colspan=3) - span(data-i18n="general.results") - | Results - span - |: #{documents.length} - - tr - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th(data-i18n="general.version") Version - - for data in documents - - data = data.attributes; - tr - td - a(href="/editor/article/#{data.slug || data._id}") - | #{data.name} - td.body-row #{data.description} +table.table + tr + th(colspan=3) + span(data-i18n="general.results") + | Results + span + |: #{documents.length} + + tr + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th(data-i18n="general.version") Version + + for data in documents + - data = data.attributes; + tr + td + a(href="/editor/article/#{data.slug || data._id}") + | #{data.name} + td.body-row #{data.description} td #{data.version.major}.#{data.version.minor} \ No newline at end of file diff --git a/app/templates/editor/components/table.jade b/app/templates/editor/components/table.jade index 935fee07f..cde222790 100755 --- a/app/templates/editor/components/table.jade +++ b/app/templates/editor/components/table.jade @@ -1,21 +1,21 @@ -table.table - tr - th(colspan=3) - span(data-i18n="general.results") - | Results - span - |: #{documents.length} - - tr - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th(data-i18n="general.version") Version - - for data in documents - - data = data.attributes; - tr - td - a(href="/editor/component/#{data.slug || data._id}") - | #{data.name} - td.body-row #{data.description} +table.table + tr + th(colspan=3) + span(data-i18n="general.results") + | Results + span + |: #{documents.length} + + tr + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th(data-i18n="general.version") Version + + for data in documents + - data = data.attributes; + tr + td + a(href="/editor/component/#{data.slug || data._id}") + | #{data.name} + td.body-row #{data.description} td #{data.version.major}.#{data.version.minor} \ No newline at end of file diff --git a/app/templates/editor/level/component/edit.jade b/app/templates/editor/level/component/edit.jade index 911e07237..44d368080 100644 --- a/app/templates/editor/level/component/edit.jade +++ b/app/templates/editor/level/component/edit.jade @@ -9,11 +9,13 @@ nav.navbar.navbar-default(role='navigation') .collapse.navbar-collapse ul.nav.navbar-nav.nav-tabs li.active - a(href="#component-code" data-toggle="tab") Code + a(href="#component-code" data-toggle="tab" data-i18n="general.code") Code li - a(href="#component-config-schema" data-toggle="tab") Config Schema + a(href="#component-config-schema" data-toggle="tab" data-i18n="editor.level_component_config_schema") Config Schema li - a(href="#component-settings" data-toggle="tab") Settings + a(href="#component-settings" data-toggle="tab" data-i18n="editor.level_component_settings") Settings + ul.nav.navbar-nav.navbar-left + li(data-i18n="general.history").btn.btn-primary.navbar-btn#history-button History ul.nav.navbar-nav.navbar-right li(data-i18n="editor.level_component_btn_new").btn.btn-primary.navbar-btn#create-new-component-button Create New Component diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index cdc97cd2a..67800e66f 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -29,19 +29,20 @@ block outer_content ul.nav.navbar-nav.navbar-right - li(data-toggle="coco-modal", data-target="modal/revert", data-i18n="revert.revert").btn.btn-primary.navbar-btn#revert-button Revert - - li(data-i18n="common.save").btn.btn-primary.navbar-btn#commit-level-start-button Save - li(data-i18n="common.fork").btn.btn-primary.navbar-btn#fork-level-start-button Fork + li(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary.navbar-btn#revert-button Revert + li(data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary.navbar-btn#commit-level-start-button Save + li(data-i18n="common.fork", disabled=anonymous ? "true": undefined).btn.btn-primary.navbar-btn#fork-level-start-button Fork li(title="⌃↩ or ⌘↩: Play preview of current level", data-i18n="common.play")#play-button.btn.btn-inverse.banner.navbar-btn Play! li.divider li.dropdown a.dropdown-toggle(href='#', data-toggle='dropdown') - | Help + | More b.caret ul.dropdown-menu + li#history-button + a(href='#', data-i18n="general.version_history") Version History li a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home') Wiki li diff --git a/app/templates/editor/level/modal/world_select.jade b/app/templates/editor/level/modal/world_select.jade index 1c746d8ed..28291f222 100644 --- a/app/templates/editor/level/modal/world_select.jade +++ b/app/templates/editor/level/modal/world_select.jade @@ -27,7 +27,7 @@ div.alert.alert-info strong Enter | to confirm - canvas(width=924, height=590) + canvas(width=1920, height=1224) .modal-footer a.btn.btn-primary#done-button Done diff --git a/app/templates/editor/level/table.jade b/app/templates/editor/level/table.jade index 3830b0fce..37decec4d 100755 --- a/app/templates/editor/level/table.jade +++ b/app/templates/editor/level/table.jade @@ -1,21 +1,21 @@ -table.table - tr - th(colspan=3) - span(data-i18n="general.results") - | Results - span - |: #{documents.length} - - tr - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th(data-i18n="general.version") Version - - for data in documents - - data = data.attributes; - tr - td - a(href="/editor/level/#{data.slug || data._id}") - | #{data.name} - td.body-row #{data.description} +table.table + tr + th(colspan=3) + span(data-i18n="general.results") + | Results + span + |: #{documents.length} + + tr + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th(data-i18n="general.version") Version + + for data in documents + - data = data.attributes; + tr + td + a(href="/editor/level/#{data.slug || data._id}") + | #{data.name} + td.body-row #{data.description} td #{data.version.major}.#{data.version.minor} \ No newline at end of file diff --git a/app/templates/editor/level/thangs_tab.jade b/app/templates/editor/level/thangs_tab.jade index af1ab989e..72ff26b02 100644 --- a/app/templates/editor/level/thangs_tab.jade +++ b/app/templates/editor/level/thangs_tab.jade @@ -2,22 +2,22 @@ h3(data-i18n="editor.level_tab_thangs_title") Current Thangs .btn-group(data-toggle="buttons-radio")#extant-thangs-filter button.btn.btn-primary All - button.btn.btn-primary(value="Unit") + button.btn.btn-primary(value="Unit", title="Unit") i.icon-user - button.btn.btn-primary(value="Wall") + button.btn.btn-primary(value="Wall", title="Wall") i.icon-home - button.btn.btn-primary(value="Floor") + button.btn.btn-primary(value="Floor", title="Floor") i.icon-globe - button.btn.btn-primary(value="Doodad") + button.btn.btn-primary(value="Doodad", title="Doodad") i.icon-leaf - button.btn.btn-primary(value="Misc") + button.btn.btn-primary(value="Misc", title="Misc") i.icon-question-sign #thangs-treema(title="Double click to configure a thang") .world-container.thangs-column h3(data-i18n="editor.level_tab_thangs_conditions") Starting Conditions #canvas-wrapper - canvas(width=924, height=589)#surface + canvas(width=1920, height=1224)#surface #canvas-left-gradient.gradient #canvas-top-gradient.gradient diff --git a/app/templates/editor/thang/edit.jade b/app/templates/editor/thang/edit.jade index c7b80fea0..650f3843f 100644 --- a/app/templates/editor/thang/edit.jade +++ b/app/templates/editor/thang/edit.jade @@ -12,9 +12,9 @@ block content img#portrait.img-thumbnail - button.btn.btn-primary#save-button(data-toggle="coco-modal", data-target="modal/save_version") - | Save - button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="revert.revert") Revert + button.btn.btn-secondary#history-button(data-i18n="general.history") History + button.btn.btn-primary#save-button(data-toggle="coco-modal", data-target="modal/save_version", disabled=authorized === true ? undefined : "true") Save + button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true") Revert h3 Edit Thang Type: "#{thangType.attributes.name}" @@ -38,9 +38,9 @@ block content select#animations-select for animation in animations option #{animation} - button.btn.btn-small.btn-primary#upload-button + button(disabled=authorized === true ? undefined : "true").btn.btn-small.btn-primary#upload-button i.icon-upload - button.btn.btn-small.btn-primary#clear-button + button(disabled=authorized === true ? undefined : "true").btn.btn-small.btn-primary#clear-button i.icon-remove input#real-upload-button(type="file") diff --git a/app/templates/editor/thang/table.jade b/app/templates/editor/thang/table.jade index aa5947fe7..26a9f6583 100755 --- a/app/templates/editor/thang/table.jade +++ b/app/templates/editor/thang/table.jade @@ -1,25 +1,25 @@ -table.table - tr - th(colspan=3) - span(data-i18n="general.results") - | Results - span - |: #{documents.length} - - tr - th#portrait-col - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th(data-i18n="general.version") Version - - for data in documents - - data = data.attributes; - tr - td - - path = '/file/db/thang.type/'+data.original+'/portrait.png' - img(title="Add " + data.name, src=path, alt="").portrait - td - a(href="/editor/thang/#{data.slug || data._id}") - | #{data.name} - td.body-row #{data.description} +table.table + tr + th(colspan=3) + span(data-i18n="general.results") + | Results + span + |: #{documents.length} + + tr + th#portrait-col + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th(data-i18n="general.version") Version + + for data in documents + - data = data.attributes; + tr + td + - path = '/file/db/thang.type/'+data.original+'/portrait.png' + img(title="Add " + data.name, src=path, alt="").portrait + td + a(href="/editor/thang/#{data.slug || data._id}") + | #{data.name} + td.body-row #{data.description} td #{data.version.major}.#{data.version.minor} \ No newline at end of file diff --git a/app/templates/kinds/search.jade b/app/templates/kinds/search.jade index 24547e166..296581a47 100644 --- a/app/templates/kinds/search.jade +++ b/app/templates/kinds/search.jade @@ -10,8 +10,8 @@ block content if me.get('anonymous') a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/signup", role="button") Sign Up to Create a New #{modelLabel} else - a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal") Create a New #{modelLabel} - input#search(placeholder="Search #{modelLabel}s Here") + a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal" data-i18n="#{currentNew}") Create a New Something + input#search(data-i18n="[placeholder]#{currentSearch}") hr div.results table diff --git a/app/templates/kinds/table.jade b/app/templates/kinds/table.jade index 38b7553d1..0eb0c1500 100755 --- a/app/templates/kinds/table.jade +++ b/app/templates/kinds/table.jade @@ -1,21 +1,21 @@ -table.table - tr - th(colspan=3) - span(data-i18n="general.results") - | Results - span - |: #{documents.length} - - tr - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th(data-i18n="general.version") Version - - for data in documents - - data = data.attributes; - tr - td - a(href="/editor/#{page}/#{data.slug || data._id}") - | #{data.name} - td.body-row #{data.description} +table.table + tr + th(colspan=3) + span(data-i18n="general.results") + | Results + span + |: #{documents.length} + + tr + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th(data-i18n="general.version") Version + + for data in documents + - data = data.attributes; + tr + td + a(href="/editor/#{page}/#{data.slug || data._id}") + | #{data.name} + td.body-row #{data.description} td #{data.version.major}.#{data.version.minor} \ No newline at end of file diff --git a/app/templates/modal/login.jade b/app/templates/modal/login.jade index ae6b8b236..bd0307824 100644 --- a/app/templates/modal/login.jade +++ b/app/templates/modal/login.jade @@ -9,7 +9,7 @@ block modal-body-content label.control-label(for="login-email", data-i18n="general.email") Email input#login-email.input-large.form-control(name="email", type="email") .form-group - label.control-label(for="login-password", data-i18n="forms.password") Password + label.control-label(for="login-password", data-i18n="general.password") Password input#login-password.input-large.form-control(name="password", type="password") block modal-body-wait-content diff --git a/app/templates/modal/revert.jade b/app/templates/modal/revert.jade index adfd7688a..f20edd7d2 100644 --- a/app/templates/modal/revert.jade +++ b/app/templates/modal/revert.jade @@ -1,7 +1,7 @@ extends /templates/modal/modal_base block modal-header-content - h3(data-i18n="revert.revert_models") Revert Models + h3(data-i18n="editor.revert_models") Revert Models block modal-body-content table.table.table-striped#changed-models diff --git a/app/templates/modal/signup.jade b/app/templates/modal/signup.jade index d99fed9d6..2b27577d2 100644 --- a/app/templates/modal/signup.jade +++ b/app/templates/modal/signup.jade @@ -12,7 +12,7 @@ block modal-body-content label.control-label(for="signup-email", data-i18n="general.email") Email input#signup-email.form-control.input-large(name="email", type="email") .form-group - label.control-label(for="signup-password", data-i18n="forms.password") Password + label.control-label(for="signup-password", data-i18n="general.password") Password input#signup-password.input-large.form-control(name="password", type="password") hr .form-group.checkbox diff --git a/app/templates/kinds/versions.jade b/app/templates/modal/versions.jade similarity index 64% rename from app/templates/kinds/versions.jade rename to app/templates/modal/versions.jade index 274e91513..bd5b099eb 100755 --- a/app/templates/kinds/versions.jade +++ b/app/templates/modal/versions.jade @@ -1,19 +1,24 @@ -extends /templates/base - -block content - if dataList - h3(data-i18n="general.version_history_for") Version History for: "#{dataList[0].name}" - - table.table - tr - th(data-i18n="general.name") Name - th(data-i18n="general.version") Version - th(data-i18n="general.commit_msg") Commit Message - - for data in dataList - tr - td - a(href="/editor/#{page}/#{data.slug || data._id}") - | #{data.name} - td #{data.version.major}.#{data.version.minor} - td #{data.commitMessage} +extends /templates/modal/modal_base + +block modal-header-content + if dataList + h3 + span(data-i18n="general.version_history_for") Version History for: + |"#{dataList[0].name}" + +block modal-body-content + if dataList + table.table + tr + th(data-i18n="general.name") Name + th(data-i18n="general.version") Version + th(data-i18n="general.commit_msg") Commit Message + for data in dataList + tr + td + a(href="/editor/#{page}/#{data.slug || data._id}") + | #{data.name} + td #{data.version.major}.#{data.version.minor} + td #{data.commitMessage} + +block modal-footer-content \ No newline at end of file diff --git a/app/templates/not_found.jade b/app/templates/not_found.jade index ab9d5809e..bc2d32d13 100644 --- a/app/templates/not_found.jade +++ b/app/templates/not_found.jade @@ -3,3 +3,8 @@ extends /templates/base block content h1.text-center(data-i18n="not_found.page_not_found") Page Not Found + + num = Math.floor(Math.random() * 3) + 1 + + img(src="/images/pages/not_found/404_#{num}.png" class="not-found-image") + diff --git a/app/templates/play.jade b/app/templates/play.jade index 454ea8ca0..6f3a77edd 100644 --- a/app/templates/play.jade +++ b/app/templates/play.jade @@ -19,10 +19,10 @@ block content each campaign in campaigns .campaign-container.col-sm-6 h1 - a(href="/play/level/#{campaign.levels[0].id}", data-i18n="play.campaign_#{campaign.id}")= campaign.name + a(href="/play/#{campaign.levels[0].levelPath || 'level'}/#{campaign.levels[0].id}", data-i18n="play.campaign_#{campaign.id}")= campaign.name p.campaign-description(data-i18n="[html]play.campaign_#{campaign.id}_description")!= campaign.description each level in campaign.levels - a(href=level.disabled ? "/play" : "/play/level/#{level.id}", disabled=level.disabled) + a(href=level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.id}", disabled=level.disabled) .level.row if level.image img.level-image(src="#{level.image}", alt="#{level.name}") diff --git a/app/templates/play/ladder.jade b/app/templates/play/ladder.jade index 1eb85a6f0..234804ed6 100644 --- a/app/templates/play/ladder.jade +++ b/app/templates/play/ladder.jade @@ -2,62 +2,52 @@ extends /templates/base block content div#level-column - h3= level.get('name') - div#level-description - !{description} - - if !me.get('anonymous') - //a(href="http://www.youtube.com/watch?v=IFvfZiJGDsw&list=HL1392928835&feature=mh_lolz").intro-button.btn.btn-primary.btn-lg Watch the Video - - a(href="/play/level/brawlwood-tutorial").intro-button.btn.btn-primary.btn-lg Play the Tutorial + if levelDescription + div!= levelDescription + else + h1= level.get('name') - hr - if me.get('anonymous') div#must-log-in p - strong Please log in first before playing a ladder game. + strong(data-i18n="ladder.please_login") Please log in first before playing a ladder game. button.btn.btn-primary(data-toggle="coco-modal", data-target="modal/login", data-i18n="login.log_in") Log In button.btn.btn-primary(data-toggle="coco-modal", data-target="modal/signup", data-i18n="login.sign_up") Create Account else div#columns.row + div.column.col-md-2 for team in teams - div.column.col-md-6 - a(href="/play/ladder/#{levelID}/team/#{team.id}", style="background-color: #{team.primaryColor}").play-button.btn.btn-danger.btn-block.btn-lg - span Play As + div.column.col-md-4 + a(style="background-color: #{team.primaryColor}", data-team=team.id).play-button.btn.btn-danger.btn-block.btn-lg + span(data-i18n="play.play_as") Play As span= team.name - - table.table.table-bordered.table-condensed.table-hover - //(style="background-color: #{team.bgColor}") - tr - th(colspan=3, style="color: #{team.primaryColor}") - span= team.name - span Leaderboard - tr - th Score - th.name-col-cell Name - th - - for session in team.leaderboard.topPlayers.models - - var myRow = session.get('creator') == me.id - tr(class=myRow ? "success" : "") - td.score-cell= session.get('totalScore').toFixed(2) - td.name-col-cell= session.get('creatorName') || "Anonymous" - td - if(!myRow) - a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}") Battle as #{team.otherTeam}! - else - a(href="/play/ladder/#{levelID}/team/#{team.id}") View your #{team.id} matches. - - unless me.attributes.anonymous - hr - button.btn.btn-warning.btn-lg.highlight#simulate-button(style="margin-bottom:10px;") Simulate Games! - p(id="simulation-status-text", style="display:inline; margin-left:10px;") - if simulationStatus - | #{simulationStatus} - else - | By simulating games you can get your game ranked faster! - if me.isAdmin() - button.btn.btn-danger.btn-lg.highlight#simulate-all-button(style="margin-bottom:10px; float: right;") RESET AND SIMULATE GAMES \ No newline at end of file + div.column.col-md-2 + + hr + + ul.nav.nav-pills + li.active + a(href="#ladder", data-toggle="tab", data-i18n="general.ladder") Ladder + li + a(href="#my-matches", data-toggle="tab", data-i18n="ladder.my_matches") My Matches + li + a(href="#simulate", data-toggle="tab", data-i18n="ladder.simulate") Simulate + + div.tab-content + .tab-pane.active.well#ladder + #ladder-tab-view + .tab-pane.well#my-matches + #my-matches-tab-view + .tab-pane.well#simulate + p(id="simulation-status-text") + if simulationStatus + | #{simulationStatus} + else + span(data-i18n="ladder.simulation_explanation") By simulating games you can get your game ranked faster! + p + button(data-i18n="ladder.simulate_games").btn.btn-warning.btn-lg.highlight#simulate-button Simulate Games! + if me.isAdmin() + p + button(data-i18n="ladder.simulate_all").btn.btn-danger.btn-lg.highlight#simulate-all-button RESET AND SIMULATE GAMES \ No newline at end of file diff --git a/app/templates/play/ladder/ladder_tab.jade b/app/templates/play/ladder/ladder_tab.jade new file mode 100644 index 000000000..2cbf9510e --- /dev/null +++ b/app/templates/play/ladder/ladder_tab.jade @@ -0,0 +1,25 @@ +div#columns.row + for team in teams + div.column.col-md-6 + table.table.table-bordered.table-condensed.table-hover + tr + th(colspan=4, style="color: #{team.primaryColor}") + span= team.name + span + span(data-i18n="ladder.leaderboard") Leaderboard + tr + th(data-i18n="general.rank") Rank + th(data-i18n="general.score") Score + th(data-i18n="general.name").name-col-cell Name + th + + for session, rank in team.leaderboard.topPlayers.models + - var myRow = session.get('creator') == me.id + tr(class=myRow ? "success" : "") + td.rank-cell= rank + 1 + td.score-cell= Math.round(session.get('totalScore') * 100) + td.name-col-cell= session.get('creatorName') || "Anonymous" + td + a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}") + span(data-i18n="ladder.battle_as") Battle as + | #{team.otherTeam}! \ No newline at end of file diff --git a/app/templates/play/ladder/my_matches_tab.jade b/app/templates/play/ladder/my_matches_tab.jade new file mode 100644 index 000000000..b6c300b6d --- /dev/null +++ b/app/templates/play/ladder/my_matches_tab.jade @@ -0,0 +1,69 @@ +//if matches.length +// p#your-score +// span Your Current Score: +// span +// strong= score + +div#columns.row + for team in teams + div.matches-column.col-md-6 + table.table.table-bordered.table-condensed + + tr + th(colspan=4, style="color: #{team.primaryColor}") + span(data-i18n="ladder.summary_your") Your + |#{team.name} + | + span(data-i18n="ladder.summary_matches") Matches - + |#{team.wins} + span(data-i18n="ladder.summary_wins") Wins, + |#{team.losses} + span(data-i18n="ladder.summary_losses") Losses + + if team.session + button.btn.btn-sm.btn-warning.pull-right.rank-button(data-session-id=team.session.id) + span(data-i18n="ladder.rank_no_code").unavailable.hidden No New Code to Rank + span(data-i18n="ladder.rank_my_game").rank.hidden Rank My Game! + span(data-i18n="ladder.rank_submitting").submitting.hidden Submitting... + span(data-i18n="ladder.rank_submitted").submitted.hidden Submitted for Ranking + span(data-i18n="ladder.rank_failed").failed.hidden Failed to Rank + span(data-i18n="ladder.rank_being_ranked").ranking.hidden Game Being Ranked + + if team.chartData + tr + th(colspan=4, style="color: #{team.primaryColor}") + img(src="https://chart.googleapis.com/chart?chs=450x125&cht=lxy&chco=#{team.chartColor}&chtt=Score%3A+#{team.currentScore}&chts=#{team.chartColor},16,r&chf=a,s,000000FF&chls=2&chm=o,#{team.chartColor},0,4&chd=t:#{team.chartData}&chxt=y&chxr=0,#{team.minScore},#{team.maxScore}") + + tr + th(data-i18n="general.result") Result + th(data-i18n="general.opponent") Opponent + th(data-i18n="general.when") When + th + for match in team.matches + tr(class=(match.stale ? "stale " : "") + match.state) + td.state-cell + if match.state === 'win' + span(data-i18n="general.win").win Win + if match.state === 'loss' + span(data-i18n="general.loss").loss Loss + if match.state === 'tie' + span(data-i18n="general.tie").tie Tie + td.name-cell= match.opponentName || "Anonymous" + td.time-cell= match.when + td.battle-cell + - var text = match.state === 'win' ? 'Watch your victory' : 'Defeat the ' + team.otherTeam + a(href="/play/level/#{levelID}?team=#{team.id}&opponent=#{match.sessionID}")= text + + if !team.matches.length + tr + if team.isRanking + td(colspan=4).alert.alert-info + span(data-i18n="ladder.code_being_simulated") + | Your new code is being simulated by other players for ranking. + | This will refresh as new matches come in. + else + td(colspan=4).alert.alert-warning + span(data-i18n="ladder.no_ranked_matches_pre") No ranked matches for the + | #{team.name} + span(data-i18n="ladder.no_ranked_matches_post") team! Play against some competitors and then come back here to get your game ranked. + diff --git a/app/templates/play/ladder/play_modal.jade b/app/templates/play/ladder/play_modal.jade new file mode 100644 index 000000000..72cc45267 --- /dev/null +++ b/app/templates/play/ladder/play_modal.jade @@ -0,0 +1,81 @@ +extends /templates/modal/modal_base + +block modal-header-content + h3(data-i18n="ladder.choose_opponent") Choose an Opponent + +block modal-body-content + + div#noob-view.secret + a(href="/play/level/#{levelID}-tutorial").btn.btn-success.btn-block.btn-lg + p + strong(data-i18n="ladder.tutorial_play") Play Tutorial + span(data-i18n="ladder.tutorial_recommended") Recommended if you've never played before + span.btn.btn-primary.btn-block.btn-lg#skip-tutorial-button(data-i18n="ladder.tutorial_skip") Skip Tutorial + + div#normal-view + + p.tutorial-suggestion + strong(data-i18n="ladder.tutorial_not_sure") Not sure what's going on? + | + a(href="/play/level/#{levelID}-tutorial", data-i18n="ladder.tutorial_play_first") Play the tutorial first. + + a(href="/play/level/#{levelID}?team=#{teamID}") + div.play-option + img(src=myPortrait).my-icon.only-one + img(src="/images/pages/play/ladder/"+teamID+"_ladder_tutorial.png", style="border: 1px solid #{teamColor}; background: #{teamBackgroundColor}").my-team-icon.img-circle.only-one + img(src=genericPortrait).opponent-icon + img(src="/images/pages/play/ladder/"+otherTeamID+"_ladder_tutorial.png", style="border: 1px solid #{opponentTeamColor}; background: #{opponentTeamBackgroundColor}").opponent-team-icon.img-circle + div.my-name.name-label.only-one + span= myName + div.opponent-name.name-label + span(data-i18n="ladder.simple_ai") Simple AI + div.difficulty + span(data-i18n="ladder.warmup") Warmup + div(data-i18n="ladder.vs").vs VS + + if challengers.easy + a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.easy.sessionID}") + div.play-option.easy-option + img(src=myPortrait).my-icon.only-one + img(src="/images/pages/play/ladder/"+teamID+"_ladder_easy.png", style="border: 1px solid #{teamColor}; background: #{teamBackgroundColor}").my-team-icon.img-circle.only-one + img(src=challengers.easy.opponentImageSource||genericPortrait).opponent-icon + img(src="/images/pages/play/ladder/"+otherTeamID+"_ladder_easy.png", style="border: 1px solid #{opponentTeamColor}; background: #{opponentTeamBackgroundColor}").opponent-team-icon.img-circle + div.my-name.name-label.only-one + span= myName + div.opponent-name.name-label + span= challengers.easy.opponentName + div.difficulty + span(data-i18n="general.easy") Easy + div(data-i18n="ladder.vs").vs VS + + if challengers.medium + a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.medium.sessionID}") + div.play-option.medium-option + img(src=myPortrait).my-icon.only-one + img(src="/images/pages/play/ladder/"+teamID+"_ladder_medium.png", style="border: 1px solid #{teamColor}; background: #{teamBackgroundColor}").my-team-icon.img-circle.only-one + img(src=challengers.medium.opponentImageSource||genericPortrait).opponent-icon + img(src="/images/pages/play/ladder/"+otherTeamID+"_ladder_medium.png", style="border: 1px solid #{opponentTeamColor}; background: #{opponentTeamBackgroundColor}").opponent-team-icon.img-circle + div.my-name.name-label.only-one + span= myName + div.opponent-name.name-label + span= challengers.medium.opponentName + div.difficulty + span(data-i18n="general.medium") Medium + div(data-i18n="ladder.vs").vs VS + + if challengers.hard + a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.hard.sessionID}") + div.play-option.hard-option + img(src=myPortrait).my-icon.only-one + img(src="/images/pages/play/ladder/"+teamID+"_ladder_hard.png", style="border: 1px solid #{teamColor}; background: #{teamBackgroundColor}").my-team-icon.img-circle.only-one + img(src=challengers.hard.opponentImageSource||genericPortrait).opponent-icon + img(src="/images/pages/play/ladder/"+otherTeamID+"_ladder_hard.png", style="border: 1px solid #{opponentTeamColor}; background: #{opponentTeamBackgroundColor}").opponent-team-icon.img-circle + div.my-name.name-label.only-one + span= myName + div.opponent-name.name-label + span= challengers.hard.opponentName + div.difficulty + span(data-i18n="general.hard") Hard + div(data-i18n="ladder.vs").vs VS + +block modal-footer \ No newline at end of file diff --git a/app/templates/play/ladder/team.jade b/app/templates/play/ladder/team.jade deleted file mode 100644 index 22bfd5404..000000000 --- a/app/templates/play/ladder/team.jade +++ /dev/null @@ -1,112 +0,0 @@ -extends /templates/base -block content - - ol.breadcrumb - li - a(href="/") Home - li - a(href="/play/ladder/#{levelID}")= level.get('name') - li.active= teamName - - p - | In this level, you play against everyone who has ever written strategies for the opposing forces. - | Choose from the suggested players on the right, playing as many and as long as you like, - | and when you are ready to test your grand strategy against the whole ladder, return and click the rank button. - - p - | After your first submission, your code will also continuously run against other players as they rank themselves. - - if matches.length - p#your-score - span Your Current Score: - span - strong= score - - - div#columns.row - div#matches-column.col-md-6 - h3.pull-left Ranked Games - button.btn.btn-warning.pull-right#rank-button - span.unavailable.hidden No New Code to Rank - span.rank.hidden Rank My Game! - span.ranking.hidden Submitting... - span.ranked.hidden Submitted for Ranking - span.failed.hidden Failed to Rank - - hr.clearfix(style="clear: both") - - if matches.length - table.table.table-bordered.table-condensed - tr - th Result - th Opponent - th When - for match in matches - tr - td.state-cell - if match.state === 'win' - span.win Win - if match.state === 'loss' - span.loss Loss - if match.state === 'tie' - span.tie Tie - td.name-cell= match.opponentName || "Anonymous" - td.time-cell= match.when - td.battle-cell - - var text = match.state === 'win' ? 'Watch your victory' : 'Defeat the ' + otherTeamID - a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{match.sessionID}")= text - - else - div.alert.alert-warning - | No ranked matches played yet! - | Play some competitors on the right and then come back to get your game ranked. - - // finish this once matches are available - - div#competitors-column.col-md-6 - h3 Your Competitors - - .well.text-muted - div.row - div.col-md-2 - span.warmup Warmup - span : - div.col-md-10 - a(href="/play/level/#{levelID}?team=#{teamID}") - span.warmup Play #{teamID} vs Default #{otherTeamID} - - if challengers.easy - .well - div.row.text-info.bg-info - div.col-md-2 - span.easy Easy - span : - div.col-md-10 - a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.easy.sessionID}") - span Play #{teamID} vs - strong= challengers.easy.opponentName - span #{otherTeamID} - - if challengers.medium - .well - div.row.text-warning.bg-warning - div.col-md-2 - span.medium Medium - span : - div.col-md-10 - a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.medium.sessionID}") - span Play #{teamID} vs - strong= challengers.medium.opponentName - span #{otherTeamID} - - if challengers.hard - .well - div.row.text-danger.bg-danger - div.col-md-2 - span.hard Hard - span : - div.col-md-10 - a(href="/play/level/#{levelID}?team=#{teamID}&opponent=#{challengers.hard.sessionID}") - span Play #{teamID} vs - strong= challengers.hard.opponentName - span #{otherTeamID} diff --git a/app/templates/play/level.jade b/app/templates/play/level.jade index a247ce1b6..3f91653b2 100644 --- a/app/templates/play/level.jade +++ b/app/templates/play/level.jade @@ -1,3 +1,5 @@ +#level-loading-view + .level-content #control-bar-view @@ -7,7 +9,7 @@ #tome-view #canvas-wrapper - canvas(width=924, height=589)#surface + canvas(width=1920, height=1224)#surface #canvas-left-gradient.gradient #canvas-top-gradient.gradient diff --git a/app/templates/play/level/control_bar.jade b/app/templates/play/level/control_bar.jade index 1cc3af07d..13670857b 100644 --- a/app/templates/play/level/control_bar.jade +++ b/app/templates/play/level/control_bar.jade @@ -12,5 +12,7 @@ if ladderGame button.btn.btn-xs.btn-inverse.banner#multiplayer-button(title="Leaderboard", data-i18n="play_level.leaderboard") Leaderboard else button.btn.btn-xs.btn-inverse.banner#multiplayer-button(title="Multiplayer", data-i18n="play_level.multiplayer") Multiplayer +if spectateGame + button.btn.btn-xs.btn-inverse.banner#next-game-button(title="Next Game", data-i18n="play_level.next-game") Next game! button.btn.btn-xs.btn-inverse.banner#restart-button(title="Reload all custom code to reset level", data-i18n="play_level.restart") Restart \ No newline at end of file diff --git a/app/templates/play/level/hud_prop.jade b/app/templates/play/level/hud_prop.jade index 017129bb7..705377d92 100644 --- a/app/templates/play/level/hud_prop.jade +++ b/app/templates/play/level/hud_prop.jade @@ -1,11 +1,12 @@ .prop(name="#{prop}") if hasIcon - img.prop-label(src="/images/level/prop_#{prop}.png", alt="#{prop}") + span(class="prop-label prop-label-icon prop-label-icon-#{prop}") else span.prop-label #{prop}: if hasBar span.prop-value.bar-prop .bar + span.prop-value.bar-prop-value else span.prop-value diff --git a/app/templates/play/level/level_loading.jade b/app/templates/play/level/level_loading.jade new file mode 100644 index 000000000..58cf16592 --- /dev/null +++ b/app/templates/play/level/level_loading.jade @@ -0,0 +1,13 @@ +.left-wing + +.right-wing + +.loading-details + + h2(data-i18n='play_level.loading_level') Loading Level + + .load-progress + .progress.progress-striped.active + .progress-bar.progress-bar-success + + h4 Tip: you can shift+click a position on the map to insert it into the spell editor. \ No newline at end of file diff --git a/app/templates/play/level/modal/editor_config.jade b/app/templates/play/level/modal/editor_config.jade new file mode 100644 index 000000000..ca622f77c --- /dev/null +++ b/app/templates/play/level/modal/editor_config.jade @@ -0,0 +1,33 @@ +.modal-dialog + .modal-header + button(type='button', data-dismiss="modal", aria-hidden="true").close × + h3(data-i18n="play_level.editor_config_title") Editor Configuration + + .modal-body + .form + .form-group.select-group + label.control-label(for="tome-key-bindings" data-i18n="play_level.editor_config_keybindings_label") Key Bindings + select#tome-key-bindings(name="keyBindings", type="checkbox", checked=multiplayer) + option(value="default" selected=(keyBindings === "default") data-i18n="play_level.editor_config_keybindings_default") Default (Ace) + option(value="vim" selected=(keyBindings === "vim")) Vim + option(value="emacs" selected=(keyBindings === "emacs")) Emacs + span.help-block(data-i18n="play_level.editor_config_keybindings_description") Adds additional shortcuts known from the common editors. + .form-group.checkbox + label(for="tome-invisibles") + input#tome-invisibles(name="invisibles", type="checkbox", checked=invisibles) + span(data-i18n="play_level.editor_config_invisibles_label") Show Invisibles + span.help-block(data-i18n="play_level.editor_config_invisibles_description") Displays invisibles such as spaces or tabs. + .form-group.checkbox + label(for="tome-indent-guides") + input#tome-indent-guides(name="indentGuides", type="checkbox", checked=indentGuides) + span(data-i18n="play_level.editor_config_indentguides_label") Show Indent Guides + span.help-block(data-i18n="play_level.editor_config_indentguides_description") Displays vertical lines to see indentation better. + .form-group.checkbox + label(for="tome-behaviors") + input#tome-behaviors(name="behaviors", type="checkbox", checked=behaviors) + span(data-i18n="play_level.editor_config_behaviors_label") Smart Behaviors + span.help-block(data-i18n="play_level.editor_config_behaviors_description") Autocompletes brackets, braces, and quotes. + + .modal-footer + a(href='#', data-dismiss="modal", aria-hidden="true", data-i18n="modal.close").btn.btn-primary Close + diff --git a/app/templates/play/level/modal/multiplayer.jade b/app/templates/play/level/modal/multiplayer.jade index bc8cc39b5..2135e1977 100644 --- a/app/templates/play/level/modal/multiplayer.jade +++ b/app/templates/play/level/modal/multiplayer.jade @@ -30,7 +30,7 @@ if me.get('anonymous') p Sign in or create an account and get your solution on the leaderboard! else - a#go-to-leaderboard-button.btn.btn-primary(href="/play/ladder/#{levelSlug}/team/#{team}") Go to the leaderboard! + a#go-to-leaderboard-button.btn.btn-primary(href="/play/ladder/#{levelSlug}#my-matches") Go to the leaderboard! p You can submit your game to be ranked from the leaderboard page. .modal-footer diff --git a/app/templates/play/level/modal/victory.jade b/app/templates/play/level/modal/victory.jade index 7a0637f8a..92c253955 100644 --- a/app/templates/play/level/modal/victory.jade +++ b/app/templates/play/level/modal/victory.jade @@ -1,50 +1,50 @@ -// TODO: refactor to be like other modals +extends /templates/modal/modal_base -.modal-dialog +block modal-header-content + h3 + span(data-i18n="play_level.victory_title_prefix") + span= levelName + span(data-i18n="play_level.victory_title_suffix") Complete +block modal-body-content img.victory-banner(src="/images/level/victory.png", alt="") - - .modal-header - button(type='button', data-dismiss="modal", aria-hidden="true").close × - h3 - span(data-i18n="play_level.victory_title_prefix") - span= levelName - span(data-i18n="play_level.victory_title_suffix") Complete - - .modal-body!= body + div!= body - .modal-footer - if hasNextLevel - button.btn.btn-primary.next-level-button(data-dismiss="modal", data-i18n="play_level.victory_play_next_level") Play Next Level - else - a.btn.btn-primary(href="/", data-dismiss="modal", data-i18n="play_level.victory_go_home") Go Home - if me.get('anonymous') - p.sign-up-poke - button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/signup", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress - span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account! - p.clearfix - else - div.rating.secret - span(data-i18n="play_level.victory_rate_the_level") Rate the level: - i.icon-star-empty - i.icon-star-empty - i.icon-star-empty - i.icon-star-empty - i.icon-star-empty - if !me.get('anonymous') - div.review.secret - span(data-i18n="play_level.victory_review") Tell us more! - br - textarea - div.share-buttons - .g-plusone(data-href="http://codecombat.com", data-size="medium") - .fb-like(data-href="https://www.facebook.com/codecombat", data-send="false", data-layout="button_count", data-width="350", data-show-faces="true", data-ref="coco_victory_#{fbRef}") - a.twitter-follow-button(href="https://twitter.com/CodeCombat", data-show-count="true", data-show-screen-name="false", data-dnt="true", data-align="right", data-i18n="nav.twitter_follow") Follow - iframe.github-star-button(src="http://ghbtns.com/github-btn.html?user=codecombat&repo=codecombat&type=watch&count=true", allowtransparency="true", frameborder="0", scrolling="0", width="110", height="20") +block modal-footer-content + if readyToRank + button.btn.btn-success.rank-game-button(data-i18n="play_level.victory_rank_my_game") Rank My Game + else if level.get('type') === 'ladder' + a.btn.btn-primary(href="/play/ladder/#{level.get('slug')}#my-matches", data-dismiss="modal", data-i18n="play_level.victory_go_ladder") Return to Ladder + else if hasNextLevel + button.btn.btn-primary.next-level-button(data-dismiss="modal", data-i18n="play_level.victory_play_next_level") Play Next Level + else + a.btn.btn-primary(href="/", data-dismiss="modal", data-i18n="play_level.victory_go_home") Go Home + if me.get('anonymous') + p.sign-up-poke + button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/signup", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress + span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account! + p.clearfix + else + div.rating.secret + span(data-i18n="play_level.victory_rate_the_level") Rate the level: + i.icon-star-empty + i.icon-star-empty + i.icon-star-empty + i.icon-star-empty + i.icon-star-empty + if !me.get('anonymous') + div.review.secret + span(data-i18n="play_level.victory_review") Tell us more! + br + textarea + div.share-buttons + .g-plusone(data-href="http://codecombat.com", data-size="medium") + .fb-like(data-href="https://www.facebook.com/codecombat", data-send="false", data-layout="button_count", data-width="350", data-show-faces="true", data-ref="coco_victory_#{fbRef}") + a.twitter-follow-button(href="https://twitter.com/CodeCombat", data-show-count="true", data-show-screen-name="false", data-dnt="true", data-align="right", data-i18n="nav.twitter_follow") Follow + iframe.github-star-button(src="http://ghbtns.com/github-btn.html?user=codecombat&repo=codecombat&type=watch&count=true", allowtransparency="true", frameborder="0", scrolling="0", width="110", height="20") if showHourOfCodeDoneButton - .modal-footer - h3.pull-left(data-i18n="play_level.victory_hour_of_code_done") Are You Done? - a(href="http://code.org/api/hour/finish") - strong(data-i18n="play_level.victory_hour_of_code_done_yes") Yes, I'm finished with my Hour of Code! - img(src="/images/level/csedweek-logo-final-small.jpg", alt="CS Ed Week Hour of Code", title="I'm finished with my Hour of Code", width=80) + h3.pull-left(data-i18n="play_level.victory_hour_of_code_done") Are You Done? + a(href="http://code.org/api/hour/finish") + strong(data-i18n="play_level.victory_hour_of_code_done_yes") Yes, I'm finished with my Hour of Code! + img(src="/images/level/csedweek-logo-final-small.jpg", alt="CS Ed Week Hour of Code", title="I'm finished with my Hour of Code", width=80) diff --git a/app/templates/play/level/playback.jade b/app/templates/play/level/playback.jade index 4d00d230f..b13c8daef 100644 --- a/app/templates/play/level/playback.jade +++ b/app/templates/play/level/playback.jade @@ -33,7 +33,10 @@ button.btn.btn-xs.btn-inverse#music-button(title="Toggle Music") li(title="Ctrl/Cmd + G: Toggle grid display").selectable#grid-toggle i.icon-th span(data-i18n="play_level.grid") Grid - i.icon-ok.secret + i.icon-ok.secret.invisible li.selectable#edit-wizard-settings i.icon-user span(data-i18n="play_level.customize_wizard") Customize Wizard + li.selectable#edit-editor-config + i.icon-edit + span(data-i18n="play_level.editor_config") Editor Config diff --git a/app/templates/play/level/tome/spell_palette.jade b/app/templates/play/level/tome/spell_palette.jade index 19489b42c..d587da8c5 100644 --- a/app/templates/play/level/tome/spell_palette.jade +++ b/app/templates/play/level/tome/spell_palette.jade @@ -6,5 +6,5 @@ ul(class="nav nav-pills" + (tabbed ? ' multiple-tabs' : '')) h4= group .tab-content each slug, group in entryGroupSlugs - div(id="palette-tab-" + slug, class="tab-pane" + (group == "this" || slug == "available-spells" ? " active" : "")) + div(id="palette-tab-" + slug, class="tab-pane" + (group == "this" || slug == defaultGroupSlug ? " active" : "")) div(class="properties properties-" + slug) diff --git a/app/templates/play/spectate.jade b/app/templates/play/spectate.jade index 9be37b46a..d21a27f2a 100644 --- a/app/templates/play/spectate.jade +++ b/app/templates/play/spectate.jade @@ -1,16 +1,16 @@ +#level-loading-view + .level-content #control-bar-view - #canvas-wrapper - canvas(width=924, height=589)#surface + canvas(width=1920, height=1224)#surface #canvas-left-gradient.gradient #canvas-top-gradient.gradient - #goals-view.hide - #gold-view.hide.expanded + #gold-view.secret.expanded #level-chat-view #playback-view #thang-hud .footer .content p(class='footer-link-text') - a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact + a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact \ No newline at end of file diff --git a/app/treema-ext.coffee b/app/treema-ext.coffee index 9112abaa6..1455bc534 100644 --- a/app/treema-ext.coffee +++ b/app/treema-ext.coffee @@ -39,6 +39,7 @@ class LiveEditingMarkup extends TreemaNode.nodeMap.ace filename: InkBlob.filename mimetype: InkBlob.mimetype path: @settings.filePath + force: true @uploadingPath = [@settings.filePath, InkBlob.filename].join('/') $.ajax('/file', { type: 'POST', data: body, success: @onFileUploaded }) @@ -106,7 +107,7 @@ class SoundFileTreema extends TreemaNode.nodeMap.string if @data valEl.append(playButton) valEl.append(stopButton) - valEl.append(dropdown) if files.length + valEl.append(dropdown) if files.length and @canEdit() if @data path = @data.split('/') name = path[path.length-1] @@ -147,9 +148,8 @@ class SoundFileTreema extends TreemaNode.nodeMap.string filename: InkBlob.filename mimetype: InkBlob.mimetype path: @settings.filePath + force: true - # Automatically overwrite if the same path was put in here before - body.force = true # if InkBlob.filename is @data @uploadingPath = [@settings.filePath, InkBlob.filename].join('/') $.ajax('/file', { type: 'POST', data: body, success: @onFileUploaded }) @@ -185,9 +185,8 @@ class ImageFileTreema extends TreemaNode.nodeMap.string filename: InkBlob.filename mimetype: InkBlob.mimetype path: @settings.filePath + force: true - # Automatically overwrite if the same path was put in here before - body.force = true # if InkBlob.filename is @data @uploadingPath = [@settings.filePath, InkBlob.filename].join('/') $.ajax('/file', { type: 'POST', data: body, success: @onFileUploaded }) @@ -280,12 +279,23 @@ class LatestVersionReferenceNode extends TreemaNode search: => term = @getValEl().find('input').val() return if term is @lastTerm + + # HACK while search is broken + if @collection + @lastTerm = term + @searchCallback() + return + @getSearchResultsEl().empty() if @lastTerm and not term return unless term @lastTerm = term @getSearchResultsEl().empty().append('Searching') @collection = new LatestVersionCollection() - @collection.url = "#{@url}?term=#{term}&project=true" + + # HACK while search is broken +# @collection.url = "#{@url}?term=#{term}&project=true" + @collection.url = "#{@url}?term=#{''}&project=true" + @collection.fetch() @collection.on 'sync', @searchCallback @@ -296,6 +306,10 @@ class LatestVersionReferenceNode extends TreemaNode row = $('
').addClass('treema-search-result-row') text = @formatDocument(model) continue unless text? + + # HACK while search is broken + continue unless text.toLowerCase().indexOf(@lastTerm.toLowerCase()) >= 0 + row.addClass('treema-search-selected') if first first = false row.text(text) diff --git a/app/views/account/settings_view.coffee b/app/views/account/settings_view.coffee index 2f609eebd..27edf27e1 100644 --- a/app/views/account/settings_view.coffee +++ b/app/views/account/settings_view.coffee @@ -66,7 +66,7 @@ module.exports = class SettingsView extends View c.photos = me.gravatarPhotoURLs() c.chosenPhoto = me.getPhotoURL() c.subs = {} - c.subs[sub] = 1 for sub in c.me.get('emailSubscriptions') or ['announcement', 'tester', 'level_creator', 'developer'] + c.subs[sub] = 1 for sub in c.me.get('emailSubscriptions') or ['announcement', 'notification', 'tester', 'level_creator', 'developer'] c getSubscriptions: -> @@ -88,7 +88,7 @@ module.exports = class SettingsView extends View if res? forms.applyErrorsToForm(@$el, res) return - + return unless me.hasLocalChanges() res = me.save() diff --git a/app/views/account/wizard_settings_view.coffee b/app/views/account/wizard_settings_view.coffee index 8497c32cf..78f9cee6a 100644 --- a/app/views/account/wizard_settings_view.coffee +++ b/app/views/account/wizard_settings_view.coffee @@ -22,7 +22,7 @@ module.exports = class WizardSettingsView extends CocoView loadWizard: -> @wizardThangType = new ThangType() - @wizardThangType.url = -> '/db/thang_type/wizard' + @wizardThangType.url = -> '/db/thang.type/wizard' @wizardThangType.fetch() @wizardThangType.once 'sync', @initCanvas, @ @@ -67,7 +67,7 @@ module.exports = class WizardSettingsView extends CocoView updateSwatchVisibility: (colorGroup) -> enabled = colorGroup.find('.color-group-checkbox').prop('checked') colorGroup.find('.minicolors-swatch').toggle Boolean(enabled) - + updateColorSettings: (colorGroup) => wizardSettings = _.cloneDeep(me.get('wizard')) or {} wizardSettings.colorConfig ?= {} @@ -108,4 +108,4 @@ module.exports = class WizardSettingsView extends CocoView @movieClip.regX = reg.x @movieClip.regY = reg.y @stage.addChild @movieClip - @stage.update() \ No newline at end of file + @stage.update() diff --git a/app/views/admin_view.coffee b/app/views/admin_view.coffee index e71c9acaf..cd06c0999 100644 --- a/app/views/admin_view.coffee +++ b/app/views/admin_view.coffee @@ -29,7 +29,8 @@ module.exports = class AdminView extends View espionageSuccess: (model) -> storage.save('whoami',model) window.location.reload() + espionageFailure: (jqxhr, status,error)-> console.log "There was an error entering espionage mode: #{error}" - \ No newline at end of file + diff --git a/app/views/contribute/archmage_view.coffee b/app/views/contribute/archmage_view.coffee index 069de7d16..ec18303f8 100644 --- a/app/views/contribute/archmage_view.coffee +++ b/app/views/contribute/archmage_view.coffee @@ -7,7 +7,6 @@ module.exports = class ArchmageView extends ContributeClassView contributors: [ {name: "Tom Steinbrecher", avatar: "tom"} - {name: "Glen De Cauwsemaecker", avatar: "glen"} {name: "Sébastien Moratinos", avatar: "sebastien"} {name: "deepak1556", avatar: "deepak"} {name: "Ronnie Cheng", avatar: "ronald"} diff --git a/app/views/contribute/artisan_view.coffee b/app/views/contribute/artisan_view.coffee index cdef4a204..b7d184d57 100644 --- a/app/views/contribute/artisan_view.coffee +++ b/app/views/contribute/artisan_view.coffee @@ -19,4 +19,6 @@ module.exports = class ArtisanView extends ContributeClassView {name: "Axandre Oge", avatar: "axandre"} {name: "Katharine Chan", avatar: "katharine"} {name: "Derek Wong", avatar: "derek"} + {name: "Alexandru Caciulescu", avatar: ""} + {name: "Prabh Simran Singh Baweja", avatar: ""} ] diff --git a/app/views/editor/article/edit.coffee b/app/views/editor/article/edit.coffee index 7a2894a09..2a7840e9a 100644 --- a/app/views/editor/article/edit.coffee +++ b/app/views/editor/article/edit.coffee @@ -1,4 +1,5 @@ View = require 'views/kinds/RootView' +VersionHistoryView = require './versions_view' template = require 'templates/editor/article/edit' Article = require 'models/Article' @@ -9,6 +10,7 @@ module.exports = class ArticleEditView extends View events: 'click #preview-button': 'openPreview' + 'click #history-button': 'showVersionHistory' subscriptions: 'save-new-version': 'saveNewArticle' @@ -37,9 +39,9 @@ module.exports = class ArticleEditView extends View data: data filePath: "db/thang.type/#{@article.get('original')}" schema: Article.schema.attributes + readOnly: true unless me.isAdmin() or @article.hasWriteAccess(me) callbacks: change: @pushChangesToPreview - options.readOnly = true unless me.isAdmin() @treema = @$el.find('#article-treema').treema(options) @treema.build() @@ -56,6 +58,7 @@ module.exports = class ArticleEditView extends View getRenderData: (context={}) -> context = super(context) context.article = @article + context.authorized = me.isAdmin() or @article.hasWriteAccess(me) context openPreview: => @@ -83,3 +86,8 @@ module.exports = class ArticleEditView extends View modal.modal('hide') url = "/editor/article/#{newArticle.get('slug') or newArticle.id}" document.location.href = url + + showVersionHistory: (e) -> + versionHistoryView = new VersionHistoryView article:@article, @articleID + @openModalView versionHistoryView + Backbone.Mediator.publish 'level:view-switched', e diff --git a/app/views/editor/article/versions.coffee b/app/views/editor/article/versions_view.coffee similarity index 55% rename from app/views/editor/article/versions.coffee rename to app/views/editor/article/versions_view.coffee index 2c3ac5d47..63b040366 100644 --- a/app/views/editor/article/versions.coffee +++ b/app/views/editor/article/versions_view.coffee @@ -1,6 +1,6 @@ -VersionsView = require 'views/kinds/VersionsView' +VersionsModalView = require 'views/modal/versions_modal' -module.exports = class SuperVersionsView extends VersionsView +module.exports = class ArticleVersionsView extends VersionsModalView id: "editor-article-versions-view" url: "/db/article/" page: "article" diff --git a/app/views/editor/component/versions.coffee b/app/views/editor/component/versions_view.coffee similarity index 58% rename from app/views/editor/component/versions.coffee rename to app/views/editor/component/versions_view.coffee index 7305c29c5..1edaad280 100755 --- a/app/views/editor/component/versions.coffee +++ b/app/views/editor/component/versions_view.coffee @@ -1,6 +1,6 @@ -VersionsView = require 'views/kinds/VersionsView' +VersionsModalView = require 'views/modal/versions_modal' -module.exports = class SuperVersionsView extends VersionsView +module.exports = class ComponentVersionsView extends VersionsModalView id: "editor-component-versions-view" url: "/db/level.component/" page: "component" diff --git a/app/views/editor/components/main.coffee b/app/views/editor/components/main.coffee index 87a4ed3b6..fdcc55a6e 100644 --- a/app/views/editor/components/main.coffee +++ b/app/views/editor/components/main.coffee @@ -18,6 +18,7 @@ module.exports = class ThangComponentEditView extends CocoView @callback = options.callback render: => + return if @destroyed for model in [Level, LevelComponent] (new model()).on 'schema-loaded', @render unless model.schema?.loaded if not @componentCollection @@ -35,6 +36,7 @@ module.exports = class ThangComponentEditView extends CocoView @buildAddComponentTreema() onComponentsSync: => + return if @destroyed @supermodel.addCollection @componentCollection @render() diff --git a/app/views/editor/level/component/edit.coffee b/app/views/editor/level/component/edit.coffee index 8eb591dbf..46db9a7fb 100644 --- a/app/views/editor/level/component/edit.coffee +++ b/app/views/editor/level/component/edit.coffee @@ -1,4 +1,5 @@ View = require 'views/kinds/CocoView' +VersionHistoryView = require 'views/editor/component/versions_view' template = require 'templates/editor/level/component/edit' LevelComponent = require 'models/LevelComponent' @@ -9,6 +10,7 @@ module.exports = class LevelComponentEditView extends View events: 'click #done-editing-component-button': 'endEditing' + 'click #history-button': 'showVersionHistory' 'click .nav a': (e) -> $(e.target).tab('show') constructor: (options) -> @@ -91,3 +93,8 @@ module.exports = class LevelComponentEditView extends View destroy: -> @editor?.destroy() super() + + showVersionHistory: (e) -> + versionHistoryView = new VersionHistoryView component:@levelComponent, @levelComponent.id + @openModalView versionHistoryView + Backbone.Mediator.publish 'level:view-switched', e \ No newline at end of file diff --git a/app/views/editor/level/edit.coffee b/app/views/editor/level/edit.coffee index bbafd529d..8f4f68a00 100644 --- a/app/views/editor/level/edit.coffee +++ b/app/views/editor/level/edit.coffee @@ -12,6 +12,7 @@ ComponentsTabView = require './components_tab_view' SystemsTabView = require './systems_tab_view' LevelSaveView = require './save_view' LevelForkView = require './fork_view' +VersionHistoryView = require './versions_view' module.exports = class EditorLevelView extends View id: "editor-level-view" @@ -23,6 +24,7 @@ module.exports = class EditorLevelView extends View 'click #play-button': 'onPlayLevel' 'click #commit-level-start-button': 'startCommittingLevel' 'click #fork-level-start-button': 'startForkingLevel' + 'click #history-button': 'showVersionHistory' constructor: (options, @levelID) -> super options @@ -63,6 +65,8 @@ module.exports = class EditorLevelView extends View getRenderData: (context={}) -> context = super(context) context.level = @level + context.authorized = me.isAdmin() or @level.hasWriteAccess(me) + context.anonymous = me.get('anonymous') context afterRender: -> @@ -100,3 +104,8 @@ module.exports = class EditorLevelView extends View levelForkView = new LevelForkView level: @level @openModalView levelForkView Backbone.Mediator.publish 'level:view-switched', e + + showVersionHistory: (e) -> + versionHistoryView = new VersionHistoryView level:@level, @levelID + @openModalView versionHistoryView + Backbone.Mediator.publish 'level:view-switched', e \ No newline at end of file diff --git a/app/views/editor/level/scripts_tab_view.coffee b/app/views/editor/level/scripts_tab_view.coffee index 45b5c210d..f0088ad21 100644 --- a/app/views/editor/level/scripts_tab_view.coffee +++ b/app/views/editor/level/scripts_tab_view.coffee @@ -59,6 +59,7 @@ module.exports = class ScriptsTabView extends View thangIDs: thangIDs dimensions: @dimensions supermodel: @supermodel + readOnly: true unless me.isAdmin() or @level.hasWriteAccess(me) callbacks: change: @onScriptChanged nodeClasses: diff --git a/app/views/editor/level/settings_tab_view.coffee b/app/views/editor/level/settings_tab_view.coffee index 2dbfcf165..7a1290db1 100644 --- a/app/views/editor/level/settings_tab_view.coffee +++ b/app/views/editor/level/settings_tab_view.coffee @@ -8,7 +8,12 @@ module.exports = class SettingsTabView extends View id: 'editor-level-settings-tab-view' className: 'tab-pane' template: template - editableSettings: ['name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals'] # not thangs or scripts or the backend stuff + + # not thangs or scripts or the backend stuff + editableSettings: [ + 'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals', + 'type', 'showsGuide' + ] subscriptions: 'level-loaded': 'onLevelLoaded' @@ -29,6 +34,7 @@ module.exports = class SettingsTabView extends View supermodel: @supermodel schema: schema data: data + readOnly: true unless me.isAdmin() or @level.hasWriteAccess(me) callbacks: {change: @onSettingsChanged} thangIDs: thangIDs nodeClasses: diff --git a/app/views/editor/level/systems_tab_view.coffee b/app/views/editor/level/systems_tab_view.coffee index 23a58617a..a4b481754 100644 --- a/app/views/editor/level/systems_tab_view.coffee +++ b/app/views/editor/level/systems_tab_view.coffee @@ -69,6 +69,7 @@ module.exports = class SystemsTabView extends View supermodel: @supermodel schema: Level.schema.get('properties').systems data: systems + readOnly: true unless me.isAdmin() or @level.hasWriteAccess(me) callbacks: change: @onSystemsChanged select: @onSystemSelected diff --git a/app/views/editor/level/thangs_tab_view.coffee b/app/views/editor/level/thangs_tab_view.coffee index af5ee3c07..be020ff6f 100644 --- a/app/views/editor/level/thangs_tab_view.coffee +++ b/app/views/editor/level/thangs_tab_view.coffee @@ -8,6 +8,7 @@ CocoCollection = require 'models/CocoCollection' Surface = require 'lib/surface/Surface' Thang = require 'lib/world/thang' LevelThangEditView = require './thang/edit' +ComponentsCollection = require 'collections/ComponentsCollection' # Moving the screen while dragging thangs constants MOVE_MARGIN = 0.15 @@ -19,7 +20,7 @@ componentOriginals = "physics.Physical" : "524b75ad7fc0f6d519000001" class ThangTypeSearchCollection extends CocoCollection - url: '/db/thang_type/search?project=true' + url: '/db/thang.type/search?project=true' model: ThangType module.exports = class ThangsTabView extends View @@ -60,12 +61,25 @@ module.exports = class ThangsTabView extends View @thangTypes.once 'sync', @onThangTypesLoaded @thangTypes.fetch() + # just loading all Components for now: https://github.com/codecombat/codecombat/issues/405 + @componentCollection = @supermodel.getCollection new ComponentsCollection() + @componentCollection.once 'sync', @onComponentsLoaded + @componentCollection.fetch() + onThangTypesLoaded: => + return if @destroyed @supermodel.addCollection @thangTypes @supermodel.populateModel model for model in @thangTypes.models - @startsLoading = false + @startsLoading = not @componentCollection.loaded @render() # do it again but without the loading screen - @onLevelLoaded level: @level if @level + @onLevelLoaded level: @level if @level and not @startsLoading + + onComponentsLoaded: => + return if @destroyed + @supermodel.addCollection @componentCollection + @startsLoading = not @thangTypes.loaded + @render() # do it again but without the loading screen + @onLevelLoaded level: @level if @level and not @startsLoading getRenderData: (context={}) -> context = super(context) @@ -98,6 +112,7 @@ module.exports = class ThangsTabView extends View @$el.find('#extant-thangs-filter button:first').button('toggle') onFilterExtantThangs: (e) -> + @$el.find('#extant-thangs-filter button.active').button('toggle') button = $(e.target).closest('button') button.button('toggle') val = button.val() @@ -145,7 +160,6 @@ module.exports = class ThangsTabView extends View @surface.playing = false @surface.setWorld @world @surface.camera.zoomTo({x:262, y:-164}, 1.66, 0) - @surface.camera.dragDisabled = true destroy: -> @selectAddThangType null @@ -167,6 +181,7 @@ module.exports = class ThangsTabView extends View onSpriteDragged: (e) -> return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id + @surface.camera.dragDisabled = true {stageX, stageY} = e.originalEvent wop = @surface.camera.canvasToWorld x: stageX, y: stageY wop.z = @selectedExtantThang.depth / 2 @@ -177,6 +192,7 @@ module.exports = class ThangsTabView extends View onSpriteMouseUp: (e) -> clearInterval(@movementInterval) if @movementInterval? @movementInterval = null + @surface.camera.dragDisabled = false return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id pos = @selectedExtantThang.pos physicalOriginal = componentOriginals["physics.Physical"] @@ -329,6 +345,7 @@ module.exports = class ThangsTabView extends View onThangsChanged: (e) => @level.set 'thangs', @thangsTreema.data + return if @editThangView serializedLevel = @level.serialize @supermodel try @world.loadFromLevel serializedLevel, false @@ -343,7 +360,7 @@ module.exports = class ThangsTabView extends View onTreemaThangSelected: (e, selectedTreemas) => selectedThangID = _.last(selectedTreemas)?.data.id if selectedThangID isnt @selectedExtantThang?.id - @surface.spriteBoss.selectThang selectedThangID + @surface.spriteBoss.selectThang selectedThangID, null, true onTreemaThangDoubleClicked: (e, treema) => id = treema?.data?.id @@ -380,6 +397,8 @@ module.exports = class ThangsTabView extends View onLevelThangDoneEditing: -> @removeSubView @editThangView + @editThangView = null + @onThangsChanged() @$el.find('.thangs-column').show() diff --git a/app/views/editor/level/versions.coffee b/app/views/editor/level/versions_view.coffee similarity index 54% rename from app/views/editor/level/versions.coffee rename to app/views/editor/level/versions_view.coffee index 88d8c990d..09aa5925e 100644 --- a/app/views/editor/level/versions.coffee +++ b/app/views/editor/level/versions_view.coffee @@ -1,6 +1,6 @@ -VersionsView = require 'views/kinds/VersionsView' +VersionsModalView = require 'views/modal/versions_modal' -module.exports = class SuperVersionsView extends VersionsView +module.exports = class LevelVersionsView extends VersionsModalView id: "editor-level-versions-view" url: "/db/level/" page: "level" diff --git a/app/views/editor/thang/colors_tab_view.coffee b/app/views/editor/thang/colors_tab_view.coffee index 4f42a15fc..b1ba229dc 100644 --- a/app/views/editor/thang/colors_tab_view.coffee +++ b/app/views/editor/thang/colors_tab_view.coffee @@ -115,6 +115,7 @@ module.exports = class ColorsTabView extends CocoView treemaOptions = data: data schema: schema + readOnly: true unless me.isAdmin() or @thangType.hasWriteAccess(me) callbacks: change: @onColorGroupsChanged select: @onColorGroupSelected diff --git a/app/views/editor/thang/edit.coffee b/app/views/editor/thang/edit.coffee index de0cc062e..23fa7f38d 100644 --- a/app/views/editor/thang/edit.coffee +++ b/app/views/editor/thang/edit.coffee @@ -6,6 +6,7 @@ SpriteBuilder = require 'lib/sprites/SpriteBuilder' CocoSprite = require 'lib/surface/CocoSprite' Camera = require 'lib/surface/Camera' ThangComponentEditView = require 'views/editor/components/main' +VersionHistoryView = require './versions_view' DocumentFiles = require 'collections/DocumentFiles' ColorsTabView = require './colors_tab_view' @@ -30,6 +31,7 @@ module.exports = class ThangTypeEditView extends View 'change #animations-select': 'showAnimation' 'click #marker-button': 'toggleDots' 'click #end-button': 'endAnimation' + 'click #history-button': 'showVersionHistory' subscriptions: 'save-new-version': 'saveNewThangType' @@ -42,6 +44,7 @@ module.exports = class ThangTypeEditView extends View @thangType = new ThangType(_id: @thangTypeID) @thangType.saveBackups = true @thangType.fetch() + @thangType.loadSchema() @thangType.schema().once 'sync', @onThangTypeSync, @ @thangType.once 'sync', @onThangTypeSync, @ @refreshAnimation = _.debounce @refreshAnimation, 500 @@ -57,6 +60,7 @@ module.exports = class ThangTypeEditView extends View context = super(context) context.thangType = @thangType context.animations = @getAnimationNames() + context.authorized = me.isAdmin() or @thangType.hasWriteAccess(me) context getAnimationNames: -> @@ -266,7 +270,7 @@ module.exports = class ThangTypeEditView extends View @$el.find('.rotation-label').text " #{value}° " if @currentSprite @currentSprite.rotation = value - @currentSprite.update() + @currentSprite.update(true) updateScale: => value = (@scaleSlider.slider('value') + 1) / 10 @@ -314,7 +318,7 @@ module.exports = class ThangTypeEditView extends View @thangType.set 'actions', undefined @clearDisplayObject() @treema.set('/', @getThangData()) - + getThangData: -> data = _.cloneDeep(@thangType.attributes) data = _.pick data, (value, key) => not (key in ['components']) @@ -328,6 +332,7 @@ module.exports = class ThangTypeEditView extends View schema: schema files: @files filePath: "db/thang.type/#{@thangType.get('original')}" + readOnly: true unless me.isAdmin() or @thangType.hasWriteAccess(me) callbacks: change: @pushChangesToPreview select: @onSelectNode @@ -380,3 +385,8 @@ module.exports = class ThangTypeEditView extends View destroy: -> @camera?.destroy() super() + + showVersionHistory: (e) -> + versionHistoryView = new VersionHistoryView thangType:@thangType, @thangTypeID + @openModalView versionHistoryView + Backbone.Mediator.publish 'level:view-switched', e diff --git a/app/views/editor/thang/versions.coffee b/app/views/editor/thang/versions_view.coffee similarity index 55% rename from app/views/editor/thang/versions.coffee rename to app/views/editor/thang/versions_view.coffee index a52f3d1cf..889d9c902 100755 --- a/app/views/editor/thang/versions.coffee +++ b/app/views/editor/thang/versions_view.coffee @@ -1,6 +1,6 @@ -VersionsView = require 'views/kinds/VersionsView' +VersionsModalView = require 'views/modal/versions_modal' -module.exports = class SuperVersionsView extends VersionsView +module.exports = class ComponentVersionsView extends VersionsModalView id: "editor-thang-versions-view" url: "/db/thang.type/" page: "thang" diff --git a/app/views/home_view.coffee b/app/views/home_view.coffee index 7289b4ca9..aabece44d 100644 --- a/app/views/home_view.coffee +++ b/app/views/home_view.coffee @@ -11,6 +11,10 @@ module.exports = class HomeView extends View events: 'mouseover #beginner-campaign': 'onMouseOverButton' 'mouseout #beginner-campaign': 'onMouseOutButton' + + constructor: -> + super(arguments...) + ThangType.loadUniversalWizard() getRenderData: -> c = super() @@ -28,12 +32,8 @@ module.exports = class HomeView extends View @$el.find('.modal').on 'shown.bs.modal', -> $('input:visible:first', @).focus() - wizOriginal = "52a00d55cf1818f2be00000b" - url = "/db/thang_type/#{wizOriginal}/version" - @wizardType = new ThangType() - @wizardType.url = -> url - @wizardType.fetch() - @wizardType.once 'sync', @initCanvas + @wizardType = ThangType.wizardType + if @wizardType.loaded then @initCanvas else @wizardType.once 'sync', @initCanvas, @ # Try to find latest level and set "Play" link to go to that level if localStorage? @@ -48,7 +48,7 @@ module.exports = class HomeView extends View else console.log("TODO: Insert here code to get latest level played from the database. If this can't be found, we just let the user play the first level.") - initCanvas: => + initCanvas: -> @stage = new createjs.Stage($('#beginner-campaign canvas', @$el)[0]) @createWizard() @@ -67,12 +67,13 @@ module.exports = class HomeView extends View createWizard: (scale=3.7) -> spriteOptions = thangID: "Beginner Wizard", resolutionFactor: scale @wizardSprite = new WizardSprite @wizardType, spriteOptions - @wizardSprite.update() wizardDisplayObject = @wizardSprite.displayObject wizardDisplayObject.x = 70 wizardDisplayObject.y = 120 wizardDisplayObject.scaleX = wizardDisplayObject.scaleY = scale wizardDisplayObject.scaleX *= -1 + @wizardSprite.queueAction 'idle' + @wizardSprite.update() @stage.addChild wizardDisplayObject @stage.update() diff --git a/app/views/kinds/CocoView.coffee b/app/views/kinds/CocoView.coffee index 2811318c6..b95abd12e 100644 --- a/app/views/kinds/CocoView.coffee +++ b/app/views/kinds/CocoView.coffee @@ -10,7 +10,7 @@ makeScopeName = -> "view-scope-#{classCount++}" module.exports = class CocoView extends Backbone.View startsLoading: false - cache: true # signals to the router to keep this view around + cache: false # signals to the router to keep this view around template: -> '' events: @@ -37,6 +37,7 @@ module.exports = class CocoView extends Backbone.View destroy: -> @stopListening() + @off() @stopListeningToShortcuts() @undelegateEvents() # removes both events and subs view.destroy() for id, view of @subviews @@ -98,10 +99,11 @@ module.exports = class CocoView extends Backbone.View view = application.router.getView(target, '_modal') # could set up a system for loading cached modals, if told to @openModalView(view) - openModalView: (modalView) -> - return if @waitingModal # can only have one waiting at once + openModalView: (modalView, softly=false) -> + return if waitingModal # can only have one waiting at once if visibleModal waitingModal = modalView + return if softly return visibleModal.hide() if visibleModal.$el.is(':visible') # close, then this will get called again return @modalClosed(visibleModal) # was closed, but modalClosed was not called somehow modalView.render() diff --git a/app/views/kinds/RootView.coffee b/app/views/kinds/RootView.coffee index 6dbc36be0..b27ebb92f 100644 --- a/app/views/kinds/RootView.coffee +++ b/app/views/kinds/RootView.coffee @@ -38,8 +38,15 @@ module.exports = class RootView extends CocoView location.hash = '' location.hash = hash @buildLanguages() + + afterRender: -> + super(arguments...) + @chooseTab(location.hash.replace('#','')) if location.hash - # TODO: automate tabs to put in hashes and navigate to them here + chooseTab: (category) -> + $("a[href='##{category}']", @$el).tab('show') + + # TODO: automate tabs to put in hashes when they are clicked buildLanguages: -> $select = @$el.find(".language-dropdown").empty() diff --git a/app/views/kinds/SearchView.coffee b/app/views/kinds/SearchView.coffee index e89d080e4..1198f74a1 100644 --- a/app/views/kinds/SearchView.coffee +++ b/app/views/kinds/SearchView.coffee @@ -28,14 +28,20 @@ module.exports = class ThangTypeHomeView extends View getRenderData: -> context = super() - context.modelLabel = @modelLabel switch @modelLabel when 'Level' context.currentEditor = 'editor.level_title' + context.currentNew = 'editor.new_level_title' + context.currentSearch = 'editor.level_search_title' when 'Thang Type' context.currentEditor = 'editor.thang_title' + context.currentNew = 'editor.new_thang_title' + context.currentSearch = 'editor.thang_search_title' when 'Article' context.currentEditor = 'editor.article_title' + context.currentNew = 'editor.new_article_title' + context.currentSearch = 'editor.article_search_title' + @$el.i18n() context constructor: (options) -> @@ -77,6 +83,7 @@ module.exports = class ThangTypeHomeView extends View documents = @collection.models table = $(@tableTemplate(documents:documents)) @$el.find('table').replaceWith(table) + @$el.find('table').i18n() removeOldSearch: -> return unless @collection? diff --git a/app/views/modal/signup_modal.coffee b/app/views/modal/signup_modal.coffee index 579a938cb..d1c76e3a1 100644 --- a/app/views/modal/signup_modal.coffee +++ b/app/views/modal/signup_modal.coffee @@ -49,8 +49,9 @@ module.exports = class SignupModalView extends View userObject.emailSubscriptions ?= [] if subscribe userObject.emailSubscriptions.push 'announcement' unless 'announcement' in userObject.emailSubscriptions + userObject.emailSubscriptions.push 'notification' unless 'notification' in userObject.emailSubscriptions else - userObject.emailSubscriptions = _.without (userObject.emailSubscriptions ? []), 'announcement' + userObject.emailSubscriptions = _.without (userObject.emailSubscriptions ? []), 'announcement', 'notification' res = tv4.validateMultiple userObject, User.schema.attributes return forms.applyErrorsToForm(@$el, res.errors) unless res.valid window.tracker?.trackEvent 'Finished Signup' diff --git a/app/views/kinds/VersionsView.coffee b/app/views/modal/versions_modal.coffee similarity index 83% rename from app/views/kinds/VersionsView.coffee rename to app/views/modal/versions_modal.coffee index e686d6129..212572666 100755 --- a/app/views/kinds/VersionsView.coffee +++ b/app/views/modal/versions_modal.coffee @@ -1,5 +1,5 @@ -View = require 'views/kinds/RootView' -template = require 'templates/kinds/versions' +ModalView = require 'views/kinds/ModalView' +template = require 'templates/modal/versions' tableTemplate = require 'templates/kinds/table' class VersionsViewCollection extends Backbone.Collection @@ -10,14 +10,14 @@ class VersionsViewCollection extends Backbone.Collection @url = url + levelID + '/versions' @model = model -module.exports = class SuperVersionsView extends View +module.exports = class VersionsModalView extends ModalView template: template startsLoading: true # needs to be overwritten by child id: "" - url = "" - page = "" + url: "" + page: "" constructor: (options, @ID, @model) -> super options diff --git a/app/views/play/ladder/ladder_tab.coffee b/app/views/play/ladder/ladder_tab.coffee new file mode 100644 index 000000000..466b0a402 --- /dev/null +++ b/app/views/play/ladder/ladder_tab.coffee @@ -0,0 +1,105 @@ +CocoView = require 'views/kinds/CocoView' +Level = require 'models/Level' +LevelSession = require 'models/LevelSession' +CocoCollection = require 'models/CocoCollection' +LeaderboardCollection = require 'collections/LeaderboardCollection' +{teamDataFromLevel} = require './utils' + +HIGHEST_SCORE = 1000000 + +class LevelSessionsCollection extends CocoCollection + url: '' + model: LevelSession + + constructor: (levelID) -> + super() + @url = "/db/level/#{levelID}/all_sessions" + +module.exports = class LadderTabView extends CocoView + id: 'ladder-tab-view' + template: require 'templates/play/ladder/ladder_tab' + startsLoading: true + + constructor: (options, @level, @sessions) -> + super(options) + @teams = teamDataFromLevel @level + @leaderboards = {} + @refreshLadder() + + refreshLadder: -> + for team in @teams + @leaderboards[team.id]?.off 'sync' +# teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id + teamSession = null +# console.log "Team session: #{JSON.stringify teamSession}" + @leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession) + @leaderboards[team.id].once 'sync', @onLeaderboardLoaded, @ + + onLeaderboardLoaded: -> @renderMaybe() + + renderMaybe: -> + leaderboardModels = _.values(@leaderboards) + return unless _.every leaderboardModels, (loader) -> loader.loaded + @startsLoading = false + @render() + + getRenderData: -> + ctx = super() + ctx.level = @level + ctx.link = "/play/level/#{@level.get('name')}" + ctx.teams = @teams + team.leaderboard = @leaderboards[team.id] for team in @teams + ctx.levelID = @levelID + ctx + +class LeaderboardData + constructor: (@level, @team, @session) -> + _.extend @, Backbone.Events + limit = 200 # if @session then 10 else 20 # We need to figure out paging. + @topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: limit}) + @topPlayers.fetch() + @topPlayers.comparator = (model) -> + return -model.get('totalScore') + @topPlayers.sort() + + @topPlayers.once 'sync', @leaderboardPartLoaded, @ + +# if @session +# score = @session.get('totalScore') or 25 +# @playersAbove = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 4, team: @team}) +# @playersAbove.fetch() +# @playersAbove.once 'sync', @leaderboardPartLoaded, @ +# @playersBelow = new LeaderboardCollection(@level, {order:-1, scoreOffset: score, limit: 4, team: @team}) +# @playersBelow.fetch() +# @playersBelow.once 'sync', @leaderboardPartLoaded, @ + + leaderboardPartLoaded: -> + # Forget loading the up-to-date names, that's way too slow for something that refreshes all the time, we learned. + @loaded = true + @trigger 'sync' + return + if @session + if @topPlayers.loaded # and @playersAbove.loaded and @playersBelow.loaded + @loaded = true + @fetchNames() + else + @loaded = true + @fetchNames() + + fetchNames: -> + sessionCollections = [@topPlayers, @playersAbove, @playersBelow] + sessionCollections = (s for s in sessionCollections when s) + ids = [] + for collection in sessionCollections + ids.push model.get('creator') for model in collection.models + + success = (nameMap) => + for collection in sessionCollections + session.set('creatorName', nameMap[session.get('creator')]) for session in collection.models + @trigger 'sync' + + $.ajax('/db/user/-/names', { + data: {ids: ids} + type: 'POST' + success: success + }) diff --git a/app/views/play/ladder/my_matches_tab.coffee b/app/views/play/ladder/my_matches_tab.coffee new file mode 100644 index 000000000..2772defa5 --- /dev/null +++ b/app/views/play/ladder/my_matches_tab.coffee @@ -0,0 +1,141 @@ +CocoView = require 'views/kinds/CocoView' +Level = require 'models/Level' +LevelSession = require 'models/LevelSession' +LeaderboardCollection = require 'collections/LeaderboardCollection' +{teamDataFromLevel} = require './utils' + +module.exports = class MyMatchesTabView extends CocoView + id: 'my-matches-tab-view' + template: require 'templates/play/ladder/my_matches_tab' + startsLoading: true + + events: + 'click .rank-button': 'rankSession' + + constructor: (options, @level, @sessions) -> + super(options) + @nameMap = {} + @refreshMatches() + + refreshMatches: -> + @teams = teamDataFromLevel @level + @loadNames() + + loadNames: -> + # Only fetch the names for the userIDs we don't already have in @nameMap + ids = [] + for session in @sessions.models + for match in (session.get('matches') or []) + id = match.opponents[0].userID + ids.push id unless @nameMap[id] + + return @finishRendering() unless ids.length + + success = (nameMap) => + for session in @sessions.models + for match in session.get('matches') or [] + opponent = match.opponents[0] + @nameMap[opponent.userID] ?= nameMap[opponent.userID] + @finishRendering() + + $.ajax('/db/user/-/names', { + data: {ids: ids} + type: 'POST' + success: success + }) + + finishRendering: -> + @startsLoading = false + @render() + + getRenderData: -> + ctx = super() + ctx.level = @level + ctx.levelID = @level.get('slug') or @level.id + ctx.teams = @teams + + convertMatch = (match, submitDate) => + opponent = match.opponents[0] + state = 'win' + state = 'loss' if match.metrics.rank > opponent.metrics.rank + state = 'tie' if match.metrics.rank is opponent.metrics.rank + { + state: state + opponentName: @nameMap[opponent.userID] + opponentID: opponent.userID + when: moment(match.date).fromNow() + sessionID: opponent.sessionID + stale: match.date < submitDate + } + + for team in @teams + team.session = (s for s in @sessions.models when s.get('team') is team.id)[0] + team.readyToRank = @readyToRank(team.session) + team.isRanking = team.session?.get('isRanking') + team.matches = (convertMatch(match, team.session.get('submitDate')) for match in team.session?.get('matches') or []) + team.matches.reverse() + team.score = (team.session?.get('totalScore') or 10).toFixed(2) + team.wins = _.filter(team.matches, {state: 'win'}).length + team.ties = _.filter(team.matches, {state: 'tie'}).length + team.losses = _.filter(team.matches, {state: 'loss'}).length + scoreHistory = team.session?.get('scoreHistory') + if scoreHistory?.length > 1 + scoreHistory = _.last scoreHistory, 100 # Chart URL needs to be under 2048 characters for GET + team.currentScore = Math.round scoreHistory[scoreHistory.length - 1][1] * 100 + team.chartColor = team.primaryColor.replace '#', '' + #times = (s[0] for s in scoreHistory) + #times = ((100 * (t - times[0]) / (times[times.length - 1] - times[0])).toFixed(1) for t in times) + # Let's try being independent of time. + times = (i for s, i in scoreHistory) + scores = (s[1] for s in scoreHistory) + lowest = _.min scores.concat([0]) + highest = _.max scores.concat(50) + scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores) + team.chartData = times.join(',') + '|' + scores.join(',') + team.minScore = Math.round(100 * lowest) + team.maxScore = Math.round(100 * highest) + + ctx + + afterRender: -> + super() + @$el.find('.rank-button').each (i, el) => + button = $(el) + sessionID = button.data('session-id') + session = _.find @sessions.models, {id: sessionID} + rankingState = 'unavailable' + if @readyToRank session + rankingState = 'rank' + else if session.get 'isRanking' + rankingState = 'ranking' + @setRankingButtonText button, rankingState + + readyToRank: (session) -> + return false unless session?.get('levelID') # If it hasn't been denormalized, then it's not ready. + c1 = session?.get('code') + c2 = session?.get('submittedCode') + c1 and not _.isEqual(c1, c2) + + rankSession: (e) -> + button = $(e.target).closest('.rank-button') + sessionID = button.data('session-id') + session = _.find @sessions.models, {id: sessionID} + return unless @readyToRank(session) + + @setRankingButtonText(button, 'submitting') + success = => @setRankingButtonText(button, 'submitted') + failure = => @setRankingButtonText(button, 'failed') + + ajaxData = {session: sessionID, levelID: @level.id, originalLevelID: @level.attributes.original, levelMajorVersion: @level.attributes.version.major} + console.log "Posting game for ranking from My Matches view." + $.ajax '/queue/scoring', { + type: 'POST' + data: ajaxData + success: success + failure: failure + } + + setRankingButtonText: (rankButton, spanClass) -> + rankButton.find('span').addClass('hidden') + rankButton.find(".#{spanClass}").removeClass('hidden') + rankButton.toggleClass 'disabled', spanClass isnt 'rank' diff --git a/app/views/play/ladder/play_modal.coffee b/app/views/play/ladder/play_modal.coffee new file mode 100644 index 000000000..ebe51e68d --- /dev/null +++ b/app/views/play/ladder/play_modal.coffee @@ -0,0 +1,179 @@ +View = require 'views/kinds/ModalView' +template = require 'templates/play/ladder/play_modal' +ThangType = require 'models/ThangType' +{me} = require 'lib/auth' +LeaderboardCollection = require 'collections/LeaderboardCollection' +{teamDataFromLevel} = require './utils' + +module.exports = class LadderPlayModal extends View + id: "ladder-play-modal" + template: template + closeButton: true + startsLoading: true + @shownTutorialButton: false + + events: + 'click #skip-tutorial-button': 'hideTutorialButtons' + + constructor: (options, @level, @session, @team) -> + super(options) + @nameMap = {} + @otherTeam = if team is 'ogres' then 'humans' else 'ogres' + @startLoadingChallengersMaybe() + @wizardType = ThangType.loadUniversalWizard() + + # PART 1: Load challengers from the db unless some are in the matches + + startLoadingChallengersMaybe: -> + matches = @session?.get('matches') + if matches?.length then @loadNames() else @loadChallengers() + + loadChallengers: -> + @challengersCollection = new ChallengersData(@level, @team, @otherTeam, @session) + @challengersCollection.on 'sync', @loadNames, @ + + # PART 2: Loading the names of the other users + + loadNames: -> + @challengers = @getChallengers() + ids = (challenger.opponentID for challenger in _.values @challengers) + + success = (@nameMap) => + for challenger in _.values(@challengers) + challenger.opponentName = @nameMap[challenger.opponentID]?.name or 'Anoner' + challenger.opponentWizard = @nameMap[challenger.opponentID]?.wizard or {} + @checkWizardLoaded() + + $.ajax('/db/user/-/names', { + data: {ids: ids, wizard: true} + type: 'POST' + success: success + }) + + # PART 3: Make sure wizard is loaded + + checkWizardLoaded: -> + if @wizardType.loaded then @finishRendering() else @wizardType.once 'sync', @finishRendering, @ + + # PART 4: Render + + finishRendering: -> + @startsLoading = false + @render() + @maybeShowTutorialButtons() + + getRenderData: -> + ctx = super() + ctx.level = @level + ctx.levelID = @level.get('slug') or @level.id + ctx.teamName = _.string.titleize @team + ctx.teamID = @team + ctx.otherTeamID = @otherTeam + + teamsList = teamDataFromLevel @level + teams = {} + teams[team.id] = team for team in teamsList + ctx.teamColor = teams[@team].primaryColor + ctx.teamBackgroundColor = teams[@team].bgColor + ctx.opponentTeamColor = teams[@otherTeam].primaryColor + ctx.opponentTeamBackgroundColor = teams[@otherTeam].bgColor + + ctx.challengers = @challengers or {} + for challenger in _.values ctx.challengers + continue unless challenger and @wizardType.loaded + if (not challenger.opponentImageSource) and challenger.opponentWizard?.colorConfig + challenger.opponentImageSource = @wizardType.getPortraitSource( + {colorConfig: challenger.opponentWizard.colorConfig}) + + if @wizardType.loaded + ctx.genericPortrait = @wizardType.getPortraitSource() + myColorConfig = me.get('wizard')?.colorConfig + ctx.myPortrait = if myColorConfig then @wizardType.getPortraitSource({colorConfig: myColorConfig}) else ctx.genericPortrait + + ctx.myName = me.get('name') || 'Newcomer' + ctx + + maybeShowTutorialButtons: -> + return if @session or LadderPlayModal.shownTutorialButton + @$el.find('#normal-view').addClass('secret') + @$el.find('.modal-header').addClass('secret') + @$el.find('#noob-view').removeClass('secret') + LadderPlayModal.shownTutorialButton = true + + hideTutorialButtons: -> + @$el.find('#normal-view').removeClass('secret') + @$el.find('.modal-header').removeClass('secret') + @$el.find('#noob-view').addClass('secret') + + # Choosing challengers + + getChallengers: -> + # make an object of challengers to everything needed to link to them + challengers = {} + if @challengersCollection + easyInfo = @challengeInfoFromSession(@challengersCollection.easyPlayer.models[0]) + mediumInfo = @challengeInfoFromSession(@challengersCollection.mediumPlayer.models[0]) + hardInfo = @challengeInfoFromSession(@challengersCollection.hardPlayer.models[0]) + else + matches = @session.get('matches') + won = (m for m in matches when m.metrics.rank < m.opponents[0].metrics.rank) + lost = (m for m in matches when m.metrics.rank > m.opponents[0].metrics.rank) + tied = (m for m in matches when m.metrics.rank is m.opponents[0].metrics.rank) + easyInfo = @challengeInfoFromMatches(won) + mediumInfo = @challengeInfoFromMatches(tied) + hardInfo = @challengeInfoFromMatches(lost) + @addChallenger easyInfo, challengers, 'easy' + @addChallenger mediumInfo, challengers, 'medium' + @addChallenger hardInfo, challengers, 'hard' + challengers + + addChallenger: (info, challengers, title) -> + # check for duplicates first + return unless info + for key, value of challengers + return if value.sessionID is info.sessionID + challengers[title] = info + + challengeInfoFromSession: (session) -> + # given a model from the db, return info needed for a link to the match + return unless session + return { + sessionID: session.id + opponentID: session.get('creator') + } + + challengeInfoFromMatches: (matches) -> + return unless matches?.length + match = _.sample matches + opponent = match.opponents[0] + return { + sessionID: opponent.sessionID + opponentID: opponent.userID + } + + +class ChallengersData + constructor: (@level, @team, @otherTeam, @session) -> + _.extend @, Backbone.Events + score = @session?.get('totalScore') or 25 + @easyPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score - 5, limit: 1, team: @otherTeam}) + @easyPlayer.fetch() + @easyPlayer.once 'sync', @challengerLoaded, @ + @mediumPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 1, team: @otherTeam}) + @mediumPlayer.fetch() + @mediumPlayer.once 'sync', @challengerLoaded, @ + @hardPlayer = new LeaderboardCollection(@level, {order:-1, scoreOffset: score + 5, limit: 1, team: @otherTeam}) + @hardPlayer.fetch() + @hardPlayer.once 'sync', @challengerLoaded, @ + + challengerLoaded: -> + if @allLoaded() + @loaded = true + @trigger 'sync' + + playerIDs: -> + collections = [@easyPlayer, @mediumPlayer, @hardPlayer] + (c.models[0].get('creator') for c in collections when c?.models[0]) + + allLoaded: -> + _.all [@easyPlayer.loaded, @mediumPlayer.loaded, @hardPlayer.loaded] diff --git a/app/views/play/ladder/team_view.coffee b/app/views/play/ladder/team_view.coffee deleted file mode 100644 index 32adcbc24..000000000 --- a/app/views/play/ladder/team_view.coffee +++ /dev/null @@ -1,195 +0,0 @@ -RootView = require 'views/kinds/RootView' -Level = require 'models/Level' -LevelSession = require 'models/LevelSession' -LeaderboardCollection = require 'collections/LeaderboardCollection' - -module.exports = class LadderTeamView extends RootView - id: 'ladder-team-view' - template: require 'templates/play/ladder/team' - startsLoading: true - - events: - 'click #rank-button': 'rankSession' - - # PART 1: Loading Level/Session - - constructor: (options, @levelID, @team) -> - super(options) - @otherTeam = if team is 'ogres' then 'humans' else 'ogres' - @level = new Level(_id:@levelID) - @level.fetch() - @level.once 'sync', @onLevelLoaded, @ - - url = "/db/level/#{@levelID}/session?team=#{@team}" - @session = new LevelSession() - @session.url = -> url - @session.fetch() - @session.once 'sync', @onSessionLoaded, @ - - onLevelLoaded: -> @startLoadingChallengersMaybe() - onSessionLoaded: -> @startLoadingChallengersMaybe() - - # PART 2: Loading some challengers if we don't have any matches yet - - startLoadingChallengersMaybe: -> - return unless @level.loaded and @session.loaded - matches = @session.get('matches') - if matches?.length then @loadNames() else @loadChallengers() - - loadChallengers: -> - @challengers = new ChallengersData(@level, @team, @otherTeam, @session) - @challengers.on 'sync', @loadNames, @ - - # PART 3: Loading the names of the other users - - loadNames: -> - ids = [] - ids.push match.opponents[0].userID for match in @session.get('matches') or [] - ids = ids.concat(@challengers.playerIDs()) if @challengers - - success = (@nameMap) => - for match in @session.get('matches') or [] - opponent = match.opponents[0] - opponent.userName = @nameMap[opponent.userID] - @finishRendering() - - $.ajax('/db/user/-/names', { - data: {ids: ids} - type: 'POST' - success: success - }) - - # PART 4: Rendering - - finishRendering: -> - @startsLoading = false - @render() - - getRenderData: -> - ctx = super() - ctx.level = @level - ctx.levelID = @levelID - ctx.teamName = _.string.titleize @team - ctx.teamID = @team - ctx.otherTeamID = @otherTeam - ctx.challengers = if not @startsLoading then @getChallengers() else {} - ctx.readyToRank = @readyToRank() - - convertMatch = (match) => - opponent = match.opponents[0] - state = 'win' - state = 'loss' if match.metrics.rank > opponent.metrics.rank - state = 'tie' if match.metrics.rank is opponent.metrics.rank - { - state: state - opponentName: @nameMap[opponent.userID] - opponentID: opponent.userID - when: moment(match.date).fromNow() - sessionID: opponent.sessionID - } - - ctx.matches = (convertMatch(match) for match in @session.get('matches') or []) - ctx.matches.reverse() - ctx.score = (@session.get('totalScore') or 10).toFixed(2) - ctx - - afterRender: -> - super() - @setRankingButtonText(if @readyToRank() then 'rank' else 'unavailable') - - readyToRank: -> - c1 = @session.get('code') - c2 = @session.get('submittedCode') - c1 and not _.isEqual(c1, c2) - - getChallengers: -> - # make an object of challengers to everything needed to link to them - challengers = {} - if @challengers - easyInfo = @challengeInfoFromSession(@challengers.easyPlayer.models[0]) - mediumInfo = @challengeInfoFromSession(@challengers.mediumPlayer.models[0]) - hardInfo = @challengeInfoFromSession(@challengers.hardPlayer.models[0]) - else - matches = @session.get('matches') - won = (m for m in matches when m.metrics.rank < m.opponents[0].metrics.rank) - lost = (m for m in matches when m.metrics.rank > m.opponents[0].metrics.rank) - tied = (m for m in matches when m.metrics.rank is m.opponents[0].metrics.rank) - easyInfo = @challengeInfoFromMatches(won) - mediumInfo = @challengeInfoFromMatches(tied) - hardInfo = @challengeInfoFromMatches(lost) - @addChallenger easyInfo, challengers, 'easy' - @addChallenger mediumInfo, challengers, 'medium' - @addChallenger hardInfo, challengers, 'hard' - challengers - - addChallenger: (info, challengers, title) -> - # check for duplicates first - return unless info - for key, value of challengers - return if value.sessionID is info.sessionID - challengers[title] = info - - challengeInfoFromSession: (session) -> - # given a model from the db, return info needed for a link to the match - return unless session - return { - sessionID: session.id - opponentName: @nameMap[session.get('creator')] or 'Anoner' - opponentID: session.get('creator') - } - - challengeInfoFromMatches: (matches) -> - return unless matches?.length - match = _.sample matches - opponent = match.opponents[0] - return { - sessionID: opponent.sessionID - opponentName: opponent.userName or 'Anoner' - opponentID: opponent.userID - } - - rankSession: -> - return unless @readyToRank() - @setRankingButtonText('ranking') - - success = => @setRankingButtonText('ranked') - failure = => @setRankingButtonText('failed') - - $.ajax '/queue/scoring', { - type: 'POST' - data: { session: @session.id } - success: success - failure: failure - } - - setRankingButtonText: (spanClass) -> - rankButton = $('#rank-button') - rankButton.find('span').addClass('hidden') - rankButton.find(".#{spanClass}").removeClass('hidden') - rankButton.toggleClass 'disabled', spanClass isnt 'rank' - -class ChallengersData - constructor: (@level, @team, @otherTeam, @session) -> - _.extend @, Backbone.Events - score = @session?.get('totalScore') or 25 - @easyPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score - 5, limit: 1, team: @otherTeam}) - @easyPlayer.fetch() - @easyPlayer.once 'sync', @challengerLoaded, @ - @mediumPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 1, team: @otherTeam}) - @mediumPlayer.fetch() - @mediumPlayer.once 'sync', @challengerLoaded, @ - @hardPlayer = new LeaderboardCollection(@level, {order:-1, scoreOffset: score + 5, limit: 1, team: @otherTeam}) - @hardPlayer.fetch() - @hardPlayer.once 'sync', @challengerLoaded, @ - - challengerLoaded: -> - if @allLoaded() - @loaded = true - @trigger 'sync' - - playerIDs: -> - collections = [@easyPlayer, @mediumPlayer, @hardPlayer] - (c.models[0].get('creator') for c in collections when c?.models[0]) - - allLoaded: -> - _.all [@easyPlayer.loaded, @mediumPlayer.loaded, @hardPlayer.loaded] diff --git a/app/views/play/ladder/utils.coffee b/app/views/play/ladder/utils.coffee new file mode 100644 index 000000000..10f088093 --- /dev/null +++ b/app/views/play/ladder/utils.coffee @@ -0,0 +1,22 @@ +{hslToHex} = require 'lib/utils' + +module.exports.teamDataFromLevel = (level) -> + alliedSystem = _.find level.get('systems'), (value) -> value.config?.teams? + teamNames = (teamName for teamName, teamConfig of alliedSystem.config.teams when teamConfig.playable) + teamConfigs = alliedSystem.config.teams + + teams = [] + for team in teamNames or [] + otherTeam = if team is 'ogres' then 'humans' else 'ogres' + color = teamConfigs[team].color + bgColor = hslToHex([color.hue, color.saturation, color.lightness + (1 - color.lightness) * 0.5]) + primaryColor = hslToHex([color.hue, 0.5, 0.5]) + teams.push({ + id: team + name: _.string.titleize(team) + otherTeam: otherTeam + bgColor: bgColor + primaryColor: primaryColor + }) + + teams \ No newline at end of file diff --git a/app/views/play/ladder_view.coffee b/app/views/play/ladder_view.coffee index 0ff4e6717..e275d0613 100644 --- a/app/views/play/ladder_view.coffee +++ b/app/views/play/ladder_view.coffee @@ -3,8 +3,12 @@ Level = require 'models/Level' Simulator = require 'lib/simulator/Simulator' LevelSession = require 'models/LevelSession' CocoCollection = require 'models/CocoCollection' -LeaderboardCollection = require 'collections/LeaderboardCollection' -{hslToHex} = require 'lib/utils' +{teamDataFromLevel} = require './ladder/utils' +application = require 'application' + +LadderTabView = require './ladder/ladder_tab' +MyMatchesTabView = require './ladder/my_matches_tab' +LadderPlayModal = require './ladder/play_modal' HIGHEST_SCORE = 1000000 @@ -14,19 +18,74 @@ class LevelSessionsCollection extends CocoCollection constructor: (levelID) -> super() - @url = "/db/level/#{levelID}/all_sessions" + @url = "/db/level/#{levelID}/my_sessions" module.exports = class LadderView extends RootView id: 'ladder-view' template: require 'templates/play/ladder' startsLoading: true + subscriptions: + 'application:idle-changed': 'onIdleChanged' + events: 'click #simulate-button': 'onSimulateButtonClick' 'click #simulate-all-button': 'onSimulateAllButtonClick' + 'click .play-button': 'onClickPlayButton' + + constructor: (options, @levelID) -> + super(options) + @level = new Level(_id:@levelID) + p1 = @level.fetch() + @sessions = new LevelSessionsCollection(levelID) + p2 = @sessions.fetch({}) + @simulator = new Simulator() + @simulator.on 'statusUpdate', @updateSimulationStatus, @ + @teams = [] + $.when(p1, p2).then @onLoaded + + onLoaded: => + @teams = teamDataFromLevel @level + @startsLoading = false + @render() + + getRenderData: -> + ctx = super() + ctx.level = @level + ctx.link = "/play/level/#{@level.get('name')}" + ctx.simulationStatus = @simulationStatus + ctx.teams = @teams + ctx.levelID = @levelID + ctx.levelDescription = marked(@level.get('description')) if @level.get('description') + ctx + + afterRender: -> + super() + return if @startsLoading + @insertSubView(@ladderTab = new LadderTabView({}, @level, @sessions)) + @insertSubView(@myMatchesTab = new MyMatchesTabView({}, @level, @sessions)) + @refreshInterval = setInterval(@fetchSessionsAndRefreshViews.bind(@), 10 * 1000) + hash = document.location.hash[1..] if document.location.hash + if hash and not (hash in ['my-matches', 'simulate', 'ladder']) + @showPlayModal(hash) if @sessions.loaded + + fetchSessionsAndRefreshViews: -> + @sessions.fetch({"success": @refreshViews}) + + refreshViews: => + return if @destroyed or application.userIsIdle or new Date() - 2000 < @lastRefreshTime + @lastRefreshTime = new Date() + @ladderTab.refreshLadder() + @myMatchesTab.refreshMatches() + console.log "Refreshing ladder and matches views." + + onIdleChanged: (e) -> + @refreshViews() unless e.idle + + # Simulations onSimulateAllButtonClick: (e) -> - submitIDs = _.pluck @leaderboards[@teams[0]].topPlayers.models, "id" + submitIDs = _.pluck @leaderboards[@teams[0].id].topPlayers.models, "id" for ID in submitIDs $.ajax url: '/queue/scoring' @@ -58,140 +117,15 @@ module.exports = class LadderView extends RootView console.log "There was a problem with the named simulation status: #{e}" $("#simulation-status-text").text @simulationStatus + onClickPlayButton: (e) -> + @showPlayModal($(e.target).closest('.play-button').data('team')) - constructor: (options, @levelID) -> - super(options) - @level = new Level(_id:@levelID) - @level.fetch() - @level.once 'sync', @onLevelLoaded, @ - @simulator = new Simulator() - @simulator.on 'statusUpdate', @updateSimulationStatus, @ + showPlayModal: (teamID) -> + session = (s for s in @sessions.models when s.get('team') is teamID)[0] + modal = new LadderPlayModal({}, @level, session, teamID) + @openModalView modal -# @sessions = new LevelSessionsCollection(levelID) -# @sessions.fetch({}) -# @sessions.once 'sync', @onMySessionsLoaded, @ - - onLevelLoaded: -> @startLoadingPhaseTwoMaybe() - onMySessionsLoaded: -> - @startLoadingPhaseTwoMaybe() - - startLoadingPhaseTwoMaybe: -> - return unless @level.loaded # and @sessions.loaded - @loadPhaseTwo() - - loadPhaseTwo: -> - alliedSystem = _.find @level.get('systems'), (value) -> value.config?.teams? - teams = [] - for teamName, teamConfig of alliedSystem.config.teams - continue unless teamConfig.playable - teams.push teamName - @teams = teams - @teamConfigs = alliedSystem.config.teams - - @leaderboards = {} - @challengers = {} - for team in teams -# teamSession = _.find @sessions.models, (session) -> session.get('team') is team - teamSession = null - console.log "Team session: #{JSON.stringify teamSession}" - @leaderboards[team] = new LeaderboardData(@level, team, teamSession) - @leaderboards[team].once 'sync', @onLeaderboardLoaded, @ - - onChallengersLoaded: -> @renderMaybe() - onLeaderboardLoaded: -> @renderMaybe() - - renderMaybe: -> - loaders = _.values(@leaderboards) # .concat(_.values(@challengers)) - return unless _.every loaders, (loader) -> loader.loaded - @startsLoading = false - @render() - - getRenderData: -> - ctx = super() - ctx.level = @level - description = @level.get('description') - ctx.description = if description then marked(description) else '' - ctx.link = "/play/level/#{@level.get('name')}" - ctx.simulationStatus = @simulationStatus - ctx.teams = [] - ctx.levelID = @levelID - for team in @teams or [] - otherTeam = if team is 'ogres' then 'humans' else 'ogres' - color = @teamConfigs[team].color - bgColor = hslToHex([color.hue, color.saturation, color.lightness + (1 - color.lightness) * 0.5]) - primaryColor = hslToHex([color.hue, 0.5, 0.5]) - ctx.teams.push({ - id: team - name: _.string.titleize(team) - leaderboard: @leaderboards[team] - otherTeam: otherTeam - bgColor: bgColor - primaryColor: primaryColor - }) - ctx - -class LeaderboardData - constructor: (@level, @team, @session) -> - _.extend @, Backbone.Events - @topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: if @session then 10 else 20}) - @topPlayers.fetch() - @topPlayers.comparator = (model) -> - return -model.get('totalScore') - @topPlayers.sort() - - @topPlayers.once 'sync', @leaderboardPartLoaded, @ - -# if @session -# score = @session.get('totalScore') or 25 -# @playersAbove = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 4, team: @team}) -# @playersAbove.fetch() -# @playersAbove.once 'sync', @leaderboardPartLoaded, @ -# @playersBelow = new LeaderboardCollection(@level, {order:-1, scoreOffset: score, limit: 4, team: @team}) -# @playersBelow.fetch() -# @playersBelow.once 'sync', @leaderboardPartLoaded, @ - - leaderboardPartLoaded: -> - if @session - if @topPlayers.loaded # and @playersAbove.loaded and @playersBelow.loaded - @loaded = true - @fetchNames() - else - @loaded = true - @fetchNames() - - fetchNames: -> - sessionCollections = [@topPlayers, @playersAbove, @playersBelow] - sessionCollections = (s for s in sessionCollections when s) - ids = [] - for collection in sessionCollections - ids.push model.get('creator') for model in collection.models - - success = (nameMap) => - for collection in sessionCollections - session.set('creatorName', nameMap[session.get('creator')]) for session in collection.models - @trigger 'sync' - - $.ajax('/db/user/-/names', { - data: {ids: ids} - type: 'POST' - success: success - }) - -class ChallengersData - constructor: (@level, @team, @session) -> - _.extend @, Backbone.Events - score = @session?.get('totalScore') or 25 - @easyPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score - 5, limit: 1, team: @team}) - @easyPlayer.fetch() - @easyPlayer.once 'sync', @challengerLoaded, @ - @mediumPlayer = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 1, team: @team}) - @mediumPlayer.fetch() - @mediumPlayer.once 'sync', @challengerLoaded, @ - @hardPlayer = new LeaderboardCollection(@level, {order:-1, scoreOffset: score + 5, limit: 1, team: @team}) - @hardPlayer.fetch() - @hardPlayer.once 'sync', @challengerLoaded, @ - - challengerLoaded: -> - if @easyPlayer.loaded and @mediumPlayer.loaded and @hardPlayer.loaded - @loaded = true - @trigger 'sync' + destroy: -> + clearInterval @refreshInterval + @simulator.destroy() + super() diff --git a/app/views/play/level/control_bar_view.coffee b/app/views/play/level/control_bar_view.coffee index 392eb4ebf..6e6bd6d2e 100644 --- a/app/views/play/level/control_bar_view.coffee +++ b/app/views/play/level/control_bar_view.coffee @@ -24,6 +24,9 @@ module.exports = class ControlBarView extends View 'click #restart-button': -> window.tracker?.trackEvent 'Clicked Restart', level: @worldName, label: @worldName @showRestartModal() + + 'click #next-game-button': -> + Backbone.Mediator.publish 'next-game-pressed' 'click': -> Backbone.Mediator.publish 'focus-editor' @@ -33,6 +36,7 @@ module.exports = class ControlBarView extends View @level = options.level @playableTeams = options.playableTeams @ladderGame = options.ladderGame + @spectateGame = options.spectateGame ? false super options setBus: (@bus) -> @@ -52,9 +56,10 @@ module.exports = class ControlBarView extends View c.worldName = @worldName c.multiplayerEnabled = @session.get('multiplayer') c.ladderGame = @ladderGame + c.spectateGame = @spectateGame c.homeLink = "/" levelID = @level.get('slug') - if levelID in ["brawlwood", "brawlwood-tutorial"] + if levelID in ["brawlwood", "brawlwood-tutorial", "dungeon-arena", "dungeon-arena-tutorial"] levelID = 'brawlwood' if levelID is 'brawlwood-tutorial' c.homeLink = "/play/ladder/" + levelID c diff --git a/app/views/play/level/goals_view.coffee b/app/views/play/level/goals_view.coffee index b9eb3f89f..85d7436ac 100644 --- a/app/views/play/level/goals_view.coffee +++ b/app/views/play/level/goals_view.coffee @@ -1,6 +1,7 @@ View = require 'views/kinds/CocoView' template = require 'templates/play/level/goals' {me} = require 'lib/auth' +utils = require 'lib/utils' stateIconMap = incomplete: 'icon-minus' @@ -31,7 +32,7 @@ module.exports = class GoalsView extends View state = e.goalStates[goal.id] continue if goal.hiddenGoal and state.status isnt 'failure' continue if goal.team and me.team isnt goal.team - text = goal.i18n?[me.lang()]?.name ? goal.name + text = utils.i18n goal, 'name' if state.killed dead = _.filter(_.values(state.killed)).length targeted = _.values(state.killed).length diff --git a/app/views/play/level/hud_view.coffee b/app/views/play/level/hud_view.coffee index 79aad4e7c..ed3403925 100644 --- a/app/views/play/level/hud_view.coffee +++ b/app/views/play/level/hud_view.coffee @@ -135,23 +135,23 @@ module.exports = class HUDView extends View props = @$el.find('.thang-props') props.find(":not(.thang-name)").remove() props.find('.thang-name').text(if @thang.type then "#{@thang.id} - #{@thang.type}" else @thang.id) - column = null - for prop in @thang.hudProperties ? [] + propNames = _.without @thang.hudProperties ? [], 'action' + nColumns = Math.ceil propNames.length / 5 + columns = ($('
').appendTo(props) for i in [0 ... nColumns]) + for prop, i in propNames continue if prop is 'action' pel = @createPropElement prop continue unless pel? if pel.find('.bar').is('*') and props.find('.bar').is('*') props.find('.bar-prop').last().after pel # Keep bars together else - column ?= $('
').appendTo props - column.append pel - column = null if column.find('.prop').length is 5 + columns[i % nColumns].append pel null createActions: -> actions = @$el.find('.thang-actions tbody').empty() showActions = @thang.world and not _.isEmpty(@thang.actions) and 'action' in @thang.hudProperties ? [] - @$el.find('.thang-actions').toggle showActions + @$el.find('.thang-actions').toggleClass 'secret', not showActions return unless showActions @buildActionTimespans() for actionName, action of @thang.actions @@ -175,9 +175,10 @@ module.exports = class HUDView extends View group.append(button) response.button = $('button:last', group) else - s = $.i18n.t('play_level.hud_continue', defaultValue: "Continue (press shift-space)") - if @shiftSpacePressed > 4 and not @escapePressed - @bubble.append('skip: esc') + s = $.i18n.t('play_level.hud_continue', defaultValue: "Continue (shift+space)") + sk = $.i18n.t('play_level.skip_tutorial', defaultValue: "skip: esc") + if not @escapePressed + group.append('' + sk + '') group.append($('')) @lastResponses = null @bubble.append($("

#{@speaker ? 'Captain Anya'}

")) @@ -237,8 +238,9 @@ module.exports = class HUDView extends View update: -> return unless @thang and not @speaker - # Update properties - @updatePropElement(prop, @thang[prop]) for prop in @thang.hudProperties ? [] + @$el.find('.thang-props-column').toggleClass 'nonexistent', not @thang.exists + if @thang.exists + @updatePropElement(prop, @thang[prop]) for prop in @thang.hudProperties ? [] # Update action timeline @updateActions() @@ -247,7 +249,7 @@ module.exports = class HUDView extends View return null # included in the bar context = prop: prop - hasIcon: prop in ["health", "pos", "target", "inventory", "gold"] + hasIcon: prop in ["health", "pos", "target", "inventory", "gold", "visualRange", "attackDamage", "attackRange", "maxSpeed"] hasBar: prop in ["health"] $(prop_template(context)) @@ -263,6 +265,7 @@ module.exports = class HUDView extends View labelText = prop + ": " + @formatValue(prop, val) + " / " + @formatValue(prop, max) if regen labelText += " (+" + @formatValue(prop, regen) + "/s)" + pel.find('.bar-prop-value').text(Math.round(max)) if max else s = @formatValue(prop, val) labelText = "#{prop}: #{s}" @@ -303,7 +306,7 @@ module.exports = class HUDView extends View for actionName, action of @thang.actions @updateActionElement(actionName, @timespans[actionName], @thang.action is actionName) tableContainer = @$el.find('.table-container') - timelineWidth = tableContainer.find('.action-timeline').width() + timelineWidth = tableContainer.find('tr:not(.secret) .action-timeline').width() right = (1 - (@timeProgress ? 0)) * timelineWidth arrow = tableContainer.find('.progress-arrow') arrow.css 'right', right - arrow.width() / 2 @@ -314,11 +317,11 @@ module.exports = class HUDView extends View @timespans = {} dt = @thang.world.dt actionHistory = @thang.world.actionsForThang @thang.id, true - [lastFrame, lastAction] = [0, 'idle'] + [lastFrame, lastAction] = [0, null] for hist in actionHistory.concat {frame: @thang.world.totalFrames, name: 'END'} [newFrame, newAction] = [hist.frame, hist.name] continue if newAction is lastAction - if newFrame > lastFrame + if newFrame > lastFrame and lastAction # TODO: don't push it if it didn't exist until then (@timespans[lastAction] ?= []).push [lastFrame * dt, newFrame * dt] [lastFrame, lastAction] = [newFrame, newAction] diff --git a/app/views/play/level/level_loading_view.coffee b/app/views/play/level/level_loading_view.coffee new file mode 100644 index 000000000..44c134df9 --- /dev/null +++ b/app/views/play/level/level_loading_view.coffee @@ -0,0 +1,40 @@ +View = require 'views/kinds/CocoView' +template = require 'templates/play/level/level_loading' + +module.exports = class LevelLoadingView extends View + id: "level-loading-view" + template: template + + subscriptions: + 'level-loader:progress-changed': 'onLevelLoaderProgressChanged' + + onLevelLoaderProgressChanged: (e) -> + @progress = e.progress + @updateProgressBar() + + updateProgressBar: -> + #@text.text = "BUILDING" if @progress is 1 + @$el.find('.progress-bar').css('width', (100 * @progress) + '%') + + showReady: -> + return + + unveil: -> + _.delay @reallyUnveil, 1000 + + reallyUnveil: => + return if @destroyed + loadingDetails = @$el.find('.loading-details') + duration = parseFloat loadingDetails.css 'transition-duration' + loadingDetails.css 'top', -loadingDetails.outerHeight(true) + @$el.find('.left-wing').css left: '-100%', backgroundPosition: 'right -400px top 0' + @$el.find('.right-wing').css right: '-100%', backgroundPosition: 'left -400px top 0' + _.delay @onUnveilEnded, duration * 1000 + + onUnveilEnded: => + return if @destroyed + Backbone.Mediator.publish 'onLoadingViewUnveiled', view: @ + + getRenderData: (c={}) -> + super c + c diff --git a/app/views/play/level/modal/docs_modal.coffee b/app/views/play/level/modal/docs_modal.coffee index c7b77a287..42aa98319 100644 --- a/app/views/play/level/modal/docs_modal.coffee +++ b/app/views/play/level/modal/docs_modal.coffee @@ -1,13 +1,14 @@ View = require 'views/kinds/ModalView' template = require 'templates/play/level/modal/docs' Article = require 'models/Article' +utils = require 'lib/utils' # let's implement this once we have the docs database schema set up module.exports = class DocsModal extends View template: template id: 'docs-modal' - + shortcuts: 'enter': 'hide' @@ -25,7 +26,8 @@ module.exports = class DocsModal extends View @docs = specific.concat(general) marked.setOptions {gfm: true, sanitize: false, smartLists: true, breaks: false} @docs = _.cloneDeep(@docs) - doc.html = marked(doc.body) for doc in @docs + doc.html = marked(utils.i18n doc, 'body') for doc in @docs + doc.name = (utils.i18n doc, 'name') for doc in @docs doc.slug = _.string.slugify(doc.name) for doc in @docs super() @@ -48,4 +50,4 @@ module.exports = class DocsModal extends View @$el.find('li.active').removeClass('active') onHidden: -> - Backbone.Mediator.publish 'level:docs-hidden' \ No newline at end of file + Backbone.Mediator.publish 'level:docs-hidden' diff --git a/app/views/play/level/modal/editor_config_modal.coffee b/app/views/play/level/modal/editor_config_modal.coffee new file mode 100644 index 000000000..044a4dfaa --- /dev/null +++ b/app/views/play/level/modal/editor_config_modal.coffee @@ -0,0 +1,60 @@ +View = require 'views/kinds/ModalView' +template = require 'templates/play/level/modal/editor_config' +{me} = require('lib/auth') + +module.exports = class EditorConfigModal extends View + id: 'level-editor-config-modal' + template: template + aceConfig: {} + + defaultConfig: + keyBindings: 'default' + invisibles: false + indentGuides: false + behaviors: false + + events: + 'change #tome-invisibles': 'updateInvisiblesSelection' + 'change #tome-key-bindings': 'updateKeyBindingsSelection' + 'change #tome-indent-guides': 'updateIndentGuides' + 'change #tome-behaviors': 'updateBehaviors' + + constructor: (options) -> + super(options) + + getRenderData: -> + @aceConfig = _.cloneDeep me.get('aceConfig') ? {} + @aceConfig = _.defaults @aceConfig, @defaultConfig + c = super() + c.keyBindings = @aceConfig.keyBindings + c.invisibles = @aceConfig.invisibles + c.indentGuides = @aceConfig.indentGuides + c.behaviors = @aceConfig.behaviors + c + + updateInvisiblesSelection: -> + @aceConfig.invisibles = @$el.find('#tome-invisibles').prop('checked') + + updateKeyBindingsSelection: -> + @aceConfig.keyBindings = @$el.find('#tome-key-bindings').val() + + updateIndentGuides: -> + @aceConfig.indentGuides = @$el.find('#tome-indent-guides').prop('checked') + + updateBehaviors: -> + @aceConfig.behaviors = @$el.find('#tome-behaviors').prop('checked') + + afterRender: -> + super() + + onHidden: -> + @aceConfig.invisibles = @$el.find('#tome-invisibles').prop('checked') + @aceConfig.keyBindings = @$el.find('#tome-key-bindings').val() + @aceConfig.indentGuides = @$el.find('#tome-indent-guides').prop('checked') + @aceConfig.behaviors = @$el.find('#tome-behaviors').prop('checked') + me.set 'aceConfig', @aceConfig + Backbone.Mediator.publish 'change:editor-config' + me.save() + + destroy: -> + super() diff --git a/app/views/play/level/modal/victory_modal.coffee b/app/views/play/level/modal/victory_modal.coffee index e2fa6b607..adf75f0d6 100644 --- a/app/views/play/level/modal/victory_modal.coffee +++ b/app/views/play/level/modal/victory_modal.coffee @@ -2,8 +2,7 @@ View = require 'views/kinds/ModalView' template = require 'templates/play/level/modal/victory' {me} = require 'lib/auth' LevelFeedback = require 'models/LevelFeedback' - -# let's implement this once we have the docs database schema set up +utils = require 'lib/utils' module.exports = class VictoryModal extends View id: 'level-victory-modal' @@ -11,6 +10,7 @@ module.exports = class VictoryModal extends View events: 'click .next-level-button': 'onPlayNextLevel' + 'click .rank-game-button': 'onRankGame' # review events 'mouseover .rating i': (e) -> @showStars(@starNum($(e.target))) @@ -25,7 +25,7 @@ module.exports = class VictoryModal extends View constructor: (options) -> victory = options.level.get('victory') - body = victory?.i18n?[me.lang()]?.body or victory.body or 'Sorry, this level has no victory message yet.' + body = utils.i18n(victory, 'body') or 'Sorry, this level has no victory message yet.' @body = marked(body) @level = options.level @session = options.session @@ -58,12 +58,33 @@ module.exports = class VictoryModal extends View @saveReview() if @$el.find('.review textarea').val() Backbone.Mediator.publish('play-next-level') + onRankGame: (e) -> + button = @$el.find('.rank-game-button') + button.text($.i18n.t('play_level.victory_ranking_game', defaultValue: 'Submitting...')) + button.prop 'disabled', true + ajaxData = session: @session.id, levelID: @level.id, originalLevelID: @level.get('original'), levelMajorVersion: @level.get('version').major + ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches" + goToLadder = -> Backbone.Mediator.publish 'router:navigate', route: ladderURL + console.log "Posting game for ranking from victory modal." + $.ajax '/queue/scoring', + type: 'POST' + data: ajaxData + success: goToLadder + failure: (response) -> + console.error "Couldn't submit game for ranking:", response + goToLadder() + getRenderData: -> c = super() c.body = @body c.me = me c.hasNextLevel = _.isObject(@level.get('nextLevel')) and (@level.get('name') isnt "Mobile Artillery") - c.levelName = @level.get('i18n')?[me.lang()]?.name ? @level.get('name') + c.levelName = utils.i18n @level.attributes, 'name' + c.level = @level + if c.level.get('type') is 'ladder' + c1 = @session?.get('code') + c2 = @session?.get('submittedCode') + c.readyToRank = @session.get('levelID') and c1 and not _.isEqual(c1, c2) if me.get 'hourOfCode' # Show the Hour of Code "I'm Done" tracking pixel after they played for 30 minutes elapsed = (new Date() - new Date(me.get('dateCreated'))) diff --git a/app/views/play/level/playback_view.coffee b/app/views/play/level/playback_view.coffee index f9c13a9e3..46a5f3a77 100644 --- a/app/views/play/level/playback_view.coffee +++ b/app/views/play/level/playback_view.coffee @@ -2,6 +2,8 @@ View = require 'views/kinds/CocoView' template = require 'templates/play/level/playback' {me} = require 'lib/auth' +EditorConfigModal = require './modal/editor_config_modal' + module.exports = class PlaybackView extends View id: "playback-view" template: template @@ -25,6 +27,7 @@ module.exports = class PlaybackView extends View 'click #debug-toggle': 'onToggleDebug' 'click #grid-toggle': 'onToggleGrid' 'click #edit-wizard-settings': 'onEditWizardSettings' + 'click #edit-editor-config': 'onEditEditorConfig' 'click #music-button': 'onToggleMusic' 'click #zoom-in-button': -> Backbone.Mediator.publish('camera-zoom-in') unless @disabled 'click #zoom-out-button': -> Backbone.Mediator.publish('camera-zoom-out') unless @disabled @@ -77,6 +80,9 @@ module.exports = class PlaybackView extends View onEditWizardSettings: -> Backbone.Mediator.publish 'edit-wizard-settings' + onEditEditorConfig: -> + @openModalView(new EditorConfigModal()) + onDisableControls: (e) -> if not e.controls or 'playback' in e.controls @disabled = true diff --git a/app/views/play/level/tome/cast_button_view.coffee b/app/views/play/level/tome/cast_button_view.coffee index 98c8ab3c8..af45ca57c 100644 --- a/app/views/play/level/tome/cast_button_view.coffee +++ b/app/views/play/level/tome/cast_button_view.coffee @@ -35,7 +35,7 @@ module.exports = class CastButtonView extends View # TODO: use a User setting instead of localStorage delay = localStorage.getItem 'autocastDelay' delay ?= 5000 - if @levelID in ['brawlwood', 'brawlwood-tutorial'] + if @levelID in ['brawlwood', 'brawlwood-tutorial', 'dungeon-arena', 'dungeon-arena-tutorial'] delay = 90019001 @setAutocastDelay delay diff --git a/app/views/play/level/tome/spell_debug_view.coffee b/app/views/play/level/tome/spell_debug_view.coffee index 5f4cfdd30..c35314932 100644 --- a/app/views/play/level/tome/spell_debug_view.coffee +++ b/app/views/play/level/tome/spell_debug_view.coffee @@ -61,7 +61,9 @@ module.exports = class DebugView extends View @variableChain = chain offsetX = e.domEvent.offsetX ? e.clientX - $(e.domEvent.target).offset().left offsetY = e.domEvent.offsetY ? e.clientY - $(e.domEvent.target).offset().top - @pos = {left: offsetX + 50, top: offsetY + 50} + w = $(document).width() + offsetX = w - $(e.domEvent.target).offset().left - 300 if e.clientX + 300 > w + @pos = {left: offsetX + 50, top: offsetY + 20} @markerRange = new Range pos.row, start, pos.row, end else @variableChain = @markerRange = null diff --git a/app/views/play/level/tome/spell_palette_view.coffee b/app/views/play/level/tome/spell_palette_view.coffee index 8085b6145..3a1056733 100644 --- a/app/views/play/level/tome/spell_palette_view.coffee +++ b/app/views/play/level/tome/spell_palette_view.coffee @@ -27,6 +27,7 @@ module.exports = class SpellPaletteView extends View c.entryGroups = @entryGroups c.entryGroupSlugs = @entryGroupSlugs c.tabbed = _.size(@entryGroups) > 1 + c.defaultGroupSlug = @defaultGroupSlug c afterRender: -> @@ -44,6 +45,7 @@ module.exports = class SpellPaletteView extends View allDocs = {} for lc in lcs for doc in (lc.get('propertyDocumentation') ? []) + doc = _.clone doc allDocs['__' + doc.name] ?= [] allDocs['__' + doc.name].push doc if doc.type is 'snippet' then doc.owner = 'snippets' @@ -88,6 +90,7 @@ module.exports = class SpellPaletteView extends View defaultGroup = $.i18n.t("play_level.tome_available_spells", defaultValue: "Available Spells") @entryGroups = {} @entryGroups[defaultGroup] = @entries + @defaultGroupSlug = _.string.slugify defaultGroup @entryGroupSlugs = {} for group, entries of @entryGroups @entryGroupSlugs[group] = _.string.slugify group diff --git a/app/views/play/level/tome/spell_view.coffee b/app/views/play/level/tome/spell_view.coffee index c44cfa48e..e9ac98dab 100644 --- a/app/views/play/level/tome/spell_view.coffee +++ b/app/views/play/level/tome/spell_view.coffee @@ -15,10 +15,16 @@ module.exports = class SpellView extends View eventsSuppressed: true writable: true + keyBindings: + 'default': null + 'vim': 'ace/keyboard/vim' + 'emacs': 'ace/keyboard/emacs' + subscriptions: 'level-disable-controls': 'onDisableControls' 'level-enable-controls': 'onEnableControls' 'surface:frame-changed': 'onFrameChanged' + 'surface:coordinate-selected': 'onCoordinateSelected' 'god:new-world-created': 'onNewWorld' 'god:user-code-problem': 'onUserCodeProblem' 'tome:manual-cast': 'onManualCast' @@ -29,6 +35,7 @@ module.exports = class SpellView extends View 'focus-editor': 'focus' 'tome:spell-statement-index-updated': 'onStatementIndexUpdated' 'spell-beautify': 'onSpellBeautify' + 'change:editor-config': 'onChangeEditorConfig' events: 'mouseout': 'onMouseOut' @@ -55,6 +62,7 @@ module.exports = class SpellView extends View createACE: -> # Test themes and settings here: http://ace.ajax.org/build/kitchen-sink.html + aceConfig = me.get('aceConfig') ? {} @ace = ace.edit @$el.find('.ace')[0] @aceSession = @ace.getSession() @aceDoc = @aceSession.getDocument() @@ -65,11 +73,12 @@ module.exports = class SpellView extends View @aceSession.setNewLineMode "unix" @aceSession.setUseSoftTabs true @ace.setTheme 'ace/theme/textmate' - @ace.setDisplayIndentGuides false + @ace.setDisplayIndentGuides aceConfig.indentGuides @ace.setShowPrintMargin false - @ace.setShowInvisibles false - @ace.setBehavioursEnabled false + @ace.setShowInvisibles aceConfig.invisibles + @ace.setBehavioursEnabled aceConfig.behaviors @ace.setAnimatedScroll true + @ace.setKeyboardHandler @keyBindings[aceConfig.keyBindings ? 'default'] @toggleControls null, @writable @aceSession.selection.on 'changeCursor', @onCursorActivity $(@ace.container).find('.ace_gutter').on 'click', '.ace_error, .ace_warning, .ace_info', @onAnnotationClick @@ -91,6 +100,9 @@ module.exports = class SpellView extends View addCommand name: 'end-current-script' bindKey: {win: 'Shift-Space', mac: 'Shift-Space'} + passEvent: true # https://github.com/ajaxorg/ace/blob/master/lib/ace/keyboard/keybinding.js#L114 + # No easy way to selectively cancel shift+space, since we don't get access to the event. + # Maybe we could temporarily set ourselves to read-only if we somehow know that a script is active? exec: -> Backbone.Mediator.publish 'level:shift-space-pressed' addCommand name: 'end-all-scripts' @@ -416,10 +428,15 @@ module.exports = class SpellView extends View @ace.clearSelection() onFrameChanged: (e) -> - return unless e.selectedThang?.id is @thang?.id + return unless @spellThang and e.selectedThang?.id is @spellThang?.thang.id @thang = e.selectedThang # update our thang to the current version @highlightCurrentLine() + onCoordinateSelected: (e) -> + return unless e.x? and e.y? + @ace.insert "{x: #{e.x}, y: #{e.y}}" + @highlightCurrentLine() + onStatementIndexUpdated: (e) -> return unless e.ace is @ace @highlightCurrentLine() @@ -430,6 +447,7 @@ module.exports = class SpellView extends View flow ?= @spellThang?.castAether?.flow return unless flow executed = [] + executedRows = {} matched = false states = flow.states ? [] currentCallIndex = null @@ -445,18 +463,24 @@ module.exports = class SpellView extends View matched = true break _.last(executed).push state + executedRows[state.range[0].row] = true #state.executing = true if state.userInfo?.time is @thang.world.age # no work currentCallIndex ?= callNumber - 1 #console.log "got call index", currentCallIndex, "for time", @thang.world.age, "out of", states.length + @decoratedGutter = @decoratedGutter || {} + # TODO: don't redo the markers if they haven't actually changed for markerRange in (@markerRanges ?= []) markerRange.start.detach() markerRange.end.detach() @aceSession.removeMarker markerRange.id @markerRanges = [] - @aceSession.removeGutterDecoration row, 'executing' for row in [0 ... @aceSession.getLength()] - $(@ace.container).find('.ace_gutter-cell.executing').removeClass('executing') + for row in [0 ... @aceSession.getLength()] + unless executedRows[row] + @aceSession.removeGutterDecoration row, 'executing' + @aceSession.removeGutterDecoration row, 'executed' + @decoratedGutter[row] = '' if not executed.length or (@spell.name is "plan" and @spellThang.castAether.metrics.statementsExecuted < 20) @toolbarView?.toggleFlow false @debugView.setVariableStates {} @@ -484,7 +508,10 @@ module.exports = class SpellView extends View markerRange.end = @aceDoc.createAnchor markerRange.end markerRange.id = @aceSession.addMarker markerRange, clazz, markerType @markerRanges.push markerRange - @aceSession.addGutterDecoration start.row, clazz if clazz is 'executing' + if executedRows[start.row] and @decoratedGutter[start.row] isnt clazz + @aceSession.removeGutterDecoration start.row, @decoratedGutter[start.row] if @decoratedGutter[start.row] isnt '' + @aceSession.addGutterDecoration start.row, clazz + @decoratedGutter[start.row] = clazz @debugView.setVariableStates {} unless gotVariableStates null @@ -532,6 +559,12 @@ module.exports = class SpellView extends View pretty = @spellThang.aether.beautify ugly @ace.setValue pretty + onChangeEditorConfig: (e) -> + aceConfig = me.get 'aceConfig' + @ace.setDisplayIndentGuides (aceConfig.indentGuides || false) + @ace.setShowInvisibles (aceConfig.invisibles || false) + @ace.setKeyboardHandler (@keyBindings[aceConfig.keyBindings] || null) + dismiss: -> @recompile() if @spell.hasChangedSignificantly @getSource() diff --git a/app/views/play/level/tome/tome_view.coffee b/app/views/play/level/tome/tome_view.coffee index f7be355f6..9640a98d0 100644 --- a/app/views/play/level/tome/tome_view.coffee +++ b/app/views/play/level/tome/tome_view.coffee @@ -130,6 +130,7 @@ module.exports = class TomeView extends View unless method.cloneOf skipProtectAPI = @getQueryVariable("skip_protect_api") is "true" or @options.levelID isnt 'brawlwood' skipProtectAPI = true # gah, it's so slow :( and somehow still affects simulation + skipProtectAPI = false if @options.levelID is 'dungeon-arena' skipFlow = @getQueryVariable("skip_flow") is "true" or @options.levelID is 'brawlwood' spell = @spells[spellKey] = new Spell programmableMethod: method, spellKey: spellKey, pathComponents: pathPrefixComponents.concat(pathComponents), session: @options.session, supermodel: @supermodel, skipFlow: skipFlow, skipProtectAPI: skipProtectAPI, worker: @worker for thangID, spellKeys of @thangSpells diff --git a/app/views/play/level_view.coffee b/app/views/play/level_view.coffee index 11fa59ba3..64d48ae8b 100644 --- a/app/views/play/level_view.coffee +++ b/app/views/play/level_view.coffee @@ -2,6 +2,7 @@ View = require 'views/kinds/RootView' template = require 'templates/play/level' {me} = require('lib/auth') ThangType = require 'models/ThangType' +utils = require 'lib/utils' # temp hard coded data World = require 'lib/world/world' @@ -16,10 +17,12 @@ LevelLoader = require 'lib/LevelLoader' LevelSession = require 'models/LevelSession' Level = require 'models/Level' LevelComponent = require 'models/LevelComponent' +Article = require 'models/Article' Camera = require 'lib/surface/Camera' AudioPlayer = require 'lib/AudioPlayer' # subviews +LoadingView = require './level/level_loading_view' TomeView = require './level/tome/tome_view' ChatView = require './level/level_chat_view' HUDView = require './level/hud_view' @@ -30,8 +33,6 @@ GoldView = require './level/gold_view' VictoryModal = require './level/modal/victory_modal' InfiniteLoopModal = require './level/modal/infinite_loop_modal' -LoadingScreen = require 'lib/LoadingScreen' - PROFILE_ME = false module.exports = class PlayLevelView extends View @@ -60,6 +61,8 @@ module.exports = class PlayLevelView extends View 'level:session-will-save': 'onSessionWillSave' 'level:set-team': 'setTeam' 'god:new-world-created': 'loadSoundsForWorld' + 'level:started': 'onLevelStarted' + 'level:loading-view-unveiled': 'onLoadingViewUnveiled' events: 'click #level-done-button': 'onDonePressed' @@ -105,7 +108,8 @@ module.exports = class PlayLevelView extends View load: -> @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team") - @levelLoader.once 'loaded-all', @onLevelLoaderLoaded + @levelLoader.once 'loaded-all', @onLevelLoaderLoaded, @ + @levelLoader.on 'progress', @onLevelLoaderProgressChanged, @ @god = new God() getRenderData: -> @@ -119,29 +123,48 @@ module.exports = class PlayLevelView extends View afterRender: -> window.onPlayLevelViewLoaded? @ # still a hack - @loadingScreen = new LoadingScreen(@$el.find('canvas')[0]) - @loadingScreen.show() + @insertSubView @loadingView = new LoadingView {} @$el.find('#level-done-button').hide() super() - onLevelLoaderLoaded: => - # Save latest level played in local storage + onLevelLoaderProgressChanged: -> + return if @seenDocs + return unless @levelLoader.session.loaded and @levelLoader.level.loaded + return unless showFrequency = @levelLoader.level.get('showsGuide') + session = @levelLoader.session + diff = new Date().getTime() - new Date(session.get('created')).getTime() + return if showFrequency is 'first-time' and diff > (5 * 60 * 1000) + articles = @levelLoader.supermodel.getModels Article + for article in articles + return unless article.loaded + @showGuide() + + showGuide: -> + @seenDocs = true + DocsModal = require './level/modal/docs_modal' + options = {docs: @levelLoader.level.get('documentation'), supermodel: @supermodel} + @openModalView(new DocsModal(options), true) + Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelLoaderLoaded, @ + return true + + onLevelLoaderLoaded: -> + return unless @levelLoader.progress() is 1 # double check, since closing the guide may trigger this early if window.currentModal and not window.currentModal.destroyed - @loadingScreen.showReady() + @loadingView.showReady() return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelLoaderLoaded, @ - + + # Save latest level played in local storage localStorage["lastLevel"] = @levelID if localStorage? @grabLevelLoaderData() team = @getQueryVariable("team") ? @world.teamForPlayer(0) @loadOpponentTeam(team) - @loadingScreen.destroy() @god.level = @level.serialize @supermodel @god.worldClassMap = @world.classMap @setTeam team @initSurface() @initGoalManager() @initScriptManager() - @insertSubviews ladderGame: @otherSession? + @insertSubviews ladderGame: (@level.get('type') is "ladder") @initVolume() @session.on 'change:multiplayer', @onMultiplayerChanged, @ @originalSessionState = _.cloneDeep(@session.get('state')) @@ -151,7 +174,7 @@ module.exports = class PlayLevelView extends View if @otherSession # TODO: colorize name and cloud by team, colorize wizard by user's color config @surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team') - + grabLevelLoaderData: -> @session = @levelLoader.session @world = @levelLoader.world @@ -159,7 +182,7 @@ module.exports = class PlayLevelView extends View @otherSession = @levelLoader.opponentSession @levelLoader.destroy() @levelLoader = null - + loadOpponentTeam: (myTeam) -> opponentSpells = [] for spellTeam, spells of @session.get('teamSpells') ? @otherSession?.get('teamSpells') ? {} @@ -178,7 +201,13 @@ module.exports = class PlayLevelView extends View # For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet. @session.set 'multiplayer', false - + onLevelStarted: (e) -> + @loadingView?.unveil() + + onLoadingViewUnveiled: (e) -> + @removeSubView @loadingView + @loadingView = null + onSupermodelLoadedOne: => @modelsLoaded ?= 0 @modelsLoaded += 1 @@ -200,7 +229,7 @@ module.exports = class PlayLevelView extends View @insertSubView new GoldView {} @insertSubView new HUDView {} @insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session - worldName = @level.get('i18n')?[me.lang()]?.name ? @level.get('name') + worldName = utils.i18n @level.attributes, 'name' @controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel, playableTeams: @world.playableTeams, ladderGame: subviewOptions.ladderGame} #Backbone.Mediator.publish('level-set-debug', debug: true) if me.displayName() is 'Nick!' diff --git a/app/views/play/spectate_view.coffee b/app/views/play/spectate_view.coffee index e2686e90d..60780cf64 100644 --- a/app/views/play/spectate_view.coffee +++ b/app/views/play/spectate_view.coffee @@ -2,24 +2,25 @@ View = require 'views/kinds/RootView' template = require 'templates/play/spectate' {me} = require('lib/auth') ThangType = require 'models/ThangType' +utils = require 'lib/utils' -# temp hard coded data World = require 'lib/world/world' -docs = require 'lib/world/docs' # tools Surface = require 'lib/surface/Surface' God = require 'lib/God' GoalManager = require 'lib/world/GoalManager' ScriptManager = require 'lib/scripts/ScriptManager' -LevelBus = require('lib/LevelBus') LevelLoader = require 'lib/LevelLoader' LevelSession = require 'models/LevelSession' Level = require 'models/Level' LevelComponent = require 'models/LevelComponent' +Article = require 'models/Article' Camera = require 'lib/surface/Camera' +AudioPlayer = require 'lib/AudioPlayer' # subviews +LoadingView = require './level/level_loading_view' TomeView = require './level/tome/tome_view' ChatView = require './level/level_chat_view' HUDView = require './level/hud_view' @@ -30,12 +31,8 @@ GoldView = require './level/gold_view' VictoryModal = require './level/modal/victory_modal' InfiniteLoopModal = require './level/modal/infinite_loop_modal' -LoadingScreen = require 'lib/LoadingScreen' - PROFILE_ME = false -PlayLevelView = require './level_view' - module.exports = class SpectateLevelView extends View id: 'spectate-level-view' template: template @@ -53,33 +50,45 @@ module.exports = class SpectateLevelView extends View 'level-enable-controls': 'onEnableControls' 'god:new-world-created': 'onNewWorld' 'god:infinite-loop': 'onInfiniteLoop' - 'edit-wizard-settings': 'showWizardSettingsModal' + 'level-reload-from-data': 'onLevelReloadFromData' + 'play-next-level': 'onPlayNextLevel' 'surface:world-set-up': 'onSurfaceSetUpNewWorld' - 'level:session-will-save': 'onSessionWillSave' 'level:set-team': 'setTeam' + 'god:new-world-created': 'loadSoundsForWorld' + 'next-game-pressed': 'onNextGamePressed' + 'level:started': 'onLevelStarted' + 'level:loading-view-unveiled': 'onLoadingViewUnveiled' events: 'click #level-done-button': 'onDonePressed' + shortcuts: + 'ctrl+s': 'onCtrlS' constructor: (options, @levelID) -> + @originalOptions = _.cloneDeep(options) console.profile?() if PROFILE_ME super options - console.log @levelID - - @ogreSessionID = @getQueryVariable 'ogres' - @humanSessionID = @getQueryVariable 'humans' - - $(window).on('resize', @onWindowResize) - @supermodel.once 'error', => - msg = $.i18n.t('play_level.level_load_error', defaultValue: "Level could not be loaded.") - @$el.html('
' + msg + '
') - - - @load() + @supermodel.once 'error', @onLevelLoadError + @sessionOne = @getQueryVariable 'session-one' + @sessionTwo = @getQueryVariable 'session-two' + if options.spectateSessions + @sessionOne = options.spectateSessions.sessionOne + @sessionTwo = options.spectateSessions.sessionTwo + + if not @sessionOne or not @sessionTwo + @fetchRandomSessionPair (err, data) => + if err? then return console.log "There was an error fetching the random session pair: #{data}" + @sessionOne = data[0]._id + @sessionTwo = data[1]._id + @load() + else + @load() + onLevelLoadError: (e) => + application.router.navigate "/play?not_found=#{@levelID}", {trigger: true} setLevel: (@level, @supermodel) -> @god?.level = @level.serialize @supermodel @@ -90,8 +99,15 @@ module.exports = class SpectateLevelView extends View @load() load: -> - @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team") - @levelLoader.once 'loaded-all', @onLevelLoaderLoaded + @levelLoader = new LevelLoader + supermodel: @supermodel + levelID: @levelID + sessionID: @sessionOne + opponentSessionID: @sessionTwo + spectateMode: true + team: @getQueryVariable("team") + @levelLoader.once 'loaded-all', @onLevelLoaderLoaded, @ + @levelLoader.on 'progress', @onLevelLoaderProgressChanged, @ @god = new God() getRenderData: -> @@ -101,32 +117,99 @@ module.exports = class SpectateLevelView extends View afterRender: -> window.onPlayLevelViewLoaded? @ # still a hack - @loadingScreen = new LoadingScreen(@$el.find('canvas')[0]) - @loadingScreen.show() + @insertSubView @loadingView = new LoadingView {} + @$el.find('#level-done-button').hide() super() - onLevelLoaderLoaded: => - #needs editing - @session = @levelLoader.session - @world = @levelLoader.world - @level = @levelLoader.level - @levelLoader.destroy() - @levelLoader = null - @loadingScreen.destroy() + onLevelLoaderProgressChanged: -> + return if @seenDocs + return unless showFrequency = @levelLoader.level.get('showGuide') + session = @levelLoader.session + diff = new Date().getTime() - new Date(session.get('created')).getTime() + return if showFrequency is 'first-time' and diff > (5 * 60 * 1000) + return unless @levelLoader.level.loaded + articles = @levelLoader.supermodel.getModels Article + for article in articles + return unless article.loaded + @showGuide() + + showGuide: -> + @seenDocs = true + DocsModal = require './level/modal/docs_modal' + options = {docs: @levelLoader.level.get('documentation'), supermodel: @supermodel} + @openModalView(new DocsModal(options), true) + Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelLoaderLoaded, @ + return true + + onLevelLoaderLoaded: -> + return unless @levelLoader.progress() is 1 # double check, since closing the guide may trigger this early + # Save latest level played in local storage + if window.currentModal and not window.currentModal.destroyed + @loadingView.showReady() + return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelLoaderLoaded, @ + + @grabLevelLoaderData() + #at this point, all requisite data is loaded, and sessions are not denormalized + team = @world.teamForPlayer(0) + @loadOpponentTeam(team) @god.level = @level.serialize @supermodel @god.worldClassMap = @world.classMap - #@setTeam @world.teamForPlayer _.size @session.get 'players' # TODO: players aren't initialized yet? - @setTeam @getQueryVariable("team") ? @world.teamForPlayer(0) + @setTeam team @initSurface() @initGoalManager() @initScriptManager() - @insertSubviews() + @insertSubviews ladderGame: @otherSession? @initVolume() - @session.on 'change:multiplayer', @onMultiplayerChanged, @ + @originalSessionState = _.cloneDeep(@session.get('state')) @register() @controlBar.setBus(@bus) @surface.showLevel() + if me.id isnt @session.get 'creator' + @surface.createOpponentWizard + id: @session.get('creator') + name: @session.get('creatorName') + team: @session.get('team') + levelSlug: @level.get('slug') + + @surface.createOpponentWizard + id: @otherSession.get('creator') + name: @otherSession.get('creatorName') + team: @otherSession.get('team') + levelSlug: @level.get('slug') + + grabLevelLoaderData: -> + @session = @levelLoader.session + @world = @levelLoader.world + @level = @levelLoader.level + @otherSession = @levelLoader.opponentSession + @levelLoader.destroy() + @levelLoader = null + + loadOpponentTeam: (myTeam) -> + opponentSpells = [] + for spellTeam, spells of @session.get('teamSpells') ? @otherSession?.get('teamSpells') ? {} + continue if spellTeam is myTeam or not myTeam + opponentSpells = opponentSpells.concat spells + + opponentCode = @otherSession?.get('submittedCode') or {} + myCode = @session.get('submittedCode') or {} + for spell in opponentSpells + [thang, spell] = spell.split '/' + c = opponentCode[thang]?[spell] + myCode[thang] ?= {} + if c then myCode[thang][spell] = c else delete myCode[thang][spell] + @session.set('code', myCode) + if @session.get('multiplayer') and @otherSession? + # For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet. + @session.set 'multiplayer', false + + onLevelStarted: (e) -> + @loadingView?.unveil() + + onLoadingViewUnveiled: (e) -> + @removeSubView @loadingView + @loadingView = null onSupermodelLoadedOne: => @modelsLoaded ?= 0 @@ -142,38 +225,48 @@ module.exports = class SpectateLevelView extends View ctx.clearRect(0, 0, canvas.width, canvas.height) ctx.fillText("Loaded #{@modelsLoaded} thingies",50,50) - insertSubviews: -> - #needs editing - @insertSubView @tome = new TomeView levelID: @levelID, session: @session, thangs: @world.thangs, supermodel: @supermodel + insertSubviews: (subviewOptions) -> + @insertSubView @tome = new TomeView levelID: @levelID, session: @session, thangs: @world.thangs, supermodel: @supermodel, ladderGame: subviewOptions.ladderGame @insertSubView new PlaybackView {} - @insertSubView new GoalsView {} + @insertSubView new GoldView {} @insertSubView new HUDView {} - @insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session - worldName = @level.get('i18n')?[me.lang()]?.name ? @level.get('name') - @controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel, playableTeams: @world.playableTeams} + worldName = utils.i18n @level.attributes, 'name' + @controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel, playableTeams: @world.playableTeams, spectateGame: true} #Backbone.Mediator.publish('level-set-debug', debug: true) if me.displayName() is 'Nick!' afterInsert: -> super() + # callbacks + + onCtrlS: (e) -> + e.preventDefault() + + onLevelReloadFromData: (e) -> + isReload = Boolean @world + @setLevel e.level, e.supermodel + if isReload + @scriptManager.setScripts(e.level.get('scripts')) + Backbone.Mediator.publish 'tome:cast-spell' # a bit hacky onWindowResize: (s...) -> $('#pointer').css('opacity', 0.0) - onDisableControls: (e) => + onDisableControls: (e) -> return if e.controls and not ('level' in e.controls) @shortcutsEnabled = false @wasFocusedOn = document.activeElement $('body').focus() - onEnableControls: (e) => + onEnableControls: (e) -> return if e.controls? and not ('level' in e.controls) @shortcutsEnabled = true $(@wasFocusedOn).focus() if @wasFocusedOn @wasFocusedOn = null - onDonePressed: => @showVictory() + onDonePressed: -> return + onNewWorld: (e) -> @world = e.world @@ -183,13 +276,21 @@ module.exports = class SpectateLevelView extends View @openModalView new InfiniteLoopModal() window.tracker?.trackEvent 'Saw Initial Infinite Loop', level: @world.name, label: @world.name + onPlayNextLevel: -> + nextLevel = @getNextLevel() + nextLevelID = nextLevel.get('slug') or nextLevel.id + url = "/play/level/#{nextLevelID}" + Backbone.Mediator.publish 'router:navigate', { + route: url, + viewClass: PlayLevelView, + viewArgs: [{supermodel:@supermodel}, nextLevelID]} getNextLevel: -> nextLevelOriginal = @level.get('nextLevel')?.original levels = @supermodel.getModels(Level) return l for l in levels when l.get('original') is nextLevelOriginal - onHighlightDom: (e) => + onHighlightDom: (e) -> if e.delay delay = e.delay delete e.delay @@ -243,19 +344,25 @@ module.exports = class SpectateLevelView extends View ), 1) - animatePointer: => + animatePointer: -> pointer = $('#pointer') pointer.css('transition', 'all 0.6s ease-out') pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance-50}px)") setTimeout((=> pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance}px)").css('transition', 'all 0.4s ease-in')), 800) - onFocusDom: (e) => $(e.selector).focus() + onFocusDom: (e) -> $(e.selector).focus() - onEndHighlight: => + onEndHighlight: -> $('#pointer').css('opacity', 0.0) clearInterval(@pointerInterval) + onMultiplayerChanged: (e) -> + if @session.get('multiplayer') + @bus.connect() + else + @bus.removeFirebaseData => + @bus.disconnect() # initialization @@ -266,18 +373,25 @@ module.exports = class SpectateLevelView extends View initSurface: -> surfaceCanvas = $('canvas#surface', @$el) - @surface = new Surface(@world, surfaceCanvas, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview) + @surface = new Surface(@world, surfaceCanvas, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true) worldBounds = @world.getBounds() bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}] @surface.camera.setBounds(bounds) @surface.camera.zoomTo({x:0, y:0}, 0.1, 0) initGoalManager: -> - @goalManager = new GoalManager(@world) + @goalManager = new GoalManager(@world, @level.get('goals')) @god.goalManager = @goalManager initScriptManager: -> - @scriptManager = new ScriptManager({scripts: @world.scripts or [], view:@, session: @session}) + if @world.scripts + nonVictoryPlaybackScripts = _.reject @world.scripts, (script) -> + script.id.indexOf("Set Camera Boundaries and Goals") == -1 + else + console.log "World scripts don't exist!" + nonVictoryPlaybackScripts = [] + console.log nonVictoryPlaybackScripts + @scriptManager = new ScriptManager({scripts: nonVictoryPlaybackScripts, view:@, session: @session}) @scriptManager.loadFromSession() initVolume: -> @@ -289,24 +403,14 @@ module.exports = class SpectateLevelView extends View return if @alreadyLoadedState @alreadyLoadedState = true state = @originalSessionState - if state.frame - Backbone.Mediator.publish 'level-set-time', { time: 0, frameOffset: state.frame } - if state.selected - # TODO: Should also restore selected spell here by saving spellName - Backbone.Mediator.publish 'level-select-sprite', { thangID: state.selected, spellName: null } if state.playing? Backbone.Mediator.publish 'level-set-playing', { playing: state.playing } - - register: -> - @bus = LevelBus.get(@levelID, @session.id) - @bus.setSession(@session) - @bus.setTeamSpellMap @tome.teamSpellMap - @bus.connect() if @session.get('multiplayer') + register: -> return onSessionWillSave: (e) -> # Something interesting has happened, so (at a lower frequency), we'll save a screenshot. - @saveScreenshot e.session + console.log "Session is saving but shouldn't save!!!!!!!" # Throttled saveScreenshot: (session) => @@ -319,7 +423,44 @@ module.exports = class SpectateLevelView extends View me.team = team Backbone.Mediator.publish 'level:team-set', team: team - destroy: -> + # Dynamic sound loading + + loadSoundsForWorld: (e) -> + return if @headless + world = e.world + thangTypes = @supermodel.getModels(ThangType) + for [spriteName, message] in world.thangDialogueSounds() + continue unless thangType = _.find thangTypes, (m) -> m.get('name') is spriteName + continue unless sound = AudioPlayer.soundForDialogue message, thangType.get('soundTriggers') + AudioPlayer.preloadSoundReference sound + + onNextGamePressed: (e) -> + console.log "You want to see the next game!" + @fetchRandomSessionPair (err, data) => + if err? then return console.log "There was an error fetching the random session pair: #{data}" + @sessionOne = data[0]._id + @sessionTwo = data[1]._id + url = "/play/spectate/#{@levelID}?session-one=#{@sessionOne}&session-two=#{@sessionTwo}" + Backbone.Mediator.publish 'router:navigate', { + route: url, + viewClass: SpectateLevelView, + viewArgs: [{spectateSessions:{sessionOne: @sessionOne, sessionTwo: @sessionTwo}}, @levelID ]} + + fetchRandomSessionPair: (cb) -> + console.log "Fetching random session pair!" + randomSessionPairURL = "/db/level/#{@levelID}/random_session_pair" + $.ajax + url: randomSessionPairURL + type: "GET" + complete: (jqxhr, textStatus) -> + if textStatus isnt "success" + cb("error", jqxhr.statusText) + else + cb(null, $.parseJSON(jqxhr.responseText)) + + destroy: ()-> + @supermodel?.off 'error', @onLevelLoadError + @levelLoader?.off 'loaded-all', @onLevelLoaderLoaded @levelLoader?.destroy() @surface?.destroy() @god?.destroy() @@ -327,10 +468,12 @@ module.exports = class SpectateLevelView extends View @scriptManager?.destroy() $(window).off('resize', @onWindowResize) delete window.world # not sure where this is set, but this is one way to clean it up - clearInterval(@pointerInterval) - @bus?.destroy() - #@instance.save() unless @instance.loading console.profileEnd?() if PROFILE_ME - @session.off 'change:multiplayer', @onMultiplayerChanged, @ + @session?.off 'change:multiplayer', @onMultiplayerChanged, @ + @onLevelLoadError = null + @onLevelLoaderLoaded = null + @onSupermodelLoadedOne = null + @preloadNextLevel = null + @saveScreenshot = null super() diff --git a/app/views/play_view.coffee b/app/views/play_view.coffee index 32e6d3bf1..123fc6fac 100644 --- a/app/views/play_view.coffee +++ b/app/views/play_view.coffee @@ -111,14 +111,6 @@ module.exports = class PlayView extends View id: 'molotov-medic' description: "Tharin must play support in this dungeon battle." } -# { -# name: 'The Herd' -# id: 'the-herd' -# description: "Stop an ogre stampede with deadly artillery." -# image: '/images/generic-icon.png' -# difficulty: 3 -# disabled: true -# } { name: 'Gridmancer' id: 'gridmancer' @@ -128,16 +120,24 @@ module.exports = class PlayView extends View } ] -# arenas = [ -# { -# name: 'Forest Arena' -# difficulty: 3 -# id: 'forest-arena' -# image: '/images/levels/forest_arena_icon.png' -# description: "Play head-to-head against friends!" -# disabled: true -# } -# ] + arenas = [ + { + name: 'Dungeon Arena' + difficulty: 3 + id: 'dungeon-arena' + image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png' + description: "Play head-to-head against fellow Wizards in a dungeon melee!" + levelPath: 'ladder' + } + { + name: 'Brawlwood' + difficulty: 4 + id: 'brawlwood' + image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png' + description: "Combat the armies of other Wizards in a strategic forest arena! (Fast computer required.)" + levelPath: 'ladder' + } + ] playerCreated = [ { @@ -155,19 +155,40 @@ module.exports = class PlayView extends View description: "Strike at the weak point in an array of enemies. - by Aftermath" } { - name: 'Enemy Artillery' - difficulty: 1 - id: 'enemy-artillery' - image: '/file/db/level/526dba94a188322044000a40/mobile_artillery_icon.png' - description: "Take cover while shells fly, then strike! - by mcdavid1991" - disabled: true + name: 'Bubble Sort Bootcamp Battle' + difficulty: 3 + id: 'bubble-sort-bootcamp-battle' + image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png' + description: "Write a bubble sort to organize your soldiers. - by Alexandru" } + { + name: 'Sword Loop' + difficulty: 1 + id: 'sword-loop' + image: '/file/db/level/525dc5589a0765e496000006/drink_me_icon.png' + description: 'Kill the ogres and save the peasants and their cattle. - by Prabh Simran Singh Baweja' + } + { + name: 'Ogres of Hanoi' + difficulty: 3 + id: 'ogres-of-hanoi' + image: '/file/db/level/526fd3043c637ece50001bb2/the_herd_icon.png' + description: "Transfer a stack of ogres while preserving their honor. - by Alexandru" + } + #{ + # name: 'Enemy Artillery' + # difficulty: 1 + # id: 'enemy-artillery' + # image: '/file/db/level/526dba94a188322044000a40/mobile_artillery_icon.png' + # description: "Take cover while shells fly, then strike! - by mcdavid1991" + # disabled: true + #} ] context.campaigns = [ {id: "beginner", name: "Beginner Campaign", description: "... in which you learn the wizardry of programming.", levels: tutorials} + {id: "multiplayer", name: "Multiplayer Arenas", description: "... in which you code head-to-head against other players.", levels: arenas} {id: "dev", name: "Random Harder Levels", description: "... in which you learn the interface while doing something a little harder.", levels: experienced} -# {id: "multiplayer", name: "Multiplayer Arenas", description: "... in which you code head-to-head against other players.", levels: arenas} {id: "player_created", name: "Player-Created", description: "... in which you battle against the creativity of your fellow Artisan Wizards.", levels: playerCreated} ] diff --git a/bin/coco-mongodb b/bin/coco-mongodb index be4f285ed..4ff889493 100755 --- a/bin/coco-mongodb +++ b/bin/coco-mongodb @@ -71,7 +71,7 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): current_directory = os.path.dirname(os.path.realpath(sys.argv[0])) -allowedMongoVersions = ["v2.5.4","v2.5.5"] +allowedMongoVersions = ["v2.5.4","v2.5.5","v2.6.0-rc1"] if which("mongod") and any(i in subprocess.check_output("mongod --version",shell=True) for i in allowedMongoVersions): mongo_executable = "mongod" else: diff --git a/bower.json b/bower.json index 590d0e3ee..231d6e1c7 100644 --- a/bower.json +++ b/bower.json @@ -32,7 +32,7 @@ "firepad": "~0.1.2", "marked": "~0.3.0", "moment": "~2.5.0", - "aether": "~0.1.2", + "aether": "~0.1.10", "underscore.string": "~2.3.3", "firebase": "~1.0.2", "catiline": "~2.9.3" diff --git a/scripts/copy-i18n-tags.coffee b/scripts/copy-i18n-tags.coffee index 21251ad44..381aee5d8 100644 --- a/scripts/copy-i18n-tags.coffee +++ b/scripts/copy-i18n-tags.coffee @@ -13,7 +13,7 @@ for file in dir when not (file in ['locale.coffee', 'en.coffee']) lines.push "#{if catMissing then '#' else ''} #{enCat}:" first = false for enTag, enString of enTags - tagMissing = not cat[enTag] + tagMissing = not cat[enTag]? tag = (cat[enTag] ?= enString) tag = tag.replace /"/g, '\\"' lines.push "#{if tagMissing then '#' else ''} #{enTag}: \"#{tag}\"" diff --git a/server/articles/article_handler.coffee b/server/articles/article_handler.coffee index ac4fb4b97..b519b8b9f 100644 --- a/server/articles/article_handler.coffee +++ b/server/articles/article_handler.coffee @@ -3,7 +3,7 @@ Handler = require('../commons/Handler') ArticleHandler = class ArticleHandler extends Handler modelClass: Article - editableProperties: ['body', 'name'] + editableProperties: ['body', 'name', 'i18n'] hasAccess: (req) -> req.method is 'GET' or req.user?.isAdmin() diff --git a/server/articles/article_schema.coffee b/server/articles/article_schema.coffee index 08226d183..1fd4769f7 100644 --- a/server/articles/article_schema.coffee +++ b/server/articles/article_schema.coffee @@ -4,9 +4,10 @@ ArticleSchema = c.object() c.extendNamedProperties ArticleSchema # name first ArticleSchema.properties.body = { type: 'string', title: 'Content', format: 'markdown' } +ArticleSchema.properties.i18n = { type: 'object', title: 'i18n', format: 'i18n', props: ['body'] } c.extendBasicProperties(ArticleSchema, 'article') c.extendSearchableProperties(ArticleSchema) c.extendVersionedProperties(ArticleSchema, 'article') -module.exports = ArticleSchema \ No newline at end of file +module.exports = ArticleSchema diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee index 2f81d0acd..3435107cb 100644 --- a/server/commons/Handler.coffee +++ b/server/commons/Handler.coffee @@ -123,7 +123,9 @@ module.exports = class Handler # Keeping it simple for now and just allowing access to the first FETCH_LIMIT results. query = {'original': mongoose.Types.ObjectId(id)} sort = {'created': -1} - @modelClass.find(query).limit(FETCH_LIMIT).sort(sort).exec (err, results) => + selectString = 'slug name version commitMessage created permissions' # Is this even working? + @modelClass.find(query).select(selectString).limit(FETCH_LIMIT).sort(sort).exec (err, results) => + return @sendDatabaseError(res, err) if err for doc in results return @sendUnauthorizedError(res) unless @hasAccessToDocument(req, doc) res.send(results) @@ -261,7 +263,7 @@ module.exports = class Handler tv4 = require('tv4').tv4 res = tv4.validateMultiple(input, @jsonSchema) res - + @isID: (id) -> _.isString(id) and id.length is 24 and id.match(/[a-z0-9]/gi)?.length is 24 getDocumentForIdOrSlug: (idOrSlug, done) -> diff --git a/server/commons/queue.coffee b/server/commons/queue.coffee index 1e86f99cd..10710e340 100644 --- a/server/commons/queue.coffee +++ b/server/commons/queue.coffee @@ -185,7 +185,8 @@ class MongoQueue extends events.EventEmitter subscribe: (eventName, callback) -> @on eventName, callback unsubscribe: (eventName, callback) -> @removeListener eventName, callback - + totalMessagesInQueue: (callback) -> @Message.count {}, callback + receiveMessage: (callback) -> conditions = queue: @queueName diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee index b26e729bd..81a5e6166 100644 --- a/server/levels/level_handler.coffee +++ b/server/levels/level_handler.coffee @@ -20,6 +20,8 @@ LevelHandler = class LevelHandler extends Handler 'i18n' 'icon' 'goals' + 'type' + 'showsGuide' ] postEditableProperties: ['name'] @@ -27,8 +29,10 @@ LevelHandler = class LevelHandler extends Handler getByRelationship: (req, res, args...) -> return @getSession(req, res, args[0]) if args[1] is 'session' return @getLeaderboard(req, res, args[0]) if args[1] is 'leaderboard' - return @getAllSessions(req, res, args[0]) if args[1] is 'all_sessions' + return @getMySessions(req, res, args[0]) if args[1] is 'my_sessions' return @getFeedback(req, res, args[0]) if args[1] is 'feedback' + return @getRandomSessionPair(req,res,args[0]) if args[1] is 'random_session_pair' + return @sendNotFoundError(res) fetchLevelByIDAndHandleErrors: (id, req, res, callback) -> @@ -47,10 +51,11 @@ LevelHandler = class LevelHandler extends Handler majorVersion: level.version.major creator: req.user.id - # TODO: generalize this for levels that need teams if req.query.team? sessionQuery.team = req.query.team - else if level.name is 'Project DotA' + + # TODO: generalize this for levels based on their teams + else if level.get('type') is 'ladder' sessionQuery.team = 'humans' Session.findOne(sessionQuery).exec (err, doc) => @@ -86,26 +91,27 @@ LevelHandler = class LevelHandler extends Handler # associated with the handler, because the handler might return a different type # of model, like in this case. Refactor to move that logic to the model instead. - getAllSessions: (req, res, id) -> - @fetchLevelByIDAndHandleErrors id, req, res, (err, level) => + getMySessions: (req, res, slugOrID) -> + findParameters = {} + if Handler.isID slugOrID + findParameters["_id"] = slugOrID + else + findParameters["slug"] = slugOrID + selectString = 'original version.major permissions' + query = Level.findOne(findParameters) + .select(selectString) + .lean() + + query.exec (err, level) => + return @sendDatabaseError(res, err) if err + return @sendNotFoundError(res) unless level? sessionQuery = level: original: level.original.toString() majorVersion: level.version.major - submitted: true - - propertiesToReturn = [ - '_id' - 'totalScore' - 'submitted' - 'team' - 'creatorName' - ] - - query = Session - .find(sessionQuery) - .select(propertiesToReturn.join ' ') - + creator: req.user._id+'' + + query = Session.find(sessionQuery).select('-screenshot') query.exec (err, results) => if err then @sendDatabaseError(res, err) else @sendSuccess res, results @@ -132,7 +138,7 @@ LevelHandler = class LevelHandler extends Handler 'creatorName' 'creator' ] - + query = Session .find(sessionsQueryParameters) .limit(req.query.limit) @@ -143,6 +149,53 @@ LevelHandler = class LevelHandler extends Handler return @sendDatabaseError(res, err) if err resultSessions ?= [] @sendSuccess res, resultSessions + + getRandomSessionPair: (req, res, slugOrID) -> + findParameters = {} + if Handler.isID slugOrID + findParameters["_id"] = slugOrID + else + findParameters["slug"] = slugOrID + selectString = 'original version' + query = Level.findOne(findParameters) + .select(selectString) + .lean() + + query.exec (err, level) => + return @sendDatabaseError(res, err) if err + return @sendNotFoundError(res) unless level? + + sessionsQueryParameters = + level: + original: level.original.toString() + majorVersion: level.version.major + submitted:true + + console.log sessionsQueryParameters + + + query = Session + .find(sessionsQueryParameters) + .select('team') + .lean() + + query.exec (err, resultSessions) => + return @sendDatabaseError res, err if err? or not resultSessions + + teamSessions = _.groupBy resultSessions, 'team' + console.log teamSessions + sessions = [] + numberOfTeams = 0 + for team of teamSessions + numberOfTeams += 1 + sessions.push _.sample(teamSessions[team]) + if numberOfTeams != 2 then return @sendDatabaseError res, "There aren't sessions of 2 teams, so cannot choose random opponents!" + + @sendSuccess res, sessions + + + + validateLeaderboardRequestParameters: (req) -> req.query.order = parseInt(req.query.order) ? -1 diff --git a/server/levels/level_schema.coffee b/server/levels/level_schema.coffee index d0d448267..7fe7fc00b 100644 --- a/server/levels/level_schema.coffee +++ b/server/levels/level_schema.coffee @@ -33,12 +33,22 @@ GoalSchema = c.object {title: "Goal", description: "A goal that the player can a team: c.shortString(title: 'Team', description: 'Name of the team this goal is for, if it is not for all of the playable teams.') killThangs: c.array {title: "Kill Thangs", description: "A list of Thang IDs the player should kill, or team names.", uniqueItems: true, minItems: 1, "default": ["ogres"]}, thang saveThangs: c.array {title: "Save Thangs", description: "A list of Thang IDs the player should save, or team names", uniqueItems: true, minItems: 1, "default": ["humans"]}, thang - getToLocations: c.object {title: "Get To Locations", description: "TODO: explain", required: ["who", "targets"]}, + getToLocations: c.object {title: "Get To Locations", description: "Will be set off when any of the \"who\" touch any of the \"targets\" ", required: ["who", "targets"]}, who: c.array {title: "Who", description: "The Thangs who must get to the target locations.", minItems: 1}, thang targets: c.array {title: "Targets", description: "The target locations to which the Thangs must get.", minItems: 1}, thang + getAllToLocations: c.array {title: "Get all to locations", description: "Similar to getToLocations but now a specific \"who\" can have a specific \"target\", also must be used with the HowMany property for desired effect",required: ["getToLocation"]}, + c.object {title: "", description: ""}, + getToLocation: c.object {title: "Get To Locations", description: "TODO: explain", required: ["who", "targets"]}, + who: c.array {title: "Who", description: "The Thangs who must get to the target locations.", minItems: 1}, thang + targets: c.array {title: "Targets", description: "The target locations to which the Thangs must get.", minItems: 1}, thang keepFromLocations: c.object {title: "Keep From Locations", description: "TODO: explain", required: ["who", "targets"]}, who: c.array {title: "Who", description: "The Thangs who must not get to the target locations.", minItems: 1}, thang targets: c.array {title: "Targets", description: "The target locations to which the Thangs must not get.", minItems: 1}, thang + keepAllFromLocations: c.array {title: "Keep ALL From Locations", description: "Similar to keepFromLocations but now a specific \"who\" can have a specific \"target\", also must be used with the HowMany property for desired effect", required: ["keepFromLocation"]}, + c.object {title: "", description: ""}, + keepFromLocation: c.object {title: "Keep From Locations", description: "TODO: explain", required: ["who", "targets"]}, + who: c.array {title: "Who", description: "The Thangs who must not get to the target locations.", minItems: 1}, thang + targets: c.array {title: "Targets", description: "The target locations to which the Thangs must not get.", minItems: 1}, thang leaveOffSides: c.object {title: "Leave Off Sides", description: "Sides of the level to get some Thangs to leave across.", required: ["who", "sides"]}, who: c.array {title: "Who", description: "The Thangs which must leave off the sides of the level.", minItems: 1}, thang sides: c.array {title: "Sides", description: "The sides off which the Thangs must leave.", minItems: 1}, side @@ -164,7 +174,7 @@ LevelThangSchema = c.object { }, id: thang # TODO: figure out if we can make this unique and how to set dynamic defaults # TODO: split thangType into "original" and "majorVersion" like the rest for consistency - thangType: c.objectId(links: [{rel: "db", href: "/db/thang_type/{($)}/version"}], title: "Thang Type", description: "A reference to the original Thang template being configured.", format: 'thang-type') + thangType: c.objectId(links: [{rel: "db", href: "/db/thang.type/{($)}/version"}], title: "Thang Type", description: "A reference to the original Thang template being configured.", format: 'thang-type') components: c.array {title: "Components", description: "Thangs are configured by changing the Components attached to them.", uniqueItems: true, format: 'thang-components-array'}, ThangComponentSchema # TODO: uniqueness should be based on "original", not whole thing LevelSystemSchema = c.object { @@ -226,7 +236,8 @@ _.extend LevelSchema.properties, i18n: {type: "object", format: 'i18n', props: ['name', 'description'], description: "Help translate this level"} icon: { type: 'string', format: 'image-file', title: 'Icon' } goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema - + type: c.shortString(title: "Type", description: "What kind of level this is.", "enum": ['campaign', 'ladder']) + showsGuide: c.shortString(title: "Shows Guide", description: "If the guide is shown at the beginning of the level.", "enum": ['first-time', 'always']) c.extendBasicProperties LevelSchema, 'level' c.extendSearchableProperties LevelSchema diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee index dbb3324f4..d3ab07830 100644 --- a/server/levels/sessions/level_session_handler.coffee +++ b/server/levels/sessions/level_session_handler.coffee @@ -7,7 +7,7 @@ class LevelSessionHandler extends Handler modelClass: LevelSession editableProperties: ['multiplayer', 'players', 'code', 'completed', 'state', 'levelName', 'creatorName', 'levelID', 'screenshot', - 'chat', 'teamSpells','submitted'] + 'chat', 'teamSpells', 'submitted', 'unsubscribed'] getByRelationship: (req, res, args...) -> return @sendNotFoundError(res) unless args.length is 2 and args[1] is 'active' diff --git a/server/levels/sessions/level_session_schema.coffee b/server/levels/sessions/level_session_schema.coffee index 290422c10..d798a9d88 100644 --- a/server/levels/sessions/level_session_schema.coffee +++ b/server/levels/sessions/level_session_schema.coffee @@ -118,34 +118,47 @@ _.extend LevelSessionSchema.properties, meanStrength: type: 'number' - default: 25 standardDeviation: type:'number' - default:25/3 minimum: 0 totalScore: type: 'number' - default: 10 submitted: type: 'boolean' - default: false - index:true submitDate: c.date title: 'Submitted' submittedCode: type: 'object' - + + isRanking: + type: 'boolean' + description: 'Whether this session is still in the first ranking chain after being submitted.' + + unsubscribed: + type: 'boolean' + description: 'Whether the player has opted out of receiving email updates about ladder rankings for this session.' + numberOfWinsAndTies: type: 'number' - default: 0 + numberOfLosses: type: 'number' - default: 0 + + scoreHistory: + type: 'array' + title: 'Score History' + description: 'A list of objects representing the score history of a session' + items: + title: 'Score History Point' + description: 'An array with the format [unix timestamp, totalScore]' + type: 'array' + items: + type: 'number' matches: type: 'array' diff --git a/server/levels/thangs/LevelThangType.coffee b/server/levels/thangs/LevelThangType.coffee index abdf5d11c..98d89c4b3 100644 --- a/server/levels/thangs/LevelThangType.coffee +++ b/server/levels/thangs/LevelThangType.coffee @@ -61,4 +61,4 @@ LevelThangTypeSchema.plugin(plugins.PermissionsPlugin) LevelThangTypeSchema.plugin(plugins.NamedPlugin) LevelThangTypeSchema.plugin(plugins.SearchablePlugin, {searchable: ['name', 'description']}) -module.exports = LevelThangType = mongoose.model('level.thang_type', LevelThangTypeSchema) +module.exports = LevelThangType = mongoose.model('level.thang.type', LevelThangTypeSchema) diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee index 5aa252679..274fce9e5 100644 --- a/server/queues/scoring.coffee +++ b/server/queues/scoring.coffee @@ -8,6 +8,7 @@ db = require './../routes/db' mongoose = require 'mongoose' queues = require '../commons/queue' LevelSession = require '../levels/sessions/LevelSession' +Level = require '../levels/Level' TaskLog = require './task/ScoringTask' bayes = new (require 'bayesian-battle')() @@ -23,6 +24,14 @@ connectToScoringQueue = -> if error? then throw new Error "There was an error registering the scoring queue: #{error}" scoringTaskQueue = data log.info "Connected to scoring task queue!" + +module.exports.messagesInQueueCount = (req, res) -> + scoringTaskQueue.totalMessagesInQueue (err, count) -> + if err? then return errors.serverError res, "There was an issue finding the Mongoose count:#{err}" + response = String(count) + res.send(response) + res.end() + module.exports.addPairwiseTaskToQueueFromRequest = (req, res) -> taskPair = req.body.sessions @@ -48,32 +57,44 @@ addPairwiseTaskToQueue = (taskPair, cb) -> module.exports.createNewTask = (req, res) -> requestSessionID = req.body.session + requestLevelID = req.body.originalLevelID + requestCurrentLevelID = req.body.levelID + requestLevelMajorVersion = parseInt(req.body.levelMajorVersion) + validatePermissions req, requestSessionID, (error, permissionsAreValid) -> if err? then return errors.serverError res, "There was an error validating permissions" unless permissionsAreValid then return errors.forbidden res, "You do not have the permissions to submit that game to the leaderboard" return errors.badInput res, "The session ID is invalid" unless typeof requestSessionID is "string" + Level.findOne({_id: requestCurrentLevelID}).lean().select('type').exec (err, levelWithType) -> + if err? then return errors.serverError res, "There was an error finding the level type" - fetchSessionToSubmit requestSessionID, (err, sessionToSubmit) -> - if err? then return errors.serverError res, "There was an error finding the given session." + if not levelWithType.type or levelWithType.type isnt "ladder" + console.log "The level type of level with ID #{requestLevelID} is #{levelWithType.type}" + return errors.badInput res, "That level isn't a ladder level" - updateSessionToSubmit sessionToSubmit, (err, data) -> - if err? then return errors.serverError res, "There was an error updating the session" - opposingTeam = calculateOpposingTeam(sessionToSubmit.team) - fetchInitialSessionsToRankAgainst opposingTeam, (err, sessionsToRankAgainst) -> - if err? then return errors.serverError res, "There was an error fetching the sessions to rank against" + fetchSessionToSubmit requestSessionID, (err, sessionToSubmit) -> + if err? then return errors.serverError res, "There was an error finding the given session." - taskPairs = generateTaskPairs(sessionsToRankAgainst, sessionToSubmit) - sendEachTaskPairToTheQueue taskPairs, (taskPairError) -> - if taskPairError? then return errors.serverError res, "There was an error sending the task pairs to the queue" + updateSessionToSubmit sessionToSubmit, (err, data) -> + if err? then return errors.serverError res, "There was an error updating the session" + opposingTeam = calculateOpposingTeam(sessionToSubmit.team) + fetchInitialSessionsToRankAgainst opposingTeam,requestLevelID, requestLevelMajorVersion, (err, sessionsToRankAgainst) -> + if err? then return errors.serverError res, "There was an error fetching the sessions to rank against" - sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"} + taskPairs = generateTaskPairs(sessionsToRankAgainst, sessionToSubmit) + sendEachTaskPairToTheQueue taskPairs, (taskPairError) -> + if taskPairError? then return errors.serverError res, "There was an error sending the task pairs to the queue" + + sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"} module.exports.dispatchTaskToConsumer = (req, res) -> if isUserAnonymous(req) then return errors.forbidden res, "You need to be logged in to simulate games" scoringTaskQueue.receiveMessage (err, message) -> - if err? or messageIsInvalid(message) then return errors.gatewayTimeoutError res, "Queue Receive Error:#{err}" + if err? or messageIsInvalid(message) + res.send 204, "No games to score. #{message}" + return res.end() console.log "Received Message" messageBody = parseTaskQueueMessage req, res, message return unless messageBody? @@ -84,7 +105,7 @@ module.exports.dispatchTaskToConsumer = (req, res) -> message.changeMessageVisibilityTimeout scoringTaskTimeoutInSeconds, (err) -> if err? then return errors.serverError res, "There was an error changing the message visibility timeout." console.log "Changed visibility timeout" - constructTaskLogObject getUserIDFromRequest(req),messageBody.registrationTime, message.getReceiptHandle(), (taskLogError, taskLogObject) -> + constructTaskLogObject getUserIDFromRequest(req), message.getReceiptHandle(), (taskLogError, taskLogObject) -> if taskLogError? then return errors.serverError res, "There was an error creating the task log object." taskObject.taskID = taskLogObject._id @@ -107,49 +128,56 @@ module.exports.processTaskResult = (req, res) -> scoringTaskQueue.deleteMessage clientResponseObject.receiptHandle, (err) -> console.log "Deleted message." if err? then return errors.badInput res, "The queue message is already back in the queue, rejecting results." - + LevelSession.findOne(_id: clientResponseObject.originalSessionID).lean().exec (err, levelSession) -> if err? then return errors.serverError res, "There was a problem finding the level session:#{err}" - - console.log "Queue message created at: #{taskLogJSON.createdAt}, level session submitted at #{levelSession.submitDate}" - - if taskLogJSON.registrationTime <= levelSession.submitDate - console.log "Task has been resubmitted!" + + supposedSubmissionDate = new Date(clientResponseObject.sessions[0].submitDate) + + if Number(supposedSubmissionDate) isnt Number(levelSession.submitDate) return sendResponseObject req, res, {"message":"The game has been resubmitted. Removing from queue..."} - + logTaskComputation clientResponseObject, taskLog, (logErr) -> if logErr? then return errors.serverError res, "There as a problem logging the task computation: #{logErr}" - + updateSessions clientResponseObject, (updateError, newScoreArray) -> if updateError? then return errors.serverError res, "There was an error updating the scores.#{updateError}" - + newScoresObject = _.indexBy newScoreArray, 'id' - + addMatchToSessions clientResponseObject, newScoresObject, (err, data) -> if err? then return errors.serverError res, "There was an error updating the sessions with the match! #{JSON.stringify err}" - + originalSessionID = clientResponseObject.originalSessionID originalSessionTeam = clientResponseObject.originalSessionTeam originalSessionRank = parseInt clientResponseObject.originalSessionRank - + determineIfSessionShouldContinueAndUpdateLog originalSessionID, originalSessionRank, (err, sessionShouldContinue) -> if err? then return errors.serverError res, "There was an error determining if the session should continue, #{err}" - + if sessionShouldContinue opposingTeam = calculateOpposingTeam(originalSessionTeam) opponentID = _.pull(_.keys(newScoresObject), originalSessionID) sessionNewScore = newScoresObject[originalSessionID].totalScore opponentNewScore = newScoresObject[opponentID].totalScore - findNearestBetterSessionID originalSessionID, sessionNewScore, opponentNewScore, opponentID ,opposingTeam, (err, opponentSessionID) -> + + levelOriginalID = levelSession.level.original + levelOriginalMajorVersion = levelSession.level.majorVersion + findNearestBetterSessionID levelOriginalID, levelOriginalMajorVersion, originalSessionID, sessionNewScore, opponentNewScore, opponentID, opposingTeam, (err, opponentSessionID) -> if err? then return errors.serverError res, "There was an error finding the nearest sessionID!" - unless opponentSessionID then return sendResponseObject req, res, {"message":"There were no more games to rank(game is at top!"} - - addPairwiseTaskToQueue [originalSessionID, opponentSessionID], (err, success) -> - if err? then return errors.serverError res, "There was an error sending the pairwise tasks to the queue!" - sendResponseObject req, res, {"message":"The scores were updated successfully and more games were sent to the queue!"} + if opponentSessionID + addPairwiseTaskToQueue [originalSessionID, opponentSessionID], (err, success) -> + if err? then return errors.serverError res, "There was an error sending the pairwise tasks to the queue!" + sendResponseObject req, res, {"message":"The scores were updated successfully and more games were sent to the queue!"} + else + LevelSession.update {_id: originalSessionID}, {isRanking: false}, {multi: false}, (err, affected) -> + if err? then return errors.serverError res, "There was an error marking the victorious session as not being ranked." + return sendResponseObject req, res, {"message":"There were no more games to rank (game is at top)!"} else console.log "Player lost, achieved rank #{originalSessionRank}" - sendResponseObject req, res, {"message":"The scores were updated successfully, person lost so no more games are being inserted!"} + LevelSession.update {_id: originalSessionID}, {isRanking: false}, {multi: false}, (err, affected) -> + if err? then return errors.serverError res, "There was an error marking the completed session as not being ranked." + sendResponseObject req, res, {"message":"The scores were updated successfully, person lost so no more games are being inserted!"} determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) -> @@ -182,7 +210,7 @@ determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) -> cb null, true -findNearestBetterSessionID = (sessionID, sessionTotalScore, opponentSessionTotalScore, opponentSessionID, opposingTeam, cb) -> +findNearestBetterSessionID = (levelOriginalID, levelMajorVersion, sessionID, sessionTotalScore, opponentSessionTotalScore, opponentSessionID, opposingTeam, cb) -> retrieveAllOpponentSessionIDs sessionID, (err, opponentSessionIDs) -> if err? then return cb err, null @@ -191,8 +219,8 @@ findNearestBetterSessionID = (sessionID, sessionTotalScore, opponentSessionTotal $gt:opponentSessionTotalScore _id: $nin: opponentSessionIDs - "level.original": "52d97ecd32362bc86e004e87" - "level.majorVersion": 0 + "level.original": levelOriginalID + "level.majorVersion": levelMajorVersion submitted: true submittedCode: $exists: true @@ -221,11 +249,11 @@ findNearestBetterSessionID = (sessionID, sessionTotalScore, opponentSessionTotal retrieveAllOpponentSessionIDs = (sessionID, cb) -> query = LevelSession.findOne({"_id":sessionID}) - .select('matches.opponents.sessionID') + .select('matches.opponents.sessionID matches.date submitDate') .lean() query.exec (err, session) -> if err? then return cb err, null - opponentSessionIDs = (match.opponents[0].sessionID for match in session.matches) + opponentSessionIDs = (match.opponents[0].sessionID for match in session.matches when match.date > session.submitDate) cb err, opponentSessionIDs @@ -272,7 +300,7 @@ updateMatchesInSession = (matchObject, sessionID, callback) -> currentMatchObject.opponents = opponentsArray sessionUpdateObject = - $push: {matches: currentMatchObject} + $push: {matches: {$each: [currentMatchObject], $slice: -200}} log.info "Updating session #{sessionID}" LevelSession.update {"_id":sessionID}, sessionUpdateObject, callback @@ -291,19 +319,19 @@ updateSessionToSubmit = (sessionToUpdate, callback) -> submitted: true submittedCode: sessionToUpdate.code submitDate: new Date() - matches: [] meanStrength: 25 standardDeviation: 25/3 totalScore: 10 numberOfWinsAndTies: 0 numberOfLosses: 0 + isRanking: true LevelSession.update {_id: sessionToUpdate._id}, sessionUpdateObject, callback -fetchInitialSessionsToRankAgainst = (opposingTeam, callback) -> +fetchInitialSessionsToRankAgainst = (opposingTeam, levelID, levelMajorVersion, callback) -> console.log "Fetching sessions to rank against for opposing team #{opposingTeam}" findParameters = - "level.original": "52d97ecd32362bc86e004e87" - "level.majorVersion": 0 + "level.original": levelID + "level.majorVersion": levelMajorVersion submitted: true submittedCode: $exists: true @@ -333,7 +361,7 @@ generateTaskPairs = (submittedSessions, sessionToScore) -> return taskPairs sendTaskPairToQueue = (taskPair, callback) -> - scoringTaskQueue.sendMessage {sessions: taskPair, registrationTime:new Date()}, 0, (err,data) -> callback? err,data + scoringTaskQueue.sendMessage {sessions: taskPair}, 0, (err,data) -> callback? err,data getUserIDFromRequest = (req) -> if req.user? then return req.user._id else return null @@ -380,10 +408,9 @@ getSessionInformation = (sessionIDString, callback) -> callback err, sessionInformation -constructTaskLogObject = (calculatorUserID, registrationTime, messageIdentifierString, callback) -> +constructTaskLogObject = (calculatorUserID, messageIdentifierString, callback) -> taskLogObject = new TaskLog "createdAt": new Date() - "registrationTime": registrationTime "calculator":calculatorUserID "sentDate": Date.now() "messageIdentifierString":messageIdentifierString @@ -431,10 +458,14 @@ updateScoreInSession = (scoreObject,callback) -> if err? then return callback err, null session = session.toObject() + newTotalScore = scoreObject.meanStrength - 1.8 * scoreObject.standardDeviation + scoreHistoryAddition = [Date.now(), newTotalScore] updateObject = meanStrength: scoreObject.meanStrength standardDeviation: scoreObject.standardDeviation - totalScore: scoreObject.meanStrength - 1.8 * scoreObject.standardDeviation + totalScore: newTotalScore + $push: {scoreHistory: {$each: [scoreHistoryAddition], $slice: -1000}} + LevelSession.update {"_id": scoreObject.id}, updateObject, callback log.info "New total score for session #{scoreObject.id} is #{updateObject.totalScore}" diff --git a/server/routes/auth.coffee b/server/routes/auth.coffee index 2e6dbf72d..dcb8ea12a 100644 --- a/server/routes/auth.coffee +++ b/server/routes/auth.coffee @@ -2,6 +2,7 @@ authentication = require('passport') LocalStrategy = require('passport-local').Strategy User = require('../users/User') UserHandler = require('../users/user_handler') +LevelSession = require '../levels/sessions/LevelSession' config = require '../../server_config' errors = require '../commons/errors' mail = require '../commons/mail' @@ -21,16 +22,16 @@ module.exports.setup = (app) -> if passwordReset and password.toLowerCase() is passwordReset User.update {_id: user.get('_id')}, {passwordReset: ''}, {}, -> return done(null, user) - + hash = User.hashPassword(password) unless user.get('passwordHash') is hash - return done(null, false, {message:'is wrong, wrong, wrong', property:'password'}) + return done(null, false, {message:'is wrong.', property:'password'}) return done(null, user) ) )) app.post '/auth/spy', (req, res, next) -> if req?.user?.isAdmin() - + username = req.body.usernameLower emailLower = req.body.emailLower if emailLower @@ -39,19 +40,19 @@ module.exports.setup = (app) -> query = {"nameLower":username} else return errors.badInput res, "You need to supply one of emailLower or username" - + User.findOne query, (err, user) -> if err? then return errors.serverError res, "There was an error finding the specified user" - + unless user then return errors.badInput res, "The specified user couldn't be found" - + req.logIn user, (err) -> if err? then return errors.serverError res, "There was an error logging in with the specified" res.send(UserHandler.formatEntity(req, user)) return res.end() else return errors.unauthorized res, "You must be an admin to enter espionage mode" - + app.post('/auth/login', (req, res, next) -> authentication.authenticate('local', (err, user, info) -> return next(err) if err @@ -87,11 +88,11 @@ module.exports.setup = (app) -> user.save((err) -> if err return @sendDatabaseError(res, err) - + req.logIn(user, (err) -> if err return @sendDatabaseError(res, err) - + if send return @sendSuccess(res, user) next() if next @@ -110,7 +111,7 @@ module.exports.setup = (app) -> User.findOne({emailLower:req.body.email.toLowerCase()}).exec((err, user) -> if not user return errors.notFound(res, [{message:'not found.', property:'email'}]) - + user.set('passwordReset', Math.random().toString(36).slice(2,7).toUpperCase()) user.save (err) => return errors.serverError(res) if err @@ -127,12 +128,22 @@ module.exports.setup = (app) -> return res.end() ) ) - + app.get '/auth/unsubscribe', (req, res) -> email = req.query.email unless req.query.email return errors.badInput res, 'No email provided to unsubscribe.' - + + if req.query.session + # Unsubscribe from just one session's notifications instead. + return LevelSession.findOne({_id: req.query.session}).exec (err, session) -> + return errors.serverError res, 'Could not unsubscribe: #{req.query.session}, #{req.query.email}: #{err}' if err + session.set 'unsubscribed', true + session.save (err) -> + return errors.serverError res, 'Database failure.' if err + res.send "Unsubscribed #{req.query.email} from CodeCombat emails for #{session.levelName} #{session.team} ladder updates. Sorry to see you go!

Ladder preferences

" + res.end() + User.findOne({emailLower:req.query.email.toLowerCase()}).exec (err, user) -> if not user return errors.notFound res, "No user found with email '#{req.query.email}'" @@ -152,4 +163,4 @@ createMailOptions = (receiver, password) -> replyTo: config.mail.username subject: "[CodeCombat] Password Reset" text: "You can log into your account with: #{password}" -# \ No newline at end of file +# diff --git a/server/routes/db.coffee b/server/routes/db.coffee index 8bf2ef7eb..fec290cfa 100644 --- a/server/routes/db.coffee +++ b/server/routes/db.coffee @@ -11,7 +11,7 @@ module.exports.setup = (app) -> parts = module.split('/') module = parts[0] return getSchema(req, res, module) if parts[1] is 'schema' - return errors.unauthorized(res, 'Must have an identity to do anything with the db.') unless req.user + return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?') unless req.user try moduleName = module.replace '.', '_' diff --git a/server/routes/file.coffee b/server/routes/file.coffee index ce9f4ca7c..7a16c3709 100644 --- a/server/routes/file.coffee +++ b/server/routes/file.coffee @@ -13,6 +13,7 @@ module.exports.setup = (app) -> fileGet = (req, res) -> path = req.path[6..] + path = decodeURI path isFolder = false try objectId = mongoose.Types.ObjectId(path) diff --git a/server/routes/mail.coffee b/server/routes/mail.coffee index d5306e16a..ae7d1efd7 100644 --- a/server/routes/mail.coffee +++ b/server/routes/mail.coffee @@ -4,37 +4,192 @@ User = require '../users/User.coffee' errors = require '../commons/errors' #request = require 'request' config = require '../../server_config' +LevelSession = require '../levels/sessions/LevelSession.coffee' +Level = require '../levels/Level.coffee' +log = require 'winston' +sendwithus = require '../sendwithus' #badLog = (text) -> # console.log text # request.post 'http://requestb.in/1brdpaz1', { form: {log: text} } - + module.exports.setup = (app) -> - app.all config.mail.mailchimpWebhook, (req, res) -> - post = req.body -# badLog("Got post data: #{JSON.stringify(post, null, '\t')}") - - unless post.type in ['unsubscribe', 'profile'] - res.send 'Bad post type' - return res.end() + app.all config.mail.mailchimpWebhook, handleMailchimpWebHook + app.get '/mail/cron/ladder-update', handleLadderUpdate - unless post.data.email - res.send 'No email provided' - return res.end() +getAllLadderScores = (next) -> + query = Level.find({type: 'ladder'}) + .select('levelID') + .lean() + query.exec (err, levels) -> + if err + log.error "Couldn't fetch ladder levels. Error: ", err + return next [] + for level in levels + for team in ['humans', 'ogres'] + 'I ... am not doing this.' + # Query to get sessions to make histogram + # db.level.sessions.find({"submitted":true,"levelID":"brawlwood",team:"ogres"},{"_id":0,"totalScore":1}) - query = {'mailChimp.leid':post.data.web_id} - User.findOne query, (err, user) -> +isRequestFromDesignatedCronHandler = (req, res) -> + if req.ip isnt config.mail.cronHandlerPublicIP and req.ip isnt config.mail.cronHandlerPrivateIP + console.log "RECEIVED REQUEST FROM IP #{req.ip}(headers indicate #{req.headers['x-forwarded-for']}" + console.log "UNAUTHORIZED ATTEMPT TO SEND TRANSACTIONAL LADDER EMAIL THROUGH CRON MAIL HANDLER" + res.send("You aren't authorized to perform that action. Only the specified Cron handler may perform that action.") + res.end() + return false + return true + + +handleLadderUpdate = (req, res) -> + log.info("Going to see about sending ladder update emails.") + requestIsFromDesignatedCronHandler = isRequestFromDesignatedCronHandler req, res + #unless requestIsFromDesignatedCronHandler then return + + res.send('Great work, Captain Cron! I can take it from here.') + res.end() + # TODO: somehow fetch the histograms + emailDays = [1, 2, 4, 7, 30] + now = new Date() + getTimeFromDaysAgo = (daysAgo) -> + # 2 hours before the date + t = now - (86400 * daysAgo + 2 * 3600) * 1000 + for daysAgo in emailDays + # Get every session that was submitted in a 5-minute window after the time. + startTime = getTimeFromDaysAgo daysAgo + endTime = startTime + 5 * 60 * 1000 + #endTime = startTime + 1.5 * 60 * 60 * 1000 # Debugging: make sure there's something to send + findParameters = {submitted: true, submitDate: {$gt: new Date(startTime), $lte: new Date(endTime)}} + # TODO: think about putting screenshots in the email + selectString = "creator team levelName levelID totalScore matches submitted submitDate scoreHistory" + query = LevelSession.find(findParameters) + .select(selectString) + .lean() + do (daysAgo) -> + query.exec (err, results) -> + if err + log.error "Couldn't fetch ladder updates for #{findParameters}\nError: #{err}" + return errors.serverError res, "Ladder update email query failed: #{JSON.stringify(err)}" + log.info "Found #{results.length} ladder sessions to email updates about for #{daysAgo} day(s) ago." + sendLadderUpdateEmail result, daysAgo for result in results + +sendLadderUpdateEmail = (session, daysAgo) -> + User.findOne({_id: session.creator}).select("name email firstName lastName emailSubscriptions preferredLanguage").lean().exec (err, user) -> + if err + log.error "Couldn't find user for #{session.creator} from session #{session._id}" + return + unless user.email and ('notification' in user.emailSubscriptions) and not session.unsubscribed + log.info "Not sending email to #{user.email} #{user.name} because they only want emails about #{user.emailSubscriptions} - session unsubscribed: #{session.unsubscribed}" + return + unless session.levelName + log.info "Not sending email to #{user.email} #{user.name} because the session had no levelName in it." + return + name = if user.firstName and user.lastName then "#{user.firstName}" else user.name + name = "Wizard" if not name or name is "Anoner" + + # Fetch the most recent defeat and victory, if there are any. + # (We could look at strongest/weakest, but we'd have to fetch everyone, or denormalize more.) + matches = _.filter session.matches, (match) -> match.date >= (new Date() - 86400 * 1000 * daysAgo) + defeats = _.filter matches, (match) -> match.metrics.rank is 1 and match.opponents[0].metrics.rank is 0 + victories = _.filter matches, (match) -> match.metrics.rank is 0 and match.opponents[0].metrics.rank is 1 + defeat = _.last defeats + victory = _.last victories + + sendEmail = (defeatContext, victoryContext) -> + # TODO: do something with the preferredLanguage? + context = + email_id: sendwithus.templates.ladder_update_email + recipient: + address: user.email + #address: 'nick@codecombat.com' # Debugging + name: name + email_data: + name: name + days_ago: daysAgo + wins: victories.length + losses: defeats.length + total_score: Math.round(session.totalScore * 100) + team: session.team + team_name: session.team[0].toUpperCase() + session.team.substr(1) + level_name: session.levelName + session_id: session._id + ladder_url: "http://codecombat.com/play/ladder/#{session.levelID}#my-matches" + score_history_graph_url: getScoreHistoryGraphURL session, daysAgo + defeat: defeatContext + victory: victoryContext + log.info "Sending ladder update email to #{context.recipient.address} with #{context.email_data.wins} wins and #{context.email_data.losses} losses since #{daysAgo} day(s) ago." + sendwithus.api.send context, (err, result) -> + log.error "Error sending ladder update email: #{err} with result #{result}" if err + + urlForMatch = (match) -> + "http://codecombat.com/play/level/#{session.levelID}?team=#{session.team}&session=#{session._id}&opponent=#{match.opponents[0].sessionID}" + + onFetchedDefeatedOpponent = (err, defeatedOpponent) -> + if err + log.error "Couldn't find defeateded opponent: #{err}" + defeatedOpponent = null + victoryContext = {opponent_name: defeatedOpponent?.name ? "Anoner", url: urlForMatch(victory)} if victory + + onFetchedVictoriousOpponent = (err, victoriousOpponent) -> + if err + log.error "Couldn't find victorious opponent: #{err}" + victoriousOpponent = null + defeatContext = {opponent_name: victoriousOpponent?.name ? "Anoner", url: urlForMatch(defeat)} if defeat + sendEmail defeatContext, victoryContext + + if defeat + User.findOne({_id: defeat.opponents[0].userID}).select("name").lean().exec onFetchedVictoriousOpponent + else + onFetchedVictoriousOpponent null, null + + if victory + User.findOne({_id: victory.opponents[0].userID}).select("name").lean().exec onFetchedDefeatedOpponent + else + onFetchedDefeatedOpponent null, null + +getScoreHistoryGraphURL = (session, daysAgo) -> + # Totally duplicated in My Matches tab for now until we figure out what we're doing. + since = new Date() - 86400 * 1000 * daysAgo + scoreHistory = (s for s in session.scoreHistory ? [] when s[0] >= since) + return '' unless scoreHistory.length > 1 + scoreHistory = _.last scoreHistory, 100 # Chart URL needs to be under 2048 characters for GET + times = (s[0] for s in scoreHistory) + times = ((100 * (t - times[0]) / (times[times.length - 1] - times[0])).toFixed(1) for t in times) + scores = (s[1] for s in scoreHistory) + lowest = _.min scores.concat([0]) + highest = _.max scores.concat(50) + scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores) + currentScore = Math.round scoreHistory[scoreHistory.length - 1][1] * 100 + minScore = Math.round(100 * lowest) + maxScore = Math.round(100 * highest) + chartData = times.join(',') + '|' + scores.join(',') + "https://chart.googleapis.com/chart?chs=600x75&cht=lxy&chtt=Score%3A+#{currentScore}&chts=222222,12,r&chf=a,s,000000FF&chls=2&chd=t:#{chartData}&chxt=y&chxr=0,#{minScore},#{maxScore}" + +handleMailchimpWebHook = (req, res) -> + post = req.body + #badLog("Got post data: #{JSON.stringify(post, null, '\t')}") + + unless post.type in ['unsubscribe', 'profile'] + res.send 'Bad post type' + return res.end() + + unless post.data.email + res.send 'No email provided' + return res.end() + + query = {'mailChimp.leid':post.data.web_id} + User.findOne query, (err, user) -> + return errors.serverError(res) if err + if not user + return errors.notFound(res) + + handleProfileUpdate(user, post) if post.type is 'profile' + handleUnsubscribe(user) if post.type is 'unsubscribe' + + user.updatedMailChimp = true # so as not to echo back to mailchimp + user.save (err) -> return errors.serverError(res) if err - if not user - return errors.notFound(res) - - handleProfileUpdate(user, post) if post.type is 'profile' - handleUnsubscribe(user) if post.type is 'unsubscribe' - - user.updatedMailChimp = true # so as not to echo back to mailchimp - user.save (err) -> - return errors.serverError(res) if err - res.end('Success') + res.end('Success') handleProfileUpdate = (user, post) -> @@ -43,19 +198,19 @@ handleProfileUpdate = (user, post) -> otherSubscriptions = (g for g in user.get('emailSubscriptions') when not mail.MAILCHIMP_GROUP_MAP[g]) groups = groups.concat otherSubscriptions user.set 'emailSubscriptions', groups - + fname = post.data.merges.FNAME user.set('firstName', fname) if fname lname = post.data.merges.LNAME user.set('lastName', lname) if lname - + user.set 'mailChimp.email', post.data.email user.set 'mailChimp.euid', post.data.id - + # badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}") - + handleUnsubscribe = (user) -> user.set 'emailSubscriptions', [] -# badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}") \ No newline at end of file +# badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}") diff --git a/server/routes/queue.coffee b/server/routes/queue.coffee index 85ee0f8e3..10af6875f 100644 --- a/server/routes/queue.coffee +++ b/server/routes/queue.coffee @@ -9,6 +9,11 @@ module.exports.setup = (app) -> #app.post '/queue/scoring/pairwise', (req, res) -> # handler = loadQueueHandler 'scoring' # handler.addPairwiseTaskToQueue req, res + + app.get '/queue/messagesInQueueCount', (req, res) -> + handler = loadQueueHandler 'scoring' + handler.messagesInQueueCount req, res + app.all '/queue/*', (req, res) -> setResponseHeaderToJSONContentType res diff --git a/server/sendwithus.coffee b/server/sendwithus.coffee index a9bb41bf4..ad7a07500 100644 --- a/server/sendwithus.coffee +++ b/server/sendwithus.coffee @@ -7,7 +7,8 @@ module.exports.setupRoutes = (app) -> return -options = { DEBUG: not config.isProduction } -module.exports.api = new sendwithusAPI swuAPIKey, options +debug = not config.isProduction +module.exports.api = new sendwithusAPI swuAPIKey, debug module.exports.templates = - welcome_email: 'utnGaBHuSU4Hmsi7qrAypU' \ No newline at end of file + welcome_email: 'utnGaBHuSU4Hmsi7qrAypU' + ladder_update_email: 'JzaZxf39A4cKMxpPZUfWy4' diff --git a/server/users/User.coffee b/server/users/User.coffee index d167b2d73..28009e610 100644 --- a/server/users/User.coffee +++ b/server/users/User.coffee @@ -3,6 +3,7 @@ jsonschema = require('./user_schema') crypto = require('crypto') {salt, isProduction} = require('../../server_config') mail = require '../commons/mail' +log = require 'winston' sendwithus = require '../sendwithus' @@ -16,6 +17,7 @@ UserSchema.pre('init', (next) -> return next() unless jsonschema.properties? for prop, sch of jsonschema.properties @set(prop, sch.default) if sch.default? + @set('permissions', ['admin']) if not isProduction next() ) @@ -27,7 +29,7 @@ UserSchema.post('init', -> UserSchema.methods.isAdmin = -> p = @get('permissions') return p and 'admin' in p - + UserSchema.statics.updateMailChimp = (doc, callback) -> return callback?() unless isProduction return callback?() if doc.updatedMailChimp @@ -41,25 +43,25 @@ UserSchema.statics.updateMailChimp = (doc, callback) -> return callback?() # don't add totally unsubscribed people to the list subsChanged = doc.currentSubscriptions isnt JSON.stringify(emailSubs) return callback?() unless emailChanged or subsChanged - + params = {} params.id = mail.MAILCHIMP_LIST_ID params.email = if existingProps then {leid:existingProps.leid} else {email:doc.get('email')} params.merge_vars = { groupings: [ {id: mail.MAILCHIMP_GROUP_ID, groups: newGroups} ] } params.update_existing = true params.double_optin = false - + onSuccess = (data) -> doc.set('mailChimp', data) doc.updatedMailChimp = true doc.save() callback?() - + onFailure = (error) -> - console.error 'failed to subscribe', error, callback? + log.error 'failed to subscribe', error, callback? doc.updatedMailChimp = true callback?() - + mc.lists.subscribe params, onSuccess, onFailure @@ -75,9 +77,9 @@ UserSchema.pre('save', (next) -> data = email_id: sendwithus.templates.welcome_email recipient: - address: @get 'email' + address: @get 'email' sendwithus.api.send data, (err, result) -> - console.log 'error', err, 'result', result + log.error 'error', err, 'result', result if err next() ) @@ -90,4 +92,4 @@ UserSchema.statics.hashPassword = (password) -> shasum.update(salt + password) shasum.digest('hex') -module.exports = User = mongoose.model('User', UserSchema) \ No newline at end of file +module.exports = User = mongoose.model('User', UserSchema) diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee index 465aae27f..125845fe9 100644 --- a/server/users/user_handler.coffee +++ b/server/users/user_handler.coffee @@ -9,7 +9,7 @@ errors = require '../commons/errors' async = require 'async' serverProperties = ['passwordHash', 'emailLower', 'nameLower', 'passwordReset'] -privateProperties = ['permissions', 'email', 'firstName', 'lastName', 'gender', 'facebookID', 'music', 'volume'] +privateProperties = ['permissions', 'email', 'firstName', 'lastName', 'gender', 'facebookID', 'music', 'volume', 'aceConfig'] UserHandler = class UserHandler extends Handler modelClass: User @@ -18,7 +18,7 @@ UserHandler = class UserHandler extends Handler 'name', 'photoURL', 'password', 'anonymous', 'wizardColor1', 'volume', 'firstName', 'lastName', 'gender', 'facebookID', 'emailSubscriptions', 'testGroupNumber', 'music', 'hourOfCode', 'hourOfCodeComplete', 'preferredLanguage', - 'wizard' + 'wizard', 'aceConfig' ] jsonSchema: schema @@ -114,11 +114,19 @@ UserHandler = class UserHandler extends Handler ids = ids.split(',') if _.isString ids ids = _.uniq ids + # TODO: Extend and repurpose this handler to return other public info about a user more flexibly, + # say by a query parameter that lists public properties to return. + returnWizard = req.query.wizard or req.body.wizard + query = if returnWizard then {name:1, wizard:1} else {name:1} + makeFunc = (id) -> (callback) -> - User.findById(id, {name:1}).exec (err, document) -> + User.findById(id, query).exec (err, document) -> return done(err) if err - callback(null, document?.get('name') or '') + if document and returnWizard + callback(null, {name:document.get('name'), wizard:document.get('wizard') or {}}) + else + callback(null, document?.get('name') or '') funcs = {} for id in ids diff --git a/server/users/user_schema.coffee b/server/users/user_schema.coffee index 7ae34c4af..650d680d6 100644 --- a/server/users/user_schema.coffee +++ b/server/users/user_schema.coffee @@ -19,7 +19,7 @@ UserSchema = c.object {}, music: {type: 'boolean', default: true} #autocastDelay, or more complex autocast options? I guess I'll see what I need when trying to hook up Scott's suggested autocast behavior - emailSubscriptions: c.array {uniqueItems: true, 'default': ['announcement']}, {'enum': emailSubscriptions} + emailSubscriptions: c.array {uniqueItems: true, 'default': ['announcement', 'notification']}, {'enum': emailSubscriptions} # server controlled permissions: c.array {'default': []}, c.shortString() @@ -29,7 +29,7 @@ UserSchema = c.object {}, mailChimp: {type: 'object'} hourOfCode: {type: 'boolean'} hourOfCodeComplete: {type: 'boolean'} - + emailLower: c.shortString() nameLower: c.shortString() passwordHash: {type: 'string', maxLength: 256} @@ -40,11 +40,17 @@ UserSchema = c.object {}, #Internationalization stuff preferredLanguage: {type: 'string', default: 'en', 'enum': c.getLanguageCodeArray()} - + signedCLA: c.date({title: 'Date Signed the CLA'}) wizard: c.object {}, colorConfig: c.object {additionalProperties: c.colorConfig()} + aceConfig: c.object {}, + keyBindings: {type: 'string', 'default': 'default', 'enum': ['default', 'vim', 'emacs']} + invisibles: {type: 'boolean', 'default': false} + indentGuides: {type: 'boolean', 'default': false} + behaviors: {type: 'boolean', 'default': false} + c.extendBasicProperties UserSchema, 'user' module.exports = UserSchema diff --git a/server_config.coffee b/server_config.coffee new file mode 100644 index 000000000..a30cbde32 --- /dev/null +++ b/server_config.coffee @@ -0,0 +1,51 @@ +config = {} + +config.unittest = process.argv.indexOf("--unittest") > -1 + +config.port = process.env.COCO_PORT or process.env.COCO_NODE_PORT or 3000 +config.ssl_port = process.env.COCO_SSL_PORT or process.env.COCO_SSL_NODE_PORT or 3443 + +config.mongo = + port: process.env.COCO_MONGO_PORT or 27017 + host: process.env.COCO_MONGO_HOST or "localhost" + db: process.env.COCO_MONGO_DATABASE_NAME or "coco" + mongoose_replica_string: process.env.COCO_MONGO_MONGOOSE_REPLICA_STRING or "" + +if config.unittest + config.port += 1 + config.ssl_port += 1 + config.mongo.host = "localhost" +else + config.mongo.username = process.env.COCO_MONGO_USERNAME or "" + config.mongo.password = process.env.COCO_MONGO_PASSWORD or "" + +config.mail = + service: process.env.COCO_MAIL_SERVICE_NAME or "Zoho" + username: process.env.COCO_MAIL_SERVICE_USERNAME or "" + password: process.env.COCO_MAIL_SERVICE_PASSWORD or "" + mailchimpAPIKey: process.env.COCO_MAILCHIMP_API_KEY or "" + mailchimpWebhook: process.env.COCO_MAILCHIMP_WEBHOOK or "/mail/webhook" + sendwithusAPIKey: process.env.COCO_SENDWITHUS_API_KEY or "" + cronHandlerPublicIP: process.env.COCO_CRON_PUBLIC_IP or "" + cronHandlerPrivateIP: process.env.COCO_CRON_PRIVATE_IP or "" + +config.queue = + accessKeyId: process.env.COCO_AWS_ACCESS_KEY_ID or "" + secretAccessKey: process.env.COCO_AWS_SECRET_ACCESS_KEY or "" + region: "us-east-1" + simulationQueueName: "simulationQueue" + +config.mongoQueue = + queueDatabaseName: "coco_queue" + +config.salt = process.env.COCO_SALT or "pepper" +config.cookie_secret = process.env.COCO_COOKIE_SECRET or "chips ahoy" + +config.isProduction = config.mongo.host isnt "localhost" + +if not config.unittest and not config.isProduction + # change artificially slow down non-static requests for testing + config.slow_down = false + + +module.exports = config diff --git a/server_config.js b/server_config.js deleted file mode 100644 index 880fcfd78..000000000 --- a/server_config.js +++ /dev/null @@ -1,52 +0,0 @@ -var config = {}; - -config.unittest = process.argv.indexOf('--unittest') > -1; - -config.port = process.env.COCO_PORT || process.env.COCO_NODE_PORT || 3000; -config.ssl_port = - process.env.COCO_SSL_PORT || process.env.COCO_SSL_NODE_PORT || 3443; - -config.mongo = {}; -config.mongo.port = process.env.COCO_MONGO_PORT || 27017; -config.mongo.host = process.env.COCO_MONGO_HOST || 'localhost'; -config.mongo.db = process.env.COCO_MONGO_DATABASE_NAME || 'coco'; -config.mongo.mongoose_replica_string = process.env.COCO_MONGO_MONGOOSE_REPLICA_STRING || ''; - -if(config.unittest) { - config.port += 1; - config.ssl_port += 1; - config.mongo.host = 'localhost'; -} - -else { - config.mongo.username = process.env.COCO_MONGO_USERNAME || ''; - config.mongo.password = process.env.COCO_MONGO_PASSWORD || ''; -} - -config.mail = {}; -config.mail.service = process.env.COCO_MAIL_SERVICE_NAME || "Zoho"; -config.mail.username = process.env.COCO_MAIL_SERVICE_USERNAME || ""; -config.mail.password = process.env.COCO_MAIL_SERVICE_PASSWORD || ""; -config.mail.mailchimpAPIKey = process.env.COCO_MAILCHIMP_API_KEY || ''; -config.mail.mailchimpWebhook = process.env.COCO_MAILCHIMP_WEBHOOK || '/mail/webhook'; -config.mail.sendwithusAPIKey = process.env.COCO_SENDWITHUS_API_KEY || ''; - -config.queue = {}; -config.queue.accessKeyId = process.env.COCO_AWS_ACCESS_KEY_ID || ''; -config.queue.secretAccessKey = process.env.COCO_AWS_SECRET_ACCESS_KEY || ''; -config.queue.region = 'us-east-1'; -config.queue.simulationQueueName = "simulationQueue"; -config.mongoQueue = {}; -config.mongoQueue.queueDatabaseName = "coco_queue"; - -config.salt = process.env.COCO_SALT || 'pepper'; -config.cookie_secret = process.env.COCO_COOKIE_SECRET || 'chips ahoy'; - -config.isProduction = config.mongo.host != 'localhost'; - -if(!config.unittest && !config.isProduction) { - // change artificially slow down non-static requests for testing - config.slow_down = false; -} - -module.exports = config; diff --git a/server_setup.coffee b/server_setup.coffee index 9f94da179..e0a72f4dc 100644 --- a/server_setup.coffee +++ b/server_setup.coffee @@ -8,21 +8,37 @@ database = require './server/commons/database' baseRoute = require './server/routes/base' user = require './server/users/user_handler' logging = require './server/commons/logging' - config = require './server_config' ###Middleware setup functions implementation### -setupRequestTimeoutMiddleware = (app) -> - app.use (req, res, next) -> - req.setTimeout 15000, -> - console.log 'timed out!' - req.abort() - self.emit('pass',message) - next() +# 2014-03-03: Try not using this and see if it's still a problem +#setupRequestTimeoutMiddleware = (app) -> +# app.use (req, res, next) -> +# req.setTimeout 15000, -> +# console.log 'timed out!' +# req.abort() +# self.emit('pass',message) +# next() + +productionLogging = (tokens, req, res) -> + status = res.statusCode + color = 32 + if status >= 500 then color = 31 + else if status >= 400 then color = 33 + else if status >= 300 then color = 36 + elapsed = (new Date()) - req._startTime + elapsedColor = if elapsed < 500 then 90 else 31 + if (status isnt 200 and status isnt 304) or elapsed > 500 + return "\x1b[90m#{req.method} #{req.originalUrl} \x1b[#{color}m#{res.statusCode} \x1b[#{elapsedColor}m#{elapsed}ms\x1b[0m" + null setupExpressMiddleware = (app) -> - setupRequestTimeoutMiddleware app - app.use(express.logger('dev')) + #setupRequestTimeoutMiddleware app + if config.isProduction + express.logger.format('prod', productionLogging) + app.use(express.logger('prod')) + else + app.use(express.logger('dev')) app.use(express.static(path.join(__dirname, 'public'))) app.use(useragent.express()) @@ -31,6 +47,7 @@ setupExpressMiddleware = (app) -> app.use(express.bodyParser()) app.use(express.methodOverride()) app.use(express.cookieSession({secret:'defenestrate'})) + #app.use(express.compress()) if config.isProduction # just let Cloudflare do it setupPassportMiddleware = (app) -> app.use(authentication.initialize()) @@ -67,7 +84,7 @@ exports.setupMiddleware = (app) -> ###Routing function implementations### setupFallbackRouteToIndex = (app) -> - app.get '*', (req, res) -> + app.all '*', (req, res) -> res.sendfile path.join(__dirname, 'public', 'index.html') setupFacebookCrossDomainCommunicationRoute = (app) -> @@ -99,6 +116,5 @@ exports.setExpressConfigurationOptions = (app) -> app.set('views', __dirname + '/app/views') app.set('view engine', 'jade') app.set('view options', { layout: false }) - - - + app.set('env', if config.isProduction then 'production' else 'development') + app.set('json spaces', 0) diff --git a/test/app/lib/utils.spec.coffee b/test/app/lib/utils.spec.coffee new file mode 100644 index 000000000..925bc8e54 --- /dev/null +++ b/test/app/lib/utils.spec.coffee @@ -0,0 +1,46 @@ +describe 'utils library', -> + util = require 'lib/utils' + + beforeEach -> + this.fixture1 = + "text": "G'day, Wizard! Come to practice? Well, let's get started..." + "blurb": "G'day" + "i18n": + "es-419": + "text": "¡Buenas, Hechicero! ¿Vienes a practicar? Bueno, empecemos..." + "es-ES": + "text": "¡Buenas Mago! ¿Vienes a practicar? Bien, empecemos..." + "es": + "text": "¡Buenas Mago! ¿Vienes a practicar? Muy bien, empecemos..." + "fr": + "text": "S'lut, Magicien! Venu pratiquer? Ok, bien débutons..." + "pt-BR": + "text": "Bom dia, feiticeiro! Veio praticar? Então vamos começar..." + "en": + "text": "Ohai Magician!" + "de": + "text": "'N Tach auch, Zauberer! Kommst Du zum Üben? Dann lass uns anfangen..." + "sv": + "text": "Godagens, trollkarl! Kommit för att öva? Nå, låt oss börja..." + + + it 'i18n should find a valid target string', -> + expect(util.i18n(this.fixture1, 'text', 'sv')).toEqual(this.fixture1.i18n['sv'].text) + expect(util.i18n(this.fixture1, 'text', 'es-ES')).toEqual(this.fixture1.i18n['es-ES'].text) + + it 'i18n picks the correct fallback for a specific language', -> + expect(util.i18n(this.fixture1, 'text', 'fr-be')).toEqual(this.fixture1.i18n['fr'].text) + + it 'i18n picks the correct fallback', -> + expect(util.i18n(this.fixture1, 'text', 'nl')).toEqual(this.fixture1.i18n['en'].text) + expect(util.i18n(this.fixture1, 'text', 'nl', 'de')).toEqual(this.fixture1.i18n['de'].text) + + it 'i18n falls back to the default text, even for other targets (like blurb)', -> + delete this.fixture1.i18n['en'] + expect(util.i18n(this.fixture1, 'text', 'en')).toEqual(this.fixture1.text) + expect(util.i18n(this.fixture1, 'blurb', 'en')).toEqual(this.fixture1.blurb) + delete this.fixture1.blurb + expect(util.i18n(this.fixture1, 'blurb', 'en')).toEqual(null) + + it 'i18n can fall forward if a general language is not found', -> + expect(util.i18n(this.fixture1, 'text', 'pt')).toEqual(this.fixture1.i18n['pt-BR'].text) diff --git a/vendor/scripts/idle.js b/vendor/scripts/idle.js new file mode 100644 index 000000000..702c8ecd2 --- /dev/null +++ b/vendor/scripts/idle.js @@ -0,0 +1,126 @@ +// https://github.com/shawnmclean/Idle.js +(function() { + "use strict"; + var Idle; + + Idle = {}; + + Idle = (function() { + Idle.isAway = false; + + Idle.awayTimeout = 3000; + + Idle.awayTimestamp = 0; + + Idle.awayTimer = null; + + Idle.onAway = null; + + Idle.onAwayBack = null; + + Idle.onVisible = null; + + Idle.onHidden = null; + + function Idle(options) { + var activeMethod, activity; + + if (options) { + this.awayTimeout = parseInt(options.awayTimeout, 10); + this.onAway = options.onAway; + this.onAwayBack = options.onAwayBack; + this.onVisible = options.onVisible; + this.onHidden = options.onHidden; + } + activity = this; + activeMethod = function() { + return activity.onActive(); + }; + window.onclick = activeMethod; + window.onmousemove = activeMethod; + window.onmouseenter = activeMethod; + window.onkeydown = activeMethod; + window.onscroll = activeMethod; + window.onmousewheel = activeMethod; + document.addEventListener("visibilitychange", (function() { + return activity.handleVisibilityChange(); + }), false); + document.addEventListener("webkitvisibilitychange", (function() { + return activity.handleVisibilityChange(); + }), false); + document.addEventListener("msvisibilitychange", (function() { + return activity.handleVisibilityChange(); + }), false); + } + + Idle.prototype.onActive = function() { + this.awayTimestamp = new Date().getTime() + this.awayTimeout; + if (this.isAway) { + if (this.onAwayBack) { + this.onAwayBack(); + } + this.start(); + } + this.isAway = false; + return true; + }; + + Idle.prototype.start = function() { + var activity; + + this.awayTimestamp = new Date().getTime() + this.awayTimeout; + if (this.awayTimer !== null) { + clearTimeout(this.awayTimer); + } + activity = this; + this.awayTimer = setTimeout((function() { + return activity.checkAway(); + }), this.awayTimeout + 100); + return this; + }; + + Idle.prototype.setAwayTimeout = function(ms) { + this.awayTimeout = parseInt(ms, 10); + return this; + }; + + Idle.prototype.checkAway = function() { + var activity, t; + + t = new Date().getTime(); + if (t < this.awayTimestamp) { + this.isAway = false; + activity = this; + this.awayTimer = setTimeout((function() { + return activity.checkAway(); + }), this.awayTimestamp - t + 100); + return; + } + if (this.awayTimer !== null) { + clearTimeout(this.awayTimer); + } + this.isAway = true; + if (this.onAway) { + return this.onAway(); + } + }; + + Idle.prototype.handleVisibilityChange = function() { + if (document.hidden || document.msHidden || document.webkitHidden) { + if (this.onHidden) { + return this.onHidden(); + } + } else { + if (this.onVisible) { + return this.onVisible(); + } + } + }; + + return Idle; + + })(); + + window.Idle = Idle; + +}).call(this);