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