mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 16:17:57 -05:00
Merge pull request #462 from codecombat/master
Merge master into production
This commit is contained in:
commit
b737b2d9e2
26 changed files with 501 additions and 379 deletions
|
@ -78,8 +78,9 @@ class AudioPlayer extends CocoClass
|
||||||
@preloadInterfaceSounds [name] unless filename of cache
|
@preloadInterfaceSounds [name] unless filename of cache
|
||||||
@soundsToPlayWhenLoaded[name] = volume
|
@soundsToPlayWhenLoaded[name] = volume
|
||||||
|
|
||||||
playSound: (name, volume=1) ->
|
playSound: (name, volume=1, delay=0) ->
|
||||||
createjs.Sound.play name, {volume: (me.get('volume') ? 1) * volume}
|
instance = createjs.Sound.play name, {volume: (me.get('volume') ? 1) * volume, delay: delay}
|
||||||
|
instance
|
||||||
|
|
||||||
# # TODO: load Interface sounds somehow, somewhere, somewhen
|
# # TODO: load Interface sounds somehow, somewhere, somewhen
|
||||||
|
|
||||||
|
|
|
@ -194,8 +194,8 @@ class Angel
|
||||||
@ids[@lastID]
|
@ids[@lastID]
|
||||||
|
|
||||||
# https://github.com/codecombat/codecombat/issues/81 -- TODO: we need to wait for worker initialization first
|
# https://github.com/codecombat/codecombat/issues/81 -- TODO: we need to wait for worker initialization first
|
||||||
infiniteLoopIntervalDuration: 5000 # check this often (must be more than the others added)
|
infiniteLoopIntervalDuration: 7500 # check this often (must be more than the others added)
|
||||||
infiniteLoopTimeoutDuration: 1500 # wait this long when we check
|
infiniteLoopTimeoutDuration: 2500 # wait this long when we check
|
||||||
abortTimeoutDuration: 500 # give in-process or dying workers this long to give up
|
abortTimeoutDuration: 500 # give in-process or dying workers this long to give up
|
||||||
constructor: (@god) ->
|
constructor: (@god) ->
|
||||||
@id = Angel.nextID()
|
@id = Angel.nextID()
|
||||||
|
@ -227,7 +227,7 @@ class Angel
|
||||||
_.delay ->
|
_.delay ->
|
||||||
worker.terminate()
|
worker.terminate()
|
||||||
worker.removeEventListener 'message', onWorkerMessage
|
worker.removeEventListener 'message', onWorkerMessage
|
||||||
, 1000
|
, 2000
|
||||||
@worker = null
|
@worker = null
|
||||||
@
|
@
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ module.exports = class Camera extends CocoClass
|
||||||
'level:restarted': 'onLevelRestarted'
|
'level:restarted': 'onLevelRestarted'
|
||||||
'sprite:mouse-down': 'onMouseDown'
|
'sprite:mouse-down': 'onMouseDown'
|
||||||
'sprite:dragged': 'onMouseDragged'
|
'sprite:dragged': 'onMouseDragged'
|
||||||
|
'camera-zoom-to': 'onZoomTo'
|
||||||
|
|
||||||
# TODO: Fix tests to not use mainLayer
|
# TODO: Fix tests to not use mainLayer
|
||||||
constructor: (@canvasWidth, @canvasHeight, angle=Math.asin(0.75), hFOV=d2r(30)) ->
|
constructor: (@canvasWidth, @canvasHeight, angle=Math.asin(0.75), hFOV=d2r(30)) ->
|
||||||
|
@ -169,7 +170,7 @@ module.exports = class Camera extends CocoClass
|
||||||
onMouseDown: (e) ->
|
onMouseDown: (e) ->
|
||||||
return if @dragDisabled
|
return if @dragDisabled
|
||||||
@lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY}
|
@lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY}
|
||||||
|
|
||||||
onMouseDragged: (e) ->
|
onMouseDragged: (e) ->
|
||||||
return if @dragDisabled
|
return if @dragDisabled
|
||||||
target = @boundTarget(@target, @zoom)
|
target = @boundTarget(@target, @zoom)
|
||||||
|
@ -180,7 +181,7 @@ module.exports = class Camera extends CocoClass
|
||||||
@zoomTo newPos, @zoom, 0
|
@zoomTo newPos, @zoom, 0
|
||||||
@lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY}
|
@lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY}
|
||||||
Backbone.Mediator.publish 'camera:dragged'
|
Backbone.Mediator.publish 'camera:dragged'
|
||||||
|
|
||||||
onLevelRestarted: ->
|
onLevelRestarted: ->
|
||||||
@setBounds(@firstBounds, false)
|
@setBounds(@firstBounds, false)
|
||||||
|
|
||||||
|
@ -220,7 +221,7 @@ module.exports = class Camera extends CocoClass
|
||||||
newTarget ?= {x:0, y:0}
|
newTarget ?= {x:0, y:0}
|
||||||
newTarget = (@newTarget or @target) if @locked
|
newTarget = (@newTarget or @target) if @locked
|
||||||
newZoom = Math.min((Math.max @minZoom, newZoom), MAX_ZOOM)
|
newZoom = Math.min((Math.max @minZoom, newZoom), MAX_ZOOM)
|
||||||
|
|
||||||
thangType = @target?.sprite?.thangType
|
thangType = @target?.sprite?.thangType
|
||||||
if thangType
|
if thangType
|
||||||
@offset = _.clone(thangType.get('positions')?.torso or {x: 0, y:0})
|
@offset = _.clone(thangType.get('positions')?.torso or {x: 0, y:0})
|
||||||
|
@ -229,7 +230,7 @@ module.exports = class Camera extends CocoClass
|
||||||
@offset.y *= scale
|
@offset.y *= scale
|
||||||
else
|
else
|
||||||
@offset = {x: 0, y:0}
|
@offset = {x: 0, y:0}
|
||||||
|
|
||||||
return if @zoom is newZoom and newTarget is newTarget.x and newTarget.y is newTarget.y
|
return if @zoom is newZoom and newTarget is newTarget.x and newTarget.y is newTarget.y
|
||||||
|
|
||||||
@finishTween(true)
|
@finishTween(true)
|
||||||
|
@ -247,7 +248,7 @@ module.exports = class Camera extends CocoClass
|
||||||
@target = newTarget
|
@target = newTarget
|
||||||
@zoom = newZoom
|
@zoom = newZoom
|
||||||
@updateZoom true
|
@updateZoom true
|
||||||
|
|
||||||
focusedOnSprite: ->
|
focusedOnSprite: ->
|
||||||
return @target?.name
|
return @target?.name
|
||||||
|
|
||||||
|
@ -308,3 +309,6 @@ module.exports = class Camera extends CocoClass
|
||||||
createjs.Tween.removeTweens @
|
createjs.Tween.removeTweens @
|
||||||
@finishTween = null
|
@finishTween = null
|
||||||
super()
|
super()
|
||||||
|
|
||||||
|
onZoomTo: (pos, time) ->
|
||||||
|
@zoomTo(@worldToSurface(pos), @zoom, time)
|
||||||
|
|
|
@ -475,6 +475,6 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
|
||||||
return null unless sound
|
return null unless sound
|
||||||
delay = if withDelay and sound.delay then 1000 * sound.delay / createjs.Ticker.getFPS() else 0
|
delay = if withDelay and sound.delay then 1000 * sound.delay / createjs.Ticker.getFPS() else 0
|
||||||
name = AudioPlayer.nameForSoundReference sound
|
name = AudioPlayer.nameForSoundReference sound
|
||||||
instance = createjs.Sound.play name, "none", delay, 0, 0, volume
|
instance = AudioPlayer.playSound name, volume, delay
|
||||||
# console.log @thang?.id, "played sound", name, "with delay", delay, "volume", volume, "and got sound instance", instance
|
# console.log @thang?.id, "played sound", name, "with delay", delay, "volume", volume, "and got sound instance", instance
|
||||||
instance
|
instance
|
||||||
|
|
|
@ -22,6 +22,12 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
'echo-self-wizard-sprite': 'onEchoSelfWizardSprite'
|
'echo-self-wizard-sprite': 'onEchoSelfWizardSprite'
|
||||||
'echo-all-wizard-sprites': 'onEchoAllWizardSprites'
|
'echo-all-wizard-sprites': 'onEchoAllWizardSprites'
|
||||||
|
|
||||||
|
shortcuts:
|
||||||
|
'up': 'onMoveKey'
|
||||||
|
'down': 'onMoveKey'
|
||||||
|
'left': 'onMoveKey'
|
||||||
|
'right': 'onMoveKey'
|
||||||
|
|
||||||
constructor: (thangType, options) ->
|
constructor: (thangType, options) ->
|
||||||
if options?.isSelf
|
if options?.isSelf
|
||||||
options.colorConfig = _.cloneDeep(me.get('wizard')?.colorConfig) or {}
|
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
|
defaultPos: -> x: 35, y: 24, z: @thang.depth / 2 + @thang.bobHeight
|
||||||
move: (pos, duration) -> @setTarget(pos, duration)
|
move: (pos, duration) -> @setTarget(pos, duration)
|
||||||
|
|
||||||
setTarget: (newTarget, duration) ->
|
setTarget: (newTarget, duration, isLinear=false) ->
|
||||||
# ignore targets you're already heading for
|
# ignore targets you're already heading for
|
||||||
targetPos = @getPosFromTarget(newTarget)
|
targetPos = @getPosFromTarget(newTarget)
|
||||||
return if @targetPos and @targetPos.x is targetPos.x and @targetPos.y is targetPos.y
|
return if @targetPos and @targetPos.x is targetPos.x and @targetPos.y is targetPos.y
|
||||||
|
@ -115,7 +121,7 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
@shoveOtherWizards(true) if @targetSprite
|
@shoveOtherWizards(true) if @targetSprite
|
||||||
@targetSprite = if isSprite then newTarget else null
|
@targetSprite = if isSprite then newTarget else null
|
||||||
@targetPos = targetPos
|
@targetPos = targetPos
|
||||||
@beginMoveTween(duration)
|
@beginMoveTween(duration, isLinear)
|
||||||
@shoveOtherWizards()
|
@shoveOtherWizards()
|
||||||
Backbone.Mediator.publish('self-wizard:target-changed', {sender:@}) if @isSelf
|
Backbone.Mediator.publish('self-wizard:target-changed', {sender:@}) if @isSelf
|
||||||
|
|
||||||
|
@ -127,7 +133,7 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
return target if target.x?
|
return target if target.x?
|
||||||
return target.thang.pos
|
return target.thang.pos
|
||||||
|
|
||||||
beginMoveTween: (duration=1000) ->
|
beginMoveTween: (duration=1000, isLinear=false) ->
|
||||||
# clear the old tween
|
# clear the old tween
|
||||||
createjs.Tween.removeTweens(@)
|
createjs.Tween.removeTweens(@)
|
||||||
|
|
||||||
|
@ -140,8 +146,11 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
@updatePosition()
|
@updatePosition()
|
||||||
@endMoveTween()
|
@endMoveTween()
|
||||||
return
|
return
|
||||||
|
if isLinear
|
||||||
|
ease = createjs.Ease.linear
|
||||||
|
else
|
||||||
|
ease = createjs.Ease.getPowInOut(3.0)
|
||||||
|
|
||||||
ease = createjs.Ease.getPowInOut(3.0)
|
|
||||||
createjs.Tween
|
createjs.Tween
|
||||||
.get(@)
|
.get(@)
|
||||||
.to({tweenPercentage:0.0}, duration, ease)
|
.to({tweenPercentage:0.0}, duration, ease)
|
||||||
|
@ -225,3 +234,22 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
|
|
||||||
updateMarks: ->
|
updateMarks: ->
|
||||||
super() if @displayObject.visible # not if we hid the wiz
|
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
|
||||||
|
|
|
@ -44,6 +44,7 @@ module.exports.thangNames = thangNames =
|
||||||
"Huburt"
|
"Huburt"
|
||||||
"Sterling"
|
"Sterling"
|
||||||
"Alistair"
|
"Alistair"
|
||||||
|
"Cid"
|
||||||
"Remy"
|
"Remy"
|
||||||
"Stormy"
|
"Stormy"
|
||||||
"Halle"
|
"Halle"
|
||||||
|
|
|
@ -130,6 +130,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
|
||||||
new_password_verify: "Verify"
|
new_password_verify: "Verify"
|
||||||
email_subscriptions: "Email Subscriptions"
|
email_subscriptions: "Email Subscriptions"
|
||||||
email_announcements: "Announcements"
|
email_announcements: "Announcements"
|
||||||
|
email_notifications: "Notifications"
|
||||||
email_notifications_description: "Get periodic notifications for your account."
|
email_notifications_description: "Get periodic notifications for your account."
|
||||||
email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
|
email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
|
||||||
contributor_emails: "Contributor Class Emails"
|
contributor_emails: "Contributor Class Emails"
|
||||||
|
@ -246,6 +247,12 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
|
||||||
create_system_title: "Create New System"
|
create_system_title: "Create New System"
|
||||||
new_component_title: "Create New Component"
|
new_component_title: "Create New Component"
|
||||||
new_component_field_system: "System"
|
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:
|
article:
|
||||||
edit_btn_preview: "Preview"
|
edit_btn_preview: "Preview"
|
||||||
|
|
|
@ -8,7 +8,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
delay_1_sec: "1 seconde"
|
delay_1_sec: "1 seconde"
|
||||||
delay_3_sec: "3 secondes"
|
delay_3_sec: "3 secondes"
|
||||||
delay_5_sec: "5 secondes"
|
delay_5_sec: "5 secondes"
|
||||||
manual: "Handboek"
|
manual: "Handmatig"
|
||||||
fork: "Fork"
|
fork: "Fork"
|
||||||
play: "Spelen"
|
play: "Spelen"
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
account_settings:
|
account_settings:
|
||||||
title: "Account Instellingen"
|
title: "Account Instellingen"
|
||||||
not_logged_in: "Log in of maak een account om je instellingen aan te passen."
|
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"
|
me_tab: "Ik"
|
||||||
picture_tab: "Afbeelding"
|
picture_tab: "Afbeelding"
|
||||||
wizard_tab: "Tovenaar"
|
wizard_tab: "Tovenaar"
|
||||||
|
@ -130,6 +130,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
new_password_verify: "Verifieer"
|
new_password_verify: "Verifieer"
|
||||||
email_subscriptions: "E-mail Abonnementen"
|
email_subscriptions: "E-mail Abonnementen"
|
||||||
email_announcements: "Aankondigingen"
|
email_announcements: "Aankondigingen"
|
||||||
|
email_notifications: "Notificaties"
|
||||||
email_notifications_description: "Krijg periodieke meldingen voor jouw account."
|
email_notifications_description: "Krijg periodieke meldingen voor jouw account."
|
||||||
email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat."
|
email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat."
|
||||||
contributor_emails: "Medewerker Klasse emails"
|
contributor_emails: "Medewerker Klasse emails"
|
||||||
|
@ -213,13 +214,13 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
|
|
||||||
editor:
|
editor:
|
||||||
main_title: "CodeCombat Editors"
|
main_title: "CodeCombat Editors"
|
||||||
main_description: "Maak je eigen levels, campagnes, eenheden en leermateriaal. Wij bieden alle programma's die u nodig heeft!"
|
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_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_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 ondersteunt."
|
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_title: "Level Editor"
|
||||||
level_description: "Bevat programmeurs om te programmeren, audio te uploaden, en om 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, "
|
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!"
|
contact_us: "contacteer ons!"
|
||||||
hipchat_prefix: "Je kan ons ook vinden in ons"
|
hipchat_prefix: "Je kan ons ook vinden in ons"
|
||||||
|
@ -246,6 +247,12 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
create_system_title: "Maak een nieuw Systeem aan"
|
create_system_title: "Maak een nieuw Systeem aan"
|
||||||
new_component_title: "Maak een nieuw Component aan"
|
new_component_title: "Maak een nieuw Component aan"
|
||||||
new_component_field_system: "Systeem"
|
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:
|
article:
|
||||||
edit_btn_preview: "Voorbeeld"
|
edit_btn_preview: "Voorbeeld"
|
||||||
|
@ -267,16 +274,16 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
about:
|
about:
|
||||||
who_is_codecombat: "Wie is CodeCombat?"
|
who_is_codecombat: "Wie is CodeCombat?"
|
||||||
why_codecombat: "Waarom CodeCombat?"
|
why_codecombat: "Waarom CodeCombat?"
|
||||||
who_description_prefix: "hebben samen CodeCombat opgericht in 2013. We creerden ook "
|
who_description_prefix: "hebben samen CodeCombat opgericht in 2013. We creëerden ook "
|
||||||
who_description_suffix: "en in 2008, groeide het uit tot de #1 web en iOS applicatie om Chinese en Japanse karakters te leren schrijven."
|
who_description_suffix: "en in 2008, groeide het uit tot de #1 web en iOS applicatie om Chinese en Japanse karakters te leren schrijven."
|
||||||
who_description_ending: "Nu is het tijd om mensen te leren programmeren."
|
who_description_ending: "Nu is het tijd om mensen te leren programmeren."
|
||||||
why_paragraph_1: "Tijdens het maken van Skritter wist George niet hoe hij moest programmeren. Hij constant gefrustreerd doordat hij zijn ideeën niet kon verwezelijken. Nadien probeerde hij te studeren, maar te lessen gingen te traag. Ook zijn huisgenoot wou opnieuw studeren en stopte met lesgeven. Hij probeerde Codecademy maar was al snel \"verveeld\". Iedere week starte een andere vriend met Codecademy, met telkens als resultaat dat hij/zij vrij snel met de lessen stopte. We realiseerde ons dat het hetzelfde probleem was zoals we al eerder hadden opgelost met Skritter: mensen leren iets via langzame en intensieve lessen, terwijl ze het eigenlijk zo snel mogelijk nodig hebben via uitgebreide oefeningen. Wij weten hoe dat op te lossen."
|
why_paragraph_1: "Tijdens het maken van Skritter wist George niet hoe hij moest programmeren en was hij constant gefrustreerd doordat hij zijn ideeën niet kon verwezelijken. Nadien probeerde hij te studeren maar de lessen gingen te traag. Ook zijn huisgenoot wou opnieuw studeren en stopte met lesgeven. Hij probeerde Codecademy maar was al snel \"verveeld\". Iedere week startte een andere vriend met Codecademy, met telkens als resultaat dat hij/zij vrij snel met de lessen stopte. We realiseerden ons dat het hetzelfde probleem was zoals we al eerder hadden opgelost met Skritter: mensen leren iets via langzame en intensieve lessen, terwijl ze het eigenlijk zo snel mogelijk nodig hebben via uitgebreide oefeningen. Wij weten hoe dat op te lossen."
|
||||||
why_paragraph_2: "Wil je leren programmeren? Je hebt geen lessen nodig. Je moet vooral veel code schrijven en je amuseren terwijl je dit doet."
|
why_paragraph_2: "Wil je leren programmeren? Je hebt geen lessen nodig. Je moet vooral veel code schrijven en je amuseren terwijl je dit doet."
|
||||||
why_paragraph_3_prefix: "Dat is waar programmeren om draait. Het moet tof zijn. Niet tof zoals"
|
why_paragraph_3_prefix: "Dat is waar programmeren om draait. Het moet tof zijn. Niet tof zoals"
|
||||||
why_paragraph_3_italic: "joepie een medaille"
|
why_paragraph_3_italic: "joepie een medaille"
|
||||||
why_paragraph_3_center: "maar tof zoals"
|
why_paragraph_3_center: "maar tof zoals"
|
||||||
why_paragraph_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AF MAKEN!"
|
why_paragraph_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AF MAKEN!"
|
||||||
why_paragraph_3_suffix: "Dat is waarom CodeCombat een multiplayergame is, en niet zomaar lessen gegoten in spelformaat. We zullen niet stoppen totdat jij niet meer kan stoppen--maar deze keer, is dat een goed."
|
why_paragraph_3_suffix: "Dat is waarom CodeCombat een multiplayergame is, en niet zomaar lessen gegoten in spelformaat. We zullen niet stoppen totdat jij niet meer kan stoppen--maar deze keer, is dat iets goeds."
|
||||||
why_paragraph_4: "Als je verslaafd gaat zijn aan een spel, dan is het beter om hieraan verslaafd te raken en een tovenaar van het technisch tijdperk te worden."
|
why_paragraph_4: "Als je verslaafd gaat zijn aan een spel, dan is het beter om hieraan verslaafd te raken en een tovenaar van het technisch tijdperk te worden."
|
||||||
why_ending: "En hallo, het is gratis."
|
why_ending: "En hallo, het is gratis."
|
||||||
why_ending_url: "Start nu met toveren!"
|
why_ending_url: "Start nu met toveren!"
|
||||||
|
@ -297,15 +304,15 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
practices_title: "Goede Respectvolle gewoonten"
|
practices_title: "Goede Respectvolle gewoonten"
|
||||||
practices_description: "Dit zijn onze beloften aan u, de speler, en iets minder juridische jargon."
|
practices_description: "Dit zijn onze beloften aan u, de speler, en iets minder juridische jargon."
|
||||||
privacy_title: "Privacy"
|
privacy_title: "Privacy"
|
||||||
privacy_description: "We zullen nooit jouw persoonlijke informatie verkopen. We willen geld verdienen dankzij aanwerving in verloop van tijd, maar je mag op je twee oren slapen dat wij nooit jouw persoonlijke informatie zullen verspreiden aan geïnteresseerde bedrijven zonder dat jij daar explicit met akkoord gaat."
|
privacy_description: "We zullen nooit jouw persoonlijke informatie verkopen. We willen geld verdienen dankzij aanwerving in verloop van tijd, maar je mag op je twee oren slapen dat wij nooit jouw persoonlijke informatie zullen verspreiden aan geïnteresseerde bedrijven zonder dat jij daar expliciet mee akkoord gaat."
|
||||||
security_title: "Beveiliging"
|
security_title: "Beveiliging"
|
||||||
security_description: "We streven ernaar om jouw persoonlijke informatie veilig te bewaren. Onze website is open en beschikbaar voor iedereen, opdat ons beveiliging systeem kan worden nagekeken en geoptimaliseerd door iedereen die dat wil. Dit alles is mogelijk doordat we volledig open source en transparant zijn."
|
security_description: "We streven ernaar om jouw persoonlijke informatie veilig te bewaren. Onze website is open en beschikbaar voor iedereen, opdat ons beveiliging systeem kan worden nagekeken en geoptimaliseerd door iedereen die dat wil. Dit alles is mogelijk doordat we volledig open source en transparant zijn."
|
||||||
email_title: "E-mail"
|
email_title: "E-mail"
|
||||||
email_description_prefix: "We zullen je niet overspoelen met spam. Door"
|
email_description_prefix: "We zullen je niet overspoelen met spam. Door"
|
||||||
email_settings_url: "jouw e-mail instellingen"
|
email_settings_url: "jouw e-mail instellingen"
|
||||||
email_description_suffix: "of via urls in de emails die wij verzanden, kan je jouw instellingen wijzigen en te alle tijden uitschrijven."
|
email_description_suffix: "of via urls in de emails die wij verzenden, kan je jouw instellingen wijzigen en ten allen tijden uitschrijven."
|
||||||
cost_title: "Kosten"
|
cost_title: "Kosten"
|
||||||
cost_description: "Momenteel, CodeCombat is 100% gratis! Één van onze doestellingen is om dit zo te houden, opdat zoveel mogelijk mensen kunnen spelen, onafhankelijk van waar je leeft of wie je bent. Als het financieel moeilijker wordt, kan het mogelijk zijn dat we gaan beginnen met abonnementen of een prijs zetten op bepaalde zaken, maar we streven ernaar om dit te verkomen. Met een beetje geluk zullen we dit voor altijd kunnen garanderen met:"
|
cost_description: "Momenteel is CodeCombat 100% gratis! Één van onze doestellingen is om dit zo te houden, opdat zoveel mogelijk mensen kunnen spelen, onafhankelijk van waar je leeft of wie je bent. Als het financieel moeilijker wordt, kan het mogelijk zijn dat we gaan beginnen met abonnementen of een prijs zetten op bepaalde zaken, maar we streven ernaar om dit te voorkomen. Met een beetje geluk zullen we dit voor altijd kunnen garanderen met:"
|
||||||
recruitment_title: "Aanwervingen"
|
recruitment_title: "Aanwervingen"
|
||||||
recruitment_description_prefix: "Hier bij CodeCombat, ga je ontplooien tot een krachtige tovenoor-niet enkel virtueel, maar ook in het echt."
|
recruitment_description_prefix: "Hier bij CodeCombat, ga je ontplooien tot een krachtige tovenoor-niet enkel virtueel, maar ook in het echt."
|
||||||
url_hire_programmers: "Niemand kan snel genoeg programmeurs aanwerven"
|
url_hire_programmers: "Niemand kan snel genoeg programmeurs aanwerven"
|
||||||
|
@ -320,21 +327,21 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
code_title: "Code - MIT"
|
code_title: "Code - MIT"
|
||||||
code_description_prefix: "Alle code in het bezit van CodeCombat of aanwezig op codecombat.com, zowel in de GitHub respository of in de codecombat.com database, is erkend onder de"
|
code_description_prefix: "Alle code in het bezit van CodeCombat of aanwezig op codecombat.com, zowel in de GitHub respository of in de codecombat.com database, is erkend onder de"
|
||||||
mit_license_url: "MIT licentie"
|
mit_license_url: "MIT licentie"
|
||||||
code_description_suffix: "Dit geld zowel voor code in Systemen en Componenten dat publiekelijk is gemaakt met als doelstellingen het maken van levels."
|
code_description_suffix: "Dit geldt ook voor code in Systemen en Componenten dat publiekelijk is gemaakt met als doelstellingen het maken van levels."
|
||||||
art_title: "Art/Music - Creative Commons "
|
art_title: "Art/Music - Creative Commons "
|
||||||
art_description_prefix: "Alle gemeenschappelijke inhoud valt onder de"
|
art_description_prefix: "Alle gemeenschappelijke inhoud valt onder de"
|
||||||
cc_license_url: "Creative Commons Attribution 4.0 Internationale Licentie"
|
cc_license_url: "Creative Commons Attribution 4.0 Internationale Licentie"
|
||||||
art_description_suffix: "Gemeenschappelijke inhoud is alles dat algemeen verkrijgen is bij CodeCombat voor het doel levels te maken. Dit omvat:"
|
art_description_suffix: "Gemeenschappelijke inhoud is alles dat algemeen verkrijgbaar is bij CodeCombat voor het doel levels te maken. Dit omvat:"
|
||||||
art_music: "Muziek"
|
art_music: "Muziek"
|
||||||
art_sound: "Geluid"
|
art_sound: "Geluid"
|
||||||
art_artwork: "Artwork"
|
art_artwork: "Artwork"
|
||||||
art_sprites: "Sprites"
|
art_sprites: "Sprites"
|
||||||
art_other: "Eender wat en al het creatief werk dat niet als code aanzien wordt en verkrijgbaar is bij het aanmaken van levels."
|
art_other: "Eender wat en al het creatief werk dat niet als code aanzien wordt en verkrijgbaar is bij het aanmaken van levels."
|
||||||
art_access: "Momenteel is er geen universeel en gebruiksvriendelijk voor het ophalen van deze assets. In het algemeen, worden deze opgehaald via de links zoals gebruikt door de website. Contacteer ons voor assitentie, of help ons met de website uit te breiden en de assets bereikbaarder maken."
|
art_access: "Momenteel is er geen universeel en gebruiksvriendelijk systeem voor het ophalen van deze assets. In het algemeen, worden deze opgehaald via de links zoals gebruikt door de website. Contacteer ons voor assitentie, of help ons met de website uit te breiden en de assets bereikbaarder te maken."
|
||||||
art_paragraph_1: "Voor toekenning, gelieve de naam en link naar codecombat.com te plaatsen waar dit passend is voor de vorm waarin het voorkomt. Bijvoorbeeld:"
|
art_paragraph_1: "Voor toekenning, gelieve de naam en link naar codecombat.com te plaatsen waar dit passend is voor de vorm waarin het voorkomt. Bijvoorbeeld:"
|
||||||
use_list_1: "Wanneer gebruikt in een film of een ander spel, voeg codecombat.com toe in de credits."
|
use_list_1: "Wanneer gebruikt in een film of een ander spel, voeg codecombat.com toe in de credits."
|
||||||
use_list_2: "Wanneer toegepast op een website, inclusief een link naar het gebruik, bijvorbeeld onderaan een afbeelding. Of in een algemene webpagina waar je eventueel ook andere Create Commons werken en open source software vernoemd die je gebruikt op de website. Iets dat alreeds duidelijk is gespecificeerd met CodeCombat, zoals een blog artikel, dat CodeCombat vernoemt, heeft geen aparte vermelding nodig."
|
use_list_2: "Wanneer toegepast op een website, inclusief een link naar het gebruik, bijvoorbeeld onderaan een afbeelding. Of in een algemene webpagina waar je eventueel ook andere Create Commons werken en open source software vernoemd die je gebruikt op de website. Iets dat alreeds duidelijk is gespecificeerd met CodeCombat, zoals een blog artikel, dat CodeCombat vernoemt, heeft geen aparte vermelding nodig."
|
||||||
art_paragraph_2: "Wanneer de gebruikte inhoud is gemaakt door een gebruiker van codecombat.com, vernoem hem/haar in plaats van ons. en volg verspreidingsaanwijzingen van die brons als die er zijn."
|
art_paragraph_2: "Wanneer de gebruikte inhoud is gemaakt door een gebruiker van codecombat.com, vernoem hem/haar in plaats van ons en volg verspreidingsaanwijzingen van die brons als die er zijn."
|
||||||
rights_title: "Rechten Voorbehouden"
|
rights_title: "Rechten Voorbehouden"
|
||||||
rights_desc: "Alle rechten zijn voorbehouden voor de Levels. Dit omvat:"
|
rights_desc: "Alle rechten zijn voorbehouden voor de Levels. Dit omvat:"
|
||||||
rights_scripts: "Scripts"
|
rights_scripts: "Scripts"
|
||||||
|
@ -342,15 +349,15 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
rights_description: "Beschrijvingen"
|
rights_description: "Beschrijvingen"
|
||||||
rights_writings: "Literaire werken"
|
rights_writings: "Literaire werken"
|
||||||
rights_media: "Media (geluid, muziek) en eender welke creatieve inhoud, specifiek gemaakt voor dat level en niet verkrijgbaar bij het maken van levels."
|
rights_media: "Media (geluid, muziek) en eender welke creatieve inhoud, specifiek gemaakt voor dat level en niet verkrijgbaar bij het maken van levels."
|
||||||
rights_clarification: "Om het duidelijk te maken, iets dat beschikbaar is in de Level editor voor het maken van level, valt onder de CC licentie. Terwijl de inhoud gemaakt met de Level Editor of geupload in de loop van de creatie van de levels, hier not onder vallen."
|
rights_clarification: "Om het duidelijk te maken, iets dat beschikbaar is in de Level editor voor het maken van levels, valt onder de CC licentie. Terwijl de inhoud gemaakt met de Level Editor of geüpload in de loop van de creatie van de levels, hier niet onder vallen."
|
||||||
nutshell_title: "In een notendop"
|
nutshell_title: "In een notendop"
|
||||||
nutshell_description: "Alle midellen die wij aanbieden in de Level Editor zijn gratis te gebruiken om levels aan te maken. Maar wij behouden ons het recht om levels die gemaakt zijn op codecombat.com te beperken, en hier in de toekomst geld voor te vragen, moest dat ooit gebeuren."
|
nutshell_description: "Alle middelen die wij aanbieden in de Level Editor zijn gratis te gebruiken om levels aan te maken. Wij behouden ons echter het recht voor om levels die gemaakt zijn op codecombat.com te beperken, en hier in de toekomst geld voor te vragen, moest dat ooit gebeuren."
|
||||||
canonical: "De Engelse versie van dit document is de definitieve en kanonieke versie. Bij verschillen tussen vertalingen heeft de Engelse versie voorrang."
|
canonical: "De Engelse versie van dit document is de definitieve en kanonieke versie. Bij verschillen tussen vertalingen heeft de Engelse versie voorrang."
|
||||||
|
|
||||||
contribute:
|
contribute:
|
||||||
page_title: "Bijdragen"
|
page_title: "Bijdragen"
|
||||||
character_classes_title: "Karakter Klassen"
|
character_classes_title: "Karakter Klassen"
|
||||||
introduction_desc_intro: "We hebben hoge verwachten over CodeCombat."
|
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_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"
|
introduction_desc_github_url: "CodeCombat is volledig open source"
|
||||||
introduction_desc_suf: ", en we mikken ernaar om zoveel mogelijk manieren mogelijk maken voor u om deel te nemen en dit project van zowel jou als ons te maken."
|
introduction_desc_suf: ", en we mikken ernaar om zoveel mogelijk manieren mogelijk maken voor u om deel te nemen en dit project van zowel jou als ons te maken."
|
||||||
|
@ -360,7 +367,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
alert_account_message_pref: "Om je te abonneren voor de klasse e-mails, moet je eerst "
|
alert_account_message_pref: "Om je te abonneren voor de klasse e-mails, moet je eerst "
|
||||||
alert_account_message_suf: "."
|
alert_account_message_suf: "."
|
||||||
alert_account_message_create_url: "een account aanmaken"
|
alert_account_message_create_url: "een account aanmaken"
|
||||||
archmage_summary: "Geïnteresserd in werken aan game graphics, user interface design, database- en serverorganisatie, multiplayer networking, physics, geluid of game engine prestaties? Wil jij helpen een game te bouwen wat anderen leert waar jij goed in bent? We moeten nog veel doen en als jij een ervaren programmeur bent en wil ontwikkelen voor CodeCombat, dan is dit de klasse voor jou. We zouden graag je hulp hebben bij het maken van de beste programmeergame ooit."
|
archmage_summary: "Geïnteresserd in werken aan game graphics, user interface design, database- en serverorganisatie, multiplayer networking, physics, geluid of game engine prestaties? Wil jij helpen een game te bouwen wat anderen leert waar jij goed in bent? We moeten nog veel doen en als jij een ervaren programmeur bent en wil ontwikkelen voor CodeCombat, dan is dit de klasse voor jou. We zouden graag je hulp hebben bij het maken van de beste programmeergame ooit."
|
||||||
archmage_introduction: "Een van de beste aspecten aan het maken van spelletjes is dat zij zoveel verschillende zaken omvatten. Visualisaties, geluid, real-time netwerken, sociale netwerken, en natuurlijk veel van de voorkomende aspecten van programmeren, van low-level database beheer en server administratie tot gebruiksvriendelijke interfaces maken. Er is veel te doen, en als jij een ervaren programmeur bent met de motivatie om je handen veel te maken met CodeCombat, dan ben je de tovenaar die wij zoeken! We zouden graag jouw help hebben met het bouwen aan het allerbeste programmeerspel ooit."
|
archmage_introduction: "Een van de beste aspecten aan het maken van spelletjes is dat zij zoveel verschillende zaken omvatten. Visualisaties, geluid, real-time netwerken, sociale netwerken, en natuurlijk veel van de voorkomende aspecten van programmeren, van low-level database beheer en server administratie tot gebruiksvriendelijke interfaces maken. Er is veel te doen, en als jij een ervaren programmeur bent met de motivatie om je handen veel te maken met CodeCombat, dan ben je de tovenaar die wij zoeken! We zouden graag jouw help hebben met het bouwen aan het allerbeste programmeerspel ooit."
|
||||||
class_attributes: "Klasse kenmerken"
|
class_attributes: "Klasse kenmerken"
|
||||||
archmage_attribute_1_pref: "Ervaring met "
|
archmage_attribute_1_pref: "Ervaring met "
|
||||||
|
@ -386,7 +393,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
artisan_join_step1: "Lees de documentatie."
|
artisan_join_step1: "Lees de documentatie."
|
||||||
artisan_join_step2: "Maak een nieuw level en bestudeer reeds bestaande levels."
|
artisan_join_step2: "Maak een nieuw level en bestudeer reeds bestaande levels."
|
||||||
artisan_join_step3: "Praat met ons in ons publieke (Engelstalige) HipChat kanaal voor hulp. (optioneel)"
|
artisan_join_step3: "Praat met ons in ons publieke (Engelstalige) HipChat kanaal voor hulp. (optioneel)"
|
||||||
artisan_join_step4: "Maak een bericht over jou level op ons forum voor feedback."
|
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."
|
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."
|
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_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."
|
||||||
|
@ -403,7 +410,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
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_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_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_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 ideas overbrengen aan anderen."
|
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"
|
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!"
|
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."
|
more_about_scribe: "Leer meer over het worden van een ijverige Klerk."
|
||||||
|
@ -412,22 +419,22 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
|
||||||
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_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_launch_url: "release in oktober"
|
||||||
diplomat_introduction_suf: "dan is het wel dat er een significante interesse is in CodeCombat in andere landen, vooral Brazilïe! 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 hel 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_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 ideas wilt overbrengen, is het belangrijk beide goed te kunnen!"
|
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 jouw taal haar locale bestand "
|
||||||
diplomat_github_url: "op GitHub"
|
diplomat_github_url: "op GitHub"
|
||||||
diplomat_join_suf_github: ", edit het online, en submit een pull request. Daarnaast kun je hieronder aanvinken alsj e up-to-date wilt worden gehouden met nieuwe internationalisatie-ontwikkelingen."
|
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"
|
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."
|
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 met een hoop mensen om mee te praten en wie je kunt helpen bekend te worden met het spel en er van te leren. Als jij mensen wilt helpen betrokken te raken en plezier te hebben, én een goed gevoel van de levenslijn van CodeCombat te krijgen en waar we naar toe gaan, dan is dit wellicht de klasse voor jou."
|
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_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_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_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"
|
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 denk dat het relevant voor ons is, dan is dit de klasse voor jou."
|
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 individiueel 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_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_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_attribute_2: "Een beetje vrije tijd!"
|
||||||
|
|
|
@ -201,15 +201,15 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
hud_continue: "Продолжить (нажмите Shift+Пробел)"
|
hud_continue: "Продолжить (нажмите Shift+Пробел)"
|
||||||
spell_saved: "Заклинание сохранено"
|
spell_saved: "Заклинание сохранено"
|
||||||
|
|
||||||
# admin:
|
admin:
|
||||||
# av_title: "Admin Views"
|
av_title: "Админ панель"
|
||||||
# av_entities_sub_title: "Entities"
|
av_entities_sub_title: "Сущности"
|
||||||
# av_entities_users_url: "Users"
|
av_entities_users_url: "Пользователи"
|
||||||
# av_entities_active_instances_url: "Active Instances"
|
av_entities_active_instances_url: "Активные экземпляры"
|
||||||
# av_other_sub_title: "Other"
|
av_other_sub_title: "Другое"
|
||||||
# av_other_debug_base_url: "Base (for debugging base.jade)"
|
av_other_debug_base_url: "База (для отладки base.jade)"
|
||||||
# u_title: "User List"
|
u_title: "Список пользователей"
|
||||||
# lg_title: "Latest Games"
|
lg_title: "Последние игры"
|
||||||
|
|
||||||
editor:
|
editor:
|
||||||
main_title: "Редакторы CodeCombat"
|
main_title: "Редакторы CodeCombat"
|
||||||
|
@ -224,7 +224,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
contact_us: "свяжитесь с нами!"
|
contact_us: "свяжитесь с нами!"
|
||||||
hipchat_prefix: "Также вы можете найти нас в нашей"
|
hipchat_prefix: "Также вы можете найти нас в нашей"
|
||||||
hipchat_url: "комнате HipChat."
|
hipchat_url: "комнате HipChat."
|
||||||
# level_some_options: "Some Options?"
|
level_some_options: "Ещё опции"
|
||||||
level_tab_thangs: "Объекты"
|
level_tab_thangs: "Объекты"
|
||||||
level_tab_scripts: "Скрипты"
|
level_tab_scripts: "Скрипты"
|
||||||
level_tab_settings: "Настройки"
|
level_tab_settings: "Настройки"
|
||||||
|
@ -254,7 +254,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
general:
|
general:
|
||||||
and: "и"
|
and: "и"
|
||||||
name: "Имя"
|
name: "Имя"
|
||||||
# body: "Body"
|
body: "Содержание"
|
||||||
version: "Версия"
|
version: "Версия"
|
||||||
commit_msg: "Сопроводительное сообщение"
|
commit_msg: "Сопроводительное сообщение"
|
||||||
version_history_for: "История версий для: "
|
version_history_for: "История версий для: "
|
||||||
|
@ -418,22 +418,22 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
diplomat_join_suf_github: ", отредактируйте его онлайн и отправьте запрос на включение изменений. Кроме того, установите флажок ниже, чтобы быть в курсе новых разработок интернационализации!"
|
diplomat_join_suf_github: ", отредактируйте его онлайн и отправьте запрос на включение изменений. Кроме того, установите флажок ниже, чтобы быть в курсе новых разработок интернационализации!"
|
||||||
more_about_diplomat: "Узнать больше о том, как стать Дипломатом"
|
more_about_diplomat: "Узнать больше о том, как стать Дипломатом"
|
||||||
diplomat_subscribe_desc: "Получать email-ы о i18n разработках и уровнях для перевода."
|
diplomat_subscribe_desc: "Получать email-ы о i18n разработках и уровнях для перевода."
|
||||||
# ambassador_summary: "Мы пытаемся создать сообщество, и каждое сообщество нуждается в службе поддержки, когда есть проблемы. У нас есть чаты, электронная почта и социальные сети, чтобы наши пользователи могли познакомиться с игрой. Если вы хотите помочь людям втянуться, получать удовольствие и учиться программированию, этот класс для вас." # Not done yet
|
ambassador_summary: "Мы пытаемся создать сообщество, и каждое сообщество нуждается в службе поддержки, когда есть проблемы. У нас есть чаты, электронная почта и социальные сети, чтобы наши пользователи могли познакомиться с игрой. Если вы хотите помочь людям втянуться, получать удовольствие и учиться программированию, этот класс для вас."
|
||||||
# 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_introduction: "Это сообщество, которое мы создаём, и вы соединяете. У нас есть Olark чаты, электронная почта и социальные сети с уймой людей, с которыми нужно поговорить, помочь в ознакомлении с игрой и обучении из неё. Если вы хотите помочь людям втянуться, получать удовольствие, наслаждаться и и куда мы идём, этот класс для вас."
|
||||||
# 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_attribute_1: "Навыки общения. Уметь определять проблемы игроков и помогать решить их. Кроме того, держите всех нас в курсе о том, что игроки говорят, что им нравится, не нравится и чего хотят больше!"
|
||||||
# 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_desc: "расскажите нам немного о себе, чем вы занимались и чем хотели бы заниматься. Отсюда и начнём!"
|
||||||
# ambassador_join_note_strong: "Note"
|
ambassador_join_note_strong: "Примечание"
|
||||||
# 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!"
|
ambassador_join_note_desc: "Одним из наших главных приоритетов является создание мультиплеера, где игроки столкнутся с труднорешаемыми уровнями и могут призвать более высокоуровневых волшебников для помощи. Это будет отличным способом для послов делать свое дело. Мы будем держать вас в курсе!"
|
||||||
# more_about_ambassador: "Узнать больше о том, как стать Ambassador" # Not done yet
|
more_about_ambassador: "Узнать больше о том, как стать Послом"
|
||||||
# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments."
|
ambassador_subscribe_desc: "Получать email-ы о разработке мультиплеера и обновлениях в системе поддержки."
|
||||||
# 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_summary: "Ни одна из вышеупомянутых ролей не соответствует тому, в чём вы заинтересованы? Не волнуйтесь, мы в поисках тех, кто хочет приложить руку к разработке CodeCombat! Если вы заинтересованы в обучении, разработке игр, управлением проектами с открытым исходным кодом, или в чём-нибудь ещё, что, как вы думаете, будет актуально для нас, то этот класс для вас."
|
||||||
# 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_1: "У вас есть жизненный опыт? Другая точка зрения на вещи, которые могут помочь нам решить, как формировать CodeCombat? Из всех этих ролей, эта, возможно, займёт меньше всего времени, но по отдельности, вы можете сделать наибольшие изменения. Мы в поисках морщинистых мудрецов, особенно в таких областях, как: обучение, разработка игр, управление проектами с открытым исходным кодом, технической рекрутинг, предпринимательство или дизайн."
|
||||||
# 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_introduction_2: "Или действительно всё, что имеет отношение к развитию CodeCombat. Если у вас есть знания и вы хотите поделиться ими, чтобы помочь вырастить этот проект, то этот класс для вас."
|
||||||
# counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful."
|
counselor_attribute_1: "Опыт, в любой из областей выше, или в том, что, как вы думаете, может быть полезным."
|
||||||
# counselor_attribute_2: "A little bit of free time!"
|
counselor_attribute_2: "Немного свободного времени!"
|
||||||
# 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)."
|
counselor_join_desc: "расскажите нам немного о себе, чем вы занимались и чем хотели бы заниматься. Мы поместим вас в наш список контактов и выйдем на связь, когда нам понадобится совет(не слишком часто)."
|
||||||
# more_about_counselor: "Узнать больше о том, как стать Counselor" # Not done yet
|
more_about_counselor: "Узнать больше о том, как стать Советником"
|
||||||
# changes_auto_save: "Changes are saved automatically when you toggle checkboxes."
|
changes_auto_save: "Изменения сохраняются автоматически при переключении флажков."
|
||||||
diligent_scribes: "Наши старательные Писари:"
|
diligent_scribes: "Наши старательные Писари:"
|
||||||
powerful_archmages: "Наши могущественные Архимаги:"
|
powerful_archmages: "Наши могущественные Архимаги:"
|
||||||
creative_artisans: "Наши творческие Ремесленники:"
|
creative_artisans: "Наши творческие Ремесленники:"
|
||||||
|
|
|
@ -3,7 +3,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
loading: "读取中……"
|
loading: "读取中……"
|
||||||
saving: "保存中……"
|
saving: "保存中……"
|
||||||
sending: "发送中……"
|
sending: "发送中……"
|
||||||
cancel: "退出"
|
cancel: "取消"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
delay_1_sec: "1 秒"
|
delay_1_sec: "1 秒"
|
||||||
delay_3_sec: "3 秒"
|
delay_3_sec: "3 秒"
|
||||||
|
@ -14,31 +14,31 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
|
|
||||||
modal:
|
modal:
|
||||||
close: "关闭"
|
close: "关闭"
|
||||||
okay: "好"
|
okay: "好的"
|
||||||
|
|
||||||
not_found:
|
not_found:
|
||||||
page_not_found: "找不到网页"
|
page_not_found: "找不到网页"
|
||||||
|
|
||||||
nav:
|
nav:
|
||||||
play: "玩"
|
play: "玩"
|
||||||
editor: "编辑"
|
editor: "编辑器"
|
||||||
blog: "博客"
|
blog: "博客"
|
||||||
forum: "论坛"
|
forum: "论坛"
|
||||||
admin: "超级管理员"
|
admin: "管理"
|
||||||
home: "首页"
|
home: "首页"
|
||||||
contribute: "贡献"
|
contribute: "贡献"
|
||||||
legal: "法律"
|
legal: "法律"
|
||||||
about: "关于"
|
about: "关于"
|
||||||
contact: "联系我们"
|
contact: "联系"
|
||||||
twitter_follow: "关注"
|
twitter_follow: "关注"
|
||||||
employers: "雇佣我们"
|
employers: "雇佣我们"
|
||||||
|
|
||||||
versions:
|
versions:
|
||||||
save_version_title: "保存新版本"
|
save_version_title: "保存新版本"
|
||||||
# new_major_version: "New Major Version"
|
new_major_version: "新的重要版本"
|
||||||
# cla_prefix: "To save changes, first you must agree to our"
|
cla_prefix: "要想保存更改,您必须先同意我们的"
|
||||||
# cla_url: "CLA"
|
cla_url: "贡献者许可协议"
|
||||||
# cla_suffix: "."
|
cla_suffix: "。"
|
||||||
cla_agree: "我同意"
|
cla_agree: "我同意"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
|
@ -63,40 +63,40 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
|
|
||||||
home:
|
home:
|
||||||
slogan: "通过游戏学习 Javascript"
|
slogan: "通过游戏学习 Javascript"
|
||||||
no_ie: "抱歉!Internet Explorer 9等更旧的预览器打不开此网站。"
|
no_ie: "抱歉!Internet Explorer 9 等旧式预览器无法使用本网站。"
|
||||||
no_mobile: "CodeCombat 不是针对手机设备设计的,所以可能无法达到做好的体验!"
|
no_mobile: "CodeCombat 不是针对手机设备设计的,所以可能无法达到最好的体验!"
|
||||||
play: "开始游戏"
|
play: "开始游戏"
|
||||||
|
|
||||||
play:
|
play:
|
||||||
choose_your_level: "选取难度"
|
choose_your_level: "选取难度"
|
||||||
adventurer_prefix: "你可以选择以下任意关卡,或者讨论以上的关卡。"
|
adventurer_prefix: "你可以选择以下任意关卡,或者讨论以上的关卡。到"
|
||||||
adventurer_forum: "冒险者论坛"
|
adventurer_forum: "冒险者论坛"
|
||||||
adventurer_suffix: "."
|
adventurer_suffix: "。"
|
||||||
campaign_beginner: "新手作战"
|
campaign_beginner: "新手作战"
|
||||||
campaign_beginner_description: "……在这里可以学到编程技巧。"
|
campaign_beginner_description: "……在这里你可以学习到编程技巧。"
|
||||||
campaign_dev: "随机困难关卡"
|
campaign_dev: "随机困难关卡"
|
||||||
campaign_dev_description: "……在这里你可以学到做一些复杂功能的接口。"
|
campaign_dev_description: "……在这里你可以学到做一些复杂功能的接口。"
|
||||||
campaign_multiplayer: "多人竞技场"
|
campaign_multiplayer: "多人竞技场"
|
||||||
campaign_multiplayer_description: "……在这里你可以和其他玩家们进行代码肉搏战。"
|
campaign_multiplayer_description: "……在这里你可以与其他玩家进行代码肉搏战。"
|
||||||
campaign_player_created: "已创建的玩家"
|
campaign_player_created: "创建玩家"
|
||||||
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>."
|
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>."
|
||||||
level_difficulty: "难度"
|
level_difficulty: "难度:"
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "联系我们"
|
contact_us: "联系我们"
|
||||||
welcome: "很高兴收到你的信!用这个表格给我们发邮件。 "
|
welcome: "我们很乐意收到你的信!用这个表单给我们发邮件。 "
|
||||||
contribute_prefix: "如果你想贡献代码,请看我们的 "
|
contribute_prefix: "如果你想贡献什么,请看我们的 "
|
||||||
contribute_page: "贡献代码页面"
|
contribute_page: "贡献页面"
|
||||||
contribute_suffix: "!"
|
contribute_suffix: "!"
|
||||||
forum_prefix: "对任何公共部分,放手去干吧 "
|
forum_prefix: "对于任何公开部分,请尝试用"
|
||||||
forum_page: "我们的论坛"
|
forum_page: "我们的论坛"
|
||||||
forum_suffix: "代替 "
|
forum_suffix: "代替"
|
||||||
send: "意见反馈"
|
send: "意见反馈"
|
||||||
|
|
||||||
diplomat_suggestion:
|
diplomat_suggestion:
|
||||||
title: "帮我们翻译 CodeCombat"
|
title: "帮我们翻译 CodeCombat"
|
||||||
sub_heading: "我们需要您的语言技能"
|
sub_heading: "我们需要您的语言技能"
|
||||||
pitch_body: "我们开发了 CodeCombat 的英文版,但是现在我们的玩家遍布全球。很多人想玩中文(简体)版的,却不会说英语,所以如果你中英文都会,请考虑一下参加我们的翻译工作,帮忙把 CodeCombat 网站还有所有的关卡翻译成中文(简体)。"
|
pitch_body: "我们开发了 CodeCombat 的英文版,但是现在我们的玩家遍布全球。很多人英语不熟练,但很想玩简体中文版的游戏,所以如果你中英文都很熟练,请考虑参加我们的翻译工作,帮忙把 CodeCombat 网站还有所有的关卡翻译成简体中文。"
|
||||||
missing_translations: "未翻译的文本将显示为英文。"
|
missing_translations: "未翻译的文本将显示为英文。"
|
||||||
learn_more: "了解更多有关成为翻译人员的说明"
|
learn_more: "了解更多有关成为翻译人员的说明"
|
||||||
subscribe_as_diplomat: "提交翻译人员申请"
|
subscribe_as_diplomat: "提交翻译人员申请"
|
||||||
|
@ -130,28 +130,28 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
new_password_verify: "核实"
|
new_password_verify: "核实"
|
||||||
email_subscriptions: "邮箱验证"
|
email_subscriptions: "邮箱验证"
|
||||||
email_announcements: "通知"
|
email_announcements: "通知"
|
||||||
email_notifications_description: "定期接受来自你的账户的通知。"
|
email_notifications_description: "接收来自你的账户的定期通知。"
|
||||||
email_announcements_description: "接收关于 CodeCombat 最近的新闻和发展的邮件。"
|
email_announcements_description: "接收关于 CodeCombat 最近的新闻和发展的邮件。"
|
||||||
contributor_emails: "贡献者通知"
|
contributor_emails: "贡献者通知"
|
||||||
contribute_prefix: "我们在寻找志同道合的人!请到 "
|
contribute_prefix: "我们在寻找志同道合的人!请到"
|
||||||
contribute_page: "贡献页面"
|
contribute_page: "贡献页面"
|
||||||
contribute_suffix: " 查看更多信息。"
|
contribute_suffix: "查看更多信息。"
|
||||||
email_toggle: "切换所有"
|
email_toggle: "切换所有"
|
||||||
error_saving: "保存时出错"
|
error_saving: "保存时出错"
|
||||||
saved: "保存修改"
|
saved: "更改已保存"
|
||||||
password_mismatch: "密码不匹配。"
|
password_mismatch: "密码不匹配。"
|
||||||
|
|
||||||
account_profile:
|
account_profile:
|
||||||
edit_settings: "编辑设置"
|
edit_settings: "编辑设置"
|
||||||
profile_for_prefix: "关于TA的基本资料:"
|
profile_for_prefix: "关于他的基本资料:"
|
||||||
profile_for_suffix: ""
|
profile_for_suffix: ""
|
||||||
profile: "基本资料"
|
profile: "基本资料"
|
||||||
user_not_found: "没有找到用户。检查URL?"
|
user_not_found: "没有找到用户。网址有错?"
|
||||||
gravatar_not_found_mine: "我们找不到TA的基本资料:"
|
gravatar_not_found_mine: "我们找不到他的基本资料:"
|
||||||
gravatar_not_found_email_suffix: "."
|
gravatar_not_found_email_suffix: "。"
|
||||||
gravatar_signup_prefix: "去注册 "
|
gravatar_signup_prefix: "去注册 "
|
||||||
gravatar_signup_suffix: " 去设置!"
|
gravatar_signup_suffix: " 来设置!"
|
||||||
gravatar_not_found_other: "哎呀,没有与这个人的邮箱相关的资料。"
|
gravatar_not_found_other: "哎呀,没有与这个邮箱相关的资料。"
|
||||||
gravatar_contact: "联系"
|
gravatar_contact: "联系"
|
||||||
gravatar_websites: "网站"
|
gravatar_websites: "网站"
|
||||||
gravatar_accounts: "显示为"
|
gravatar_accounts: "显示为"
|
||||||
|
@ -198,33 +198,33 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
tome_select_spell: "选择一个法术"
|
tome_select_spell: "选择一个法术"
|
||||||
tome_select_a_thang: "选择人物来 "
|
tome_select_a_thang: "选择人物来 "
|
||||||
tome_available_spells: "可用的法术"
|
tome_available_spells: "可用的法术"
|
||||||
hud_continue: "继续(按 shift-空格)"
|
hud_continue: "继续(按 Shift-空格)"
|
||||||
spell_saved: "输入已保存"
|
spell_saved: "咒语已保存"
|
||||||
|
|
||||||
# admin:
|
admin:
|
||||||
# av_title: "Admin Views"
|
av_title: "管理员视图"
|
||||||
# av_entities_sub_title: "Entities"
|
av_entities_sub_title: "实体"
|
||||||
# av_entities_users_url: "Users"
|
av_entities_users_url: "用户"
|
||||||
# av_entities_active_instances_url: "Active Instances"
|
av_entities_active_instances_url: "活动实例"
|
||||||
# av_other_sub_title: "Other"
|
av_other_sub_title: "其他"
|
||||||
# av_other_debug_base_url: "Base (for debugging base.jade)"
|
av_other_debug_base_url: "Base(用于调试 base.jade)"
|
||||||
# u_title: "User List"
|
u_title: "用户列表"
|
||||||
# lg_title: "Latest Games"
|
lg_title: "最新的游戏"
|
||||||
|
|
||||||
editor:
|
editor:
|
||||||
main_title: "CodeCombat 编辑器"
|
main_title: "CodeCombat 编辑器"
|
||||||
main_description: "建立自己的关卡, 战役, 单位 和教育内容。我们提供所有你需要的工具!"
|
main_description: "建立你自己的关卡、 战役、单元和教育内容。我们会提供所有你需要的工具!"
|
||||||
article_title: "提示编辑器"
|
article_title: "提示编辑器"
|
||||||
article_description: "编写提示,让玩家可以使用编程概念,来通过各种的关卡和战役。"
|
article_description: "编写提示,让玩家可以使用编程概念来通过各种关卡和战役。"
|
||||||
thang_title: "物体编辑器"
|
thang_title: "物体编辑器"
|
||||||
thang_description: "创建单位,并定义单位的逻辑、图形和音频。目前只支持导入Flash导出的矢量图形。"
|
thang_description: "创建单元,并定义单元的逻辑、图形和音频。目前只支持导入 Flash 导出的矢量图形。"
|
||||||
level_title: "关卡编辑器"
|
level_title: "关卡编辑器"
|
||||||
level_description: "所有用来创造所有难度的关卡的工具,包括脚本、上传音频和构建自定义逻辑。"
|
level_description: "所有用来创造所有难度的关卡的工具,包括脚本、上传音频和构建自定义逻辑。"
|
||||||
security_notice: "编辑器的许多主要功能并不是目前默认启动的。当我们改善完这些系统的安全性的时候,他们将会变成常用的。如果你想要马上使用这些功能,"
|
security_notice: "编辑器的许多主要功能并不是目前默认启动的。当我们改善完这些系统的安全性的时候,它们就会成为通常可用的。如果你想要马上使用这些功能,"
|
||||||
contact_us: "联系我们!"
|
contact_us: "联系我们!"
|
||||||
hipchat_prefix: "你也可以在这里找到我们"
|
hipchat_prefix: "你也可以在这里找到我们"
|
||||||
hipchat_url: "HipChat room."
|
hipchat_url: "HipChat 房间。"
|
||||||
# level_some_options: "Some Options?"
|
level_some_options: "有些选项?"
|
||||||
level_tab_thangs: "物体"
|
level_tab_thangs: "物体"
|
||||||
level_tab_scripts: "脚本"
|
level_tab_scripts: "脚本"
|
||||||
level_tab_settings: "设定"
|
level_tab_settings: "设定"
|
||||||
|
@ -239,7 +239,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
level_systems_tab_title: "目前所有系统"
|
level_systems_tab_title: "目前所有系统"
|
||||||
level_systems_btn_new: "创建新的系统"
|
level_systems_btn_new: "创建新的系统"
|
||||||
level_systems_btn_add: "增加系统"
|
level_systems_btn_add: "增加系统"
|
||||||
level_components_title: "返回到所以物体主页"
|
level_components_title: "返回到所有物体主页"
|
||||||
level_components_type: "类型"
|
level_components_type: "类型"
|
||||||
level_component_edit_title: "编辑组件"
|
level_component_edit_title: "编辑组件"
|
||||||
level_system_edit_title: "编辑系统"
|
level_system_edit_title: "编辑系统"
|
||||||
|
@ -249,12 +249,12 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
|
|
||||||
article:
|
article:
|
||||||
edit_btn_preview: "预览"
|
edit_btn_preview: "预览"
|
||||||
edit_article_title: "编辑文章"
|
edit_article_title: "编辑提示"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "和"
|
and: "和"
|
||||||
name: "姓名"
|
name: "姓名"
|
||||||
# body: "Body"
|
body: "正文"
|
||||||
version: "版本"
|
version: "版本"
|
||||||
commit_msg: "提交信息"
|
commit_msg: "提交信息"
|
||||||
version_history_for: "版本历史: "
|
version_history_for: "版本历史: "
|
||||||
|
@ -265,11 +265,11 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
message: "消息"
|
message: "消息"
|
||||||
|
|
||||||
about:
|
about:
|
||||||
who_is_codecombat: "什么是CodeCombat?"
|
who_is_codecombat: "什么是 CodeCombat?"
|
||||||
why_codecombat: "为什么选择CodeCombat?"
|
why_codecombat: "为什么选择 CodeCombat?"
|
||||||
who_description_prefix: "一起在2013开始编写CodeCombat。在2008年时,我们也创造了"
|
who_description_prefix: "在2013年开始一起编写 CodeCombat。在2008年时,我们还创造"
|
||||||
who_description_suffix: "并且发展它成为第一的学习如何写中文字和日文字的Web和IOS应用"
|
who_description_suffix: "并且发展出了首选的学习如何写中文和日文的Web和IOS应用"
|
||||||
who_description_ending: "现在是时候教人们如何写代码。"
|
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_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_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_prefix: "That's what programming is about. It's gotta be fun. Not fun like"
|
||||||
|
@ -286,61 +286,61 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy."
|
# 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."
|
# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online."
|
||||||
|
|
||||||
# legal:
|
legal:
|
||||||
# page_title: "Legal"
|
page_title: "法律"
|
||||||
# opensource_intro: "CodeCombat is free to play and completely open source."
|
opensource_intro: "CodeCombat 是一个自由发挥,完全开源的项目。"
|
||||||
# opensource_description_prefix: "Check out "
|
opensource_description_prefix: "查看"
|
||||||
# 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 "
|
opensource_description_center: "并做你想做的修改吧!CodeCombat 是构筑在几十个开源项目的基础之上,我们爱它们。见"
|
||||||
# archmage_wiki_url: "our Archmage wiki"
|
archmage_wiki_url: "我们的 Archmage wiki"
|
||||||
# opensource_description_suffix: "for a list of the software that makes this game possible."
|
opensource_description_suffix: "了解让这个游戏成为可能的名单。"
|
||||||
# practices_title: "Respectful Best Practices"
|
practices_title: "尊重最佳实践"
|
||||||
# practices_description: "These are our promises to you, the player, in slightly less legalese."
|
practices_description: "这是我们对您的承诺,即玩家,尽管这在法律用语中略显不足。"
|
||||||
# privacy_title: "Privacy"
|
privacy_title: "隐私"
|
||||||
# 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."
|
privacy_description: "我们不会出售您的任何个人信息。我们计划最终通过招聘来盈利,但请您放心,未经您的明确同意,我们不会将您的个人信息出售有兴趣的公司。"
|
||||||
# security_title: "Security"
|
security_title: "安全"
|
||||||
# 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."
|
security_description: "我们竭力保证您的个人信息安全性。作为一个开源项目,任何人都可以检讨并改善我们自由开放的网站的安全性。"
|
||||||
# email_title: "Email"
|
email_title: "电子邮件"
|
||||||
# email_description_prefix: "We will not inundate you with spam. Through"
|
email_description_prefix: "我们不会发给您垃圾邮件。通过"
|
||||||
# email_settings_url: "your email settings"
|
email_settings_url: "您的电子邮件设置"
|
||||||
# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time."
|
email_description_suffix: "或者我们发送的邮件中的链接,您可以随时更改您的偏好设置或者随时取消订阅。"
|
||||||
# cost_title: "Cost"
|
cost_title: "花费"
|
||||||
# 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:"
|
cost_description: "目前来说,CodeCombat 是完全免费的!我们的主要目标之一也是保持目前这种方式,让尽可能多的人玩得更好,不论是否是生活中。如果天空变暗,我们可能会对某些内容采取订阅收费,但我们宁愿不那么做。运气好的话,我们可以维持公司,通过:"
|
||||||
# recruitment_title: "Recruitment"
|
recruitment_title: "招募"
|
||||||
# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizard–not just in the game, but also in real life."
|
recruitment_description_prefix: "在 CodeCombat 这里,你将得以成为一名法力强大的“巫师”,不只是在游戏中,更在生活中。"
|
||||||
# url_hire_programmers: "No one can hire programmers fast enough"
|
url_hire_programmers: "没有人能以足够快速度招聘程序员,"
|
||||||
# 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_suffix: "所以一旦你的技能成熟并且得到你的同意,我们将战士你的最佳编码成就给上万名雇主,希望他们垂涎欲滴。而他们支付给我们一点点报酬,并且付给你工资,"
|
||||||
# recruitment_description_italic: "a lot"
|
recruitment_description_italic: "“一大笔”"
|
||||||
# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan."
|
recruitment_description_ending: "。而这网站也就能保持免费,皆大欢喜。计划就是这样。"
|
||||||
# copyrights_title: "Copyrights and Licenses"
|
copyrights_title: "版权与许可"
|
||||||
# contributor_title: "Contributor License Agreement"
|
contributor_title: "贡献者许可协议"
|
||||||
# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our"
|
contributor_description_prefix: "在本网站或者我们的 GitHub 版本库的所有贡献都依照我们的"
|
||||||
# cla_url: "CLA"
|
cla_url: "贡献者许可协议(CLA)"
|
||||||
# contributor_description_suffix: "to which you should agree before contributing."
|
contributor_description_suffix: ",而这在您贡献之前就应该已经同意。"
|
||||||
# code_title: "Code - MIT"
|
code_title: "代码 - 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"
|
code_description_prefix: "所有由 CodeCombat 拥有或者托管在 codecombat.com 的代码,在 GitHub 版本库或者 codecombat.com 数据库,以上许可协议都依照"
|
||||||
# mit_license_url: "MIT license"
|
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."
|
# 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_title: "Art/Music - Creative Commons "
|
||||||
# art_description_prefix: "All common content is available under the"
|
# art_description_prefix: "All common content is available under the"
|
||||||
# cc_license_url: "Creative Commons Attribution 4.0 International License"
|
# 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: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:"
|
||||||
# art_music: "Music"
|
art_music: "音乐"
|
||||||
# art_sound: "Sound"
|
art_sound: "声效"
|
||||||
# art_artwork: "Artwork"
|
art_artwork: "艺术品"
|
||||||
# art_sprites: "Sprites"
|
art_sprites: "小妖精"
|
||||||
# art_other: "Any and all other non-code creative works that are made available when creating Levels."
|
# 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_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:"
|
# 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_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."
|
# 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_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_title: "版权所有"
|
||||||
# rights_desc: "All rights are reserved for Levels themselves. This includes"
|
rights_desc: "所有关卡由他们自己版权所有。这包括"
|
||||||
# rights_scripts: "Scripts"
|
rights_scripts: "脚本"
|
||||||
# rights_unit: "Unit configuration"
|
rights_unit: "单元配置"
|
||||||
# rights_description: "Description"
|
rights_description: "描述"
|
||||||
# rights_writings: "Writings"
|
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_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."
|
# 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_title: "In a Nutshell"
|
||||||
|
@ -408,16 +408,16 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
# 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!"
|
# 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"
|
# more_about_scribe: "Learn More About Becoming a Scribe"
|
||||||
# scribe_subscribe_desc: "Get emails about article writing announcements."
|
# scribe_subscribe_desc: "Get emails about article writing announcements."
|
||||||
diplomat_summary: "在其他国家不讲英语,很多人对于CodeCombat有很大的兴趣。我们正在寻找译者,愿意花时间翻译网站的语料库的词语,这样CodeCombat就能尽快访问到世界各地。如果你想帮助CodeCombat国际化,那么这个类就是给你的。"
|
diplomat_summary: "在其他国家不讲英语,很多人对于CodeCombat有很大的兴趣。我们正在寻找愿意花时间翻译网站语料库的词语的译者,这样 CodeCombat 就能尽快地遍及世界各地。如果你想帮助 CodeCombat 的国际化,那么这个类就是给你的。"
|
||||||
diplomat_introduction_pref: "如果有一件事情是从 "
|
diplomat_introduction_pref: "如果有一件事情是从 "
|
||||||
diplomat_launch_url: "launch in October"
|
diplomat_launch_url: "launch in October"
|
||||||
diplomat_introduction_suf: "学来的,Combat有相当大的兴趣在其他国家发展。我们正在构建一个译者兵团把单词一个一个的翻译,让CodeCombat尽可能地访问到世界各地。如果你喜欢偷偷地瞄一眼即将到来的内容,并让你的国民尽快学习到CodeCombat,那么这个类可能适合你。"
|
diplomat_introduction_suf: "学来的,Combat有相当大的兴趣在其他国家发展。我们正在构建一个译者兵团把单词一个一个的翻译,让CodeCombat尽可能地访问到世界各地。如果你喜欢偷偷地瞄一眼即将到来的内容,并让你的国民尽快学习到CodeCombat,那么这个类可能适合你。"
|
||||||
diplomat_attribute_1: "会流利的英语和能翻译的语言。当传递复杂思想,难得的是能很好的同时掌握这两个。"
|
diplomat_attribute_1: "会流利的英语和能翻译的语言。当传递复杂思想,难得的是能很好的同时掌握这两个。"
|
||||||
diplomat_join_pref_github: "找到你自己的语言文件 "
|
diplomat_join_pref_github: "找到你自己的语言文件 "
|
||||||
diplomat_github_url: "在GitHub网站"
|
diplomat_github_url: "在GitHub网站"
|
||||||
diplomat_join_suf_github: "在线编辑它,然后提交一个合并请求。同时,检查下面这个盒子来关注最新的国际化开发!"
|
diplomat_join_suf_github: "在线编辑它,然后提交一个合并请求。同时,选中下面这个复选框来关注最新的国际化开发!"
|
||||||
more_about_diplomat: "学习更多关于“成为一名外交官(翻译者)”"
|
more_about_diplomat: "了解更多“如何成为一名外交官(翻译者)”"
|
||||||
diplomat_subscribe_desc: "接受邮件,关于国际化开发和翻译情况"
|
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: "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_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_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!"
|
||||||
|
@ -433,26 +433,26 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
# counselor_attribute_2: "A little bit of free time!"
|
# 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)."
|
# 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_counselor: "Learn More About Becoming a Counselor"
|
||||||
# changes_auto_save: "Changes are saved automatically when you toggle checkboxes."
|
changes_auto_save: "在您切换复选框时,更改将自动保存。"
|
||||||
# diligent_scribes: "Our Diligent Scribes:"
|
diligent_scribes: "我们勤奋的文书:"
|
||||||
# powerful_archmages: "Our Powerful Archmages:"
|
powerful_archmages: "我们强力的大法师:"
|
||||||
# creative_artisans: "Our Creative Artisans:"
|
creative_artisans: "我们极具创意的工匠:"
|
||||||
# brave_adventurers: "Our Brave Adventurers:"
|
brave_adventurers: "我们勇敢的冒险家:"
|
||||||
# translating_diplomats: "Our Translating Diplomats:"
|
translating_diplomats: "我们遍及世界的外交官:"
|
||||||
# helpful_ambassadors: "Our Helpful Ambassadors:"
|
helpful_ambassadors: "我们亲切的使节:"
|
||||||
|
|
||||||
# classes:
|
classes:
|
||||||
# archmage_title: "Archmage"
|
archmage_title: "大法师"
|
||||||
# archmage_title_description: "(Coder)"
|
archmage_title_description: "(代码编写人员)"
|
||||||
# artisan_title: "Artisan"
|
artisan_title: "工匠"
|
||||||
# artisan_title_description: "(Level Builder)"
|
artisan_title_description: "(关卡建立人员)"
|
||||||
# adventurer_title: "Adventurer"
|
adventurer_title: "冒险家"
|
||||||
# adventurer_title_description: "(Level Playtester)"
|
adventurer_title_description: "(关卡测试人员)"
|
||||||
# scribe_title: "Scribe"
|
scribe_title: "文书"
|
||||||
# scribe_title_description: "(Article Editor)"
|
scribe_title_description: "(提示编辑人员)"
|
||||||
# diplomat_title: "Diplomat"
|
diplomat_title: "外交官"
|
||||||
# diplomat_title_description: "(Translator)"
|
diplomat_title_description: "(翻译人员)"
|
||||||
# ambassador_title: "Ambassador"
|
ambassador_title: "使节"
|
||||||
# ambassador_title_description: "(Support)"
|
ambassador_title_description: "(用户支持人员)"
|
||||||
# counselor_title: "Counselor"
|
counselor_title: "顾问"
|
||||||
# counselor_title_description: "(Expert/Teacher)"
|
counselor_title_description: "(专家/导师)"
|
||||||
|
|
9
app/styles/not_found.sass
Normal file
9
app/styles/not_found.sass
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
@import "bootstrap/mixins"
|
||||||
|
@import "bootstrap/variables"
|
||||||
|
|
||||||
|
#not-found-view
|
||||||
|
|
||||||
|
.not-found-image
|
||||||
|
display: block
|
||||||
|
margin-left: auto
|
||||||
|
margin-right: auto
|
|
@ -2,12 +2,18 @@
|
||||||
p.sign-up-poke
|
p.sign-up-poke
|
||||||
text-align: left
|
text-align: left
|
||||||
margin-bottom: 10px
|
margin-bottom: 10px
|
||||||
|
|
||||||
.sign-up-button
|
.sign-up-button
|
||||||
|
margin-left: 20px
|
||||||
|
|
||||||
|
.next-level-button
|
||||||
|
margin-bottom: 10px
|
||||||
|
margin-right: 30px
|
||||||
float: right
|
float: right
|
||||||
margin-left: 10px
|
|
||||||
|
|
||||||
.rating
|
.rating
|
||||||
float: left
|
float: center
|
||||||
|
margin-right: 22%
|
||||||
span
|
span
|
||||||
margin-right: 5px
|
margin-right: 5px
|
||||||
i
|
i
|
||||||
|
@ -30,7 +36,18 @@
|
||||||
clear: both
|
clear: both
|
||||||
|
|
||||||
.modal-header
|
.modal-header
|
||||||
text-align: center
|
text-align: left
|
||||||
|
|
||||||
.victory-banner
|
.victory-banner
|
||||||
width: 200px
|
width: 450px
|
||||||
|
position: absolute
|
||||||
|
left: -150px
|
||||||
|
|
||||||
|
.modal-dialog
|
||||||
|
margin-left: 30%
|
||||||
|
padding-left: 300px
|
||||||
|
width: 700px
|
||||||
|
|
||||||
|
.modal-footer
|
||||||
|
margin: 0px
|
||||||
|
padding: 0px
|
||||||
|
|
|
@ -8,7 +8,7 @@ block content
|
||||||
p(data-i18n="account_settings.not_logged_in") Log in or create an account to change your settings.
|
p(data-i18n="account_settings.not_logged_in") Log in or create an account to change your settings.
|
||||||
|
|
||||||
else
|
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
|
ul.nav.nav-pills#settings-tabs
|
||||||
li
|
li
|
||||||
|
|
|
@ -86,7 +86,7 @@ block content
|
||||||
li Slovak - Anon
|
li Slovak - Anon
|
||||||
li Persian - Reza Habibi (Rehb)
|
li Persian - Reza Habibi (Rehb)
|
||||||
li Czech - vanous
|
li Czech - vanous
|
||||||
li Russian - fess89, ser-storchak
|
li Russian - fess89, ser-storchak, Mr A
|
||||||
li Ukrainian - fess89
|
li Ukrainian - fess89
|
||||||
li Italian - flauta
|
li Italian - flauta
|
||||||
li Norwegian - bardeh
|
li Norwegian - bardeh
|
||||||
|
|
|
@ -10,8 +10,9 @@ block content
|
||||||
if me.get('anonymous')
|
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}
|
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
|
else
|
||||||
a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal") Create a New #{modelLabel}
|
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(placeholder="Search #{modelLabel}s Here")
|
|
||||||
|
input#search(data-i18n="[placeholder]#{currentSearch}")
|
||||||
hr
|
hr
|
||||||
div.results
|
div.results
|
||||||
table
|
table
|
||||||
|
|
|
@ -17,12 +17,14 @@ block modal-body-wait-content
|
||||||
h3(data-i18n="common.saving") Saving...
|
h3(data-i18n="common.saving") Saving...
|
||||||
|
|
||||||
block modal-footer-content
|
block modal-footer-content
|
||||||
#accept-cla-wrapper.alert.alert-info
|
if !noSaveButton
|
||||||
span(data-i18n="versions.cla_prefix") To save changes, first you must agree to our
|
#accept-cla-wrapper.alert.alert-info
|
||||||
|
|
span(data-i18n="versions.cla_prefix") To save changes, first you must agree to our
|
||||||
strong#cla-link(data-i18n="versions.cla_url") CLA
|
|
|
||||||
span(data-i18n="versions.cla_suffix") .
|
strong#cla-link(data-i18n="versions.cla_url") CLA
|
||||||
button.btn#agreement-button(data-i18n="versions.cla_agree") I AGREE
|
span(data-i18n="versions.cla_suffix") .
|
||||||
|
button.btn#agreement-button(data-i18n="versions.cla_agree") I AGREE
|
||||||
|
|
||||||
button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel
|
button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel
|
||||||
button.btn.btn-primary#save-version-button(data-i18n="common.save") Save
|
if !noSaveButton
|
||||||
|
button.btn.btn-primary#save-version-button(data-i18n="common.save") Save
|
||||||
|
|
|
@ -3,3 +3,8 @@ extends /templates/base
|
||||||
block content
|
block content
|
||||||
|
|
||||||
h1.text-center(data-i18n="not_found.page_not_found") Page Not Found
|
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")
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
// TODO: refactor to be like other modals
|
// TODO: refactor to be like other modals
|
||||||
|
|
||||||
.modal-dialog
|
.modal-dialog
|
||||||
|
|
||||||
|
img.victory-banner(src="/images/level/victory.png", alt="")
|
||||||
|
|
||||||
.modal-header
|
.modal-header
|
||||||
button(type='button', data-dismiss="modal", aria-hidden="true").close ×
|
button(type='button', data-dismiss="modal", aria-hidden="true").close ×
|
||||||
h3
|
h3
|
||||||
|
@ -7,15 +11,17 @@
|
||||||
span= levelName
|
span= levelName
|
||||||
span(data-i18n="play_level.victory_title_suffix") Complete
|
span(data-i18n="play_level.victory_title_suffix") Complete
|
||||||
|
|
||||||
img.victory-banner(src="/images/level/victory.png", alt="")
|
|
||||||
|
|
||||||
.modal-body!= body
|
.modal-body!= body
|
||||||
|
|
||||||
.modal-footer
|
.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')
|
if me.get('anonymous')
|
||||||
p.sign-up-poke
|
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
|
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!
|
span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account!
|
||||||
p.clearfix
|
p.clearfix
|
||||||
else
|
else
|
||||||
div.rating.secret
|
div.rating.secret
|
||||||
|
@ -25,10 +31,6 @@
|
||||||
i.icon-star-empty
|
i.icon-star-empty
|
||||||
i.icon-star-empty
|
i.icon-star-empty
|
||||||
i.icon-star-empty
|
i.icon-star-empty
|
||||||
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')
|
if !me.get('anonymous')
|
||||||
div.review.secret
|
div.review.secret
|
||||||
span(data-i18n="play_level.victory_review") Tell us more!
|
span(data-i18n="play_level.victory_review") Tell us more!
|
||||||
|
|
|
@ -59,7 +59,7 @@ module.exports = class ArticleEditView extends View
|
||||||
context
|
context
|
||||||
|
|
||||||
openPreview: =>
|
openPreview: =>
|
||||||
@preview = window.open('http://localhost:3000/editor/article/x/preview', 'preview', 'height=800,width=600')
|
@preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600')
|
||||||
@preview.focus() if window.focus
|
@preview.focus() if window.focus
|
||||||
@preview.onload = => @pushChangesToPreview()
|
@preview.onload = => @pushChangesToPreview()
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -23,6 +23,7 @@ module.exports = class LevelSaveView extends SaveVersionModal
|
||||||
context.levelNeedsSave = @level.hasLocalChanges()
|
context.levelNeedsSave = @level.hasLocalChanges()
|
||||||
context.modifiedComponents = _.filter @supermodel.getModels(LevelComponent), @shouldSaveEntity
|
context.modifiedComponents = _.filter @supermodel.getModels(LevelComponent), @shouldSaveEntity
|
||||||
context.modifiedSystems = _.filter @supermodel.getModels(LevelSystem), @shouldSaveEntity
|
context.modifiedSystems = _.filter @supermodel.getModels(LevelSystem), @shouldSaveEntity
|
||||||
|
context.noSaveButton = not (context.levelNeedsSave or context.modifiedComponents.length or context.modifiedSystems.length)
|
||||||
context
|
context
|
||||||
|
|
||||||
shouldSaveEntity: (m) ->
|
shouldSaveEntity: (m) ->
|
||||||
|
|
|
@ -28,14 +28,20 @@ module.exports = class ThangTypeHomeView extends View
|
||||||
|
|
||||||
getRenderData: ->
|
getRenderData: ->
|
||||||
context = super()
|
context = super()
|
||||||
context.modelLabel = @modelLabel
|
|
||||||
switch @modelLabel
|
switch @modelLabel
|
||||||
when 'Level'
|
when 'Level'
|
||||||
context.currentEditor = 'editor.level_title'
|
context.currentEditor = 'editor.level_title'
|
||||||
|
context.currentNew = 'editor.new_level_title'
|
||||||
|
context.currentSearch = 'editor.level_search_title'
|
||||||
when 'Thang Type'
|
when 'Thang Type'
|
||||||
context.currentEditor = 'editor.thang_title'
|
context.currentEditor = 'editor.thang_title'
|
||||||
|
context.currentNew = 'editor.new_thang_title'
|
||||||
|
context.currentSearch = 'editor.thang_search_title'
|
||||||
when 'Article'
|
when 'Article'
|
||||||
context.currentEditor = 'editor.article_title'
|
context.currentEditor = 'editor.article_title'
|
||||||
|
context.currentNew = 'editor.new_article_title'
|
||||||
|
context.currentSearch = 'editor.article_search_title'
|
||||||
|
@$el.i18n()
|
||||||
context
|
context
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
|
@ -77,6 +83,7 @@ module.exports = class ThangTypeHomeView extends View
|
||||||
documents = @collection.models
|
documents = @collection.models
|
||||||
table = $(@tableTemplate(documents:documents))
|
table = $(@tableTemplate(documents:documents))
|
||||||
@$el.find('table').replaceWith(table)
|
@$el.find('table').replaceWith(table)
|
||||||
|
@$el.find('table').i18n()
|
||||||
|
|
||||||
removeOldSearch: ->
|
removeOldSearch: ->
|
||||||
return unless @collection?
|
return unless @collection?
|
||||||
|
|
|
@ -128,7 +128,8 @@ module.exports = class TomeView extends View
|
||||||
spellKey = pathComponents.join '/'
|
spellKey = pathComponents.join '/'
|
||||||
@thangSpells[thang.id].push spellKey
|
@thangSpells[thang.id].push spellKey
|
||||||
unless method.cloneOf
|
unless method.cloneOf
|
||||||
skipProtectAPI = true #@getQueryVariable("skip_protect_api") is "true"
|
skipProtectAPI = @getQueryVariable("skip_protect_api") is "true" or @options.levelID isnt 'brawlwood'
|
||||||
|
skipProtectAPI = true # gah, it's so slow :( and somehow still affects simulation
|
||||||
skipFlow = @getQueryVariable("skip_flow") is "true" or @options.levelID is 'brawlwood'
|
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
|
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
|
for thangID, spellKeys of @thangSpells
|
||||||
|
|
|
@ -23,13 +23,13 @@ connectToScoringQueue = ->
|
||||||
if error? then throw new Error "There was an error registering the scoring queue: #{error}"
|
if error? then throw new Error "There was an error registering the scoring queue: #{error}"
|
||||||
scoringTaskQueue = data
|
scoringTaskQueue = data
|
||||||
log.info "Connected to scoring task queue!"
|
log.info "Connected to scoring task queue!"
|
||||||
|
|
||||||
module.exports.addPairwiseTaskToQueueFromRequest = (req, res) ->
|
module.exports.addPairwiseTaskToQueueFromRequest = (req, res) ->
|
||||||
taskPair = req.body.sessions
|
taskPair = req.body.sessions
|
||||||
addPairwiseTaskToQueue req.body.sessions (err, success) ->
|
addPairwiseTaskToQueue req.body.sessions (err, success) ->
|
||||||
if err? then return errors.serverError res, "There was an error adding pairwise tasks: #{err}"
|
if err? then return errors.serverError res, "There was an error adding pairwise tasks: #{err}"
|
||||||
sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"}
|
sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"}
|
||||||
|
|
||||||
|
|
||||||
addPairwiseTaskToQueue = (taskPair, cb) ->
|
addPairwiseTaskToQueue = (taskPair, cb) ->
|
||||||
LevelSession.findOne(_id:taskPair[0]).lean().exec (err, firstSession) =>
|
LevelSession.findOne(_id:taskPair[0]).lean().exec (err, firstSession) =>
|
||||||
|
@ -42,9 +42,9 @@ addPairwiseTaskToQueue = (taskPair, cb) ->
|
||||||
if e then return cb e, false
|
if e then return cb e, false
|
||||||
|
|
||||||
sendEachTaskPairToTheQueue taskPairs, (taskPairError) ->
|
sendEachTaskPairToTheQueue taskPairs, (taskPairError) ->
|
||||||
if taskPairError? then return cb taskPairError,false
|
if taskPairError? then return cb taskPairError,false
|
||||||
cb null, true
|
cb null, true
|
||||||
|
|
||||||
|
|
||||||
module.exports.createNewTask = (req, res) ->
|
module.exports.createNewTask = (req, res) ->
|
||||||
requestSessionID = req.body.session
|
requestSessionID = req.body.session
|
||||||
|
@ -84,7 +84,7 @@ module.exports.dispatchTaskToConsumer = (req, res) ->
|
||||||
message.changeMessageVisibilityTimeout scoringTaskTimeoutInSeconds, (err) ->
|
message.changeMessageVisibilityTimeout scoringTaskTimeoutInSeconds, (err) ->
|
||||||
if err? then return errors.serverError res, "There was an error changing the message visibility timeout."
|
if err? then return errors.serverError res, "There was an error changing the message visibility timeout."
|
||||||
console.log "Changed visibility timeout"
|
console.log "Changed visibility timeout"
|
||||||
constructTaskLogObject getUserIDFromRequest(req),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."
|
if taskLogError? then return errors.serverError res, "There was an error creating the task log object."
|
||||||
|
|
||||||
taskObject.taskID = taskLogObject._id
|
taskObject.taskID = taskLogObject._id
|
||||||
|
@ -105,55 +105,64 @@ module.exports.processTaskResult = (req, res) ->
|
||||||
return handleTimedOutTask req, res, clientResponseObject if hasTaskTimedOut taskLogJSON.sentDate
|
return handleTimedOutTask req, res, clientResponseObject if hasTaskTimedOut taskLogJSON.sentDate
|
||||||
|
|
||||||
scoringTaskQueue.deleteMessage clientResponseObject.receiptHandle, (err) ->
|
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."
|
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}"
|
||||||
|
|
||||||
|
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) ->
|
||||||
|
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!"}
|
||||||
|
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!"}
|
||||||
|
|
||||||
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 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!"}
|
|
||||||
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!"}
|
|
||||||
|
|
||||||
|
|
||||||
determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) ->
|
determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) ->
|
||||||
queryParameters =
|
queryParameters =
|
||||||
_id: sessionID
|
_id: sessionID
|
||||||
|
|
||||||
updateParameters =
|
updateParameters =
|
||||||
"$inc": {}
|
"$inc": {}
|
||||||
|
|
||||||
if sessionRank is 0
|
if sessionRank is 0
|
||||||
updateParameters["$inc"] = {numberOfWinsAndTies: 1}
|
updateParameters["$inc"] = {numberOfWinsAndTies: 1}
|
||||||
else
|
else
|
||||||
updateParameters["$inc"] = {numberOfLosses: 1}
|
updateParameters["$inc"] = {numberOfLosses: 1}
|
||||||
|
|
||||||
LevelSession.findOneAndUpdate queryParameters, updateParameters,{select: 'numberOfWinsAndTies numberOfLosses'}, (err, updatedSession) ->
|
LevelSession.findOneAndUpdate queryParameters, updateParameters,{select: 'numberOfWinsAndTies numberOfLosses'}, (err, updatedSession) ->
|
||||||
if err? then return cb err, updatedSession
|
if err? then return cb err, updatedSession
|
||||||
updatedSession = updatedSession.toObject()
|
updatedSession = updatedSession.toObject()
|
||||||
|
@ -162,58 +171,69 @@ determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) ->
|
||||||
if totalNumberOfGamesPlayed < 5
|
if totalNumberOfGamesPlayed < 5
|
||||||
console.log "Number of games played is less than 5, continuing..."
|
console.log "Number of games played is less than 5, continuing..."
|
||||||
cb null, true
|
cb null, true
|
||||||
else if totalNumberOfGamesPlayed > 15
|
|
||||||
console.log "Too many games played, ending..."
|
|
||||||
cb null, false
|
|
||||||
else
|
else
|
||||||
ratio = (updatedSession.numberOfLosses - 5) / (totalNumberOfGamesPlayed)
|
ratio = (updatedSession.numberOfLosses) / (totalNumberOfGamesPlayed)
|
||||||
if ratio > 0.66
|
if ratio > 0.66
|
||||||
cb null, false
|
cb null, false
|
||||||
console.log "Ratio(#{ratio}) is bad, ending simulation"
|
console.log "Ratio(#{ratio}) is bad, ending simulation"
|
||||||
else
|
else
|
||||||
console.log "Ratio(#{ratio}) is good, so continuing simulations"
|
console.log "Ratio(#{ratio}) is good, so continuing simulations"
|
||||||
cb null, true
|
cb null, true
|
||||||
|
|
||||||
|
|
||||||
findNearestBetterSessionID = (sessionTotalScore, opponentSessionTotalScore, opponentSessionID, opposingTeam, cb) ->
|
|
||||||
queryParameters =
|
|
||||||
totalScore:
|
|
||||||
$gt:opponentSessionTotalScore + 0.5
|
|
||||||
_id:
|
|
||||||
$ne: opponentSessionID
|
|
||||||
"level.original": "52d97ecd32362bc86e004e87"
|
|
||||||
"level.majorVersion": 0
|
|
||||||
submitted: true
|
|
||||||
submittedCode:
|
|
||||||
$exists: true
|
|
||||||
team: opposingTeam
|
|
||||||
|
|
||||||
limitNumber = 1
|
|
||||||
|
|
||||||
sortParameters =
|
|
||||||
totalScore: 1
|
findNearestBetterSessionID = (sessionID, sessionTotalScore, opponentSessionTotalScore, opponentSessionID, opposingTeam, cb) ->
|
||||||
|
retrieveAllOpponentSessionIDs sessionID, (err, opponentSessionIDs) ->
|
||||||
selectString = '_id totalScore'
|
if err? then return cb err, null
|
||||||
|
|
||||||
query = LevelSession.findOne(queryParameters)
|
queryParameters =
|
||||||
.sort(sortParameters)
|
totalScore:
|
||||||
.limit(limitNumber)
|
$gt:opponentSessionTotalScore
|
||||||
.select(selectString)
|
_id:
|
||||||
|
$nin: opponentSessionIDs
|
||||||
|
"level.original": "52d97ecd32362bc86e004e87"
|
||||||
|
"level.majorVersion": 0
|
||||||
|
submitted: true
|
||||||
|
submittedCode:
|
||||||
|
$exists: true
|
||||||
|
team: opposingTeam
|
||||||
|
|
||||||
|
limitNumber = 1
|
||||||
|
|
||||||
|
sortParameters =
|
||||||
|
totalScore: 1
|
||||||
|
|
||||||
|
selectString = '_id totalScore'
|
||||||
|
|
||||||
|
query = LevelSession.findOne(queryParameters)
|
||||||
|
.sort(sortParameters)
|
||||||
|
.limit(limitNumber)
|
||||||
|
.select(selectString)
|
||||||
|
.lean()
|
||||||
|
|
||||||
|
console.log "Finding session with score near #{opponentSessionTotalScore}"
|
||||||
|
query.exec (err, session) ->
|
||||||
|
if err? then return cb err, session
|
||||||
|
unless session then return cb err, null
|
||||||
|
console.log "Found session with score #{session.totalScore}"
|
||||||
|
cb err, session._id
|
||||||
|
|
||||||
|
|
||||||
|
retrieveAllOpponentSessionIDs = (sessionID, cb) ->
|
||||||
|
query = LevelSession.findOne({"_id":sessionID})
|
||||||
|
.select('matches.opponents.sessionID')
|
||||||
.lean()
|
.lean()
|
||||||
|
|
||||||
console.log "Finding session with score near #{opponentSessionTotalScore}"
|
|
||||||
query.exec (err, session) ->
|
query.exec (err, session) ->
|
||||||
if err? then return cb err, session
|
if err? then return cb err, null
|
||||||
unless session then return cb err, null
|
opponentSessionIDs = (match.opponents[0].sessionID for match in session.matches)
|
||||||
console.log "Found session with score #{session.totalScore}"
|
cb err, opponentSessionIDs
|
||||||
cb err, session._id
|
|
||||||
|
|
||||||
calculateOpposingTeam = (sessionTeam) ->
|
calculateOpposingTeam = (sessionTeam) ->
|
||||||
teams = ['ogres','humans']
|
teams = ['ogres','humans']
|
||||||
opposingTeams = _.pull teams, sessionTeam
|
opposingTeams = _.pull teams, sessionTeam
|
||||||
return opposingTeams[0]
|
return opposingTeams[0]
|
||||||
|
|
||||||
|
|
||||||
validatePermissions = (req, sessionID, callback) ->
|
validatePermissions = (req, sessionID, callback) ->
|
||||||
if isUserAnonymous req then return callback null, false
|
if isUserAnonymous req then return callback null, false
|
||||||
if isUserAdmin req then return callback null, true
|
if isUserAdmin req then return callback null, true
|
||||||
|
@ -287,17 +307,17 @@ fetchInitialSessionsToRankAgainst = (opposingTeam, callback) ->
|
||||||
submittedCode:
|
submittedCode:
|
||||||
$exists: true
|
$exists: true
|
||||||
team: opposingTeam
|
team: opposingTeam
|
||||||
|
|
||||||
sortParameters =
|
sortParameters =
|
||||||
totalScore: 1
|
totalScore: 1
|
||||||
|
|
||||||
limitNumber = 1
|
limitNumber = 1
|
||||||
|
|
||||||
query = LevelSession.find(findParameters)
|
query = LevelSession.find(findParameters)
|
||||||
.sort(sortParameters)
|
.sort(sortParameters)
|
||||||
.limit(limitNumber)
|
.limit(limitNumber)
|
||||||
|
|
||||||
|
|
||||||
query.exec callback
|
query.exec callback
|
||||||
|
|
||||||
generateTaskPairs = (submittedSessions, sessionToScore) ->
|
generateTaskPairs = (submittedSessions, sessionToScore) ->
|
||||||
|
@ -433,4 +453,3 @@ retrieveOldSessionData = (sessionID, callback) ->
|
||||||
"totalScore":session.totalScore ? (25 - 1.8*(25/3))
|
"totalScore":session.totalScore ? (25 - 1.8*(25/3))
|
||||||
"id": sessionID
|
"id": sessionID
|
||||||
callback err, oldScoreObject
|
callback err, oldScoreObject
|
||||||
|
|
||||||
|
|
49
server_config.coffee
Normal file
49
server_config.coffee
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
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
|
|
@ -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;
|
|
|
@ -8,21 +8,37 @@ database = require './server/commons/database'
|
||||||
baseRoute = require './server/routes/base'
|
baseRoute = require './server/routes/base'
|
||||||
user = require './server/users/user_handler'
|
user = require './server/users/user_handler'
|
||||||
logging = require './server/commons/logging'
|
logging = require './server/commons/logging'
|
||||||
|
|
||||||
config = require './server_config'
|
config = require './server_config'
|
||||||
|
|
||||||
###Middleware setup functions implementation###
|
###Middleware setup functions implementation###
|
||||||
setupRequestTimeoutMiddleware = (app) ->
|
# 2014-03-03: Try not using this and see if it's still a problem
|
||||||
app.use (req, res, next) ->
|
#setupRequestTimeoutMiddleware = (app) ->
|
||||||
req.setTimeout 15000, ->
|
# app.use (req, res, next) ->
|
||||||
console.log 'timed out!'
|
# req.setTimeout 15000, ->
|
||||||
req.abort()
|
# console.log 'timed out!'
|
||||||
self.emit('pass',message)
|
# req.abort()
|
||||||
next()
|
# 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) ->
|
setupExpressMiddleware = (app) ->
|
||||||
setupRequestTimeoutMiddleware app
|
#setupRequestTimeoutMiddleware app
|
||||||
app.use(express.logger('dev'))
|
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(express.static(path.join(__dirname, 'public')))
|
||||||
app.use(useragent.express())
|
app.use(useragent.express())
|
||||||
|
|
||||||
|
@ -99,6 +115,3 @@ exports.setExpressConfigurationOptions = (app) ->
|
||||||
app.set('views', __dirname + '/app/views')
|
app.set('views', __dirname + '/app/views')
|
||||||
app.set('view engine', 'jade')
|
app.set('view engine', 'jade')
|
||||||
app.set('view options', { layout: false })
|
app.set('view options', { layout: false })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue