From e7ff2b773e52bf4c26c16f5bdd3b24a96aa6f99e Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Tue, 27 Jun 2017 12:54:43 -0700 Subject: [PATCH 001/227] Adds script for checking the difference between two lifetime price points --- scripts/analytics/lifetime-price-point-ab.js | 181 +++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 scripts/analytics/lifetime-price-point-ab.js diff --git a/scripts/analytics/lifetime-price-point-ab.js b/scripts/analytics/lifetime-price-point-ab.js new file mode 100644 index 00000000000..d08bf87e216 --- /dev/null +++ b/scripts/analytics/lifetime-price-point-ab.js @@ -0,0 +1,181 @@ +Promise = require('bluebird') +pg = require('pg') +co = require('co') +_ = require('lodash') +mongoose = require('mongoose') + +require('coffee-script'); +require('coffee-script/register'); +var server = require('../../server'); +var serverSetup = require('../../server_setup'); +serverSetup.connectToDatabase() +config = require('../../server_config') + +AnalyticsLogEvent = require('../../server/models/AnalyticsLogEvent') +utils = require('../../server/lib/utils') + +var date = '2017-05-15' + +co(function * () { + var pool = new pg.Pool(config.snowplow); + + pool.connectAsync = Promise.promisify(pool.connect); + var client = yield pool.connectAsync(); + + client.queryAsync = Promise.promisify(client.query); + var res = yield client.queryAsync("select \"user\", root_tstamp from atomic.com_codecombat_view_load_1 where view_id = 'subscribe-modal' and root_tstamp > '"+date+"';", []) + + var viewLoadLogs = res.rows; + + User = require('../../server/models/User') + events = [ + 'Started subscription purchase', + 'Finished subscription purchase', + //'Failed to finish subscription purchase', + 'Started 1 year subscription purchase', + 'Finished 1 year subscription purchase', + 'Failed to finish 1 year subscription purchase', + 'Start Lifetime Purchase', + 'Finish Lifetime Purchase', + 'Fail Lifetime Purchase' + ] + startId = utils.objectIdFromTimestamp(new Date(date).getTime()) + var eventLogs = yield AnalyticsLogEvent.find({ + 'event': { $in: events }, + _id: { $gte: startId } + }).sort({_id:1}) + + + // Some logic for checking our events against actual payment data + + //check = _(eventLogs) + // .filter(function (eventLog) { + // return _.contains(['Finished subscription purchase'], eventLog.event) + // }) + // .map(function (eventLog) { + // return eventLog.user // + ' ' + eventLog._id.getTimestamp() + // }) + // .value() + //console.log(JSON.stringify(check, null, '\t')) + //console.log(check.join('\n')) + //return + + var compiled = {}; + for (var i in viewLoadLogs) { + var viewLoadLog = viewLoadLogs[i]; + if(!compiled[viewLoadLog.user]) + compiled[viewLoadLog.user] = {}; + if(!compiled[viewLoadLog.user].views) + compiled[viewLoadLog.user].views = [] + compiled[viewLoadLog.user].views.push(viewLoadLog.root_tstamp) + } + + for (var j in eventLogs) { + var eventLog = eventLogs[j]; + if(!compiled[eventLog.user]) + compiled[eventLog.user] = {}; + if(!compiled[eventLog.user].events) + compiled[eventLog.user].events = {}; + if(eventLog.properties && eventLog.properties.value) { + compiled[eventLog.user].events[eventLog.event] = eventLog.properties.value; + } else { + compiled[eventLog.user].events[eventLog.event] = true; + } + if(!eventLog.event) { + throw new Error('stop') + } + } + + var userIds = _.keys(compiled); + while (userIds.length) { + console.log(userIds.length); + var userIdChunk = userIds.splice(0, 100); + var userObjectIds = _.map(userIdChunk, function(id) { return mongoose.Types.ObjectId(id); }); + var users = yield User.find({_id: {$in: userObjectIds}}).lean().select('testGroupNumber') + _.forEach(users, function(user) { + /* + products = (p for p in products when p.name isnt 'year_subscription') + if (req.user.get('testGroupNumber') or 0) % 2 is 0 + products = (p for p in products when p.name isnt 'lifetime_subscription2') + else + products = (p for p in products when p.name isnt 'lifetime_subscription') + res.send(products) + */ + if(user.testGroupNumber % 2 === 0) { + compiled[user._id+''].group = 'lifetime79' + } else { + compiled[user._id+''].group = 'lifetime99' + } + //compiled[user._id+''].group = (user.testGroupNumber || 0) % 2 === 0 ? 'lifetime99' : 'lifetime79' + }) + } + + userIds = _.keys(compiled); + var counts = { + lifetime99: { + views: 0, + started: 0, + finished: 0, + failed: 0, + subsStarted: 0, + subs: 0 + }, + lifetime79: { + views: 0, + started: 0, + finished: 0, + failed: 0, + subsStarted: 0, + subs: 0 + }, + mismatches: 0 + } + for (var k in userIds) { + var userId = userIds[k]; + if(!compiled[userId].group) + continue + if(!compiled[userId].views) { + continue + } + counts[compiled[userId].group].views += 1 + var userEvents = _.keys(compiled[userId].events) + for(var l in userEvents) { + var eventName = userEvents[l]; + /* + if(eventName.indexOf('year') > -1 && compiled[userId].group !== 'year') { + console.log('Year event found for lifetime user!', userId, compiled[userId]) + counts.mismatches += 1 + } + if(eventName.indexOf('Lifetime') > -1 && compiled[userId].group !== 'lifetime') { + console.log('Lifetime event found for year user!', userId, compiled[userId]) + counts.mismatches += 1 + } + */ + if(eventName === 'Finished subscription purchase') { + counts[compiled[userId].group].subs += 1 + } else if (eventName === 'Started subscription purchase') { + counts[compiled[userId].group].subsStarted += 1 + } + else { + if(_.str.startsWith(eventName, 'Start')) { + counts[compiled[userId].group].started += 1 + } + if(_.str.startsWith(eventName, 'Finish')) { + counts[compiled[userId].group].finished += 1 + } + if(_.str.startsWith(eventName, 'Fail')) { + counts[compiled[userId].group].failed += 1 + } + } + } + } + + console.log(JSON.stringify(counts, null, '\t')) +}) +.catch(function (err) { + console.log('err', err.stack); + process.exit(1) +}) +.then(function () { + process.exit(0) +}) From bc66bf9f7bcc9be341002b6b1d8ec766cc0e9efc Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 1 Aug 2017 14:26:30 -0400 Subject: [PATCH 002/227] Couple en.coffee fixes * Remove unused line * Fix typo --- app/locale/en.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 013513dddf5..2df26c6ebf0 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -597,7 +597,6 @@ auth_tab: "Sign Up" inventory_caption: "Equip your hero" choose_hero_caption: "Choose hero, language" - save_load_caption: "... and view history" options_caption: "Configure settings" guide_caption: "Docs and tips" multiplayer_caption: "Play with friends!" @@ -1565,7 +1564,7 @@ wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." wd2: "Web Development 2" wd2_jquery_syntax: "jQuery Functions Syntax Guide" - wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." + wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." wd2_quizlet_worksheet: "Quizlet Planning Worksheet" wd2_quizlet_worksheet_instructions: "View instructions & examples" wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." From 896533df8170b388f2fe0bbcf05a33bf9efe2628 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 1 Aug 2017 12:01:13 -0700 Subject: [PATCH 003/227] Close Customer Success Manager role on /about --- app/templates/about.jade | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/templates/about.jade b/app/templates/about.jade index 93903020240..53eab67d251 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -310,15 +310,6 @@ block content p.small Come use your extensive backend experience to ensure our servers always provide the answer, and drive backend engineering excellence across the team! a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/e53fba8b-132f-48c4-989d-fce6fbc3f23f" rel="external") span(data-i18n="about.learn_more") - .col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0 - .job-listing - h5 Customer Success Manager - .text-center - small.label - | San Francisco • Full-time - p.small Manage renewals, keep our customers happy, and help bring computer science education to every student. - a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/ea42c700-12e9-472d-b573-32a67c8a0e30" rel="external") - span(data-i18n="about.learn_more") .col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0 .job-listing h5 Sales Development Representative From beaeb564b19df92aaaa9c542a6f3cd6ce7c322e4 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 1 Aug 2017 15:54:54 -0700 Subject: [PATCH 004/227] Fix ActivateLicensesModal scrolling on checkbox toggle --- app/views/courses/ActivateLicensesModal.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/courses/ActivateLicensesModal.coffee b/app/views/courses/ActivateLicensesModal.coffee index fa982e8afa5..f8cfc12461b 100644 --- a/app/views/courses/ActivateLicensesModal.coffee +++ b/app/views/courses/ActivateLicensesModal.coffee @@ -45,10 +45,11 @@ module.exports = class ActivateLicensesModal extends ModalView @supermodel.trackRequests(jqxhrs) }) - @listenTo @state, 'change', @render + @listenTo @state, 'change', -> + @renderSelectors('#submit-form-area') @listenTo @state.get('selectedUsers'), 'change add remove reset', -> @updateVisibleSelectedUsers() - @render() + @renderSelectors('#submit-form-area') @listenTo @users, 'change add remove reset', -> @updateVisibleSelectedUsers() @render() @@ -68,8 +69,8 @@ module.exports = class ActivateLicensesModal extends ModalView updateSelectedStudents: (e) -> userID = $(e.currentTarget).data('user-id') user = @users.get(userID) - if @state.get('selectedUsers').contains(user) - @state.get('selectedUsers').remove(user) + if @state.get('selectedUsers').findWhere({ _id: user.id }) + @state.get('selectedUsers').remove(user.id) else @state.get('selectedUsers').add(user) # @render() # TODO: Have @state automatically listen to children's change events? From c62e1850c6241c4ae34e34a8a0c4066172ee19ed Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 1 Aug 2017 16:41:50 -0700 Subject: [PATCH 005/227] Add Select All checkbox to ActivateLicensesModal --- .../courses/activate-licenses-modal.jade | 13 +++++++---- .../courses/ActivateLicensesModal.coffee | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/templates/courses/activate-licenses-modal.jade b/app/templates/courses/activate-licenses-modal.jade index 78befca4a4d..91cd96a9170 100644 --- a/app/templates/courses/activate-licenses-modal.jade +++ b/app/templates/courses/activate-licenses-modal.jade @@ -29,10 +29,15 @@ block modal-body-content span(data-i18n="teacher.apply_licenses_to_the_following_students") span : .well.form-group - - var enrolledUsers = view.users.filter(function(user){ return user.isEnrolled() }) - - var unenrolledUsers = view.users.filter(function(user){ return !user.isEnrolled() }) + - var enrolledUsers = view.enrolledUsers() + - var unenrolledUsers = view.unenrolledUsers() + - var areAllSelected = view.areAllSelected() + .checkbox + label + input.select-all-users-checkbox(type="checkbox", disabled=false, checked=areAllSelected) + span.spr(data-i18n="teacher.select_all") for user in unenrolledUsers - - var selected = Boolean(paid || state.get('selectedUsers').get(user.id)) + - var selected = state.get('selectedUsers').get(user.id) .checkbox label input.user-checkbox(type="checkbox", disabled=false, checked=selected, data-user-id=user.id, name='user') @@ -41,7 +46,7 @@ block modal-body-content .small-details.m-t-3 span(data-i18n='teacher.students_have_licenses') for user in enrolledUsers - - var selected = Boolean(paid || state.get('selectedUsers').get(user.id)) + - var selected = state.get('selectedUsers').get(user.id) .checkbox label input.user-checkbox(type="checkbox", disabled=true, checked=true, data-user-id=user.id, name='user') diff --git a/app/views/courses/ActivateLicensesModal.coffee b/app/views/courses/ActivateLicensesModal.coffee index f8cfc12461b..7157938aacd 100644 --- a/app/views/courses/ActivateLicensesModal.coffee +++ b/app/views/courses/ActivateLicensesModal.coffee @@ -14,6 +14,7 @@ module.exports = class ActivateLicensesModal extends ModalView events: 'change input[type="checkbox"][name="user"]': 'updateSelectedStudents' + 'change .select-all-users-checkbox': 'toggleSelectAllStudents' 'change select.classroom-select': 'replaceStudentList' 'submit form': 'onSubmitForm' 'click #get-more-licenses-btn': 'onClickGetMoreLicensesButton' @@ -73,7 +74,29 @@ module.exports = class ActivateLicensesModal extends ModalView @state.get('selectedUsers').remove(user.id) else @state.get('selectedUsers').add(user) + @$(".select-all-users-checkbox").prop('checked', @areAllSelected()) # @render() # TODO: Have @state automatically listen to children's change events? + + enrolledUsers: -> + @users.filter((user) -> user.isEnrolled()) + + unenrolledUsers: -> + @users.filter((user) -> not user.isEnrolled()) + + areAllSelected: -> + return _.all(@unenrolledUsers(), (user) => @state.get('selectedUsers').get(user.id)) + + toggleSelectAllStudents: (e) -> + if @areAllSelected() + @unenrolledUsers().forEach (user, index) => + if @state.get('selectedUsers').findWhere({ _id: user.id }) + @$("[type='checkbox'][data-user-id='#{user.id}']").prop('checked', false) + @state.get('selectedUsers').remove(user.id) + else + @unenrolledUsers().forEach (user, index) => + if not @state.get('selectedUsers').findWhere({ _id: user.id }) + @$("[type='checkbox'][data-user-id='#{user.id}']").prop('checked', true) + @state.get('selectedUsers').add(user) replaceStudentList: (e) -> selectedClassroomID = $(e.currentTarget).val() From 5a49e425db075df927af48b76be59451a7194d49 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 2 Aug 2017 17:08:53 -0400 Subject: [PATCH 006/227] Update Israel translations --- app/locale/he.coffee | 4078 +++++++++++++++++++++--------------------- 1 file changed, 2039 insertions(+), 2039 deletions(-) diff --git a/app/locale/he.coffee b/app/locale/he.coffee index ff2be3704f2..b0c6aae48ff 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -1,415 +1,415 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", translation: new_home: - slogan: "המשחק המלהיב ביותר ללימוד תכנות." - classroom_edition: "גרס" - learn_to_code: "למד לתכנת:" - play_now: "שחק" + slogan: "המשחק הכי מלהיב ללימוד תכנות." + classroom_edition: "המהדורה הכיתתית:" + learn_to_code: "למדו לכתוב קוד:" + play_now: "שחק עכשיו" im_a_teacher: "אני מורה" im_a_student: "אני תלמיד" - learn_more: "למד עוד" - classroom_in_a_box: "כיתה ללימוד מדעי המחשב." - codecombat_is: "קודקומבאט היא פלטפורמה עבור תלמידים ללימוד תכנות באמצעות משחק." -# our_courses: "Our courses have been specifically playtested to excel in the classroom, even by teachers with little to no prior programming experience." -# top_screenshots_hint: "Students write code and see their changes update in real-time" -# designed_with: "Designed with teachers in mind" -# real_code: "Real, typed code" - from_the_first_level: "החל משלב ראשון" -# getting_students: "Getting students to typed code as quickly as possible is critical to learning programming syntax and proper structure." -# educator_resources: "Educator resources" -# course_guides: "and course guides" -# teaching_computer_science: "Teaching computer science does not require a costly degree, because we provide tools to support educators of all backgrounds." - accessible_to: "זמין" - everyone: "לכולם" -# democratizing: "Democratizing the process of learning coding is at the core of our philosophy. Everyone should be able to learn to code." -# forgot_learning: "I think they actually forgot that they were actually learning something." -# wanted_to_do: " Coding is something I've always wanted to do, and I never thought I would be able to learn it in school." -# why_games: "Why is learning through games important?" -# games_reward: "Games reward the productive struggle." -# encourage: "Gaming is a medium that encourages interaction, discovery, and trial-and-error. A good game challenges the player to master skills over time, which is the same critical process students go through as they learn." -# excel: "Games excel at rewarding" -# struggle: "productive struggle" -# kind_of_struggle: "the kind of struggle that results in learning that’s engaging and" -# motivating: "motivating" -# not_tedious: "not tedious." -# gaming_is_good: "Studies suggest gaming is good for children’s brains. (it’s true!)" -# game_based: "When game-based learning systems are" -# compared: "compared" -# conventional: "against conventional assessment methods, the difference is clear: games are better at helping students retain knowledge, concentrate and" -# perform_at_higher_level: "perform at a higher level of achievement" -# feedback: "Games also provide real-time feedback that allows students to adjust their solution path and understand concepts more holistically, instead of being limited to just “correct” or “incorrect” answers." -# real_game: "A real game, played with real coding." -# great_game: "A great game is more than just badges and achievements - it’s about a player’s journey, well-designed puzzles, and the ability to tackle challenges with agency and confidence." -# agency: "CodeCombat is a game that gives players that agency and confidence with our robust typed code engine, which helps beginner and advanced students alike write proper, valid code." -# request_demo_title: "Get your students started today!" -# request_demo_subtitle: "Request a demo and get your students started in less than an hour." -# get_started_title: "Set up your class today" -# get_started_subtitle: "Set up a class, add your students, and monitor their progress as they learn computer science." -# request_demo: "Request a Demo" -# setup_a_class: "Set Up a Class" -# have_an_account: "Have an account?" -# logged_in_as: "You are currently logged in as" -# computer_science: "Computer science courses for all ages" -# show_me_lesson_time: "Show me lesson time estimates for:" -# curriculum: "Total curriculum hours:" -# ffa: "Free for all students" -# lesson_time: "Lesson time:" -# coming_soon: "More coming soon!" -# courses_available_in: "Courses are available in JavaScript and Python. Web Development courses utilize HTML, CSS, jQuery, and Bootstrap." -# boast: "Boasts riddles that are complex enough to fascinate gamers and coders alike." -# winning: "A winning combination of RPG gameplay and programming homework that pulls off making kid-friendly education legitimately enjoyable." -# run_class: "Everything you need to run a computer science class in your school today, no CS background required." -# goto_classes: "Go to My Classes" -# view_profile: "View My Profile" -# view_progress: "View Progress" -# go_to_courses: "Go to My Courses" -# want_coco: "Want CodeCombat at your school?" - + learn_more: "מידע נוסף" + classroom_in_a_box: "כיתה שלמה בקופסה ללימוד מדעי המחשב." + codecombat_is: "CodeCombat הוא פלטפורמה לתלמידים, המיועדת ללימוד מדעי המחשב תוך כדי חוויית משחק אמיתית." + our_courses: "הקורסים שלנו נבדקו במיוחד כדי להבטיח התאמתם לסביבה הכיתתית, אפילו אצל מורים עם ניסיון מועט בתכנות או ללא ניסיון כלל." + top_screenshots_hint: "התלמידים כותבים קוד, ורואים את השינויים שלהם מתעדכנים בזמן אמת" + designed_with: "תוכנן מתוך חשיבה על מורים" + real_code: "קוד מוקלד אמיתי" + from_the_first_level: "מהשלב הראשון" + getting_students: "כדי ללמד תחביר תכנות ומבנה תקין, חשוב מאוד שהתלמידים יתחילו להקליד קוד כמה שיותר מהר." + educator_resources: "משאבים לאנשי חינוך" + course_guides: "ומדריכי קורסים" + teaching_computer_science: "היום לא צריך תואר יקר כדי ללמד מדעי המחשב, משום שאנו מספקים כלים לתמיכה באנשי חינוך מכל רקע." + accessible_to: "נגיש" + everyone: "לכל אחד" + democratizing: "דמוקרטיזציה של תהליך למידת הקידוד היא עמוד תווך בפילוסופיה שלנו. יש לאפשר לכל אחד ללמוד כיצד לכתוב קוד." + forgot_learning: "נראה לי שהם שכחו בעצם שהם ממש לומדים." + wanted_to_do: " תמיד רציתי לקודד, ואף פעם לא חשבתי שאוכל ללמוד את זה בבית הספר." + why_games: "למה חשוב ללמוד באמצעות משחקים?" + games_reward: "משחקים נותנים סיפוק על מאמץ פרודוקטיבי." + encourage: "משחקים הם מדיום שמעודד אינטראקציה, גילויים וניסוי ותעייה. משחק טוב דוחף את השחקן ללמוד כישורים לאורך זמן, וזהו אותו תהליך קריטי שהסטודנטים חווים כשהם לומדים." + excel: "משחקים הם דרך מצוינת לתגמל" + struggle: "מאמץ פרודוקטיבי" + kind_of_struggle: "מאמץ שמוביל לחוויית לימוד מרתקת" + motivating: "ומעוררת מוטיבציה" + not_tedious: "במקום מפרכת." + gaming_is_good: "מחקרים מעידים שמשחקים מיטיבים עם מוחו של הילד. (זה נכון!)" + game_based: "מערכות לימוד מבוססות-משחק," + compared: "בהשוואה" + conventional: "לשיטות הערכה קונבנציונליות, נהנות מיתרון ברור: משחקים עוזרים לתלמידים טוב יותר לשמור על ידע, להתרכז" + perform_at_higher_level: "ולהגיע להישגים גבוהים יותר" + feedback: """בנוסף, משחקים מספקים משוב בזמן אמת, שמאפשר לתלמידים לשנות בהתאם את הדרך שלהם אל הפתרון ולקבל הבנה הוליסטית יותר של עקרונות, במקום להגביל את התלמידים לתשובות "נכון" או "לא נכון".""" + real_game: "חוויית משחק אמיתית, דרך קידוד אמיתי." + great_game: "משחק מצוין הוא יותר מאשר מדליות והישגים - הוא מסע שהשחקן עובד, פאזלים בנויים היטב והיכולת להתמודד עם הישגים מתוך העצמה וביטחון עצמי." + agency: "CodeCombat הוא משחק שמעצים תלמידים ומעניק להם ביטחון באמצעות המנוע המקיף שלנו לקידוד בהקלדה, אשר עוזר לתלמידים מתחילים ומתקדמים כאחד, עם קוד נכון ותקין." + request_demo_title: "תנו לתלמידים שלכם להתחיל עוד היום!" + request_demo_subtitle: "בקשו הדגמה, והתלמידים שלכם יוכלו להתחיל תוך פחות משעה אחת." + get_started_title: "הקימו כיתה משלכם עוד היום" + get_started_subtitle: "הקימו כיתה, הוסיפו תלמידים, ועקבו אחר ההתקדמות שלהם בלימודי מדעי המחשב." + request_demo: "בקש הדגמה" + setup_a_class: "הקם כיתה" + have_an_account: "כבר יש לך חשבון?" + logged_in_as: "אתה מחובר כעת בתור" + computer_science: "קורסים במדעי המחשב לכל הגילאים" + show_me_lesson_time: "הצג הערכות זמן שיעור עבור:" + curriculum: """סה"כ שעות בתכנית לימודים:""" + ffa: """בחינם לכל התלמידים""" + lesson_time: "זמן שיעור:" + coming_soon: "עוד בקרוב!" + courses_available_in: "זמינים קורסים ב-JavaScript וב-Python. קורסים בפיתוח אינטרנט משתמשים ב-HTML,‏ CSS,‏ jQuery ו-Bootstrap." + boast: "כולל חידות ברמת מורכבות מספיקה כדי לרתק חובבי משחקים ומקודדים כאחד." + winning: "שילוב מנצח של משחק תפקידים ושיעורי בית בתכנות, שמצליח להפוך תכנית לימודים שמתאימה לילדים למהנה באמת." + run_class:"כל מה שנחוץ לכם כדי לנהל כיתה למדעי המחשב בבית הספר שלכם כבר היום, ללא צורך ברקע במדעי המחשב." + goto_classes: "עבור אל הכיתות שלי" + view_profile: "הצג את הפרופיל שלי" + view_progress: "הצג התקדמות" + go_to_courses: "עבור לקורסים שלי" + want_coco: "רוצים את CodeCombat אצלכם בבית הספר?" + nav: -# map: "Map" - play: "שלבים" # The top nav bar entry where players choose which levels to play + map: "מפה" + play: "שלבים" # הערך של סרגל הניווט העליון, אשר בו השחקנים בוחרים באילו שלבים לשחק community: "קהילה" - courses: "מסלולים" + courses: "קורסים" blog: "בלוג" forum: "פורום" account: "חשבון" -# my_account: "My Account" + my_account: "החשבון שלי" profile: "פרופיל" home: "בית" - contribute: "תרום" + contribute: "תרומה" legal: "משפטי" -# privacy: "Privacy" - about: "עלינו" - contact: "צור קשר" - twitter_follow: "עקוב אחרינו בטוויטר" -# my_classrooms: "My Classes" -# my_courses: "My Courses" - careers: "קריירות" -# facebook: "Facebook" -# twitter: "Twitter" -# create_a_class: "Create a Class" -# other: "Other" -# learn_to_code: "Learn to Code!" -# toggle_nav: "Toggle navigation" -# jobs: "Jobs" -# schools: "Schools" -# get_involved: "Get Involved" -# open_source: "Open source (GitHub)" -# support: "Support" -# faqs: "FAQs" -# help_pref: "Need help? Email" -# help_suff: "and we'll get in touch!" -# resource_hub: "Resource Hub" + privacy: "פרטיות" + about: "אודות" + contact: "יצירת קשר" + twitter_follow: "מעקב" + my_classrooms: "הכיתות שלי" + my_courses: "הקורסים שלי" + careers: "דרושים" + facebook: "Facebook" + twitter: "Twitter" + create_a_class: "יצירת כיתה" + other: "אחר" + learn_to_code: "למדו לכתוב קוד!" + toggle_nav: "מצב ניווט" + jobs: "עבודות" + schools: "מוסדות לימודים" + get_involved: "קחו חלק" + open_source: "קוד פתוח (GitHub)" + support: "תמיכה" + faqs: "שאלות נפוצות" + help_pref: "זקוקים לעזרה? שלחו דואר אלקטרוני לכתובת" + help_suff: "ואנו ניצור עמכם קשר!" + resource_hub: "מרכז המשאבים" modal: close: "סגור" okay: "אישור" - + not_found: - page_not_found: "העמוד לא נמצא" - + page_not_found: "הדף לא נמצא" + diplomat_suggestion: - title: "עזור לתרגם את קודקומבאט!" # This shows up when a player switches to a non-English language using the language selector. - sub_heading: "אנחנו צריכים את כישורי השפה שלך!" - pitch_body: "פיתחנו את המשחק באנגלית, אבל יש הרבה שחקנים מכול העולם. חלק מהם רוצים לשחק בעברית והם לא מבינים אנגלית. אם אתה דובר את שני השפות, עברית ואנגלית, אז בבקשה עזור לנו לתרגם לעברית את האתר ואת השלבים." - missing_translations: "עד שנתרגם הכול לעברית, מה שלא תורגם יופיע באנגלית." - learn_more: "תלמד עות על תרומת דיפלומטיה" - subscribe_as_diplomat: "הירשם כדיפלומט" - + title: "עזרו לתרגם את CodeCombat!" # מופיע כאשר השחקן עובר לשפה שאינה אנגלית באמצעות בורר השפות. + sub_heading: "אנו זקוקים לכישורי השפה שלכם" + pitch_body: "אנו מפתחים את CodeCombat בשפה האנגלית, אך כבר יש לנו שחקנים בכל העולם. רבים מהם רוצים לשחק בשפה {English} אך אינם דוברים אנגלית. לכן, אם אתם דוברים את שתי השפות, אנא שקלו להירשם בתור דיפלומט ולעזור לתרגם את אתר האינטרנט ואת כל השלבים של CodeCombat לשפה {English}." + missing_translations: "עד שנצליח לתרגם הכול לשפה {English}, יופיע בפניכם תוכן באנגלית כאשר השפה {English} אינה זמינה." + learn_more: "למידע נוסף על הצטרפות כדיפלומט" + subscribe_as_diplomat: "הירשם כמנוי דיפלומט" + play: - play_as: "שחק בתור " # Ladder page - compete: "הושלם!" # Course details page - spectate: "צופה" # Ladder page - players: "שחקנים" # Hover over a level on /play - hours_played: "שעות משחק" # Hover over a level on /play - items: "כלים" # Tooltip on item shop button from /play - unlock: "קנה" # For purchasing items and heroes + play_as: "שחק בתור" # דף הטבלה + compete: "תחרות!" # דף פרטי קורס + spectate: "מצב קהל" # דף הטבלה + players: "שחקנים" # רחף מעל לשלב ב-/play + hours_played: "שעות משחק" # רחף מעל לשלב ב-/play + items: "פריטים" # Tooltip on item shop button from /play + unlock: "פתח" # For purchasing items and heroes confirm: "אשר" - owned: "נרכש" # For items you own + owned: "שלי" # For items you own locked: "נעול" - purchasable: "ניתן לרכישה" # For a hero you unlocked but haven't purchased + purchasable: "לקנייה" # עבור גיבור שפתחת אך טרם רכשת available: "זמין" - skills_granted: "ממיומנויות נרכשו" # Property documentation details - heroes: "דמויות" # Tooltip on hero shop button from /play - achievements: "הישגים" # Tooltip on achievement list button from /play - settings: "הגדרות" # Tooltip on settings button from /play - poll: "סקר" # Tooltip on poll button from /play - next: "הבא" # Go from choose hero to choose inventory before playing a level - change_hero: "שנה גיבור" # Go back from choose inventory to choose hero - buy_gems: "רכש אבני חן" - subscription_required: "יש צורך במנוי" -# subscribers_only: "Subscribers Only!" -# subscribe_unlock: "Subscribe to Unlock!" -# subscriber_heroes: "Subscribe today to immediately unlock Amara, Hushbaum, and Hattori!" -# subscriber_gems: "Subscribe today to purchase this hero with gems!" - anonymous: "משתמש אנונימי" + skills_granted: "מיומנויות מתקבלות" # פרטים לתיעוד מאפיין + heroes: "גיבורים" # תיאור כלי בלחצן חנות הגיבורים מ-/play + achievements: "הישגים" # תיאור כלי ללחצן רשימת ההישגים מ-/play + settings: "הגדרות" # תיאור כלי ללחצן ההגדרות מ-/play + poll: "סקר" # תיאור כלי ללחצן הסקר מ-/play + next: "הבא" # עבור מבחירת גיבור לבחירת ציוד לפני שתשחק שלב + change_hero: "החלף גיבור" # חזרה מבחירת הציוד לבחירת הגיבור + buy_gems: "קנה אבני חן" + subscription_required: "נדרש מנוי" + subscribers_only: "למנויים בלבד!" + subscribe_unlock: "הירשם כמנוי כדי לפתוח!" + subscriber_heroes: "הירשם כמנוי היום כדי לפתוח מיד את אמארה, האשבאום והאטורי!" + subscriber_gems: "הירשם כמנוי היום כדי לקנות גיבור זה עם אבני חן!" + anonymous: "שחקן אנונימי" level_difficulty: "רמת קושי: " - play_classroom_version: "שחק בגרסה הכיתתית" # Choose a level in campaign version that you also can play in one of your courses - campaign_beginner: "מסע המתחילים" - awaiting_levels_adventurer_prefix: ".אנחנו מוסיפים חמישה שלבים בכל שבוע" # {change} - awaiting_levels_adventurer: "הירשם כהרפתקן" - awaiting_levels_adventurer_suffix: ".כדי להיות הראשון שישחק בשלבים חדשים" - adjust_volume: "שנה ווליום" - campaign_multiplayer: "זירות רב-המשתתפים" - campaign_multiplayer_description: "..." -# brain_pop_done: "You’ve defeated the Ogres with code! You win!" -# brain_pop_challenge: "Challenge yourself to play again using a different programming language!" -# replay: "Replay" -# back_to_classroom: "Back to Classroom" - -# code: -# if: "if" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) -# else: "else" -# elif: "else if" -# while: "while" -# loop: "loop" -# for: "for" -# break: "break" -# continue: "continue" -# pass: "pass" -# return: "return" -# then: "then" -# do: "do" -# end: "end" -# function: "function" -# def: "define" -# var: "variable" -# self: "self" -# hero: "hero" -# this: "this" -# or: "or" -# "||": "or" -# and: "and" -# "&&": "and" -# not: "not" -# "!": "not" -# "=": "assign" -# "==": "equals" -# "===": "strictly equals" -# "!=": "does not equal" -# "!==": "does not strictly equal" -# ">": "is greater than" -# ">=": "is greater than or equal" -# "<": "is less than" -# "<=": "is less than or equal" -# "*": "multiplied by" -# "/": "divided by" -# "+": "plus" -# "-": "minus" -# "+=": "add and assign" -# "-=": "subtract and assign" -# True: "True" -# true: "true" -# False: "False" -# false: "false" -# undefined: "undefined" -# null: "null" -# nil: "nil" -# None: "None" - + play_classroom_version: "שחק בגרסה הכיתתית" # בחר שלב בגרסת המערכה, שבאפשרותך לשחק גם באחד הקורסים שלך + campaign_beginner: "מערכה למתחילים" + awaiting_levels_adventurer_prefix: "אנו משחררים שלבים חדשים מדי שבוע." + awaiting_levels_adventurer: "הרשמה כהרפתקן" + awaiting_levels_adventurer_suffix: "כדי להיות הראשונים שישחקו בשלבים החדשים." + adjust_volume: "כוונון עצמת קול" + campaign_multiplayer: "זירות מרובות משתתפים" + campaign_multiplayer_description: "... שבהן תוכלו לקודד ראש-בראש נגד שחקנים אחרים." + brain_pop_done: "הבסתם את הענק בכוח הקוד! ניצחתם!" + brain_pop_challenge: "כדי לאתגר את עצמכם, שחקו שוב באמצעות שפת תכנות אחרת!" + replay: "הילוך חוזר" + back_to_classroom: "בחזרה לכיתה" + + code: + if: "אם" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) + else: "אחרת" + elif: "אחרת אם" + while: "כל עוד" + loop: "לולאה" + for: "עבור" + break: "עצירה" + continue: "המשך" + pass: "עבור הלאה" + return: "החזר" + then: "אז" + do: "בצע" + end: "סיום" + function: "פונקציה" + def: "הגדר" + var: "משתנה" + self: "עצמי" + hero: "גיבור" + this: "זה" + or: "או" + "||": "או" + and: "וכן" + "&&": "וכן" + not: "לא" + "!": "לא" + "=": "הקצה" # For this section, conjugate it like it's the verb part of a sentence when possible + "==": "שווה" + "===": "זהה" + "!=": "לא שווה" + "!==": "לא זהה" + ">": "גדול יותר" + ">=": "גדול יותר או שווה" + "<": "קטן יותר" + "<=": "קטן יותר או שווה" + "*": "כפול" + "/": "חלקי" + "+": "ועוד" + "-": "פחות" + "+=": "חבר והקצה" + "-=": "חסר והקצה" + True: "נכון" + true: "נכון" + False: "לא נכון" + false: "לא נכון" + undefined: "לא מוגדר" + null: "ריק" + nil: "ערך אפס" + None: "ללא" + share_progress_modal: - blurb: ".אתה מתקדם מצויין! ספר למישהו כמה למדת" - email_invalid: ".כתובת המייל שהוזנה שגויה" - form_blurb: "!הזן כתובת מייל ואנחנו נראה להם" + blurb: "אתם מתקדמים נהדר! ספרו להורה שלכם כמה למדתם עם CodeCombat." + email_invalid: "כתובת דואר אלקטרוני לא חוקית." + form_blurb: "הזינו למטה את כתובת הדואר האלקטרוני של ההורה, ואנו נראה לו או לה!" form_label: "כתובת דואר אלקטרוני" - placeholder: "כתובת המייל" - title: "עבודה מצויינת, מתלמד" - + placeholder: "כתובת דואר אלקטרוני" + title: "כל הכבוד, חניכים" + login: - sign_up: "הירשם" -# email_or_username: "Email or username" - log_in: "התחבר" - logging_in: "מתחבר" - log_out: "צא" - forgot_password: "שכחתי סיסמא" - authenticate_gplus: "G+ אמת באמצעות" - load_profile: "G+ טען פרופיל" + sign_up: "יצירת חשבון" + email_or_username: "דואר אלקטרוני או שם משתמש" + log_in: "כניסה" + logging_in: "מבצע כניסה" + log_out: "יציאה" + forgot_password: "שכחתם את הסיסמה?" + authenticate_gplus: "אימות Google" + load_profile: "טען פרופיל Google" finishing: "מסיים" - sign_in_with_facebook: "Facebook היכנס באמצעות" - sign_in_with_gplus: "G+ היכנס באמצעות" - signup_switch: "?רוצה ליצור חשבון" - + sign_in_with_facebook: "כניסה באמצעות Facebook" + sign_in_with_gplus: "כניסה באמצעות Google" + signup_switch: "רוצים ליצור חשבון?" + signup: -# create_student_header: "Create Student Account" -# create_teacher_header: "Create Teacher Account" -# create_individual_header: "Create Individual Account" - email_announcements: "קבל הודעות באימייל" # {change} + create_student_header: "יצירת חשבון תלמיד" + create_teacher_header: "יצירת חשבון מורה" + create_individual_header: "יצירת חשבון אישי" + email_announcements: "קבלו הודעות על שלבים ותכונות חדשים ב-CodeCombat!" creating: "יוצר חשבון..." - sign_up: "הירשם" - log_in: "כנס עם סיסמה" - required: ".יש להתחבר על מנת לגשת לשלב זה" - login_switch: "? כבר יש לך משתמש" - school_name: "שם בית ספר ועיר" - optional: "רשות" - school_name_placeholder: "לדוגמה: תיכון עירוני X, תל אביב." -# connected_gplus_header: "You've successfully connected with Google+!" -# connected_gplus_p: "Finish signing up so you can log in with your Google+ account." -# gplus_exists: "You already have an account associated with Google+!" -# connected_facebook_header: "You've successfully connected with Facebook!" -# connected_facebook_p: "Finish signing up so you can log in with your Facebook account." -# facebook_exists: "You already have an account associated with Facebook!" -# hey_students: "Students, enter the class code from your teacher." -# birthday: "Birthday" -# parent_email_blurb: "We know you can't wait to learn programming — we're excited too! Your parents will receive an email with further instructions on how to create an account for you. Email {{email_link}} if you have any questions." -# classroom_not_found: "No classes exist with this Class Code. Check your spelling or ask your teacher for help." -# checking: "Checking..." -# account_exists: "This email is already in use:" -# sign_in: "Sign in" -# email_good: "Email looks good!" -# name_taken: "Username already taken! Try {{suggestedName}}?" -# name_available: "Username available!" -# name_is_email: "Username may not be an email" -# choose_type: "Choose your account type:" -# teacher_type_1: "Teach programming using CodeCombat!" -# teacher_type_2: "Set up your class" -# teacher_type_3: "Access Course Guides" -# teacher_type_4: "View student progress" -# signup_as_teacher: "Sign up as a Teacher" -# student_type_1: "Learn to program while playing an engaging game!" -# student_type_2: "Play with your class" -# student_type_3: "Compete in arenas" -# student_type_4: "Choose your hero!" -# student_type_5: "Have your Class Code ready!" -# signup_as_student: "Sign up as a Student" -# individuals_or_parents: "Individuals & Parents" -# individual_type: "For players learning to code outside of a class. Parents should sign up for an account here." -# signup_as_individual: "Sign up as an Individual" -# enter_class_code: "Enter your Class Code" -# enter_birthdate: "Enter your birthdate:" -# parent_use_birthdate: "Parents, use your own birthdate." -# ask_teacher_1: "Ask your teacher for your Class Code." -# ask_teacher_2: "Not part of a class? Create an " -# ask_teacher_3: "Individual Account" -# ask_teacher_4: " instead." -# about_to_join: "You're about to join:" -# enter_parent_email: "Enter your parent’s email address:" -# parent_email_error: "Something went wrong when trying to send the email. Check the email address and try again." -# parent_email_sent: "We’ve sent an email with further instructions on how to create an account. Ask your parent to check their inbox." -# account_created: "Account Created!" -# confirm_student_blurb: "Write down your information so that you don't forget it. Your teacher can also help you reset your password at any time." -# confirm_individual_blurb: "Write down your login information in case you need it later. Verify your email so you can recover your account if you ever forget your password - check your inbox!" -# write_this_down: "Write this down:" -# start_playing: "Start Playing!" -# sso_connected: "Successfully connected with:" -# select_your_starting_hero: "Select Your Starting Hero:" -# you_can_always_change_your_hero_later: "You can always change your hero later." -# finish: "Finish" -# teacher_ready_to_create_class: "You're ready to create your first class!" -# teacher_students_can_start_now: "Your students will be able to start playing the first course, Introduction to Computer Science, immediately." -# teacher_list_create_class: "On the next screen you will be able to create a new class." -# teacher_list_add_students: "Add students to the class by clicking the View Class link, then sending your students the Class Code or URL. You can also invite them via email if they have email addresses." -# teacher_list_resource_hub_1: "Check out the" -# teacher_list_resource_hub_2: "Course Guides" -# teacher_list_resource_hub_3: "for solutions to every level, and the" -# teacher_list_resource_hub_4: "Resource Hub" -# teacher_list_resource_hub_5: "for curriculum guides, activities, and more!" -# teacher_additional_questions: "That’s it! If you need additional help or have questions, reach out to __supportEmail__." -# dont_use_our_email_silly: "Don't put our email here! Put your parent's email." - + sign_up: "הרשמה" + log_in: "היכנס עם סיסמה" + required: "יש להיכנס למערכת כדי ללכת לשם." + login_switch: "כבר יש לכם חשבון?" + school_name: "השם והעיר של מוסד הלימודים" + optional: "אופציונלי" + school_name_placeholder: "תיכון לדוגמה, ספרינגפילד, אילינוי" + connected_gplus_header: "התחברתם בהצלחה באמצעות Google+‎!" + connected_gplus_p: "סיימו את ההרשמה, כדי שתוכלו להיכנס באמצעות חשבון Google+‎." + gplus_exists: "כבר יש לכם חשבון המקושר ל-Google+‎!" + connected_facebook_header: "התחברתם בהצלחה באמצעות Facebook!" + connected_facebook_p: "סיימו את ההרשמה, כדי שתוכלו להיכנס באמצעות חשבון Facebook." + facebook_exists: "כבר יש לכם חשבון המקושר ל-Facebook!" + hey_students: "תלמידים, הזינו את קוד הכיתה שקיבלתם מהמורה." + birthday: "יום הולדת" + parent_email_blurb: "אנחנו יודעים שקשה לכם לחכות ללמוד לתכנת כבר - גם אנחנו מתרגשים! ההורים שלכם יקבלו בדואר אלקטרוני הודעה עם הוראות נוספות ליצירת חשבון עבורכם. בכל שאלה, נא לשלוח הודעה בדואר אלקטרוני לכתובת {{email_link}}." + classroom_not_found: "אין כיתות קיימות עם קוד כיתה זה. ודאו שהקוד אוית נכון, או בקשו מהמורה לעזור לכם." + checking: "בודק..." + account_exists: "כתובת דואר אלקטרוני זו כבר נמצאת בשימוש:" + sign_in: "כניסה" + email_good: "כתובת הדואר האלקטרוני נראית תקינה!" + name_taken: "שם המשתמש כבר תפוס! אולי ננסה את {{suggestedName}}?" + name_available: "שם המשתמש זמין!" + name_is_email: "שם המשתמש לא יכול להיות כתובת דואר אלקטרוני" + choose_type: "בחרו את סוג החשבון:" + teacher_type_1: "למדו תלמידים תכנות באמצעות CodeCombat!" + teacher_type_2: "הקימו כיתה משלכם" + teacher_type_3: "גישה אל מדריכי קורס" + teacher_type_4: "צפייה בהתקדמות התלמידים" + signup_as_teacher: "הרשמה כמורה" + student_type_1: "למדו כיצד לתכנת, תוך כדי חוויית משחק מרתקת!" + student_type_2: "שחקו עם הכיתה שלכם" + student_type_3: "התחרו בזירות" + student_type_4: "בחרו גיבור או גיבורה משלכם!" + student_type_5: "להתכונן עם קוד הכיתה!" + signup_as_student: "הרשמה כתלמיד" + individuals_or_parents: "אנשים פרטיים והורים" + individual_type: "עבור שחקנים שלומדים איך לקודד שלא במסגרת לימודית. הורים נרשמים לחשבון כאן." + signup_as_individual: "הרשמה כאדם פרטי" + enter_class_code: "הזן קוד כיתה" + enter_birthdate: "הזן תאריך לידה:" + parent_use_birthdate: "הורים, השתמשו בתאריך הלידה שלכם." + ask_teacher_1: "בקשו מהמורה את קוד הכיתה." + ask_teacher_2: "אינכם חלק מכיתה? צרו " + ask_teacher_3: "חשבון אישי" + ask_teacher_4: " במקום זאת." + about_to_join: "אתם עומדים להצטרף אל:" + enter_parent_email: "הזינו כתובת דואר אלקטרוני של ההורה:" + parent_email_error: "אירעה שגיאה כלשהי בעת הניסיון לשלוח את ההודעה בדואר אלקטרוני. בדקו את כתובת הדואר האלקטרוני, ונסו שוב." + parent_email_sent: "שלחנו הודעה בדואר אלקטרוני עם הוראות נוספות ליצירת חשבון. בקשו מההורים לחפש את ההודעה בתיבת הדואר הנכנס שלהם." + account_created: "החשבון נוצר!" + confirm_student_blurb: "רשמו את הפרטים שלכם, כדי לא לשכוח. תוכלו גם לבקש מהמורה לעזור לכם באיפוס הסיסמה בכל עת." + confirm_individual_blurb: "רשמו את פרטי הכניסה שלכם, כדי שתוכלו להשתמש בהם בעתיד. ודאו את כתובת הדואר האלקטרוני, כדי שתוכלו לשחזר את חשבונכם אפילו אם תשכחו את הסיסמה - חפשו את ההודעה בתיבת הדואר הנכנס!" + write_this_down: "רשמו:" + start_playing: "התחילו לשחק!" + sso_connected: "התחברתם בהצלחה אל:" + select_your_starting_hero: "בחרו גיבור להתחיל אתו:" + you_can_always_change_your_hero_later: "תמיד תוכלו להחליף גיבור בהמשך." + finish: "סיום" + teacher_ready_to_create_class: "אתם מוכנים ליצירת הכיתה הראשונה שלכם!" + teacher_students_can_start_now: "התלמידים שלכם מיד יוכלו להתחיל ולשחק בקורס הראשון, 'מבוא למדעי המחשב'." + teacher_list_create_class: "במסך הבא תוכלו ליצור כיתה חדשה." + teacher_list_add_students: """כדי להוסיף תלמידים לכיתה, לחצו על הקישור 'הצג כיתה', ולאחר מכן שלחו אל התלמידים את קוד הכיתה או כתובת ה-URL. תוכלו גם להזמין אותם בדואר אלקטרוני, אם יש להם כתובות דוא"ל.""" + teacher_list_resource_hub_1: "בואו לעיין" + teacher_list_resource_hub_2: "במדריכים לקורס" + teacher_list_resource_hub_3: "כדי למצוא פתרונות לכל שלב, וכן" + teacher_list_resource_hub_4: "במרכז המשאבים" + teacher_list_resource_hub_5: "כדי למצוא מדריכים לתכנית לימודים, פעילויות ועוד!" + teacher_additional_questions: "זה הכול! לשאלות ולקבלת עזרה נוספת, נא לפנות אל __supportEmail__." + dont_use_our_email_silly: "אל תכתבו כאן את הכתובת שלנו! כתבו את כתובת הדואר האלקטרוני של ההורה." + recover: - recover_account_title: "שחזר סיסמה" - send_password: "שלח סיסמה חדשה" - recovery_sent: "מייל לשחזור סיסמא נשלח" - + recover_account_title: "שחזור חשבון" + send_password: "שלח סיסמת שחזור" + recovery_sent: "הודעת שחזור נשלחה." + items: primary: "ראשי" secondary: "משני" armor: "שריון" accessories: "אביזרים" - misc: "אחר" - books: "ספרי כישוף" - + misc: "שונות" + books: "ספרים" + common: back: "חזור" # When used as an action verb, like "Navigate backward" -# go_back: "Go Back" -# coming_soon: "Coming soon!" - continue: "המשך" # When used as an action verb, like "Continue forward" -# next: "Next" -# default_code: "Default Code" - loading: "...טוען" -# overview: "Overview" -# solution: "Solution" -# table_of_contents: "Table of Contents" -# intro: "Intro" - saving: "...שומר" - sending: "...שולח" + go_back: "חזרה" + coming_soon: "בקרוב!" + continue: "המשך" # When used as an action verb, like "Continue forward" + next: "הבא" + default_code: "קוד ברירת מחדל" + loading: "טוען..." + overview: "סקירה כללית" + solution: "פתרון" + table_of_contents: "תוכן העניינים" + intro: "מבוא" + saving: "שומר..." + sending: "שולח..." send: "שלח" -# sent: "Sent" + sent: "נשלח" cancel: "ביטול" save: "שמור" publish: "פרסם" create: "צור" - fork: "קילשון" - play: "שחק" # When used as an action verb, like "Play next level" + fork: "פיצול" + play: "שחק" # When used as an action verb, like "Play next level" retry: "נסה שוב" actions: "פעולות" info: "מידע" help: "עזרה" - watch: "צפה" - unwatch: "הסר צפיה" - submit_patch: ".שלח תיקון" + watch: "צפייה" + unwatch: "ביטול צפייה" + submit_patch: "שלח תיקון" submit_changes: "שלח שינויים" save_changes: "שמור שינויים" -# required_field: "required" -# valid_phone: "Enter a valid phone number." - + required_field: "חובה" + valid_phone: "נא להזין ספר טלפון חוקי." + general: - and: "וגם" + and: "וכן" name: "שם" date: "תאריך" body: "גוף" version: "גרסה" - pending: "ממתין" + pending: "בהמתנה" accepted: "התקבל" rejected: "נדחה" - withdrawn: "האוייב נסוג" - accept: "מסכים" + withdrawn: "בוטל" + accept: "קבל" reject: "דחה" -# withdraw: "Withdraw" - submitter: "מוסר" - submitted: "נמסר" - commit_msg: "שלח הודעה" - version_history: "היסטורית גרסאות" - version_history_for: " :הסטוריית גרסאות ל" - select_changes: ".בחר בשני שינויים כדי לראות את ההבדל" - undo_prefix: "Undo" + withdraw: "בטל" + submitter: "השולח" + submitted: "נשלח" + commit_msg: "הודעת שינוי" + version_history: "היסטוריית גרסאות" + version_history_for: "היסטוריית גרסאות עבור: " + select_changes: "בחרו שני שינויים למטה כדי לראות את ההבדל." + undo_prefix: "בטל" undo_shortcut: "(Ctrl+Z)" - redo_prefix: "Redo" + redo_prefix: "בצע שוב" redo_shortcut: "(Ctrl+Shift+Z)" - play_preview: "הצג תצוגה מקדימה לשלב הנוכחי" + play_preview: "שחקו בתצוגה מקדימה של השלב הנוכחי" result: "תוצאה" results: "תוצאות" description: "תיאור" or: "או" subject: "נושא" - email: "מייל" + email: "דואר אלקטרוני" password: "סיסמה" -# confirm_password: "Confirm Password" + confirm_password: "אשר סיסמה" message: "הודעה" code: "קוד" - ladder: "סולם" - when: "כש" + ladder: "טבלה" + when: "מתי" opponent: "יריב" - rank: "דרגה" - score: "ניקוד" + rank: "דירוג" + score: "נקודות" win: "ניצחון" loss: "הפסד" - tie: "שוויון" + tie: "תיקו" easy: "קל" medium: "בינוני" hard: "קשה" player: "שחקן" - player_level: "רמה" # Like player level 5, not like level: Dungeons of Kithgard + player_level: "דרגה" # Like player level 5, not like level: Dungeons of Kithgard warrior: "לוחם" - ranger: "קשת" - wizard: "מכשף" -# first_name: "First Name" -# last_name: "Last Name" -# last_initial: "Last Initial" -# username: "Username" -# contact_us: "Contact Us" -# close_window: "Close Window" -# learn_more: "Learn More" - + ranger: "סייר" + wizard: "קוסם" + first_name: "שם פרטי" + last_name: "שם משפחה" + last_initial: "אות ראשונה של שם משפחה" + username: "שם משתמש" + contact_us: "צור קשר" + close_window: "סגור חלון" + learn_more: "מידע נוסף" + units: second: "שנייה" seconds: "שניות" @@ -425,1891 +425,1891 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", months: "חודשים" year: "שנה" years: "שנים" - + play_level: -# back_to_map: "Back to Map" -# directions: "Directions" -# edit_level: "Edit Level" -# explore_codecombat: "Explore CodeCombat" -# finished_hoc: "I'm finished with my Hour of Code" -# get_certificate: "Get your certificate!" -# level_complete: "Level Complete" - completed_level: "שלב שהושלם:" - course: "מסלול:" - done: "סיים" + back_to_map: "בחזרה למפה" + directions: "הנחיות" + edit_level: "עריכת שלב" + explore_codecombat: "לחקור את CodeCombat" + finished_hoc: "סיימתי את \"שעת הקוד\" שלי" + get_certificate: "קבלו תעודה!" + level_complete: "השלב הושלם" + completed_level: "שלב הושלם:" + course: "קורס:" + done: "סיום" next_level: "השלב הבא" next_game: "המשחק הבא" -# languages: "Languages" -# programming_language: "Programming language" + languages: "שפות" + programming_language: "שפת תכנות" show_menu: "הצג תפריט משחק" - home: "בית" # Not used any more, will be removed soon. - level: "שלב" # Like "Level: Dungeons of Kithgard" + home: "בית" # Not used any more, will be removed soon. + level: "דרגה" # Like "דרגה: המבוכים של קיתגארד" skip: "דלג" game_menu: "תפריט משחק" - restart: "נסה שוב" - goals: "מטרות" - goal: "מטרה" - running: "...פועל" - success: "!הצלחה" - incomplete: "לא הושלם" - timed_out: "הזמן אזל" - failing: "נכשל" - reload: "טען שוב" - reload_title: "?לטעון מחדש את כל הקוד" - reload_really: "?אתה בטוח שאתה רוצה לטעון שוב את השלב הזה ולהתחיל מההתחלה" - reload_confirm: "טען הכול שוב" -# test_level: "Test Level" + restart: "הפעל מחדש" + goals: "יעדים" + goal: "יעד" + running: "מריץ..." + success: "בוצע בהצלחה!" + incomplete: "לא הושלמו" + timed_out: "נגמר הזמן" + failing: "נכשלים" + reload: "טען מחדש" + reload_title: "האם לטעון מחדש את כל הקוד?" + reload_really: "האם אתם בטוחים שברצונכם לטעון מחדש שלב זה לנקודת ההתחלה?" + reload_confirm: "טען מחדש הכול" + test_level: "בדיקת שלב" victory: "ניצחון" victory_title_prefix: "" victory_title_suffix: " הושלם" - victory_sign_up: "הירשם על מנת לשמור התקדמות" - victory_sign_up_poke: "!רוצה לשמור את הקוד? הירשם בחינם עכשיו" - victory_rate_the_level: " :דרג את השלב" # {change} - victory_return_to_ladder: "חזור לסולם" + victory_sign_up: "הירשמו כדי לשמור את ההתקדמות" + victory_sign_up_poke: "רוצים לשמור את הקוד שלכם? צרו חשבון בחינם!" + victory_rate_the_level: "כמה נהניתם משלב זה?" + victory_return_to_ladder: "בחזרה לטבלה" victory_saving_progress: "שומר התקדמות" - victory_go_home: "חזור הביתה" - victory_review: "!ספר לנו עוד" - victory_review_placeholder: "איך היה השלב?" - victory_hour_of_code_done: "?סיימת" - victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה" - victory_experience_gained: "שנצבר XP" - victory_gems_gained: "אבני חן שנצברו" - victory_new_item: "חפץ חדש" -# victory_new_hero: "New Hero" - victory_viking_code_school: "אבוקדו קדוש, זה היה שלב קשה שסיימת! אם אתה עדיין לא מפתח תוכנה, אתה צריך להיות אחד. בדיוק עלית על הכביש המהיר בכדי להתקבל ל Viking Code School, שם תוכל לשאת את כישוריך לרמה הבאה ותוכל להפוך למפתח רשת מקצועי תוך 14 שבועות בלבד." + victory_go_home: "הביתה" + victory_review: "ספרו לנו עוד!" + victory_review_placeholder: "איך היה השלב הזה?" + victory_hour_of_code_done: "סיימתם?" + victory_hour_of_code_done_yes: 'סיימתי את "שעת הקוד™" שלי!' + victory_experience_gained: "נקודות ניסיון שקיבלתם" + victory_gems_gained: "אבני חן שהשגתם" + victory_new_item: "פריט חדש" + victory_new_hero: "גיבור חדש" + victory_viking_code_school: "וואו, הצלחתם לסיים שלב ממש קשה! אם אתם עדיין לא מפתחי תוכנה, כדאי לכם להיות. התקבלתם עכשיו במסלול המהיר לבית הספר הוויקינגי לקידוד, שבו תוכלו להתקדם לרמת מיומנות חדשה לחלוטין ולהפוך למפתחי אינטרנט מקצועיים ב-14 שבועות." victory_become_a_viking: "הפוך לוויקינג" -# victory_no_progress_for_teachers: "Progress is not saved for teachers. But, you can add a student account to your classroom for yourself." - tome_cast_button_run: "הפעל" - tome_cast_button_running: "פועל" - tome_cast_button_ran: "הופעל" + victory_no_progress_for_teachers: "ההתקדמות לא נשמרת עבור מורים. עם זאת, תוכלו להוסיף חשבון תלמיד לכיתה שלכם, עבור עצמכם." + tome_cast_button_run: "הרץ" + tome_cast_button_running: "מריץ" + tome_cast_button_ran: "הורץ" tome_submit_button: "שלח" - tome_reload_method: ".טען קוד מקורי לפונקציה זו" # {change} - tome_available_spells: "כישופים זמינים" - tome_your_skills: "מיומנויות" -# hints: "Hints" -# hints_title: "Hint {{number}}" - code_saved: "קוד נשמר" - skip_tutorial: "(esc) דלג" + tome_reload_method: "טען מחדש את הקוד המקורי כדי להתחיל את השלב מחדש" + tome_available_spells: "לחשים זמינים" + tome_your_skills: "המיומנויות שלך" + hints: "רמזים" + hints_title: "רמז {{number}}" + code_saved: "הקוד נשמר" + skip_tutorial: "דלג (esc)" keyboard_shortcuts: "קיצורי מקשים" loading_start: "התחל שלב" - problem_alert_title: "תקן שגיאות בקוד" - time_current: ":זמו נוכחי" - time_total: ":שמן מקסימלי" - time_goto: ":לך ל" - non_user_code_problem_title: "טעינת שלב נכשלה" - infinite_loop_title: "לופ אינסופי זוהה" -# 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." + problem_alert_title: "תקן את הקוד" + time_current: "עכשיו:" + time_total: "מקסימום:" + time_goto: "עבור אל:" + non_user_code_problem_title: "לא ניתן לטעון את השלב" + infinite_loop_title: "נמצאה לולאה אינסופית" + infinite_loop_description: "הרצת הקוד הראשוני לבניית העולם לא הושלמה. כנראה מדובר בקוד איטי מאוד, או שהוא מכיל לולאה אינסופית. לחלופין, ייתכן שמדובר בבאג. ניתן לנסות ולהריץ קוד זה שוב או לאפס את הקוד למצב ברירת המחדל. אם פעולות אלה לא יתקנו את הקוד, נא לדווח לנו על כך." + check_dev_console: "ניתן גם לפתוח את מסוף המפתח, כדי לנסות ולברר מה הבעיה." check_dev_console_link: "(הוראות)" infinite_loop_try_again: "נסה שוב" - infinite_loop_reset_level: "התחל שלב מחדש" - infinite_loop_comment_out: ".הפוך את הקוד שלי להערה" - tip_toggle_play: "Ctrl+P הדלק הפעל/השהה בעזרת" - tip_scrub_shortcut: "Ctrl+[ ו Ctrl+] האץ אחורה וקדימה באמצעות" # {change} - tip_guide_exists: ".לחץ על המדריך, בתוך תפריט המשחק (למעלה בקצה העמוד), למידע שימושי" - tip_open_source: "!הוא 100% קוד פתוח CodeCombat" - tip_tell_friends: "נהנה מCodeCombat? ספר לחבריךעלינו!" - tip_beta_launch: ".הפיץ את גרסת הבטא באוקטובר, 2013 CodeCombat" - tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה" - tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה" - tip_error_free: "יש שתי דרכים לכתוב תוכנות בלי אף תקלה; רק השלישית עובדת. - אלן פרליס" - tip_debugging_program: "אם ניפוי הוא התהליך של הסרת באגים, אז תכנות חייב להיות התהליך של לשים אותם -. אדגר ו. דיקסטרא" - tip_forums: "!לך לפורומים וספר לנו מה אתה חושב" - tip_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על" - tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר" - tip_all_species: ".אנחנו מאמינים בשוויון הזדמנויות לכל היצורים בלמידת תכנות" - tip_reticulating: "Reticulating spines." - tip_harry: " ,תה' מכשף" - tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה." - tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן." - tip_binary: "יש רק 10 אנשים בעולם: כאלה שמבינים בינארית וכאלה שלא." - tip_commitment_yoda: "מתכנת חייב להיות עם המחויבות העמוקה ביותר, עם המחשבה הרצינית ביותר. ~ יודה" - tip_no_try: "תעשה. או אל תעשה. אין לנסות - יודה" - tip_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה" - tip_documented_bug: "באג מתועד הוא לא באג; הוא בונוס שבא עם התוכנה." - tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה" - tip_talk_is_cheap: "דיבור זה זול. תראה לי את הקוד - לינוס טורבאלדס" - tip_first_language: "הדבר ההרסני ביותר שאי פעם תלמד הוא שפת התכנות הראשונה שלך. - אלן קיי" - tip_hardware_problem: "ש: כמה מתכנתים צריך כדי להחליף נורה? ת: אפס, זו בכלל בעיה בחומרה." -# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." -# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth" -# tip_brute_force: "When in doubt, use brute force. - Ken Thompson" -# tip_extrapolation: "There are only two kinds of people: those that can extrapolate from incomplete data..." - tip_superpower: ".תכנות זה הדבר הקרוב ביותר שיש לנו לכוחות על" -# tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds" - tip_no_code: "לא קוד מהיר יותר מקוד של לא." - tip_code_never_lies: "קוד אף פעם לא משקר, הערות לפעמים כן. - רון ג'פריס" -# tip_reusable_software: "Before software can be reusable it first has to be usable." -# tip_optimization_operator: "Every language has an optimization operator. In most languages that operator is ‘//’" -# tip_lines_of_code: "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates" -# tip_source_code: "I want to change the world but they would not give me the source code." -# tip_javascript_java: "Java is to JavaScript what Car is to Carpet. - Chris Heilmann" - tip_move_forward: "מה שלא תעשה, תמשיך להתקדם - מרטין לותר קינג ג'וניור" - tip_google: "!יש בעיה שאתה לא מצליח לפתור? תגגל אותה" - tip_adding_evil: ".מוסיף קמצוץ של רשע" -# tip_hate_computers: "That's the thing about people who think they hate computers. What they really hate is lousy programmers. - Larry Niven" -# tip_open_source_contribute: "You can help CodeCombat improve!" -# tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch" -# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus" -# tip_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha" -# tip_paper_and_pen: "Before you start coding, you can always plan with a sheet of paper and a pen." -# tip_solve_then_write: "First, solve the problem. Then, write the code. - John Johnson" -# tip_compiler_ignores_comments: "Sometimes I think that the compiler ignores my comments." -# tip_understand_recursion: "The only way to understand recursion is to understand recursion." -# tip_life_and_polymorphism: "Open Source is like a totally polymorphic heterogeneous structure: All types are welcome." -# tip_mistakes_proof_of_trying: "Mistakes in your code are just proof that you are trying." -# tip_adding_orgres: "Rounding up ogres." -# tip_sharpening_swords: "Sharpening the swords." -# tip_ratatouille: "You must not let anyone define your limits because of where you come from. Your only limit is your soul. - Gusteau, Ratatouille" -# tip_nemo: "When life gets you down, want to know what you've gotta do? Just keep swimming, just keep swimming. - Dory, Finding Nemo" -# tip_internet_weather: "Just move to the internet, it's great here. We get to live inside where the weather is always awesome. - John Green" -# tip_nerds: "Nerds are allowed to love stuff, like jump-up-and-down-in-the-chair-can't-control-yourself love it. - John Green" -# tip_self_taught: "I taught myself 90% of what I've learned. And that's normal! - Hank Green" -# tip_luna_lovegood: "Don't worry, you're just as sane as I am. - Luna Lovegood" -# tip_good_idea: "The best way to have a good idea is to have a lot of ideas. - Linus Pauling" -# tip_programming_not_about_computers: "Computer Science is no more about computers than astronomy is about telescopes. - Edsger Dijkstra" -# tip_mulan: "Believe you can, then you will. - Mulan" -# project_complete: "Project Complete!" -# share_this_project: "Share this project with friends or family:" -# ready_to_share: "Ready to publish your project?" -# click_publish: "Click \"Publish\" to make it appear in the class gallery, then check out what your classmates built! You can come back and continue to work on this project. Any further changes will automatically be saved and shared with your classmates." -# already_published_prefix: "Your changes have been published to the class gallery." -# already_published_suffix: "Keep experimenting and making this project even better, or see what the rest of your class has built! Your changes will automatically be saved and shared with your classmates." -# view_gallery: "View Gallery" -# project_published_noty: "Your level has been published!" -# keep_editing: "Keep Editing" - -# play_game_dev_level: -# created_by: "Created by {{name}}" -# restart: "Restart Level" -# play: "Play Level" -# play_more_codecombat: "Play More CodeCombat" -# default_student_instructions: "Click to control your hero and win your game!" - + infinite_loop_reset_level: "איפוס שלב" + infinite_loop_comment_out: "סמן את הקוד שלי כהערות" + tip_toggle_play: "הקישו על Ctrl+P כדי להפעיל/להשהות." + tip_scrub_shortcut: "הקישו על Ctrl+[‎ ועל Ctrl+]‎ כדי להריץ אחורה וקדימה." + tip_guide_exists: "כדי לקבל מידע שימושי, לחצו על המדריך בתוך תפריט המשחק (בראש הדף)." + tip_open_source: "CodeCombat בנוי מ-100% קוד פתוח!" + tip_tell_friends: "נהנים מ-CodeCombat? ספרו עלינו לחברים שלכם!" + tip_beta_launch: "CodeCombat הושק בגרסת ביתא באוקטובר 2013." + tip_think_solution: "חשבו על הפתרון, לא על הבעיה." + tip_theory_practice: "בתאוריה, אין הבדל בין תאוריה למעשה. אבל באופן מעשי, יש. - יוגי ברה" + tip_error_free: "יש שתי דרכים לכתוב תכניות בלי שגיאות; רק השלישית פועלת. - אלן פרליס" + tip_debugging_program: "אם איתור באגים הוא התהליך שבו מנקים באגים, תכנות הוא כנראה התהליך שבו מוסיפים אותם. - אדסחר ו. דייקסטרה" + tip_forums: "בואו לבקר אצלנו בפורומים ולספר לנו מה דעתכם!" + tip_baby_coders: "בעתיד, אפילו תינוקות יהיו קוסמי-על." + tip_morale_improves: "הטעינה תימשך עד לשיפור המורל." + tip_all_species: "אנו מאמינים שלכל היצורים מגיעה הזדמנות שווה ללמוד לתכנת." + tip_reticulating: "מרשתים עמודי שדרה." + tip_harry: "הו, קוסמים, " + tip_great_responsibility: "עם יכולת קידוד גדולה מגיעה אחריות גדולה לאיתור באגים." + tip_munchkin: "אם לא תאכל ירקות, יבוא לתפוס אותך ננס כשתלך לישון." + tip_binary: "בעולם יש רק עשרה סוגי אנשים: אלה שמבינים בינארי, ואלה שלא." + tip_commitment_yoda: "מתכנת צריך מסירות עמוקה ורצינות גמורה. ~ יודה" + tip_no_try: 'עשה. או אל תעשה. אין "לנסות". - יודה' + tip_patience: "אתה להיות סבלני חייב, פאדאוואן הצעיר. - יודה" + tip_documented_bug: "באג עם תיעוד הוא לא באג; הוא פיצ'ר." + tip_impossible: "דברים תמיד נראים בלתי-אפשריים, עד שעושים אותם. - נלסון מנדלה" + tip_talk_is_cheap: "קל לדבר. תראו לי את הקוד. - לינוס טורבאלדס" + tip_first_language: "הדבר הכי מסוכן שאתם עלולים ללמוד הוא שפת התכנות הראשונה שלכם. - אלן קיי" + tip_hardware_problem: "ש: כמה מתכנתים צריך כדי להחליף נורה? ת: אף לא אחד, זו בעיית חומרה." + tip_hofstadters_law: "חוק הופשטטר: דברים תמיד לוקחים יותר זמן משאתם מצפים, גם כשלוקחים בחשבון את חוק הופשטטר." + tip_premature_optimization: "מיטוב מוקדם הוא אם כל רע. - דונלד קנות" + tip_brute_force: "כשיש ספק - השתמשו בכוח. - קן תומפסון" + tip_extrapolation: "בעולם יש שני סוגי אנשים: אלה שיכולים להסיק דברים מנתונים חסרים..." + tip_superpower: "קידוד הוא הדבר הכי קרוב לכוח-על." + tip_control_destiny: "בקוד פתוח אמיתי, יש לכם שליטה על הגורל של עצמכם. - לינוס טורבאלדס" + tip_no_code: "הקוד הכי מהיר הוא היעדר קוד." + tip_code_never_lies: "הקוד לא משקר אף פעם, ההערות לפעמים כן. - רון ג'פריז" + tip_reusable_software: "לפני שאפשר יהיה לעשות בתוכנה שימוש חוזר, צריך שיתאפשר לעשות בה שימוש." + tip_optimization_operator: "לכל שפה יש אופרטור מיטוב. ברוב השפות, האופרטור הוא '//'" + tip_lines_of_code: "מי שמודד התקדמות בתכנות לפי מספר השורות בקוד דומה למי שמודד התקדמות בטכנולוגיית המטוסים לפי משקל. - ביל גייטס" + tip_source_code: "אני רוצה לשנות את העולם, אבל לא נותנים לי את קוד המקור." + tip_javascript_java: "הקשר בין Java ל-JavaScript הוא כמו הקשר בין מדף למדפסת. - כריס הילמן" + tip_move_forward: "מה שלא תעשו, המשיכו המשיכו להתקדם. - מרטין לותר קינג ג'וניור." + tip_google: "יש לכם בעיה שאתם לא מצליחים לפתור? גגלו אותה!" + tip_adding_evil: "להוסיף קמצוץ רוע." + tip_hate_computers: "זה מה שקורה עם אנשים שחושבים שהם שונאים מחשבים. הם בעצם שונאים מתכנתים גרועים. - לארי ניבן" + tip_open_source_contribute: "אתם יכולים לעזור ל-CodeCombat להשתפר!" + tip_recurse: "טעויות זה אנושי, רקורסיה זה אלוהי. - ל. פיטר דויטש" + tip_free_your_mind: "אתה חייב לשחרר הכול, ניאו. פחד, ספק, אי אמון. תשתחרר. - מורפיאוס" + tip_strong_opponents: "גם ליריב החזק ביותר יש נקודת תורפה. - איטאצ'י אוצ'ינה" + tip_paper_and_pen: "לפני שמתחילים לכתוב קוד, תמיד אפשר לתכנן עם דף נייר ועט." + tip_solve_then_write: "קודם, צריך פתור את הבעיה. אחר כך, לכתוב את הקוד. - ג'ון ג'ונסון" + tip_compiler_ignores_comments: "לפעמים נדמה לי שהמהדר מתעלם מההערות שלי." + tip_understand_recursion: "כדי להבין רקורסיה, צריך להבין רקורסיה." + tip_life_and_polymorphism: "קוד פתוח הוא כמו מבנה הטרוגני פולימורפי לחלוטין: מקבל את כל הסוגים." + tip_mistakes_proof_of_trying: "טעויות בקוד רק מוכיחות שניסית." + tip_adding_orgres: "אוספים את הענקים." + tip_sharpening_swords: "מחדדים החרבות." + tip_ratatouille: "שאף אחד לא יגדיר לך גבולות בגלל המקום שממנו באת. הגבול היחיד הוא הנשמה שלך. - רטטוי, גוסטו" + tip_nemo: "כשהחיים קשים, יודע מה צריך לעשות? להמשיך לשחות, להמשיך לשחות. - דורי, מוצאים את נמו" + tip_internet_weather: "פשוט תעברו לגור באינטרנט, נהדר כאן. אפשר לגור בפנים, ומזג האוויר תמיד מצוין. - ג'ון גרין" + tip_nerds: "לחנונים מותר לאהוב דברים, לאהוב דברים כמו כשאתה קופץ-למעלה-ולמטה-בכיסא-ולא-יכול-לשלוט-בעצמך. - ג'ון גרין" + tip_self_taught: "לימדתי את עצמי 90% מכל מה שלמדתי. וזה נורמלי! - הנק גרין" + tip_luna_lovegood: "אל תדאג, אתה שפוי ממש כמוני. - לונה לאבגוד" + tip_good_idea: "הדרך הכי טובה לחשוב רעיון טוב היא לחשוב על הרבה רעיונות. - לינוס פאולינג" + tip_programming_not_about_computers: "מחשבים הם לא העיקר במדעי המחשב, כמו שטלסקופים הם לא העיקר באסטרונומיה. - אדסחר דייקסטרה" + tip_mulan: "האמינו שאתם יכולים, וזה יהיה נכון. - מולאן" + project_complete: "הפרויקט הושלם!" + share_this_project: "שתפו את הפרויקט עם חברים או בני משפחה:" + ready_to_share: "מוכנים לפרסם את הפרויקט שלכם?" + click_publish: "לחצו על \"פרסם\" כדי שהפרויקט יופיע בגלריה של הכיתה, ובואו לראות מה חבריכם לכיתה בנו! תוכלו לחזור לכאן כדי להמשיך ולעבוד על פרויקט זה. כל שינוי נוסף יישמר באופן אוטומטי וישותף עם חבריכם לכיתה." + already_published_prefix: "השינויים שביצעתם פורסמו בגלריה של הכיתה." + already_published_suffix: "המשיכו לנסות דברים ולשפר את הפרויקט עוד יותר, או בואו לראות מה בנו שאר חבריכם לכיתה! השינויים שתבצעו יישמרו באופן אוטומטי וישותפו עם חבריכם לכיתה." + view_gallery: "הצג גלריה" + project_published_noty: "השלב שלכם פורסם!" + keep_editing: "המשך בעריכה" + + play_game_dev_level: + created_by: "נוצר על-ידי {{name}}" + restart: "התחל שלב מחדש" + play: "שחקו בשלב" + play_more_codecombat: "שחקו עוד CodeCombat" + default_student_instructions: "לחצו כדי לשלוט בגיבור שלכם ולנצח במשחק!" + game_menu: - inventory_tab: "תיק" - save_load_tab: "טען/שמור" + inventory_tab: "ציוד" + save_load_tab: "שמור/טען" options_tab: "אפשרויות" guide_tab: "מדריך" - guide_video_tutorial: "סרטוני הדרכה" - guide_tips: "טיפים" - multiplayer_tab: "רב משתתפים" - auth_tab: "הירשם" - inventory_caption: "צייד את הגיבור שלך" - choose_hero_caption: "בחר גיבור, שפה" - save_load_caption: "וצפה בהיסטוריה..." - options_caption: "שנה הגדרות" - guide_caption: "מסמכים וטיפים" - multiplayer_caption: "!שחק עם חברים" - auth_caption: "שמור שינויים" - + guide_video_tutorial: "הדרכת וידאו" + guide_tips: "עצות" + multiplayer_tab: "ריבוי שחקנים" + auth_tab: "הרשמה" + inventory_caption: "ציידו את הגיבור" + choose_hero_caption: "בחרו גיבור, שפה" + save_load_caption: "... וצפו בהיסטוריה" + options_caption: "קבעו הגדרות" + guide_caption: "מסמכים ועצות" + multiplayer_caption: "שחקו עם חברים!" + auth_caption: "שמרו את התקדמותכם." + leaderboard: - view_other_solutions: "צפה בפתרונות אחרים" # {change} - scores: "תוצאות" - top_players: "סדר שחקנים טובים ביותר לפי" + view_other_solutions: "הצג טבלאות מובילים" + scores: "נקודות" + top_players: "שחקנים מובילים לפי" day: "היום" week: "השבוע" - all: "אי-פעם" -# latest: "Latest" + all: "כל הזמנים" + latest: "אחרון" time: "זמן" - damage_taken: "נזק שנגרם לשחקן" - damage_dealt: "מזק שהשחקן גרם" + damage_taken: "נזק שנספג" + damage_dealt: "נזק שנגרם" difficulty: "רמת קושי" gold_collected: "זהב שנאסף" - + inventory: - equipped_item: "מצוייד" + equipped_item: "ציוד נוכחי" required_purchase_title: "נדרש" available_item: "זמין" restricted_title: "מוגבל" - should_equip: "(לחץ פעמיים כדי להצטייד/ללבוש)" - equipped: "(מצוייד/לבוש)" + should_equip: "(לחצו פעמיים כדי לצייד)" + equipped: "(מצויד)" locked: "(נעול)" restricted: "(מוגבל בשלב הזה)" - equip: "לבש/הצטייד" + equip: "צייד" unequip: "הסר" - + buy_gems: few_gems: "כמה אבני חן" - pile_gems: "ערמת אבני חן" + pile_gems: "ערימת אבני חן" chest_gems: "תיבת אבני חן" - purchasing: "...קונה" - declined: ".כרטיס האשראי נדחה" - retrying: ".תקלה בשרת, מנסה שוב" - prompt_title: ".אין לך מספיק אבני חן" - prompt_body: "?רוצה לקבל עוד" - prompt_button: "היכנס לחנות" - recovered: ".רכישה אחרונה שוחזרה. טען את הדף מחדש בבקשה" - price: "x{{gems}} לחודש" -# buy_premium: "Buy Premium" -# purchase: "Purchase" -# purchased: "Purchased" - -# earn_gems: -# prompt_title: "Not Enough Gems" -# prompt_body: "Keep playing to earn more!" - + purchasing: "מבצע רכישה..." + declined: "הכרטיס נדחה" + retrying: "אירעה שגיאה בשרת, מנסה שוב." + prompt_title: "אין מספיק אבני חן" + prompt_body: "רוצים להשיג עוד?" + prompt_button: "עבור לחנות" + recovered: "שוחזרה רכישת אבני חן קודמת. נא לרענן את הדף." + price: "x{{gems}} לחודש" + buy_premium: "קנה פרימיום" + purchase: "רכישה" + purchased: "נרכש" + + earn_gems: + prompt_title: "אין מספיק אבני חן" + prompt_body: "המשיכו לשחק כדי להשיג עוד!" + subscribe: -# subscribe_modal_title: "CodeCombat Premium" - comparison_blurb: ".CodeCombatחדד את כישוריך עם מנוי ל" # {change} -# premium_pricing_prefix: "Get Premium for just" -# premium_pricing_suffix: "and become a master coder." -# premium: "Premium" # Make sure the following feature translations don't go onto two lines + premium_already_subscribed: "אתם כבר רשומים למנוי פרימיום!" + subscribe_modal_title: "CodeCombat פרימיום" + comparison_blurb: "הפכו לאשפי קוד - הירשמו היום למנוי פרימיום!" + premium_pricing_prefix: "קנו מנוי פרימיום במחיר" + premium_pricing_suffix: "בלבד, והפכו לאשפי קוד." + premium: "פרימיום" # Make sure the following feature translations don't go onto two lines free: "חינם" month: "חודש" - must_be_logged: "עליך להיות מחובר תחילה. אנא צור חשבון חדש או היכנס לחשבונך באמצעות התפריט למעלה." - subscribe_title: "רכוש מנוי" # Actually used in subscribe buttons, too - unsubscribe: "הסר מנוי" - confirm_unsubscribe: "אשר הסרת מנוי" - never_mind: "!לא משנה, אני עדיין אוהב אותך" - thank_you_months_prefix: ".תודה שתמכת בנו בחודשים האחרונים" - thank_you_months_suffix: "" - thank_you: "CodeCombat תודה על התמיכה ב" - sorry_to_see_you_go: ".מצטערים לראות אותך הולך! ספר לנו בבקשה מה יכולנו לשפר" - unsubscribe_feedback_placeholder: "?או, מה עשינו" - parent_button: "שאל את ההורים" - parent_email_description: ".עבורך CodeCombat אנחנו נדאג לשלוח להם מייל כדי שיקנו מנוי" - parent_email_input_invalid: ".כתובת האי-מייל שהוזנה שגויה" - parent_email_input_label: "כתובת מייל של ההורה" - parent_email_input_placeholder: "הכנס כתובת מייל של ההורה" - parent_email_send: "שלח מייל" - parent_email_sent: "מייל נשלח" - parent_email_title: "?מהו המייל של הוריך" + must_be_logged: " יש להתחבר תחילה. נא ליצור חשבון או להתחבר מהתפריט שלמעלה." + subscribe_title: "צור מנוי" # Actually used in subscribe buttons, too + unsubscribe: "בטל מנוי" + confirm_unsubscribe: "אשר ביטול מנוי" + never_mind: "לא חשוב, אני עדיין אוהב אותך" + thank_you_months_prefix: "אנו מודים לכם על התמיכה בנו במשך" + thank_you_months_suffix: "החודשים האחרונים." + thank_you: "אנו מודים לכם על התמיכה ב-CodeCombat." + sorry_to_see_you_go: "חבל שאתם עוזבים! אנא ספרו לנו כיצד נוכל להשתפר." + unsubscribe_feedback_placeholder: "אוי, מה עשינו?" + parent_button: "שאל הורה" + parent_email_description: "אנו נשלח אל ההורה הודעה בדואר אלקטרוני, עם אפשרות לקנות מנוי ל-CodeCombat." + parent_email_input_invalid: "כתובת דואר אלקטרוני לא חוקית." + parent_email_input_label: "כתובת דואר אלקטרוני של הורה" + parent_email_input_placeholder: "הזינו כתובת דואר אלקטרוני של הורה" + parent_email_send: "שלח דואר אלקטרוני" + parent_email_sent: "הודעת דואר אלקטרוני נשלחה!" + parent_email_title: "מהי כתובת הדואר האלקטרוני של ההורה?" parents: "להורים" - parents_title: "ילדכם ילמד לתכנת." # {change} -# parents_blurb1: "Your child has played __nLevels__ levels and learned programming basics. Help cultivate their interest and buy them a subscription so they can keep playing." -# parents_blurb1a: "Computer programming is an essential skill that your child will undoubtedly use as an adult. By 2020, basic software skills will be needed by 77% of jobs, and software engineers are in high demand across the world. Did you know that Computer Science is the highest-paid university degree?" -# parents_blurb2: "For ${{price}} USD/mo, your child will get new challenges every week and personal email support from professional programmers." -# parents_blurb3: "No Risk: 100% money back guarantee, easy 1-click unsubscribe." -# payment_methods: "Payment Methods" -# payment_methods_title: "Accepted Payment Methods" -# payment_methods_blurb1: "We currently accept credit cards and Alipay. You can also PayPal {{three_month_price}} USD to nick@codecombat.com with your account email in the memo to purchase three months' subscription and gems, or ${{year_price}} for a year." -# payment_methods_blurb2: "If you require an alternate form of payment, please contact" -# sale_button: "Sale!" -# sale_button_title: "Save $21 when you purchase a 1 year subscription" + parents_title: "הורה יקר: הילד או הילדה שלכם לומדים איך לכתוב קוד. האם תעזרו להם להמשיך?" + parents_blurb1: "הילד/ה שלכם שיחק/ה ב-__nLevels__ שלבים, ולמד/ה עקרונות תכנות בסיסיים. עזרו לטפח את העניין שלו/ה, וקנו מנוי שיאפשר לו/ה להמשיך ולשחק." + parents_blurb1a: "תכנות מחשבים הוא מיומנות חיונית, אשר ללא ספק תשמש את ילדכם כאדם בוגר. עד שנת 2020, 77% מהמשרות ידרשו כישורי תוכנה בסיסיים, ומהנדסי תוכנה נמצאים בביקוש גבוה בכל העולם. הידעת? מדעי המחשב הם התואר האוניברסיטאי עם השכר הגבוה ביותר." + parents_blurb2: "במחיר ${{price}} דולר לחודש, הילדים מקבלים אתגרים חדשים מדי שבוע ותמיכה אישית בדואר אלקטרוני ממתכנתים מקצועיים." + parents_blurb3: "בלי סיכון: 100% החזר כספי מובטח, ביטול המנוי בלחיצה אחת קלה." + payment_methods: "שיטות תשלום" + payment_methods_title: "שיטות תשלום אפשריות" + payment_methods_blurb1: "בשלב זה, אנו מקבלים כרטיסי אשראי ו-Alipay. ניתן גם לשלוח ב-PayPal סכום של {{three_month_price}} USD אל nick@codecombat.com ולרשום את כתובת הדואר האלקטרוני של חשבונכם בשדה התזכיר (Memo) כדי לרכוש אבני חן ומנוי לשלושה חודשים או ${{year_price}} עבור שנה אחת." + payment_methods_blurb2: "אם ברצונכם להשתמש בשיטת תשלום חלופית, נא לפנות אל" + sale_button: "מבצע!" + sale_button_title: "חסכו $21 ברכישת מנוי לשנה אחת" stripe_description: "מנוי חודשי" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" -# buy_now: "Buy Now" - subscription_required_to_play: "יש צורך במנוי כדי לשחק בשלב זה." - unlock_help_videos: "רכוש מנוי כדי לפתוח את כל הדרכות הוידאו." -# personal_sub: "Personal Subscription" # Accounts Subscription View below -# loading_info: "Loading subscription information..." -# managed_by: "Managed by" -# will_be_cancelled: "Will be cancelled on" -# currently_free: "You currently have a free subscription" -# currently_free_until: "You currently have a subscription until" -# free_subscription: "Free subscription" -# was_free_until: "You had a free subscription until" -# managed_subs: "Managed Subscriptions" -# subscribing: "Subscribing..." -# current_recipients: "Current Recipients" -# unsubscribing: "Unsubscribing" -# subscribe_prepaid: "Click Subscribe to use prepaid code" -# using_prepaid: "Using prepaid code for monthly subscription" -# feature_levels: "Access __premiumLevelsCount__ levels available" -# feature_gems: "Receive __gems__ gems per month" -# feature_heroes: "Unlock exclusive heroes" -# feature_games: "Make games for your friends" -# feature_websites: "Build websites and apps" -# feature_items: "Equip more powerful items" -# month_price: "$__price__/mo" -# lifetime: "Lifetime Subscription" -# lifetime_price: "$__price__" -# year_subscription: "Yearly Subscription" -# year_price: "$__price__/year" -# kids_message_1: "Kids! We'll send an email to your parents so they can purchase a subscription for you." -# kids_message_2: "Ask Your Parent" -# support_part1: "Need help with payment options? Email" -# support_part2: "support@codecombat.com" -# support_part3: "if you have any questions." -# you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" -# you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" -# you_will_be_charged: "You will be charged $__priceString__ one time." -# choose_payment_method: "Choose Payment Method" -# pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" -# paypal_payment_error: "We encountered an error while charging PayPal." - -# announcement: -# now_available: "Now available for subscribers!" -# subscriber: "subscriber" -# cuddly_companions: "Cuddly Companions!" # Pet Announcement Modal -# kindling_name: "Kindling Elemental" -# kindling_description: "Kindling Elementals just want to keep you warm at night. And during the day. All the time, really." -# griffin_name: "Baby Griffin" -# griffin_description: "Griffins are half eagle, half lion, all adorable." -# raven_name: "Raven" -# raven_description: "Ravens are excellent at gathering shiny bottles full of health for you." -# mimic_name: "Mimic" -# mimic_description: "Mimics can pick up coins for you. Move them on top of coins to increase your gold supply." -# cougar_name: "Cougar" -# cougar_description: "Cougars like to earn a PhD by Purring Happily Daily." -# fox_name: "Blue Fox" -# fox_description: "Blue foxes are very clever and love digging in the dirt and snow!" -# pugicorn_name: "Pugicorn" -# pugicorn_description: "Pugicorns are some of the rarest creatures and can cast spells!" -# wolf_name: "Wolf Pup" -# wolf_description: "Wolf pups excel in hunting, gathering, and playing a mean game of hide-and-seek!" -# ball_name: "Red Squeaky Ball" -# ball_description: "ball.squeak()" -# collect_pets: "Collect pets for your heroes!" -# each_pet: "Each pet has a unique helper ability!" -# upgrade_to_premium: "Become a {{subscriber}} to equip pets." -# play_second_kithmaze: "Play {{the_second_kithmaze}} to unlock the Wolf Pup!" -# the_second_kithmaze: "The Second Kithmaze" -# keep_playing: "Keep playing to discover the first pet!" -# coming_soon: "Coming soon" -# ritic: "Ritic the Cold" # Ritic Announcement Modal -# ritic_description: "Ritic the Cold. Trapped in Kelvintaph Glacier for countless ages, finally free and ready to tend to the ogres that imprisoned him." -# ice_block: "A block of ice" -# ice_description: "There appears to be something trapped inside..." -# blink_name: "Blink" -# blink_description: "Ritic disappears and reappears in a blink of an eye, leaving nothing but a shadow." -# shadowStep_name: "Shadowstep" -# shadowStep_description: "A master assassin knows how to walk between the shadows." -# tornado_name: "Tornado" -# tornado_description: "It is good to have a reset button when one's cover is blown." -# wallOfDarkness_name: "Wall of Darkness" -# wallOfDarkness_description: "Hide behind a wall of shadows to prevent the gaze of prying eyes." - -# premium_features: -# get_premium: "Get
CodeCombat
Premium" # Fit into the banner on the /features page -# master_coder: "Become a Master Coder by subscribing today!" -# subscribe_now: "Subscribe Now" -# hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." -# hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" -# hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" -# pet_blurb_2: "Collect all the pets to discover their unique abilities!" -# pet_caption: "Adopt pets to accompany your hero!" -# game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" -# game_dev_caption: "Design your own games to challenge your friends!" -# everything_in_premium: "Everything you get in CodeCombat Premium:" -# list_gems: "Receive bonus gems to buy gear, pets, and heroes" -# list_levels: "Gain access to __premiumLevelsCount__ more levels" -# list_heroes: "Unlock exclusive heroes, include Ranger and Wizard classes" -# list_game_dev: "Make and share games with friends" -# list_web_dev: "Build websites and interactive apps" -# list_items: "Equip Premium-only items like pets" -# list_support: "Get Premium support to help you debug tricky code" -# list_clans: "Create private clans to invite your friends and compete on a group leaderboard" - + buy_now: "קנה כעת" + subscription_required_to_play: "נדרש מנוי כדי לשחק בשלב זה." + unlock_help_videos: "הירשמו כמנוי כדי לפתוח את כל ההדרכות בווידאו." + personal_sub: "מנוי אישי" # Accounts Subscription View below + loading_info: "טוען פרטי מנוי..." + managed_by: "מנוהל על-ידי" + will_be_cancelled: "יבוטל ב:" + currently_free: "יש לכם כעת מנוי חינם" + currently_free_until: "יש לכם כעת מנוי עד לתאריך" + free_subscription: "מנוי חינם" + was_free_until: "היה לך מנוי חינם עד" + managed_subs: "מנויים מנוהלים" + subscribing: "נרשם כמנוי..." + current_recipients: "נמענים נוכחיים" + unsubscribing: "מבטל מנוי" + subscribe_prepaid: "לחצו על 'צור מנוי' כדי להשתמש בקוד בתשלום מראש" + using_prepaid: "משתמש בקוד בתשלום מראש עבור מנוי חודשי" + feature_levels: "גישה אל __premiumLevelsCount__ שלבים זמינים" + feature_gems: "קבלו __gems__ אבני חן כל חודש" + feature_heroes: "פתיחה של גיבורים בלעדיים" + feature_games: "ליצור משחקים עבור חברים" + feature_websites: "בניית אתרי אינטרנט ויישומים" + feature_items: "פריטים חזקים יותר לציוד" + month_price: "$__price__ לחודש" + lifetime: "מנוי לכל החיים" + lifetime_price: "$__price__" + year_subscription: "מנוי שנתי" + year_price: "$__price__ לשנה" + kids_message_1: "ילדים! אנו נשלח להורים הודעה בדואר אלקטרוני, כדי שהם יוכלו לרכוש עבורכם מנוי." + kids_message_2: "שאל הורה" + support_part1: "זקוקים לעזרה עם אפשרויות התשלום? שלחו דואר אלקטרוני לכתובת" + support_part2: "support@codecombat.com" + support_part3: "בכל שאלה." + you_are_purchasing_year_sub: "אתם רוכשים כעת מנוי פרימיום שנתי!" + you_are_purchasing_lifetime_sub: "אתם רוכשים כעת מנוי פרימיום לכל החיים!" + you_will_be_charged: "תחויבו בסכום חד-פעמי של $__priceString__." + choose_payment_method: "בחר שיטת תשלום" + pay_with_credit_card_or_bitcoin: "תשלום באמצעות כרטיס אשראי/ביטקוין" + paypal_payment_error: "נתקלנו בשגיאה בחיוב דרך PayPal." + + announcement: + now_available: "כעת זמין למנויים!" + subscriber: "מנוי" + cuddly_companions: "בני לוויה חמודים!" # Pet Announcement Modal + kindling_name: "יסודן אש קטן" + kindling_description: "יסודני אש קטנים רק רוצים לחמם אתכם בלילה. ובמהלך היום. כל הזמן, בעצם." + griffin_name: "גור גריפונים" + griffin_description: "גריפונים הם חצי נשר, חצי אריה, ומאה אחוז מקסימים." + raven_name: "עורב" + raven_description: "העורבים מצטיינים באיסוף של בקבוקים נוצצים שמלאים בבריאות עבורכם." + mimic_name: "חקיין" + mimic_description: "חקיינים יכולים לאסוף עבורכם מטבעות. שימו אותם על מטבעות כדי להגדיל את כמות הזהב שלכם." + cougar_name: "פומה" + cougar_description: 'לפומה יש תואר ד"ר (דברים רכים).' + fox_name: "שועל כחול" + fox_description: "השועלים הכחולים פקחים ביותר, ואוהבים לחפור באדמה ובשלג!" + pugicorn_name: "פאגקרן" + pugicorn_description: "פאגקרן נמנים על היצורים הנדירים ביותר, והם מסוגלים להטיל לחשים!" + wolf_name: "גור זאבים" + wolf_description: "גור הזאבים מצטיין בציד, באיסוף ובמשחקי מחבואים!" + ball_name: "כדור אדום מצפצף" + ball_description: "ball.squeak()" + collect_pets: "אספו חיות מחמד עבור הגיבורים שלכם!" + each_pet: "לכל חיית מחמד יש יכולת עזרה ייחודית!" + upgrade_to_premium: "הירשמו בתור {{subscriber}} כדי לצייד חיות מחמד." + play_second_kithmaze: "שחקו בשלב {{the_second_kithmaze}} כדי לקבל את גור הזאבים!" + the_second_kithmaze: "מבוך הקית' השני" + keep_playing: "המשיכו לשחק כדי לגלות את חיית המחמד הראשונה!" + coming_soon: "בקרוב" + ritic: "ריטיק הקר" # Ritic Announcement Modal + ritic_description: "ריטיק הקר. נלכד למשך אינספור עידנים בתוך הקרחון של קלווינטאף, וכעת הוא סוף סוף חופשי ומוכן לטפל בענקים שכלאו אותו." + ice_block: "גוש קרח" + ice_description: "נראה שמשהו לכוד בפנים..." + blink_name: "הבהוב" + blink_description: "ריטיק נעלם ומופיע מחדש בהבהוב, ולא מותיר אחריו דבר מלבד צל." + shadowStep_name: "צעד-צל" + shadowStep_description: "מתנקש מומחה יודע כיצד להלך בין הצללים." + tornado_name: "טורנדו" + tornado_description: "טוב שיש לחצן איפוס, ברגע שתופסים אותך." + wallOfDarkness_name: "קיר חושך" + wallOfDarkness_description: "הסתתרו מאחורי קיר צללים, כדי לחמוק מעיניים סקרניות." + + premium_features: + get_premium: "מנוי
CodeCombat
פרימיום" # Fit into the banner on the /features page + master_coder: "הירשמו עוד היום כדי להפוך לאשפי תכנות!" + subscribe_now: "הירשמו כעת" + hero_blurb_1: "קבלו גישה אל __premiumHeroesCount__ super-charged גיבורים בלעדיים למנויים בלבד! קבלו את כוחו הבלתי ניתן לעצירה של אוקאר הך-רגל, את הדיוק הקטלני של נאריה בת-עלה או את היכולת לזמן שלדים \"חמודים\" עם נלפאר מעיר הקברים." + hero_blurb_2: "לוחמי הפרימיום פותחים עבורכם כישורי לחימה מדהימים כגון זעקת קרב, רקיעת רגל והטלת אויב. תוכלו גם לשחק בתור סייר, ולהשתמש בהתגנבות ובקשתות, בסכיני הטלה ובמלכודות! נסו את כישוריכם בתור קוסמי קידוד של ממש, ונצלו את כוחות הקסם של הקדמונים, היסודות ועולם המתים!" + hero_caption: "גיבורים מגניבים חדשים!" + pet_blurb_1: "חיות המחמד הן יותר מאשר בני לוויה חמודים - הן גם מספקות פונקציות ומתודות ייחודיות. גור הגריפונים מסוגל לשאת יחידות באוויר, גור הזאבים משחק תופסת עם חצי האויבים, אוהב לרדוף אחרי ענקים, והחקיין מושך מטבעות כמו מגנט!" # {change} + pet_blurb_2: "אספו את כל חיות המחמד כדי לגלות את יכולותיהן הייחודיות!" + pet_caption: "אמצו חיות מחמד שיתלוו לגיבורים שלכם!" + game_dev_blurb: "למדו איך לכתוב Script למשחקים, בנו שלבים חדשים ושתפו אותם עם חברים! הציבו את הפריטים שאתם רוצים, כתבו קוד עבור אופן פעולה ולוגיקה של יחידות, וגלו אם חבריכם יכולים לסיים את השלב!" + game_dev_caption: "עצבו משחקים משלכם כדי לתת אתגר לחברים!" + everything_in_premium: "כל מה שתקבלו ב-CodeCombat פרימיום:" + list_gems: "קבלו בונוס של אבני חן לקניית ציוד, חיות מחמד וגיבורים" + list_levels: "קבלו גישה אל __premiumLevelsCount__ שלבים נוספים" + list_heroes: "קבלו אפשרות לשחק בגיבורים בלעדיים, בכלל זה מקצועות הסייר והקוסם" + list_game_dev: "צרו משחקים ושתפו אותם עם חברים" + list_web_dev: "בנו אתרי אינטרנט ויישומים אינטראקטיביים" + list_items: "הצטיידו בפריטי פרימיום בלעדיים, כגון חיות מחמד" + list_support: "קבלו תמיכת פרימיום, שתעזור לכם לאתר באגים בקודים מסובכים" + list_clans: "צרו שבטים פרטיים, כדי להזמין חברים ולהתחרות בטבלה של קבוצות מובילות" + choose_hero: - choose_hero: "בחר גיבור" + choose_hero: "בחרו גיבור" programming_language: "שפת תכנות" - programming_language_description: "?באיזו שפת תכנות תרצה להשתמש" - default: ":ברירת מחדל" - experimental: "נסיוני" - python_blurb: "שפה פשוטה אך עוצמתית, מצויינת למתחילים ולמתקדמים" - javascript_blurb: "(.Java-השפה של הרשת. (שונה מ" - coffeescript_blurb: ".JavaScript-תחביר יפה יותר ל" - lua_blurb: ".שפה לכתיבת תסריטי משחק" -# java_blurb: "(Subscriber Only) Android and enterprise." - status: "סטטוס" - weapons: "נשקים" - weapons_warrior: "חרבות, טווח קצר - ללא קסם" - weapons_ranger: "קשתות, אקדחים - טווח ארוך, ללא קסם" - weapons_wizard: "שרביטים, מטות קסם - טווח ארוך, קסם" - attack: "עוצמה" # Can also translate as "Attack" - health: "נקודות חיים" + programming_language_description: "באיזו שפת תכנות תרצו להשתמש?" + default: "ברירת מחדל" + experimental: "ניסיוני" + python_blurb: "פשוטה אך חזקה, מצוינת למתחילים ולמומחים." + javascript_blurb: "השפה של האינטרנט. (לא זהה ל-Java.)" + coffeescript_blurb: "תחביר יפה יותר של JavaScript." + lua_blurb: "שפת כתיבת Script למשחקים." + java_blurb: "(למנויים בלבד) Android וארגוני." + status: "מצב" + weapons: "כלי נשק" + weapons_warrior: "חרבות - טווח קצר, ללא קסם" + weapons_ranger: "קשתות צלב, תותחים, טווח ארוך, ללא קסם" + weapons_wizard: "שרביטים, מטות - טווח ארוך, קסם" + attack: "נזק" # Can also translate as "התקפה" + health: "בריאות" speed: "מהירות" - regeneration: "השתקמות" - range: "טווח" # As in "attack or visual range" - blocks: "הגנה" # As in "this shield blocks this much damage" - backstab: "פגיעה בגב" # As in "this dagger does this much backstab damage" + regeneration: "התחדשות" + range: "טווח" # As in "attack or visual range" + blocks: "חוסם" # As in "this shield blocks this much damage" + backstab: "דקירה מאחור" # As in "this dagger does this much backstab damage" skills: "מיומנויות" - attack_1: "מבצעים" -# attack_2: "of listed" -# attack_3: "weapon damage." - health_1: "רווחים" -# health_2: "of listed" -# health_3: "armor health." - speed_1: "זז במהירות של" - speed_2: "מטרים לשנייה." - available_for_purchase: "ניתן לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store - level_to_unlock: ":שלב כדי לפתוח" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) - restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה" - + attack_1: "גורם" + attack_2: "מתוך" + attack_3: "נזק הנשק נקוב." + health_1: "מעניק" + health_2: "מתוך" + health_3: "בריאות שריון נקובה." + speed_1: "נע במהירות" + speed_2: "מטר לשנייה." + available_for_purchase: "זמין לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store + level_to_unlock: "שלב לפתיחה:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) + restricted_to_certain_heroes: "רק גיבורים מסוימים יכולים לשחק בשלב זה." + skill_docs: -# function: "function" # skill types -# method: "method" -# snippet: "snippet" -# number: "number" -# array: "array" -# object: "object" -# string: "string" - writable: "ניתן לכתיבה" # Hover over "attack" in Your Skills while playing a level to see most of this + function: "פונקציה" # skill types + method: "מתודה" + snippet: "מקטע" + number: "מספר" + array: "מערך" + object: "אובייקט" + string: "מחרוזת" + writable: "ניתן לכתיבה" # Hover over "attack" in Your Skills while playing a level to see most of this read_only: "לקריאה בלבד" action: "פעולה" - spell: "כישוף" + spell: "לחש" action_name: "שם" - action_cooldown: "לוקח" - action_specific_cooldown: ":זמן להתקררות" - action_damage: "עוצמה" + action_cooldown: "נמשך" + action_specific_cooldown: "השהיה" + action_damage: "נזק" action_range: "טווח" action_radius: "רדיוס" action_duration: "משך זמן" example: "דוגמה" - ex: "כגון" # Abbreviation of "example" + ex: "לדוגמה" # Abbreviation of "example" current_value: "ערך נוכחי" - default_value: "ערך רגיל" + default_value: "ערך ברירת מחדל" parameters: "פרמטרים" -# required_parameters: "Required Parameters" -# optional_parameters: "Optional Parameters" + required_parameters: "פרמטרים נדרשים" + optional_parameters: "פרמטרים אופציונליים" returns: "מחזיר" - granted_by: "הוענק ע\"י" - + granted_by: "מתקבל מ:" + save_load: granularity_saved_games: "נשמר" granularity_change_history: "היסטוריה" - + options: - general_options: "הגדרות כלליות" # Check out the Options tab in the Game Menu while playing a level - volume_label: "ווליום" + general_options: "אפשרויות כלליות" # Check out the Options tab in the Game Menu while playing a level + volume_label: "עוצמת קול" music_label: "מוזיקה" - music_description: "כבה/הפעל מוזיקת רקע" - editor_config_title: "תצורת(קונפיגורצית) עורך" -# editor_config_livecompletion_label: "Live Autocompletion" -# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." + music_description: "להפעלה/כיבוי של המוזיקה." + editor_config_title: "תצורת עורך" + editor_config_livecompletion_label: "השלמה אוטומטית חיה" + editor_config_livecompletion_description: "מציג הצעות להשלמה אוטומטית תוך כדי הקלדה." editor_config_invisibles_label: "הצג בלתי נראים" - editor_config_invisibles_description: "הצג בלתי נראים כמו רווחים וטאבים." -# editor_config_indentguides_label: "Show Indent Guides" -# editor_config_indentguides_description: "Displays vertical lines to see indentation better." - editor_config_behaviors_label: "התנהגוץ חכמה" -# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." - + editor_config_invisibles_description: "מציג בלתי נראים, כגון תווי רווח או טאב." + editor_config_indentguides_label: "הצג קווי הזחה" + editor_config_indentguides_description: "מציג קווים אנכיים, להצגה ברורה יותר של ההזחה." + editor_config_behaviors_label: "אופני פעולה חכמים" + editor_config_behaviors_description: "משלים באופן אוטומטי סוגריים מרובים, סוגריים מסולסלים ומירכאות." + about: -# main_title: "If you want to learn to program, you need to write (a lot of) code." -# main_description: "At CodeCombat, our job is to make sure you're doing that with a smile on your face." -# mission_link: "Mission" -# team_link: "Team" -# story_link: "Story" -# press_link: "Press" -# mission_title: "Our mission: make programming accessible to every student on Earth." -# mission_description_1: "Programming is magic. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using typed code." -# mission_description_2: "As it turns out, that enables them to learn faster too. WAY faster. It's like having a conversation instead of reading a manual. We want to bring that conversation to every school and to every student, because everyone should have the chance to learn the magic of programming." -# team_title: "Meet the CodeCombat team" -# team_values: "We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our GitHub contributors, because we value growth and learning in our team." - nick_title: "מתכנת" # {change} + main_title:"אם אתם רוצים ללמוד איך לתכנת, עליכם לכתוב (הרבה) קוד." + main_description: "המשימה שלנו ב-CodeCombat היא לוודא שאתם עושים זאת עם חיוך על הפנים." + mission_link: "המשימה" + team_link: "הצוות" + story_link: "הסיפור" + press_link: "עיתונות" + mission_title: "המשימה שלנו: להפוך את התכנות נגיש לכל תלמיד בעולם." + mission_description_1: "תכנות זה קסם. הוא היכולת ליצור דברים מתוך הדמיון עצמו. הקמנו את CodeCombat כדי להעניק ללומדים תחושה של כוחות קסם בקצות אצבעותיהם, דרך השימוש בקוד מוקלד." + mission_description_2: "מסתבר שזה גם מאפשר להם ללמוד מהר יותר. הרבה יותר מהר. זה דומה לניהול של שיחה, במקום קריאה של ספר הדרכה. אנו רוצים להביא את השיחה הזאת אל כל מוסד לימוד ואל כל תלמיד, משום שלכולם מגיעה הזדמנות ללמוד את הקסם שבתכנות." + team_title: "הכירו את הצוות של CodeCombat" + team_values: """ חשוב לנו שיח פתוח ומכבד, שבו הרעיונות הטובים ביותר מנצחים. ההחלטות שלנו מבוססות על חקר לקוחות, ותהליך העבודה שלנו מתמקד באספקה של תוצאות מוחשיות עבורם. כולם מעורבים בתהליך, מהמנכ\"ל ועד לתורמים שלנו ב-GitHub, משום שאצלנו בצוות נותנים חשיבות לצמיחה וללימוד.""" + nick_title: """מייסד-שותף, מנכ"ל""" nick_blurb: "גורו מוטיבציה" - matt_title: "מתכנת" # {change} - cat_title: "צ'יף אמן" # {change} - cat_blurb: "כשף אוויר" - scott_title: "מתכנת" # {change} - scott_blurb: "אחד סביר" -# maka_title: "Customer Advocate" -# maka_blurb: "Storyteller" -# rob_title: "Software Engineer" -# rob_blurb: "Codes things and stuff" -# josh_c_title: "Game Designer" -# josh_c_blurb: "Designs games" -# robin_title: "Product Manager" -# robin_blurb: "Ships things" + matt_title: "מייסד-שותף, מנהל טכנולוגיה ראשי" + cat_title: "מעצבת משחק" + cat_blurb: "איירבנדרית" + scott_title: "מייסד-שותף, הנדסת תוכנה" + scott_blurb: "אחד שחושב בהיגיון" + maka_title: "מקדם לקוחות" + maka_blurb: "מספר סיפורים" + rob_title: "הנדסת תוכנה" + rob_blurb: "קידוד וכאלה" + josh_c_title: "מעצב משחק" + josh_c_blurb: "מעצב משחקים" + robin_title: "מנהלת מוצר" + robin_blurb: "שולחת דברים" josh_title: "מעצב משחק" - josh_blurb: "ארצפה היא לבה" -# phoenix_title: "Software Engineer" -# nolan_title: "Territory Manager" -# elliot_title: "Partnership Manager" -# elliot_blurb: "Mindreader" -# lisa_title: "School Specialist" -# lisa_blurb: "A gritty one" -# sean_title: "Territory Manager" -# liz_title: "Territory Manager" -# retrostyle_title: "Illustration" - retrostyle_blurb: "RetroStyle Games" + josh_blurb: "הרצפה עשויה מלבה" + phoenix_title: "הנדסת תוכנה" + nolan_title: "מנהל טריטוריה" + elliot_title: "מנהל שותפויות" + elliot_blurb: "קורא מחשבות" + lisa_title: "מומחית לבתי ספר" + lisa_blurb: "טיפוס קשוח" + sean_title: "מנהל טריטוריה" + liz_title: "מנהלת טריטוריה" + retrostyle_title: "איור" + retrostyle_blurb: "משחקי רטרו" jose_title: "מוזיקה" -# jose_blurb: "Taking Off" -# bryukh_title: "Game Designer" -# bryukh_blurb: "Constructs puzzles" -# community_title: "...and our open-source community" -# community_subtitle: "Over 500 contributors have helped build CodeCombat, with more joining every week!" -# community_description_3: "CodeCombat is a" -# community_description_link_2: "community project" -# community_description_1: "with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our" -# community_description_link: "contribute page" -# community_description_2: "for more info." -# number_contributors: "Over 450 contributors have lent their support and time to this project." -# story_title: "Our story so far" -# story_subtitle: "Since 2013, CodeCombat has grown from a mere set of sketches to a living, thriving game." -# story_statistic_1a: "5,000,000+" -# story_statistic_1b: "total players" -# story_statistic_1c: "have started their programming journey through CodeCombat" -# story_statistic_2a: "We’ve been translated into over 50 languages — our players hail from" -# story_statistic_2b: "200+ countries" -# story_statistic_3a: "Together, they have written" -# story_statistic_3b: "1 billion lines of code and counting" -# story_statistic_3c: "across many different programming languages" -# story_long_way_1: "Though we've come a long way..." -# story_sketch_caption: "Nick's very first sketch depicting a programming game in action." -# story_long_way_2: "we still have much to do before we complete our quest, so..." -# jobs_title: "Come work with us and help write CodeCombat history!" -# jobs_subtitle: "Don't see a good fit but interested in keeping in touch? See our \"Create Your Own\" listing." -# jobs_benefits: "Employee Benefits" -# jobs_benefit_4: "Unlimited vacation" -# jobs_benefit_5: "Professional development and continuing education support – free books and games!" -# jobs_benefit_6: "Medical (gold), dental, vision, commuter" -# jobs_benefit_7: "Sit-stand desks for all" -# jobs_benefit_9: "10-year option exercise window" -# jobs_benefit_10: "Maternity leave: 10 weeks paid, next 6 @ 55% salary" -# jobs_benefit_11: "Paternity leave: 10 weeks paid" -# learn_more: "Learn More" -# jobs_custom_title: "Create Your Own" -# jobs_custom_description: "Are you passionate about CodeCombat but don't see a job listed that matches your qualifications? Write us and show how you think you can contribute to our team. We'd love to hear from you!" -# jobs_custom_contact_1: "Send us a note at" -# jobs_custom_contact_2: "introducing yourself and we might get in touch in the future!" -# contact_title: "Press & Contact" -# contact_subtitle: "Need more information? Get in touch with us at" -# screenshots_title: "Game Screenshots" -# screenshots_hint: "(click to view full size)" -# downloads_title: "Download Assets & Information" -# about_codecombat: "About CodeCombat" -# logo: "Logo" -# screenshots: "Screenshots" -# character_art: "Character Art" -# download_all: "Download All" -# previous: "Previous" -# location_title: "We're located in downtown SF:" - -# teachers: -# licenses_needed: "Licenses needed" - -# special_offer: -# special_offer: "Special Offer" -# project_based_title: "Project-Based Courses" -# project_based_description: "Web and Game Development courses feature shareable final projects." -# great_for_clubs_title: "Great for clubs and electives" -# great_for_clubs_description: "Teachers can purchase up to __maxQuantityStarterLicenses__ Starter Licenses per year." -# low_price_title: "Just __starterLicensePrice__ per student" -# low_price_description: "Starter Licenses are active for __starterLicenseLengthMonths__ months from purchase." -# three_great_courses: "Three great courses included in the Starter License:" -# license_limit_description: "Teachers can purchase up to __maxQuantityStarterLicenses__ Starter Licenses. You have already purchased __quantityAlreadyPurchased__. If you need more, contact __supportEmail__. Starter Licenses are valid for __starterLicenseLengthMonths__ months." -# student_starter_license: "Student Starter License" -# purchase_starter_licenses: "Purchase Starter Licenses" -# purchase_starter_licenses_to_grant: "Purchase Starter Licenses to grant access to __starterLicenseCourseList__" -# starter_licenses_can_be_used: "Starter Licenses can be used to assign additional courses immediately after purchase." -# pay_now: "Pay Now" -# we_accept_all_major_credit_cards: "We accept all major credit cards." -# cs2_description: "builds on the foundation from Introduction to Computer Science, diving into if-statements, functions, events and more." -# wd1_description: "introduces the basics of HTML and CSS while teaching skills needed for students to build their first webpage." -# gd1_description: "uses syntax students are already familiar with to show them how to build and share their own playable game levels." -# see_an_example_project: "see an example project" -# get_started_today: "Get started today!" -# want_all_the_courses: "Want all the courses? Request information on our Full Licenses." -# compare_license_types: "Compare License Types:" -# cs: "Computer Science" -# wd: "Web Development" -# wd1: "Web Development 1" -# gd: "Game Development" -# gd1: "Game Development 1" -# maximum_students: "Maximum # of Students" -# unlimited: "Unlimited" -# priority_support: "Priority support" -# yes: "Yes" -# price_per_student: "__price__ per student" -# pricing: "Pricing" -# free: "Free" -# purchase: "Purchase" -# courses_prefix: "Courses" -# courses_suffix: "" -# course_prefix: "Course" -# course_suffix: "" - -# teachers_quote: -# subtitle: "Get your students started in less than an hour. You'll be able to create a class, add students, and monitor their progress as they learn computer science." -# email_exists: "User exists with this email." -# phone_number: "Phone number" -# phone_number_help: "Where can we reach you during the workday?" -# primary_role_label: "Your Primary Role" -# role_default: "Select Role" -# primary_role_default: "Select Primary Role" -# purchaser_role_default: "Select Purchaser Role" -# tech_coordinator: "Technology coordinator" -# advisor: "Curriculum Specialist/Advisor" -# principal: "Principal" -# superintendent: "Superintendent" -# parent: "Parent" -# purchaser_role_label: "Your Purchaser Role" -# influence_advocate: "Influence/Advocate" -# evaluate_recommend: "Evaluate/Recommend" -# approve_funds: "Approve Funds" -# no_purchaser_role: "No role in purchase decisions" -# district_label: "District" -# district_name: "District Name" -# district_na: "Enter N/A if not applicable" -# organization_label: "School" -# school_name: "School Name" -# city: "City" -# state: "State" -# country: "Country" -# num_students_help: "How many students do you anticipate using CodeCombat with?" -# num_students_default: "Select Range" -# education_level_label: "Education Level of Students" -# education_level_help: "Choose as many as apply." -# elementary_school: "Elementary School" -# high_school: "High School" -# please_explain: "(please explain)" -# middle_school: "Middle School" -# college_plus: "College or higher" -# referrer: "How did you hear about us?" -# referrer_help: "For example: from another teacher, a conference, your students, Code.org, etc." -# anything_else: "Anything else we should know?" -# thanks_header: "Request Received!" -# thanks_sub_header: "Thanks for expressing interest in CodeCombat for your school." -# thanks_p: "We'll be in touch soon! If you need to get in contact, you can reach us at:" -# back_to_classes: "Back to Classes" -# finish_signup: "Finish creating your teacher account:" -# finish_signup_p: "Create an account to set up a class, add your students, and monitor their progress as they learn computer science." -# signup_with: "Sign up with:" -# connect_with: "Connect with:" -# conversion_warning: "WARNING: Your current account is a Student Account. Once you submit this form, your account will be updated to a Teacher Account." -# learn_more_modal: "Teacher accounts on CodeCombat have the ability to monitor student progress, assign licenses and manage classrooms. Teacher accounts cannot be a part of a classroom - if you are currently enrolled in a class using this account, you will no longer be able to access it once you update to a Teacher Account." -# create_account: "Create a Teacher Account" -# create_account_subtitle: "Get access to teacher-only tools for using CodeCombat in the classroom. Set up a class, add your students, and monitor their progress!" -# convert_account_title: "Update to Teacher Account" -# not: "Not" - + jose_blurb: "המראות" + bryukh_title: "מעצב משחק" + bryukh_blurb: "בונה פאזלים" + community_title: "...וקהילת הקוד הפתוח שלנו" + community_subtitle: "למעלה מ-500 תורמים כבר עוזרים לבנות את CodeCombat, ותורמים נוספים מצטרפים מדי שבוע!" + community_description_3: "CodeCombat הוא" + community_description_link_2: "פרויקט קהילתי" + community_description_1: "עם מאות שחקנים שמתנדבים ליצור שלבים, תורמים לקוד שלנו כדי להוסיף תכונות, מתקנים באגים, בודקים את המשחק ואפילו מתרגמים את המשחק ל-50 שפות עד כה. העובדים, התורמים והאתר מרוויחים משיתוף רעיונות וממאמצים משותפים, וכך גם קהילת הקוד הפתוח באופן כללי. האתר בנוי על אינספור פרויקטים של קוד פתוח, ואנו פועלים במתכונת של קוד פתוח כדי לתרום בחזרה לקהילה ולספק לשחקנים חובבי קוד פרויקט מוכר שאפשר לחקור ולערוך בו ניסויים. כל אחד יכול להצטרף לקהילה של CodeCombat! בואו לראות את" + community_description_link: "דף התרומות שלנו" + community_description_2: "למידע נוסף." + number_contributors: "למעלה מ-450 תורמים כבר העניקו תמיכה ותרמו מזמנם לפרויקט." + story_title: "סיפורנו עד כה" + story_subtitle: "מאז שנת 2013, CodeCombat צמח מאוסף של סקיצות למשחק חי ומשגשג." + story_statistic_1a: "יותר מ-5,000,000" + story_statistic_1b: "שחקנים בסך הכול" + story_statistic_1c: "התחילו את המסע שלהם בעולם התכנות דרך CodeCombat" + story_statistic_2a: "כבר תורגמנו ליותר מ-50 שפות - והשחקנים שלנו מגיעים" + story_statistic_2b: "מיותר מ-200 ארצות" + story_statistic_3a: "ביחד, הם כתבו" + story_statistic_3b: "מיליארד שורות קוד, והמספר הולך וגדל מדי יום" + story_statistic_3c: "בשפע של שפות תכנות שונות" + story_long_way_1: "למרות שכבר התקדמנו המון..." + story_sketch_caption: "הסקיצה הראשונה של ניק, שמתארת משחק תכנות בפעולה." + story_long_way_2: "אנחנו עוד צריכים לעשות הרבה כדי להשיג את המשימה שלנו, אז..." + jobs_title: "בואו לעבוד אתנו ולעזור לכתוב את ההיסטוריה של CodeCombat!" + jobs_subtitle: """לא מוצאים משהו שמתאים לכם, אבל רוצים לשמור על קשר? ראו תחת "יצירה משלך".""" + jobs_benefits: "הטבות עובדים" + jobs_benefit_4: "חופשות ללא הגבלה" + jobs_benefit_5: "התפתחות מקצועית והמשך תמיכה בהשכלה - ספרים ומשחקים בחינם!" + jobs_benefit_6: "ביטוח רפואי (זהב), שיניים, ראייה, נסיעות" + jobs_benefit_7: "עמדות ישיבה-עמידה לכולם" + jobs_benefit_9: "חלון של 10 שנים למימוש אופציות" + jobs_benefit_10: "חופשת לידה: 10 שבועות בתשלום, וששת השבועות הבאים ב-55% שכר" + jobs_benefit_11: "חופשת אב: 10 שבועות בתשלום" + learn_more: "מידע נוסף" + jobs_custom_title: "יצירה משלך" + jobs_custom_description: "מתלהבים מ-CodeCombat, אבל לא מוצאים כאן משרה שמתאימה לכישורים שלכם? כתבו וספרו לנו כיצד לדעתכם תוכלו לתרום לצוות שלנו. נשמח לשמוע מכם!" + jobs_custom_contact_1: "שלחו אלינו הודעה אל" + jobs_custom_contact_2: "כדי להציג את עצמכם, ואולי ניצור עמכם קשר בעתיד!" + contact_title: "עיתונות ויצירת קשר" + contact_subtitle: "זקוקים למידע נוסף? בואו ליצור אתנו קשר ב:" + screenshots_title: "צילומי מסך מהמשחק" + screenshots_hint: "(לחצו לגודל מלא)" + downloads_title: "הורדת נכסים ומידע" + about_codecombat: "אודות CodeCombat" + logo: "לוגו" + screenshots: "צילומי מסך" + character_art: "אמנות דמויות" + download_all: "הורד הכול" + previous: "הקודם" + location_title: "אנו יושבים בלב סן פרנסיסקו:" + + teachers: + licenses_needed: "רישיונות נדרשים" + + special_offer: + special_offer: "הצעה מיוחדת" + project_based_title: "קורסים מבוססי-פרויקט" + project_based_description: "הקורסים לפיתוח אינטרנט ומשחקים כוללים פרויקטי גמר ניתנים לשיתוף." + great_for_clubs_title: "מצוין למועדונים ולקורסי בחירה" + great_for_clubs_description: "מורים יכולים לרכוש עד __maxQuantityStarterLicenses__ רישיונות למתחילים בשנה." + low_price_title: "רק __starterLicensePrice__ לתלמיד" + low_price_description: "רישיונות למתחילים נשארים פעילים למשך __starterLicenseLengthMonths__ חודשים ממועד הרכישה." + three_great_courses: "ברישיון למתחילים כלולים שלושה קורסים מעולים:" + license_limit_description: "מורים יכולים לרכוש עד __maxQuantityStarterLicenses__ רישיונות למתחילים. כבר רכשתם __quantityAlreadyPurchased__. לקבלת רישיונות נוספים, נא לפנות אל __supportEmail__. רישיונות למתחילים נשארים בתוקף למשך __starterLicenseLengthMonths__ חודשים." + student_starter_license: "רישיון תלמיד למתחילים" + purchase_starter_licenses: "רכישת רישיונות למתחילים" + purchase_starter_licenses_to_grant: "רכשו רישיונות למתחילים כדי להעניק גישה אל __starterLicenseCourseList__" + starter_licenses_can_be_used: "באמצעות רישיונות למתחילים, ניתן להקצות קורסים נוספים מיד לאחר הרכישה." + pay_now: "שלם כעת" + we_accept_all_major_credit_cards: "אנו מקבלים את כל כרטיסי האשראי הנפוצים." + cs2_description: """ממשיך ובונה על היסוד מ'מבוא למדעי המחשב', ומתעמק בפסוקי "אם", בפונקציות, באירועים ועוד.""" + wd1_description: "מציג את עקרונות הבסיס של HTML ו-CSS תוך לימוד של מיומנויות הנחוצות לתלמידים לבניית דף האינטרנט הראשון שלהם." + gd1_description: "משתמש בתחביר שכבר מוכר לתלמידים, כדי להראות להם כיצד לבנות ולשתף שלבי משחק מתפקדים משל עצמם." + see_an_example_project: "צפו בפרויקט לדוגמה" + get_started_today: "התחילו עוד היום!" + want_all_the_courses: "רוצים את כל הקורסים? בקשו מידע לגבי הרישיונות המלאים שלנו." + compare_license_types: "השוואה בין סוגי רישיונות:" + cs: "מדעי המחשב" + wd: "פיתוח אינטרנט" + wd1: "פיתוח אינטרנט 1" + gd: "פיתוח משחקים" + gd1: "פיתוח משחקים 1" + maximum_students: "מס' תלמידים מרבי" + unlimited: "ללא הגבלה" + priority_support: "עדיפות בתמיכה" + yes: "כן" + price_per_student: "__price__ לתלמיד" + pricing: "תמחור" + free: "חינם" + purchase: "רכישה" + courses_prefix: "קורסים" + courses_suffix: "" + course_prefix: "קורס" + course_suffix: "" + + teachers_quote: + subtitle: "התלמידים שלכם יוכלו להתחיל תוך פחות משעה אחת. תוכלו ליצור כיתה, להוסיף תלמידים ולעקוב אחר ההתקדמות שלהם בלימודי מדעי המחשב." + email_exists: "כבר קיים משתמש עם כתובת דואר אלקטרוני זו." + phone_number: "מספר טלפון" + phone_number_help: "היכן ניתן להשיג אתכם בשעות העבודה?" + primary_role_label: "התפקיד העיקרי שלכם" + role_default: "בחרו תפקיד" + primary_role_default: "בחרו תפקיד ראשי" + purchaser_role_default: "בחרו תפקיד רוכש" + tech_coordinator: "רכז/ת טכנולוגיה" + advisor: "מומחה/ית או יועץ/ת לתכנית הלימודים" + principal: "מנהל/ת" + superintendent: "מפקח/ת" + parent: "הורה" + purchaser_role_label: "תפקידכם כרוכש" + influence_advocate: "השפעה/קידום" + evaluate_recommend: "הערכה/המלצות" + approve_funds: "אישור כספים" + no_purchaser_role: "ללא תפקיד בקבלת החלטות בנושאי רכש" + district_label: "מחוז" + district_name: "שם מחוז" + district_na: "הזינו 'לא זמין' אם לא רלוונטי" + organization_label: "מוסד לימודים" + school_name: "שם מוסד הלימודים" + city: "עיר" + state: """מדינה (אם בארה"ב)""" + country: "ארץ" + num_students_help: "עם כמה תלמידים, לדעתכם, אתם צפויים להשתמש ב-CodeCombat?" + num_students_default: "בחרו טווח" + education_level_label: "רמת ההשכלה של התלמידים" + education_level_help: "נא לבחור בכל האפשרויות המתאימות." + elementary_school: "בית ספר יסודי" + high_school: "בית ספר תיכון" + please_explain: "(נא להסביר)" + middle_school: "חטיבת ביניים" + college_plus: "תואר ראשון ומעלה" + referrer: "כיצד שמעתם עלינו?" + referrer_help: "לדוגמה: ממורה אחר, בכנס, מתלמידים, ב-Code.org וכו'." + anything_else: "יש עוד משהו שכדאי לנו לדעת?" + thanks_header: "הבקשה התקבלה!" + thanks_sub_header: "אנו מודים לכם על גילוי העניין ב-CodeCombat עבור מוסד הלימודים שלכם." + thanks_p: "ניצור קשר בקרוב! ליצירת קשר, ניתן לפנות אלינו ב:" + back_to_classes: "בחזרה לכיתות" + finish_signup: "סיימו ליצור את חשבון המורה שלכם:" + finish_signup_p: "צרו חשבון כדי להקים כיתה כיתה, להוסיף תלמידים ולעקוב אחר ההתקדמות שלהם בלימודי מדעי המחשב." + signup_with: "הרשמה באמצעות:" + connect_with: "התחברות באמצעות:" + conversion_warning: "אזהרה: החשבון הנוכחי הוא חשבון תלמיד. לאחר שליחת טופס זה, חשבונכם יעודכן כחשבון מורה." + learn_more_modal: "חשבונות מורה ב-CodeCombat מסוגלים לעקוב אחר התקדמות התלמידים, להקצות רישיונות ולנהל כיתות. חשבונות מורה לא יכולים להיות חלק מהכיתה - אם אתם רשומים כעת בכיתה כלשהי באמצעות חשבון זה, לא תוכלו יותר לגשת אליה לאחר שתעודכנו לחשבון מורה." + create_account: "יצירת חשבון מורה" + create_account_subtitle: "קבלו גישה לכלים המיועדים למורים בלבד, לצורך השימוש ב-CodeCombat בכיתה. הקימו כיתה, הוסיפו תלמידים, ועקבו אחר ההתקדמות שלהם!" + convert_account_title: "עדכון לחשבון מורה" + not: "לא" + versions: save_version_title: "שמור גרסה חדשה" - new_major_version: "גרסה חשובה חדשה" - submitting_patch: "...שולח תיקון" - cla_prefix: "כדי לשמור יש להירשם לאתר" - cla_url: "CLA" + new_major_version: "גרסה ראשית חדשה" + submitting_patch: "שולח תיקון..." + cla_prefix: "כדי לשמור שינויים, יש לתת תחילה הסכמה" + cla_url: "ל-CLA" cla_suffix: "." cla_agree: "אני מסכים" - owner_approve: "אישור בעלים יתבקשת לפני שהשינויים יחולו." - + owner_approve: "על אחד האחראים לאשר זאת לפני שהשינויים שלך יהיו גלויים." + contact: - contact_us: "צור קשר" - welcome: "טוב לשמוע ממך! השתמש בטופס זה כדי לשלוח לנו אימייל. " - forum_prefix: "בשביל דברים ציבוריים, לך ל " - forum_page: "פורום שלנו" - forum_suffix: " במקום." - faq_prefix: "יש גם" + contact_us: "צרו קשר עם CodeCombat" + welcome: "אנו שמחים לשמוע מכם! השתמשו בטופס זה כדי לשלוח לנו הודעה בדואר אלקטרוני. " + forum_prefix: "בכל עניין ציבורי, נא לנסות את " + forum_page: "הפורום שלנו" + forum_suffix: " במקום זאת." + faq_prefix: "קיימת גם רשימה של" faq: "שאלות נפוצות" - subscribe_prefix: ",אם אתם צריכים עזרה בלעבור שלב כלשהו בבקשה" - subscribe: "CodeCombatקנו מנוי ל" - subscribe_suffix: "ואנו נשמח לעזור לך עם הקוד" - subscriber_support: ".מכיוון שאתה מנוי, המייל שלך יקבל עדיפות לתמיכה" - screenshot_included: ".כולל תמונות" - where_reply: "?איפה אנחנו אמורים להגיב" - send: "שלח מייל" - + subscribe_prefix: "אם אתם זקוקים לעזרה כדי לפתור שלב, תוכלו" + subscribe: "לקנות מנוי CodeCombat" + subscribe_suffix: "ואנו נשמח לעזור עם הקוד שלכם." + subscriber_support: "משום שאתם מנויים ל-CodeCombat, ההודעה שנקבל מכם בדואר אלקטרוני תקבל עדיפות בתמיכה." + screenshot_included: "צילום מסך מצורף." + where_reply: "היכן כדאי לנו להשיב?" + send: "שלח משוב" + account_settings: title: "הגדרות חשבון" - not_logged_in: "היכנס או הירשם כדי לערוך את ההדרות שלך" + not_logged_in: "כדי לשנות את ההגדרות, התחברו או צרו חשבון." me_tab: "אני" picture_tab: "תמונה" - delete_account_tab: "מחק את חשבונך" - wrong_email: "כתובת מייל שגויה." - wrong_password: "סיסמא שגוייה" -# use_gravatar: "Change your profile picture by signing up for Gravatar" - delete_this_account: "מחק את חשבון זה לתמיד" -# reset_progress_tab: "Reset All Progress" -# reset_your_progress: "Clear all your progress and start over" - god_mode: "מצב אל" - emails_tab: "אימיילים" - admin: "אדמין" -# manage_subscription: "Click here to manage your subscription." + delete_account_tab: "מחק את החשבון" + wrong_email: "כתובת דואר אלקטרוני שגויה" + wrong_password: "סיסמה שגויה" + use_gravatar: "הירשמו ל-Gravatar כדי להחליף את תמונת הפרופיל" + delete_this_account: "מחק חשבון זה לצמיתות" + reset_progress_tab: "איפוס כל ההתקדמות" + reset_your_progress: "נקו את כל ההתקדמות שלכם, והתחילו מחדש" + god_mode: "מצב כול-יכול" + emails_tab: "דואר אלקטרוני" + admin: "מנהל מערכת" + manage_subscription: "לחצו כאן כדי לנהל את המנוי." new_password: "סיסמה חדשה" - new_password_verify: "חזור על הסיסמה שנית" - type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" -# type_in_email_progress: "Type in your email to confirm deleting your progress." - type_in_password: "גםת הזן את סיסמתך." - email_subscriptions: "הרשמויות אימייל" - email_subscriptions_none: ".אין מנויי מייל" + new_password_verify: "אימות" + type_in_email: "הקלידו כתובת דואר אלקטרוני או שם משתמש כדי לאשר את מחיקת החשבון." + type_in_email_progress: "הקלידו את כתובת הדואר האלקטרוני שלכם כדי לאשר את מחיקת ההתקדמות שלכם." + type_in_password: "בנוסף, הקלידו את סיסמתכם." + email_subscriptions: "מנויים בדואר אלקטרוני" + email_subscriptions_none: "ללא מנויים בדואר אלקטרוני." email_announcements: "הודעות" - email_announcements_description: "קבל את החדשות ואת הפיתוחים הכי חדישים במשחק באימייל." - email_notifications: "עדכונים" - email_notifications_summary: ".CodeCombatכלים לעדכוני מייל, מותאמים אישית על הפעילות שלכם ב" - email_any_notes: "כל סוגרות" - email_any_notes_description: "נטרל כדי להפסיק את עדכוני הפעילות באי-מייל" + email_announcements_description: "קבלו בדואר אלקטרוני הודעות על החדשות והפיתוחים האחרונים ב-CodeCombat." + email_notifications: "הודעות" + email_notifications_summary: "להגדרה של הודעות אוטומטיות ומותאמות אישית בדואר אלקטרוני לגבי פעילותכם ב-CodeCombat." + email_any_notes: "כל הודעה" + email_any_notes_description: "השביתו אפשרות זו כדי להפסיק לחלוטין שליחה בדואר אלקטרוני של הודעות על פעילות." email_news: "חדשות" email_recruit_notes: "הזדמנויות עבודה" - email_recruit_notes_description: ".(אם אתם משחקים טוב באמת, יש סיכוי שניצור איתכם קשר על מנת למצוא לכך עבודה (טובה יותר" - contributor_emails: "אימיילים של כיתות תורמים" - contribute_prefix: "אנו מחפשים אנשים שיצתרפו למסיבה! תראו את" - contribute_page: "דף התרימות" - contribute_suffix: " בשביל עוד מידע." - email_toggle: "עדכן" - error_saving: "בעיה בשמירה" + email_recruit_notes_description: "אם תשחקו ממש טוב, אולי ניצור עמכם קשר כדי למצוא לכם עבודה (יותר טובה)." + contributor_emails: "דואר אלקטרוני של תורמים" + contribute_prefix: "אנו מחפשים אנשים שיצטרפו אלינו למסיבה! בואו לראות את " + contribute_page: "דף התרומות שלנו" + contribute_suffix: " למידע נוסף." + email_toggle: "החלף מצב הכול" + error_saving: "שגיאה בשמירה" saved: "השינויים נשמרו" - password_mismatch: "סיסמאות לא זהות" - password_repeat: ".אנא חזור על הסיסמא" - + password_mismatch: "הסיסמה אינה תואמת." + password_repeat: "נא להזין שוב את סיסמתכם." + keyboard_shortcuts: keyboard_shortcuts: "קיצורי מקשים" space: "Space" enter: "Enter" - press_enter: "לחץ enter" + press_enter: "הקש Enter" escape: "Escape" shift: "Shift" - run_code: ".הרץ קוד נוכחי" - run_real_time: ".הרץ קוד בזמן אמת" - continue_script: ".המשך בתסריט זה" - skip_scripts: ".דלג על כל התסריטים שניתן לדלג עליהם" - toggle_playback: ".הפעלהשהה" - scrub_playback: ".התקדם אחורה וקדימה בזמן" - single_scrub_playback: ".התקדם אחורה וקדימה בזמן בפריים אחד" -# 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." - + run_code: "הרץ קוד נוכחי." + run_real_time: "הרץ בזמן אמת." + continue_script: "המשך אחרי ה-Script הנוכחי." + skip_scripts: "דלג על כל קובצי ה-Script שעליהם ניתן לדלג." + toggle_playback: "שינוי מצב הפעלה/השהיה." + scrub_playback: "ניקוי אחורה וקדימה בזמן." + single_scrub_playback: "לניקוי אחורה וקדימה לאורך ציר הזמן במסגרת יחידה." + scrub_execution: "ניקוי בכל ביצוע הלחש הנוכחי." + toggle_debug: "שינוי מצב של תצוגת איתור באגים." + toggle_grid: "שינוי מצב של פריסת רשת." + toggle_pathfinding: "שינוי מצב של פריסת מציאת מסלול." + beautify: "כתבו קוד אלגנטי יותר באמצעות עיצוב מתוקנן." + maximize_editor: "הגדלה/כיווץ של עורך הקוד." + community: - main_title: "CodeCombat קהילת" - introduction: "!תבדוק את הדרכים שאנחנו מציעים לך להיות מעורב ותבחא את הדרך שנראית לך הכי כיפית. אנחנו מצפים לעבוד איתך" - level_editor_prefix: "CodeCombat תשתמש ב" -# level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!" - thang_editor_prefix: "אנחנו קוראים ליחידות בתוך המשחק ,ת\"ת'אנגס\" השתמש ב " -# thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites." -# article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the" -# article_editor_suffix: "and help CodeCombat players get the most out of their playtime." - find_us: ":מצא אותנו באתרים האלה" -# social_github: "Check out all our code on GitHub" - social_blog: "Sett ב CodeCombat קרא את הבלוג של" - social_discource: "שלנו Discourse forum הצטרף לדיון ב" - social_facebook: "Facebook ב CodeCombat תן לייק ל" - social_twitter: "Twitter ב CodeCombat תעקוב אחרי" - social_gplus: "Google+ ב CodeCombat הצטרף ל" -# social_slack: "Chat with us in the public CodeCombat Slack channel" - contribute_to_the_project: "תרום לפרוייקט" - + main_title: "קהילת CodeCombat" + introduction: "בואו ללמוד להלן כיצד תוכלו לקחת חלק וכדי להחליט מה נשמע הכי כיף לכם. אנו מצפים לעבוד אתכם!" + level_editor_prefix: "השתמשו ב-CodeCombat" + level_editor_suffix: "כדי ליצור ולערוך שלבים. המשתמשים יצרו שלבים עבור כיתות וחברים שלהם, האקתונים, תלמידים ואחים. אם יצירה של שלב חדש נשמעת כמו משימה מפחידה, תוכלו לפצל שלב משלנו בתור התחלה!" + thang_editor_prefix: "אנו מכנים את היחידות שבתוך המשחק בשם 'thangs'. באמצעות" + thang_editor_suffix: "תוכלו לשנות את אמנות המקור של CodeCombat. אפשרו ליחידות להטיל קליעים, לשנות את כיוון ההנפשה, לשנות את מספר נקודות הפגיעה של יחידות או להעלות ספרייט וקטור משלכם." + article_editor_prefix: "מצאתם שגיאה במסמכים שלנו? רוצים ליצור הוראות עבור יצירות משלכם? בואו לראות את" + article_editor_suffix: "ולעזור לשחקני CodeCombat להפיק את המרב מחוויית המשחק שלהם." + find_us: "בואו לראות אותנו באתרים אלה" + social_github: "בואו לעיין בכל הקוד שלנו ב-GitHub" + social_blog: "קראו את הבלוג של CodeCombat ב-Sett" + social_discource: "הצטרפו לדיון בפורום ה-Discourse שלנו" + social_facebook: """תנו ל-CodeCombat "לייק" ב-Facebook""" + social_twitter: "עקבו אחרי CodeCombat ב-Twitter" + social_gplus: "הצטרפו ל-CodeCombat ב-Google+‎" + social_slack: "שוחחו עמנו בצ'אט בערוץ ה-Slack הציבורי של CodeCombat" + contribute_to_the_project: "תרמו לפרויקט" + clans: clan: "שבט" clans: "שבטים" new_name: "שם שבט חדש" new_description: "תיאור שבט חדש" - make_private: "הפוך שבט לפרטי" + make_private: "הגדר שבט כפרטי" subs_only: "מנויים בלבד" - create_clan: "צור שבט חדש" - private_preview: "צפה" -# private_clans: "Private Clans" - public_clans: "שבטים פתוחים" + create_clan: "יצירת שבט חדש" + private_preview: "תצוגה מקדימה" + private_clans: "שבטים פרטיים" + public_clans: "שבטים ציבוריים" my_clans: "השבטים שלי" clan_name: "שם השבט" name: "שם" - chieftain: "צ'יף(מנהיג)" - edit_clan_name: "ערוך את שם השבט" - edit_clan_description: "ערוך את תיאור השבט" - edit_name: "ערוך שם" - edit_description: "ערוך תיאור" + chieftain: "ראש השבט" + edit_clan_name: "עריכת שם שבט" + edit_clan_description: "עריכת תיאור שבט" + edit_name: "עריכת שם" + edit_description: "עריכת תיאור" private: "(פרטי)" summary: "תקציר" - average_level: "רמה ממוצעת" - average_achievements: "מס' הישגם ממוצע" + average_level: "שלב ממוצע" + average_achievements: "הישגים ממוצעים" delete_clan: "מחק שבט" leave_clan: "עזוב שבט" join_clan: "הצטרף לשבט" invite_1: "הזמן:" - invite_2: "*הזמן שחקנים לשבט באמצעות שליחת הקישור הזה." + invite_2: "*שלחו אל השחקנים קישור זה כדי להזמין אותם אל השבט." members: "חברים" progress: "התקדמות" - not_started_1: "לא הותחל" - started_1: "הותחל" - complete_1: "סויים" + not_started_1: "לא התחיל" + started_1: "התחיל" + complete_1: "הושלם" exp_levels: "הרחב שלבים" rem_hero: "הסר גיבור" - status: "סטטוס" - complete_2: "סויים" - started_2: "הותחל" - not_started_2: "לא הותחל" - view_solution: "לחץ כדי לראות פתרונות." -# view_attempt: "Click to view attempt." - latest_achievement: "הישגים עדכניים" + status: "מצב" + complete_2: "הושלם" + started_2: "התחיל" + not_started_2: "לא התחיל" + view_solution: "לחצו כדי להציג פתרון." + view_attempt: "לחצו כדי להציג ניסיון." + latest_achievement: "הישג אחרון" playtime: "זמן משחק" - last_played: "שיחק לאחרונה" -# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances." -# track_concepts1: "Track concepts" -# track_concepts2a: "learned by each student" -# track_concepts2b: "learned by each member" -# track_concepts3a: "Track levels completed for each student" -# track_concepts3b: "Track levels completed for each member" -# track_concepts4a: "See your students'" -# track_concepts4b: "See your members'" -# track_concepts5: "solutions" -# track_concepts6a: "Sort students by name or progress" -# track_concepts6b: "Sort members by name or progress" -# track_concepts7: "Requires invitation" -# track_concepts8: "to join" -# private_require_sub: "Private clans require a subscription to create or join." - -# courses: -# create_new_class: "Create New Class" -# unnamed_class: "Unnamed Class" -# edit_settings1: "Edit Class Settings" -# add_students: "Add Students" -# stats: "Statistics" -# total_students: "Total students:" -# average_time: "Average level play time:" -# total_time: "Total play time:" -# average_levels: "Average levels completed:" -# total_levels: "Total levels completed:" -# students: "Students" -# concepts: "Concepts" -# play_time: "Play time:" -# completed: "Completed:" -# enter_emails: "Separate each email address by a line break or commas" -# send_invites: "Invite Students" -# number_programming_students: "Number of Programming Students" -# number_total_students: "Total Students in School/District" -# enroll: "Enroll" -# enroll_paid: "Enroll Students in Paid Courses" -# get_enrollments: "Get More Licenses" -# change_language: "Change Course Language" -# keep_using: "Keep Using" -# switch_to: "Switch To" -# greetings: "Greetings!" -# back_classrooms: "Back to my classrooms" -# back_classroom: "Back to classroom" -# back_courses: "Back to my courses" -# edit_details: "Edit class details" -# purchase_enrollments: "Purchase Student Licenses" -# remove_student: "remove student" -# assign: "Assign" -# to_assign: "to assign paid courses." -# student: "Student" -# teacher: "Teacher" -# arena: "Arena" -# available_levels: "Available Levels" -# started: "started" -# complete: "complete" -# practice: "practice" -# required: "required" -# welcome_to_courses: "Adventurers, welcome to Courses!" -# ready_to_play: "Ready to play?" -# start_new_game: "Start New Game" -# play_now_learn_header: "Play now to learn" -# play_now_learn_1: "basic syntax to control your character" -# play_now_learn_2: "while loops to solve pesky puzzles" -# play_now_learn_3: "strings & variables to customize actions" -# play_now_learn_4: "how to defeat an ogre (important life skills!)" -# welcome_to_page: "My Student Dashboard" -# my_classes: "Current Classes" -# class_added: "Class successfully added!" -# view_levels: "view all levels in course" -# view_project_gallery: "view my classmates' projects" -# join_class: "Join A Class" -# join_class_2: "Join class" -# ask_teacher_for_code: "Ask your teacher if you have a CodeCombat class code! If so, enter it below:" -# enter_c_code: "" -# join: "Join" -# joining: "Joining class" -# course_complete: "Course Complete" -# play_arena: "Play Arena" -# view_project: "View Project" -# start: "Start" -# last_level: "Last level played" -# not_you: "Not you?" -# continue_playing: "Continue Playing" -# option1_header: "Invite Students by Email" -# option1_body: "Note: If your students do not have email addresses, they can enter your unique Class Code when creating a Student Account to make email addresses optional." -# remove_student1: "Remove Student" -# are_you_sure: "Are you sure you want to remove this student from this class?" -# remove_description1: "Student will lose access to this classroom and assigned classes. Progress and gameplay is NOT lost, and the student can be added back to the classroom at any time." -# remove_description2: "The activated paid license will not be returned." -# keep_student: "Keep Student" -# removing_user: "Removing user" -# subtitle: "Review course overviews and levels" # Flat style redesign -# changelog: "View latest changes to course levels." -# select_language: "Select language" -# select_level: "Select level" -# play_level: "Play Level" -# concepts_covered: "Concepts covered" -# view_guide_online: "Level Overviews and Solutions" -# grants_lifetime_access: "Grants access to all Courses." -# enrollment_credits_available: "Licenses Available:" -# language_select: "Select a language" # ClassroomSettingsModal -# language_cannot_change: "Language cannot be changed once students join a class." -# avg_student_exp_label: "Average Student Programming Experience" -# avg_student_exp_desc: "This will help us understand how to pace courses better." -# avg_student_exp_select: "Select the best option" -# avg_student_exp_none: "No Experience - little to no experience" -# avg_student_exp_beginner: "Beginner - some exposure or block-based" -# avg_student_exp_intermediate: "Intermediate - some experience with typed code" -# avg_student_exp_advanced: "Advanced - extensive experience with typed code" -# avg_student_exp_varied: "Varied Levels of Experience" -# student_age_range_label: "Student Age Range" -# student_age_range_younger: "Younger than 6" -# student_age_range_older: "Older than 18" -# student_age_range_to: "to" -# create_class: "Create Class" -# class_name: "Class Name" -# teacher_account_restricted: "Your account is a teacher account and cannot access student content." -# account_restricted: "A student account is required to access this page." -# update_account_login_title: "Log in to update your account" -# update_account_title: "Your account needs attention!" -# update_account_blurb: "Before you can access your classes, choose how you want to use this account." -# update_account_current_type: "Current Account Type:" -# update_account_account_email: "Account Email/Username:" -# update_account_am_teacher: "I am a teacher" -# update_account_keep_access: "Keep access to classes I've created" -# update_account_teachers_can: "Teacher accounts can:" -# update_account_teachers_can1: "Create/manage/add classes" -# update_account_teachers_can2: "Assign/enroll students in courses" -# update_account_teachers_can3: "Unlock all course levels to try out" -# update_account_teachers_can4: "Access new teacher-only features as we release them" -# update_account_teachers_warning: "Warning: You will be removed from all classes that you have previously joined and will not be able to play as a student." -# update_account_remain_teacher: "Remain a Teacher" -# update_account_update_teacher: "Update to Teacher" -# update_account_am_student: "I am a student" -# update_account_remove_access: "Remove access to classes I have created" -# update_account_students_can: "Student accounts can:" -# update_account_students_can1: "Join classes" -# update_account_students_can2: "Play through courses as a student and track your own progress" -# update_account_students_can3: "Compete against classmates in arenas" -# update_account_students_can4: "Access new student-only features as we release them" -# update_account_students_warning: "Warning: You will not be able to manage any classes that you have previously created or create new classes." -# unsubscribe_warning: "Warning: You will be unsubscribed from your monthly subscription." -# update_account_remain_student: "Remain a Student" -# update_account_update_student: "Update to Student" -# need_a_class_code: "You'll need a Class Code for the class you're joining:" -# update_account_not_sure: "Not sure which one to choose? Email" -# update_account_confirm_update_student: "Are you sure you want to update your account to a Student experience?" -# update_account_confirm_update_student2: "You will not be able to manage any classes that you have previously created or create new classes. Your previously created classes will be removed from CodeCombat and cannot be restored." -# instructor: "Instructor: " -# youve_been_invited_1: "You've been invited to join " -# youve_been_invited_2: ", where you'll learn " -# youve_been_invited_3: " with your classmates in CodeCombat." -# by_joining_1: "By joining " -# by_joining_2: "will be able to help reset your password if you forget or lose it. You can also verify your email address so that you can reset the password yourself!" -# sent_verification: "We've sent a verification email to:" -# you_can_edit: "You can edit your email address in " -# account_settings: "Account Settings" -# select_your_hero: "Select Your Hero" -# select_your_hero_description: "You can always change your hero by going to your Courses page and clicking \"Change Hero\"" -# select_this_hero: "Select this Hero" -# current_hero: "Current Hero:" -# change_hero: "Change Hero" -# web_dev_language_transition: "All classes program in HTML / JavaScript for this course. Classes that have been using Python will start with extra JavaScript intro levels to ease the transition. Classes that are already using JavaScript will skip the intro levels." -# course_membership_required_to_play: "You'll need to join a course to play this level." -# license_required_to_play: "Ask your teacher to assign a license to you so you can continue to play CodeCombat!" - -# project_gallery: -# no_projects_published: "Be the first to publish a project in this course!" -# view_project: "View Project" -# edit_project: "Edit Project" - -# teacher: -# assigning_course: "Assigning course" -# course_solution: "Course Solution" -# level_overview_solutions: "Level Overview and Solutions" -# no_student_assigned: "No students have been assigned this course." -# paren_new: "(new)" -# teacher_dashboard: "Teacher Dashboard" # Navbar -# my_classes: "My Classes" -# courses: "Course Guides" -# enrollments: "Student Licenses" -# resources: "Resources" -# help: "Help" -# language: "Language" -# edit_class_settings: "edit class settings" -# access_restricted: "Account Update Required" -# teacher_account_required: "A teacher account is required to access this content." -# create_teacher_account: "Create Teacher Account" -# what_is_a_teacher_account: "What's a Teacher Account?" -# teacher_account_explanation: "A CodeCombat Teacher account allows you to set up classrooms, monitor students’ progress as they work through courses, manage licenses and access resources to aid in your curriculum-building." -# current_classes: "Current Classes" -# archived_classes: "Archived Classes" -# archived_classes_blurb: "Classes can be archived for future reference. Unarchive a class to view it in the Current Classes list again." -# view_class: "view class" -# archive_class: "archive class" -# unarchive_class: "unarchive class" -# unarchive_this_class: "Unarchive this class" -# no_students_yet: "This class has no students yet." -# no_students_yet_view_class: "View class to add students." -# try_refreshing: "(You may need to refresh the page)" -# create_new_class: "Create a New Class" -# class_overview: "Class Overview" # View Class page -# avg_playtime: "Average level playtime" -# total_playtime: "Total play time" -# avg_completed: "Average levels completed" -# total_completed: "Total levels completed" -# created: "Created" -# concepts_covered: "Concepts covered" -# earliest_incomplete: "Earliest incomplete level" -# latest_complete: "Latest completed level" -# enroll_student: "Enroll student" -# apply_license: "Apply License" -# revoke_license: "Revoke License" -# course_progress: "Course Progress" -# not_applicable: "N/A" -# edit: "edit" -# edit_2: "Edit" -# remove: "remove" -# latest_completed: "Latest completed:" -# sort_by: "Sort by" -# progress: "Progress" -# completed: "Completed" -# practice: "Practice" -# started: "Started" -# click_to_view_progress: "click to view progress" -# no_progress: "No progress" -# not_required: "Not required" -# select_course: "Select course to view" -# progress_color_key: "Progress color key:" -# level_in_progress: "Level in Progress" -# level_not_started: "Level Not Started" -# project_or_arena: "Project or Arena" -# students_not_assigned: "Students who have not been assigned {{courseName}}" -# course_overview: "Course Overview" -# copy_class_code: "Copy Class Code" -# class_code_blurb: "Students can join your class using this Class Code. No email address is required when creating a Student account with this Class Code." -# copy_class_url: "Copy Class URL" -# class_join_url_blurb: "You can also post this unique class URL to a shared webpage." -# add_students_manually: "Invite Students by Email" -# bulk_assign: "Bulk-assign" -# assigned_msg_1: "{{numberAssigned}} students were assigned {{courseName}}." -# assigned_msg_2: "{{numberEnrolled}} licenses were applied." -# assigned_msg_3: "You now have {{remainingSpots}} available licenses remaining." -# assign_course: "Assign Course" -# not_assigned_modal_title: "Courses were not assigned" -# not_assigned_modal_starter_body_1: "This course requires a Starter License. You do not have enough Starter Licenses available to assign this course to all __selected__ selected students." -# not_assigned_modal_starter_body_2: "Purchase Starter Licenses to grant access to this course." -# not_assigned_modal_full_body_1: "This course requires a Full License. You do not have enough Full Licenses available to assign this course to all __selected__ selected students." -# not_assigned_modal_full_body_2: "You only have __numFullLicensesAvailable__ Full Licenses available (__numStudentsWithoutFullLicenses__ students do not currently have a Full License active)." -# not_assigned_modal_full_body_3: "Please select fewer students, or reach out to __supportEmail__ for assistance." -# assign_to_selected_students: "Assign to Selected Students" -# assigned: "Assigned" -# enroll_selected_students: "Enroll Selected Students" -# no_students_selected: "No students were selected." -# show_students_from: "Show students from" # Enroll students modal -# apply_licenses_to_the_following_students: "Apply Licenses to the Following Students" -# students_have_licenses: "The following students already have licenses applied:" -# all_students: "All Students" -# apply_licenses: "Apply Licenses" -# not_enough_enrollments: "Not enough licenses available." -# enrollments_blurb: "Students are required to have a license to access any content after the first course." -# how_to_apply_licenses: "How to Apply Licenses" -# export_student_progress: "Export Student Progress (CSV)" -# send_email_to: "Send Recover Password Email to:" -# email_sent: "Email sent" -# send_recovery_email: "Send recovery email" -# enter_new_password_below: "Enter new password below:" -# change_password: "Change Password" -# changed: "Changed" -# available_credits: "Available Licenses" -# pending_credits: "Pending Licenses" -# empty_credits: "Exhausted Licenses" -# license_remaining: "license remaining" -# licenses_remaining: "licenses remaining" -# one_license_used: "1 license has been used" -# num_licenses_used: "__numLicensesUsed__ licenses have been used" -# starter_licenses: "starter licenses" -# start_date: "start date:" -# end_date: "end date:" -# get_enrollments_blurb: " We'll help you build a solution that meets the needs of your class, school or district." -# how_to_apply_licenses_blurb_1: "When a teacher assigns a course to a student for the first time, we’ll automatically apply a license. Use the bulk-assign dropdown in your classroom to assign a course to selected students:" -# how_to_apply_licenses_blurb_2: "Can I still apply a license without assigning a course?" -# how_to_apply_licenses_blurb_3: "Yes — go to the License Status tab in your classroom and click \"Apply License\" to any student who does not have an active license." -# request_sent: "Request Sent!" -# license_status: "License Status" -# status_expired: "Expired on {{date}}" -# status_not_enrolled: "Not Enrolled" -# status_enrolled: "Expires on {{date}}" -# select_all: "Select All" -# project: "Project" -# project_gallery: "Project Gallery" -# view_project: "View Project" -# unpublished: "(unpublished)" -# view_arena_ladder: "View Arena Ladder" -# resource_hub: "Resource Hub" -# getting_started: "Getting Started" -# educator_faq: "Educator FAQ" -# educator_faq_desc: "Frequently asked questions about using CodeCombat in your classroom or school." -# teacher_getting_started: "Teacher Getting Started Guide" -# teacher_getting_started_desc: "New to CodeCombat? Download this Teacher Getting Started Guide to set up your account, create your first class, and invite students to the first course." -# student_getting_started: "Student Quick Start Guide" -# student_getting_started_desc: "You can distribute this guide to your students before starting CodeCombat so that they can familiarize themselves with the code editor. This guide can be used for both Python and JavaScript classrooms." -# cs1: "Introduction to Computer Science" -# cs2: "Computer Science 2" -# cs3: "Computer Science 3" -# cs4: "Computer Science 4" -# cs5: "Computer Science 5" -# cs1_syntax_python: "Course 1 Python Syntax Guide" -# cs1_syntax_python_desc: "Cheatsheet with references to common Python syntax that students will learn in Introduction to Computer Science." -# cs1_syntax_javascript: "Course 1 JavaScript Syntax Guide" -# cs1_syntax_javascript_desc: "Cheatsheet with references to common JavaScript syntax that students will learn in Introduction to Computer Science." -# coming_soon: "Additional guides coming soon!" -# engineering_cycle_worksheet: "Engineering Cycle Worksheet" -# engineering_cycle_worksheet_desc: "Use this worksheet to teach students the basics of the engineering cycle: Assess, Design, Implement and Debug. Refer to the completed example worksheet as a guide." -# engineering_cycle_worksheet_link: "View example" -# progress_journal: "Progress Journal" -# progress_journal_desc: "Encourage students to keep track of their progress via a progress journal." -# cs1_curriculum: "Introduction to Computer Science - Curriculum Guide" -# cs1_curriculum_desc: "Scope and sequence, lesson plans, activities and more for Course 1." -# arenas_curriculum: "Arena Levels - Teacher Guide" -# arenas_curriculum_desc: "Instructions on how to run Wakka Maul, Cross Bones and Power Peak multiplayer arenas with your class." -# cs2_curriculum: "Computer Science 2 - Curriculum Guide" -# cs2_curriculum_desc: "Scope and sequence, lesson plans, activities and more for Course 2." -# cs3_curriculum: "Computer Science 3 - Curriculum Guide" -# cs3_curriculum_desc: "Scope and sequence, lesson plans, activities and more for Course 3." -# cs4_curriculum: "Computer Science 4 - Curriculum Guide" -# cs4_curriculum_desc: "Scope and sequence, lesson plans, activities and more for Course 4." -# cs5_curriculum_js: "Computer Science 5 - Curriculum Guide (JavaScript)" -# cs5_curriculum_desc_js: "Scope and sequence, lesson plans, activities and more for Course 5 classes using JavaScript." -# cs5_curriculum_py: "Computer Science 5 - Curriculum Guide (Python)" -# cs5_curriculum_desc_py: "Scope and sequence, lesson plans, activities and more for Course 5 classes using Python." -# cs1_pairprogramming: "Pair Programming Activity" -# cs1_pairprogramming_desc: "Introduce students to a pair programming exercise that will help them become better listeners and communicators." -# gd1: "Game Development 1" -# gd1_guide: "Game Development 1 - Project Guide" -# gd1_guide_desc: "Use this to guide your students as they create their first shareable game project in 5 days." -# wd1: "Web Development 1" -# wd1_headlines: "Headlines & Headers Activity" -# wd1_headlines_example: "View sample solution" -# wd1_headlines_desc: "Why are paragraph and header tags important? Use this activity to show how well-chosen headers make web pages easier to read. There are many correct solutions to this!" -# wd1_html_syntax: "HTML Syntax Guide" -# wd1_html_syntax_desc: "One-page reference for the HTML style students will learn in Web Development 1." -# wd1_css_syntax: "CSS Syntax Guide" -# wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." -# wd2: "Web Development 2" -# wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." -# wd2_quizlet_worksheet: "Quizlet Planning Worksheet" -# wd2_quizlet_worksheet_instructions: "View instructions & examples" -# wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." -# student_overview: "Overview" -# student_details: "Student Details" -# student_name: "Student Name" -# no_name: "No name provided." -# no_username: "No username provided." -# no_email: "Student has no email address set." -# student_profile: "Student Profile" -# playtime_detail: "Playtime Detail" -# student_completed: "Student Completed" -# student_in_progress: "Student in Progress" -# class_average: "Class Average" -# not_assigned: "has not been assigned the following courses" -# playtime_axis: "Playtime in Seconds" -# levels_axis: "Levels in" -# student_state: "How is" -# student_state_2: "doing?" -# student_good: "is doing well in" -# student_good_detail: "This student is keeping pace with the class." -# student_warn: "might need some help in" -# student_warn_detail: "This student might need some help with new concepts that have been introduced in this course." -# student_great: "is doing great in" -# student_great_detail: "This student might be a good candidate to help other students working through this course." -# full_license: "Full License" -# starter_license: "Starter License" -# trial: "Trial" -# hoc_welcome: "Happy Computer Science Education Week" -# hoc_intro: "There are three ways for your class to participate in Hour of Code with CodeCombat" -# hoc_self_led: "Self-Led Gameplay" -# hoc_self_led_desc: "Students can play through two Hour of Code CodeCombat tutorials on their own" -# hoc_game_dev: "Game Development" -# hoc_and: "and" -# hoc_programming: "JavaScript/Python Programming" -# hoc_teacher_led: "Teacher-Led Lessons" -# hoc_teacher_led_desc1: "Download our" -# hoc_teacher_led_link: "Introduction to Computer Science lesson plans" -# hoc_teacher_led_desc2: "to introduce your students to programming concepts using offline activities" -# hoc_group: "Group Gameplay" -# hoc_group_desc_1: "Teachers can use the lessons in conjunction with our Introduction to Computer Science course to track student progress. See our" -# hoc_group_link: "Getting Started Guide" -# hoc_group_desc_2: "for more details" -# hoc_additional_desc1: "For additional CodeCombat resources and activities, see our" -# hoc_additional_desc2: "Questions" -# hoc_additional_contact: "Get in touch" -# revoke_confirm: "Are you sure you want to revoke a Full License from {{student_name}}? The license will become available to assign to another student." -# revoking: "Revoking..." -# unused_licenses: "You have unused Licenses that allow you to assign students paid courses when they're ready to learn more!" -# remember_new_courses: "Remember to assign new courses!" -# more_info: "More Info" -# how_to_assign_courses: "How to Assign Courses" -# select_students: "Select Students" -# select_instructions: "Click the checkbox next to each student you want to assign courses to." -# choose_course: "Choose Course" -# choose_instructions: "Select the course from the dropdown menu you’d like to assign, then click “Assign to Selected Students.”" -# push_projects: "We recommend assigning Web Development 1 or Game Development 1 after students have finished Introduction to Computer Science! See our {{resource_hub}} for more details on those courses." -# teacher_quest: "Teacher's Quest for Success" -# quests_complete: "Quests Complete" -# teacher_quest_create_classroom: "Create Classroom" -# teacher_quest_add_students: "Add Students" -# teacher_quest_teach_methods: "Help your students learn how to `call methods`." -# teacher_quest_teach_methods_step1: "Get 75% of at least one class through the first level, __Dungeons of Kithgard__" -# teacher_quest_teach_methods_step2: "Print out the [Student Quick Start Guide](http://files.codecombat.com/docs/resources/StudentQuickStartGuide.pdf) in the Resource Hub." -# teacher_quest_teach_strings: "Don't string your students along, teach them `strings`." -# teacher_quest_teach_strings_step1: "Get 75% of at least one class through __True Names__" -# teacher_quest_teach_strings_step2: "Use the Teacher Level Selector on [Course Guides](/teachers/courses) page to preview __True Names__." -# teacher_quest_teach_loops: "Keep your students in the loop about `loops`." -# teacher_quest_teach_loops_step1: "Get 75% of at least one class through __Fire Dancing__." -# teacher_quest_teach_loops_step2: "Use the __Loops Activity__ in the [CS1 Curriculum guide](/teachers/resources/cs1) to reinforce this concept." -# teacher_quest_teach_variables: "Vary it up with `variables`." -# teacher_quest_teach_variables_step1: "Get 75% of at least one class through __Known Enemy__." -# teacher_quest_teach_variables_step2: "Encourage collaboration by using the [Pair Programming Activity](/teachers/resources/pair-programming)." -# teacher_quest_kithgard_gates_100: "Escape the Kithgard Gates with your class." -# teacher_quest_kithgard_gates_100_step1: "Get 75% of at least one class through __Kithgard Gates__." -# teacher_quest_kithgard_gates_100_step2: "Guide students to think through hard problems using the [Engineering Cycle Worksheet](http://files.codecombat.com/docs/resources/EngineeringCycleWorksheet.pdf)." -# teacher_quest_wakka_maul_100: "Prepare to duel in Wakka Maul." -# teacher_quest_wakka_maul_100_step1: "Get 75% of at least one class to __Wakka Maul__." -# teacher_quest_wakka_maul_100_step2: "See the [Arena Guide](/teachers/resources/arenas) in the [Resource Hub](/teachers/resources) for tips on how to run a successful arena day." -# teacher_quest_reach_gamedev: "Explore new worlds!" -# teacher_quest_reach_gamedev_step1: "[Get licenses](/teachers/licenses) so that your students can explore new worlds, like Game Development and Web Development!" -# teacher_quest_done: "Want your students to learn even more code? Get in touch with our [school specialists](mailto:schools@codecombat.com) today!" -# teacher_quest_keep_going: "Keep going! Here's what you can do next:" -# teacher_quest_more: "See all quests" -# teacher_quest_less: "See fewer quests" -# refresh_to_update: "(refresh the page to see updates)" -# view_project_gallery: "View Project Gallery" - -# share_licenses: -# share_licenses: "Share Licenses" -# shared_by: "Shared By:" -# add_teacher_label: "Enter exact teacher email:" -# add_teacher_button: "Add Teacher" -# subheader: "You can make your licenses available to other teachers in your organization. Each license can only be used for one student at a time." -# teacher_not_found: "Teacher not found. Please make sure this teacher has already created a Teacher Account." -# teacher_not_valid: "This is not a valid Teacher Account. Only teacher accounts can share licenses." -# already_shared: "You've already shared these licenses with that teacher." -# teachers_using_these: "Teachers who can access these licenses:" -# footer: "When teachers revoke licenses from students, the licenses will be returned to the shared pool for other teachers in this group to use." -# you: "(you)" -# one_license_used: "(1 license used)" -# licenses_used: "(__licensesUsed__ licenses used)" -# more_info: "More info" - -# sharing: -# game: "Game" -# webpage: "Webpage" -# your_students_preview: "Your students will click here to see their finished projects! Unavailable in teacher preview." -# unavailable: "Link sharing not available in teacher preview." -# share_game: "Share This Game" -# share_web: "Share This Webpage" -# victory_share_prefix: "Share this link to invite your friends & family to" -# victory_share_game: "play your game level" -# victory_share_web: "view your webpage" -# victory_share_suffix: "." -# victory_course_share_prefix: "This link will let your friends & family" -# victory_course_share_game: "play the game" -# victory_course_share_web: "view the webpage" -# victory_course_share_suffix: "you just created." -# copy_url: "Copy URL" - -# game_dev: -# creator: "Creator" - -# web_dev: -# image_gallery_title: "Image Gallery" -# select_an_image: "Select an image you want to use" -# scroll_down_for_more_images: "(Scroll down for more images)" -# copy_the_url: "Copy the URL below" -# copy_the_url_description: "Useful if you want to replace an existing image." -# copy_the_img_tag: "Copy the tag" -# copy_the_img_tag_description: "Useful if you want to insert a new image." -# copy_url: "Copy URL" -# copy_img: "Copy " -# how_to_copy_paste: "How to Copy/Paste" -# copy: "Copy" -# paste: "Paste" -# back_to_editing: "Back to Editing" - + last_played: "משחק אחרון" + leagues_explanation: "שחקו בליגה נגד חברי שבט אחרים במופעים אלה של זירה מרובת-משתתפים." + track_concepts1: "מעקב אחר העקרונות" + track_concepts2a: "שנלמדו על-ידי כל תלמיד" + track_concepts2b: "שנלמדו על-ידי כל חבר" + track_concepts3a: "מעקב אחר השלבים שהושלמו עבור כל תלמיד" + track_concepts3b: "מעקב אחר השלבים שהושלמו עבור כל חבר" + track_concepts4a: "ראו את התלמידים'" + track_concepts4b: "ראו את החברים'" + track_concepts5: "פתרונות" + track_concepts6a: "מיין תלמידים לפי שם או התקדמות" + track_concepts6b: "מיין חברים לפי שם או התקדמות" + track_concepts7: "נדרשת הזמנה" + track_concepts8: "כדי להצטרף" + private_require_sub: "נדרש מנוי כדי ליצור שבטים פרטיים או להצטרף אליהם." + + courses: + create_new_class: "יצירת כיתה חדשה" + unnamed_class: "כיתה ללא שם" + edit_settings1: "עריכת הגדרות כיתה" + add_students: "הוסף תלמידים" + stats: "סטטיסטיקה" + total_students: """סה"כ תלמידים:""" + average_time: "זמן משחק ממוצע בשלב:" + total_time: """סה"כ זמן משחק:""" + average_levels: "שלבים שהושלמו בממוצע:" + total_levels: """סה"כ שלבים שהושלמו:""" + students: "תלמידים" + concepts: "עקרונות" + play_time: "זמן משחק:" + completed: "הושלם:" + enter_emails: "יש להפריד בין כתובות דואר אלקטרוני באמצעות מעבר שורה או פסיק" + send_invites: "הזמן תלמידים" + number_programming_students: "מספר תלמידי התכנות" + number_total_students: 'סה"כ תלמידים בבית הספר/מחוז' + enroll: "הרשמה" + enroll_paid: "הרשמת תלמידים בקורסים בתשלום" + get_enrollments: "קבל רישיונות נוספים" + change_language: "שינוי שפת הקורס" + keep_using: "המשך להשתמש" + switch_to: "עבור אל" + greetings: "ברכותינו!" + back_classrooms: "בחזרה לכיתות שלי" + back_classroom: "בחזרה לכיתה" + back_courses: "בחזרה לקורסים שלי" + edit_details: "עריכת פרטי כיתה" + purchase_enrollments: "רכישת רישיונות תלמיד" + remove_student: "הסר תלמיד" + assign: "הקצה" + to_assign: "כדי להקצות קורסים בתשלום." + student: "תלמיד" + teacher: "מורה" + arena: "זירה" + available_levels: "שלבים זמינים" + started: "התחיל" + complete: "הושלם" + practice: "תרגול" + required: "חובה" + welcome_to_courses: "ברוכים הבאים לקורסים, הרפתקנים!" + ready_to_play: "מוכנים לשחק?" + start_new_game: "התחל משחק חדש" + play_now_learn_header: "שחקו כעת כדי ללמוד" + play_now_learn_1: "תחביר בסיסי לשליטה בדמות" + play_now_learn_2: "לולאות 'כל עוד' כדי לפתור פאזלים מעצבנים" + play_now_learn_3: "מחרוזות ומשתנים להתאמה של הפעולות" + play_now_learn_4: "כיצד להביס ענק (אלה כישורי חיים חשובים!)" + welcome_to_page: "לוח המחוונים שלי לתלמידים" + my_classes: "כיתות נוכחיות" + class_added: "הכיתה נוספה בהצלחה!" + view_levels: "הצג את כל השלבים בקורס" + view_project_gallery: "הצג פרויקטים של חבריי לכיתה" + join_class: "הצטרף לכיתה" + join_class_2: "הצטרף לכיתה" + ask_teacher_for_code: "שאלו את המורה אם יש לכם קוד כיתה של CodeCombat! אם כן, הזינו אותו למטה:" + enter_c_code: "<הזן קוד כיתה>" + join: "הצטרף" + joining: "מצטרף לכיתה" + course_complete: "הקורס הושלם" + play_arena: "שחק בזירה" + view_project: "הצג פרויקט" + start: "התחל" + last_level: "שלב אחרון ששיחקת" + not_you: "לא מדובר בך?" + continue_playing: "המשך לשחק" + option1_header: "הזמנת תלמידים בדואר אלקטרוני" + option1_body: "הערה: אם לתלמידים אין כתובות דואר אלקטרוני, הם יכולים להזין את קוד הכיתה הייחודי בעת יצירה של חשבון תלמיד, כדי להפוך את כתובות הדואר האלקטרוני לאופציה." + remove_student1: "הסר תלמיד" + are_you_sure: "האם אתה בטוח שברצונך להסיר תלמיד זה מכיתה זו?" + remove_description1: "התלמיד יאבד גישה לכיתה זה ולכיתות שהוקצו. ההתקדמות והמשחק לא יאבדו, וניתן יהיה להוסיף את התלמיד בחזרה לכיתה בכל עת." + remove_description2: "הרישיון בתשלום שמופעל לא יוחזר." + keep_student: "שמור תלמיד" + removing_user: "מסיר משתמש" + subtitle: "עיינו בסקירות כלליות של קורסים ובשלבים" # Flat style redesign + changelog: "עיינו בשינויים האחרונים בשלבי הקורסים." + select_language: "בחירת שפה" + select_level: "בחירת שלב" + play_level: "שחקו בשלב" + concepts_covered: "עקרונות לכיסוי" + view_guide_online: "סקירות כלליות ופתרונות לשלבים" + grants_lifetime_access: "מעניק גישה לכל הקורסים." + enrollment_credits_available: "רישיונות זמינים:" + language_select: "בחרו שפה" # ClassroomSettingsModal + language_cannot_change: "לא ניתן לשנות שפה לאחר שתלמידים הצטרפו לכיתה." + avg_student_exp_label: "ניסיון תכנות ממוצע לתלמיד" + avg_student_exp_desc: "מידע זה יעזור לנו לכוונן טוב יותר את קצב הקורסים." + avg_student_exp_select: "בחרו באפשרות המתאימה ביותר" + avg_student_exp_none: "ללא ניסיון - אין ניסיון או יש ניסיון מועט בלבד" + avg_student_exp_beginner: "מתחיל - חשיפה מסוימת או מבוסס-בלוקים" + avg_student_exp_intermediate: "רמת ביניים - ניסיון מסוים בקוד מוקלד" + avg_student_exp_advanced: "מתקדם - ניסיון נרחב בקוד מוקלד" + avg_student_exp_varied: "רמות ניסיון משתנות" + student_age_range_label: "טווח הגילאים של התלמידים" + student_age_range_younger: "פחות מגיל 6" + student_age_range_older: "מעל לגיל 18" + student_age_range_to: "עד" + create_class: "יצירת כיתה" + class_name: "שם כיתה" + teacher_account_restricted: "חשבונכם הוא חשבון מורה, ואין לו גישה אל תוכן תלמידים." + account_restricted: "כדי לגשת לדף זה, נדרש חשבון תלמיד." + update_account_login_title: "היכנסו כדי לעדכן את חשבונכם" + update_account_title: "צריך לטפל בדבר מה בחשבונכם!" + update_account_blurb: "כדי לקבל גישה אל הכיתות, יש לבחור את אופן השימוש בחשבון זה." + update_account_current_type: "סוג חשבון נוכחי:" + update_account_account_email: "דואר אלקטרוני/שם משתמש של החשבון:" + update_account_am_teacher: "אני מורה" + update_account_keep_access: "שמור גישה אל הכיתות שיצרתי" + update_account_teachers_can: "חשבונות מורה יכולים:" + update_account_teachers_can1: "ליצור/לנהל/להוסיף כיתות" + update_account_teachers_can2: "להקצות/לרשום תלמידים לקורסים" + update_account_teachers_can3: "לפתוח את כל דרגות הקורס לניסיון" + update_account_teachers_can4: "קבלו גישה אל תכונות למורים בלבד כאשר נשחרר אותן" + update_account_teachers_warning: "אזהרה: חשבונכם יוסר מכל הכיתות שאליהן הצטרפתם בעבר, ולא תוכלו לשחק בתור תלמיד." + update_account_remain_teacher: "הישאר בתור מורה" + update_account_update_teacher: "עדכון למורה" + update_account_am_student: "אני תלמיד/ה" + update_account_remove_access: "הסר גישה אל הכיתות שיצרתי" + update_account_students_can: "חשבונות תלמיד יכולים:" + update_account_students_can1: "להצטרף לכיתות" + update_account_students_can2: "שחקו בקרוסים בתור תלמיד, ועקבו אחר ההתקדמות שלכם" + update_account_students_can3: "התחרו בזירות נגד חבריכם לכיתה" + update_account_students_can4: "קבלו גישה אל תכונות לתלמידים בלבד כאשר נשחרר אותן" + update_account_students_warning: "אזהרה: לא תוכלו לנהל שום כיתה שיצרתם בעבר או ליצור כיתות חדשות." + unsubscribe_warning: "אזהרה: המנוי החודשי יבוטל." + update_account_remain_student: "הישאר בתור תלמיד" + update_account_update_student: "עדכון לתלמיד" + need_a_class_code: "לכיתה שאליה אתם מצטרפים נדרש קוד כיתה:" + update_account_not_sure: "לא בטוחים מה לבחור? שלחו דואר אלקטרוני לכתובת" + update_account_confirm_update_student: "האם אתם בטוחים שברצונכם לעדכן את חשבונכם לחוויית התלמיד?" + update_account_confirm_update_student2: "לא תוכלו לנהל שום כיתה שיצרתם בעבר או ליצור כיתות חדשות. הכיתות שיצרתם בעבר יוסרו מ-CodeCombat, ולא תהיה אפשרות לשחזר אותן." + instructor: "מדריך: " + youve_been_invited_1: "הוזמנתם להצטרף אל " + youve_been_invited_2: ", ושם תלמדו " + youve_been_invited_3: " עם חבריכם לכיתה ב-CodeCombat." + by_joining_1: "הצטרפות אל " + by_joining_2: "תאפשר לעזור לכם באיפוס הסיסמה אם תשכחו או תאבדו אותה. תוכלו גם לאמת את כתובת הדואר האלקטרוני שלכם, כדי שתוכלו לאפס את הסיסמה בכוחות עצמכם!" + sent_verification: "שלחנו הודעת אימות בדואר אלקטרוני אל:" + you_can_edit: "ניתן לערוך את כתובת הדואר האלקטרוני תחת " + account_settings: "הגדרות חשבון" + select_your_hero: "בחרו גיבור" + select_your_hero_description: "תמיד אפשר להחליף גיבור על-ידי מעבר אל דף הקורסים ולחיצה על \"החלף גיבור\"" + select_this_hero: "בחר גיבור זה" + current_hero: "הגיבור הנוכחי:" + change_hero: "החלף גיבור" + web_dev_language_transition: "עבור קורס זה, כל הכיתות מתכנתות ב-HTML/JavaScript. כיתות שכבר משתמשות ב-Python יתחילו עם כמה שלבי מבוא נוספים ב-JavaScript כדי להקל על המעבר. כיתות שכבר משתמשות ב-JavaScript ידלגו על שלבי המבוא." + course_membership_required_to_play: "כדי לשחק בשלב זה, יש להצטרף לקורס." + license_required_to_play: "בקשו מהמורה להקצות לכם רישיון, כדי שתוכלו להמשיך ולשחק ב-CodeCombat!" + + project_gallery: + no_projects_published: "פרסמו פרויקט בקורס זה לפני כולם!" + view_project: "הצג פרויקט" + edit_project: "עריכת פרויקט" + + teacher: + assigning_course: "מקצה קורס" + course_solution: "פתרון קורס" + level_overview_solutions: "סקירה כללית ופתרונות לשלב" + no_student_assigned: "לא הוקצו תלמידים לקורס זה." + paren_new: "(חדש)" + teacher_dashboard: "לוח המחוונים למורה" # Navbar + my_classes: "הכיתות שלי" + courses: "מדריכים לקורס" + enrollments: "רישיונות תלמיד" + resources: "משאבים" + help: "עזרה" + language: "שפה" + edit_class_settings: "עריכת הגדרות כיתה" + access_restricted: "נדרש עדכון חשבון" + teacher_account_required: "כדי לגשת לתוכן זה, נדרש חשבון מורה." + create_teacher_account: "יצירת חשבון מורה" + what_is_a_teacher_account: "מהו חשבון מורה?" + teacher_account_explanation: "חשבון מורה ב-CodeCombat מאפשר לכם להקים כיתות, לעקוב אחר התקדמות התלמידים בקורסים, לנהל רישיונות ולגשת אל משאבים שיעזרו לכם בבניית תכנית הלימודים." + current_classes: "כיתות נוכחיות" + archived_classes: "כיתות בארכיון" + archived_classes_blurb: "ניתן לשמור בארכיון כיתות, לצורך עיון בעתיד. הוציאו כיתה מהארכיון כדי שתופיע שוב ברשימת הכיתות הנוכחיות." + view_class: "הצג כיתה" + archive_class: "שמור כיתה בארכיון" + unarchive_class: "הוצא כיתה מהארכיון" + unarchive_this_class: "הוצא כיתה זו מהארכיון" + no_students_yet: "בכיתה זו עדיין אין תלמידים." + no_students_yet_view_class: "הציגו כיתה כדי להוסיף תלמידים." + try_refreshing: "(ייתכן שתצטרכו לרענן דף זה)" + create_new_class: "יצירת כיתה חדשה" + class_overview: "סקירת כיתה כללית" # View Class page + avg_playtime: "זמן משחק ממוצע בשלב" + total_playtime: """סה"כ זמן משחק""" + avg_completed: "שלבים שהושלמו בממוצע" + total_completed: """סה"כ שלבים שהושלמו""" + created: "נוצר" + concepts_covered: "עקרונות לכיסוי" + earliest_incomplete: "השלב המוקדם ביותר שלא הושלם" + latest_complete: "השלב המאוחר ביותר שלא הושלם" + enroll_student: "הרשמת תלמיד" + apply_license: "החל רישיון" + revoke_license: "שלול רישיון" + course_progress: "התקדמות בקורס" + not_applicable: "לא זמין" + edit: "עריכה" + edit_2: "עריכה" + remove: "הסר" + latest_completed: "אחרון שהושלם:" + sort_by: "מיין לפי" + progress: "התקדמות" + completed: "הושלם" + practice: "תרגול" + started: "התחיל" + click_to_view_progress: "לחצו כדי לעיין בהתקדמות" + no_progress: "אין התקדמות" + not_required: "לא נדרש" + select_course: "בחרו קורס להצגה" + progress_color_key: "מקרא צבעי התקדמות:" + level_in_progress: "השלב בביצוע כעת" + level_not_started: "השלב לא התחיל" + project_or_arena: "פרויקט או זירה" + students_not_assigned: "תלמידים שלהם לא הוקצה {{courseName}}" + course_overview: "סקירה כללית של הקורס" + copy_class_code: "העתק קוד כיתה" + class_code_blurb: "תלמידים יכולים להצטרף לכיתה באמצעות קוד כיתה זה. אין צורך בכתובת דואר אלקטרוני בעת יצירה של חשבון תלמיד עם קוד כיתה זה." + copy_class_url: "העתק כתובת URL של כיתה" + class_join_url_blurb: "כמו כן, ניתן לפרסם בדף אינטרנט משותף כתובת URL ייחודית זו של הכיתה." + add_students_manually: "הזמנת תלמידים בדואר אלקטרוני" + bulk_assign: "הקצאה המונית" + assigned_msg_1: "{{courseName}} הוקצה ל-{{numberAssigned}} תלמידים." + assigned_msg_2: "הוחלו {{numberEnrolled}} רישיונות." + assigned_msg_3: "נותרו לכם {{remainingSpots}} רישיונות זמינים." + assign_course: "הקצה קורס" + not_assigned_modal_title: "לא הוקצו קורסים" + not_assigned_modal_starter_body_1: "לקורס זה נדרש רישיון למתחילים. אין מספיק רישיונות למתחילים זמינים על מנת להקצות קורס זה לכל __selected__ התלמידים שנבחרו." + not_assigned_modal_starter_body_2: "רכשו רישיונות למתחילים כדי להעניק גישה אל קורס זה." + not_assigned_modal_full_body_1: "לקורס זה נדרש רישיון מלא. אין מספיק רישיונות מלאים זמינים על מנת להקצות קורס זה לכל __selected__ התלמידים שנבחרו." + not_assigned_modal_full_body_2: "יש לכם __numFullLicensesAvailable__ רישיונות מלאים בלבד (ל-__numStudentsWithoutFullLicenses__ תלמידים אין כעת רישיון מלא פעיל)." + not_assigned_modal_full_body_3: "נא לבחור פחות תלמידים או לפנות אל __supportEmail__ לקבלת סיוע." + assign_to_selected_students: "הקצה לתלמידים הנבחרים" + assigned: "הוקצה" + enroll_selected_students: "רשום את התלמידים הנבחרים" + no_students_selected: "לא נבחרו תלמידים." + show_students_from: "הראה תלמידים מ:" # Enroll students modal + apply_licenses_to_the_following_students: "החל רישיונות על התלמידים שלהלן" + students_have_licenses: "כבר הוחלו רישיונות על התלמידים שלהלן:" + all_students: "כל התלמידים" + apply_licenses: "החל רישיונות" + not_enough_enrollments: "אין מספיק רישיונות זמינים." + enrollments_blurb: "לתלמידים נדרש רישיון כדי לגשת לתוכן כלשהו אחרי הקורס הראשון." + how_to_apply_licenses: "כיצד להחיל רישיונות" + export_student_progress: "ייצוא התקדמות תלמידים (CSV)" + send_email_to: "שלח הודעת שחזור סיסמה בדואר אלקטרוני לכתובת:" + email_sent: "הודעת דואר אלקטרוני נשלחה" + send_recovery_email: "שלח הודעת שחזור בדואר אלקטרוני" + enter_new_password_below: "הזן סיסמה חדשה למטה:" + change_password: "שינוי סיסמה" + changed: "השתנה" + available_credits: "רישיונות זמינים" + pending_credits: "רישיונות בהמתנה" + empty_credits: "רישיונות שנוצלו" + license_remaining: "רישיון נותר" + licenses_remaining: "רישיונות נותרו" + one_license_used: "רישיון 1 נוצל" + num_licenses_used: "__numLicensesUsed__ רישיונות נוצלו" + starter_licenses: "רישיונות למתחילים" + start_date: "תאריך התחלה:" + end_date: "תאריך סיום:" + get_enrollments_blurb: " אנו נעזור לכם לבנות פתרונות שעומדים בצורכי הכיתה, מוסד הלימודים או המחוז שלכם." + how_to_apply_licenses_blurb_1: "כאשר מורה מקצה קורס לתלמיד בפעם הראשונה, אנו נחיל רישיון באופן אוטומטי. באמצעות התפריט הנפתח להקצאה המונית בכיתה, ניתן להקצות קורס לתלמידים הנבחרים:" + how_to_apply_licenses_blurb_2: "האם עדיין אפשר להחיל רישיון בלי להקצות קורס?" + how_to_apply_licenses_blurb_3: "כן - עברו אל כרטיסיית מצב הרישיון בכיתה שלכם, ולחצו על \"החל רישיון\" עבור כל תלמיד שאין לו רישיון פעיל." + request_sent: "הבקשה נשלחה!" + license_status: "מצב רישיון" + status_expired: "פג בתאריך {{date}}" + status_not_enrolled: "לא רשום" + status_enrolled: "יפוג בתאריך {{date}}" + select_all: "בחר הכול" + project: "פרויקט" + project_gallery: "גלריית פרויקט" + view_project: "הצג פרויקט" + unpublished: "(לא פורסם)" + view_arena_ladder: "הצג טבלת זירה" + resource_hub: "מרכז המשאבים" + getting_started: "כיצד להתחיל" + educator_faq: "שאלות נפוצות לאנשי חינוך" + educator_faq_desc: "שאלות נפוצות על השימוש ב-CodeCombat בכיתה או במוסד הלימודים שלכם." + teacher_getting_started: "מדריך ההתחלה המהירה למורה" + teacher_getting_started_desc: "חדשים ב-CodeCombat? הורידו את מדריך ההתחלה המהירה למורה כדי להקים חשבון, ליצור את הכיתה הראשונה ולהזמין תלמידים לקורס הראשון." + student_getting_started: "מדריך התחלה מהירה לתלמיד" + student_getting_started_desc: "תוכלו לחלק מדריך זה לתלמידים שלכם לפני שתתחילו עם CodeCombat, כדי לתת להם הזדמנות להכיר את עורך הקוד. ניתן להשתמש במדריך זה בכיתות ללימוד Python ו-JavaScript ." + cs1: "מבוא למדעי המחשב" + cs2: "מדעי המחשב 2" + cs3: "מדעי המחשב 3" + cs4: "מדעי המחשב 4" + cs5: "מדעי המחשב 5" + cs1_syntax_python: "קורס 1 מדריך לתחביר Python" + cs1_syntax_python_desc: "'דף עיון מהיר עם תחביר Python נפוץ אשר התלמידים ילמדו במבוא למדעי המחשב." + cs1_syntax_javascript: "קורס 1 מדריך לתחביר JavaScript" + cs1_syntax_javascript_desc: "'דף עיון מהיר עם תחביר JavaScript נפוץ אשר התלמידים ילמדו במבוא למדעי המחשב." + coming_soon: "מדריכים נוספים יגיעו בקרוב!" + engineering_cycle_worksheet: "גיליון מחזור הנדסה" + engineering_cycle_worksheet_desc: "השתמשו בגיליון זה כדי ללמד תלמידים את עקרונות הבסיס של מחזור ההנדסה: הערכה, עיצוב, יישום ואיתור באגים עיינו בגיליון המלא לדוגמה בתור הנחיה." + engineering_cycle_worksheet_link: "הצג דוגמה" + progress_journal: "יומן התקדמות" + progress_journal_desc: "עודדו תלמידים לעקוב אחר ההתקדמות שלהם באמצעות יומן התקדמות." + cs1_curriculum: "מבוא למדעי המחשב - מדריך תכנית הלימודים" + cs1_curriculum_desc: "טווח ההכרה והסדר, תכניות שיעורים, פעילויות ועוד עבור קורס 1." + arenas_curriculum: "שלבי זירה - הדרכת מורה" + arenas_curriculum_desc: "הוראות לגבי ההרצה של הזירות וואקה מול,‏ העצמות המוצלבות ופסגת הכוח למשתתפים מרובים בכיתה שלכם." + cs2_curriculum: "מדעי המחשב 2 - מדריך לתכנית הלימודים" + cs2_curriculum_desc: "טווח ההכרה והסדר, תכניות שיעורים, פעילויות ועוד עבור קורס 2." + cs3_curriculum: "מדעי המחשב 3 - מדריך לתכנית הלימודים" + cs3_curriculum_desc: "טווח ההכרה והסדר, תכניות שיעורים, פעילויות ועוד עבור קורס 3." + cs4_curriculum: "מדעי המחשב 4 - מדריך לתכנית הלימודים" + cs4_curriculum_desc: "הסדר וההיקף, תכניות שיעורים, פעילויות ועוד עבור קורס 4." + cs5_curriculum_js: "מדעי המחשב 5 - מדריך לתכנית הלימודים (JavaScript)" + cs5_curriculum_desc_js: "טווח ההכרה והסדר, תכניות שיעורים, פעילויות ועוד עבור כיתות של קורס 5 עם JavaScript." + cs5_curriculum_py: "מדעי המחשב 5 - מדריך לתכנית הלימודים (Python)" + cs5_curriculum_desc_py: "טווח ההכרה והסדר, תכניות שיעורים, פעילויות ועוד עבור כיתות של קורס 5 עם Python." + cs1_pairprogramming: "פעילות של תכנות בזוגות" + cs1_pairprogramming_desc: "הציגו לתלמידים תרגיל לתכנות בזוגות, שיעזור להם לשפר את כישורי ההאזנה והתקשורת." + gd1: "פיתוח משחקים 1" + gd1_guide: "פיתוח משחקים 1 - מדריך פרויקט" + gd1_guide_desc: "היעזרו בכך כדי להדריך את התלמידים שלכם במהלך יצירת הפרויקט הראשון שלהם למשחק שניתן לשתף בפרק זמן של 5 ימים." + wd1: "פיתוח אינטרנט 1" + wd1_headlines: "פעילות בכותרות ובכותרות עליונות" + wd1_headlines_example: "הצג פתרון לדוגמה" + wd1_headlines_desc: "מדוע תגיות הפסקה והכותרת העליונה חשובות? השתמשו בפעילות זו כדי להראות כיצד בחירה נכונה בכותרות עליונות מקלה על קריאתם של דפי אינטרנט. יש המון פתרונות נכונים!" + wd1_html_syntax: "מדריך לתחביר HTML" + wd1_html_syntax_desc: "גיליון לעיון באורך דף אחד עבור סגנון ה-HTML שהתלמידים ילמדו במסגרת 'פיתוח אינטרנט 1'." + wd1_css_syntax: "מדריך לתחביר CSS" + wd1_css_syntax_desc: "גיליון לעיון באורך דף אחד עבור תחביר ה-CSS והסגנון שהתלמידים ילמדו במסגרת 'פיתוח אינטרנט 1'." + wd2: "פיתוח אינטרנט 2" + wd2_jquery_syntax: "מדריך לתחביר פונקציות jQuery" + wd2_jquery_syntax_desc: "גיליון לעיון באורך דף אחד עבור פונקציות ה-jQuery שהתלמידים ילמדו במסגרת 'פיתוח אינטרנט 2'." + wd2_quizlet_worksheet: "גיליון לתכנון מבחן" + wd2_quizlet_worksheet_instructions: "הצג הוראות ודוגמאות" + wd2_quizlet_worksheet_desc: "לפני שהתלמידים שלכם יבנו פרויקט מבחן אישיות משלהם בסוף של 'פיתוח אינטרנט 2', עליהם לתכנן את שאלות המבחן שלהם, את התוצאות ואת התשובות באמצעות גיליון עבודה זה. מורים יכולים לחלק את ההוראות והדוגמאות לעיון התלמידים." + student_overview: "סקירה כללית" + student_details: "פרטי תלמיד" + student_name: "שם תלמיד" + no_name: "לא סופק שם." + no_username: "לא סופק שם משתמש." + no_email: "לא הוגדרה כתובת דואר אלקטרוני עבור התלמיד." + student_profile: "פרופיל תלמיד" + playtime_detail: "פירוט זמן משחק" + student_completed: "הושלם על-ידי התלמיד" + student_in_progress: "בביצוע כעת על-ידי התלמיד" + class_average: "ממוצע כיתתי" + not_assigned: "לא קיבל/ה הקצאה של הקורסים שלהלן" + playtime_axis: "זמן משחק בשניות" + levels_axis: "שלבים ב:" + student_state: "איך" + student_state_2: "מתקדם/ת?" + student_good: "מתקדם/ת היטב" + student_good_detail: "התלמיד/ה עומד/ת בקצב של הכיתה." + student_warn: "ייתכן שיש צורך לעזור קצת ב:" + student_warn_detail: "ייתכן שלתלמיד/ה זה/ו דרושה מעט עזרה בעקרונות החדשים שהוצגו בקורס זה." + student_great: "מסתדר/ת מצוין עם" + student_great_detail: "ייתכן שתלמיד או תלמידה זו הם מועמדים טובים לעזור לתלמידים אחרים במהלך קורס זה." + full_license: "רישיון מלא" + starter_license: "רישיון למתחילים" + trial: "ניסיון" + hoc_welcome: "שבוע לימוד-מדעי-המחשב שמח" + hoc_intro: 'לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב"שעת הקוד" עם CodeCombat' + hoc_self_led: "משחק בהנחיה עצמית" + hoc_self_led_desc: 'לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב"שעת הקוד" עם CodeCombat' + hoc_game_dev: "פיתוח משחקים" + hoc_and: "וכן" + hoc_programming: "תכנות ב-JavaScript/Python" + hoc_teacher_led: "שיעורים בהנחיית מורה" + hoc_teacher_led_desc1: "הורידו את" + hoc_teacher_led_link: "תכניות השיעורים שלנו עבור מבוא למדעי המחשב" + hoc_teacher_led_desc2: "כדי להציג בפני התלמידים שלכם עקרונות תכנות באמצעות פעילויות בלתי-מקוונות" + hoc_group: "משחק קבוצתי" + hoc_group_desc_1: "מורים יכולים להשתמש בשיעורים בשילוב עם קורס המבוא שלנו למדעי המחשב, כדי לעקוב אחר התקדמות התלמידים. עיינו" + hoc_group_link: "במדריך ההתחלה המהירה שלנו" + hoc_group_desc_2: "לפרטים נוספים" + hoc_additional_desc1: "למשאבים ולפעילויות נוספים של CodeCombat, עיינו" + hoc_additional_desc2: "בשאלות שלנו" + hoc_additional_contact: "צרו קשר" + revoke_confirm: "האם אתם בטוחים שברצונכם לשלול רישיון מלא מהתלמיד/ה {{student_name}}? רישיון זה ייעשה זמין להקצאה לתלמיד אחר." + revoking: "שולל רישיון..." + unused_licenses: "יש לכם רישיונות בלתי-מנוצלים, המאפשרים לכם להקצות לתלמידים קורסים בתשלום, כאשר הם יהיו מוכנים ללמוד עוד!" + remember_new_courses: "זכרו להקצות קורסים חדשים!" + more_info: "מידע נוסף" + how_to_assign_courses: "כיצד להקצות קורסים" + select_students: "בחרו תלמידים" + select_instructions: "לחצו על תיבת הסימון שלצד כל תלמיד שברצונכם להקצות לו קורסים." + choose_course: "בחרו קורס" + choose_instructions: "בחרו מהתפריט הנפתח את הקורס שברצונכם להקצות, ולאחר מכן לחצו על 'הקצה לתלמידים הנבחרים'." + push_projects: "מומלץ להקצות את 'פיתוח אינטרנט 1' או 'פיתוח משחקים 1' לאחר שהתלמידים סיימו את 'מבוא למדעי המחשב'! ראו {{resource_hub}} לפרטים נוספים על קורסים אלה." + teacher_quest: "מסע המורה להצלחה" + quests_complete: "מסעות הושלמו" + teacher_quest_create_classroom: "יצירת כיתה" + teacher_quest_add_students: "הוסף תלמידים" + teacher_quest_teach_methods: "עזרו לתלמידים שלכם ללמוד כיצד 'לקרוא למתודות'." + teacher_quest_teach_methods_step1: "הביאו 75% מכיתה אחת לפחות אל השלב הראשון, __Dungeons of Kithgard__" + teacher_quest_teach_methods_step2: "הדפיסו את [Student Quick Start Guide]‏(http://files.codecombat.com/docs/resources/StudentQuickStartGuide.pdf) במרכז המשאבים." + teacher_quest_teach_strings: "במקום לסבך את התלמידים, למדו אותם 'מחרוזות'." + teacher_quest_teach_strings_step1: "הביאו 75% מכיתה אחת לפחות אל __True Names__" + teacher_quest_teach_strings_step2: "השתמשו בבורר השלבים של המורה בדף [Course Guides]‏(/teachers/courses) כדי לראות תצוגה מקדימה של __True Names__." + teacher_quest_teach_loops: "אל תלכו במעגלים - למדו את התלמידים על 'לולאות'." + teacher_quest_teach_loops_step1: "הביאו 75% מכיתה אחת לפחות אל __Fire Dancing__." + teacher_quest_teach_loops_step2: "היעזרו בחומר על __Loops Activity__ תחת [CS1 Curriculum guide](/teachers/resources/cs1) כדי לחזק עיקרון זה." + teacher_quest_teach_variables: "הוסיפו גיוון עם 'משתנים'." + teacher_quest_teach_variables_step1: "הביאו 75% מכיתה אחת לפחות אל __Known Enemy__." + teacher_quest_teach_variables_step2: "עודדו שיתוף פעולה, באמצעות [Pair Programming Activity](/teachers/resources/pair-programming)." + teacher_quest_kithgard_gates_100: "היחלצו משערי קיתגארד עם הכיתה שלכם." + teacher_quest_kithgard_gates_100_step1: "הביאו 75% מכיתה אחת לפחות אל __Kithgard Gates__." + teacher_quest_kithgard_gates_100_step2: "הנחו את התלמידים כיצד לחשוב על בעיות קשות באמצעות [Engineering Cycle Worksheet]‏(http://files.codecombat.com/docs/resources/EngineeringCycleWorksheet.pdf)." + teacher_quest_wakka_maul_100: "התכוננו לדו-קרב בוואקה מול." + teacher_quest_wakka_maul_100_step1: "הביאו 75% מכיתה אחת לפחות אל __Wakka Maul__." + teacher_quest_wakka_maul_100_step2: "ראו [Arena Guide]‏(/teachers/resources/arenas) ב[Resource Hub]‏(/teachers/resources) לעצות על ניהול של יום מוצלח בזירה." + teacher_quest_reach_gamedev: "לחקור עולמות חדשים!" + teacher_quest_reach_gamedev_step1: "[Get licenses]‏(/teachers/licenses) כדי שהתלמידים שלכם יוכלו לחקור עולמות חדשים, כמו 'פיתוח משחקים' ו'פיתוח אינטרנט'!" + teacher_quest_done: "רוצים שהתלמידים שלכם ילמדו אפילו יותר קוד? צרו קשר עם [school specialists]‏(mailto:schools@codecombat.com) עוד היום!" + teacher_quest_keep_going: "המשיכו במסלול! זה מה שתוכלו לעשות בשלב הבא:" + teacher_quest_more: "לראות את כל המסעות" + teacher_quest_less: "לראות פחות מסעות" + refresh_to_update: "(רעננו את הדף כדי לראות עדכונים)" + view_project_gallery: "הצג גלריית פרויקט" + + share_licenses: + share_licenses: "שיתוף רישיונות" + shared_by: "משותף על-ידי:" + add_teacher_label: "נא להזין כתובת דואר אלקטרוני מדויקת של המורה:" + add_teacher_button: "הוסף מורה" + subheader: "תוכלו להעניק למורים אחרים בארגון שלכם גישה אל רישיונותיכם. כל רישיון יכול לשמש תלמיד אחד בלבד בכל רגע נתון." + teacher_not_found: "המורה לא נמצא. נא לוודא שמורה זה כבר יצר חשבון מורה." + teacher_not_valid: "חשבון זה אינו חשבון מורה תקף. רק חשבונות מורה יכולים לשתף רישיונות." + already_shared: "כבר שיתפתם רישיונות אלה עם מורה זה." + teachers_using_these: "מורים שיכולים לגשת אל רישיונות אלה:" + footer: "כאשר מורים שוללים רישיונות מתלמידים, הרישיונות חוזרים אל המאגר המשותף, לשימושם של מורים אחרים בקבוצה זו." + you: "(אתם)" + one_license_used: "(רישיון אחד בשימוש)" + licenses_used: "(__licensesUsed__ רישיונות בשימוש)" + more_info: "מידע נוסף" + + sharing: + game: "משחק" + webpage: "דף אינטרנט" + your_students_preview: "התלמידים שלכם ילחצו כאן כדי לראות את הפרויקטים הסופיים שלהם! Unavailable in teacher preview." + unavailable: "שיתוף קישורים אינו זמין בתצוגה המקדימה של המורה." + share_game: "שתף משחק זה" + share_web: "שתף דף אינטרנט זה" + victory_share_prefix: "שתפו קישור זה כדי להזמין חברים ובני משפחה" + victory_share_game: "לשחק את השלב שלכם במשחק" + victory_share_web: "לצפות בדף האינטרנט שלכם" + victory_share_suffix: "." + victory_course_share_prefix: "קישור זה יאפשר לחברים ולבני משפחה" + victory_course_share_game: "לשחק במשחק" + victory_course_share_web: "לצפות בדף האינטרנט" + victory_course_share_suffix: "שיצרתם כעת." + copy_url: "העתק כתובת URL" + + game_dev: + creator: "יוצר" + + web_dev: + image_gallery_title: "גלריית תמונות" + select_an_image: "בחרו את התמונה שבה תרצו להשתמש" + scroll_down_for_more_images: "(לתמונות נוספות, גללו מטה)" + copy_the_url: "העתיקו את כתובת ה-URL למטה" + copy_the_url_description: "תוכלו להיעזר באפשרות זו כדי להחליף תמונה קיימת." + copy_the_img_tag: "העתיקו את התגית " + copy_the_img_tag_description: "תוכלו להיעזר באפשרות זו כדי להוסיף תמונה חדשה." + copy_url: "העתק כתובת URL" + copy_img: "העתק " + how_to_copy_paste: "כיצד להעתיק/להדביק" + copy: "העתק" + paste: "הדבק" + back_to_editing: "בחזרה לעריכה" + classes: - archmage_title: "כשף על" - archmage_title_description: "(מתכנת)" - archmage_summary: "!אם אתה מפתח שמעוניין בתכנות משחקי לימוד קוד חינוכיים, הפוך לרב-כשף ועזור לנו לבנות את המשחק" - artisan_title: "אמן" + archmage_title: "קוסם-על" + archmage_title_description: "(מקודד)" + archmage_summary: "אם אתם מפתחים שמתעניינים בקידוד של משחקים לימודיים, בואו להפוך לקוסמי-על ולעזור לנו לבנות את CodeCombat!" + artisan_title: "בעל מלאכה" artisan_title_description: "(בונה שלבים)" - artisan_summary: ".בנה ושתף שלבים שאתה וחבריך תשחקו בהם. הפוך לאמן כדי ללמוד את האומנות של לימוד תכנות לאחרים" + artisan_summary: "בנו ושתפו שלבים שאתם וחבריכם תוכלו לשחק בהם. הפכו לבעל מלאכה כדי ללמוד את אמנות העברת הידע בתכנות לאחרים." adventurer_title: "הרפתקן" - adventurer_title_description: "(שחקן שלבים ניסיוניים)" - adventurer_summary: ".השג את השלבים החדשים שלנו (כולל את תוכן המנןי) שבוע לפני כולם ועזור לנו לתקן את הבאגים שנמצאים בהם" + adventurer_title_description: "(בודק משחק בשלבים)" + adventurer_summary: "קבלו את השלבים החדשים שלנו (אפילו תוכן למנויים) בחינם שבוע אחד מוקדם יותר, ועזרו לנו לנקות את הבאגים לפני השחרור לציבור הרחב." scribe_title: "סופר" - scribe_title_description: "(עורך כותרות)" -# scribe_summary: "Good code needs good documentation. Write, edit, and improve the docs read by millions of players across the globe." + scribe_title_description: "(עורך מאמרים)" + scribe_summary: "קוד טוב צריך תיעוד טוב. כתבו, ערכו ושפרו את המסמכים הנקראים על-ידי מיליוני שחקנים ברחבי העולם." diplomat_title: "דיפלומט" diplomat_title_description: "(מתרגם)" -# diplomat_summary: "CodeCombat is localized in 45+ languages by our Diplomats. Help us out and contribute translations." + diplomat_summary: "CodeCombat זכה ללוקליזציה ביותר מ-45 שפות על-ידי הדיפלומטים שלנו. עזרו לנו, ותרמו תרגומים." ambassador_title: "שגריר" ambassador_title_description: "(תמיכה)" -# ambassador_summary: "Tame our forum users and provide direction for those with questions. Our ambassadors represent CodeCombat to the world." -# teacher_title: "Teacher" - + ambassador_summary: "רסנו את משתמשי הפורום שלנו, וספקו הכוונה עבור אלה שיש להם שאלות. השגרירים שלנו מייצגים את CodeCombat מול העולם." + teacher_title: "מורה" + editor: - main_title: "CodeCombat עורך" - article_title: "עורך כותרות" - thang_title: "עורך ת'אנג" + main_title: "עורכי CodeCombat" + article_title: "עורך מאמרים" + thang_title: "עורך Thang" level_title: "עורך שלבים" -# course_title: "Course Editor" + course_title: "עורך קורסים" achievement_title: "עורך הישגים" poll_title: "עורך סקרים" back: "חזרה" - revert: "שחזר" - revert_models: "שחזר מודלים" - pick_a_terrain: "בחר סוג שטח" - dungeon: "צינוק" - indoor: "בפנים" + revert: "חזרה למצב קודם" + revert_models: "חזרה למודלים קודמים" + pick_a_terrain: "בחר שטח" + dungeon: "מבוך" + indoor: "מבנה" desert: "מדבר" - grassy: "עשבי" -# mountain: "Mountain" -# glacier: "Glacier" + grassy: "עשב" + mountain: "הר" + glacier: "קרחון" small: "קטן" - large: "רחב" - fork_title: "פצל גירסה חדשה" + large: "גדול" + fork_title: "פיצול לגרסה חדשה" fork_creating: "יוצר פיצול..." - generate_terrain: "צור שטח" + generate_terrain: "הפק שטח" more: "עוד" wiki: "ויקי" live_chat: "צ'אט חי" thang_main: "ראשי" -# thang_spritesheets: "Spritesheets" + thang_spritesheets: "גיליונות ספרייט" thang_colors: "צבעים" - level_some_options: "?קצת אפשרויות" - level_tab_thangs: "ת'אנגס" - level_tab_scripts: "תסריטים" - level_tab_components: "מרכיבים" + level_some_options: "יש כמה אפשרויות?" + level_tab_thangs: "Thangs" + level_tab_scripts: "קובצי Script" + level_tab_components: "רכיבים" level_tab_systems: "מערכות" - level_tab_docs: "דוקומנטציה" - level_tab_thangs_title: "ת'אנגס נוכחיים" - level_tab_thangs_all: "הכל" - level_tab_thangs_conditions: "תנאים התחלתיים" - level_tab_thangs_add: "הוסף ת'אנגס" - level_tab_thangs_search: "חפש ת'אנגס" - add_components: "הוסף מרכיבים" - component_configs: "קבע תצורת מרכיבים" - config_thang: "לחץ פעמיים כדי לשנות ת'אנג" + level_tab_docs: "תיעוד" + level_tab_thangs_title: "Thangs נוכחיים" + level_tab_thangs_all: "הכול" + level_tab_thangs_conditions: "תנאי התחלה" + level_tab_thangs_add: "הוסף Thangs" + level_tab_thangs_search: "חפש thangs" + add_components: "הוסף רכיבים" + component_configs: "תצורות רכיבים" + config_thang: "לחצו פעמיים כדי להגדיר thang" delete: "מחק" - duplicate: "שכפל" - stop_duplicate: "עצור שכפןל" + duplicate: "שכפול" + stop_duplicate: "עצור שכפול" rotate: "סובב" - level_component_tab_title: "מרכיבים נוכחיים" - level_component_btn_new: "צור מרכיב חדש" - level_systems_tab_title: "מערכת נוכחית" + level_component_tab_title: "רכיבים נוכחיים" + level_component_btn_new: "צור רכיב חדש" + level_systems_tab_title: "מערכות נוכחיות" level_systems_btn_new: "צור מערכת חדשה" level_systems_btn_add: "הוסף מערכת" - level_components_title: "בחזרה לכל ה ת'אנגס" + level_components_title: "בחזרה לכל ה-Thangs" level_components_type: "סוג" - level_component_edit_title: "ערוך מרכיב" -# level_component_config_schema: "Config Schema" - level_system_edit_title: "מערכת עריכה" - create_system_title: "צור מערכת חדשה" - new_component_title: "צור מרכיב חדש" + level_component_edit_title: "עריכת רכיב" + level_component_config_schema: "סכימת תצורה" + level_system_edit_title: "עריכת מערכת" + create_system_title: "יצירת מערכת חדשה" + new_component_title: "יצירת רכיב חדש" new_component_field_system: "מערכת" - new_article_title: "צור כותרת חדשה" - new_thang_title: "צור סוג ת'אנג חדש" - new_level_title: "צור שלב חדש" - new_article_title_login: "התחבר כדי ליצור כותרת חדשה" - new_thang_title_login: "היכנס כדי ליצור סוג ת'אנג חדש" - new_level_title_login: "התחבר כדי ליצור שלב חדש" - new_achievement_title: "צור הישג חדש" - new_achievement_title_login: "התחבר כדי ליצור הישג חדש" - new_poll_title: "צור סקר חדש" - new_poll_title_login: "התחבר כדי ליצור סקר חדש" - article_search_title: "חפש כותרות כאן" - thang_search_title: "חפש סוגי ת'אנגס" - level_search_title: "חפש שלבים כאן" - achievement_search_title: "חפש הישגים" - poll_search_title: "חפש סקרים" - read_only_warning2: ".הערה: אין באפשרותך לשמור את העריכות שבוצעו כאן, אתה לא מחובר למערכת" - no_achievements: "אין הישגים שנוספו לשלב זה עד כה" -# achievement_query_misc: "Key achievement off of miscellanea" -# achievement_query_goals: "Key achievement off of level goals" - level_completion: "סיום שלב" - pop_i18n: "I18N אכלס" - tasks: "מטלות" - clear_storage: "נקה את השינויים המקומיים" -# add_system_title: "Add Systems to Level" -# done_adding: "Done Adding" - + new_article_title: "יצירת מאמר חדש" + new_thang_title: "יצירת סוג חדש של Thang" + new_level_title: "יצירת שלב חדש" + new_article_title_login: "היכנסו כדי ליצור מאמר חדש" + new_thang_title_login: "היכנסו כדי ליצור סוג Thang חדש" + new_level_title_login: "היכנסו כדי ליצור שלב חדש" + new_achievement_title: "יצירת הישג חדש" + new_achievement_title_login: "היכנסו כדי ליצור הישג חדש" + new_poll_title: "יצירת סקר חדש" + new_poll_title_login: "היכנסו כדי ליצור סקר חדש" + article_search_title: "חפשו מאמרים כאן" + thang_search_title: "חפשו סוגי Thang כאן" + level_search_title: "חפשו שלבים כאן" + achievement_search_title: "חיפוש הישגים" + poll_search_title: "חיפוש סקרים" + read_only_warning2: "הערה: אין באפשרותך לשמור כאן שום עריכות, משום שאינך מחובר." + no_achievements: "טרם נוספו הישגים לשלב זה." + achievement_query_misc: "Key achievement off of miscellanea" + achievement_query_goals: "Key achievement off of level goals" + level_completion: "השלמת שלבים" + pop_i18n: "אכלוס לוקליזציה" + tasks: "משימות" + clear_storage: "נקו שינויים מקומיים שלכם" + add_system_title: "הוספת מערכות לשלב" + done_adding: "ההוספה הסתיימה" + article: - edit_btn_preview: "צפה בכותרת" - edit_article_title: "ערוך כותרת" - + edit_btn_preview: "תצוגה מקדימה" + edit_article_title: "עריכת מאמר" + polls: priority: "עדיפות" - + contribute: - page_title: "תרימה" -# intro_blurb: "CodeCombat is 100% open source! Hundreds of dedicated players have helped us build the game into what it is today. Join us and write the next chapter in CodeCombat's quest to teach the world to code!" - alert_account_message_intro: "!היי" -# alert_account_message: "To subscribe for class emails, you'll need to be logged in first." -# archmage_introduction: "One of the best parts about building games is they synthesize so many different things. Graphics, sound, real-time networking, social networking, and of course many of the more common aspects of programming, from low-level database management, and server administration to user facing design and interface building. There's a lot to do, and if you're an experienced programmer with a hankering to really dive into the nitty-gritty of CodeCombat, this class might be for you. We would love to have your help building the best programming game ever." -# class_attributes: "Class Attributes" - archmage_attribute_1_pref: " ידע ב" -# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." -# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." + page_title: "תרומה" + intro_blurb: "CodeCombat בנוי מ-100% קוד פתוח! מאות שחקנים מסורים כבר עזרו לנו להביא את המשחק לרמתו הנוכחית. הצטרפו אלינו, כדי לכתוב את הפרק הבא במסע של CodeCombat ללמד את העולם איך לקודד!" + alert_account_message_intro: "שלום!" + alert_account_message: "כדי להירשם כמנוי להודעות כיתה בדואר אלקטרוני, יש להתחבר תחילה למערכת." + archmage_introduction: "אחד הדברים הטובים ביותר בבנייה של משחקים הוא הסינתזה בין הדברים השונים. גרפיקה, צליל, עבודה ברשת בזמן אמת, רישות חברתי וכמובן הרבה היבטים נפוצים יותר של התכנות, מניהול מסד נתונים בדרך נמוך, דרך ניהול שרתים ועד לעיצוב עבור המשתמשים ובניית ממשקים. המלאכה מרובה, ואם אתם מתכנתים מנוסים שאוהבים ממש לרדת לפרטים של CodeCombat, אולי זה המקצוע שמתאים לכם. נשמח מאוד לעזרתכם בבניית משחק התכנות הטוב ביותר אי פעם." + class_attributes: "תכונות המקצוע" + archmage_attribute_1_pref: "ידע ב: " + archmage_attribute_1_suf: ", או רצון ללמוד. רוב הקודים שלנו כתובים בשפה זו. אם אתם חובבי Ruby או Python, תרגישו ממש בבית. זה JavaScript, אבל עם תחביר יותר יפה." + archmage_attribute_2: "ניסיון מסוים בתכנות ויזמה אישית. אנו נעזור לכם בהכוונה הראשונית, אך לא נוכל להקדיש זמן רב בהכשרתכם." how_to_join: "כיצד להצטרף" - join_desc_1: " כל אחד יכול לעזור! רק תבדקו את ה" -# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " -# join_desc_3: ", or find us in our " -# join_desc_4: "and we'll go from there!" -# join_url_email: "Email us" -# join_url_slack: "public Slack channel" -# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements." -# artisan_introduction_pref: "We must construct additional levels! People be clamoring for more content, and we can only build so many ourselves. Right now your workstation is level one; our level editor is barely usable even by its creators, so be wary. If you have visions of campaigns spanning for-loops to" -# artisan_introduction_suf: ", then this class might be for you." -# artisan_attribute_1: "Any experience in building content like this would be nice, such as using Blizzard's level editors. But not required!" -# artisan_attribute_2: "A hankering to do a whole lot of testing and iteration. To make good levels, you need to take it to others and watch them play it, and be prepared to find a lot of things to fix." -# artisan_attribute_3: "For the time being, endurance en par with an Adventurer. Our Level Editor is super preliminary and frustrating to use. You have been warned!" -# artisan_join_desc: "Use the Level Editor in these steps, give or take:" -# artisan_join_step1: "Read the documentation." -# artisan_join_step2: "Create a new level and explore existing levels." -# artisan_join_step3: "Find us in our public Slack channel for help." -# artisan_join_step4: "Post your levels on the forum for feedback." -# artisan_subscribe_desc: "Get emails on level editor updates and announcements." -# adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." -# adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." -# adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." -# adventurer_join_pref: "Either get together with (or recruit!) an Artisan and work with them, or check the box below to receive emails when there are new levels to test. We'll also be posting about levels to review on our networks like" -# adventurer_forum_url: "our forum" -# adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" -# adventurer_subscribe_desc: "Get emails when there are new levels to test." -# scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " -# scribe_introduction_url_mozilla: "Mozilla Developer Network" -# scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." -# scribe_attribute_1: "Skill in words is pretty much all you need. Not only grammar and spelling, but able to convey complicated ideas to others." -# contact_us_url: "Contact Us" -# scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!" -# scribe_subscribe_desc: "Get emails about article writing announcements." -# diplomat_introduction_pref: "So, if there's one thing we learned from the " -# diplomat_launch_url: "launch in October" -# diplomat_introduction_suf: "it's that there is sizeable interest in CodeCombat in other countries! We're building a corps of translators eager to turn one set of words into another set of words to get CodeCombat as accessible across the world as possible. If you like getting sneak peeks at upcoming content and getting these levels to your fellow nationals ASAP, then this class might be for you." -# diplomat_attribute_1: "Fluency in English and the language you would like to translate to. When conveying complicated ideas, it's important to have a strong grasp in both!" -# diplomat_i18n_page_prefix: "You can start translating our levels by going to our" -# diplomat_i18n_page: "translations page" -# diplomat_i18n_page_suffix: ", or our interface and website on GitHub." -# diplomat_join_pref_github: "Find your language locale file " -# diplomat_github_url: "on GitHub" -# diplomat_join_suf_github: ", edit it online, and submit a pull request. Also, check this box below to keep up-to-date on new internationalization developments!" -# diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." -# ambassador_introduction: "This is a community we're building, and you are the connections. We've got forums, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." -# ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" -# ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" -# ambassador_join_note_strong: "Note" -# ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" -# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." -# teacher_subscribe_desc: "Get emails on updates and announcements for teachers." -# changes_auto_save: "Changes are saved automatically when you toggle checkboxes." -# diligent_scribes: "Our Diligent Scribes:" -# powerful_archmages: "Our Powerful Archmages:" -# creative_artisans: "Our Creative Artisans:" -# brave_adventurers: "Our Brave Adventurers:" -# translating_diplomats: "Our Translating Diplomats:" -# helpful_ambassadors: "Our Helpful Ambassadors:" - + join_desc_1: "כל אחד יכול לעזור! בואו לראות את ה-" + join_desc_2: """שלנו "כדי להתחיל, וסמנו את התיבה למטה כדי לסמן את עצמכם בתור קוסמי-על אמיצים ולקבל בדואר אלקטרוני חדשות עדכניות. רוצים לשוחח בצ'אט על מה שכדאי לעשות כעת או כדי להיות יותר מעורבים?""" + join_desc_3: ", או חפשו אותנו ב" + join_desc_4: "ואנו נתקדם משם!" + join_url_email: "כתבו לנו בדואר אלקטרוני" + join_url_slack: "ערוץ Slack ציבורי" + archmage_subscribe_desc: "קבלו בדואר אלקטרוני הודעות על הזדמנויות והודעות חדשות בנושאי קידוד." + artisan_introduction_pref: "אנו צריכים לבנות שלבים נוספים! אנשים מתחננים לתוכן נוסף, ויש גבול לכמות השלבים שאנו יכולים לבנות בכוחות עצמנו. בשלב הזה, תחנת העבודה שלכם היא שלב אחד; אפילו היוצרים של עורך השלבים בקושי יכולים להשתמש בו, אז זהירות. אם יש לכם חלומות על מערכות שכוללות לולאות 'עבור' אל" + artisan_introduction_suf: ", אולי זה המקצוע שמתאים לכם." + artisan_attribute_1: "נשמח לניסיון כלשהו בבניית תוכן מעין זה, למשל, באמצעות עורכי שלבים של Blizzard. אבל לא חובה!" + artisan_attribute_2: "חיבה להמון בדיקות וחזרות. כדי ליצור שלבים טובים, צריך להראות אותם לאחרים ולצפות בהם משחקים בשלבים, ולהתכונן למצוא המון דברים שצריך לתקן." + artisan_attribute_3: "בשלב זה, סיבולת שאינה פחותה מזו של ההרפתקן. עורך השלבים שלנו נמצא במצב התחלתי ביותר, ומתסכל להשתמש בו. ראו הוזהרתם!" + artisan_join_desc: "השתמשו בעורך השלבים לפי סדר הפעולות הבא, פחות או יותר:" + artisan_join_step1: "קראו את התיעוד." + artisan_join_step2: "צרו שלב חדש, וחקרו שלבים קיימים." + artisan_join_step3: "בקרו אותנו בערוץ ה-Slack הציבורי שלנו כדי לקבל עזרה." + artisan_join_step4: "פרסמו את השלבים שלכם בפורום, כדי לקבל משוב." + artisan_subscribe_desc: "קבלו בדואר אלקטרוני הודעות עם עדכונים והודעות על עורך השלבים." + adventurer_introduction: "שהתפקיד שלכם יהיה ברור: אתם הטנק. אתם עומדים לספוג המון נזק. אנו זקוקים לאנשים שינסו את השלבים החדשים, ויעזרו לזהות אפשרויות לשיפור. הכאב יהיה עצום; יצירה של משחקים טובים היא תהליך ממושך, ואף אחד לא מצליח כבר בניסיון הראשון. אם תוכלו לעמוד בתלאות, ואם יש לכם דירוג גבוה בתכונת הכושר, אולי זה המקצוע שמתאים לכם." + adventurer_attribute_1: "צמא לידע. אתם רוצים ללמוד איך לקודד, ואנו רוצים ללמד אתכם איך לקודד. אולם נראה שהפעם אתם תהיו אלה שמלמדים, בעיקר." + adventurer_attribute_2: "כריזמה. התייחסות עדינה אך רהוטה לדברים שיש לשפר, ומתן הצעות על הדרך לשפר אותם." + adventurer_join_pref: "התחברו עם בעל מלאכה (או גייסו אותו!) ועבדו עמו, או סמנו את התיבה למטה כדי לקבל בדואר אלקטרוני הודעות על שלבים חדשים לבדיקה. בנוסף, אנו נפרסם עדכונים על שלבים לבדיקה ברשתות שלנו, כגון" + adventurer_forum_url: "הפורום שלנו" + adventurer_join_suf: "אז אם אתם מעדיפים לקבל כך הודעות, הירשמו שם!" + adventurer_subscribe_desc: "קבלו בדואר אלקטרוני הודעות כאשר יש שלבים חדשים לבדיקה." + scribe_introduction_pref: "CodeCombat הוא יותר מאשר אוסף שלבים. הוא יכלול גם משאב לידע, אתר ויקי לעקרונות תכנות אשר אליו ניתן להתחבר מתוך השלבים. כך, במקום שבעלי המלאכה יצטרכו לתאר בפירוט מהו אופרטור השוואה, הם יוכלו פשוט לקשר את השלב שלהם אל מאמר תיאור, שכבר נכתב כדי לספק מידע לשחקן. משהו שדומה למה ש-" + scribe_introduction_url_mozilla: "Mozilla Developer Network" + scribe_introduction_suf: " בנו. אם אתם אוהבים לנסח את עקרונות התכנות בצורת Markdown, אולי זה המקצוע שמתאים לכם." + scribe_attribute_1: "כישורי מילים הם כל מה שנחוץ לכם, פחות או יותר. לא רק דקדוק ואיות, אלא היכולת להעביר לאחרים רעיונות מורכבים." + contact_us_url: "צור קשר" + scribe_join_description: "ספרו לנו קצת על עצמכם, על הניסיון שלכם בתכנות ועל הדברים שעליהם תרצו לכתוב. אנו נתקדם משם!" + scribe_subscribe_desc: "קבלו בדואר אלקטרוני הודעות על כתיבת מאמרים." + diplomat_introduction_pref: "אז אם למדנו דבר אחד " + diplomat_launch_url: "מההשקה באוקטובר" + diplomat_introduction_suf: "זה שקיים עניין ניכר ב-CodeCombat במדינות אחרות! אנו בונים נבחרת של מתרגמים שמשתוקקים להפוך אוסף של מילים לאוסף אחר של מילים, כדי להנגיש את CodeCombat לכמה שיותר אנשים ברחבי העולם. אם תרצו לקבל מבט מהיר בתוכן הצפוי בקרוב, ולהביא את השלבים האלה כמה שיותר מהר על אלה שגרים במדינה שלכם, אולי זה המקצוע שמתאים לכם." + diplomat_attribute_1: "שליטה מצוינת באנגלית ובשפה שאליה תרצו לתרגם. בעת העברה של רעיונות מורכבים, חשוב להבין היטב את שתי השפות!" + diplomat_i18n_page_prefix: "כדי להתחיל ולתרגם את השלבים שלנו, תוכלו לעבור אל" + diplomat_i18n_page: "דף התרגומים" + diplomat_i18n_page_suffix: ", או אל הממשק ואתר האינטרנט שלנו ב-GitHub." + diplomat_join_pref_github: "מצאו את קובץ השפה המקומי שלכם " + diplomat_github_url: "ב-GitHub" + diplomat_join_suf_github: ", ערכו אותו באינטרנט, ושלחו בקשת משיכה. בנוסף, סמנו תיבה זו למטה כדי להתעדכן בהתפתחויות חדשות מבחינת הלוקליזציה!" + diplomat_subscribe_desc: "קבלו בדואר אלקטרוני הודעות על התפתחויות בתחום הלוקליזציה ועל שלבים לתרגום." + ambassador_introduction: "אנו בונים כאן קהילה, ואתם נקודות החיבור. יש לנו פורומים, דואר אלקטרוני ורשתות חברתיות עם הרבה אנשים לשוחח עמם, להכיר להם את המשחק וללמוד מהם. אם ברצונכם לעזור לאנשים לקחת חלק וליהנות, כמו גם להבין את הרוח של CodeCombat ואת מה שצפוי לו, אולי זה המקצוע שמתאים לכם." + ambassador_attribute_1: "מיומנויות תקשורת. היכולת לזהות את הבעיות שבהן השחקנים נתקלים ולעזור להם לפתור אותן. בנוסף, המשיכו לעדכן אותנו במה ששחקנים אחרים עושים, מה הם אוהבים ולא אוהבים, וממה הם רוצים עוד!" + ambassador_join_desc: "ספרו לנו קצת על עצמכם, מה שעשיתם עד כה ומה מעניין אתכם לעשות. אנו נתקדם משם!" + ambassador_join_note_strong: "הערה" + ambassador_join_note_desc: "אחת העדיפויות הראשונות שלנו היא בנייה של משחק מרובה משתתפים, אשר בו שחקנים שמתקשים בפתרון שלבים יכולים לזמן קוסמים בדרגה גבוהה יותר שיעזרו להם. זו תהיה דרך נהדרת שבה השגרירים יוכלו לעזור כמו שהם יודעים. אנו נעדכן אתכם!" + ambassador_subscribe_desc: "קבלו בדואר אלקטרוני הודעות על עדכוני תמיכה והתפתחויות בתחום ריבוי השחקנים." + teacher_subscribe_desc: "קבלו בדואר אלקטרוני הודעות על עדכונים והודעות למורים." + changes_auto_save: "השינויים יישמרו באופן אוטומטי כאשר תשנו את הבחירה בתיבות הסימון." + diligent_scribes: "הסופרים החרוצים:" + powerful_archmages: "קוסמי העל רבי העוצמה:" + creative_artisans: "בעלי המלאכה היצירתיים:" + brave_adventurers: "ההרפתקנים האמיצים:" + translating_diplomats: "הדיפלומטים המתרגמים:" + helpful_ambassadors: "השגרירים המועילים:" + ladder: my_matches: "המשחקים שלי" - simulate: "הדמה" - simulation_explanation: "באמצעות הדמית משחקים אתה יכול לגרום לשלב שלך להיות מדורג להר יותר!" -# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses." - simulate_games: "הדמה משחקים" - games_simulated_by: "משחקים שהדמית:" - games_simulated_for: "משחקים שהודמו בשבילך:" -# games_in_queue: "Games currently in the queue:" - games_simulated: "משחקים שהודמו" - games_played: "מס' משחקים ששיחקת" + simulate: "הדמיה" + simulation_explanation: "הדמיית משחקים עשויה לזרז את דירוג המשחק שלכם!" + simulation_explanation_leagues: "בעיקר תעזרו בהדמיית משחקים עבור שחקנים בני ברית בשבטים ובקורסים שלכם." + simulate_games: "בצעו הדמיית משחקים!" + games_simulated_by: "משחקים שלהם אתם עורכים הדמיה:" + games_simulated_for: "משחקים שעבורכם נערכת להם הדמיה:" + games_in_queue: "משחקים הנמצאים בתור כעת:" + games_simulated: "משחקים בהדמיה" + games_played: "משחקים ששוחקו" ratio: "יחס" - leaderboard: "שיאים" - battle_as: "הילחם כ " - summary_your: "נתונים " - summary_matches: "משחקים - " + leaderboard: "טבלת המובילים" + battle_as: "הילחמו בקרב בתור " + summary_your: "המשחקים " + summary_matches: "שלכם - " summary_wins: " ניצחונות, " summary_losses: " הפסדים" rank_no_code: "אין קוד חדש לדירוג" rank_my_game: "דרג את המשחק שלי!" rank_submitting: "שולח..." rank_submitted: "נשלח לדירוג" - rank_failed: "נכשל לדרג" - rank_being_ranked: "משחק בדירוג" - rank_last_submitted: "נשלח " -# help_simulate: "Help simulate games?" -# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." -# no_ranked_matches_pre: "No ranked matches for the " -# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." - choose_opponent: "בחר יריב" - select_your_language: "בחר שפה!" - tutorial_play: "הדרכה" - tutorial_recommended: "מומלץ אם לא שיחקת לפני" + rank_failed: "פעולת הדירוג נכשלה" + rank_being_ranked: "המשחק נמצא בדירוג כעת" + rank_last_submitted: "נשלח" + help_simulate: "צריכים עזרה בהדמיית משחקים?" + code_being_simulated: "הקוד החדש שלכם נמצא כעת בהדמיה אצל שחקנים אחרים, לצורך דירוג. מידע זה יתרענן כאשר משחקים חדשים ייקלטו." + no_ranked_matches_pre: "אין משחקים מדורגים עבור הקבוצה " + no_ranked_matches_post: "! שחקו נגד כמה מתחרים, ולאחר מכן חזרו לכאן כדי לקבל דירוג למשחק שלכם." + choose_opponent: "בחרו יריב" + select_your_language: "בחרו שפה!" + tutorial_play: "שחקו בהדרכה" + tutorial_recommended: "מומלץ אם זה המשחק הראשון שלכם" tutorial_skip: "דלג על ההדרכה" - tutorial_not_sure: "לא בטוח מה הולך?" - tutorial_play_first: "הרץ את ההדרכה" - simple_ai: "בינה מלאכותית פשוטה" # {change} + tutorial_not_sure: "לא בטוחים מה קורה?" + tutorial_play_first: "שחקו תחילה בהדרכה." + simple_ai: "CPU פשוט" warmup: "חימום" friends_playing: "חברים משחקים" - log_in_for_friends: "היכנס כדי לשחק עם חברים" -# social_connect_blurb: "Connect and play against your friends!" -# invite_friends_to_battle: "Invite your friends to join you in battle!" - fight: "הלחם!" - watch_victory: "צפה בניצחון שלך" - defeat_the: "הבס את ה" -# watch_battle: "Watch the battle" -# tournament_started: ", started" - tournament_ends: "תחרות נגמרת בעוד:" - tournament_ended: "תחרות נגמרה" - tournament_rules: "חוקי תחרות" -# 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" + log_in_for_friends: "היכנסו למערכת כדי לשחק עם חברים!" + social_connect_blurb: "התחברו, ושחקו נגד חברים!" + invite_friends_to_battle: "הזמינו חברים להילחם לצדכם!" + fight: "לקרב!" + watch_victory: "צפו בניצחון שלכם" + defeat_the: "הביסו את" + watch_battle: "צפו בקרב" + tournament_started: ", התחיל" + tournament_ends: "הטורניר יסתיים" + tournament_ended: "הטורניר הסתיים" + tournament_rules: "כללי הטורניר" + tournament_blurb: "כתבו קוד, אספו זהב, בנו צבאות, מחצו את היריבים, זכו בפרסים, ושדרגו את הקריירה שלכם בטורניר תאוות הבצע שלנו על סך $40,000! ראו פרטים" + tournament_blurb_criss_cross: "זכו במכירות פומביות, בנו נתיבים, הערימו על יריבכם, השיגו אבני חן, ושדרגו את הקריירה שלכם בטורניר השתי-וערב שלנו! ראו פרטים" + tournament_blurb_zero_sum: "תנו חופש ליצירתיות שלכם בקידוד, בטקטיקות לאיסוף זהב ולקרבות, בקרב ראי הררי זה בין קוסמת אדומה לקוסמת כחולה. הטורניר התחיל ביום שישי, 27 במרץ, ויימשך עד יום שני, 6 באפריל, 17:00 שעון החוף המערבי. השתתפו בתחרות כדי ליהנות ולזכות בתהילה! ראו פרטים" + tournament_blurb_ace_of_coders: "צאו לקרב בקרחון הקפוא במשחק ראי להשתלטות על המפה! הטורניר התחיל ביום רביעי, 16 בספטמבר, ויימשך עד יום רביעי, 14 באוקטובר, 17:00 שעון החוף המערבי. ראו פרטים" tournament_blurb_blog: "בבלוג שלנו" - rules: "חוקים" - winners: "מנצחים" -# league: "League" -# red_ai: "Red CPU" # "Red AI Wins", at end of multiplayer match playback -# blue_ai: "Blue CPU" -# wins: "Wins" # At end of multiplayer match playback -# humans: "Red" # Ladder page display team name -# ogres: "Blue" - + rules: "כללים" + winners: "הזוכים" + league: "ליגה" + red_ai: "CPU אדום" # "AI אדום ניצח", at end of multiplayer match playback + blue_ai: "CPU כחול" + wins: "ניצח" # At end of multiplayer match playback + humans: "אדום" # Ladder page display team name + ogres: "כחול" + user: - stats: "נתונים" + stats: "סטטיסטיקה" singleplayer_title: "שלבים לשחקן יחיד" - multiplayer_title: "שלבים מרובי משתתפים" + multiplayer_title: "שלבים מרובי שחקנים" achievements_title: "הישגים" - last_played: "שוחק לאחרונה" - status: "סטטוס" + last_played: "משחק אחרון" + status: "מצב" status_completed: "הושלם" - status_unfinished: "לא הושלם" - no_singleplayer: ".עדיין לא שיחקת באף שלב לשחקן יחיד" - no_multiplayer: ".עדיין לא שיחקת באף שלב מרובה משתתפים" - no_achievements: ".עדיין לא השגת אף הישג" - favorite_prefix: " שפה מועדפת היא" + status_unfinished: "לא הסתיים" + no_singleplayer: "טרם נערכו משחקי יחיד." + no_multiplayer: "טרם נערכו משחקים מרובי משתתפים." + no_achievements: "טרם הוגשמו הישגים." + favorite_prefix: "השפה המועדפת היא " favorite_postfix: "." - not_member_of_clans: "לא חבר באף שבט." - + not_member_of_clans: "עדיין לא חבר בשום שבטים." + achievements: - last_earned: "Last Earned" + last_earned: "הושג לאחרונה" amount_achieved: "כמות" achievement: "הישג" current_xp_prefix: "" - current_xp_postfix: " נצבר בכללי" + current_xp_postfix: " בסך הכול" new_xp_prefix: "" - new_xp_postfix: " נצבר" + new_xp_postfix: " הושגו" left_xp_prefix: "" - left_xp_infix: " עד לרמה הבאה " + left_xp_infix: " עד דרגה " left_xp_postfix: "" - + account: payments: "תשלומים" -# prepaid_codes: "Prepaid Codes" - purchased: "קניות" - subscription: "מנויים" -# invoices: "Invoices" + prepaid_codes: "קודים בתשלום מראש" + purchased: "נרכש" + subscription: "מנוי" + invoices: "חשבוניות" service_apple: "Apple" - service_web: "רשת" - paid_on: "שולם על" + service_web: "אינטרנט" + paid_on: "שולם ב:" service: "שירות" price: "מחיר" gems: "אבני חן" active: "פעיל" - subscribed: "מנוי" - unsubscribed: "לא מנוי" + subscribed: "רשום כמנוי" + unsubscribed: "מנוי בוטל" active_until: "פעיל עד" - cost: "עולה" + cost: "עלות" next_payment: "התשלום הבא" card: "כרטיס" -# status_unsubscribed_active: "You're not subscribed and won't be billed, but your account is still active for now." -# status_unsubscribed: "Get access to new levels, heroes, items, and bonus gems with a CodeCombat subscription!" -# not_yet_verified: "Not yet verified." -# resend_email: "Resend email" -# email_sent: "Email sent! Check your inbox." -# verifying_email: "Verifying your email address..." -# successfully_verified: "You've successfully verified your email address!" -# verify_error: "Something went wrong when verifying your email :(" - + status_unsubscribed_active: "אינכם רשומים כמנויים ולא תחויבו, אולם חשבונכם עדיין פעיל לעת עתה." + status_unsubscribed: "קבלו גישה אל בונוס אבני חן ואל שלבים, גיבורים ופריטים חדשים עם מנוי על CodeCombat!" + not_yet_verified: "טרם אומת." + resend_email: "שלח שוב דואר אלקטרוני" + email_sent: "הודעת דואר אלקטרוני נשלחה! בדקו בתיבת הדואר הנכנס." + verifying_email: "מאמת כתובת דואר אלקטרוני..." + successfully_verified: "וידאתם בהצלחה את כתובת הדואר האלקטרוני!" + verify_error: "אירעה בעיה כלשהי בעת אימות כתובת הדואר האלקטרוני :(" + account_invoices: - amount: "כמות בדולרים (אמריקאיים)" - declined: "הכרטיסשלך בוטל" - invalid_amount: "אנא הזן כמות דולרים (אמריקאיים)" -# not_logged_in: "Log in or create an account to access invoices." -# pay: "Pay Invoice" + amount: "סכום ב-USD" + declined: "הכרטיס נדחה" + invalid_amount: "נא להזין סכום ב-USD." + not_logged_in: "כדי לגשת לחשבוניות, התחברו." + pay: "שלם חשבונית" purchasing: "מבצע רכישה..." - retrying: "אירעה שגיאה בשרת, מנסה מחדש..." - success: "שולם בהצלחה, תודה!" - -# account_prepaid: -# purchase_code: "Purchase a Subscription Code" -# purchase_code1: "Subscription Codes can be redeemed to add premium subscription time to one or more accounts for the Home version of CodeCombat." # -# purchase_code2: "Each CodeCombat account can only redeem a particular Subscription Code once." -# purchase_code3: "Subscription Code months will be added to the end of any existing subscription on the account." -# purchase_code4: "Subscription Codes are for accounts playing the Home version of CodeCombat, they cannot be used in place of Student Licenses for the Classroom version." -# purchase_code5: "For more information on Student Licenses, reach out to" -# users: "Users" -# months: "Months" -# purchase_total: "Total" -# purchase_button: "Submit Purchase" -# your_codes: "Your Codes" -# redeem_codes: "Redeem a Subscription Code" -# prepaid_code: "Prepaid Code" -# lookup_code: "Lookup prepaid code" -# apply_account: "Apply to your account" -# copy_link: "You can copy the code's link and send it to someone." -# quantity: "Quantity" -# redeemed: "Redeemed" -# no_codes: "No codes yet!" -# you_can1: "You can" -# you_can2: "purchase a prepaid code" -# you_can3: "that can be applied to your own account or given to others." - + retrying: "אירעה שגיאה בשרת, מנסה שוב." + success: "התשלום בוצע בהצלחה. תודה!" + + account_prepaid: + purchase_code: "רכישת קוד מנוי" + purchase_code1: "ניתן לממש קודי מנוי כדי להוסיף זמן מנוי פרימיום לחשבון אחד או יותר עבור הגרסה הביתית של CodeCombat." # + purchase_code2: "כל חשבון CodeCombat יכול לממש קוד מנוי מסוים פעם אחת בלבד." + purchase_code3: "חודשים של קוד מנוי יתווספו בסופו של כל מנוי קיים באותו החשבון." + purchase_code4: "קודי מנוי מיועדים לחשבונות המשחקים בגרסה הביתית של CodeCombat, ולא ניתן להשתמש בהם במקום רישיונות תלמיד עבור הגרסה הכיתתית." + purchase_code5: "למידע נוסף על רישיונות תלמיד, נא לפנות אל" + users: "משתמשים" + months: "חודשים" + purchase_total: 'סה"כ' + purchase_button: "שלח רכישה" + your_codes: "הקודים שלכם" + redeem_codes: "מימוש קוד מנוי" + prepaid_code: "קוד בתשלום מראש" + lookup_code: "חיפוש קוד בתשלום מראש" + apply_account: "החל על חשבונך" + copy_link: "ניתן לערוך את הקישור אל הקוד ולשלוח אותו אל מישהו." + quantity: "כמות" + redeemed: "מומש" + no_codes: "עדיין אין קודים!" + you_can1: "באפשרותך" + you_can2: "לרכוש קוד בתשלום מראש" + you_can3: "אשר ניתן להחיל על חשבונך או לתת למשתמשים אחרים." + loading_error: - could_not_load: "אירעה שגיאה בזמן טעינה מהשרת" - connection_failure: ".חיהור נכשל" -# connection_failure_desc: "It doesn’t look like you’re connected to the internet! Check your network connection and then reload this page." -# login_required: "Login Required" -# login_required_desc: "You need to be logged in to access this page." - unauthorized: "אתה צריך להתחבר. האם חסמת קבצי cookies?" - forbidden: "אין לך את ההרשאה" -# forbidden_desc: "Oh no, there’s nothing we can show you here! Make sure you’re logged into the correct account, or visit one of the links below to get back to programming!" - not_found: ".לא נמצא" -# not_found_desc: "Hm, there’s nothing here. Visit one of the following links to get back to programming!" - not_allowed: ".פונקציה לא מותרת" - timeout: "Server timeout." # {change} -# conflict: "Resource conflict." -# bad_input: "Bad input." - server_error: ".שגיאת שרת" - unknown: ".שגיאה בלתי מזוהה" # {change} -# error: "ERROR" -# general_desc: "Something went wrong, and it’s probably our fault. Try waiting a bit and then refreshing the page, or visit one of the following links to get back to programming!" - + could_not_load: "אירעה שגיאה בטעינה מהשרת" + connection_failure: "ההתחברות נכשלה" + connection_failure_desc: "נראה שאינך מחובר לאינטרנט! בדוק את החיבור לרשת, ונסה לטעון דף זה מחדש." + login_required: "נדרשת כניסה למערכת" + login_required_desc: "כדי לגשת לדף זה, יש להיכנס למערכת." + unauthorized: "עליכם להתחבר למערכת. האם הגדרתם קובצי Cookie כלא זמינים?" + forbidden: "אסור" + forbidden_desc: "אוי לא, אין לנו מה להראות לך כאן! ודאו שאתם מחוברים לחשבון הנכון, או בקרו באחד הקישורים שלהלן כדי לחזור לתכנות!" + not_found: "לא נמצא" + not_found_desc: "אין כאן שום דבר. בקרו באחד מהקישורים שלהלן כדי לחזור לתכנות!" + not_allowed: "המתודה אסורה." + timeout: "תם הזמן הקצוב לשרת" + conflict: "התנגשות משאבים." + bad_input: "קלט לא תקין." + server_error: "שגיאה בשרת." + unknown: "שגיאה לא ידועה" + error: "שגיאה" + general_desc: "משהו השתבש, וזה כנראה באשמתנו. נסו להמתין מעט ולאחר מכן לרענן את הדף. לחלופין, בקרו באחד הקישורים שלהלן כדי לחזור לתכנות!" + resources: level: "שלב" patch: "תיקון" patches: "תיקונים" system: "מערכת" systems: "מערכות" - component: "מרכיב" - components: "מרכיבים" -# hero: "Hero" - campaigns: "מסעות" - -# concepts: -# advanced_css_rules: "Advanced CSS Rules" -# advanced_css_selectors: "Advanced CSS Selectors" -# advanced_html_attributes: "Advanced HTML Attributes" -# advanced_html_tags: "Advanced HTML Tags" -# algorithm_average: "Algorithm Average" -# algorithm_find_minmax: "Algorithm Find Min/Max" -# algorithm_search_binary: "Algorithm Search Binary" -# algorithm_search_graph: "Algorithm Search Graph" -# algorithm_sort: "Algorithm Sort" -# algorithm_sum: "Algorithm Sum" -# arguments: "Arguments" -# arithmetic: "Arithmetic" -# array_2d: "2D Array" -# array_index: "Array Indexing" -# array_iterating: "Iterating Over Arrays" -# array_literals: "Array Literals" -# array_searching: "Array Searching" -# array_sorting: "Array Sorting" -# arrays: "Arrays" -# basic_css_rules: "Basic CSS rules" -# basic_css_selectors: "Basic CSS selectors" -# basic_html_attributes: "Basic HTML Attributes" -# basic_html_tags: "Basic HTML Tags" -# basic_syntax: "Basic Syntax" -# binary: "Binary" -# boolean_and: "Boolean And" -# boolean_equality: "Boolean Equality" -# boolean_greater_less: "Boolean Greater/Less" -# boolean_logic_shortcircuit: "Boolean Logic Shortcircuiting" -# boolean_not: "Boolean Not" -# boolean_operator_precedence: "Boolean Operator Precedence" -# boolean_or: "Boolean Or" -# bootstrap: "Bootstrap" -# break_statements: "Break Statements" -# classes: "Classes" -# continue_statements: "Continue Statements" -# dom_events: "DOM Events" -# dynamic_styling: "Dynamic Styling" -# event_concurrency: "Event Concurrency" -# event_data: "Event Data" -# event_handlers: "Event Handlers" -# for_loops: "For Loops" -# for_loops_nested: "Nested For Loops" -# for_loops_range: "For Loops Range" -# functions: "Functions" -# game_ai: "Game AI" -# game_goals: "Game Goals" -# game_spawn: "Game Spawn" -# graphics: "Graphics" -# graphs: "Graphs" -# heaps: "Heaps" -# if_else_statements: "If/Else Statements" -# if_statements: "If Statements" -# if_statements_nested: "Nested If Statemnts" -# indexing: "Array Indexes" -# input_handling_flags: "Input Handling - Flags" -# input_handling_keyboard: "Input Handling - Keyboard" -# input_handling_mouse: "Input Handling - Mouse" -# intermediate_css_rules: "Intermediate CSS Rules" -# intermediate_css_selectors: "Intermediate CSS Selectors" -# intermediate_html_attributes: "Intermediate HTML Attributes" -# intermediate_html_tags: "Intermediate HTML Tags" -# jquery: "jQuery" -# jquery_animations: "jQuery Animations" -# jquery_filtering: "jQuery Element Filtering" -# jquery_selectors: "jQuery Selectors" -# length: "Array Length" -# math_geometry: "Geometry" -# math_operations: "Math Library Operations" -# math_trigonometry: "Trigonometry" -# object_literals: "Object Literals" -# parameters: "Parameters" -# property_access: "Accessing Properties" -# property_assignment: "Assigning Properties" -# queues: "Data Structures - Queues" -# reading_docs: "Reading the Docs" -# recursion: "Recursion" -# return_statements: "Return Statements" -# stacks: "Data Structures - Stacks" -# strings: "Strings" -# strings_concatenation: "String Concatenation" -# strings_substrings: "Substring" -# trees: "Data Structures - Trees" -# variables: "Variables" -# vectors: "Vectors" -# while_condition_loops: "While Loops with Conditionals" -# while_loops_simple: "While Loops" -# while_loops_nested: "Nested While Loops" -# xy_coordinates: "Cartesian Coordinates" -# advanced_strings: "Advanced Strings" # Rest of concepts are deprecated -# algorithms: "Algorithms" -# boolean_logic: "Boolean Logic" -# basic_html: "Basic HTML" -# basic_css: "Basic CSS" -# basic_web_scripting: "Basic Web Scripting" -# intermediate_html: "Intermediate HTML" -# intermediate_css: "Intermediate CSS" -# intermediate_web_scripting: "Intermediate Web Scripting" -# advanced_html: "Advanced HTML" -# advanced_css: "Advanced CSS" -# advanced_web_scripting: "Advanced Web Scripting" -# input_handling: "Input Handling" -# while_loops: "While Loops" -# place_game_objects: "Place game objects" -# construct_mazes: "Construct mazes" -# create_playable_game: "Create a playable, sharable game project" -# alter_existing_web_pages: "Alter existing web pages" -# create_sharable_web_page: "Create a sharable web page" -# basic_input_handling: "Basic Input Handling" -# basic_game_ai: "Basic Game AI" -# basic_javascript: "Basic JavaScript" -# basic_event_handling: "Basic Event Handling" -# create_sharable_interactive_web_page: "Create a sharable interactive web page" - + component: "רכיב" + components: "רכיבים" + hero: "גיבור" + campaigns: "מערכות" + + concepts: + advanced_css_rules: "כללי CSS מתקדמים" + advanced_css_selectors: "בוררי CSS מתקדמים" + advanced_html_attributes: "תכונות HTML מתקדמות" + advanced_html_tags: "תגיות HTML מתקדמות" + algorithm_average: "ממוצע אלגוריתם" + algorithm_find_minmax: "מינימום/מקסימום לאיתור אלגוריתם" + algorithm_search_binary: "בינארי לחיפוש אלגוריתם" + algorithm_search_graph: "גרף חיפוש אלגוריתם" + algorithm_sort: "מיון אלגוריתם" + algorithm_sum: "סכום אלגוריתם" + arguments: "ארגומנטים" + arithmetic: "אריתמטי" + array_2d: "מערך דו-ממדי" + array_index: "סידור מערכים באינדקס" + array_iterating: "איטרציה במערכים" + array_literals: "ליטרלים של מערכים" + array_searching: "חיפוש במערכים" + array_sorting: "מיון מערכים" + arrays: "מערכים" + basic_css_rules: "כללי CSS בסיסיים" + basic_css_selectors: "בוררי CSS בסיסיים" + basic_html_attributes: "תכונות HTML בסיסיות" + basic_html_tags: "תגיות HTML בסיסיות" + basic_syntax: "תחביר בסיסי" + binary: "בינארי" + boolean_and: "בוליאני וכן" + boolean_equality: "שוויון בוליאני" + boolean_greater_less: "גדול/קטן בוליאני" + boolean_logic_shortcircuit: "קצר לוגי בוליאני" + boolean_not: "'לא' בוליאני" + boolean_operator_precedence: "עדיפות אופרטור בוליאני" + boolean_or: "'או' בוליאני" + bootstrap: "Bootstrap" + break_statements: "פסוקי עצירה" + classes: "מחלקות" + continue_statements: "פסוקי המשך" + dom_events: "אירועי DOM" + dynamic_styling: "עיצוב דינמי" + event_concurrency: "מקביליות נתונים" + event_data: "נתוני אירועים" + event_handlers: "מטפל באירועים" + for_loops: "לולאות 'עבור'" + for_loops_nested: "לולאות 'עבור' מקוננות" + for_loops_range: "טווח לולאות 'עבור'" + functions: "פונקציות" + game_ai: "AI משחק" + game_goals: "יעדי משחק" + game_spawn: "הופעה במשחק" + graphics: "גרפיקה" + graphs: "גרפים" + heaps: "ערימות" + if_else_statements: "פסוקי 'אם/אחרת'" + if_statements: "פסוקי 'אם'" + if_statements_nested: "פסוקי 'אם' מקוננים" + indexing: "אינדקסים של מערכים" + input_handling_flags: "טיפול בקלט - דגלים" + input_handling_keyboard: "טיפול בקלט - מקלדת" + input_handling_mouse: "טיפול בקלט - עכבר" + intermediate_css_rules: "כללי CSS לרמת הביניים" + intermediate_css_selectors: "בוררי CSS לרמת הביניים" + intermediate_html_attributes: "תכונות HTML לרמת הביניים" + intermediate_html_tags: "תגיות HTML לרמת הביניים" + jquery: "jQuery" + jquery_animations: "הנפשות jQuery" + jquery_filtering: "סינון אלמנטים של jQuery" + jquery_selectors: "בוררי jQuery" + length: "אורך מערך" + math_geometry: "גאומטריה" + math_operations: "פעולות ספריית מתמטיקה" + math_trigonometry: "טריגונומטריה" + object_literals: "ליטרלים של אובייקט" + parameters: "פרמטרים" + property_access: "גישה למאפיינים" + property_assignment: "הקצאת מאפיינים" + queues: "מבני נתונים - תורים" + reading_docs: "קריאת המסמכים" + recursion: "רקורסיה" + return_statements: "פסוקי החזרה" + stacks: "מבני נתונים - ערימות" + strings: "מחרוזות" + strings_concatenation: "שרשור מחרוזות" + strings_substrings: "מחרוזת משנה" + trees: "מבני נתונים - עצים" + variables: "משתנים" + vectors: "וקטורים" + while_condition_loops: "לולאות והתניות 'כל עוד'" + while_loops_simple: "לולאות 'כל עוד'" + while_loops_nested: "לולאות 'כל עוד' מקוננות" + xy_coordinates: "קואורדינטות קרטזיות" + advanced_strings: "מחרוזות מתקדמות" # Rest of concepts are deprecated + algorithms: "אלגוריתמים" + boolean_logic: "לוגיקה בוליאנית" + basic_html: "HTML בסיסי" + basic_css: "CSS בסיסי" + basic_web_scripting: "כתיבת Script בסיסית לאינטרנט" + intermediate_html: "HTML לרמת הביניים" + intermediate_css: "CSS לרמת הביניים" + intermediate_web_scripting: "כתיבת Script לאינטרנט לרמת הביניים" + advanced_html: "HTML מתקדם" + advanced_css: "CSS מתקדם" + advanced_web_scripting: "כתיבת Script מתקדמת לאינטרנט" + input_handling: "טיפול קלט" + while_loops: "לולאות 'כל עוד'" + place_game_objects: "הצבת אובייקטי משחק" + construct_mazes: "בניית מבוכים" + create_playable_game: "יצירה של פרויקט משחק שניתן לשתף ולשחק בו" + alter_existing_web_pages: "שינוי דפי אינטרנט קיימים" + create_sharable_web_page: "יצירת דף אינטרנט שניתן לשתף" + basic_input_handling: "טיפול בסיסי בקלט" + basic_game_ai: "AI משחק בסיסי" + basic_javascript: "JavaScript בסיסי" + basic_event_handling: "טיפול בסיסי באירועים" + create_sharable_interactive_web_page: "יצירת דף אינטרנט אינטראקטיבי שניתן לשתף" + delta: added: "נוסף" - modified: "שונה" -# not_modified: "Not Modified" + modified: "השתנה" + not_modified: "לא השתנה" deleted: "נמחק" -# moved_index: "Moved Index" -# text_diff: "Text Diff" -# merge_conflict_with: "MERGE CONFLICT WITH" - no_changes: "אין שינויים" - -# legal: -# page_title: "Legal" -# opensource_intro: "CodeCombat is completely open source." -# opensource_description_prefix: "Check out " -# github_url: "our GitHub" -# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " -# archmage_wiki_url: "our Archmage wiki" -# opensource_description_suffix: "for a list of the software that makes this game possible." -# practices_title: "Respectful Best Practices" -# practices_description: "These are our promises to you, the player, in slightly less legalese." -# privacy_title: "Privacy" -# privacy_description: "We will not sell any of your personal information." -# security_title: "Security" -# security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems." -# email_title: "Email" -# email_description_prefix: "We will not inundate you with spam. Through" -# email_settings_url: "your email settings" -# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." -# cost_title: "Cost" -# cost_description: "CodeCombat is free to play for all of its core levels, with a ${{price}} USD/mo subscription for access to extra level branches and {{gems}} bonus gems per month. You can cancel with a click, and we offer a 100% money-back guarantee." -# copyrights_title: "Copyrights and Licenses" -# contributor_title: "Contributor License Agreement" -# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" -# cla_url: "CLA" -# contributor_description_suffix: "to which you should agree before contributing." -# code_title: "Code - MIT" -# code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the" -# mit_license_url: "MIT license" -# code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels." -# art_title: "Art/Music - Creative Commons " -# art_description_prefix: "All common content is available under the" -# cc_license_url: "Creative Commons Attribution 4.0 International License" -# art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:" -# art_music: "Music" -# art_sound: "Sound" -# art_artwork: "Artwork" -# art_sprites: "Sprites" -# art_other: "Any and all other non-code creative works that are made available when creating Levels." -# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." -# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" -# use_list_1: "If used in a movie or another game, include codecombat.com in the credits." -# use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution." -# art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any." -# rights_title: "Rights Reserved" -# rights_desc: "All rights are reserved for Levels themselves. This includes" -# rights_scripts: "Scripts" -# rights_unit: "Unit configuration" -# rights_writings: "Writings" -# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." -# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." -# nutshell_title: "In a Nutshell" -# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for." -# canonical: "The English version of this document is the definitive, canonical version. If there are any discrepancies between translations, the English document takes precedence." -# third_party_title: "Third Party Services" -# third_party_description: "CodeCombat uses the following third party services (among others):" - -# ladder_prizes: -# title: "Tournament Prizes" # This section was for an old tournament and doesn't need new translations now. -# blurb_1: "These prizes will be awarded according to" -# blurb_2: "the tournament rules" -# blurb_3: "to the top human and ogre players." -# blurb_4: "Two teams means double the prizes!" -# blurb_5: "(There will be two first place winners, two second-place winners, etc.)" -# rank: "Rank" -# prizes: "Prizes" -# total_value: "Total Value" -# in_cash: "in cash" -# custom_wizard: "Custom CodeCombat Wizard" -# custom_avatar: "Custom CodeCombat avatar" -# heap: "for six months of \"Startup\" access" -# credits: "credits" -# one_month_coupon: "coupon: choose either Rails or HTML" -# one_month_discount: "discount, 30% off: choose either Rails or HTML" -# license: "license" -# oreilly: "ebook of your choice" - -# calendar: -# year: "Year" -# day: "Day" -# month: "Month" -# january: "January" -# february: "February" -# march: "March" -# april: "April" -# may: "May" -# june: "June" -# july: "July" -# august: "August" -# september: "September" -# october: "October" -# november: "November" -# december: "December" - -# code_play_create_account_modal: -# title: "You did it!" # This section is only needed in US, UK, Mexico, India, and Germany -# body: "You are now on your way to becoming a master coder. Sign up to receive an extra 100 Gems & you will also be entered for a chance to win $2,500 & other Lenovo Prizes." -# sign_up: "Sign up & keep coding ▶" -# victory_sign_up_poke: "Create a free account to save your code & be entered for a chance to win prizes!" -# victory_sign_up: "Sign up & be entered to win $2,500" - -# server_error: -# email_taken: "Email already taken" -# username_taken: "Username already taken" - -# esper: -# line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " -# reference_error: "ReferenceError: " -# spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" -# capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" -# unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." -# unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." + moved_index: "אינדקס הועבר" + text_diff: "הבדל טקסט" + merge_conflict_with: "מזג התנגשות עם" + no_changes: "ללא שינויים" + + legal: + page_title: "משפטי" + opensource_intro: "CodeCombat בנוי כולו מקוד פתוח." + opensource_description_prefix: "בואו לעיין " + github_url: "ב-GitHub שלנו" + opensource_description_center: "ולעזור לנו, אם תרצו! CodeCombat בנוי על עשרות פרויקטים של קוד פתוח, ואנו ממש אוהבים אותם. עיינו " + archmage_wiki_url: "הוויקי שלנו לקוסמי-על" + opensource_description_suffix: "לרשימה של התוכנות שבזכותן משחק זה אפשרי." + practices_title: "שיטות עבודה מומלצות ליחס מכבד" + practices_description: "אלה ההבטחות שלנו כלפיכם, השחקנים, בשפה קצת פחות משפטית." + privacy_title: "פרטיות" + privacy_description: "אנו לא נמכור שום פרטים אישיים שלכם." + security_title: "אבטחה" + security_description: "כוונתנו היא להגן על הפרטים האישיים שלכם. בתור פרויקט קוד פתוח, האתר שלנו פתוח לכל מי שרוצה לבוא לבדוק ולשפר את מערכות האבטחה שלנו." + email_title: "דואר אלקטרוני" + email_description_prefix: "לא נציק לכם עם דואר זבל. דרך" + email_settings_url: "הגדרות הדואר האלקטרוני" + email_description_suffix: "או דרך קישורים בהודעות שנשלח בדואר אלקטרוני, תוכלו לשנות את ההעדפות ולבטל מנוי בקלות בכל עת." + cost_title: "עלות" + cost_description: "ניתן לשחק ב-CodeCombat בחינם בכל שלבי הליבה שלו, ובמחיר ${{price}} דולר לחודש ניתן לקבל מנוי עם גישה אל ענפי שלבים נוספים ובונוס של {{gems}} אבני חן כל חודש. תוכלו לבטל בלחיצה, ואנו מציעים 100% החזר כספי במקרה של בעיה במוצר." + copyrights_title: "זכויות ורישיונות" + contributor_title: "הסכם רישיון לתורם" + contributor_description_prefix: "כל התרומות, באתר ובמאגר ה-GitHub שלנו, כפופות" + cla_url: "CLA" + contributor_description_suffix: "שלו עליכם לתת את הסכמתכם לפני שתוכלו לתרום." + code_title: "קוד - MIT" + code_description_prefix: "בכל הקוד הנמצא בבעלות CodeCombat או המתארח ב-codecombat.com, בין אם במאגר ה-GitHub ובין אם במסד הנתונים של codecombat.com, נעשה שימוש במסגרת" + mit_license_url: "רישיון MIT" + code_description_suffix: "בכלל זה כל הקוד במערכות וברכיבים, אשר מונגש על-ידי CodeCombat לצורך יצירת שלבים." + art_title: "אמנות/מוזיקה - Creative Commons " + art_description_prefix: "כל התוכן המשותף זמין במסגרת" + cc_license_url: "Creative Commons Attribution 4.0 International License" + art_description_suffix: "התוכן המשותף הוא כל מה שמונגש על-ידי CodeCombat לצורך יצירת שלבים. בכלל זה:" + art_music: "מוזיקה" + art_sound: "צלילים" + art_artwork: "אמנות" + art_sprites: "ספרייטים" + art_other: "כל יצירה שאינה קוד אשר נעשית זמינה בעת יצירת שלבים." + art_access: "בשלב זה, אין מערכת אוניברסלית ופשוטה לאחזור נכסים אלה. באופן כללי, תוכלו לאחזר אותם מכתובות ה-URL כפי שהן מופיעות באתר, לפנות אלינו לקבלת סיוע או לעזור לנו להרחיב את האתר כדי להקל על הגישה אל נכסים אלה." + art_paragraph_1: "כדי לייחס, נא לתת שם וקישור אל codecombat.com ליד המיקום שבו המקור נמצא בשימוש או במידת הצורך בהתאם למדיום. לדוגמה:" + use_list_1: "במקרה של שימוש בסרט או במשחק אחר, יש לכלול את codecombat.com בקרדיטים." + use_list_2: "במקרה של שימוש באתר אינטרנט, יש לכלול קישור בסמוך למקום השימוש, לדוגמה מתחת לתמונה או בדף ייחוס כללי, שבו תזכירו אולי גם יצירות אחרות מ-Creative Commons ותוכנות קוד פתוח שבהן נעשה שימוש באתר. דבר מה שכבר מאזכר בבירור אל CodeCombat, כגון פוסט בלוג שמציין את CodeCombat, לא צריך ייחוס נפרד כלשהו." + art_paragraph_2: "אם התוכן שבו נעשה שימוש לא נוצר על-ידי CodeCombat, אלא במקום זאת על-ידי משתמש של codecombat.com, יש לייחס את החומר למשתמש זה במקום זאת, ולפעול לפי הנחיות הייחוס המסופקות בתיאור המשאב, אם ישנן." + rights_title: "הזכויות שמורות" + rights_desc: "כל הזכויות שמורות עבור השלבים עצמם. בכלל זה" + rights_scripts: "קובצי Script" + rights_unit: "תצורת יחידה" + rights_writings: "כתיבה" + rights_media: "מדיה (צלילים, מוזיקה) וכל תוכן יצירתי אחר שנוצר ספציפית עבור השלב המסוים ולא מונגש באופן כללי בעת יצירת שלבים." + rights_clarification: "למען ההבהרה, יצוין שבכל מה שנעשה זמין בעורך השלבים למטרת יצירת השלבים נעשה שימוש במסגרת CC, אולם הדבר אינו תקף לגבי התוכן שנוצר באמצעות עורך השלבים או שהועלה במהלך יצירת השלבים." + nutshell_title: "בקצרה" + nutshell_description: "בכל משאב אשר אנו מספקים בעורך השלבים, אתם חופשיים להשתמש כרצונכם לצורך יצירת שלבים. עם זאת, אנו שומרים את הזכות להגביל את ההפצה של השלבים עצמם (אשר נוצרו ב-codecombat.com) כך שאולי הם יהיו כרוכים בחיוב." + canonical: "הגרסה באנגלית של מסמך זה היא הגרסה הקובעת והקנונית. במקרה של אי התאמות כלשהן בין התרגומים, יגבר המסמך באנגלית." + third_party_title: "שירותי צד שלישי" + third_party_description: "CodeCombat משתמש בשירותי הצד השלישי שלהלן (בין השאר):" + + ladder_prizes: + title: "פרסי טורניר" # This section was for an old tournament and doesn't need new translations now. + blurb_1: "פרסים אלה יוענקו לפי" + blurb_2: "חוקי הטורניר" + blurb_3: "לשחקנים האנושיים והענקיים המובילים." + blurb_4: "שתי קבוצות פירושם פרסים כפולים!" + blurb_5: "(יהיו שני זוכים במקום הראשון, שניים במקום השני וכן הלאה)" + rank: "דירוג" + prizes: "פרסים" + total_value: "ערך כספי" + in_cash: "כולל" + custom_wizard: "קוסם מותאם אישית של CodeCombat" + custom_avatar: "אוואטאר מותאם אישית של CodeCombat" + heap: "לשישה חודשים של גישה מסוג \"סטארטאפ\"" + credits: "נקודות זכות" + one_month_coupon: "קופון: בחרו Rails או HTML" + one_month_discount: "30% הנחה: בחרו Rails או HTML" + license: "רישיון" + oreilly: "ספר אלקטרוני לבחירתכם" + + calendar: + year: "שנה" + day: "יום" + month: "חודש" + january: "ינואר" + february: "פברואר" + march: "מרץ" + april: "אפריל" + may: "מאי" + june: "יוני" + july: "יולי" + august: "אוגוסט" + september: "ספטמבר" + october: "אוקטובר" + november: "נובמבר" + december: "דצמבר" + + code_play_create_account_modal: + title: "הצלחתם!" # This section is only needed in US, UK, Mexico, India, and Germany + body: "כעת תוכלו לצאת לדרך להפיכה לאשפי קידוד. הירשמו כדי לקבל 100 אבני חן נוספות, ותזכו גם בהזדמנות לזכות ב-$2,500 ובפרסים נוספים של Lenovo." + sign_up: "הירשמו והמשיכו לקודד ▶" + victory_sign_up_poke: "צרו חשבון בחינם כדי לשמור את הקוד שלכם, וקבלו הזדמנות לזכות בפרסים!" + victory_sign_up: "הירשמו כדי לקבל הזדמנות לזכות ב-$2,500" + + server_error: + email_taken: 'כתובת הדואר האלקטרוני תפוסה' + username_taken: 'שם המשתמש כבר תפוס' + + esper: + line_no: "שורה $1: " + x_not_a_function: "'$1' אינו פונקציה" + type_error: "TypeError: " + reference_error: "ReferenceError: " + spelling_issues: "חפשו בעיות כתיב: האם התכוונתם ל-'$1' במקום ל-'$2'?" + capitalization_issues: "שימו לב לאותיות רישיות: `$1` אמור להיות`$2`." + py_empty_block: "$1 ריק. הציבו 4 תווי רווח לפני הפסוק בתוך $2." + fx_missing_paren: "אם ברצונכם לקרוא אל '$1` בתור פונקציה יש צורך ב-`()`" + unmatched_token: "'$1' ללא התאמה. Every opening `$2` needs a closing `$3` to match it." + unterminated_string: "מחרוזת לא גמורה. הוסיפו '\"' תואם בסיום המחרוזת." From f621a4ab1db91999a784f040dbadb35879686af0 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 2 Aug 2017 17:11:01 -0400 Subject: [PATCH 007/227] Propagate i18n --- app/locale/ar.coffee | 7 +- app/locale/bg.coffee | 7 +- app/locale/ca.coffee | 7 +- app/locale/cs.coffee | 7 +- app/locale/da.coffee | 7 +- app/locale/de-AT.coffee | 7 +- app/locale/de-CH.coffee | 7 +- app/locale/de-DE.coffee | 7 +- app/locale/el.coffee | 7 +- app/locale/en-GB.coffee | 7 +- app/locale/en-US.coffee | 7 +- app/locale/en.coffee | 2 +- app/locale/eo.coffee | 7 +- app/locale/es-419.coffee | 7 +- app/locale/es-ES.coffee | 7 +- app/locale/et.coffee | 7 +- app/locale/fa.coffee | 7 +- app/locale/fi.coffee | 7 +- app/locale/fil.coffee | 7 +- app/locale/fr.coffee | 9 +- app/locale/gl.coffee | 7 +- app/locale/haw.coffee | 7 +- app/locale/he.coffee | 275 +++++++++++++++++----------------- app/locale/hi.coffee | 7 +- app/locale/hr.coffee | 7 +- app/locale/hu.coffee | 9 +- app/locale/id.coffee | 7 +- app/locale/it.coffee | 7 +- app/locale/ja.coffee | 7 +- app/locale/kk.coffee | 7 +- app/locale/ko.coffee | 7 +- app/locale/lt.coffee | 7 +- app/locale/mi.coffee | 7 +- app/locale/mk-MK.coffee | 7 +- app/locale/ms.coffee | 7 +- app/locale/my.coffee | 7 +- app/locale/nb.coffee | 7 +- app/locale/nl-BE.coffee | 7 +- app/locale/nl-NL.coffee | 7 +- app/locale/nl.coffee | 7 +- app/locale/nn.coffee | 7 +- app/locale/pl.coffee | 9 +- app/locale/pt-BR.coffee | 7 +- app/locale/pt-PT.coffee | 9 +- app/locale/ro.coffee | 7 +- app/locale/ru.coffee | 9 +- app/locale/sk.coffee | 7 +- app/locale/sl.coffee | 7 +- app/locale/sr.coffee | 9 +- app/locale/sv.coffee | 7 +- app/locale/th.coffee | 7 +- app/locale/tr.coffee | 7 +- app/locale/uk.coffee | 7 +- app/locale/ur.coffee | 7 +- app/locale/uz.coffee | 7 +- app/locale/vi.coffee | 7 +- app/locale/zh-HANS.coffee | 9 +- app/locale/zh-HANT.coffee | 7 +- app/locale/zh-WUU-HANS.coffee | 7 +- app/locale/zh-WUU-HANT.coffee | 7 +- 60 files changed, 319 insertions(+), 378 deletions(-) diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee index 2592351a523..80925d4dcd8 100644 --- a/app/locale/ar.coffee +++ b/app/locale/ar.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee index 9a2f8c4baeb..bfa9b495aa9 100644 --- a/app/locale/bg.coffee +++ b/app/locale/bg.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "български език", englishDescri auth_tab: "Записване" inventory_caption: "Екипирай героя си" choose_hero_caption: "Избери герой, език" - save_load_caption: "... и вижте историята" options_caption: "Промени настройките" guide_caption: "Документи и съвети" multiplayer_caption: "Играй с приятели!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "български език", englishDescri # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Изостри уменията си в CodeCombat с абонамент!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "български език", englishDescri sale_button: "Разпродажба!" sale_button_title: "Спестете ${{discount}} като направите абонамент за 1 година" # {change} stripe_description: "Месечен Абонамент" - stripe_description_year_sale: "Едногодишен абонамент (${{discount}} намаление)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Необходим ви е абонамент за да играете това ниво." unlock_help_videos: "Абонирайте се за да отключите всичките видео уроци." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "български език", englishDescri # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "български език", englishDescri # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee index a56a742f7f0..71f45eb2315 100644 --- a/app/locale/ca.coffee +++ b/app/locale/ca.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr auth_tab: "Dona't d'alta" inventory_caption: "Equipa el teu heroi" choose_hero_caption: "Tria l'heroi, llenguatge" - save_load_caption: "... i mira l'historial" options_caption: "Edita la configuració" guide_caption: "Documents i pistes" multiplayer_caption: "Juga amb amics!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Afina les teves habilitats amb una subscripció a CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr sale_button: "Compra!" sale_button_title: "Estalvia $21 en la compra de la subscripció d'1 any" stripe_description: "Subscripció mensual" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee index 586595969dd..8e1b16a2405 100644 --- a/app/locale/cs.coffee +++ b/app/locale/cs.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr auth_tab: "Registrovat se" inventory_caption: "Vybavte svého hrdinu" choose_hero_caption: "Vyberte hrdinu, jazyk" - save_load_caption: "... a prohledněte si historii" options_caption: "Konfigurace nastavení" guide_caption: "Dokumentace a tipy" multiplayer_caption: "Hrajte s přáteli!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Sharpen your skills with a CodeCombat subscription!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr sale_button: "Výprodej!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" stripe_description: "Měsíční předplatné" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" subscription_required_to_play: "Pro hraní této úrovně potřebujete předplatné." unlock_help_videos: "Kupte si předplatné pro odemčení všech tutoriálových videí." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/da.coffee b/app/locale/da.coffee index 3e7aaaa0117..ff07eaabfd4 100644 --- a/app/locale/da.coffee +++ b/app/locale/da.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans auth_tab: "Tilmeld dig" inventory_caption: "Udrust din helt" choose_hero_caption: "Vælg helt, sprog" - save_load_caption: "... og se historie" options_caption: "Rediger indstillinger" guide_caption: "Dokumentation og tips" multiplayer_caption: "Spil med venner!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Skærp dine færdigheder med et CodeCombat abonnement!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans sale_button: "Udsalg!" sale_button_title: "Spar $21 USD, når du køber et 1 års abonnement" stripe_description: "Månedligt Abonnement" - stripe_description_year_sale: "1 års Abonnement (${{discount}} rabat)" # buy_now: "Buy Now" subscription_required_to_play: "Du har brug for et abonnement for at spille denne bane." unlock_help_videos: "Abonnér for at låse alle video-tutorials op." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee index 8c73ea57ef5..96f8c244dff 100644 --- a/app/locale/de-AT.coffee +++ b/app/locale/de-AT.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: auth_tab: "Anmelden" inventory_caption: "Rüste deinen Helden aus" choose_hero_caption: "Wähle Helden, Sprache" - save_load_caption: "... und schaue dir die Historie an" options_caption: "konfiguriere Einstellungen" guide_caption: "Doku und Tipps" multiplayer_caption: "Spiele mit Freunden!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee index 4faf5b68509..c739178f6dd 100644 --- a/app/locale/de-CH.coffee +++ b/app/locale/de-CH.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge auth_tab: "Regischtriere" inventory_caption: "Rüscht din Held uus" choose_hero_caption: "Wähl din Held und dini Sprach" - save_load_caption: "... und lueg dini Gschicht aa." options_caption: "Iistellige apasse" guide_caption: "Doku und Tipps" multiplayer_caption: "Spil mid dini Fründe!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Verschärf dins Chönne midme CodeCombat Abonement." # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" subscription_required_to_play: "Du bruchsch es Abo um das Level zspile." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index 9dd031de610..e452b073348 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: auth_tab: "Registrieren" inventory_caption: "Rüste deinen Helden aus" choose_hero_caption: "Wähle Helden, Sprache" - save_load_caption: "... und schaue dir die Historie an" options_caption: "konfiguriere Einstellungen" guide_caption: "Handbuch und Tipps" multiplayer_caption: "Spiele mit Freunden!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: prompt_body: "Spiele weiter und verdiene mehr!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Werde Master Coder und bestelle das Premium-Abonnent!" premium_pricing_prefix: "Hol dir Premium für nur" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: sale_button: "Angebot!" sale_button_title: "Spare ${{discount}} beim Kauf eines Jahresabonnements" stripe_description: "Monatsabo" - stripe_description_year_sale: "Jahresabonnement (${{discount}} Rabatt)" buy_now: "Bestellen" subscription_required_to_play: "Leider musst du ein Abo haben, um dieses Level spielen zu können." unlock_help_videos: "Abonniere, um alle Videoanleitungen freizuschalten." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: hero_blurb_1: "Du bekommst Zugang zu __premiumHeroesCount__ extrastarken Helden nur für Abonnenten! Nutze die Macht von Okar Stompfoot, die tödliche Präzision von Naria von Blatt oder beschwöre \"hinreißende\" Skelette mit Nalfar Cryptor." hero_blurb_2: "Premium-Krieger erschließen beeindruckende Kampfkünste wie Kampf-Schrei, Stampfen oder Feinde-Wirbeln. Oder spiele als Waldläufer und nutze Tarntechnik, Messer und Borgen. Werde ein wahrer Programmier-Zauberer und entfessele Ur-, Nekromantie- oder Elementar-Magie!" hero_caption: "Spannende neue Helden!" - pet_blurb_1: "Lieblingstiere sind nicht nur hinreißend, sie stellen auch ganz neue Funktionen und Methoden zur Verfügung. Der Babygreif fliegt über Hindernisse, der Wolfswelpe kann Zaubertränke holen und der Puma kann sprechen!" + pet_blurb_1: "Lieblingstiere sind nicht nur hinreißend, sie stellen auch ganz neue Funktionen und Methoden zur Verfügung. Der Babygreif fliegt über Hindernisse, der Wolfswelpe kann Zaubertränke holen und der Puma kann sprechen!" # {change} pet_blurb_2: "Sammle alle und entdecke ihre einzigartigen Fähigkeiten" pet_caption: "Lieblingstiere für deine Helden!" game_dev_blurb: "Lerne, wie man Spiele mit Scripten steuert und erstelle neue Level, die du mit deinen Freunden teilen kannst! Plaziere die Gegenstände, die du willst, schreibe Programme für die Logik und das Verhalten der Einheiten und beobachte, ob deine Freunde das Level schaffen können." @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: select_all: "Alle auswählen" project: "Projekt" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "Arenarangliste anzeigen" resource_hub: "Resource Hub" diff --git a/app/locale/el.coffee b/app/locale/el.coffee index c031095a31f..f0a34fda228 100644 --- a/app/locale/el.coffee +++ b/app/locale/el.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre auth_tab: "Εγγραφή" inventory_caption: "Εξόπλισε τον ήρωά σου" choose_hero_caption: "Διάλεξε ήρωα και γλώσσα" - save_load_caption: "... και δες την ιστορία" options_caption: "Ρυθμίσεις" guide_caption: "Τεκμηρίωση και βοήθεια" multiplayer_caption: "Παίξε με φίλους!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Ακόνησε τις ικανότητές σου με μια συνδρομή στο CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre sale_button: "Εκπτώσεις!" sale_button_title: "Γλίτωσε ${{discount}} όταν αγοράσεις συνδρομή ετήσια συνδρομή" # {change} stripe_description: "Μηνιαία Συνδρομή" - stripe_description_year_sale: "Ετήσια Συνδρομή (${{discount}} έκπτωση)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Πρέπει να είσαι συνδρομητής για να παίξεις αυτό το επίπεδο." unlock_help_videos: "Απέκτησε συνδρομή για να ξεκλειδώσεις όλα τα βίντεο βοηθήματα." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee index 98e9cb4dd57..1a90fe54541 100644 --- a/app/locale/en-GB.coffee +++ b/app/locale/en-GB.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index 00d5112ca76..d4b9b8a3e57 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 2df26c6ebf0..309f305bdae 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -777,7 +777,7 @@ hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" hero_caption: "Exciting new heroes!" - pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # {change} + pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" pet_blurb_2: "Collect all the pets to discover their unique abilities!" pet_caption: "Adopt pets to accompany your hero!" game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" diff --git a/app/locale/eo.coffee b/app/locale/eo.coffee index 9ee98a8127f..7aca4553db1 100644 --- a/app/locale/eo.coffee +++ b/app/locale/eo.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index 3bf61cdf3ab..17ca4d1e4d0 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip auth_tab: "Entrar" inventory_caption: "Equipar a tu héroe" choose_hero_caption: "Elegir héroe, lenguaje" - save_load_caption: "... y ver historia" options_caption: "Hacer ajustes" guide_caption: "Documentos y consejos" multiplayer_caption: "¡Jugar con amigos!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Agudiza tus habilidades con la suscripción a CodeCombat!" # {change} premium_pricing_prefix: "Obten Premium Ahora" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip sale_button: "Venta!" sale_button_title: "Ahorre $21 al adquirir una suscripción por 1 año" stripe_description: "Suscripción Mensual" - stripe_description_year_sale: "Suscripción por 1 año (${{discount}} de descuento)" # buy_now: "Buy Now" subscription_required_to_play: "Necesitas una suscripción para jugar este nivel." unlock_help_videos: "Suscríbete para desbloquear todos los video tutoriales." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index 1efb9e3e732..ee968261e22 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis auth_tab: "Crear cuenta" inventory_caption: "Equipa a tu héroe" choose_hero_caption: "Elige la lengua del héroe" - save_load_caption: "... y ver la historia" options_caption: "Ajustes de configuración" guide_caption: "Documentos y pistas" multiplayer_caption: "¡Juega con amigos!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "¡Mejora tus habilidades con una suscripción a CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis sale_button: "Comprar!" sale_button_title: "Ahorra un ${{discount}} si compras una suscripción de 1 año" # {change} stripe_description: "Suscripción mensual" - stripe_description_year_sale: "Suscripción de 1 año (${{discount}} descuento)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Necesitas una suscripción para jugar este nivel." unlock_help_videos: "Suscríbete para desbloquear todos los videotutoriales." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/et.coffee b/app/locale/et.coffee index 1f271c7daf7..451150d8e53 100644 --- a/app/locale/et.coffee +++ b/app/locale/et.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee index 391457cdc94..e21108e3da8 100644 --- a/app/locale/fa.coffee +++ b/app/locale/fa.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee index eb7314286aa..6501eb82f97 100644 --- a/app/locale/fi.coffee +++ b/app/locale/fi.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran auth_tab: "Kirjaudu sisään" inventory_caption: "Varusta sankari" choose_hero_caption: "Valitse sankari ja kieli" - save_load_caption: "... ja katso historiaa" options_caption: "Muuta asetuksia" guide_caption: "Ohjeita ja vinkkejä" multiplayer_caption: "Pelaa ystävien kanssa!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran prompt_body: "Jatka pelaamista ansaitaksesi lisää!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Teroita kykyjäsi CodeCombat kuukausitilauksella!" # {change} premium_pricing_prefix: "Saa Premium vain hintaan" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran sale_button: "Alennus!" sale_button_title: "Säästä ${{discount}} kun ostat kuukausitilauksen koko vuodeksi kerralla" # {change} stripe_description: "Kuukausittainen tilaus" - stripe_description_year_sale: "12 kk:n kuukausitilaus (${{discount}} alennuksella)" # {change} buy_now: "Osta nyt" subscription_required_to_play: "Tarvitset CodeCombat kuukausitilauksen pellataksesi tätä tasoa." unlock_help_videos: "Hanki tilaus avataksesi kaikki video-oppaat." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/fil.coffee b/app/locale/fil.coffee index cbd78fa8e41..ddfcc965f73 100644 --- a/app/locale/fil.coffee +++ b/app/locale/fil.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index b4c50335915..39fe76046ec 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "français", englishDescription: "French", t auth_tab: "S'inscrire" inventory_caption: "Équipez votre héros" choose_hero_caption: "Choisissez votre héros, langage" - save_load_caption: "... et voir l'historique" options_caption: "Configurer les réglages" guide_caption: "Docs et conseils" multiplayer_caption: "Jouer avec des amis !" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Aiguisez vos compétences avec un abonnement CodeCombat !" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "français", englishDescription: "French", t sale_button: "Promotion!" sale_button_title: "Économisez 21$ en achetant un abonnement d'un an" stripe_description: "Inscription mensuelle" - stripe_description_year_sale: "1 an d'abonnement (Économie de {{discount}}$ !)" # buy_now: "Buy Now" subscription_required_to_play: "Vous avez besoin d'un abonnement pour jouer à ce niveau." unlock_help_videos: "Abonnez vous pour débloquer tous les tutoriels vidéo." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t select_all: "Tout sélectionner" project: "Projet" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" # view_arena_ladder: "View Arena Ladder" # resource_hub: "Resource Hub" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/gl.coffee b/app/locale/gl.coffee index b9342bc9caa..dcde96e5173 100644 --- a/app/locale/gl.coffee +++ b/app/locale/gl.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr auth_tab: "Crear conta" inventory_caption: "Equipa ao teu Heroe" choose_hero_caption: "Escolle a lingua do teu Heroe" - save_load_caption: "... e mirar a historia" options_caption: "Axustes de configuración" guide_caption: "Documentos e pistas" multiplayer_caption: "Xoga cos teus amigos!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/haw.coffee b/app/locale/haw.coffee index 6311e89bebf..d5bed2460a9 100644 --- a/app/locale/haw.coffee +++ b/app/locale/haw.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/he.coffee b/app/locale/he.coffee index b0c6aae48ff..b05c576af76 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -36,7 +36,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", compared: "בהשוואה" conventional: "לשיטות הערכה קונבנציונליות, נהנות מיתרון ברור: משחקים עוזרים לתלמידים טוב יותר לשמור על ידע, להתרכז" perform_at_higher_level: "ולהגיע להישגים גבוהים יותר" - feedback: """בנוסף, משחקים מספקים משוב בזמן אמת, שמאפשר לתלמידים לשנות בהתאם את הדרך שלהם אל הפתרון ולקבל הבנה הוליסטית יותר של עקרונות, במקום להגביל את התלמידים לתשובות "נכון" או "לא נכון".""" + feedback: "בנוסף, משחקים מספקים משוב בזמן אמת, שמאפשר לתלמידים לשנות בהתאם את הדרך שלהם אל הפתרון ולקבל הבנה הוליסטית יותר של עקרונות, במקום להגביל את התלמידים לתשובות \"נכון\" או \"לא נכון\"." real_game: "חוויית משחק אמיתית, דרך קידוד אמיתי." great_game: "משחק מצוין הוא יותר מאשר מדליות והישגים - הוא מסע שהשחקן עובד, פאזלים בנויים היטב והיכולת להתמודד עם הישגים מתוך העצמה וביטחון עצמי." agency: "CodeCombat הוא משחק שמעצים תלמידים ומעניק להם ביטחון באמצעות המנוע המקיף שלנו לקידוד בהקלדה, אשר עוזר לתלמידים מתחילים ומתקדמים כאחד, עם קוד נכון ותקין." @@ -50,23 +50,23 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", logged_in_as: "אתה מחובר כעת בתור" computer_science: "קורסים במדעי המחשב לכל הגילאים" show_me_lesson_time: "הצג הערכות זמן שיעור עבור:" - curriculum: """סה"כ שעות בתכנית לימודים:""" - ffa: """בחינם לכל התלמידים""" + curriculum: "סה\"כ שעות בתכנית לימודים:" + ffa: "בחינם לכל התלמידים" lesson_time: "זמן שיעור:" coming_soon: "עוד בקרוב!" courses_available_in: "זמינים קורסים ב-JavaScript וב-Python. קורסים בפיתוח אינטרנט משתמשים ב-HTML,‏ CSS,‏ jQuery ו-Bootstrap." boast: "כולל חידות ברמת מורכבות מספיקה כדי לרתק חובבי משחקים ומקודדים כאחד." winning: "שילוב מנצח של משחק תפקידים ושיעורי בית בתכנות, שמצליח להפוך תכנית לימודים שמתאימה לילדים למהנה באמת." - run_class:"כל מה שנחוץ לכם כדי לנהל כיתה למדעי המחשב בבית הספר שלכם כבר היום, ללא צורך ברקע במדעי המחשב." + run_class: "כל מה שנחוץ לכם כדי לנהל כיתה למדעי המחשב בבית הספר שלכם כבר היום, ללא צורך ברקע במדעי המחשב." goto_classes: "עבור אל הכיתות שלי" view_profile: "הצג את הפרופיל שלי" view_progress: "הצג התקדמות" go_to_courses: "עבור לקורסים שלי" want_coco: "רוצים את CodeCombat אצלכם בבית הספר?" - + nav: map: "מפה" - play: "שלבים" # הערך של סרגל הניווט העליון, אשר בו השחקנים בוחרים באילו שלבים לשחק + play: "שלבים" # The top nav bar entry where players choose which levels to play community: "קהילה" courses: "קורסים" blog: "בלוג" @@ -103,38 +103,38 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", modal: close: "סגור" okay: "אישור" - + not_found: page_not_found: "הדף לא נמצא" - + diplomat_suggestion: - title: "עזרו לתרגם את CodeCombat!" # מופיע כאשר השחקן עובר לשפה שאינה אנגלית באמצעות בורר השפות. + title: "עזרו לתרגם את CodeCombat!" # This shows up when a player switches to a non-English language using the language selector. sub_heading: "אנו זקוקים לכישורי השפה שלכם" pitch_body: "אנו מפתחים את CodeCombat בשפה האנגלית, אך כבר יש לנו שחקנים בכל העולם. רבים מהם רוצים לשחק בשפה {English} אך אינם דוברים אנגלית. לכן, אם אתם דוברים את שתי השפות, אנא שקלו להירשם בתור דיפלומט ולעזור לתרגם את אתר האינטרנט ואת כל השלבים של CodeCombat לשפה {English}." missing_translations: "עד שנצליח לתרגם הכול לשפה {English}, יופיע בפניכם תוכן באנגלית כאשר השפה {English} אינה זמינה." learn_more: "למידע נוסף על הצטרפות כדיפלומט" subscribe_as_diplomat: "הירשם כמנוי דיפלומט" - + play: - play_as: "שחק בתור" # דף הטבלה - compete: "תחרות!" # דף פרטי קורס - spectate: "מצב קהל" # דף הטבלה - players: "שחקנים" # רחף מעל לשלב ב-/play - hours_played: "שעות משחק" # רחף מעל לשלב ב-/play - items: "פריטים" # Tooltip on item shop button from /play - unlock: "פתח" # For purchasing items and heroes + play_as: "שחק בתור" # Ladder page + compete: "תחרות!" # Course details page + spectate: "מצב קהל" # Ladder page + players: "שחקנים" # Hover over a level on /play + hours_played: "שעות משחק" # Hover over a level on /play + items: "פריטים" # Tooltip on item shop button from /play + unlock: "פתח" # For purchasing items and heroes confirm: "אשר" - owned: "שלי" # For items you own + owned: "שלי" # For items you own locked: "נעול" - purchasable: "לקנייה" # עבור גיבור שפתחת אך טרם רכשת + purchasable: "לקנייה" # For a hero you unlocked but haven't purchased available: "זמין" - skills_granted: "מיומנויות מתקבלות" # פרטים לתיעוד מאפיין - heroes: "גיבורים" # תיאור כלי בלחצן חנות הגיבורים מ-/play - achievements: "הישגים" # תיאור כלי ללחצן רשימת ההישגים מ-/play - settings: "הגדרות" # תיאור כלי ללחצן ההגדרות מ-/play - poll: "סקר" # תיאור כלי ללחצן הסקר מ-/play - next: "הבא" # עבור מבחירת גיבור לבחירת ציוד לפני שתשחק שלב - change_hero: "החלף גיבור" # חזרה מבחירת הציוד לבחירת הגיבור + skills_granted: "מיומנויות מתקבלות" # Property documentation details + heroes: "גיבורים" # Tooltip on hero shop button from /play + achievements: "הישגים" # Tooltip on achievement list button from /play + settings: "הגדרות" # Tooltip on settings button from /play + poll: "סקר" # Tooltip on poll button from /play + next: "הבא" # Go from choose hero to choose inventory before playing a level + change_hero: "החלף גיבור" # Go back from choose inventory to choose hero buy_gems: "קנה אבני חן" subscription_required: "נדרש מנוי" subscribers_only: "למנויים בלבד!" @@ -143,7 +143,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", subscriber_gems: "הירשם כמנוי היום כדי לקנות גיבור זה עם אבני חן!" anonymous: "שחקן אנונימי" level_difficulty: "רמת קושי: " - play_classroom_version: "שחק בגרסה הכיתתית" # בחר שלב בגרסת המערכה, שבאפשרותך לשחק גם באחד הקורסים שלך + play_classroom_version: "שחק בגרסה הכיתתית" # Choose a level in campaign version that you also can play in one of your courses campaign_beginner: "מערכה למתחילים" awaiting_levels_adventurer_prefix: "אנו משחררים שלבים חדשים מדי שבוע." awaiting_levels_adventurer: "הרשמה כהרפתקן" @@ -155,9 +155,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", brain_pop_challenge: "כדי לאתגר את עצמכם, שחקו שוב באמצעות שפת תכנות אחרת!" replay: "הילוך חוזר" back_to_classroom: "בחזרה לכיתה" - + code: - if: "אם" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) + if: "אם" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) else: "אחרת" elif: "אחרת אם" while: "כל עוד" @@ -182,7 +182,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", "&&": "וכן" not: "לא" "!": "לא" - "=": "הקצה" # For this section, conjugate it like it's the verb part of a sentence when possible + "=": "הקצה" "==": "שווה" "===": "זהה" "!=": "לא שווה" @@ -205,7 +205,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", null: "ריק" nil: "ערך אפס" None: "ללא" - + share_progress_modal: blurb: "אתם מתקדמים נהדר! ספרו להורה שלכם כמה למדתם עם CodeCombat." email_invalid: "כתובת דואר אלקטרוני לא חוקית." @@ -213,7 +213,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", form_label: "כתובת דואר אלקטרוני" placeholder: "כתובת דואר אלקטרוני" title: "כל הכבוד, חניכים" - + login: sign_up: "יצירת חשבון" email_or_username: "דואר אלקטרוני או שם משתמש" @@ -227,7 +227,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", sign_in_with_facebook: "כניסה באמצעות Facebook" sign_in_with_gplus: "כניסה באמצעות Google" signup_switch: "רוצים ליצור חשבון?" - + signup: create_student_header: "יצירת חשבון תלמיד" create_teacher_header: "יצירת חשבון מורה" @@ -296,7 +296,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", teacher_ready_to_create_class: "אתם מוכנים ליצירת הכיתה הראשונה שלכם!" teacher_students_can_start_now: "התלמידים שלכם מיד יוכלו להתחיל ולשחק בקורס הראשון, 'מבוא למדעי המחשב'." teacher_list_create_class: "במסך הבא תוכלו ליצור כיתה חדשה." - teacher_list_add_students: """כדי להוסיף תלמידים לכיתה, לחצו על הקישור 'הצג כיתה', ולאחר מכן שלחו אל התלמידים את קוד הכיתה או כתובת ה-URL. תוכלו גם להזמין אותם בדואר אלקטרוני, אם יש להם כתובות דוא"ל.""" + teacher_list_add_students: "כדי להוסיף תלמידים לכיתה, לחצו על הקישור 'הצג כיתה', ולאחר מכן שלחו אל התלמידים את קוד הכיתה או כתובת ה-URL. תוכלו גם להזמין אותם בדואר אלקטרוני, אם יש להם כתובות דוא\"ל." teacher_list_resource_hub_1: "בואו לעיין" teacher_list_resource_hub_2: "במדריכים לקורס" teacher_list_resource_hub_3: "כדי למצוא פתרונות לכל שלב, וכן" @@ -304,12 +304,12 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", teacher_list_resource_hub_5: "כדי למצוא מדריכים לתכנית לימודים, פעילויות ועוד!" teacher_additional_questions: "זה הכול! לשאלות ולקבלת עזרה נוספת, נא לפנות אל __supportEmail__." dont_use_our_email_silly: "אל תכתבו כאן את הכתובת שלנו! כתבו את כתובת הדואר האלקטרוני של ההורה." - + recover: recover_account_title: "שחזור חשבון" send_password: "שלח סיסמת שחזור" recovery_sent: "הודעת שחזור נשלחה." - + items: primary: "ראשי" secondary: "משני" @@ -317,12 +317,12 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", accessories: "אביזרים" misc: "שונות" books: "ספרים" - + common: back: "חזור" # When used as an action verb, like "Navigate backward" go_back: "חזרה" coming_soon: "בקרוב!" - continue: "המשך" # When used as an action verb, like "Continue forward" + continue: "המשך" # When used as an action verb, like "Continue forward" next: "הבא" default_code: "קוד ברירת מחדל" loading: "טוען..." @@ -339,7 +339,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", publish: "פרסם" create: "צור" fork: "פיצול" - play: "שחק" # When used as an action verb, like "Play next level" + play: "שחק" # When used as an action verb, like "Play next level" retry: "נסה שוב" actions: "פעולות" info: "מידע" @@ -351,7 +351,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", save_changes: "שמור שינויים" required_field: "חובה" valid_phone: "נא להזין ספר טלפון חוקי." - + general: and: "וכן" name: "שם" @@ -398,7 +398,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", medium: "בינוני" hard: "קשה" player: "שחקן" - player_level: "דרגה" # Like player level 5, not like level: Dungeons of Kithgard + player_level: "דרגה" # Like player level 5, not like level: Dungeons of Kithgard warrior: "לוחם" ranger: "סייר" wizard: "קוסם" @@ -409,7 +409,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", contact_us: "צור קשר" close_window: "סגור חלון" learn_more: "מידע נוסף" - + units: second: "שנייה" seconds: "שניות" @@ -425,7 +425,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", months: "חודשים" year: "שנה" years: "שנים" - + play_level: back_to_map: "בחזרה למפה" directions: "הנחיות" @@ -442,8 +442,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", languages: "שפות" programming_language: "שפת תכנות" show_menu: "הצג תפריט משחק" - home: "בית" # Not used any more, will be removed soon. - level: "דרגה" # Like "דרגה: המבוכים של קיתגארד" + home: "בית" # Not used any more, will be removed soon. + level: "דרגה" # Like "Level: Dungeons of Kithgard" skip: "דלג" game_menu: "תפריט משחק" restart: "הפעל מחדש" @@ -471,7 +471,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", victory_review: "ספרו לנו עוד!" victory_review_placeholder: "איך היה השלב הזה?" victory_hour_of_code_done: "סיימתם?" - victory_hour_of_code_done_yes: 'סיימתי את "שעת הקוד™" שלי!' + victory_hour_of_code_done_yes: "סיימתי את \"שעת הקוד™\" שלי!" victory_experience_gained: "נקודות ניסיון שקיבלתם" victory_gems_gained: "אבני חן שהשגתם" victory_new_item: "פריט חדש" @@ -524,7 +524,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", tip_munchkin: "אם לא תאכל ירקות, יבוא לתפוס אותך ננס כשתלך לישון." tip_binary: "בעולם יש רק עשרה סוגי אנשים: אלה שמבינים בינארי, ואלה שלא." tip_commitment_yoda: "מתכנת צריך מסירות עמוקה ורצינות גמורה. ~ יודה" - tip_no_try: 'עשה. או אל תעשה. אין "לנסות". - יודה' + tip_no_try: "עשה. או אל תעשה. אין \"לנסות\". - יודה" tip_patience: "אתה להיות סבלני חייב, פאדאוואן הצעיר. - יודה" tip_documented_bug: "באג עם תיעוד הוא לא באג; הוא פיצ'ר." tip_impossible: "דברים תמיד נראים בלתי-אפשריים, עד שעושים אותם. - נלסון מנדלה" @@ -578,14 +578,14 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", view_gallery: "הצג גלריה" project_published_noty: "השלב שלכם פורסם!" keep_editing: "המשך בעריכה" - + play_game_dev_level: created_by: "נוצר על-ידי {{name}}" restart: "התחל שלב מחדש" play: "שחקו בשלב" play_more_codecombat: "שחקו עוד CodeCombat" default_student_instructions: "לחצו כדי לשלוט בגיבור שלכם ולנצח במשחק!" - + game_menu: inventory_tab: "ציוד" save_load_tab: "שמור/טען" @@ -597,12 +597,11 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", auth_tab: "הרשמה" inventory_caption: "ציידו את הגיבור" choose_hero_caption: "בחרו גיבור, שפה" - save_load_caption: "... וצפו בהיסטוריה" options_caption: "קבעו הגדרות" guide_caption: "מסמכים ועצות" multiplayer_caption: "שחקו עם חברים!" auth_caption: "שמרו את התקדמותכם." - + leaderboard: view_other_solutions: "הצג טבלאות מובילים" scores: "נקודות" @@ -616,7 +615,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", damage_dealt: "נזק שנגרם" difficulty: "רמת קושי" gold_collected: "זהב שנאסף" - + inventory: equipped_item: "ציוד נוכחי" required_purchase_title: "נדרש" @@ -628,7 +627,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", restricted: "(מוגבל בשלב הזה)" equip: "צייד" unequip: "הסר" - + buy_gems: few_gems: "כמה אבני חן" pile_gems: "ערימת אבני חן" @@ -644,22 +643,22 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", buy_premium: "קנה פרימיום" purchase: "רכישה" purchased: "נרכש" - + earn_gems: prompt_title: "אין מספיק אבני חן" prompt_body: "המשיכו לשחק כדי להשיג עוד!" - + subscribe: premium_already_subscribed: "אתם כבר רשומים למנוי פרימיום!" subscribe_modal_title: "CodeCombat פרימיום" comparison_blurb: "הפכו לאשפי קוד - הירשמו היום למנוי פרימיום!" premium_pricing_prefix: "קנו מנוי פרימיום במחיר" premium_pricing_suffix: "בלבד, והפכו לאשפי קוד." - premium: "פרימיום" # Make sure the following feature translations don't go onto two lines + premium: "פרימיום" # Make sure the following feature translations don't go onto two lines free: "חינם" month: "חודש" must_be_logged: " יש להתחבר תחילה. נא ליצור חשבון או להתחבר מהתפריט שלמעלה." - subscribe_title: "צור מנוי" # Actually used in subscribe buttons, too + subscribe_title: "צור מנוי" # Actually used in subscribe buttons, too unsubscribe: "בטל מנוי" confirm_unsubscribe: "אשר ביטול מנוי" never_mind: "לא חשוב, אני עדיין אוהב אותך" @@ -692,7 +691,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", buy_now: "קנה כעת" subscription_required_to_play: "נדרש מנוי כדי לשחק בשלב זה." unlock_help_videos: "הירשמו כמנוי כדי לפתוח את כל ההדרכות בווידאו." - personal_sub: "מנוי אישי" # Accounts Subscription View below + personal_sub: "מנוי אישי" # Accounts Subscription View below loading_info: "טוען פרטי מנוי..." managed_by: "מנוהל על-ידי" will_be_cancelled: "יבוטל ב:" @@ -728,7 +727,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", choose_payment_method: "בחר שיטת תשלום" pay_with_credit_card_or_bitcoin: "תשלום באמצעות כרטיס אשראי/ביטקוין" paypal_payment_error: "נתקלנו בשגיאה בחיוב דרך PayPal." - + announcement: now_available: "כעת זמין למנויים!" subscriber: "מנוי" @@ -742,7 +741,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", mimic_name: "חקיין" mimic_description: "חקיינים יכולים לאסוף עבורכם מטבעות. שימו אותם על מטבעות כדי להגדיל את כמות הזהב שלכם." cougar_name: "פומה" - cougar_description: 'לפומה יש תואר ד"ר (דברים רכים).' + cougar_description: "לפומה יש תואר ד\"ר (דברים רכים)." fox_name: "שועל כחול" fox_description: "השועלים הכחולים פקחים ביותר, ואוהבים לחפור באדמה ובשלג!" pugicorn_name: "פאגקרן" @@ -770,7 +769,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", tornado_description: "טוב שיש לחצן איפוס, ברגע שתופסים אותך." wallOfDarkness_name: "קיר חושך" wallOfDarkness_description: "הסתתרו מאחורי קיר צללים, כדי לחמוק מעיניים סקרניות." - + premium_features: get_premium: "מנוי
CodeCombat
פרימיום" # Fit into the banner on the /features page master_coder: "הירשמו עוד היום כדי להפוך לאשפי תכנות!" @@ -792,7 +791,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", list_items: "הצטיידו בפריטי פרימיום בלעדיים, כגון חיות מחמד" list_support: "קבלו תמיכת פרימיום, שתעזור לכם לאתר באגים בקודים מסובכים" list_clans: "צרו שבטים פרטיים, כדי להזמין חברים ולהתחרות בטבלה של קבוצות מובילות" - + choose_hero: choose_hero: "בחרו גיבור" programming_language: "שפת תכנות" @@ -809,13 +808,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", weapons_warrior: "חרבות - טווח קצר, ללא קסם" weapons_ranger: "קשתות צלב, תותחים, טווח ארוך, ללא קסם" weapons_wizard: "שרביטים, מטות - טווח ארוך, קסם" - attack: "נזק" # Can also translate as "התקפה" + attack: "נזק" # Can also translate as "Attack" health: "בריאות" speed: "מהירות" regeneration: "התחדשות" - range: "טווח" # As in "attack or visual range" - blocks: "חוסם" # As in "this shield blocks this much damage" - backstab: "דקירה מאחור" # As in "this dagger does this much backstab damage" + range: "טווח" # As in "attack or visual range" + blocks: "חוסם" # As in "this shield blocks this much damage" + backstab: "דקירה מאחור" # As in "this dagger does this much backstab damage" skills: "מיומנויות" attack_1: "גורם" attack_2: "מתוך" @@ -825,10 +824,10 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", health_3: "בריאות שריון נקובה." speed_1: "נע במהירות" speed_2: "מטר לשנייה." - available_for_purchase: "זמין לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store - level_to_unlock: "שלב לפתיחה:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) + available_for_purchase: "זמין לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store + level_to_unlock: "שלב לפתיחה:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) restricted_to_certain_heroes: "רק גיבורים מסוימים יכולים לשחק בשלב זה." - + skill_docs: function: "פונקציה" # skill types method: "מתודה" @@ -836,8 +835,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", number: "מספר" array: "מערך" object: "אובייקט" - string: "מחרוזת" - writable: "ניתן לכתיבה" # Hover over "attack" in Your Skills while playing a level to see most of this + string: "מחרוזת" + writable: "ניתן לכתיבה" # Hover over "attack" in Your Skills while playing a level to see most of this read_only: "לקריאה בלבד" action: "פעולה" spell: "לחש" @@ -849,7 +848,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", action_radius: "רדיוס" action_duration: "משך זמן" example: "דוגמה" - ex: "לדוגמה" # Abbreviation of "example" + ex: "לדוגמה" # Abbreviation of "example" current_value: "ערך נוכחי" default_value: "ערך ברירת מחדל" parameters: "פרמטרים" @@ -857,13 +856,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", optional_parameters: "פרמטרים אופציונליים" returns: "מחזיר" granted_by: "מתקבל מ:" - + save_load: granularity_saved_games: "נשמר" granularity_change_history: "היסטוריה" - + options: - general_options: "אפשרויות כלליות" # Check out the Options tab in the Game Menu while playing a level + general_options: "אפשרויות כלליות" # Check out the Options tab in the Game Menu while playing a level volume_label: "עוצמת קול" music_label: "מוזיקה" music_description: "להפעלה/כיבוי של המוזיקה." @@ -876,9 +875,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", editor_config_indentguides_description: "מציג קווים אנכיים, להצגה ברורה יותר של ההזחה." editor_config_behaviors_label: "אופני פעולה חכמים" editor_config_behaviors_description: "משלים באופן אוטומטי סוגריים מרובים, סוגריים מסולסלים ומירכאות." - + about: - main_title:"אם אתם רוצים ללמוד איך לתכנת, עליכם לכתוב (הרבה) קוד." + main_title: "אם אתם רוצים ללמוד איך לתכנת, עליכם לכתוב (הרבה) קוד." main_description: "המשימה שלנו ב-CodeCombat היא לוודא שאתם עושים זאת עם חיוך על הפנים." mission_link: "המשימה" team_link: "הצוות" @@ -888,8 +887,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", mission_description_1: "תכנות זה קסם. הוא היכולת ליצור דברים מתוך הדמיון עצמו. הקמנו את CodeCombat כדי להעניק ללומדים תחושה של כוחות קסם בקצות אצבעותיהם, דרך השימוש בקוד מוקלד." mission_description_2: "מסתבר שזה גם מאפשר להם ללמוד מהר יותר. הרבה יותר מהר. זה דומה לניהול של שיחה, במקום קריאה של ספר הדרכה. אנו רוצים להביא את השיחה הזאת אל כל מוסד לימוד ואל כל תלמיד, משום שלכולם מגיעה הזדמנות ללמוד את הקסם שבתכנות." team_title: "הכירו את הצוות של CodeCombat" - team_values: """ חשוב לנו שיח פתוח ומכבד, שבו הרעיונות הטובים ביותר מנצחים. ההחלטות שלנו מבוססות על חקר לקוחות, ותהליך העבודה שלנו מתמקד באספקה של תוצאות מוחשיות עבורם. כולם מעורבים בתהליך, מהמנכ\"ל ועד לתורמים שלנו ב-GitHub, משום שאצלנו בצוות נותנים חשיבות לצמיחה וללימוד.""" - nick_title: """מייסד-שותף, מנכ"ל""" + team_values: " חשוב לנו שיח פתוח ומכבד, שבו הרעיונות הטובים ביותר מנצחים. ההחלטות שלנו מבוססות על חקר לקוחות, ותהליך העבודה שלנו מתמקד באספקה של תוצאות מוחשיות עבורם. כולם מעורבים בתהליך, מהמנכ\"ל ועד לתורמים שלנו ב-GitHub, משום שאצלנו בצוות נותנים חשיבות לצמיחה וללימוד." + nick_title: "מייסד-שותף, מנכ\"ל" nick_blurb: "גורו מוטיבציה" matt_title: "מייסד-שותף, מנהל טכנולוגיה ראשי" cat_title: "מעצבת משחק" @@ -942,7 +941,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", story_sketch_caption: "הסקיצה הראשונה של ניק, שמתארת משחק תכנות בפעולה." story_long_way_2: "אנחנו עוד צריכים לעשות הרבה כדי להשיג את המשימה שלנו, אז..." jobs_title: "בואו לעבוד אתנו ולעזור לכתוב את ההיסטוריה של CodeCombat!" - jobs_subtitle: """לא מוצאים משהו שמתאים לכם, אבל רוצים לשמור על קשר? ראו תחת "יצירה משלך".""" + jobs_subtitle: "לא מוצאים משהו שמתאים לכם, אבל רוצים לשמור על קשר? ראו תחת \"יצירה משלך\"." jobs_benefits: "הטבות עובדים" jobs_benefit_4: "חופשות ללא הגבלה" jobs_benefit_5: "התפתחות מקצועית והמשך תמיכה בהשכלה - ספרים ומשחקים בחינם!" @@ -968,10 +967,10 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", download_all: "הורד הכול" previous: "הקודם" location_title: "אנו יושבים בלב סן פרנסיסקו:" - + teachers: licenses_needed: "רישיונות נדרשים" - + special_offer: special_offer: "הצעה מיוחדת" project_based_title: "קורסים מבוססי-פרויקט" @@ -988,7 +987,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", starter_licenses_can_be_used: "באמצעות רישיונות למתחילים, ניתן להקצות קורסים נוספים מיד לאחר הרכישה." pay_now: "שלם כעת" we_accept_all_major_credit_cards: "אנו מקבלים את כל כרטיסי האשראי הנפוצים." - cs2_description: """ממשיך ובונה על היסוד מ'מבוא למדעי המחשב', ומתעמק בפסוקי "אם", בפונקציות, באירועים ועוד.""" + cs2_description: "ממשיך ובונה על היסוד מ'מבוא למדעי המחשב', ומתעמק בפסוקי \"אם\", בפונקציות, באירועים ועוד." wd1_description: "מציג את עקרונות הבסיס של HTML ו-CSS תוך לימוד של מיומנויות הנחוצות לתלמידים לבניית דף האינטרנט הראשון שלהם." gd1_description: "משתמש בתחביר שכבר מוכר לתלמידים, כדי להראות להם כיצד לבנות ולשתף שלבי משחק מתפקדים משל עצמם." see_an_example_project: "צפו בפרויקט לדוגמה" @@ -1012,7 +1011,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", courses_suffix: "" course_prefix: "קורס" course_suffix: "" - + teachers_quote: subtitle: "התלמידים שלכם יוכלו להתחיל תוך פחות משעה אחת. תוכלו ליצור כיתה, להוסיף תלמידים ולעקוב אחר ההתקדמות שלהם בלימודי מדעי המחשב." email_exists: "כבר קיים משתמש עם כתובת דואר אלקטרוני זו." @@ -1038,7 +1037,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", organization_label: "מוסד לימודים" school_name: "שם מוסד הלימודים" city: "עיר" - state: """מדינה (אם בארה"ב)""" + state: "מדינה (אם בארה\"ב)" country: "ארץ" num_students_help: "עם כמה תלמידים, לדעתכם, אתם צפויים להשתמש ב-CodeCombat?" num_students_default: "בחרו טווח" @@ -1066,7 +1065,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", create_account_subtitle: "קבלו גישה לכלים המיועדים למורים בלבד, לצורך השימוש ב-CodeCombat בכיתה. הקימו כיתה, הוסיפו תלמידים, ועקבו אחר ההתקדמות שלהם!" convert_account_title: "עדכון לחשבון מורה" not: "לא" - + versions: save_version_title: "שמור גרסה חדשה" new_major_version: "גרסה ראשית חדשה" @@ -1076,7 +1075,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", cla_suffix: "." cla_agree: "אני מסכים" owner_approve: "על אחד האחראים לאשר זאת לפני שהשינויים שלך יהיו גלויים." - + contact: contact_us: "צרו קשר עם CodeCombat" welcome: "אנו שמחים לשמוע מכם! השתמשו בטופס זה כדי לשלוח לנו הודעה בדואר אלקטרוני. " @@ -1092,7 +1091,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", screenshot_included: "צילום מסך מצורף." where_reply: "היכן כדאי לנו להשיב?" send: "שלח משוב" - + account_settings: title: "הגדרות חשבון" not_logged_in: "כדי לשנות את ההגדרות, התחברו או צרו חשבון." @@ -1134,7 +1133,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", saved: "השינויים נשמרו" password_mismatch: "הסיסמה אינה תואמת." password_repeat: "נא להזין שוב את סיסמתכם." - + keyboard_shortcuts: keyboard_shortcuts: "קיצורי מקשים" space: "Space" @@ -1155,7 +1154,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", toggle_pathfinding: "שינוי מצב של פריסת מציאת מסלול." beautify: "כתבו קוד אלגנטי יותר באמצעות עיצוב מתוקנן." maximize_editor: "הגדלה/כיווץ של עורך הקוד." - + community: main_title: "קהילת CodeCombat" introduction: "בואו ללמוד להלן כיצד תוכלו לקחת חלק וכדי להחליט מה נשמע הכי כיף לכם. אנו מצפים לעבוד אתכם!" @@ -1169,12 +1168,12 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", social_github: "בואו לעיין בכל הקוד שלנו ב-GitHub" social_blog: "קראו את הבלוג של CodeCombat ב-Sett" social_discource: "הצטרפו לדיון בפורום ה-Discourse שלנו" - social_facebook: """תנו ל-CodeCombat "לייק" ב-Facebook""" + social_facebook: "תנו ל-CodeCombat \"לייק\" ב-Facebook" social_twitter: "עקבו אחרי CodeCombat ב-Twitter" social_gplus: "הצטרפו ל-CodeCombat ב-Google+‎" social_slack: "שוחחו עמנו בצ'אט בערוץ ה-Slack הציבורי של CodeCombat" contribute_to_the_project: "תרמו לפרויקט" - + clans: clan: "שבט" clans: "שבטים" @@ -1233,18 +1232,18 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", track_concepts7: "נדרשת הזמנה" track_concepts8: "כדי להצטרף" private_require_sub: "נדרש מנוי כדי ליצור שבטים פרטיים או להצטרף אליהם." - + courses: create_new_class: "יצירת כיתה חדשה" unnamed_class: "כיתה ללא שם" edit_settings1: "עריכת הגדרות כיתה" add_students: "הוסף תלמידים" stats: "סטטיסטיקה" - total_students: """סה"כ תלמידים:""" + total_students: "סה\"כ תלמידים:" average_time: "זמן משחק ממוצע בשלב:" - total_time: """סה"כ זמן משחק:""" + total_time: "סה\"כ זמן משחק:" average_levels: "שלבים שהושלמו בממוצע:" - total_levels: """סה"כ שלבים שהושלמו:""" + total_levels: "סה\"כ שלבים שהושלמו:" students: "תלמידים" concepts: "עקרונות" play_time: "זמן משחק:" @@ -1252,7 +1251,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", enter_emails: "יש להפריד בין כתובות דואר אלקטרוני באמצעות מעבר שורה או פסיק" send_invites: "הזמן תלמידים" number_programming_students: "מספר תלמידי התכנות" - number_total_students: 'סה"כ תלמידים בבית הספר/מחוז' + number_total_students: "סה\"כ תלמידים בבית הספר/מחוז" enroll: "הרשמה" enroll_paid: "הרשמת תלמידים בקורסים בתשלום" get_enrollments: "קבל רישיונות נוספים" @@ -1384,12 +1383,12 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", web_dev_language_transition: "עבור קורס זה, כל הכיתות מתכנתות ב-HTML/JavaScript. כיתות שכבר משתמשות ב-Python יתחילו עם כמה שלבי מבוא נוספים ב-JavaScript כדי להקל על המעבר. כיתות שכבר משתמשות ב-JavaScript ידלגו על שלבי המבוא." course_membership_required_to_play: "כדי לשחק בשלב זה, יש להצטרף לקורס." license_required_to_play: "בקשו מהמורה להקצות לכם רישיון, כדי שתוכלו להמשיך ולשחק ב-CodeCombat!" - + project_gallery: no_projects_published: "פרסמו פרויקט בקורס זה לפני כולם!" view_project: "הצג פרויקט" edit_project: "עריכת פרויקט" - + teacher: assigning_course: "מקצה קורס" course_solution: "פתרון קורס" @@ -1422,9 +1421,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", create_new_class: "יצירת כיתה חדשה" class_overview: "סקירת כיתה כללית" # View Class page avg_playtime: "זמן משחק ממוצע בשלב" - total_playtime: """סה"כ זמן משחק""" + total_playtime: "סה\"כ זמן משחק" avg_completed: "שלבים שהושלמו בממוצע" - total_completed: """סה"כ שלבים שהושלמו""" + total_completed: "סה\"כ שלבים שהושלמו" created: "נוצר" concepts_covered: "עקרונות לכיסוי" earliest_incomplete: "השלב המוקדם ביותר שלא הושלם" @@ -1595,9 +1594,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", starter_license: "רישיון למתחילים" trial: "ניסיון" hoc_welcome: "שבוע לימוד-מדעי-המחשב שמח" - hoc_intro: 'לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב"שעת הקוד" עם CodeCombat' + hoc_intro: "לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב\"שעת הקוד\" עם CodeCombat" hoc_self_led: "משחק בהנחיה עצמית" - hoc_self_led_desc: 'לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב"שעת הקוד" עם CodeCombat' + hoc_self_led_desc: "לרשות הכיתה שלכם זמינות שלוש דרכים להשתתפות ב\"שעת הקוד\" עם CodeCombat" hoc_game_dev: "פיתוח משחקים" hoc_and: "וכן" hoc_programming: "תכנות ב-JavaScript/Python" @@ -1653,7 +1652,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", teacher_quest_less: "לראות פחות מסעות" refresh_to_update: "(רעננו את הדף כדי לראות עדכונים)" view_project_gallery: "הצג גלריית פרויקט" - + share_licenses: share_licenses: "שיתוף רישיונות" shared_by: "משותף על-ידי:" @@ -1669,7 +1668,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", one_license_used: "(רישיון אחד בשימוש)" licenses_used: "(__licensesUsed__ רישיונות בשימוש)" more_info: "מידע נוסף" - + sharing: game: "משחק" webpage: "דף אינטרנט" @@ -1686,10 +1685,10 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", victory_course_share_web: "לצפות בדף האינטרנט" victory_course_share_suffix: "שיצרתם כעת." copy_url: "העתק כתובת URL" - + game_dev: creator: "יוצר" - + web_dev: image_gallery_title: "גלריית תמונות" select_an_image: "בחרו את התמונה שבה תרצו להשתמש" @@ -1704,7 +1703,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", copy: "העתק" paste: "הדבק" back_to_editing: "בחזרה לעריכה" - + classes: archmage_title: "קוסם-על" archmage_title_description: "(מקודד)" @@ -1725,7 +1724,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", ambassador_title_description: "(תמיכה)" ambassador_summary: "רסנו את משתמשי הפורום שלנו, וספקו הכוונה עבור אלה שיש להם שאלות. השגרירים שלנו מייצגים את CodeCombat מול העולם." teacher_title: "מורה" - + editor: main_title: "עורכי CodeCombat" article_title: "עורך מאמרים" @@ -1811,14 +1810,14 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", clear_storage: "נקו שינויים מקומיים שלכם" add_system_title: "הוספת מערכות לשלב" done_adding: "ההוספה הסתיימה" - + article: edit_btn_preview: "תצוגה מקדימה" edit_article_title: "עריכת מאמר" - + polls: priority: "עדיפות" - + contribute: page_title: "תרומה" intro_blurb: "CodeCombat בנוי מ-100% קוד פתוח! מאות שחקנים מסורים כבר עזרו לנו להביא את המשחק לרמתו הנוכחית. הצטרפו אלינו, כדי לכתוב את הפרק הבא במסע של CodeCombat ללמד את העולם איך לקודד!" @@ -1831,7 +1830,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", archmage_attribute_2: "ניסיון מסוים בתכנות ויזמה אישית. אנו נעזור לכם בהכוונה הראשונית, אך לא נוכל להקדיש זמן רב בהכשרתכם." how_to_join: "כיצד להצטרף" join_desc_1: "כל אחד יכול לעזור! בואו לראות את ה-" - join_desc_2: """שלנו "כדי להתחיל, וסמנו את התיבה למטה כדי לסמן את עצמכם בתור קוסמי-על אמיצים ולקבל בדואר אלקטרוני חדשות עדכניות. רוצים לשוחח בצ'אט על מה שכדאי לעשות כעת או כדי להיות יותר מעורבים?""" + join_desc_2: "שלנו \"כדי להתחיל, וסמנו את התיבה למטה כדי לסמן את עצמכם בתור קוסמי-על אמיצים ולקבל בדואר אלקטרוני חדשות עדכניות. רוצים לשוחח בצ'אט על מה שכדאי לעשות כעת או כדי להיות יותר מעורבים?" join_desc_3: ", או חפשו אותנו ב" join_desc_4: "ואנו נתקדם משם!" join_url_email: "כתבו לנו בדואר אלקטרוני" @@ -1887,7 +1886,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", brave_adventurers: "ההרפתקנים האמיצים:" translating_diplomats: "הדיפלומטים המתרגמים:" helpful_ambassadors: "השגרירים המועילים:" - + ladder: my_matches: "המשחקים שלי" simulate: "הדמיה" @@ -1946,12 +1945,12 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", rules: "כללים" winners: "הזוכים" league: "ליגה" - red_ai: "CPU אדום" # "AI אדום ניצח", at end of multiplayer match playback + red_ai: "CPU אדום" # "Red AI Wins", at end of multiplayer match playback blue_ai: "CPU כחול" - wins: "ניצח" # At end of multiplayer match playback - humans: "אדום" # Ladder page display team name + wins: "ניצח" # At end of multiplayer match playback + humans: "אדום" # Ladder page display team name ogres: "כחול" - + user: stats: "סטטיסטיקה" singleplayer_title: "שלבים לשחקן יחיד" @@ -1967,7 +1966,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", favorite_prefix: "השפה המועדפת היא " favorite_postfix: "." not_member_of_clans: "עדיין לא חבר בשום שבטים." - + achievements: last_earned: "הושג לאחרונה" amount_achieved: "כמות" @@ -1979,7 +1978,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", left_xp_prefix: "" left_xp_infix: " עד דרגה " left_xp_postfix: "" - + account: payments: "תשלומים" prepaid_codes: "קודים בתשלום מראש" @@ -2007,7 +2006,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", verifying_email: "מאמת כתובת דואר אלקטרוני..." successfully_verified: "וידאתם בהצלחה את כתובת הדואר האלקטרוני!" verify_error: "אירעה בעיה כלשהי בעת אימות כתובת הדואר האלקטרוני :(" - + account_invoices: amount: "סכום ב-USD" declined: "הכרטיס נדחה" @@ -2017,7 +2016,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", purchasing: "מבצע רכישה..." retrying: "אירעה שגיאה בשרת, מנסה שוב." success: "התשלום בוצע בהצלחה. תודה!" - + account_prepaid: purchase_code: "רכישת קוד מנוי" purchase_code1: "ניתן לממש קודי מנוי כדי להוסיף זמן מנוי פרימיום לחשבון אחד או יותר עבור הגרסה הביתית של CodeCombat." # @@ -2027,7 +2026,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", purchase_code5: "למידע נוסף על רישיונות תלמיד, נא לפנות אל" users: "משתמשים" months: "חודשים" - purchase_total: 'סה"כ' + purchase_total: "סה\"כ" purchase_button: "שלח רכישה" your_codes: "הקודים שלכם" redeem_codes: "מימוש קוד מנוי" @@ -2041,7 +2040,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", you_can1: "באפשרותך" you_can2: "לרכוש קוד בתשלום מראש" you_can3: "אשר ניתן להחיל על חשבונך או לתת למשתמשים אחרים." - + loading_error: could_not_load: "אירעה שגיאה בטעינה מהשרת" connection_failure: "ההתחברות נכשלה" @@ -2061,7 +2060,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", unknown: "שגיאה לא ידועה" error: "שגיאה" general_desc: "משהו השתבש, וזה כנראה באשמתנו. נסו להמתין מעט ולאחר מכן לרענן את הדף. לחלופין, בקרו באחד הקישורים שלהלן כדי לחזור לתכנות!" - + resources: level: "שלב" patch: "תיקון" @@ -2072,7 +2071,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", components: "רכיבים" hero: "גיבור" campaigns: "מערכות" - + concepts: advanced_css_rules: "כללי CSS מתקדמים" advanced_css_selectors: "בוררי CSS מתקדמים" @@ -2163,7 +2162,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", while_loops_simple: "לולאות 'כל עוד'" while_loops_nested: "לולאות 'כל עוד' מקוננות" xy_coordinates: "קואורדינטות קרטזיות" - advanced_strings: "מחרוזות מתקדמות" # Rest of concepts are deprecated + advanced_strings: "מחרוזות מתקדמות" # Rest of concepts are deprecated algorithms: "אלגוריתמים" boolean_logic: "לוגיקה בוליאנית" basic_html: "HTML בסיסי" @@ -2187,7 +2186,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", basic_javascript: "JavaScript בסיסי" basic_event_handling: "טיפול בסיסי באירועים" create_sharable_interactive_web_page: "יצירת דף אינטרנט אינטראקטיבי שניתן לשתף" - + delta: added: "נוסף" modified: "השתנה" @@ -2197,7 +2196,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", text_diff: "הבדל טקסט" merge_conflict_with: "מזג התנגשות עם" no_changes: "ללא שינויים" - + legal: page_title: "משפטי" opensource_intro: "CodeCombat בנוי כולו מקוד פתוח." @@ -2253,9 +2252,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", canonical: "הגרסה באנגלית של מסמך זה היא הגרסה הקובעת והקנונית. במקרה של אי התאמות כלשהן בין התרגומים, יגבר המסמך באנגלית." third_party_title: "שירותי צד שלישי" third_party_description: "CodeCombat משתמש בשירותי הצד השלישי שלהלן (בין השאר):" - + ladder_prizes: - title: "פרסי טורניר" # This section was for an old tournament and doesn't need new translations now. + title: "פרסי טורניר" # This section was for an old tournament and doesn't need new translations now. blurb_1: "פרסים אלה יוענקו לפי" blurb_2: "חוקי הטורניר" blurb_3: "לשחקנים האנושיים והענקיים המובילים." @@ -2273,7 +2272,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", one_month_discount: "30% הנחה: בחרו Rails או HTML" license: "רישיון" oreilly: "ספר אלקטרוני לבחירתכם" - + calendar: year: "שנה" day: "יום" @@ -2290,18 +2289,18 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", october: "אוקטובר" november: "נובמבר" december: "דצמבר" - + code_play_create_account_modal: - title: "הצלחתם!" # This section is only needed in US, UK, Mexico, India, and Germany + title: "הצלחתם!" # This section is only needed in US, UK, Mexico, India, and Germany body: "כעת תוכלו לצאת לדרך להפיכה לאשפי קידוד. הירשמו כדי לקבל 100 אבני חן נוספות, ותזכו גם בהזדמנות לזכות ב-$2,500 ובפרסים נוספים של Lenovo." sign_up: "הירשמו והמשיכו לקודד ▶" victory_sign_up_poke: "צרו חשבון בחינם כדי לשמור את הקוד שלכם, וקבלו הזדמנות לזכות בפרסים!" victory_sign_up: "הירשמו כדי לקבל הזדמנות לזכות ב-$2,500" - + server_error: - email_taken: 'כתובת הדואר האלקטרוני תפוסה' - username_taken: 'שם המשתמש כבר תפוס' - + email_taken: "כתובת הדואר האלקטרוני תפוסה" + username_taken: "שם המשתמש כבר תפוס" + esper: line_no: "שורה $1: " x_not_a_function: "'$1' אינו פונקציה" diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee index 18e3888f246..57bd3da2c47 100644 --- a/app/locale/hi.coffee +++ b/app/locale/hi.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/hr.coffee b/app/locale/hr.coffee index e6f24b83a39..cb0239ad119 100644 --- a/app/locale/hr.coffee +++ b/app/locale/hr.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee index e776657e4f5..dc3c36cfe48 100644 --- a/app/locale/hu.coffee +++ b/app/locale/hu.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t auth_tab: "Iratkozz fel!" inventory_caption: "Szereld fel a hősöd!" choose_hero_caption: "Válassz hős, nyelvet." - save_load_caption: "... and view history" options_caption: "Beállítások módosítása" guide_caption: "Jegyzőkönyv és tippek" multiplayer_caption: "Játssz a barátaiddal!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Élesítsd képességeid CodeCombat feliratkozással!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t sale_button: "Értékesítőinkkel!" sale_button_title: "1 éves előfizetés vásárlása esetén 21 dollárt spórolhatsz" stripe_description: "Havi előfizetés" - stripe_description_year_sale: "1 éves előfizetés ({{discount}} USD kedvezmény)" # buy_now: "Buy Now" subscription_required_to_play: "Ehhez a szinthez elő kell fizetnek." unlock_help_videos: "Végy előfizetést, hogy feloldd az összes videó oktatóanyagot." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t select_all: "Összes kiválasztása" # project: "Project" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" # view_arena_ladder: "View Arena Ladder" # resource_hub: "Resource Hub" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/id.coffee b/app/locale/id.coffee index 6099595d63a..80b903a2d53 100644 --- a/app/locale/id.coffee +++ b/app/locale/id.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/it.coffee b/app/locale/it.coffee index d0f2c66c37d..dba88436cef 100644 --- a/app/locale/it.coffee +++ b/app/locale/it.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t auth_tab: "Registrati" inventory_caption: "Equipaggia l'eroe" choose_hero_caption: "Scegli eroe, lingua" - save_load_caption: "... e vedi lo storico" options_caption: "Configura" guide_caption: "Documenti e suggerimenti" multiplayer_caption: "Gioca con i tuoi amici!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Aumenta le tue competenze con un abbonamento a CodeCombat!" # {change} premium_pricing_prefix: "Ottieni Premium per solo" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t sale_button: "Saldi!" sale_button_title: "Risparmi il ${{discount}} quando compri l'abbonamento per 1 anno" # {change} stripe_description: "Sottoscrizione mensile" - stripe_description_year_sale: "Abbonamneto annuale (sconto ${{discount}})" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Devi essere abbonato per giocare su questo livello." unlock_help_videos: "Abbonati per accedere a tutti i tutorial video." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index c7d36a8e730..f09119298dc 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", auth_tab: "登録する" inventory_caption: "ヒーローの装備を選ぶ" choose_hero_caption: "ヒーロー、言語と" - save_load_caption: "...視聴履歴を選択する" options_caption: "設定を行う" guide_caption: "ガイドとヒント" multiplayer_caption: "友達とプレイ!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", prompt_body: "プレイを続けてさらに稼ごう!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombatプレミアム" comparison_blurb: "CodeCombatへ課金してスキルを磨きましょう!" # {change} premium_pricing_prefix: "プレミアムにするだけで" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/kk.coffee b/app/locale/kk.coffee index a3f9272190c..2b74a293c11 100644 --- a/app/locale/kk.coffee +++ b/app/locale/kk.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index cbf77249678..f67f7a49ec0 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t auth_tab: "가입하기" inventory_caption: "장비 장착" choose_hero_caption: "영웅 및 언어 선택 " - save_load_caption: "... 그리고 기록보기" options_caption: "설정들을 바꾸기" guide_caption: "문서들과 팁들" multiplayer_caption: "친구들과 플레이 하세요!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "코드컴뱃을 구독하셔서 당신의 스킬을 날카롭게하십시오!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t sale_button: "판매!" sale_button_title: "1년 구독권을 구매하면 $21가 절약됩니다." stripe_description: "월간 구독" - stripe_description_year_sale: "1 년 구독시 (${{discount}} 할인)" # buy_now: "Buy Now" subscription_required_to_play: "당신은 아마 이 레벨을 플레이하려면 구독이 필요합니다." unlock_help_videos: "모든 비디오 튜토리얼의 잠금을 해제하려면 구독 ." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee index fc8ec4ccd80..2d49a05f3ab 100644 --- a/app/locale/lt.coffee +++ b/app/locale/lt.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith auth_tab: "Registruotis" inventory_caption: "Parenk savo herojų" choose_hero_caption: "Pasirink herijų, kalbo" - save_load_caption: "... ir peržiūrėk istoriją" options_caption: "Konfigūruoti nustatymus" guide_caption: "Dokumentai ir patarimai" multiplayer_caption: "Žaisk su draugais!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Pagerink savo įgudžius su CodeCombat prenumerata!" # {change} premium_pricing_prefix: "Gauk Premium tik už" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/mi.coffee b/app/locale/mi.coffee index 22055d425b6..64e7d60e7dc 100644 --- a/app/locale/mi.coffee +++ b/app/locale/mi.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/mk-MK.coffee b/app/locale/mk-MK.coffee index 578f65a97cf..ac51524c032 100644 --- a/app/locale/mk-MK.coffee +++ b/app/locale/mk-MK.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Македонски", englishDescription: auth_tab: "Направи сметка" inventory_caption: "Опреми го твојот херој" choose_hero_caption: "Избери херој, јазик" - save_load_caption: "... и види историја" options_caption: "Промени подесувања" guide_caption: "Документи и совети" multiplayer_caption: "Играј со пријатели!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Македонски", englishDescription: # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Македонски", englishDescription: # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" stripe_description: "Месечна членарина" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" subscription_required_to_play: "Треба да бидеш зачленет за да го играш ова ниво." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Македонски", englishDescription: # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Македонски", englishDescription: # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee index 0151c6cc8c9..c5c0db6dbfe 100644 --- a/app/locale/ms.coffee +++ b/app/locale/ms.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/my.coffee b/app/locale/my.coffee index 04bf1d4ced4..26b06570266 100644 --- a/app/locale/my.coffee +++ b/app/locale/my.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee index 7deb55cf52d..47ae597aeda 100644 --- a/app/locale/nb.coffee +++ b/app/locale/nb.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg auth_tab: "Lag konto" inventory_caption: "Utstyr helten din" choose_hero_caption: "Velg helt og språk" - save_load_caption: "... og se historikk" options_caption: "Velg innstillinger" guide_caption: "Dokumentasjon og tips" multiplayer_caption: "Spill med venner" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Spiss dine kunnskaper med et CodeCombat abonnement!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg sale_button: "Tilbud!" sale_button_title: "Spar $21 når du kjøper 1 års abonnent" stripe_description: "Månedlig abonnement" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" subscription_required_to_play: "Du trenger abonnement for å spille dette nivået." unlock_help_videos: "Abonnér for å låse opp alle videoveiledningene." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee index c6851563a36..b44c328643e 100644 --- a/app/locale/nl-BE.coffee +++ b/app/locale/nl-BE.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Verbeter je vaardigheden met een abonement op CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: sale_button: "Koopje!" sale_button_title: "Bespaar ${{discount}} bij aankoop van een 1-jaars abonnement" # {change} # stripe_description: "Monthly Subscription" - stripe_description_year_sale: "1-jarig abonnement (${{discount}} korting)" # {change} # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee index 6d467e96682..e4c65fde265 100644 --- a/app/locale/nl-NL.coffee +++ b/app/locale/nl-NL.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index 16cd8703964..050b3070fbd 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t auth_tab: "Inschrijven" inventory_caption: "Kies de uitrusting van je held" choose_hero_caption: "Kies held, taal" - save_load_caption: "... en bekijk de geschiedenis" options_caption: "Instellingen" guide_caption: "Documenten en tips" multiplayer_caption: "Speel met vrienden!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Verbeter je vaardigheden met een abonnement op CodeCombat!" # {change} premium_pricing_prefix: "Neem Premium voor maar" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t sale_button: "Koop" sale_button_title: "Bespaar €{{discount}} bij aankoop van een 1-jarig abonnement" # {change} stripe_description: "Maandelijks abonnement" - stripe_description_year_sale: "1-jarig abonnement (€{{discount}} korting)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Je hebt een abonnement nodig om dit level te spelen." unlock_help_videos: "Abonneer om toegang te krijgen tot alle instructievideos." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t hero_blurb_1: "Krijg toegang tot __premiumHeroesCount__ supersterke helden, alleen voor abonnees! Gebruik de epische kracht van Okar Stompfoot, de dodelijke precisie van Naria of the Leaf, of roep \"schattige\" skeletten op met Nalfar Cryptor." hero_blurb_2: "Premium helden hebben ongelofelijke vecht skills zoals Warcry, Stomp, en Hurl Enemy. Of, speel als Ranger met pijl en boog, werpmessen en vallen! Test je vaardigheden als echte codeermeester en gebruik een arsenaal vam Primordial, Necromantic og Elemental magie!" hero_caption: "Spannende nieuwe helden!" - pet_blurb_1: "Huisdieren zijn niet alleen schattige maatjes, ze hebben ook unieke functies en methoden. De Baby Griffin kan over obstakels heen vliegen om de held te helpen, de Wolf Pup kan potions halen en de Cougar kan praten!" + pet_blurb_1: "Huisdieren zijn niet alleen schattige maatjes, ze hebben ook unieke functies en methoden. De Baby Griffin kan over obstakels heen vliegen om de held te helpen, de Wolf Pup kan potions halen en de Cougar kan praten!" # {change} pet_blurb_2: "Verzamel alle huisdieren om hun unieke vaardigheden te ontdekken!" pet_caption: "Adopteer huisdieren om je held gezelschap te houden!" game_dev_blurb: "Leer games programmeren en bouw nieuwe levels om met je vrienden te delen! Plaats de items die je wil, schrijf code voor het gedrag van verschillende units en kijk of je vrienden je level kunnen verslaan!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t select_all: "Selecteer Alles" project: "Project" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "Bekijk Arena Stand" resource_hub: "Hulpmiddelen" diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee index 13a43abe911..440623fd58e 100644 --- a/app/locale/nn.coffee +++ b/app/locale/nn.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee index dfaa6b2f35f..693a04684e0 100644 --- a/app/locale/pl.coffee +++ b/app/locale/pl.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran auth_tab: "Zarejestruj się" inventory_caption: "Wyposaż swojego bohatera" choose_hero_caption: "Wybierz bohatera, język" - save_load_caption: "... i przejrzyj historię" options_caption: "Ustaw opcje" guide_caption: "Dokumenty i wskazówki" multiplayer_caption: "Graj ze znajomymi!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran prompt_body: "Graj dalej, a zdobędziesz ich więcej!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Zostań mistrzem kodowania - zapisz się do Premium już dziś!" premium_pricing_prefix: "Zdobądź Premium za jedyne" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran sale_button: "Wyprzedaż!" sale_button_title: "Zaoszczędź $21 kupując roczną subskrypcję" stripe_description: "Miesięczna subskrypcja" - stripe_description_year_sale: "Roczna subskrypcja (zniżka ${{discount}})" # buy_now: "Buy Now" subscription_required_to_play: "Żeby zagrać w ten poziom musisz posiadać subskrypcję." unlock_help_videos: "Subskrybuj, aby odblokować wszystkie wideo tutoriale." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran hero_blurb_1: "Zdobędziesz dostęp do __premiumHeroesCount__ super wypasionych, nowych bohaterów! Ujarzmij nieograniczoną moc Okara Tupistopy, zabójczą precyzję Narii Liść, albo wezwij \"urocze\" szkielety wraz z Nalfarem Cryptorem." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" hero_caption: "Nowi ekscytujący bohaterowie!" - pet_blurb_1: "Zwierzaki nie są tylko uroczymi towarzyszami, zapewniają także unikatowe umiejętności. Mały Gryf może przelatywać nad przeszkodami pomoagając bohaterowi, Szczenię Wilka umie przynosić lekarstwa, a Puma potrafi mówić!" + pet_blurb_1: "Zwierzaki nie są tylko uroczymi towarzyszami, zapewniają także unikatowe umiejętności. Mały Gryf może przelatywać nad przeszkodami pomoagając bohaterowi, Szczenię Wilka umie przynosić lekarstwa, a Puma potrafi mówić!" # {change} pet_blurb_2: "Zbierz wszystkie zwierzaki i poznaj ich unikalne zdolności!" pet_caption: "Przygarnij zwierzaka do towarzystwa!" game_dev_blurb: "Naucz się pisania gier i stwórz poziomy, którymi później możesz podzielić się ze znajomymi! Umieszczaj jakie chcesz przedmioty, pisz kod, który odpowiedzialny będzie za zachowanie się przeciwników i sprawdź, czy twoim kolegom uda się pokonać twój poziom" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran select_all: "Wybierz wszystko" project: "Project" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "Pokaż drabinkę areny" resource_hub: "Baza wiedzy" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." wd2: "Tworzenie stron 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" wd2_quizlet_worksheet_instructions: "Pokaż instrukcje i przykłady" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 215c7899227..7b49620e381 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " auth_tab: "Registrar" inventory_caption: "Equipar seu herói" choose_hero_caption: "Escolha seu herói, e linguagem" - save_load_caption: "... e visualizar o histórico" options_caption: "Configurar preferências" guide_caption: "Documentos e Dicas" multiplayer_caption: "Jogue com seus amigos!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Afine suas habilidades com uma assinatura CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " sale_button: "Venda!" sale_button_title: "Economize ${{discount}} quando você adquirir a assinatura de 1 ano" # {change} stripe_description: "Inscrição Mensal" - stripe_description_year_sale: "Assinatura de 1 Ano (${{discount}} de desconto" # {change} buy_now: "Compre Agora" subscription_required_to_play: "Você precisará se inscrever para jogar este nível." unlock_help_videos: "Inscreva-se para desbloquear todos os vídeos tutoriais." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 0897c4791d4..96dd056b44d 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: auth_tab: "Regista-te" inventory_caption: "Equipa o teu herói" choose_hero_caption: "Escolhe o herói, a linguagem" - save_load_caption: "... e vê o histórico" options_caption: "Configura as definições" guide_caption: "Documentos e dicas" multiplayer_caption: "Joga com amigos!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat 'Premium'" comparison_blurb: "Torna-te um Programador Mestre - subscreve-te ao 'Premium' hoje!" premium_pricing_prefix: "Obtém 'Premium' por apenas" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: sale_button: "Promoção!" sale_button_title: "Poupa ${{discount}} ao comprares uma subscrição anual" stripe_description: "Subscrição Mensal" - stripe_description_year_sale: "Subscrição Anual (${{discount}} desconto)" buy_now: "Comprar Agora" subscription_required_to_play: "Precisas de uma subscrição para jogares este nível." unlock_help_videos: "Subscreve-te para desbloqueares todos os tutoriais em vídeo." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: select_all: "Selecionar Todos" project: "Projeto" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" # view_arena_ladder: "View Arena Ladder" resource_hub: "Centro de Recursos" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee index 937c275fe11..9683fce1d6e 100644 --- a/app/locale/ro.coffee +++ b/app/locale/ro.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman auth_tab: "Înscriete" inventory_caption: "Echipeazăți Eroul" choose_hero_caption: "Alege Eroul, limbajul" - save_load_caption: "... și vezi istoricul" options_caption: "Configurarea setărilor" guide_caption: "Documentație si sfaturi" multiplayer_caption: "Joaca cu prieteni!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Îmbunătățeșteți abilitățile cu abonamentul CodeCombat" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" stripe_description: "Abonament Lunar" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" subscription_required_to_play: "Ai nevoie de abonament ca să joci acest nivel." unlock_help_videos: "Abonează-te pentru deblocarea tuturor tutorialelor video." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index e4ece51e5f9..a5da4e04ba0 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi auth_tab: "Зарегистрироваться" inventory_caption: "Одень своего героя" choose_hero_caption: "Выбери героя, язык" - save_load_caption: "... и посмотри историю" options_caption: "Выбор настроек" guide_caption: "Документы и советы" multiplayer_caption: "Играй с друзьями!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Премиум" comparison_blurb: "Стань мастером програмирования - подпишись на Премиум сегодня!" premium_pricing_prefix: "Получите Премиум всего лишь за" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi sale_button: "Распродажа!" sale_button_title: "Сэкономьте ${{discount}} при приобретении годовой подписки" # {change} stripe_description: "Месячная подписка" - stripe_description_year_sale: "Годовая подписка (${{discount}} скидка)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "Чтобы пройти этот уровень, нужна подписка." unlock_help_videos: "Подпишитесь, чтобы разблокировать все обучающие видео." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" hero_caption: "Новые захватывающие герои!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi select_all: "Выбрать всё" project: "Проект" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" # view_arena_ladder: "View Arena Ladder" # resource_hub: "Resource Hub" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." wd2: "Веб-разработка 2" wd2_jquery_syntax: "Руководство по синтаксису функций jQuery" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee index 2a2b8c71cbd..b3de501284d 100644 --- a/app/locale/sk.coffee +++ b/app/locale/sk.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", auth_tab: "Registruj sa" inventory_caption: "Vystroj svojho hrdinu" choose_hero_caption: "Zvoľ hrdinu,jazyk" - save_load_caption: "... a zobraz históriu" options_caption: "Uprav nastavenia" guide_caption: "Dokumenty a tipy" multiplayer_caption: "Hraj s priateľmi!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Uč sa dôkladnejšie vďaka predplatnému !" # {change} premium_pricing_prefix: "Získaj verziu Premium iba za" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", sale_button: "Kúp!" sale_button_title: "Objednaj si ročné predplatné a ušetri 21$" stripe_description: "Mesačné predplatné" - stripe_description_year_sale: "Ročné predplatné (zľava ${{discount}})" # buy_now: "Buy Now" subscription_required_to_play: "Potrebuješ predplatné, ak chceš hrať túto úroveň." unlock_help_videos: "Predplať si Codecombat a získaj prístup ku videonávodom." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", hero_blurb_1: "Získaj prístup ku __premiumHeroesCount__ hrdinom, dostupným iba predplatiteľom! Spoznaj neuveriteľnú silu of Okara Duponohu, smrteľnú presnosť Listovej Narie alebo vyvolaj \"rozkošné\" kostry s Nalfarom Kryptákom." hero_blurb_2: "Schopnosti prémiových hrdinov: bojový pokrik, dupanie a hodenie nepriteľom. Môžeš hrať aj ako strelec, čo ti umožní používať luky, pušky, môžeš hádzať nožom a výbušninami. Môžeš to skúsiť aj ako mág a využívaj rôzne druhy mágie." hero_caption: "Vrušujúci noví hrdinovia!" - pet_blurb_1: "Zvieratká nepredstavujú len rozkošných spoločníkov, ale prinášajú aj unikátnu funkcionalitu a metódy. Grifko dokáže lietať ponad prekážky, vĺčatko dokáže prinášať elixíry a puma vie rozprávať!" + pet_blurb_1: "Zvieratká nepredstavujú len rozkošných spoločníkov, ale prinášajú aj unikátnu funkcionalitu a metódy. Grifko dokáže lietať ponad prekážky, vĺčatko dokáže prinášať elixíry a puma vie rozprávať!" # {change} pet_blurb_2: "Získaj všetky zvieratká a odhaľ ich jedinečné schopnosti!" pet_caption: "Adoptuj pre svojho hrdinu zvieratká!" game_dev_blurb: "Nauč sa programovať nové levely, ktoré zdieľaj so svojimi priateľmi. Vyber si predmety, ktoré potrebuješ, napíš kód a sleduj, či dokážu tvoji priatelia prejsť vytvoreným levelom." @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee index 1a158d4ab74..05796d9010e 100644 --- a/app/locale/sl.coffee +++ b/app/locale/sl.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee index 84e3950ba03..a7af74071ed 100644 --- a/app/locale/sr.coffee +++ b/app/locale/sr.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian auth_tab: "Пријави се" inventory_caption: "Опреми свог хероја" choose_hero_caption: "Изабери хероја, језик" - save_load_caption: "... и погледај историју" options_caption: "Намести подешавања" guide_caption: "Документи и савети" multiplayer_caption: "Играј с пријатељима!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat премијум" comparison_blurb: "Унапреди своје вештине са CodeCombat претплатом!" # {change} premium_pricing_prefix: "Пређи на премијум за само" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian sale_button: "Распродаја!" sale_button_title: "Уштедите $21 када купите претплату за годину дана" stripe_description: "Месечна претплата" - stripe_description_year_sale: "Годишња претплата (${{discount}} попуста)" # buy_now: "Buy Now" subscription_required_to_play: "Треба ти претплата да би играо овај ниво." unlock_help_videos: "Претплати се да откључаш све видео туторијале." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # select_all: "Select All" # project: "Project" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" # view_arena_ladder: "View Arena Ladder" # resource_hub: "Resource Hub" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee index 3f9a81f06b3..7fb13e474b3 100644 --- a/app/locale/sv.coffee +++ b/app/locale/sv.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr auth_tab: "Registrera dig" inventory_caption: "Utrusta din hjälte" choose_hero_caption: "Välj hjälte, språk" - save_load_caption: "... och visa historik" options_caption: "Konfigurera inställningar" guide_caption: "Dokument och tips" multiplayer_caption: "Spela med vänner!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/th.coffee b/app/locale/th.coffee index 253baf4bf9f..1f0b3ecc36f 100644 --- a/app/locale/th.coffee +++ b/app/locale/th.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee index 11047830e3a..11a825af369 100644 --- a/app/locale/tr.coffee +++ b/app/locale/tr.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t auth_tab: "Kaydol" inventory_caption: "Kahramanınızı donatın" choose_hero_caption: "Kahraman, dil seçin" - save_load_caption: "... ve geçmişe bak" options_caption: "Ayarları yapılandır" guide_caption: "Belgeler ve ipuçları" multiplayer_caption: "Arkadaşlarla oyna!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee index 7442767496a..e33673e1ff2 100644 --- a/app/locale/uk.coffee +++ b/app/locale/uk.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Українська", englishDescription: auth_tab: "Вийти" inventory_caption: "Екіпіруйте свого героя" choose_hero_caption: "Оберіть героя, мову" - save_load_caption: "... та перегляньте історію" options_caption: "Налаштування параметрів" guide_caption: "Документація та поради" multiplayer_caption: "Гра з друзями!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Українська", englishDescription: # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Преміум" comparison_blurb: "Стань майстром програмування - підпишись на Преміум сьогодні!" premium_pricing_prefix: "Отримайте Преміум всього за" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Українська", englishDescription: sale_button: "Розпродаж!" sale_button_title: "Збережіть {{discount}}$ при покупці абонементу на 1 рік" stripe_description: "Щомісячний абонемент" - stripe_description_year_sale: "1 рік підписки ({{discount}}$ знижка)" # buy_now: "Buy Now" subscription_required_to_play: "Аби грати в цьому рівні потрібен абонемент." unlock_help_videos: "Підпишіться, щоб відкрити усі навчальні відео." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Українська", englishDescription: # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" hero_caption: "Нові вражаючі герої!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "Українська", englishDescription: select_all: "Обрати все" project: "Проект" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "Переглянути рейтинг арени" resource_hub: "Хаб ресурсів" diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee index c4149c4645a..dee03f2883e 100644 --- a/app/locale/ur.coffee +++ b/app/locale/ur.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/uz.coffee b/app/locale/uz.coffee index ead7f53fd6b..fdda7ab650d 100644 --- a/app/locale/uz.coffee +++ b/app/locale/uz.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee index c473caf5013..d37b3d64e27 100644 --- a/app/locale/vi.coffee +++ b/app/locale/vi.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn auth_tab: "Đăng kí" inventory_caption: "Trang bị cho nhân vật của bạn" choose_hero_caption: "Chọn tướng, ngôn ngữ" - save_load_caption: "... và xem lịch sử" options_caption: "Cài đặt tùy chỉnh" guide_caption: "Tài liệu và hướng dẫn" multiplayer_caption: "Chơi với bạn!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Tăng cường kĩ năng bằng cách mua gói dịch vụ nâng cao của CodeCombat!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn sale_button: "Ưu đãi!" sale_button_title: "Tiết kiệm $21 khi mua gói dịch vụ 1 năm" stripe_description: "Gói dịch vụ tháng" - stripe_description_year_sale: "Gói dịch vụ năm (giảm giá (${{discount}})" # buy_now: "Buy Now" subscription_required_to_play: "Bạn cần mua gói dịch vụ để được chơi cấp độ này." unlock_help_videos: "Subscribe để mở tất cả các video hướng dẫn." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 1448d8b1165..7e42962236d 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese auth_tab: "注册" inventory_caption: "装备您的英雄" choose_hero_caption: "选择英雄和语言" - save_load_caption: "... 观看历史" options_caption: "确认设置" guide_caption: "文档和提示" multiplayer_caption: "与您的朋友一起玩!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "亲,订阅CodeCombat,大力的提升您的技能!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese sale_button: "促销" sale_button_title: "年费订阅能节省 ${{discount}} 的费用" stripe_description: "每月订阅" - stripe_description_year_sale: "年费订阅 (优惠 ${{discount}})" buy_now: "立即购买" subscription_required_to_play: "订阅后才可开始本关" unlock_help_videos: "订阅后才可以解锁视频教学哦!" @@ -778,7 +777,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese hero_blurb_1: "订阅后可使用 __premiumHeroesCount__ 个超级英雄,利用Okar Stompfoot不可阻挡的力量,叶之Naria的致命精度,或Nalfar Cryptor的\"可爱\"骷髅!" hero_blurb_2: "高级战士可解锁惊人的武术技能,如Warcry、Stomp和Hurl Enemy。 或者玩游侠,使用隐形和弓箭、飞刀、陷阱!尝试用你的技能作为一个真正的编码教学,释放一个强大的原力,死灵或元素魔法阵列!" hero_caption: "令人兴奋的新英雄!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" pet_blurb_2: "收集所有的宠物,发现它们独特的能力!" pet_caption: "领养宠物陪伴你的英雄!" game_dev_blurb: "学习游戏脚本并建立新的关卡,与您的朋友分享! 放置你想要的项目,编写单位逻辑和行为代码,看看你的朋友是否可以击败关卡!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese select_all: "全选" project: "项目" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "查看竞技场天梯" resource_hub: "资源中心" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee index b6bf46eeacf..0fd0a33490b 100644 --- a/app/locale/zh-HANT.coffee +++ b/app/locale/zh-HANT.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese auth_tab: "註冊" inventory_caption: "裝備您的英雄" choose_hero_caption: "選擇英雄,語言" - save_load_caption: "…觀看歷史紀錄" options_caption: "設置設定" guide_caption: "文件與小提示" multiplayer_caption: "跟朋友一起玩!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese # prompt_body: "Keep playing to earn more!" subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "訂閱 CodeCombat 來磨練您的技巧!" # {change} # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese sale_button: "促銷!" sale_button_title: "年費訂閱能節省 ${{discount}} 的費用" stripe_description: "每月訂閱" - stripe_description_year_sale: "年費訂閱 (${{discount}} 優惠)" # {change} # buy_now: "Buy Now" subscription_required_to_play: "您將需要訂閱來開啟這關。" unlock_help_videos: "訂閱後才可以解鎖教學影片喔!。" @@ -778,7 +777,7 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1510,7 +1509,7 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese select_all: "全選" project: "專案" # project_gallery: "Project Gallery" -# view_project: "View Project" # {change} +# view_project: "View Project" # unpublished: "(unpublished)" view_arena_ladder: "觀看競技場天梯" resource_hub: "Resource Hub" diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee index 4d19051f458..068502d079e 100644 --- a/app/locale/zh-WUU-HANS.coffee +++ b/app/locale/zh-WUU-HANS.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee index a65bee0f3b3..699587bf3d1 100644 --- a/app/locale/zh-WUU-HANT.coffee +++ b/app/locale/zh-WUU-HANT.coffee @@ -597,7 +597,6 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # auth_tab: "Sign Up" # inventory_caption: "Equip your hero" # choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" # options_caption: "Configure settings" # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" @@ -650,6 +649,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # prompt_body: "Keep playing to earn more!" # subscribe: +# premium_already_subscribed: "You're already subscribed to Premium!" # subscribe_modal_title: "CodeCombat Premium" # comparison_blurb: "Become a Master Coder - subscribe to Premium today!" # premium_pricing_prefix: "Get Premium for just" @@ -688,7 +688,6 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # sale_button: "Sale!" # sale_button_title: "Save $21 when you purchase a 1 year subscription" # stripe_description: "Monthly Subscription" -# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" # buy_now: "Buy Now" # subscription_required_to_play: "You'll need a subscription to play this level." # unlock_help_videos: "Subscribe to unlock all video tutorials." @@ -778,7 +777,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." # hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" # hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffin can fly over obstacles while helping the hero, the Wolf Pup can fetch potions, and the Cougar can speak!" +# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" # pet_blurb_2: "Collect all the pets to discover their unique abilities!" # pet_caption: "Adopt pets to accompany your hero!" # game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" @@ -1565,7 +1564,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # wd1_css_syntax_desc: "One-page reference for the CSS and Style syntax students will learn in Web Development 1." # wd2: "Web Development 2" # wd2_jquery_syntax: "jQuery Functions Syntax Guide" -# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in in Web Development 2." +# wd2_jquery_syntax_desc: "One-page reference for the jQuery functions students will learn in Web Development 2." # wd2_quizlet_worksheet: "Quizlet Planning Worksheet" # wd2_quizlet_worksheet_instructions: "View instructions & examples" # wd2_quizlet_worksheet_desc: "Before your students build their personality quiz project at the end of Web Development 2, they should plan out their quiz questions, outcomes and responses using this worksheet. Teachers can distribute the instructions and examples for students to refer to." From 7bafdfc7689bbc9372c27e96a5ea141a03e8ba1b Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Wed, 2 Aug 2017 15:52:19 -0700 Subject: [PATCH 008/227] Add note about flaky test --- spec/server/functional/products.spec.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/server/functional/products.spec.coffee b/spec/server/functional/products.spec.coffee index 2689cdeed9e..b7325cc2e15 100644 --- a/spec/server/functional/products.spec.coffee +++ b/spec/server/functional/products.spec.coffee @@ -8,6 +8,8 @@ libUtils = require '../../../server/lib/utils' describe 'GET /db/products', -> beforeEach utils.wrap -> + # TODO: Clear Products, to make this test not dependent on dev db + # Also, make other tests not break when you do that. yield utils.clearModels([User, Payment]) yield utils.populateProducts() @user = yield utils.initUser() From d740f387ae1250409a980fe090c448a96f59f6b0 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 1 Aug 2017 12:20:39 -0700 Subject: [PATCH 009/227] Fix flaky tests --- test/app/views/teachers/TeacherClassView.spec.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/app/views/teachers/TeacherClassView.spec.coffee b/test/app/views/teachers/TeacherClassView.spec.coffee index 142dc8c901c..63af1d12a1d 100644 --- a/test/app/views/teachers/TeacherClassView.spec.coffee +++ b/test/app/views/teachers/TeacherClassView.spec.coffee @@ -384,13 +384,15 @@ describe 'TeacherClassView', -> @view.wait('begin-assign-course').then(done) it 'adds students to the course instances', -> - request = jasmine.Ajax.requests.mostRecent() + expect(@courseInstance.fakeRequests.length).toBe(1) + request = @courseInstance.fakeRequests[0] expect(request.url).toBe("/db/course_instance/#{@courseInstance.id}/members") expect(request.method).toBe('POST') it 'shows a noty if POSTing students fails', (done) -> @notySpy.and.callFake(done) - request = jasmine.Ajax.requests.mostRecent() + expect(@courseInstance.fakeRequests.length).toBe(1) + request = @courseInstance.fakeRequests[0] request.respondWith({ status: 500, responseText: JSON.stringify({ message: "Internal Server Error" }) From e087e5788d1c187b1621cd3280d674c429e3f7f0 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Thu, 20 Jul 2017 10:36:25 -0700 Subject: [PATCH 010/227] Translate error messages in-game Add page to check error translation progress Generalize regex translation replacement Improve translation view, add exportable display option Add campaign/level chooser Improve export view, add a bunch of english strings Add method that went missing (??) Tweak UI, add toggle for hints vs error messages [WIP] handle multi-part translations more robustly Add test for error message placeholders in translation files Clean up and improve replacement and other code Clean up old debugging code Clean up more stuff Fix verifier dynamic loading, tweak matcher Add rot13 locale remove unused export Tweak interface Remove unused function Add comment, name helper functions better Don't show rot13 language to end users tweaks Reconcile redundant translation entries Tweak a translation entry Prevent erroneous file load Address CR feedback [pt 1] Address CR feedback [pt 2] Add script to generate rot13 locale, include it in propagation script Fix line number regex to capture more than one digit Add basic spec for error message translation Add some query params, include last of the hints Add multi-line translation test Allow setting user's language to rot13 manually Add per-level frequency Add some more translation variants Generate rot13 locale again --- app/core/ModuleLoader.coffee | 28 +- app/core/Router.coffee | 2 + app/core/api/campaigns.coffee | 6 + app/core/api/index.coffee | 2 + app/core/api/user-code-problems.coffee | 12 + app/locale/en.coffee | 72 +- app/locale/rot13.coffee | 2378 +++++++++++++++++ app/locale/zh-HANS.coffee | 2 +- app/schemas/languages.coffee | 2 +- .../editor/verifier/i18n-verifier-view.sass | 15 + .../editor/verifier/i18n-verifier-view.jade | 113 + app/views/core/RootView.coffee | 5 +- .../editor/verifier/i18nVerifierView.coffee | 143 + app/views/play/level/tome/Problem.coffee | 69 +- scripts/copy-i18n-tags.coffee | 5 +- scripts/generateRot13Locale.coffee | 25 + spec/server/unit/locale.spec.coffee | 33 + .../views/play/level/tome/Problem.spec.coffee | 24 + 18 files changed, 2899 insertions(+), 37 deletions(-) create mode 100644 app/core/api/campaigns.coffee create mode 100644 app/core/api/user-code-problems.coffee create mode 100644 app/locale/rot13.coffee create mode 100644 app/styles/editor/verifier/i18n-verifier-view.sass create mode 100644 app/templates/editor/verifier/i18n-verifier-view.jade create mode 100644 app/views/editor/verifier/i18nVerifierView.coffee create mode 100644 scripts/generateRot13Locale.coffee create mode 100644 spec/server/unit/locale.spec.coffee diff --git a/app/core/ModuleLoader.coffee b/app/core/ModuleLoader.coffee index 84e7ff92bda..43d55b95dfc 100644 --- a/app/core/ModuleLoader.coffee +++ b/app/core/ModuleLoader.coffee @@ -14,8 +14,9 @@ module.exports = ModuleLoader = class ModuleLoader extends CocoClass constructor: -> super() - @loaded = {} + @loaded = {} @loaded[f] = true for f in window.require.list() + @loadPromises = {} #Load the locales present in app.js locale.update() @@ -77,14 +78,23 @@ module.exports = ModuleLoader = class ModuleLoader extends CocoClass src: "/#{window.serverConfig.buildInfo.sha}#{uri}" type: createjs.LoadQueue.JAVASCRIPT }) + + resolveLoadPromise = null + loadPromise = new Promise (resolve, reject) => + resolveLoadPromise = resolve # So we can resolve it from the outside in onFileLoad + loadPromise.resolve = resolveLoadPromise + @loadPromises[path] ?= loadPromise return true - loadLanguage: (langCode='en-US') -> - loading = @load("locale/#{langCode}") + loadLanguage: (langCode='en-US') -> + @load("locale/#{langCode}") firstBit = langCode[...2] - return loading if firstBit is langCode - return loading unless locale[firstBit]? - return @load("locale/#{firstBit}", false) or loading + if (firstBit isnt langCode) and locale[firstBit]? + @load("locale/#{firstBit}", false) + return Promise.all([ + @loadPromises["locale/#{langCode}"] + @loadPromises["locale/#{firstBit}"] + ]) onFileLoad: (e) => # load dependencies if it's not a vendor library @@ -126,13 +136,14 @@ module.exports = ModuleLoader = class ModuleLoader extends CocoClass @trigger 'load-complete' @trigger 'loaded', e.item + @loadPromises[e.item.id]?.resolve(e.item) @updateProgress() updateProgress: -> return if @queue.progress < @lastShownProgress $('#module-load-progress .progress-bar').css('width', (100*@queue.progress)+'%') - if @queue.progress is 1 + if @queue.progress is 1 $('#module-load-progress').css('opacity', 0) parseDependencies: (raw) -> @@ -166,9 +177,8 @@ module.exports = ModuleLoader = class ModuleLoader extends CocoClass else parts = name.split('/') for part in parts - if part is '..' + if part is '..' results.pop() else if (part isnt '.' and part isnt '') results.push(part) return results.join('/') - diff --git a/app/core/Router.coffee b/app/core/Router.coffee index 32eabf75056..53bb1af2174 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -118,6 +118,8 @@ module.exports = class CocoRouter extends Backbone.Router 'editor/thang-tasks': go('editor/ThangTasksView') 'editor/verifier': go('editor/verifier/VerifierView') 'editor/verifier/:levelID': go('editor/verifier/VerifierView') + 'editor/i18n-verifier/:levelID': go('editor/verifier/i18nVerifierView') + 'editor/i18n-verifier': go('editor/verifier/i18nVerifierView') 'editor/course': go('editor/course/CourseSearchView') 'editor/course/:courseID': go('editor/course/CourseEditView') diff --git a/app/core/api/campaigns.coffee b/app/core/api/campaigns.coffee new file mode 100644 index 00000000000..33c3728ff7a --- /dev/null +++ b/app/core/api/campaigns.coffee @@ -0,0 +1,6 @@ +fetchJson = require './fetch-json' + +module.exports = { + getAll: (options={}) -> + fetchJson("/db/campaign", options) +} diff --git a/app/core/api/index.coffee b/app/core/api/index.coffee index 399576336c8..c6775c9ef73 100644 --- a/app/core/api/index.coffee +++ b/app/core/api/index.coffee @@ -1,5 +1,6 @@ module.exports = { admin: require('./admin') + campaigns: require('./campaigns') classrooms: require('./classrooms') courses: require('./courses') courseInstances: require('./course-instances') @@ -8,5 +9,6 @@ module.exports = { prepaids: require('./prepaids') skippedContacts: require('./skipped-contacts') trialRequests: require('./trial-requests') + userCodeProblems: require('./user-code-problems') users: require('./users') } diff --git a/app/core/api/user-code-problems.coffee b/app/core/api/user-code-problems.coffee new file mode 100644 index 00000000000..af7ca290775 --- /dev/null +++ b/app/core/api/user-code-problems.coffee @@ -0,0 +1,12 @@ +fetchJson = require './fetch-json' + +module.exports = { + # levelID required + # startDay optional + # endDay optional + getCommon: ({ levelSlug, startDay, endDay }, options={}) -> + fetchJson('/db/user.code.problem/-/common_problems', _.assign {}, options, { + method: 'POST' + json: { slug: levelSlug, startDay, endDay } + }) +} diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 309f305bdae..cadc2be65a6 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -2303,12 +2303,76 @@ esper: line_no: "Line $1: " - x_not_a_function: "`$1` is not a function" - type_error: "TypeError: " reference_error: "ReferenceError: " + argument_error: "ArgumentError: " + type_error: "TypeError: " + error: "Error: " + x_not_a_function: "$1 is not a function" + x_not_defined: "$1 is not defined" spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" capitalization_issues: "Look out for capitalization: `$1` should be `$2`." - py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." - fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" + py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." + fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." + missing_semicolon: "Missing semicolon." + missing_quotes: "Missing quotes. Try `$1`" + argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." + argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." + target_a_unit: "Target a unit." + attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" + empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." + line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" + need_a_after_while: "Need a `$1` after `$2`." + too_much_indentation: "Too much indentation at the beginning of this line." + missing_hero: "Missing `$1` keyword; should be `$2`." + takes_no_arguments: "`$1` takes no arguments." + no_one_named: "There's no one named \"$1\" to target." + separated_by_comma: "Function calls paramaters must be seperated by `,`s" + protected_property: "Can't read protected property: $1" + need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" + expected_an_identifier: "Expected an identifier and instead saw '$1'." + unexpected_identifier: "Unexpected identifier" + unexpected_end_of: "Unexpected end of input" + unnecessary_semicolon: "Unnecessary semicolon." + unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" + unexpected_token: "Unexpected token $1" + unexpected_token2: "Unexpected token" + unexpected_number: "Unexpected number" + unexpected: "Unexpected '$1'." + escape_pressed_code: "Escape pressed; code aborted." + target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." + target_an_enemy_2: "Target an enemy by name, like $1." + cannot_read_property: "Cannot read property '$1' of undefined" + attempted_to_assign: "Attempted to assign to readonly property." + unexpected_early_end: "Unexpected early end of program." + you_need_a_string: "You need a string to build; one of $1" + unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? + code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." + unclosed_string: "Unclosed string." + unmatched: "Unmatched '$1'." + error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" + indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" + indentation_error: "Indentation error." + need_a_on_the: "Need a `:` on the end of the line following `$1`." + attempt_to_call_undefined: "attempt to call '$1' (a nil value)" + unterminated: "Unterminated `$1`" + target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" + error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" + indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" + unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." + there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here + try_herofindnearestenemy: "Try `$1`" + there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." + attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." + is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" + target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" + hero_has_no_method: "`$1` has no method `$2`." + there_is_a_problem: "There is a problem with your code." + did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." + missing_a_quotation_mark: "Missing a quotation mark. " + missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." + you_do_not_have: "You do not have an item equipped with the $1 skill." + put_each_command_on: "Put each command on a separate line" + are_you_missing_a: "Are you missing a '$1' after '$2'? " + your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/rot13.coffee b/app/locale/rot13.coffee new file mode 100644 index 00000000000..c9f52852104 --- /dev/null +++ b/app/locale/rot13.coffee @@ -0,0 +1,2378 @@ +module.exports = nativeDescription: "rot13", englishDescription: "English with the letters jumbled", translation: + new_home: + slogan: "Gur zbfg ratntvat tnzr sbe yrneavat cebtenzzvat." + classroom_edition: "Pynffebbz Rqvgvba:" + learn_to_code: "Yrnea gb pbqr:" + play_now: "Cynl Abj" + im_a_teacher: "V'z n Grnpure" + im_a_student: "V'z n Fghqrag" + learn_more: "Yrnea zber" + classroom_in_a_box: "N pynffebbz va-n-obk sbe grnpuvat pbzchgre fpvrapr." + codecombat_is: "PbqrPbzong vf n cyngsbez sbe fghqragf gb yrnea pbzchgre fpvrapr juvyr cynlvat guebhtu n erny tnzr." + our_courses: "Bhe pbhefrf unir orra fcrpvsvpnyyl cynlgrfgrq gb rkpry va gur pynffebbz, rira ol grnpuref jvgu yvggyr gb ab cevbe cebtenzzvat rkcrevrapr." + top_screenshots_hint: "Fghqragf jevgr pbqr naq frr gurve punatrf hcqngr va erny-gvzr" + designed_with: "Qrfvtarq jvgu grnpuref va zvaq" + real_code: "Erny, glcrq pbqr" + from_the_first_level: "sebz gur svefg yriry" + getting_students: "Trggvat fghqragf gb glcrq pbqr nf dhvpxyl nf cbffvoyr vf pevgvpny gb yrneavat cebtenzzvat flagnk naq cebcre fgehpgher." + educator_resources: "Rqhpngbe erfbheprf" + course_guides: "naq pbhefr thvqrf" + teaching_computer_science: "Grnpuvat pbzchgre fpvrapr qbrf abg erdhver n pbfgyl qrterr, orpnhfr jr cebivqr gbbyf gb fhccbeg rqhpngbef bs nyy onpxtebhaqf." + accessible_to: "Npprffvoyr gb" + everyone: "rirelbar" + democratizing: "Qrzbpengvmvat gur cebprff bs yrneavat pbqvat vf ng gur pber bs bhe cuvybfbcul. Rirelbar fubhyq or noyr gb yrnea gb pbqr." + forgot_learning: "V guvax gurl npghnyyl sbetbg gung gurl jrer npghnyyl yrneavat fbzrguvat." + wanted_to_do: " Pbqvat vf fbzrguvat V'ir nyjnlf jnagrq gb qb, naq V arire gubhtug V jbhyq or noyr gb yrnea vg va fpubby." + why_games: "Jul vf yrneavat guebhtu tnzrf vzcbegnag?" + games_reward: "Tnzrf erjneq gur cebqhpgvir fgehttyr." + encourage: "Tnzvat vf n zrqvhz gung rapbhentrf vagrenpgvba, qvfpbirel, naq gevny-naq-reebe. N tbbq tnzr punyyratrf gur cynlre gb znfgre fxvyyf bire gvzr, juvpu vf gur fnzr pevgvpny cebprff fghqragf tb guebhtu nf gurl yrnea." + excel: "Tnzrf rkpry ng erjneqvat" + struggle: "cebqhpgvir fgehttyr" + kind_of_struggle: "gur xvaq bs fgehttyr gung erfhygf va yrneavat gung’f ratntvat naq" + motivating: "zbgvingvat" + not_tedious: "abg grqvbhf." + gaming_is_good: "Fghqvrf fhttrfg tnzvat vf tbbq sbe puvyqera’f oenvaf. (vg’f gehr!)" + game_based: "Jura tnzr-onfrq yrneavat flfgrzf ner" + compared: "pbzcnerq" + conventional: "ntnvafg pbairagvbany nffrffzrag zrgubqf, gur qvssrerapr vf pyrne: tnzrf ner orggre ng urycvat fghqragf ergnva xabjyrqtr, pbapragengr naq" + perform_at_higher_level: "cresbez ng n uvture yriry bs npuvrirzrag" + feedback: "Tnzrf nyfb cebivqr erny-gvzr srrqonpx gung nyybjf fghqragf gb nqwhfg gurve fbyhgvba cngu naq haqrefgnaq pbaprcgf zber ubyvfgvpnyyl, vafgrnq bs orvat yvzvgrq gb whfg “pbeerpg” be “vapbeerpg” nafjref." + real_game: "N erny tnzr, cynlrq jvgu erny pbqvat." + great_game: "N terng tnzr vf zber guna whfg onqtrf naq npuvrirzragf - vg’f nobhg n cynlre’f wbhearl, jryy-qrfvtarq chmmyrf, naq gur novyvgl gb gnpxyr punyyratrf jvgu ntrapl naq pbasvqrapr." + agency: "PbqrPbzong vf n tnzr gung tvirf cynlref gung ntrapl naq pbasvqrapr jvgu bhe ebohfg glcrq pbqr ratvar, juvpu urycf ortvaare naq nqinaprq fghqragf nyvxr jevgr cebcre, inyvq pbqr." + request_demo_title: "Trg lbhe fghqragf fgnegrq gbqnl!" + request_demo_subtitle: "Erdhrfg n qrzb naq trg lbhe fghqragf fgnegrq va yrff guna na ubhe." + get_started_title: "Frg hc lbhe pynff gbqnl" + get_started_subtitle: "Frg hc n pynff, nqq lbhe fghqragf, naq zbavgbe gurve cebterff nf gurl yrnea pbzchgre fpvrapr." + request_demo: "Erdhrfg n Qrzb" + setup_a_class: "Frg Hc n Pynff" + have_an_account: "Unir na nppbhag?" + logged_in_as: "Lbh ner pheeragyl ybttrq va nf" + computer_science: "Pbzchgre fpvrapr pbhefrf sbe nyy ntrf" + show_me_lesson_time: "Fubj zr yrffba gvzr rfgvzngrf sbe:" + curriculum: "Gbgny pheevphyhz ubhef:" + ffa: "Serr sbe nyy fghqragf" + lesson_time: "Yrffba gvzr:" + coming_soon: "Zber pbzvat fbba!" + courses_available_in: "Pbhefrf ner ninvynoyr va WninFpevcg naq Clguba. Jro Qrirybczrag pbhefrf hgvyvmr UGZY, PFF, wDhrel, naq Obbgfgenc." + boast: "Obnfgf evqqyrf gung ner pbzcyrk rabhtu gb snfpvangr tnzref naq pbqref nyvxr." + winning: "N jvaavat pbzovangvba bs ECT tnzrcynl naq cebtenzzvat ubzrjbex gung chyyf bss znxvat xvq-sevraqyl rqhpngvba yrtvgvzngryl rawblnoyr." + run_class:"Rirelguvat lbh arrq gb eha n pbzchgre fpvrapr pynff va lbhe fpubby gbqnl, ab PF onpxtebhaq erdhverq." + goto_classes: "Tb gb Zl Pynffrf" + view_profile: "Ivrj Zl Cebsvyr" + view_progress: "Ivrj Cebterff" + go_to_courses: "Tb gb Zl Pbhefrf" + want_coco: "Jnag PbqrPbzong ng lbhe fpubby?" + + nav: + map: "Znc" + play: "Yriryf" # Gur gbc ani one ragel jurer cynlref pubbfr juvpu yriryf gb cynl + community: "Pbzzhavgl" + courses: "Pbhefrf" + blog: "Oybt" + forum: "Sbehz" + account: "Nppbhag" + my_account: "Zl Nppbhag" + profile: "Cebsvyr" + home: "Ubzr" + contribute: "Pbagevohgr" + legal: "Yrtny" + privacy: "Cevinpl" + about: "Nobhg" + contact: "Pbagnpg" + twitter_follow: "Sbyybj" + my_classrooms: "Zl Pynffrf" + my_courses: "Zl Pbhefrf" + careers: "Pnerref" + facebook: "Snprobbx" + twitter: "Gjvggre" + create_a_class: "Perngr n Pynff" + other: "Bgure" + learn_to_code: "Yrnea gb Pbqr!" + toggle_nav: "Gbttyr anivtngvba" + jobs: "Wbof" + schools: "Fpubbyf" + get_involved: "Trg Vaibyirq" + open_source: "Bcra fbhepr (TvgUho)" + support: "Fhccbeg" + faqs: "SNDf" + help_pref: "Arrq uryc? Rznvy" + help_suff: "naq jr'yy trg va gbhpu!" + resource_hub: "Erfbhepr Uho" + + modal: + close: "Pybfr" + okay: "Bxnl" + + not_found: + page_not_found: "Cntr abg sbhaq" + + diplomat_suggestion: + title: "Uryc genafyngr PbqrPbzong!" # Guvf fubjf hc jura n cynlre fjvgpurf gb n aba-Ratyvfu ynathntr hfvat gur ynathntr fryrpgbe. + sub_heading: "Jr arrq lbhe ynathntr fxvyyf." + pitch_body: "Jr qrirybc PbqrPbzong va Ratyvfu, ohg jr nyernql unir cynlref nyy bire gur jbeyq. Znal bs gurz jnag gb cynl va {Ratyvfu} ohg qba'g fcrnx Ratyvfu, fb vs lbh pna fcrnx obgu, cyrnfr pbafvqre fvtavat hc gb or n Qvcybzng naq uryc genafyngr obgu gur PbqrPbzong jrofvgr naq nyy gur yriryf vagb {Ratyvfu}." + missing_translations: "Hagvy jr pna genafyngr rirelguvat vagb {Ratyvfu}, lbh'yy frr Ratyvfu jura {Ratyvfu} vfa'g ninvynoyr." + learn_more: "Yrnea zber nobhg orvat n Qvcybzng" + subscribe_as_diplomat: "Fhofpevor nf n Qvcybzng" + + play: + play_as: "Cynl Nf" # Ynqqre cntr + compete: "Pbzcrgr!" # Pbhefr qrgnvyf cntr + spectate: "Fcrpgngr" # Ynqqre cntr + players: "cynlref" # Ubire bire n yriry ba /cynl + hours_played: "ubhef cynlrq" # Ubire bire n yriry ba /cynl + items: "Vgrzf" # Gbbygvc ba vgrz fubc ohggba sebz /cynl + unlock: "Haybpx" # Sbe chepunfvat vgrzf naq urebrf + confirm: "Pbasvez" + owned: "Bjarq" # Sbe vgrzf lbh bja + locked: "Ybpxrq" + purchasable: "Chepunfnoyr" # Sbe n ureb lbh haybpxrq ohg unira'g chepunfrq + available: "Ninvynoyr" + skills_granted: "Fxvyyf Tenagrq" # Cebcregl qbphzragngvba qrgnvyf + heroes: "Urebrf" # Gbbygvc ba ureb fubc ohggba sebz /cynl + achievements: "Npuvrirzragf" # Gbbygvc ba npuvrirzrag yvfg ohggba sebz /cynl + settings: "Frggvatf" # Gbbygvc ba frggvatf ohggba sebz /cynl + poll: "Cbyy" # Gbbygvc ba cbyy ohggba sebz /cynl + next: "Arkg" # Tb sebz pubbfr ureb gb pubbfr vairagbel orsber cynlvat n yriry + change_hero: "Punatr Ureb" # Tb onpx sebz pubbfr vairagbel gb pubbfr ureb + buy_gems: "Ohl Trzf" + subscription_required: "Fhofpevcgvba Erdhverq" + subscribers_only: "Fhofpevoref Bayl!" + subscribe_unlock: "Fhofpevor gb Haybpx!" + subscriber_heroes: "Fhofpevor gbqnl gb vzzrqvngryl haybpx Nznen, Uhfuonhz, naq Unggbev!" + subscriber_gems: "Fhofpevor gbqnl gb chepunfr guvf ureb jvgu trzf!" + anonymous: "Nabalzbhf Cynlre" + level_difficulty: "Qvssvphygl: " + play_classroom_version: "Cynl Pynffebbz Irefvba" # Pubbfr n yriry va pnzcnvta irefvba gung lbh nyfb pna cynl va bar bs lbhe pbhefrf + campaign_beginner: "Ortvaare Pnzcnvta" + awaiting_levels_adventurer_prefix: "Jr eryrnfr arj yriryf rirel jrrx." + awaiting_levels_adventurer: "Fvta hc nf na Nqiraghere" + awaiting_levels_adventurer_suffix: "gb or gur svefg gb cynl arj yriryf." + adjust_volume: "Nqwhfg ibyhzr" + campaign_multiplayer: "Zhygvcynlre Neranf" + campaign_multiplayer_description: "... va juvpu lbh pbqr urnq-gb-urnq ntnvafg bgure cynlref." + brain_pop_done: "Lbh’ir qrsrngrq gur Bterf jvgu pbqr! Lbh jva!" + brain_pop_challenge: "Punyyratr lbhefrys gb cynl ntnva hfvat n qvssrerag cebtenzzvat ynathntr!" + replay: "Ercynl" + back_to_classroom: "Onpx gb Pynffebbz" + + code: + if: "vs" # Xrljbeqf--gurfr genafyngvbaf fubj hc ba ubire, fb cyrnfr genafyngr gurz nyy, rira vs vg'f xvaq bs ybat. (Va gur pbqr rqvgbe, gurl jvyy fgvyy or va Ratyvfu.) + else: "ryfr" + elif: "ryfr vs" + while: "juvyr" + loop: "ybbc" + for: "sbe" + break: "oernx" + continue: "pbagvahr" + pass: "cnff" + return: "erghea" + then: "gura" + do: "qb" + end: "raq" + function: "shapgvba" + def: "qrsvar" + var: "inevnoyr" + self: "frys" + hero: "ureb" + this: "guvf" + or: "be" + "||": "be" + and: "naq" + "&&": "naq" + not: "abg" + "!": "abg" + "=": "nffvta" # Sbe guvf frpgvba, pbawhtngr vg yvxr vg'f gur ireo cneg bs n fragrapr jura cbffvoyr + "==": "rdhnyf" + "===": "fgevpgyl rdhnyf" + "!=": "qbrf abg rdhny" + "!==": "qbrf abg fgevpgyl rdhny" + ">": "vf terngre guna" + ">=": "vf terngre guna be rdhny" + "<": "vf yrff guna" + "<=": "vf yrff guna be rdhny" + "*": "zhygvcyvrq ol" + "/": "qvivqrq ol" + "+": "cyhf" + "-": "zvahf" + "+=": "nqq naq nffvta" + "-=": "fhogenpg naq nffvta" + True: "Gehr" + true: "gehr" + False: "Snyfr" + false: "snyfr" + undefined: "haqrsvarq" + null: "ahyy" + nil: "avy" + None: "Abar" + + share_progress_modal: + blurb: "Lbh’er znxvat terng cebterff! Gryy lbhe cnerag ubj zhpu lbh'ir yrnearq jvgu PbqrPbzong." + email_invalid: "Rznvy nqqerff vainyvq." + form_blurb: "Ragre lbhe cnerag'f rznvy orybj naq jr’yy fubj gurz!" + form_label: "Rznvy Nqqerff" + placeholder: "rznvy nqqerff" + title: "Rkpryyrag Jbex, Ncceragvpr" + + login: + sign_up: "Perngr Nppbhag" + email_or_username: "Rznvy be hfreanzr" + log_in: "Ybt Va" + logging_in: "Ybttvat Va" + log_out: "Ybt Bhg" + forgot_password: "Sbetbg lbhe cnffjbeq?" + authenticate_gplus: "Nhguragvpngr Tbbtyr" + load_profile: "Ybnq Tbbtyr Cebsvyr" + finishing: "Svavfuvat" + sign_in_with_facebook: "Fvta va jvgu Snprobbx" + sign_in_with_gplus: "Fvta va jvgu Tbbtyr" + signup_switch: "Jnag gb perngr na nppbhag?" + + signup: + create_student_header: "Perngr Fghqrag Nppbhag" + create_teacher_header: "Perngr Grnpure Nppbhag" + create_individual_header: "Perngr Vaqvivqhny Nppbhag" + email_announcements: "Erprvir naabhaprzragf nobhg arj PbqrPbzong yriryf naq srngherf!" + creating: "Perngvat Nppbhag..." + sign_up: "Fvta Hc" + log_in: "ybt va jvgu cnffjbeq" + required: "Lbh arrq gb ybt va orsber lbh pna tb gung jnl." + login_switch: "Nyernql unir na nppbhag?" + school_name: "Fpubby Anzr naq Pvgl" + optional: "bcgvbany" + school_name_placeholder: "Rknzcyr Uvtu Fpubby, Fcevatsvryq, VY" + connected_gplus_header: "Lbh'ir fhpprffshyyl pbaarpgrq jvgu Tbbtyr+!" + connected_gplus_p: "Svavfu fvtavat hc fb lbh pna ybt va jvgu lbhe Tbbtyr+ nppbhag." + gplus_exists: "Lbh nyernql unir na nppbhag nffbpvngrq jvgu Tbbtyr+!" + connected_facebook_header: "Lbh'ir fhpprffshyyl pbaarpgrq jvgu Snprobbx!" + connected_facebook_p: "Svavfu fvtavat hc fb lbh pna ybt va jvgu lbhe Snprobbx nppbhag." + facebook_exists: "Lbh nyernql unir na nppbhag nffbpvngrq jvgu Snprobbx!" + hey_students: "Fghqragf, ragre gur pynff pbqr sebz lbhe grnpure." + birthday: "Oveguqnl" + parent_email_blurb: "Jr xabj lbh pna'g jnvg gb yrnea cebtenzzvat &zqnfu; jr'er rkpvgrq gbb! Lbhe cneragf jvyy erprvir na rznvy jvgu shegure vafgehpgvbaf ba ubj gb perngr na nppbhag sbe lbh. Rznvy {{rznvy_yvax}} vs lbh unir nal dhrfgvbaf." + classroom_not_found: "Ab pynffrf rkvfg jvgu guvf Pynff Pbqr. Purpx lbhe fcryyvat be nfx lbhe grnpure sbe uryc." + checking: "Purpxvat..." + account_exists: "Guvf rznvy vf nyernql va hfr:" + sign_in: "Fvta va" + email_good: "Rznvy ybbxf tbbq!" + name_taken: "Hfreanzr nyernql gnxra! Gel {{fhttrfgrqAnzr}}?" + name_available: "Hfreanzr ninvynoyr!" + name_is_email: "Hfreanzr znl abg or na rznvy" + choose_type: "Pubbfr lbhe nppbhag glcr:" + teacher_type_1: "Grnpu cebtenzzvat hfvat PbqrPbzong!" + teacher_type_2: "Frg hc lbhe pynff" + teacher_type_3: "Npprff Pbhefr Thvqrf" + teacher_type_4: "Ivrj fghqrag cebterff" + signup_as_teacher: "Fvta hc nf n Grnpure" + student_type_1: "Yrnea gb cebtenz juvyr cynlvat na ratntvat tnzr!" + student_type_2: "Cynl jvgu lbhe pynff" + student_type_3: "Pbzcrgr va neranf" + student_type_4: "Pubbfr lbhe ureb!" + student_type_5: "Unir lbhe Pynff Pbqr ernql!" + signup_as_student: "Fvta hc nf n Fghqrag" + individuals_or_parents: "Vaqvivqhnyf & Cneragf" + individual_type: "Sbe cynlref yrneavat gb pbqr bhgfvqr bs n pynff. Cneragf fubhyq fvta hc sbe na nppbhag urer." + signup_as_individual: "Fvta hc nf na Vaqvivqhny" + enter_class_code: "Ragre lbhe Pynff Pbqr" + enter_birthdate: "Ragre lbhe oveguqngr:" + parent_use_birthdate: "Cneragf, hfr lbhe bja oveguqngr." + ask_teacher_1: "Nfx lbhe grnpure sbe lbhe Pynff Pbqr." + ask_teacher_2: "Abg cneg bs n pynff? Perngr na " + ask_teacher_3: "Vaqvivqhny Nppbhag" + ask_teacher_4: " vafgrnq." + about_to_join: "Lbh'er nobhg gb wbva:" + enter_parent_email: "Ragre lbhe cnerag’f rznvy nqqerff:" + parent_email_error: "Fbzrguvat jrag jebat jura gelvat gb fraq gur rznvy. Purpx gur rznvy nqqerff naq gel ntnva." + parent_email_sent: "Jr’ir frag na rznvy jvgu shegure vafgehpgvbaf ba ubj gb perngr na nppbhag. Nfx lbhe cnerag gb purpx gurve vaobk." + account_created: "Nppbhag Perngrq!" + confirm_student_blurb: "Jevgr qbja lbhe vasbezngvba fb gung lbh qba'g sbetrg vg. Lbhe grnpure pna nyfb uryc lbh erfrg lbhe cnffjbeq ng nal gvzr." + confirm_individual_blurb: "Jevgr qbja lbhe ybtva vasbezngvba va pnfr lbh arrq vg yngre. Irevsl lbhe rznvy fb lbh pna erpbire lbhe nppbhag vs lbh rire sbetrg lbhe cnffjbeq - purpx lbhe vaobk!" + write_this_down: "Jevgr guvf qbja:" + start_playing: "Fgneg Cynlvat!" + sso_connected: "Fhpprffshyyl pbaarpgrq jvgu:" + select_your_starting_hero: "Fryrpg Lbhe Fgnegvat Ureb:" + you_can_always_change_your_hero_later: "Lbh pna nyjnlf punatr lbhe ureb yngre." + finish: "Svavfu" + teacher_ready_to_create_class: "Lbh'er ernql gb perngr lbhe svefg pynff!" + teacher_students_can_start_now: "Lbhe fghqragf jvyy or noyr gb fgneg cynlvat gur svefg pbhefr, Vagebqhpgvba gb Pbzchgre Fpvrapr, vzzrqvngryl." + teacher_list_create_class: "Ba gur arkg fperra lbh jvyy or noyr gb perngr n arj pynff." + teacher_list_add_students: "Nqq fghqragf gb gur pynff ol pyvpxvat gur Ivrj Pynff yvax, gura fraqvat lbhe fghqragf gur Pynff Pbqr be HEY. Lbh pna nyfb vaivgr gurz ivn rznvy vs gurl unir rznvy nqqerffrf." + teacher_list_resource_hub_1: "Purpx bhg gur" + teacher_list_resource_hub_2: "Pbhefr Thvqrf" + teacher_list_resource_hub_3: "sbe fbyhgvbaf gb rirel yriry, naq gur" + teacher_list_resource_hub_4: "Erfbhepr Uho" + teacher_list_resource_hub_5: "sbe pheevphyhz thvqrf, npgvivgvrf, naq zber!" + teacher_additional_questions: "Gung’f vg! Vs lbh arrq nqqvgvbany uryc be unir dhrfgvbaf, ernpu bhg gb __fhccbegRznvy__." + dont_use_our_email_silly: "Qba'g chg bhe rznvy urer! Chg lbhe cnerag'f rznvy." + + recover: + recover_account_title: "Erpbire Nppbhag" + send_password: "Fraq Erpbirel Cnffjbeq" + recovery_sent: "Erpbirel rznvy frag." + + items: + primary: "Cevznel" + secondary: "Frpbaqnel" + armor: "Nezbe" + accessories: "Npprffbevrf" + misc: "Zvfp" + books: "Obbxf" + + common: + back: "Onpx" # Jura hfrq nf na npgvba ireo, yvxr "Anivtngr onpxjneq" + go_back: "Tb Onpx" + coming_soon: "Pbzvat fbba!" + continue: "Pbagvahr" # Jura hfrq nf na npgvba ireo, yvxr "Pbagvahr sbejneq" + next: "Arkg" + default_code: "Qrsnhyg Pbqr" + loading: "Ybnqvat..." + overview: "Bireivrj" + solution: "Fbyhgvba" + table_of_contents: "Gnoyr bs Pbagragf" + intro: "Vageb" + saving: "Fnivat..." + sending: "Fraqvat..." + send: "Fraq" + sent: "Frag" + cancel: "Pnapry" + save: "Fnir" + publish: "Choyvfu" + create: "Perngr" + fork: "Sbex" + play: "Cynl" # Jura hfrq nf na npgvba ireo, yvxr "Cynl arkg yriry" + retry: "Ergel" + actions: "Npgvbaf" + info: "Vasb" + help: "Uryc" + watch: "Jngpu" + unwatch: "Hajngpu" + submit_patch: "Fhozvg Cngpu" + submit_changes: "Fhozvg Punatrf" + save_changes: "Fnir Punatrf" + required_field: "erdhverq" + valid_phone: "Ragre n inyvq cubar ahzore." + + general: + and: "naq" + name: "Anzr" + date: "Qngr" + body: "Obql" + version: "Irefvba" + pending: "Craqvat" + accepted: "Npprcgrq" + rejected: "Erwrpgrq" + withdrawn: "Jvguqenja" + accept: "Npprcg" + reject: "Erwrpg" + withdraw: "Jvguqenj" + submitter: "Fhozvggre" + submitted: "Fhozvggrq" + commit_msg: "Pbzzvg Zrffntr" + version_history: "Irefvba Uvfgbel" + version_history_for: "Irefvba Uvfgbel sbe: " + select_changes: "Fryrpg gjb punatrf orybj gb frr gur qvssrerapr." + undo_prefix: "Haqb" + undo_shortcut: "(Pgey+M)" + redo_prefix: "Erqb" + redo_shortcut: "(Pgey+Fuvsg+M)" + play_preview: "Cynl cerivrj bs pheerag yriry" + result: "Erfhyg" + results: "Erfhygf" + description: "Qrfpevcgvba" + or: "be" + subject: "Fhowrpg" + email: "Rznvy" + password: "Cnffjbeq" + confirm_password: "Pbasvez Cnffjbeq" + message: "Zrffntr" + code: "Pbqr" + ladder: "Ynqqre" + when: "Jura" + opponent: "Bccbarag" + rank: "Enax" + score: "Fpber" + win: "Jva" + loss: "Ybff" + tie: "Gvr" + easy: "Rnfl" + medium: "Zrqvhz" + hard: "Uneq" + player: "Cynlre" + player_level: "Yriry" # Yvxr cynlre yriry 5, abg yvxr yriry: Qhatrbaf bs Xvgutneq + warrior: "Jneevbe" + ranger: "Enatre" + wizard: "Jvmneq" + first_name: "Svefg Anzr" + last_name: "Ynfg Anzr" + last_initial: "Ynfg Vavgvny" + username: "Hfreanzr" + contact_us: "Pbagnpg Hf" + close_window: "Pybfr Jvaqbj" + learn_more: "Yrnea Zber" + + units: + second: "frpbaq" + seconds: "frpbaqf" + minute: "zvahgr" + minutes: "zvahgrf" + hour: "ubhe" + hours: "ubhef" + day: "qnl" + days: "qnlf" + week: "jrrx" + weeks: "jrrxf" + month: "zbagu" + months: "zbaguf" + year: "lrne" + years: "lrnef" + + play_level: + back_to_map: "Onpx gb Znc" + directions: "Qverpgvbaf" + edit_level: "Rqvg Yriry" + explore_codecombat: "Rkcyber PbqrPbzong" + finished_hoc: "V'z svavfurq jvgu zl Ubhe bs Pbqr" + get_certificate: "Trg lbhe pregvsvpngr!" + level_complete: "Yriry Pbzcyrgr" + completed_level: "Pbzcyrgrq Yriry:" + course: "Pbhefr:" + done: "Qbar" + next_level: "Arkg Yriry" + next_game: "Arkg tnzr" + languages: "Ynathntrf" + programming_language: "Cebtenzzvat ynathntr" + show_menu: "Fubj tnzr zrah" + home: "Ubzr" # Abg hfrq nal zber, jvyy or erzbirq fbba. + level: "Yriry" # Yvxr "Yriry: Qhatrbaf bs Xvgutneq" + skip: "Fxvc" + game_menu: "Tnzr Zrah" + restart: "Erfgneg" + goals: "Tbnyf" + goal: "Tbny" + running: "Ehaavat..." + success: "Fhpprff!" + incomplete: "Vapbzcyrgr" + timed_out: "Ena bhg bs gvzr" + failing: "Snvyvat" + reload: "Erybnq" + reload_title: "Erybnq Nyy Pbqr?" + reload_really: "Ner lbh fher lbh jnag gb erybnq guvf yriry onpx gb gur ortvaavat?" + reload_confirm: "Erybnq Nyy" + test_level: "Grfg Yriry" + victory: "Ivpgbel" + victory_title_prefix: "" + victory_title_suffix: " Pbzcyrgr" + victory_sign_up: "Fvta Hc gb Fnir Cebterff" + victory_sign_up_poke: "Jnag gb fnir lbhe pbqr? Perngr n serr nppbhag!" + victory_rate_the_level: "Ubj sha jnf guvf yriry?" + victory_return_to_ladder: "Erghea gb Ynqqre" + victory_saving_progress: "Fnivat Cebterff" + victory_go_home: "Tb Ubzr" + victory_review: "Gryy hf zber!" + victory_review_placeholder: "Ubj jnf gur yriry?" + victory_hour_of_code_done: "Ner Lbh Qbar?" + victory_hour_of_code_done_yes: "Lrf, V'z svavfurq jvgu zl Ubhe bs Pbqr™!" + victory_experience_gained: "KC Tnvarq" + victory_gems_gained: "Trzf Tnvarq" + victory_new_item: "Arj Vgrz" + victory_new_hero: "Arj Ureb" + victory_viking_code_school: "Ubyl fzbxrf, gung jnf n uneq yriry lbh whfg orng! Vs lbh nera'g nyernql n fbsgjner qrirybcre, lbh fubhyq or. Lbh whfg tbg snfg-genpxrq sbe npprcgnapr jvgu Ivxvat Pbqr Fpubby, jurer lbh pna gnxr lbhe fxvyyf gb gur arkg yriry naq orpbzr n cebsrffvbany jro qrirybcre va 14 jrrxf." + victory_become_a_viking: "Orpbzr n Ivxvat" + victory_no_progress_for_teachers: "Cebterff vf abg fnirq sbe grnpuref. Ohg, lbh pna nqq n fghqrag nppbhag gb lbhe pynffebbz sbe lbhefrys." + tome_cast_button_run: "Eha" + tome_cast_button_running: "Ehaavat" + tome_cast_button_ran: "Ena" + tome_submit_button: "Fhozvg" + tome_reload_method: "Erybnq bevtvany pbqr gb erfgneg gur yriry" + tome_available_spells: "Ninvynoyr Fcryyf" + tome_your_skills: "Lbhe Fxvyyf" + hints: "Uvagf" + hints_title: "Uvag {{ahzore}}" + code_saved: "Pbqr Fnirq" + skip_tutorial: "Fxvc (rfp)" + keyboard_shortcuts: "Xrl Fubegphgf" + loading_start: "Fgneg Yriry" + problem_alert_title: "Svk Lbhe Pbqr" + time_current: "Abj:" + time_total: "Znk:" + time_goto: "Tb gb:" + non_user_code_problem_title: "Hanoyr gb Ybnq Yriry" + infinite_loop_title: "Vasvavgr Ybbc Qrgrpgrq" + infinite_loop_description: "Gur vavgvny pbqr gb ohvyq gur jbeyq arire svavfurq ehaavat. Vg'f cebonoyl rvgure ernyyl fybj be unf na vasvavgr ybbc. Be gurer zvtug or n oht. Lbh pna rvgure gel ehaavat guvf pbqr ntnva be erfrg gur pbqr gb gur qrsnhyg fgngr. Vs gung qbrfa'g svk vg, cyrnfr yrg hf xabj." + check_dev_console: "Lbh pna nyfb bcra gur qrirybcre pbafbyr gb frr jung zvtug or tbvat jebat." + check_dev_console_link: "(vafgehpgvbaf)" + infinite_loop_try_again: "Gel Ntnva" + infinite_loop_reset_level: "Erfrg Yriry" + infinite_loop_comment_out: "Pbzzrag Bhg Zl Pbqr" + tip_toggle_play: "Gbttyr cynl/cnhfrq jvgu Pgey+C." + tip_scrub_shortcut: "Hfr Pgey+[ naq Pgey+] gb erjvaq naq snfg-sbejneq." + tip_guide_exists: "Pyvpx gur thvqr, vafvqr tnzr zrah (ng gur gbc bs gur cntr), sbe hfrshy vasb." + tip_open_source: "PbqrPbzong vf 100% bcra fbhepr!" + tip_tell_friends: "Rawblvat PbqrPbzong? Gryy lbhe sevraqf nobhg hf!" + tip_beta_launch: "PbqrPbzong ynhapurq vgf orgn va Bpgbore, 2013." + tip_think_solution: "Guvax bs gur fbyhgvba, abg gur ceboyrz." + tip_theory_practice: "Va gurbel, gurer vf ab qvssrerapr orgjrra gurbel naq cenpgvpr. Ohg va cenpgvpr, gurer vf. - Lbtv Oreen" + tip_error_free: "Gurer ner gjb jnlf gb jevgr reebe-serr cebtenzf; bayl gur guveq bar jbexf. - Nyna Creyvf" + tip_debugging_program: "Vs qrohttvat vf gur cebprff bs erzbivat ohtf, gura cebtenzzvat zhfg or gur cebprff bs chggvat gurz va. - Rqftre J. Qvwxfgen" + tip_forums: "Urnq bire gb gur sbehzf naq gryy hf jung lbh guvax!" + tip_baby_coders: "Va gur shgher, rira onovrf jvyy or Nepuzntrf." + tip_morale_improves: "Ybnqvat jvyy pbagvahr hagvy zbenyr vzcebirf." + tip_all_species: "Jr oryvrir va rdhny bccbeghavgvrf gb yrnea cebtenzzvat sbe nyy fcrpvrf." + tip_reticulating: "Ergvphyngvat fcvarf." + tip_harry: "Lre n Jvmneq, " + tip_great_responsibility: "Jvgu terng pbqvat fxvyy pbzrf terng qroht erfcbafvovyvgl." + tip_munchkin: "Vs lbh qba'g rng lbhe irtrgnoyrf, n zhapuxva jvyy pbzr nsgre lbh juvyr lbh'er nfyrrc." + tip_binary: "Gurer ner bayl 10 glcrf bs crbcyr va gur jbeyq: gubfr jub haqrefgnaq ovanel, naq gubfr jub qba'g." + tip_commitment_yoda: "N cebtenzzre zhfg unir gur qrrcrfg pbzzvgzrag, gur zbfg frevbhf zvaq. ~ Lbqn" + tip_no_try: "Qb. Be qb abg. Gurer vf ab gel. - Lbqn" + tip_patience: "Cngvrapr lbh zhfg unir, lbhat Cnqnjna. - Lbqn" + tip_documented_bug: "N qbphzragrq oht vf abg n oht; vg vf n srngher." + tip_impossible: "Vg nyjnlf frrzf vzcbffvoyr hagvy vg'f qbar. - Aryfba Znaqryn" + tip_talk_is_cheap: "Gnyx vf purnc. Fubj zr gur pbqr. - Yvahf Gbeinyqf" + tip_first_language: "Gur zbfg qvfnfgebhf guvat gung lbh pna rire yrnea vf lbhe svefg cebtenzzvat ynathntr. - Nyna Xnl" + tip_hardware_problem: "D: Ubj znal cebtenzzref qbrf vg gnxr gb punatr n yvtug ohyo? N: Abar, vg'f n uneqjner ceboyrz." + tip_hofstadters_law: "Ubsfgnqgre'f Ynj: Vg nyjnlf gnxrf ybatre guna lbh rkcrpg, rira jura lbh gnxr vagb nppbhag Ubsfgnqgre'f Ynj." + tip_premature_optimization: "Cerzngher bcgvzvmngvba vf gur ebbg bs nyy rivy. - Qbanyq Xahgu" + tip_brute_force: "Jura va qbhog, hfr oehgr sbepr. - Xra Gubzcfba" + tip_extrapolation: "Gurer ner bayl gjb xvaqf bs crbcyr: gubfr gung pna rkgencbyngr sebz vapbzcyrgr qngn..." + tip_superpower: "Pbqvat vf gur pybfrfg guvat jr unir gb n fhcrecbjre." + tip_control_destiny: "Va erny bcra fbhepr, lbh unir gur evtug gb pbageby lbhe bja qrfgval. - Yvahf Gbeinyqf" + tip_no_code: "Ab pbqr vf snfgre guna ab pbqr." + tip_code_never_lies: "Pbqr arire yvrf, pbzzragf fbzrgvzrf qb. — Eba Wrssevrf" + tip_reusable_software: "Orsber fbsgjner pna or erhfnoyr vg svefg unf gb or hfnoyr." + tip_optimization_operator: "Rirel ynathntr unf na bcgvzvmngvba bcrengbe. Va zbfg ynathntrf gung bcrengbe vf ‘//’" + tip_lines_of_code: "Zrnfhevat cebtenzzvat cebterff ol yvarf bs pbqr vf yvxr zrnfhevat nvepensg ohvyqvat cebterff ol jrvtug. — Ovyy Tngrf" + tip_source_code: "V jnag gb punatr gur jbeyq ohg gurl jbhyq abg tvir zr gur fbhepr pbqr." + tip_javascript_java: "Wnin vf gb WninFpevcg jung Pne vf gb Pnecrg. - Puevf Urvyznaa" + tip_move_forward: "Jungrire lbh qb, xrrc zbivat sbejneq. - Znegva Yhgure Xvat We." + tip_google: "Unir n ceboyrz lbh pna'g fbyir? Tbbtyr vg!" + tip_adding_evil: "Nqqvat n cvapu bs rivy." + tip_hate_computers: "Gung'f gur guvat nobhg crbcyr jub guvax gurl ungr pbzchgref. Jung gurl ernyyl ungr vf ybhfl cebtenzzref. - Yneel Avira" + tip_open_source_contribute: "Lbh pna uryc PbqrPbzong vzcebir!" + tip_recurse: "Gb vgrengr vf uhzna, gb erphefr qvivar. - Y. Crgre Qrhgfpu" + tip_free_your_mind: "Lbh unir gb yrg vg nyy tb, Arb. Srne, qbhog, naq qvforyvrs. Serr lbhe zvaq. - Zbecurhf" + tip_strong_opponents: "Rira gur fgebatrfg bs bccbaragf nyjnlf unf n jrnxarff. - Vgnpuv Hpuvun" + tip_paper_and_pen: "Orsber lbh fgneg pbqvat, lbh pna nyjnlf cyna jvgu n furrg bs cncre naq n cra." + tip_solve_then_write: "Svefg, fbyir gur ceboyrz. Gura, jevgr gur pbqr. - Wbua Wbuafba" + tip_compiler_ignores_comments: "Fbzrgvzrf V guvax gung gur pbzcvyre vtaberf zl pbzzragf." + tip_understand_recursion: "Gur bayl jnl gb haqrefgnaq erphefvba vf gb haqrefgnaq erphefvba." + tip_life_and_polymorphism: "Bcra Fbhepr vf yvxr n gbgnyyl cbylzbecuvp urgrebtrarbhf fgehpgher: Nyy glcrf ner jrypbzr." + tip_mistakes_proof_of_trying: "Zvfgnxrf va lbhe pbqr ner whfg cebbs gung lbh ner gelvat." + tip_adding_orgres: "Ebhaqvat hc bterf." + tip_sharpening_swords: "Funecravat gur fjbeqf." + tip_ratatouille: "Lbh zhfg abg yrg nalbar qrsvar lbhe yvzvgf orpnhfr bs jurer lbh pbzr sebz. Lbhe bayl yvzvg vf lbhe fbhy. - Thfgrnh, Engngbhvyyr" + tip_nemo: "Jura yvsr trgf lbh qbja, jnag gb xabj jung lbh'ir tbggn qb? Whfg xrrc fjvzzvat, whfg xrrc fjvzzvat. - Qbel, Svaqvat Arzb" + tip_internet_weather: "Whfg zbir gb gur vagrearg, vg'f terng urer. Jr trg gb yvir vafvqr jurer gur jrngure vf nyjnlf njrfbzr. - Wbua Terra" + tip_nerds: "Areqf ner nyybjrq gb ybir fghss, yvxr whzc-hc-naq-qbja-va-gur-punve-pna'g-pbageby-lbhefrys ybir vg. - Wbua Terra" + tip_self_taught: "V gnhtug zlfrys 90% bs jung V'ir yrnearq. Naq gung'f abezny! - Unax Terra" + tip_luna_lovegood: "Qba'g jbeel, lbh'er whfg nf fnar nf V nz. - Yhan Ybirtbbq" + tip_good_idea: "Gur orfg jnl gb unir n tbbq vqrn vf gb unir n ybg bs vqrnf. - Yvahf Cnhyvat" + tip_programming_not_about_computers: "Pbzchgre Fpvrapr vf ab zber nobhg pbzchgref guna nfgebabzl vf nobhg gryrfpbcrf. - Rqftre Qvwxfgen" + tip_mulan: "Oryvrir lbh pna, gura lbh jvyy. - Zhyna" + project_complete: "Cebwrpg Pbzcyrgr!" + share_this_project: "Funer guvf cebwrpg jvgu sevraqf be snzvyl:" + ready_to_share: "Ernql gb choyvfu lbhe cebwrpg?" + click_publish: "Pyvpx \"Choyvfu\" gb znxr vg nccrne va gur pynff tnyyrel, gura purpx bhg jung lbhe pynffzngrf ohvyg! Lbh pna pbzr onpx naq pbagvahr gb jbex ba guvf cebwrpg. Nal shegure punatrf jvyy nhgbzngvpnyyl or fnirq naq funerq jvgu lbhe pynffzngrf." + already_published_prefix: "Lbhe punatrf unir orra choyvfurq gb gur pynff tnyyrel." + already_published_suffix: "Xrrc rkcrevzragvat naq znxvat guvf cebwrpg rira orggre, be frr jung gur erfg bs lbhe pynff unf ohvyg! Lbhe punatrf jvyy nhgbzngvpnyyl or fnirq naq funerq jvgu lbhe pynffzngrf." + view_gallery: "Ivrj Tnyyrel" + project_published_noty: "Lbhe yriry unf orra choyvfurq!" + keep_editing: "Xrrc Rqvgvat" + + play_game_dev_level: + created_by: "Perngrq ol {{anzr}}" + restart: "Erfgneg Yriry" + play: "Cynl Yriry" + play_more_codecombat: "Cynl Zber PbqrPbzong" + default_student_instructions: "Pyvpx gb pbageby lbhe ureb naq jva lbhe tnzr!" + + game_menu: + inventory_tab: "Vairagbel" + save_load_tab: "Fnir/Ybnq" + options_tab: "Bcgvbaf" + guide_tab: "Thvqr" + guide_video_tutorial: "Ivqrb Ghgbevny" + guide_tips: "Gvcf" + multiplayer_tab: "Zhygvcynlre" + auth_tab: "Fvta Hc" + inventory_caption: "Rdhvc lbhe ureb" + choose_hero_caption: "Pubbfr ureb, ynathntr" + options_caption: "Pbasvther frggvatf" + guide_caption: "Qbpf naq gvcf" + multiplayer_caption: "Cynl jvgu sevraqf!" + auth_caption: "Fnir lbhe cebterff." + + leaderboard: + view_other_solutions: "Ivrj Yrnqreobneqf" + scores: "Fpberf" + top_players: "Gbc Cynlref ol" + day: "Gbqnl" + week: "Guvf Jrrx" + all: "Nyy-Gvzr" + latest: "Yngrfg" + time: "Gvzr" + damage_taken: "Qnzntr Gnxra" + damage_dealt: "Qnzntr Qrnyg" + difficulty: "Qvssvphygl" + gold_collected: "Tbyq Pbyyrpgrq" + + inventory: + equipped_item: "Rdhvccrq" + required_purchase_title: "Erdhverq" + available_item: "Ninvynoyr" + restricted_title: "Erfgevpgrq" + should_equip: "(qbhoyr-pyvpx gb rdhvc)" + equipped: "(rdhvccrq)" + locked: "(ybpxrq)" + restricted: "(erfgevpgrq va guvf yriry)" + equip: "Rdhvc" + unequip: "Hardhvc" + + buy_gems: + few_gems: "N srj trzf" + pile_gems: "Cvyr bs trzf" + chest_gems: "Purfg bs trzf" + purchasing: "Chepunfvat..." + declined: "Lbhe pneq jnf qrpyvarq" + retrying: "Freire reebe, ergelvat." + prompt_title: "Abg Rabhtu Trzf" + prompt_body: "Qb lbh jnag gb trg zber?" + prompt_button: "Ragre Fubc" + recovered: "Cerivbhf trzf chepunfr erpbirerq. Cyrnfr erserfu gur cntr." + price: "k{{trzf}} / zb" + buy_premium: "Ohl Cerzvhz" + purchase: "Chepunfr" + purchased: "Chepunfrq" + + earn_gems: + prompt_title: "Abg Rabhtu Trzf" + prompt_body: "Xrrc cynlvat gb rnea zber!" + + subscribe: + premium_already_subscribed: "Lbh'er nyernql fhofpevorq gb Cerzvhz!" + subscribe_modal_title: "PbqrPbzong Cerzvhz" + comparison_blurb: "Orpbzr n Znfgre Pbqre - fhofpevor gb Cerzvhz gbqnl!" + premium_pricing_prefix: "Trg Cerzvhz sbe whfg" + premium_pricing_suffix: "naq orpbzr n znfgre pbqre." + premium: "Cerzvhz" # Znxr fher gur sbyybjvat srngher genafyngvbaf qba'g tb bagb gjb yvarf + free: "Serr" + month: "zbagu" + must_be_logged: "Lbh zhfg or ybttrq va svefg. Cyrnfr perngr na nppbhag be ybt va sebz gur zrah nobir." + subscribe_title: "Fhofpevor" # Npghnyyl hfrq va fhofpevor ohggbaf, gbb + unsubscribe: "Hafhofpevor" + confirm_unsubscribe: "Pbasvez Hafhofpevor" + never_mind: "Arire Zvaq, V Fgvyy Ybir Lbh" + thank_you_months_prefix: "Gunax lbh sbe fhccbegvat hf gurfr ynfg" + thank_you_months_suffix: "zbaguf." + thank_you: "Gunax lbh sbe fhccbegvat PbqrPbzong." + sorry_to_see_you_go: "Fbeel gb frr lbh tb! Cyrnfr yrg hf xabj jung jr pbhyq unir qbar orggre." + unsubscribe_feedback_placeholder: "B, jung unir jr qbar?" + parent_button: "Nfx lbhe cnerag" + parent_email_description: "Jr'yy rznvy gurz fb gurl pna ohl lbh n PbqrPbzong fhofpevcgvba." + parent_email_input_invalid: "Rznvy nqqerff vainyvq." + parent_email_input_label: "Cnerag rznvy nqqerff" + parent_email_input_placeholder: "Ragre cnerag rznvy" + parent_email_send: "Fraq Rznvy" + parent_email_sent: "Rznvy frag!" + parent_email_title: "Jung'f lbhe cnerag'f rznvy?" + parents: "Sbe Cneragf" + parents_title: "Qrne Cnerag: Lbhe puvyq vf yrneavat gb pbqr. Jvyy lbh uryc gurz pbagvahr?" + parents_blurb1: "Lbhe puvyq unf cynlrq __aYriryf__ yriryf naq yrnearq cebtenzzvat onfvpf. Uryc phygvingr gurve vagrerfg naq ohl gurz n fhofpevcgvba fb gurl pna xrrc cynlvat." + parents_blurb1a: "Pbzchgre cebtenzzvat vf na rffragvny fxvyy gung lbhe puvyq jvyy haqbhogrqyl hfr nf na nqhyg. Ol 2020, onfvp fbsgjner fxvyyf jvyy or arrqrq ol 77% bs wbof, naq fbsgjner ratvarref ner va uvtu qrznaq npebff gur jbeyq. Qvq lbh xabj gung Pbzchgre Fpvrapr vf gur uvturfg-cnvq havirefvgl qrterr?" + parents_blurb2: "Sbe ${{cevpr}} HFQ/zb, lbhe puvyq jvyy trg arj punyyratrf rirel jrrx naq crefbany rznvy fhccbeg sebz cebsrffvbany cebtenzzref." + parents_blurb3: "Ab Evfx: 100% zbarl onpx thnenagrr, rnfl 1-pyvpx hafhofpevor." + payment_methods: "Cnlzrag Zrgubqf" + payment_methods_title: "Npprcgrq Cnlzrag Zrgubqf" + payment_methods_blurb1: "Jr pheeragyl npprcg perqvg pneqf naq Nyvcnl. Lbh pna nyfb CnlCny {{guerr_zbagu_cevpr}} HFQ gb avpx@pbqrpbzong.pbz jvgu lbhe nppbhag rznvy va gur zrzb gb chepunfr guerr zbaguf' fhofpevcgvba naq trzf, be ${{lrne_cevpr}} sbe n lrne." + payment_methods_blurb2: "Vs lbh erdhver na nygreangr sbez bs cnlzrag, cyrnfr pbagnpg" + sale_button: "Fnyr!" + sale_button_title: "Fnir $21 jura lbh chepunfr n 1 lrne fhofpevcgvba" + stripe_description: "Zbaguyl Fhofpevcgvba" + buy_now: "Ohl Abj" + subscription_required_to_play: "Lbh'yy arrq n fhofpevcgvba gb cynl guvf yriry." + unlock_help_videos: "Fhofpevor gb haybpx nyy ivqrb ghgbevnyf." + personal_sub: "Crefbany Fhofpevcgvba" # Nppbhagf Fhofpevcgvba Ivrj orybj + loading_info: "Ybnqvat fhofpevcgvba vasbezngvba..." + managed_by: "Znantrq ol" + will_be_cancelled: "Jvyy or pnapryyrq ba" + currently_free: "Lbh pheeragyl unir n serr fhofpevcgvba" + currently_free_until: "Lbh pheeragyl unir n fhofpevcgvba hagvy" + free_subscription: "Serr fhofpevcgvba" + was_free_until: "Lbh unq n serr fhofpevcgvba hagvy" + managed_subs: "Znantrq Fhofpevcgvbaf" + subscribing: "Fhofpevovat..." + current_recipients: "Pheerag Erpvcvragf" + unsubscribing: "Hafhofpevovat" + subscribe_prepaid: "Pyvpx Fhofpevor gb hfr cercnvq pbqr" + using_prepaid: "Hfvat cercnvq pbqr sbe zbaguyl fhofpevcgvba" + feature_levels: "Npprff __cerzvhzYriryfPbhag__ yriryf ninvynoyr" + feature_gems: "Erprvir __trzf__ trzf cre zbagu" + feature_heroes: "Haybpx rkpyhfvir urebrf" + feature_games: "Znxr tnzrf sbe lbhe sevraqf" + feature_websites: "Ohvyq jrofvgrf naq nccf" + feature_items: "Rdhvc zber cbjreshy vgrzf" + month_price: "$__cevpr__/zb" + lifetime: "Yvsrgvzr Fhofpevcgvba" + lifetime_price: "$__cevpr__" + year_subscription: "Lrneyl Fhofpevcgvba" + year_price: "$__cevpr__/lrne" + kids_message_1: "Xvqf! Jr'yy fraq na rznvy gb lbhe cneragf fb gurl pna chepunfr n fhofpevcgvba sbe lbh." + kids_message_2: "Nfx Lbhe Cnerag" + support_part1: "Arrq uryc jvgu cnlzrag bcgvbaf? Rznvy" + support_part2: "fhccbeg@pbqrpbzong.pbz" + support_part3: "vs lbh unir nal dhrfgvbaf." + you_are_purchasing_year_sub: "Lbh'er chepunfvat n Lrneyl Cerzvhz Fhofpevcgvba!" + you_are_purchasing_lifetime_sub: "Lbh'er chepunfvat n Yvsrgvzr Cerzvhz Fhofpevcgvba!" + you_will_be_charged: "Lbh jvyy or punetrq $__cevprFgevat__ bar gvzr." + choose_payment_method: "Pubbfr Cnlzrag Zrgubq" + pay_with_credit_card_or_bitcoin: "Cnl jvgu Perqvg Pneq / Ovgpbva" + paypal_payment_error: "Jr rapbhagrerq na reebe juvyr punetvat CnlCny." + + announcement: + now_available: "Abj ninvynoyr sbe fhofpevoref!" + subscriber: "fhofpevore" + cuddly_companions: "Phqqyl Pbzcnavbaf!" # Crg Naabhaprzrag Zbqny + kindling_name: "Xvaqyvat Ryrzragny" + kindling_description: "Xvaqyvat Ryrzragnyf whfg jnag gb xrrc lbh jnez ng avtug. Naq qhevat gur qnl. Nyy gur gvzr, ernyyl." + griffin_name: "Onol Tevssva" + griffin_description: "Tevssvaf ner unys rntyr, unys yvba, nyy nqbenoyr." + raven_name: "Enira" + raven_description: "Eniraf ner rkpryyrag ng tngurevat fuval obggyrf shyy bs urnygu sbe lbh." + mimic_name: "Zvzvp" + mimic_description: "Zvzvpf pna cvpx hc pbvaf sbe lbh. Zbir gurz ba gbc bs pbvaf gb vapernfr lbhe tbyq fhccyl." + cougar_name: "Pbhtne" + cougar_description: "Pbhtnef yvxr gb rnea n CuQ ol Cheevat Unccvyl Qnvyl." + fox_name: "Oyhr Sbk" + fox_description: "Oyhr sbkrf ner irel pyrire naq ybir qvttvat va gur qveg naq fabj!" + pugicorn_name: "Chtvpbea" + pugicorn_description: "Chtvpbeaf ner fbzr bs gur enerfg perngherf naq pna pnfg fcryyf!" + wolf_name: "Jbys Chc" + wolf_description: "Jbys chcf rkpry va uhagvat, tngurevat, naq cynlvat n zrna tnzr bs uvqr-naq-frrx!" + ball_name: "Erq Fdhrnxl Onyy" + ball_description: "onyy.fdhrnx()" + collect_pets: "Pbyyrpg crgf sbe lbhe urebrf!" + each_pet: "Rnpu crg unf n havdhr urycre novyvgl!" + upgrade_to_premium: "Orpbzr n {{fhofpevore}} gb rdhvc crgf." + play_second_kithmaze: "Cynl {{gur_frpbaq_xvguznmr}} gb haybpx gur Jbys Chc!" + the_second_kithmaze: "Gur Frpbaq Xvguznmr" + keep_playing: "Xrrc cynlvat gb qvfpbire gur svefg crg!" + coming_soon: "Pbzvat fbba" + ritic: "Evgvp gur Pbyq" # Evgvp Naabhaprzrag Zbqny + ritic_description: "Evgvp gur Pbyq. Genccrq va Xryivagncu Tynpvre sbe pbhagyrff ntrf, svanyyl serr naq ernql gb graq gb gur bterf gung vzcevfbarq uvz." + ice_block: "N oybpx bs vpr" + ice_description: "Gurer nccrnef gb or fbzrguvat genccrq vafvqr..." + blink_name: "Oyvax" + blink_description: "Evgvp qvfnccrnef naq ernccrnef va n oyvax bs na rlr, yrnivat abguvat ohg n funqbj." + shadowStep_name: "Funqbjfgrc" + shadowStep_description: "N znfgre nffnffva xabjf ubj gb jnyx orgjrra gur funqbjf." + tornado_name: "Gbeanqb" + tornado_description: "Vg vf tbbq gb unir n erfrg ohggba jura bar'f pbire vf oybja." + wallOfDarkness_name: "Jnyy bs Qnexarff" + wallOfDarkness_description: "Uvqr oruvaq n jnyy bs funqbjf gb cerirag gur tnmr bs celvat rlrf." + + premium_features: + get_premium: "TrgPbqrPbzongCerzvhz" # Svg vagb gur onaare ba gur /srngherf cntr + master_coder: "Orpbzr n Znfgre Pbqre ol fhofpevovat gbqnl!" + subscribe_now: "Fhofpevor Abj" + hero_blurb_1: "Trg npprff gb __cerzvhzUrebrfPbhag__ fhcre-punetrq fhofpevore-bayl urebrf! Unearff gur hafgbccnoyr cbjre bs Bxne Fgbzcsbbg, gur qrnqyl cerpvfvba bs Anevn bs gur Yrns, be fhzzba \"nqbenoyr\" fxryrgbaf jvgu Anysne Pelcgbe." + hero_blurb_2: "Cerzvhz Jneevbef haybpx fghaavat znegvny fxvyyf yvxr Jnepel, Fgbzc, naq Uhey Rarzl. Be, cynl nf n Enatre, hfvat fgrnygu naq objf, guebjvat xavirf, gencf! Gel lbhe fxvyy nf n gehr pbqvat Jvmneq, naq hayrnfu n cbjreshy neenl bs Cevzbeqvny, Arpebznagvp be Ryrzragny zntvp!" + hero_caption: "Rkpvgvat arj urebrf!" + pet_blurb_1: "Crgf nera'g whfg nqbenoyr pbzcnavbaf, gurl nyfb cebivqr havdhr shapgvbanyvgl naq zrgubqf. Gur Onol Tevssba pna pneel havgf guebhtu gur nve, gur Jbys Chc cynlf pngpu jvgu rarzl neebjf, gur Pbhtne vf sbaq bs punfvat bterf nebhaq, naq gur Zvzvp nggenpgf pbvaf yvxr n zntarg!" + pet_blurb_2: "Pbyyrpg nyy gur crgf gb qvfpbire gurve havdhr novyvgvrf!" + pet_caption: "Nqbcg crgf gb nppbzcnal lbhe ureb!" + game_dev_blurb: "Yrnea tnzr fpevcgvat naq ohvyq arj yriryf gb funer jvgu lbhe sevraqf! Cynpr gur vgrzf lbh jnag, jevgr pbqr sbe havg ybtvp naq orunivbe, naq frr vs lbhe sevraqf pna orng gur yriry!" + game_dev_caption: "Qrfvta lbhe bja tnzrf gb punyyratr lbhe sevraqf!" + everything_in_premium: "Rirelguvat lbh trg va PbqrPbzong Cerzvhz:" + list_gems: "Erprvir obahf trzf gb ohl trne, crgf, naq urebrf" + list_levels: "Tnva npprff gb __cerzvhzYriryfPbhag__ zber yriryf" + list_heroes: "Haybpx rkpyhfvir urebrf, vapyhqr Enatre naq Jvmneq pynffrf" + list_game_dev: "Znxr naq funer tnzrf jvgu sevraqf" + list_web_dev: "Ohvyq jrofvgrf naq vagrenpgvir nccf" + list_items: "Rdhvc Cerzvhz-bayl vgrzf yvxr crgf" + list_support: "Trg Cerzvhz fhccbeg gb uryc lbh qroht gevpxl pbqr" + list_clans: "Perngr cevingr pynaf gb vaivgr lbhe sevraqf naq pbzcrgr ba n tebhc yrnqreobneq" + + choose_hero: + choose_hero: "Pubbfr Lbhe Ureb" + programming_language: "Cebtenzzvat Ynathntr" + programming_language_description: "Juvpu cebtenzzvat ynathntr qb lbh jnag gb hfr?" + default: "Qrsnhyg" + experimental: "Rkcrevzragny" + python_blurb: "Fvzcyr lrg cbjreshy, terng sbe ortvaaref naq rkcregf." + javascript_blurb: "Gur ynathntr bs gur jro. (Abg gur fnzr nf Wnin.)" + coffeescript_blurb: "Avpre WninFpevcg flagnk." + lua_blurb: "Tnzr fpevcgvat ynathntr." + java_blurb: "(Fhofpevore Bayl) Naqebvq naq ragrecevfr." + status: "Fgnghf" + weapons: "Jrncbaf" + weapons_warrior: "Fjbeqf - Fubeg Enatr, Ab Zntvp" + weapons_ranger: "Pebffobjf, Thaf - Ybat Enatr, Ab Zntvp" + weapons_wizard: "Jnaqf, Fgnssf - Ybat Enatr, Zntvp" + attack: "Qnzntr" # Pna nyfb genafyngr nf "Nggnpx" + health: "Urnygu" + speed: "Fcrrq" + regeneration: "Ertrarengvba" + range: "Enatr" # Nf va "nggnpx be ivfhny enatr" + blocks: "Oybpxf" # Nf va "guvf fuvryq oybpxf guvf zhpu qnzntr" + backstab: "Onpxfgno" # Nf va "guvf qnttre qbrf guvf zhpu onpxfgno qnzntr" + skills: "Fxvyyf" + attack_1: "Qrnyf" + attack_2: "bs yvfgrq" + attack_3: "jrncba qnzntr." + health_1: "Tnvaf" + health_2: "bs yvfgrq" + health_3: "nezbe urnygu." + speed_1: "Zbirf ng" + speed_2: "zrgref cre frpbaq." + available_for_purchase: "Ninvynoyr sbe Chepunfr" # Fubjf hc jura lbh unir haybpxrq, ohg abg chepunfrq, n ureb va gur ureb fgber + level_to_unlock: "Yriry gb haybpx:" # Ynory sbe juvpu yriry lbh unir gb orng gb haybpx n cnegvphyne ureb (pyvpx n ybpxrq ureb va gur fgber gb frr) + restricted_to_certain_heroes: "Bayl pregnva urebrf pna cynl guvf yriry." + + skill_docs: + function: "shapgvba" # fxvyy glcrf + method: "zrgubq" + snippet: "favccrg" + number: "ahzore" + array: "neenl" + object: "bowrpg" + string: "fgevat" + writable: "jevgnoyr" # Ubire bire "nggnpx" va Lbhe Fxvyyf juvyr cynlvat n yriry gb frr zbfg bs guvf + read_only: "ernq-bayl" + action: "Npgvba" + spell: "Fcryy" + action_name: "anzr" + action_cooldown: "Gnxrf" + action_specific_cooldown: "Pbbyqbja" + action_damage: "Qnzntr" + action_range: "Enatr" + action_radius: "Enqvhf" + action_duration: "Qhengvba" + example: "Rknzcyr" + ex: "rk" # Nooerivngvba bs "rknzcyr" + current_value: "Pheerag Inyhr" + default_value: "Qrsnhyg inyhr" + parameters: "Cnenzrgref" + required_parameters: "Erdhverq Cnenzrgref" + optional_parameters: "Bcgvbany Cnenzrgref" + returns: "Ergheaf" + granted_by: "Tenagrq ol" + + save_load: + granularity_saved_games: "Fnirq" + granularity_change_history: "Uvfgbel" + + options: + general_options: "Trareny Bcgvbaf" # Purpx bhg gur Bcgvbaf gno va gur Tnzr Zrah juvyr cynlvat n yriry + volume_label: "Ibyhzr" + music_label: "Zhfvp" + music_description: "Ghea onpxtebhaq zhfvp ba/bss." + editor_config_title: "Rqvgbe Pbasvthengvba" + editor_config_livecompletion_label: "Yvir Nhgbpbzcyrgvba" + editor_config_livecompletion_description: "Qvfcynlf nhgbpbzcyrgr fhttrfgvbaf juvyr glcvat." + editor_config_invisibles_label: "Fubj Vaivfvoyrf" + editor_config_invisibles_description: "Qvfcynlf vaivfvoyrf fhpu nf fcnprf be gnof." + editor_config_indentguides_label: "Fubj Vaqrag Thvqrf" + editor_config_indentguides_description: "Qvfcynlf iregvpny yvarf gb frr vaqragngvba orggre." + editor_config_behaviors_label: "Fzneg Orunivbef" + editor_config_behaviors_description: "Nhgbpbzcyrgrf oenpxrgf, oenprf, naq dhbgrf." + + about: + main_title:"Vs lbh jnag gb yrnea gb cebtenz, lbh arrq gb jevgr (n ybg bs) pbqr." + main_description: "Ng PbqrPbzong, bhe wbo vf gb znxr fher lbh'er qbvat gung jvgu n fzvyr ba lbhe snpr." + mission_link: "Zvffvba" + team_link: "Grnz" + story_link: "Fgbel" + press_link: "Cerff" + mission_title: "Bhe zvffvba: znxr cebtenzzvat npprffvoyr gb rirel fghqrag ba Rnegu." + mission_description_1: "Cebtenzzvat vf zntvp. Vg'f gur novyvgl gb perngr guvatf sebz cher vzntvangvba. Jr fgnegrq PbqrPbzong gb tvir yrnearef gur srryvat bs jvmneqyl cbjre ng gurve svatregvcf ol hfvat glcrq pbqr." + mission_description_2: "Nf vg gheaf bhg, gung ranoyrf gurz gb yrnea snfgre gbb. JNL snfgre. Vg'f yvxr univat n pbairefngvba vafgrnq bs ernqvat n znahny. Jr jnag gb oevat gung pbairefngvba gb rirel fpubby naq gb rirel fghqrag, orpnhfr rirelbar fubhyq unir gur punapr gb yrnea gur zntvp bs cebtenzzvat." + team_title: "Zrrg gur PbqrPbzong grnz" + team_values: "Jr inyhr bcra naq erfcrpgshy qvnybt, jurer gur orfg vqrn jvaf. Bhe qrpvfvbaf ner tebhaqrq va phfgbzre erfrnepu naq bhe cebprff vf sbphfrq ba qryvirevat gnatvoyr erfhygf sbe gurz. Rirelbar vf unaqf-ba, sebz bhe PRB gb bhe TvgUho pbagevohgbef, orpnhfr jr inyhr tebjgu naq yrneavat va bhe grnz." + nick_title: "Pbsbhaqre, PRB" + nick_blurb: "Zbgvingvba Theh" + matt_title: "Pbsbhaqre, PGB" + cat_title: "Tnzr Qrfvtare" + cat_blurb: "Nveoraqre" + scott_title: "Pbsbhaqre, Fbsgjner Ratvarre" + scott_blurb: "Ernfbanoyr Bar" + maka_title: "Phfgbzre Nqibpngr" + maka_blurb: "Fgbelgryyre" + rob_title: "Fbsgjner Ratvarre" + rob_blurb: "Pbqrf guvatf naq fghss" + josh_c_title: "Tnzr Qrfvtare" + josh_c_blurb: "Qrfvtaf tnzrf" + robin_title: "Cebqhpg Znantre" + robin_blurb: "Fuvcf guvatf" + josh_title: "Tnzr Qrfvtare" + josh_blurb: "Sybbe Vf Ynin" + phoenix_title: "Fbsgjner Ratvarre" + nolan_title: "Greevgbel Znantre" + elliot_title: "Cnegarefuvc Znantre" + elliot_blurb: "Zvaqernqre" + lisa_title: "Fpubby Fcrpvnyvfg" + lisa_blurb: "N tevggl bar" + sean_title: "Greevgbel Znantre" + liz_title: "Greevgbel Znantre" + retrostyle_title: "Vyyhfgengvba" + retrostyle_blurb: "ErgebFglyr Tnzrf" + jose_title: "Zhfvp" + jose_blurb: "Gnxvat Bss" + bryukh_title: "Tnzr Qrfvtare" + bryukh_blurb: "Pbafgehpgf chmmyrf" + community_title: "...naq bhe bcra-fbhepr pbzzhavgl" + community_subtitle: "Bire 500 pbagevohgbef unir urycrq ohvyq PbqrPbzong, jvgu zber wbvavat rirel jrrx!" + community_description_3: "PbqrPbzong vf n" + community_description_link_2: "pbzzhavgl cebwrpg" + community_description_1: "jvgu uhaqerqf bs cynlref ibyhagrrevat gb perngr yriryf, pbagevohgr gb bhe pbqr gb nqq srngherf, svk ohtf, cynlgrfg, naq rira genafyngr gur tnzr vagb 50 ynathntrf fb sne. Rzcyblrrf, pbagevohgbef naq gur fvgr tnva ol funevat vqrnf naq cbbyvat rssbeg, nf qbrf gur bcra fbhepr pbzzhavgl va trareny. Gur fvgr vf ohvyg ba ahzrebhf bcra fbhepr cebwrpgf, naq jr ner bcra fbheprq gb tvir onpx gb gur pbzzhavgl naq cebivqr pbqr-phevbhf cynlref n snzvyvne cebwrpg gb rkcyber naq rkcrevzrag jvgu. Nalbar pna wbva gur PbqrPbzong pbzzhavgl! Purpx bhg bhe" + community_description_link: "pbagevohgr cntr" + community_description_2: "sbe zber vasb." + number_contributors: "Bire 450 pbagevohgbef unir yrag gurve fhccbeg naq gvzr gb guvf cebwrpg." + story_title: "Bhe fgbel fb sne" + story_subtitle: "Fvapr 2013, PbqrPbzong unf tebja sebz n zrer frg bs fxrgpurf gb n yvivat, guevivat tnzr." + story_statistic_1a: "5,000,000+" + story_statistic_1b: "gbgny cynlref" + story_statistic_1c: "unir fgnegrq gurve cebtenzzvat wbhearl guebhtu PbqrPbzong" + story_statistic_2a: "Jr’ir orra genafyngrq vagb bire 50 ynathntrf — bhe cynlref unvy sebz" + story_statistic_2b: "200+ pbhagevrf" + story_statistic_3a: "Gbtrgure, gurl unir jevggra" + story_statistic_3b: "1 ovyyvba yvarf bs pbqr naq pbhagvat" + story_statistic_3c: "npebff znal qvssrerag cebtenzzvat ynathntrf" + story_long_way_1: "Gubhtu jr'ir pbzr n ybat jnl..." + story_sketch_caption: "Avpx'f irel svefg fxrgpu qrcvpgvat n cebtenzzvat tnzr va npgvba." + story_long_way_2: "jr fgvyy unir zhpu gb qb orsber jr pbzcyrgr bhe dhrfg, fb..." + jobs_title: "Pbzr jbex jvgu hf naq uryc jevgr PbqrPbzong uvfgbel!" + jobs_subtitle: """Qba'g frr n tbbq svg ohg vagrerfgrq va xrrcvat va gbhpu? Frr bhe "Perngr Lbhe Bja" yvfgvat.""" + jobs_benefits: "Rzcyblrr Orarsvgf" + jobs_benefit_4: "Hayvzvgrq inpngvba" + jobs_benefit_5: "Cebsrffvbany qrirybczrag naq pbagvahvat rqhpngvba fhccbeg – serr obbxf naq tnzrf!" + jobs_benefit_6: "Zrqvpny (tbyq), qragny, ivfvba, pbzzhgre" + jobs_benefit_7: "Fvg-fgnaq qrfxf sbe nyy" + jobs_benefit_9: "10-lrne bcgvba rkrepvfr jvaqbj" + jobs_benefit_10: "Zngreavgl yrnir: 10 jrrxf cnvq, arkg 6 @ 55% fnynel" + jobs_benefit_11: "Cngreavgl yrnir: 10 jrrxf cnvq" + learn_more: "Yrnea Zber" + jobs_custom_title: "Perngr Lbhe Bja" + jobs_custom_description: "Ner lbh cnffvbangr nobhg PbqrPbzong ohg qba'g frr n wbo yvfgrq gung zngpurf lbhe dhnyvsvpngvbaf? Jevgr hf naq fubj ubj lbh guvax lbh pna pbagevohgr gb bhe grnz. Jr'q ybir gb urne sebz lbh!" + jobs_custom_contact_1: "Fraq hf n abgr ng" + jobs_custom_contact_2: "vagebqhpvat lbhefrys naq jr zvtug trg va gbhpu va gur shgher!" + contact_title: "Cerff & Pbagnpg" + contact_subtitle: "Arrq zber vasbezngvba? Trg va gbhpu jvgu hf ng" + screenshots_title: "Tnzr Fperrafubgf" + screenshots_hint: "(pyvpx gb ivrj shyy fvmr)" + downloads_title: "Qbjaybnq Nffrgf & Vasbezngvba" + about_codecombat: "Nobhg PbqrPbzong" + logo: "Ybtb" + screenshots: "Fperrafubgf" + character_art: "Punenpgre Neg" + download_all: "Qbjaybnq Nyy" + previous: "Cerivbhf" + location_title: "Jr'er ybpngrq va qbjagbja FS:" + + teachers: + licenses_needed: "Yvprafrf arrqrq" + + special_offer: + special_offer: "Fcrpvny Bssre" + project_based_title: "Cebwrpg-Onfrq Pbhefrf" + project_based_description: "Jro naq Tnzr Qrirybczrag pbhefrf srngher funernoyr svany cebwrpgf." + great_for_clubs_title: "Terng sbe pyhof naq ryrpgvirf" + great_for_clubs_description: "Grnpuref pna chepunfr hc gb __znkDhnagvglFgnegreYvprafrf__ Fgnegre Yvprafrf cre lrne." + low_price_title: "Whfg __fgnegreYvprafrCevpr__ cre fghqrag" + low_price_description: "Fgnegre Yvprafrf ner npgvir sbe __fgnegreYvprafrYratguZbaguf__ zbaguf sebz chepunfr." + three_great_courses: "Guerr terng pbhefrf vapyhqrq va gur Fgnegre Yvprafr:" + license_limit_description: "Grnpuref pna chepunfr hc gb __znkDhnagvglFgnegreYvprafrf__ Fgnegre Yvprafrf. Lbh unir nyernql chepunfrq __dhnagvglNyernqlChepunfrq__. Vs lbh arrq zber, pbagnpg __fhccbegRznvy__. Fgnegre Yvprafrf ner inyvq sbe __fgnegreYvprafrYratguZbaguf__ zbaguf." + student_starter_license: "Fghqrag Fgnegre Yvprafr" + purchase_starter_licenses: "Chepunfr Fgnegre Yvprafrf" + purchase_starter_licenses_to_grant: "Chepunfr Fgnegre Yvprafrf gb tenag npprff gb __fgnegreYvprafrPbhefrYvfg__" + starter_licenses_can_be_used: "Fgnegre Yvprafrf pna or hfrq gb nffvta nqqvgvbany pbhefrf vzzrqvngryl nsgre chepunfr." + pay_now: "Cnl Abj" + we_accept_all_major_credit_cards: "Jr npprcg nyy znwbe perqvg pneqf." + cs2_description: "ohvyqf ba gur sbhaqngvba sebz Vagebqhpgvba gb Pbzchgre Fpvrapr, qvivat vagb vs-fgngrzragf, shapgvbaf, riragf naq zber." + wd1_description: "vagebqhprf gur onfvpf bs UGZY naq PFF juvyr grnpuvat fxvyyf arrqrq sbe fghqragf gb ohvyq gurve svefg jrocntr." + gd1_description: "hfrf flagnk fghqragf ner nyernql snzvyvne jvgu gb fubj gurz ubj gb ohvyq naq funer gurve bja cynlnoyr tnzr yriryf." + see_an_example_project: "frr na rknzcyr cebwrpg" + get_started_today: "Trg fgnegrq gbqnl!" + want_all_the_courses: "Jnag nyy gur pbhefrf? Erdhrfg vasbezngvba ba bhe Shyy Yvprafrf." + compare_license_types: "Pbzcner Yvprafr Glcrf:" + cs: "Pbzchgre Fpvrapr" + wd: "Jro Qrirybczrag" + wd1: "Jro Qrirybczrag 1" + gd: "Tnzr Qrirybczrag" + gd1: "Tnzr Qrirybczrag 1" + maximum_students: "Znkvzhz # bs Fghqragf" + unlimited: "Hayvzvgrq" + priority_support: "Cevbevgl fhccbeg" + yes: "Lrf" + price_per_student: "__cevpr__ cre fghqrag" + pricing: "Cevpvat" + free: "Serr" + purchase: "Chepunfr" + courses_prefix: "Pbhefrf" + courses_suffix: "" + course_prefix: "Pbhefr" + course_suffix: "" + + teachers_quote: + subtitle: "Trg lbhe fghqragf fgnegrq va yrff guna na ubhe. Lbh'yy or noyr gb perngr n pynff, nqq fghqragf, naq zbavgbe gurve cebterff nf gurl yrnea pbzchgre fpvrapr." + email_exists: "Hfre rkvfgf jvgu guvf rznvy." + phone_number: "Cubar ahzore" + phone_number_help: "Jurer pna jr ernpu lbh qhevat gur jbexqnl?" + primary_role_label: "Lbhe Cevznel Ebyr" + role_default: "Fryrpg Ebyr" + primary_role_default: "Fryrpg Cevznel Ebyr" + purchaser_role_default: "Fryrpg Chepunfre Ebyr" + tech_coordinator: "Grpuabybtl pbbeqvangbe" + advisor: "Pheevphyhz Fcrpvnyvfg/Nqivfbe" + principal: "Cevapvcny" + superintendent: "Fhcrevagraqrag" + parent: "Cnerag" + purchaser_role_label: "Lbhe Chepunfre Ebyr" + influence_advocate: "Vasyhrapr/Nqibpngr" + evaluate_recommend: "Rinyhngr/Erpbzzraq" + approve_funds: "Nccebir Shaqf" + no_purchaser_role: "Ab ebyr va chepunfr qrpvfvbaf" + district_label: "Qvfgevpg" + district_name: "Qvfgevpg Anzr" + district_na: "Ragre A/N vs abg nccyvpnoyr" + organization_label: "Fpubby" + school_name: "Fpubby Anzr" + city: "Pvgl" + state: "Fgngr" + country: "Pbhagel" + num_students_help: "Ubj znal fghqragf qb lbh nagvpvcngr hfvat PbqrPbzong jvgu?" + num_students_default: "Fryrpg Enatr" + education_level_label: "Rqhpngvba Yriry bs Fghqragf" + education_level_help: "Pubbfr nf znal nf nccyl." + elementary_school: "Ryrzragnel Fpubby" + high_school: "Uvtu Fpubby" + please_explain: "(cyrnfr rkcynva)" + middle_school: "Zvqqyr Fpubby" + college_plus: "Pbyyrtr be uvture" + referrer: "Ubj qvq lbh urne nobhg hf?" + referrer_help: "Sbe rknzcyr: sebz nabgure grnpure, n pbasrerapr, lbhe fghqragf, Pbqr.bet, rgp." + anything_else: "Nalguvat ryfr jr fubhyq xabj?" + thanks_header: "Erdhrfg Erprvirq!" + thanks_sub_header: "Gunaxf sbe rkcerffvat vagrerfg va PbqrPbzong sbe lbhe fpubby." + thanks_p: "Jr'yy or va gbhpu fbba! Vs lbh arrq gb trg va pbagnpg, lbh pna ernpu hf ng:" + back_to_classes: "Onpx gb Pynffrf" + finish_signup: "Svavfu perngvat lbhe grnpure nppbhag:" + finish_signup_p: "Perngr na nppbhag gb frg hc n pynff, nqq lbhe fghqragf, naq zbavgbe gurve cebterff nf gurl yrnea pbzchgre fpvrapr." + signup_with: "Fvta hc jvgu:" + connect_with: "Pbaarpg jvgu:" + conversion_warning: "JNEAVAT: Lbhe pheerag nppbhag vf n Fghqrag Nppbhag. Bapr lbh fhozvg guvf sbez, lbhe nppbhag jvyy or hcqngrq gb n Grnpure Nppbhag." + learn_more_modal: "Grnpure nppbhagf ba PbqrPbzong unir gur novyvgl gb zbavgbe fghqrag cebterff, nffvta yvprafrf naq znantr pynffebbzf. Grnpure nppbhagf pnaabg or n cneg bs n pynffebbz - vs lbh ner pheeragyl raebyyrq va n pynff hfvat guvf nppbhag, lbh jvyy ab ybatre or noyr gb npprff vg bapr lbh hcqngr gb n Grnpure Nppbhag." + create_account: "Perngr n Grnpure Nppbhag" + create_account_subtitle: "Trg npprff gb grnpure-bayl gbbyf sbe hfvat PbqrPbzong va gur pynffebbz. Frg hc n pynff, nqq lbhe fghqragf, naq zbavgbe gurve cebterff!" + convert_account_title: "Hcqngr gb Grnpure Nppbhag" + not: "Abg" + + versions: + save_version_title: "Fnir Arj Irefvba" + new_major_version: "Arj Znwbe Irefvba" + submitting_patch: "Fhozvggvat Cngpu..." + cla_prefix: "Gb fnir punatrf, svefg lbh zhfg nterr gb bhe" + cla_url: "PYN" + cla_suffix: "." + cla_agree: "V NTERR" + owner_approve: "Na bjare jvyy arrq gb nccebir vg orsber lbhe punatrf jvyy orpbzr ivfvoyr." + + contact: + contact_us: "Pbagnpg PbqrPbzong" + welcome: "Tbbq gb urne sebz lbh! Hfr guvf sbez gb fraq hf rznvy. " + forum_prefix: "Sbe nalguvat choyvp, cyrnfr gel " + forum_page: "bhe sbehz" + forum_suffix: " vafgrnq." + faq_prefix: "Gurer'f nyfb n" + faq: "SND" + subscribe_prefix: "Vs lbh arrq uryc svthevat bhg n yriry, cyrnfr" + subscribe: "ohl n PbqrPbzong fhofpevcgvba" + subscribe_suffix: "naq jr'yy or unccl gb uryc lbh jvgu lbhe pbqr." + subscriber_support: "Fvapr lbh'er n PbqrPbzong fhofpevore, lbhe rznvy jvyy trg bhe cevbevgl fhccbeg." + screenshot_included: "Fperrafubg vapyhqrq." + where_reply: "Jurer fubhyq jr ercyl?" + send: "Fraq Srrqonpx" + + account_settings: + title: "Nppbhag Frggvatf" + not_logged_in: "Ybt va be perngr na nppbhag gb punatr lbhe frggvatf." + me_tab: "Zr" + picture_tab: "Cvpgher" + delete_account_tab: "Qryrgr Lbhe Nppbhag" + wrong_email: "Jebat Rznvy" + wrong_password: "Jebat Cnffjbeq" + use_gravatar: "Punatr lbhe cebsvyr cvpgher ol fvtavat hc sbe Teningne" + delete_this_account: "Qryrgr guvf nppbhag creznaragyl" + reset_progress_tab: "Erfrg Nyy Cebterff" + reset_your_progress: "Pyrne nyy lbhe cebterff naq fgneg bire" + god_mode: "Tbq Zbqr" + emails_tab: "Rznvyf" + admin: "Nqzva" + manage_subscription: "Pyvpx urer gb znantr lbhe fhofpevcgvba." + new_password: "Arj Cnffjbeq" + new_password_verify: "Irevsl" + type_in_email: "Glcr va lbhe rznvy be hfreanzr gb pbasvez nppbhag qryrgvba." + type_in_email_progress: "Glcr va lbhe rznvy gb pbasvez qryrgvat lbhe cebterff." + type_in_password: "Nyfb, glcr va lbhe cnffjbeq." + email_subscriptions: "Rznvy Fhofpevcgvbaf" + email_subscriptions_none: "Ab Rznvy Fhofpevcgvbaf." + email_announcements: "Naabhaprzragf" + email_announcements_description: "Trg rznvyf ba gur yngrfg arjf naq qrirybczragf ng PbqrPbzong." + email_notifications: "Abgvsvpngvbaf" + email_notifications_summary: "Pbagebyf sbe crefbanyvmrq, nhgbzngvp rznvy abgvsvpngvbaf eryngrq gb lbhe PbqrPbzong npgvivgl." + email_any_notes: "Nal Abgvsvpngvbaf" + email_any_notes_description: "Qvfnoyr gb fgbc nyy npgvivgl abgvsvpngvba rznvyf." + email_news: "Arjf" + email_recruit_notes: "Wbo Bccbeghavgvrf" + email_recruit_notes_description: "Vs lbh cynl ernyyl jryy, jr znl pbagnpg lbh nobhg trggvat lbh n (orggre) wbo." + contributor_emails: "Pbagevohgbe Pynff Rznvyf" + contribute_prefix: "Jr'er ybbxvat sbe crbcyr gb wbva bhe cnegl! Purpx bhg gur " + contribute_page: "pbagevohgr cntr" + contribute_suffix: " gb svaq bhg zber." + email_toggle: "Gbttyr Nyy" + error_saving: "Reebe Fnivat" + saved: "Punatrf Fnirq" + password_mismatch: "Cnffjbeq qbrf abg zngpu." + password_repeat: "Cyrnfr ercrng lbhe cnffjbeq." + + keyboard_shortcuts: + keyboard_shortcuts: "Xrlobneq Fubegphgf" + space: "Fcnpr" + enter: "Ragre" + press_enter: "cerff ragre" + escape: "Rfpncr" + shift: "Fuvsg" + run_code: "Eha pheerag pbqr." + run_real_time: "Eha va erny gvzr." + continue_script: "Pbagvahr cnfg pheerag fpevcg." + skip_scripts: "Fxvc cnfg nyy fxvccnoyr fpevcgf." + toggle_playback: "Gbttyr cynl/cnhfr." + scrub_playback: "Fpeho onpx naq sbejneq guebhtu gvzr." + single_scrub_playback: "Fpeho onpx naq sbejneq guebhtu gvzr ol n fvatyr senzr." + scrub_execution: "Fpeho guebhtu pheerag fcryy rkrphgvba." + toggle_debug: "Gbttyr qroht qvfcynl." + toggle_grid: "Gbttyr tevq bireynl." + toggle_pathfinding: "Gbttyr cngusvaqvat bireynl." + beautify: "Ornhgvsl lbhe pbqr ol fgnaqneqvmvat vgf sbeznggvat." + maximize_editor: "Znkvzvmr/zvavzvmr pbqr rqvgbe." + + community: + main_title: "PbqrPbzong Pbzzhavgl" + introduction: "Purpx bhg gur jnlf lbh pna trg vaibyirq orybj naq qrpvqr jung fbhaqf gur zbfg sha. Jr ybbx sbejneq gb jbexvat jvgu lbh!" + level_editor_prefix: "Hfr gur PbqrPbzong" + level_editor_suffix: "gb perngr naq rqvg yriryf. Hfref unir perngrq yriryf sbe gurve pynffrf, sevraqf, unpxngubaf, fghqragf, naq fvoyvatf. Vs perngr n arj yriry fbhaqf vagvzvqngvat lbh pna fgneg ol sbexvat bar bs bhef!" + thang_editor_prefix: "Jr pnyy havgf jvguva gur tnzr 'gunatf'. Hfr gur" + thang_editor_suffix: "gb zbqvsl gur PbqrPbzong fbhepr negjbex. Nyybj havgf gb guebj cebwrpgvyrf, nygre gur qverpgvba bs na navzngvba, punatr n havg'f uvg cbvagf, be hcybnq lbhe bja irpgbe fcevgrf." + article_editor_prefix: "Frr n zvfgnxr va fbzr bs bhe qbpf? Jnag gb znxr fbzr vafgehpgvbaf sbe lbhe bja perngvbaf? Purpx bhg gur" + article_editor_suffix: "naq uryc PbqrPbzong cynlref trg gur zbfg bhg bs gurve cynlgvzr." + find_us: "Svaq hf ba gurfr fvgrf" + social_github: "Purpx bhg nyy bhe pbqr ba TvgUho" + social_blog: "Ernq gur PbqrPbzong oybt ba Frgg" + social_discource: "Wbva gur qvfphffvba ba bhe Qvfpbhefr sbehz" + social_facebook: "Yvxr PbqrPbzong ba Snprobbx" + social_twitter: "Sbyybj PbqrPbzong ba Gjvggre" + social_gplus: "Wbva PbqrPbzong ba Tbbtyr+" + social_slack: "Pung jvgu hf va gur choyvp PbqrPbzong Fynpx punaary" + contribute_to_the_project: "Pbagevohgr gb gur cebwrpg" + + clans: + clan: "Pyna" + clans: "Pynaf" + new_name: "Arj pyna anzr" + new_description: "Arj pyna qrfpevcgvba" + make_private: "Znxr pyna cevingr" + subs_only: "fhofpevoref bayl" + create_clan: "Perngr Arj Pyna" + private_preview: "Cerivrj" + private_clans: "Cevingr Pynaf" + public_clans: "Choyvp Pynaf" + my_clans: "Zl Pynaf" + clan_name: "Pyna Anzr" + name: "Anzr" + chieftain: "Puvrsgnva" + edit_clan_name: "Rqvg Pyna Anzr" + edit_clan_description: "Rqvg Pyna Qrfpevcgvba" + edit_name: "rqvg anzr" + edit_description: "rqvg qrfpevcgvba" + private: "(cevingr)" + summary: "Fhzznel" + average_level: "Nirentr Yriry" + average_achievements: "Nirentr Npuvrirzragf" + delete_clan: "Qryrgr Pyna" + leave_clan: "Yrnir Pyna" + join_clan: "Wbva Pyna" + invite_1: "Vaivgr:" + invite_2: "*Vaivgr cynlref gb guvf Pyna ol fraqvat gurz guvf yvax." + members: "Zrzoref" + progress: "Cebterff" + not_started_1: "abg fgnegrq" + started_1: "fgnegrq" + complete_1: "pbzcyrgr" + exp_levels: "Rkcnaq yriryf" + rem_hero: "Erzbir Ureb" + status: "Fgnghf" + complete_2: "Pbzcyrgr" + started_2: "Fgnegrq" + not_started_2: "Abg Fgnegrq" + view_solution: "Pyvpx gb ivrj fbyhgvba." + view_attempt: "Pyvpx gb ivrj nggrzcg." + latest_achievement: "Yngrfg Npuvrirzrag" + playtime: "Cynlgvzr" + last_played: "Ynfg cynlrq" + leagues_explanation: "Cynl va n yrnthr ntnvafg bgure pyna zrzoref va gurfr zhygvcynlre neran vafgnaprf." + track_concepts1: "Genpx pbaprcgf" + track_concepts2a: "yrnearq ol rnpu fghqrag" + track_concepts2b: "yrnearq ol rnpu zrzore" + track_concepts3a: "Genpx yriryf pbzcyrgrq sbe rnpu fghqrag" + track_concepts3b: "Genpx yriryf pbzcyrgrq sbe rnpu zrzore" + track_concepts4a: "Frr lbhe fghqragf'" + track_concepts4b: "Frr lbhe zrzoref'" + track_concepts5: "fbyhgvbaf" + track_concepts6a: "Fbeg fghqragf ol anzr be cebterff" + track_concepts6b: "Fbeg zrzoref ol anzr be cebterff" + track_concepts7: "Erdhverf vaivgngvba" + track_concepts8: "gb wbva" + private_require_sub: "Cevingr pynaf erdhver n fhofpevcgvba gb perngr be wbva." + + courses: + create_new_class: "Perngr Arj Pynff" + unnamed_class: "Haanzrq Pynff" + edit_settings1: "Rqvg Pynff Frggvatf" + add_students: "Nqq Fghqragf" + stats: "Fgngvfgvpf" + total_students: "Gbgny fghqragf:" + average_time: "Nirentr yriry cynl gvzr:" + total_time: "Gbgny cynl gvzr:" + average_levels: "Nirentr yriryf pbzcyrgrq:" + total_levels: "Gbgny yriryf pbzcyrgrq:" + students: "Fghqragf" + concepts: "Pbaprcgf" + play_time: "Cynl gvzr:" + completed: "Pbzcyrgrq:" + enter_emails: "Frcnengr rnpu rznvy nqqerff ol n yvar oernx be pbzznf" + send_invites: "Vaivgr Fghqragf" + number_programming_students: "Ahzore bs Cebtenzzvat Fghqragf" + number_total_students: "Gbgny Fghqragf va Fpubby/Qvfgevpg" + enroll: "Raebyy" + enroll_paid: "Raebyy Fghqragf va Cnvq Pbhefrf" + get_enrollments: "Trg Zber Yvprafrf" + change_language: "Punatr Pbhefr Ynathntr" + keep_using: "Xrrc Hfvat" + switch_to: "Fjvgpu Gb" + greetings: "Terrgvatf!" + back_classrooms: "Onpx gb zl pynffebbzf" + back_classroom: "Onpx gb pynffebbz" + back_courses: "Onpx gb zl pbhefrf" + edit_details: "Rqvg pynff qrgnvyf" + purchase_enrollments: "Chepunfr Fghqrag Yvprafrf" + remove_student: "erzbir fghqrag" + assign: "Nffvta" + to_assign: "gb nffvta cnvq pbhefrf." + student: "Fghqrag" + teacher: "Grnpure" + arena: "Neran" + available_levels: "Ninvynoyr Yriryf" + started: "fgnegrq" + complete: "pbzcyrgr" + practice: "cenpgvpr" + required: "erdhverq" + welcome_to_courses: "Nqiragheref, jrypbzr gb Pbhefrf!" + ready_to_play: "Ernql gb cynl?" + start_new_game: "Fgneg Arj Tnzr" + play_now_learn_header: "Cynl abj gb yrnea" + play_now_learn_1: "onfvp flagnk gb pbageby lbhe punenpgre" + play_now_learn_2: "juvyr ybbcf gb fbyir crfxl chmmyrf" + play_now_learn_3: "fgevatf & inevnoyrf gb phfgbzvmr npgvbaf" + play_now_learn_4: "ubj gb qrsrng na bter (vzcbegnag yvsr fxvyyf!)" + welcome_to_page: "Zl Fghqrag Qnfuobneq" + my_classes: "Pheerag Pynffrf" + class_added: "Pynff fhpprffshyyl nqqrq!" + view_levels: "ivrj nyy yriryf va pbhefr" + view_project_gallery: "ivrj zl pynffzngrf' cebwrpgf" + join_class: "Wbva N Pynff" + join_class_2: "Wbva pynff" + ask_teacher_for_code: "Nfx lbhe grnpure vs lbh unir n PbqrPbzong pynff pbqr! Vs fb, ragre vg orybj:" + enter_c_code: "" + join: "Wbva" + joining: "Wbvavat pynff" + course_complete: "Pbhefr Pbzcyrgr" + play_arena: "Cynl Neran" + view_project: "Ivrj Cebwrpg" + start: "Fgneg" + last_level: "Ynfg yriry cynlrq" + not_you: "Abg lbh?" + continue_playing: "Pbagvahr Cynlvat" + option1_header: "Vaivgr Fghqragf ol Rznvy" + option1_body: "Abgr: Vs lbhe fghqragf qb abg unir rznvy nqqerffrf, gurl pna ragre lbhe havdhr Pynff Pbqr jura perngvat n Fghqrag Nppbhag gb znxr rznvy nqqerffrf bcgvbany." + remove_student1: "Erzbir Fghqrag" + are_you_sure: "Ner lbh fher lbh jnag gb erzbir guvf fghqrag sebz guvf pynff?" + remove_description1: "Fghqrag jvyy ybfr npprff gb guvf pynffebbz naq nffvtarq pynffrf. Cebterff naq tnzrcynl vf ABG ybfg, naq gur fghqrag pna or nqqrq onpx gb gur pynffebbz ng nal gvzr." + remove_description2: "Gur npgvingrq cnvq yvprafr jvyy abg or erghearq." + keep_student: "Xrrc Fghqrag" + removing_user: "Erzbivat hfre" + subtitle: "Erivrj pbhefr bireivrjf naq yriryf" # Syng fglyr erqrfvta + changelog: "Ivrj yngrfg punatrf gb pbhefr yriryf." + select_language: "Fryrpg ynathntr" + select_level: "Fryrpg yriry" + play_level: "Cynl Yriry" + concepts_covered: "Pbaprcgf pbirerq" + view_guide_online: "Yriry Bireivrjf naq Fbyhgvbaf" + grants_lifetime_access: "Tenagf npprff gb nyy Pbhefrf." + enrollment_credits_available: "Yvprafrf Ninvynoyr:" + language_select: "Fryrpg n ynathntr" # PynffebbzFrggvatfZbqny + language_cannot_change: "Ynathntr pnaabg or punatrq bapr fghqragf wbva n pynff." + avg_student_exp_label: "Nirentr Fghqrag Cebtenzzvat Rkcrevrapr" + avg_student_exp_desc: "Guvf jvyy uryc hf haqrefgnaq ubj gb cnpr pbhefrf orggre." + avg_student_exp_select: "Fryrpg gur orfg bcgvba" + avg_student_exp_none: "Ab Rkcrevrapr - yvggyr gb ab rkcrevrapr" + avg_student_exp_beginner: "Ortvaare - fbzr rkcbfher be oybpx-onfrq" + avg_student_exp_intermediate: "Vagrezrqvngr - fbzr rkcrevrapr jvgu glcrq pbqr" + avg_student_exp_advanced: "Nqinaprq - rkgrafvir rkcrevrapr jvgu glcrq pbqr" + avg_student_exp_varied: "Inevrq Yriryf bs Rkcrevrapr" + student_age_range_label: "Fghqrag Ntr Enatr" + student_age_range_younger: "Lbhatre guna 6" + student_age_range_older: "Byqre guna 18" + student_age_range_to: "gb" + create_class: "Perngr Pynff" + class_name: "Pynff Anzr" + teacher_account_restricted: "Lbhe nppbhag vf n grnpure nppbhag naq pnaabg npprff fghqrag pbagrag." + account_restricted: "N fghqrag nppbhag vf erdhverq gb npprff guvf cntr." + update_account_login_title: "Ybt va gb hcqngr lbhe nppbhag" + update_account_title: "Lbhe nppbhag arrqf nggragvba!" + update_account_blurb: "Orsber lbh pna npprff lbhe pynffrf, pubbfr ubj lbh jnag gb hfr guvf nppbhag." + update_account_current_type: "Pheerag Nppbhag Glcr:" + update_account_account_email: "Nppbhag Rznvy/Hfreanzr:" + update_account_am_teacher: "V nz n grnpure" + update_account_keep_access: "Xrrc npprff gb pynffrf V'ir perngrq" + update_account_teachers_can: "Grnpure nppbhagf pna:" + update_account_teachers_can1: "Perngr/znantr/nqq pynffrf" + update_account_teachers_can2: "Nffvta/raebyy fghqragf va pbhefrf" + update_account_teachers_can3: "Haybpx nyy pbhefr yriryf gb gel bhg" + update_account_teachers_can4: "Npprff arj grnpure-bayl srngherf nf jr eryrnfr gurz" + update_account_teachers_warning: "Jneavat: Lbh jvyy or erzbirq sebz nyy pynffrf gung lbh unir cerivbhfyl wbvarq naq jvyy abg or noyr gb cynl nf n fghqrag." + update_account_remain_teacher: "Erznva n Grnpure" + update_account_update_teacher: "Hcqngr gb Grnpure" + update_account_am_student: "V nz n fghqrag" + update_account_remove_access: "Erzbir npprff gb pynffrf V unir perngrq" + update_account_students_can: "Fghqrag nppbhagf pna:" + update_account_students_can1: "Wbva pynffrf" + update_account_students_can2: "Cynl guebhtu pbhefrf nf n fghqrag naq genpx lbhe bja cebterff" + update_account_students_can3: "Pbzcrgr ntnvafg pynffzngrf va neranf" + update_account_students_can4: "Npprff arj fghqrag-bayl srngherf nf jr eryrnfr gurz" + update_account_students_warning: "Jneavat: Lbh jvyy abg or noyr gb znantr nal pynffrf gung lbh unir cerivbhfyl perngrq be perngr arj pynffrf." + unsubscribe_warning: "Jneavat: Lbh jvyy or hafhofpevorq sebz lbhe zbaguyl fhofpevcgvba." + update_account_remain_student: "Erznva n Fghqrag" + update_account_update_student: "Hcqngr gb Fghqrag" + need_a_class_code: "Lbh'yy arrq n Pynff Pbqr sbe gur pynff lbh'er wbvavat:" + update_account_not_sure: "Abg fher juvpu bar gb pubbfr? Rznvy" + update_account_confirm_update_student: "Ner lbh fher lbh jnag gb hcqngr lbhe nppbhag gb n Fghqrag rkcrevrapr?" + update_account_confirm_update_student2: "Lbh jvyy abg or noyr gb znantr nal pynffrf gung lbh unir cerivbhfyl perngrq be perngr arj pynffrf. Lbhe cerivbhfyl perngrq pynffrf jvyy or erzbirq sebz PbqrPbzong naq pnaabg or erfgberq." + instructor: "Vafgehpgbe: " + youve_been_invited_1: "Lbh'ir orra vaivgrq gb wbva " + youve_been_invited_2: ", jurer lbh'yy yrnea " + youve_been_invited_3: " jvgu lbhe pynffzngrf va PbqrPbzong." + by_joining_1: "Ol wbvavat " + by_joining_2: "jvyy or noyr gb uryc erfrg lbhe cnffjbeq vs lbh sbetrg be ybfr vg. Lbh pna nyfb irevsl lbhe rznvy nqqerff fb gung lbh pna erfrg gur cnffjbeq lbhefrys!" + sent_verification: "Jr'ir frag n irevsvpngvba rznvy gb:" + you_can_edit: "Lbh pna rqvg lbhe rznvy nqqerff va " + account_settings: "Nppbhag Frggvatf" + select_your_hero: "Fryrpg Lbhe Ureb" + select_your_hero_description: "Lbh pna nyjnlf punatr lbhe ureb ol tbvat gb lbhe Pbhefrf cntr naq pyvpxvat \"Punatr Ureb\"" + select_this_hero: "Fryrpg guvf Ureb" + current_hero: "Pheerag Ureb:" + change_hero: "Punatr Ureb" + web_dev_language_transition: "Nyy pynffrf cebtenz va UGZY / WninFpevcg sbe guvf pbhefr. Pynffrf gung unir orra hfvat Clguba jvyy fgneg jvgu rkgen WninFpevcg vageb yriryf gb rnfr gur genafvgvba. Pynffrf gung ner nyernql hfvat WninFpevcg jvyy fxvc gur vageb yriryf." + course_membership_required_to_play: "Lbh'yy arrq gb wbva n pbhefr gb cynl guvf yriry." + license_required_to_play: "Nfx lbhe grnpure gb nffvta n yvprafr gb lbh fb lbh pna pbagvahr gb cynl PbqrPbzong!" + + project_gallery: + no_projects_published: "Or gur svefg gb choyvfu n cebwrpg va guvf pbhefr!" + view_project: "Ivrj Cebwrpg" + edit_project: "Rqvg Cebwrpg" + + teacher: + assigning_course: "Nffvtavat pbhefr" + course_solution: "Pbhefr Fbyhgvba" + level_overview_solutions: "Yriry Bireivrj naq Fbyhgvbaf" + no_student_assigned: "Ab fghqragf unir orra nffvtarq guvf pbhefr." + paren_new: "(arj)" + teacher_dashboard: "Grnpure Qnfuobneq" # Anione + my_classes: "Zl Pynffrf" + courses: "Pbhefr Thvqrf" + enrollments: "Fghqrag Yvprafrf" + resources: "Erfbheprf" + help: "Uryc" + language: "Ynathntr" + edit_class_settings: "rqvg pynff frggvatf" + access_restricted: "Nppbhag Hcqngr Erdhverq" + teacher_account_required: "N grnpure nppbhag vf erdhverq gb npprff guvf pbagrag." + create_teacher_account: "Perngr Grnpure Nppbhag" + what_is_a_teacher_account: "Jung'f n Grnpure Nppbhag?" + teacher_account_explanation: "N PbqrPbzong Grnpure nppbhag nyybjf lbh gb frg hc pynffebbzf, zbavgbe fghqragf’ cebterff nf gurl jbex guebhtu pbhefrf, znantr yvprafrf naq npprff erfbheprf gb nvq va lbhe pheevphyhz-ohvyqvat." + current_classes: "Pheerag Pynffrf" + archived_classes: "Nepuvirq Pynffrf" + archived_classes_blurb: "Pynffrf pna or nepuvirq sbe shgher ersrerapr. Hanepuvir n pynff gb ivrj vg va gur Pheerag Pynffrf yvfg ntnva." + view_class: "ivrj pynff" + archive_class: "nepuvir pynff" + unarchive_class: "hanepuvir pynff" + unarchive_this_class: "Hanepuvir guvf pynff" + no_students_yet: "Guvf pynff unf ab fghqragf lrg." + no_students_yet_view_class: "Ivrj pynff gb nqq fghqragf." + try_refreshing: "(Lbh znl arrq gb erserfu gur cntr)" + create_new_class: "Perngr n Arj Pynff" + class_overview: "Pynff Bireivrj" # Ivrj Pynff cntr + avg_playtime: "Nirentr yriry cynlgvzr" + total_playtime: "Gbgny cynl gvzr" + avg_completed: "Nirentr yriryf pbzcyrgrq" + total_completed: "Gbgny yriryf pbzcyrgrq" + created: "Perngrq" + concepts_covered: "Pbaprcgf pbirerq" + earliest_incomplete: "Rneyvrfg vapbzcyrgr yriry" + latest_complete: "Yngrfg pbzcyrgrq yriry" + enroll_student: "Raebyy fghqrag" + apply_license: "Nccyl Yvprafr" + revoke_license: "Eribxr Yvprafr" + course_progress: "Pbhefr Cebterff" + not_applicable: "A/N" + edit: "rqvg" + edit_2: "Rqvg" + remove: "erzbir" + latest_completed: "Yngrfg pbzcyrgrq:" + sort_by: "Fbeg ol" + progress: "Cebterff" + completed: "Pbzcyrgrq" + practice: "Cenpgvpr" + started: "Fgnegrq" + click_to_view_progress: "pyvpx gb ivrj cebterff" + no_progress: "Ab cebterff" + not_required: "Abg erdhverq" + select_course: "Fryrpg pbhefr gb ivrj" + progress_color_key: "Cebterff pbybe xrl:" + level_in_progress: "Yriry va Cebterff" + level_not_started: "Yriry Abg Fgnegrq" + project_or_arena: "Cebwrpg be Neran" + students_not_assigned: "Fghqragf jub unir abg orra nffvtarq {{pbhefrAnzr}}" + course_overview: "Pbhefr Bireivrj" + copy_class_code: "Pbcl Pynff Pbqr" + class_code_blurb: "Fghqragf pna wbva lbhe pynff hfvat guvf Pynff Pbqr. Ab rznvy nqqerff vf erdhverq jura perngvat n Fghqrag nppbhag jvgu guvf Pynff Pbqr." + copy_class_url: "Pbcl Pynff HEY" + class_join_url_blurb: "Lbh pna nyfb cbfg guvf havdhr pynff HEY gb n funerq jrocntr." + add_students_manually: "Vaivgr Fghqragf ol Rznvy" + bulk_assign: "Ohyx-nffvta" + assigned_msg_1: "{{ahzoreNffvtarq}} fghqragf jrer nffvtarq {{pbhefrAnzr}}." + assigned_msg_2: "{{ahzoreRaebyyrq}} yvprafrf jrer nccyvrq." + assigned_msg_3: "Lbh abj unir {{erznvavatFcbgf}} ninvynoyr yvprafrf erznvavat." + assign_course: "Nffvta Pbhefr" + not_assigned_modal_title: "Pbhefrf jrer abg nffvtarq" + not_assigned_modal_starter_body_1: "Guvf pbhefr erdhverf n Fgnegre Yvprafr. Lbh qb abg unir rabhtu Fgnegre Yvprafrf ninvynoyr gb nffvta guvf pbhefr gb nyy __fryrpgrq__ fryrpgrq fghqragf." + not_assigned_modal_starter_body_2: "Chepunfr Fgnegre Yvprafrf gb tenag npprff gb guvf pbhefr." + not_assigned_modal_full_body_1: "Guvf pbhefr erdhverf n Shyy Yvprafr. Lbh qb abg unir rabhtu Shyy Yvprafrf ninvynoyr gb nffvta guvf pbhefr gb nyy __fryrpgrq__ fryrpgrq fghqragf." + not_assigned_modal_full_body_2: "Lbh bayl unir __ahzShyyYvprafrfNinvynoyr__ Shyy Yvprafrf ninvynoyr (__ahzFghqragfJvgubhgShyyYvprafrf__ fghqragf qb abg pheeragyl unir n Shyy Yvprafr npgvir)." + not_assigned_modal_full_body_3: "Cyrnfr fryrpg srjre fghqragf, be ernpu bhg gb __fhccbegRznvy__ sbe nffvfgnapr." + assign_to_selected_students: "Nffvta gb Fryrpgrq Fghqragf" + assigned: "Nffvtarq" + enroll_selected_students: "Raebyy Fryrpgrq Fghqragf" + no_students_selected: "Ab fghqragf jrer fryrpgrq." + show_students_from: "Fubj fghqragf sebz" # Raebyy fghqragf zbqny + apply_licenses_to_the_following_students: "Nccyl Yvprafrf gb gur Sbyybjvat Fghqragf" + students_have_licenses: "Gur sbyybjvat fghqragf nyernql unir yvprafrf nccyvrq:" + all_students: "Nyy Fghqragf" + apply_licenses: "Nccyl Yvprafrf" + not_enough_enrollments: "Abg rabhtu yvprafrf ninvynoyr." + enrollments_blurb: "Fghqragf ner erdhverq gb unir n yvprafr gb npprff nal pbagrag nsgre gur svefg pbhefr." + how_to_apply_licenses: "Ubj gb Nccyl Yvprafrf" + export_student_progress: "Rkcbeg Fghqrag Cebterff (PFI)" + send_email_to: "Fraq Erpbire Cnffjbeq Rznvy gb:" + email_sent: "Rznvy frag" + send_recovery_email: "Fraq erpbirel rznvy" + enter_new_password_below: "Ragre arj cnffjbeq orybj:" + change_password: "Punatr Cnffjbeq" + changed: "Punatrq" + available_credits: "Ninvynoyr Yvprafrf" + pending_credits: "Craqvat Yvprafrf" + empty_credits: "Rkunhfgrq Yvprafrf" + license_remaining: "yvprafr erznvavat" + licenses_remaining: "yvprafrf erznvavat" + one_license_used: "1 yvprafr unf orra hfrq" + num_licenses_used: "__ahzYvprafrfHfrq__ yvprafrf unir orra hfrq" + starter_licenses: "fgnegre yvprafrf" + start_date: "fgneg qngr:" + end_date: "raq qngr:" + get_enrollments_blurb: " Jr'yy uryc lbh ohvyq n fbyhgvba gung zrrgf gur arrqf bs lbhe pynff, fpubby be qvfgevpg." + how_to_apply_licenses_blurb_1: "Jura n grnpure nffvtaf n pbhefr gb n fghqrag sbe gur svefg gvzr, jr’yy nhgbzngvpnyyl nccyl n yvprafr. Hfr gur ohyx-nffvta qebcqbja va lbhe pynffebbz gb nffvta n pbhefr gb fryrpgrq fghqragf:" + how_to_apply_licenses_blurb_2: "Pna V fgvyy nccyl n yvprafr jvgubhg nffvtavat n pbhefr?" + how_to_apply_licenses_blurb_3: "Lrf — tb gb gur Yvprafr Fgnghf gno va lbhe pynffebbz naq pyvpx \"Nccyl Yvprafr\" gb nal fghqrag jub qbrf abg unir na npgvir yvprafr." + request_sent: "Erdhrfg Frag!" + license_status: "Yvprafr Fgnghf" + status_expired: "Rkcverq ba {{qngr}}" + status_not_enrolled: "Abg Raebyyrq" + status_enrolled: "Rkcverf ba {{qngr}}" + select_all: "Fryrpg Nyy" + project: "Cebwrpg" + project_gallery: "Cebwrpg Tnyyrel" + view_project: "Ivrj Cebwrpg" + unpublished: "(hachoyvfurq)" + view_arena_ladder: "Ivrj Neran Ynqqre" + resource_hub: "Erfbhepr Uho" + getting_started: "Trggvat Fgnegrq" + educator_faq: "Rqhpngbe SND" + educator_faq_desc: "Serdhragyl nfxrq dhrfgvbaf nobhg hfvat PbqrPbzong va lbhe pynffebbz be fpubby." + teacher_getting_started: "Grnpure Trggvat Fgnegrq Thvqr" + teacher_getting_started_desc: "Arj gb PbqrPbzong? Qbjaybnq guvf Grnpure Trggvat Fgnegrq Thvqr gb frg hc lbhe nppbhag, perngr lbhe svefg pynff, naq vaivgr fghqragf gb gur svefg pbhefr." + student_getting_started: "Fghqrag Dhvpx Fgneg Thvqr" + student_getting_started_desc: "Lbh pna qvfgevohgr guvf thvqr gb lbhe fghqragf orsber fgnegvat PbqrPbzong fb gung gurl pna snzvyvnevmr gurzfryirf jvgu gur pbqr rqvgbe. Guvf thvqr pna or hfrq sbe obgu Clguba naq WninFpevcg pynffebbzf." + cs1: "Vagebqhpgvba gb Pbzchgre Fpvrapr" + cs2: "Pbzchgre Fpvrapr 2" + cs3: "Pbzchgre Fpvrapr 3" + cs4: "Pbzchgre Fpvrapr 4" + cs5: "Pbzchgre Fpvrapr 5" + cs1_syntax_python: "Pbhefr 1 Clguba Flagnk Thvqr" + cs1_syntax_python_desc: "Purngfurrg jvgu ersreraprf gb pbzzba Clguba flagnk gung fghqragf jvyy yrnea va Vagebqhpgvba gb Pbzchgre Fpvrapr." + cs1_syntax_javascript: "Pbhefr 1 WninFpevcg Flagnk Thvqr" + cs1_syntax_javascript_desc: "Purngfurrg jvgu ersreraprf gb pbzzba WninFpevcg flagnk gung fghqragf jvyy yrnea va Vagebqhpgvba gb Pbzchgre Fpvrapr." + coming_soon: "Nqqvgvbany thvqrf pbzvat fbba!" + engineering_cycle_worksheet: "Ratvarrevat Plpyr Jbexfurrg" + engineering_cycle_worksheet_desc: "Hfr guvf jbexfurrg gb grnpu fghqragf gur onfvpf bs gur ratvarrevat plpyr: Nffrff, Qrfvta, Vzcyrzrag naq Qroht. Ersre gb gur pbzcyrgrq rknzcyr jbexfurrg nf n thvqr." + engineering_cycle_worksheet_link: "Ivrj rknzcyr" + progress_journal: "Cebterff Wbheany" + progress_journal_desc: "Rapbhentr fghqragf gb xrrc genpx bs gurve cebterff ivn n cebterff wbheany." + cs1_curriculum: "Vagebqhpgvba gb Pbzchgre Fpvrapr - Pheevphyhz Thvqr" + cs1_curriculum_desc: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 1." + arenas_curriculum: "Neran Yriryf - Grnpure Thvqr" + arenas_curriculum_desc: "Vafgehpgvbaf ba ubj gb eha Jnxxn Znhy, Pebff Obarf naq Cbjre Crnx zhygvcynlre neranf jvgu lbhe pynff." + cs2_curriculum: "Pbzchgre Fpvrapr 2 - Pheevphyhz Thvqr" + cs2_curriculum_desc: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 2." + cs3_curriculum: "Pbzchgre Fpvrapr 3 - Pheevphyhz Thvqr" + cs3_curriculum_desc: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 3." + cs4_curriculum: "Pbzchgre Fpvrapr 4 - Pheevphyhz Thvqr" + cs4_curriculum_desc: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 4." + cs5_curriculum_js: "Pbzchgre Fpvrapr 5 - Pheevphyhz Thvqr (WninFpevcg)" + cs5_curriculum_desc_js: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 5 pynffrf hfvat WninFpevcg." + cs5_curriculum_py: "Pbzchgre Fpvrapr 5 - Pheevphyhz Thvqr (Clguba)" + cs5_curriculum_desc_py: "Fpbcr naq frdhrapr, yrffba cynaf, npgvivgvrf naq zber sbe Pbhefr 5 pynffrf hfvat Clguba." + cs1_pairprogramming: "Cnve Cebtenzzvat Npgvivgl" + cs1_pairprogramming_desc: "Vagebqhpr fghqragf gb n cnve cebtenzzvat rkrepvfr gung jvyy uryc gurz orpbzr orggre yvfgraref naq pbzzhavpngbef." + gd1: "Tnzr Qrirybczrag 1" + gd1_guide: "Tnzr Qrirybczrag 1 - Cebwrpg Thvqr" + gd1_guide_desc: "Hfr guvf gb thvqr lbhe fghqragf nf gurl perngr gurve svefg funernoyr tnzr cebwrpg va 5 qnlf." + wd1: "Jro Qrirybczrag 1" + wd1_headlines: "Urnqyvarf & Urnqref Npgvivgl" + wd1_headlines_example: "Ivrj fnzcyr fbyhgvba" + wd1_headlines_desc: "Jul ner cnentencu naq urnqre gntf vzcbegnag? Hfr guvf npgvivgl gb fubj ubj jryy-pubfra urnqref znxr jro cntrf rnfvre gb ernq. Gurer ner znal pbeerpg fbyhgvbaf gb guvf!" + wd1_html_syntax: "UGZY Flagnk Thvqr" + wd1_html_syntax_desc: "Bar-cntr ersrerapr sbe gur UGZY fglyr fghqragf jvyy yrnea va Jro Qrirybczrag 1." + wd1_css_syntax: "PFF Flagnk Thvqr" + wd1_css_syntax_desc: "Bar-cntr ersrerapr sbe gur PFF naq Fglyr flagnk fghqragf jvyy yrnea va Jro Qrirybczrag 1." + wd2: "Jro Qrirybczrag 2" + wd2_jquery_syntax: "wDhrel Shapgvbaf Flagnk Thvqr" + wd2_jquery_syntax_desc: "Bar-cntr ersrerapr sbe gur wDhrel shapgvbaf fghqragf jvyy yrnea va Jro Qrirybczrag 2." + wd2_quizlet_worksheet: "Dhvmyrg Cynaavat Jbexfurrg" + wd2_quizlet_worksheet_instructions: "Ivrj vafgehpgvbaf & rknzcyrf" + wd2_quizlet_worksheet_desc: "Orsber lbhe fghqragf ohvyq gurve crefbanyvgl dhvm cebwrpg ng gur raq bs Jro Qrirybczrag 2, gurl fubhyq cyna bhg gurve dhvm dhrfgvbaf, bhgpbzrf naq erfcbafrf hfvat guvf jbexfurrg. Grnpuref pna qvfgevohgr gur vafgehpgvbaf naq rknzcyrf sbe fghqragf gb ersre gb." + student_overview: "Bireivrj" + student_details: "Fghqrag Qrgnvyf" + student_name: "Fghqrag Anzr" + no_name: "Ab anzr cebivqrq." + no_username: "Ab hfreanzr cebivqrq." + no_email: "Fghqrag unf ab rznvy nqqerff frg." + student_profile: "Fghqrag Cebsvyr" + playtime_detail: "Cynlgvzr Qrgnvy" + student_completed: "Fghqrag Pbzcyrgrq" + student_in_progress: "Fghqrag va Cebterff" + class_average: "Pynff Nirentr" + not_assigned: "unf abg orra nffvtarq gur sbyybjvat pbhefrf" + playtime_axis: "Cynlgvzr va Frpbaqf" + levels_axis: "Yriryf va" + student_state: "Ubj vf" + student_state_2: "qbvat?" + student_good: "vf qbvat jryy va" + student_good_detail: "Guvf fghqrag vf xrrcvat cnpr jvgu gur pynff." + student_warn: "zvtug arrq fbzr uryc va" + student_warn_detail: "Guvf fghqrag zvtug arrq fbzr uryc jvgu arj pbaprcgf gung unir orra vagebqhprq va guvf pbhefr." + student_great: "vf qbvat terng va" + student_great_detail: "Guvf fghqrag zvtug or n tbbq pnaqvqngr gb uryc bgure fghqragf jbexvat guebhtu guvf pbhefr." + full_license: "Shyy Yvprafr" + starter_license: "Fgnegre Yvprafr" + trial: "Gevny" + hoc_welcome: "Unccl Pbzchgre Fpvrapr Rqhpngvba Jrrx" + hoc_intro: "Gurer ner guerr jnlf sbe lbhe pynff gb cnegvpvcngr va Ubhe bs Pbqr jvgu PbqrPbzong" + hoc_self_led: "Frys-Yrq Tnzrcynl" + hoc_self_led_desc: "Fghqragf pna cynl guebhtu gjb Ubhe bs Pbqr PbqrPbzong ghgbevnyf ba gurve bja" + hoc_game_dev: "Tnzr Qrirybczrag" + hoc_and: "naq" + hoc_programming: "WninFpevcg/Clguba Cebtenzzvat" + hoc_teacher_led: "Grnpure-Yrq Yrffbaf" + hoc_teacher_led_desc1: "Qbjaybnq bhe" + hoc_teacher_led_link: "Vagebqhpgvba gb Pbzchgre Fpvrapr yrffba cynaf" + hoc_teacher_led_desc2: "gb vagebqhpr lbhe fghqragf gb cebtenzzvat pbaprcgf hfvat bssyvar npgvivgvrf" + hoc_group: "Tebhc Tnzrcynl" + hoc_group_desc_1: "Grnpuref pna hfr gur yrffbaf va pbawhapgvba jvgu bhe Vagebqhpgvba gb Pbzchgre Fpvrapr pbhefr gb genpx fghqrag cebterff. Frr bhe" + hoc_group_link: "Trggvat Fgnegrq Thvqr" + hoc_group_desc_2: "sbe zber qrgnvyf" + hoc_additional_desc1: "Sbe nqqvgvbany PbqrPbzong erfbheprf naq npgvivgvrf, frr bhe" + hoc_additional_desc2: "Dhrfgvbaf" + hoc_additional_contact: "Trg va gbhpu" + revoke_confirm: "Ner lbh fher lbh jnag gb eribxr n Shyy Yvprafr sebz {{fghqrag_anzr}}? Gur yvprafr jvyy orpbzr ninvynoyr gb nffvta gb nabgure fghqrag." + revoking: "Eribxvat..." + unused_licenses: "Lbh unir hahfrq Yvprafrf gung nyybj lbh gb nffvta fghqragf cnvq pbhefrf jura gurl'er ernql gb yrnea zber!" + remember_new_courses: "Erzrzore gb nffvta arj pbhefrf!" + more_info: "Zber Vasb" + how_to_assign_courses: "Ubj gb Nffvta Pbhefrf" + select_students: "Fryrpg Fghqragf" + select_instructions: "Pyvpx gur purpxobk arkg gb rnpu fghqrag lbh jnag gb nffvta pbhefrf gb." + choose_course: "Pubbfr Pbhefr" + choose_instructions: "Fryrpg gur pbhefr sebz gur qebcqbja zrah lbh’q yvxr gb nffvta, gura pyvpx “Nffvta gb Fryrpgrq Fghqragf.”" + push_projects: "Jr erpbzzraq nffvtavat Jro Qrirybczrag 1 be Tnzr Qrirybczrag 1 nsgre fghqragf unir svavfurq Vagebqhpgvba gb Pbzchgre Fpvrapr! Frr bhe {{erfbhepr_uho}} sbe zber qrgnvyf ba gubfr pbhefrf." + teacher_quest: "Grnpure'f Dhrfg sbe Fhpprff" + quests_complete: "Dhrfgf Pbzcyrgr" + teacher_quest_create_classroom: "Perngr Pynffebbz" + teacher_quest_add_students: "Nqq Fghqragf" + teacher_quest_teach_methods: "Uryc lbhe fghqragf yrnea ubj gb `pnyy zrgubqf`." + teacher_quest_teach_methods_step1: "Trg 75% bs ng yrnfg bar pynff guebhtu gur svefg yriry, __Qhatrbaf bs Xvgutneq__" + teacher_quest_teach_methods_step2: "Cevag bhg gur [Fghqrag Dhvpx Fgneg Thvqr](uggc://svyrf.pbqrpbzong.pbz/qbpf/erfbheprf/FghqragDhvpxFgnegThvqr.cqs) va gur Erfbhepr Uho." + teacher_quest_teach_strings: "Qba'g fgevat lbhe fghqragf nybat, grnpu gurz `fgevatf`." + teacher_quest_teach_strings_step1: "Trg 75% bs ng yrnfg bar pynff guebhtu __Gehr Anzrf__" + teacher_quest_teach_strings_step2: "Hfr gur Grnpure Yriry Fryrpgbe ba [Pbhefr Thvqrf](/grnpuref/pbhefrf) cntr gb cerivrj __Gehr Anzrf__." + teacher_quest_teach_loops: "Xrrc lbhe fghqragf va gur ybbc nobhg `ybbcf`." + teacher_quest_teach_loops_step1: "Trg 75% bs ng yrnfg bar pynff guebhtu __Sver Qnapvat__." + teacher_quest_teach_loops_step2: "Hfr gur __Ybbcf Npgvivgl__ va gur [PF1 Pheevphyhz thvqr](/grnpuref/erfbheprf/pf1) gb ervasbepr guvf pbaprcg." + teacher_quest_teach_variables: "Inel vg hc jvgu `inevnoyrf`." + teacher_quest_teach_variables_step1: "Trg 75% bs ng yrnfg bar pynff guebhtu __Xabja Rarzl__." + teacher_quest_teach_variables_step2: "Rapbhentr pbyynobengvba ol hfvat gur [Cnve Cebtenzzvat Npgvivgl](/grnpuref/erfbheprf/cnve-cebtenzzvat)." + teacher_quest_kithgard_gates_100: "Rfpncr gur Xvgutneq Tngrf jvgu lbhe pynff." + teacher_quest_kithgard_gates_100_step1: "Trg 75% bs ng yrnfg bar pynff guebhtu __Xvgutneq Tngrf__." + teacher_quest_kithgard_gates_100_step2: "Thvqr fghqragf gb guvax guebhtu uneq ceboyrzf hfvat gur [Ratvarrevat Plpyr Jbexfurrg](uggc://svyrf.pbqrpbzong.pbz/qbpf/erfbheprf/RatvarrevatPlpyrJbexfurrg.cqs)." + teacher_quest_wakka_maul_100: "Cercner gb qhry va Jnxxn Znhy." + teacher_quest_wakka_maul_100_step1: "Trg 75% bs ng yrnfg bar pynff gb __Jnxxn Znhy__." + teacher_quest_wakka_maul_100_step2: "Frr gur [Neran Thvqr](/grnpuref/erfbheprf/neranf) va gur [Erfbhepr Uho](/grnpuref/erfbheprf) sbe gvcf ba ubj gb eha n fhpprffshy neran qnl." + teacher_quest_reach_gamedev: "Rkcyber arj jbeyqf!" + teacher_quest_reach_gamedev_step1: "[Trg yvprafrf](/grnpuref/yvprafrf) fb gung lbhe fghqragf pna rkcyber arj jbeyqf, yvxr Tnzr Qrirybczrag naq Jro Qrirybczrag!" + teacher_quest_done: "Jnag lbhe fghqragf gb yrnea rira zber pbqr? Trg va gbhpu jvgu bhe [fpubby fcrpvnyvfgf](znvygb:fpubbyf@pbqrpbzong.pbz) gbqnl!" + teacher_quest_keep_going: "Xrrc tbvat! Urer'f jung lbh pna qb arkg:" + teacher_quest_more: "Frr nyy dhrfgf" + teacher_quest_less: "Frr srjre dhrfgf" + refresh_to_update: "(erserfu gur cntr gb frr hcqngrf)" + view_project_gallery: "Ivrj Cebwrpg Tnyyrel" + + share_licenses: + share_licenses: "Funer Yvprafrf" + shared_by: "Funerq Ol:" + add_teacher_label: "Ragre rknpg grnpure rznvy:" + add_teacher_button: "Nqq Grnpure" + subheader: "Lbh pna znxr lbhe yvprafrf ninvynoyr gb bgure grnpuref va lbhe betnavmngvba. Rnpu yvprafr pna bayl or hfrq sbe bar fghqrag ng n gvzr." + teacher_not_found: "Grnpure abg sbhaq. Cyrnfr znxr fher guvf grnpure unf nyernql perngrq n Grnpure Nppbhag." + teacher_not_valid: "Guvf vf abg n inyvq Grnpure Nppbhag. Bayl grnpure nppbhagf pna funer yvprafrf." + already_shared: "Lbh'ir nyernql funerq gurfr yvprafrf jvgu gung grnpure." + teachers_using_these: "Grnpuref jub pna npprff gurfr yvprafrf:" + footer: "Jura grnpuref eribxr yvprafrf sebz fghqragf, gur yvprafrf jvyy or erghearq gb gur funerq cbby sbe bgure grnpuref va guvf tebhc gb hfr." + you: "(lbh)" + one_license_used: "(1 yvprafr hfrq)" + licenses_used: "(__yvprafrfHfrq__ yvprafrf hfrq)" + more_info: "Zber vasb" + + sharing: + game: "Tnzr" + webpage: "Jrocntr" + your_students_preview: "Lbhe fghqragf jvyy pyvpx urer gb frr gurve svavfurq cebwrpgf! Haninvynoyr va grnpure cerivrj." + unavailable: "Yvax funevat abg ninvynoyr va grnpure cerivrj." + share_game: "Funer Guvf Tnzr" + share_web: "Funer Guvf Jrocntr" + victory_share_prefix: "Funer guvf yvax gb vaivgr lbhe sevraqf & snzvyl gb" + victory_share_game: "cynl lbhe tnzr yriry" + victory_share_web: "ivrj lbhe jrocntr" + victory_share_suffix: "." + victory_course_share_prefix: "Guvf yvax jvyy yrg lbhe sevraqf & snzvyl" + victory_course_share_game: "cynl gur tnzr" + victory_course_share_web: "ivrj gur jrocntr" + victory_course_share_suffix: "lbh whfg perngrq." + copy_url: "Pbcl HEY" + + game_dev: + creator: "Perngbe" + + web_dev: + image_gallery_title: "Vzntr Tnyyrel" + select_an_image: "Fryrpg na vzntr lbh jnag gb hfr" + scroll_down_for_more_images: "(Fpebyy qbja sbe zber vzntrf)" + copy_the_url: "Pbcl gur HEY orybj" + copy_the_url_description: "Hfrshy vs lbh jnag gb ercynpr na rkvfgvat vzntr." + copy_the_img_tag: "Pbcl gur gnt" + copy_the_img_tag_description: "Hfrshy vs lbh jnag gb vafreg n arj vzntr." + copy_url: "Pbcl HEY" + copy_img: "Pbcl " + how_to_copy_paste: "Ubj gb Pbcl/Cnfgr" + copy: "Pbcl" + paste: "Cnfgr" + back_to_editing: "Onpx gb Rqvgvat" + + classes: + archmage_title: "Nepuzntr" + archmage_title_description: "(Pbqre)" + archmage_summary: "Vs lbh ner n qrirybcre vagrerfgrq va pbqvat rqhpngvbany tnzrf, orpbzr na nepuzntr gb uryc hf ohvyq PbqrPbzong!" + artisan_title: "Negvfna" + artisan_title_description: "(Yriry Ohvyqre)" + artisan_summary: "Ohvyq naq funer yriryf sbe lbh naq lbhe sevraqf gb cynl. Orpbzr na Negvfna gb yrnea gur neg bs grnpuvat bguref gb cebtenz." + adventurer_title: "Nqiraghere" + adventurer_title_description: "(Yriry Cynlgrfgre)" + adventurer_summary: "Trg bhe arj yriryf (rira bhe fhofpevore pbagrag) sbe serr bar jrrx rneyl naq uryc hf jbex bhg ohtf orsber bhe choyvp eryrnfr." + scribe_title: "Fpevor" + scribe_title_description: "(Negvpyr Rqvgbe)" + scribe_summary: "Tbbq pbqr arrqf tbbq qbphzragngvba. Jevgr, rqvg, naq vzcebir gur qbpf ernq ol zvyyvbaf bs cynlref npebff gur tybor." + diplomat_title: "Qvcybzng" + diplomat_title_description: "(Genafyngbe)" + diplomat_summary: "PbqrPbzong vf ybpnyvmrq va 45+ ynathntrf ol bhe Qvcybzngf. Uryc hf bhg naq pbagevohgr genafyngvbaf." + ambassador_title: "Nzonffnqbe" + ambassador_title_description: "(Fhccbeg)" + ambassador_summary: "Gnzr bhe sbehz hfref naq cebivqr qverpgvba sbe gubfr jvgu dhrfgvbaf. Bhe nzonffnqbef ercerfrag PbqrPbzong gb gur jbeyq." + teacher_title: "Grnpure" + + editor: + main_title: "PbqrPbzong Rqvgbef" + article_title: "Negvpyr Rqvgbe" + thang_title: "Gunat Rqvgbe" + level_title: "Yriry Rqvgbe" + course_title: "Pbhefr Rqvgbe" + achievement_title: "Npuvrirzrag Rqvgbe" + poll_title: "Cbyy Rqvgbe" + back: "Onpx" + revert: "Erireg" + revert_models: "Erireg Zbqryf" + pick_a_terrain: "Cvpx N Greenva" + dungeon: "Qhatrba" + indoor: "Vaqbbe" + desert: "Qrfreg" + grassy: "Tenffl" + mountain: "Zbhagnva" + glacier: "Tynpvre" + small: "Fznyy" + large: "Ynetr" + fork_title: "Sbex Arj Irefvba" + fork_creating: "Perngvat Sbex..." + generate_terrain: "Trarengr Greenva" + more: "Zber" + wiki: "Jvxv" + live_chat: "Yvir Pung" + thang_main: "Znva" + thang_spritesheets: "Fcevgrfurrgf" + thang_colors: "Pbybef" + level_some_options: "Fbzr Bcgvbaf?" + level_tab_thangs: "Gunatf" + level_tab_scripts: "Fpevcgf" + level_tab_components: "Pbzcbaragf" + level_tab_systems: "Flfgrzf" + level_tab_docs: "Qbphzragngvba" + level_tab_thangs_title: "Pheerag Gunatf" + level_tab_thangs_all: "Nyy" + level_tab_thangs_conditions: "Fgnegvat Pbaqvgvbaf" + level_tab_thangs_add: "Nqq Gunatf" + level_tab_thangs_search: "Frnepu gunatf" + add_components: "Nqq Pbzcbaragf" + component_configs: "Pbzcbarag Pbasvthengvbaf" + config_thang: "Qbhoyr pyvpx gb pbasvther n gunat" + delete: "Qryrgr" + duplicate: "Qhcyvpngr" + stop_duplicate: "Fgbc Qhcyvpngr" + rotate: "Ebgngr" + level_component_tab_title: "Pheerag Pbzcbaragf" + level_component_btn_new: "Perngr Arj Pbzcbarag" + level_systems_tab_title: "Pheerag Flfgrzf" + level_systems_btn_new: "Perngr Arj Flfgrz" + level_systems_btn_add: "Nqq Flfgrz" + level_components_title: "Onpx gb Nyy Gunatf" + level_components_type: "Glcr" + level_component_edit_title: "Rqvg Pbzcbarag" + level_component_config_schema: "Pbasvt Fpurzn" + level_system_edit_title: "Rqvg Flfgrz" + create_system_title: "Perngr Arj Flfgrz" + new_component_title: "Perngr Arj Pbzcbarag" + new_component_field_system: "Flfgrz" + new_article_title: "Perngr n Arj Negvpyr" + new_thang_title: "Perngr n Arj Gunat Glcr" + new_level_title: "Perngr n Arj Yriry" + new_article_title_login: "Ybt Va gb Perngr n Arj Negvpyr" + new_thang_title_login: "Ybt Va gb Perngr n Arj Gunat Glcr" + new_level_title_login: "Ybt Va gb Perngr n Arj Yriry" + new_achievement_title: "Perngr n Arj Npuvrirzrag" + new_achievement_title_login: "Ybt Va gb Perngr n Arj Npuvrirzrag" + new_poll_title: "Perngr n Arj Cbyy" + new_poll_title_login: "Ybt Va gb Perngr n Arj Cbyy" + article_search_title: "Frnepu Negvpyrf Urer" + thang_search_title: "Frnepu Gunat Glcrf Urer" + level_search_title: "Frnepu Yriryf Urer" + achievement_search_title: "Frnepu Npuvrirzragf" + poll_search_title: "Frnepu Cbyyf" + read_only_warning2: "Abgr: lbh pna'g fnir nal rqvgf urer, orpnhfr lbh'er abg ybttrq va." + no_achievements: "Ab npuvrirzragf unir orra nqqrq sbe guvf yriry lrg." + achievement_query_misc: "Xrl npuvrirzrag bss bs zvfpryynarn" + achievement_query_goals: "Xrl npuvrirzrag bss bs yriry tbnyf" + level_completion: "Yriry Pbzcyrgvba" + pop_i18n: "Cbchyngr V18A" + tasks: "Gnfxf" + clear_storage: "Pyrne lbhe ybpny punatrf" + add_system_title: "Nqq Flfgrzf gb Yriry" + done_adding: "Qbar Nqqvat" + + article: + edit_btn_preview: "Cerivrj" + edit_article_title: "Rqvg Negvpyr" + + polls: + priority: "Cevbevgl" + + contribute: + page_title: "Pbagevohgvat" + intro_blurb: "PbqrPbzong vf 100% bcra fbhepr! Uhaqerqf bs qrqvpngrq cynlref unir urycrq hf ohvyq gur tnzr vagb jung vg vf gbqnl. Wbva hf naq jevgr gur arkg puncgre va PbqrPbzong'f dhrfg gb grnpu gur jbeyq gb pbqr!" + alert_account_message_intro: "Url gurer!" + alert_account_message: "Gb fhofpevor sbe pynff rznvyf, lbh'yy arrq gb or ybttrq va svefg." + archmage_introduction: "Bar bs gur orfg cnegf nobhg ohvyqvat tnzrf vf gurl flagurfvmr fb znal qvssrerag guvatf. Tencuvpf, fbhaq, erny-gvzr argjbexvat, fbpvny argjbexvat, naq bs pbhefr znal bs gur zber pbzzba nfcrpgf bs cebtenzzvat, sebz ybj-yriry qngnonfr znantrzrag, naq freire nqzvavfgengvba gb hfre snpvat qrfvta naq vagresnpr ohvyqvat. Gurer'f n ybg gb qb, naq vs lbh'er na rkcrevraprq cebtenzzre jvgu n unaxrevat gb ernyyl qvir vagb gur avggl-tevggl bs PbqrPbzong, guvf pynff zvtug or sbe lbh. Jr jbhyq ybir gb unir lbhe uryc ohvyqvat gur orfg cebtenzzvat tnzr rire." + class_attributes: "Pynff Nggevohgrf" + archmage_attribute_1_pref: "Xabjyrqtr va " + archmage_attribute_1_suf: ", be n qrfver gb yrnea. Zbfg bs bhe pbqr vf va guvf ynathntr. Vs lbh'er n sna bs Ehol be Clguba, lbh'yy srry evtug ng ubzr. Vg'f WninFpevcg, ohg jvgu n avpre flagnk." + archmage_attribute_2: "Fbzr rkcrevrapr va cebtenzzvat naq crefbany vavgvngvir. Jr'yy uryc lbh trg bevragrq, ohg jr pna'g fcraq zhpu gvzr genvavat lbh." + how_to_join: "Ubj Gb Wbva" + join_desc_1: "Nalbar pna uryc bhg! Whfg purpx bhg bhe " + join_desc_2: "gb trg fgnegrq, naq purpx gur obk orybj gb znex lbhefrys nf n oenir Nepuzntr naq trg gur yngrfg arjf ol rznvy. Jnag gb pung nobhg jung gb qb be ubj gb trg zber qrrcyl vaibyirq? " + join_desc_3: ", be svaq hf va bhe " + join_desc_4: "naq jr'yy tb sebz gurer!" + join_url_email: "Rznvy hf" + join_url_slack: "choyvp Fynpx punaary" + archmage_subscribe_desc: "Trg rznvyf ba arj pbqvat bccbeghavgvrf naq naabhaprzragf." + artisan_introduction_pref: "Jr zhfg pbafgehpg nqqvgvbany yriryf! Crbcyr or pynzbevat sbe zber pbagrag, naq jr pna bayl ohvyq fb znal bhefryirf. Evtug abj lbhe jbexfgngvba vf yriry bar; bhe yriry rqvgbe vf oneryl hfnoyr rira ol vgf perngbef, fb or jnel. Vs lbh unir ivfvbaf bs pnzcnvtaf fcnaavat sbe-ybbcf gb" + artisan_introduction_suf: ", gura guvf pynff zvtug or sbe lbh." + artisan_attribute_1: "Nal rkcrevrapr va ohvyqvat pbagrag yvxr guvf jbhyq or avpr, fhpu nf hfvat Oyvmmneq'f yriry rqvgbef. Ohg abg erdhverq!" + artisan_attribute_2: "N unaxrevat gb qb n jubyr ybg bs grfgvat naq vgrengvba. Gb znxr tbbq yriryf, lbh arrq gb gnxr vg gb bguref naq jngpu gurz cynl vg, naq or cercnerq gb svaq n ybg bs guvatf gb svk." + artisan_attribute_3: "Sbe gur gvzr orvat, raqhenapr ra cne jvgu na Nqiraghere. Bhe Yriry Rqvgbe vf fhcre ceryvzvanel naq sehfgengvat gb hfr. Lbh unir orra jnearq!" + artisan_join_desc: "Hfr gur Yriry Rqvgbe va gurfr fgrcf, tvir be gnxr:" + artisan_join_step1: "Ernq gur qbphzragngvba." + artisan_join_step2: "Perngr n arj yriry naq rkcyber rkvfgvat yriryf." + artisan_join_step3: "Svaq hf va bhe choyvp Fynpx punaary sbe uryc." + artisan_join_step4: "Cbfg lbhe yriryf ba gur sbehz sbe srrqonpx." + artisan_subscribe_desc: "Trg rznvyf ba yriry rqvgbe hcqngrf naq naabhaprzragf." + adventurer_introduction: "Yrg'f or pyrne nobhg lbhe ebyr: lbh ner gur gnax. Lbh'er tbvat gb gnxr urnil qnzntr. Jr arrq crbcyr gb gel bhg oenaq-arj yriryf naq uryc vqragvsl ubj gb znxr guvatf orggre. Gur cnva jvyy or rabezbhf; znxvat tbbq tnzrf vf n ybat cebprff naq ab bar trgf vg evtug gur svefg gvzr. Vs lbh pna raqher naq unir n uvtu pbafgvghgvba fpber, gura guvf pynff zvtug or sbe lbh." + adventurer_attribute_1: "N guvefg sbe yrneavat. Lbh jnag gb yrnea ubj gb pbqr naq jr jnag gb grnpu lbh ubj gb pbqr. Lbh'yy cebonoyl or qbvat zbfg bs gur grnpuvat va guvf pnfr, gubhtu." + adventurer_attribute_2: "Punevfzngvp. Or tragyr ohg negvphyngr nobhg jung arrqf vzcebivat, naq bssre fhttrfgvbaf ba ubj gb vzcebir." + adventurer_join_pref: "Rvgure trg gbtrgure jvgu (be erpehvg!) na Negvfna naq jbex jvgu gurz, be purpx gur obk orybj gb erprvir rznvyf jura gurer ner arj yriryf gb grfg. Jr'yy nyfb or cbfgvat nobhg yriryf gb erivrj ba bhe argjbexf yvxr" + adventurer_forum_url: "bhe sbehz" + adventurer_join_suf: "fb vs lbh cersre gb or abgvsvrq gubfr jnlf, fvta hc gurer!" + adventurer_subscribe_desc: "Trg rznvyf jura gurer ner arj yriryf gb grfg." + scribe_introduction_pref: "PbqrPbzong vfa'g whfg tbvat gb or n ohapu bs yriryf. Vg jvyy nyfb vapyhqr n erfbhepr sbe xabjyrqtr, n jvxv bs cebtenzzvat pbaprcgf gung yriryf pna ubbx vagb. Gung jnl engure guna rnpu Negvfna univat gb qrfpevor va qrgnvy jung n pbzcnevfba bcrengbe vf, gurl pna fvzcyl yvax gurve yriry gb gur Negvpyr qrfpevovat gurz gung vf nyernql jevggra sbe gur cynlre'f rqvsvpngvba. Fbzrguvat nybat gur yvarf bs jung gur " + scribe_introduction_url_mozilla: "Zbmvyyn Qrirybcre Argjbex" + scribe_introduction_suf: " unf ohvyg. Vs lbhe vqrn bs sha vf negvphyngvat gur pbaprcgf bs cebtenzzvat va Znexqbja sbez, gura guvf pynff zvtug or sbe lbh." + scribe_attribute_1: "Fxvyy va jbeqf vf cerggl zhpu nyy lbh arrq. Abg bayl tenzzne naq fcryyvat, ohg noyr gb pbairl pbzcyvpngrq vqrnf gb bguref." + contact_us_url: "Pbagnpg Hf" + scribe_join_description: "gryy hf n yvggyr nobhg lbhefrys, lbhe rkcrevrapr jvgu cebtenzzvat naq jung fbeg bs guvatf lbh'q yvxr gb jevgr nobhg. Jr'yy tb sebz gurer!" + scribe_subscribe_desc: "Trg rznvyf nobhg negvpyr jevgvat naabhaprzragf." + diplomat_introduction_pref: "Fb, vs gurer'f bar guvat jr yrnearq sebz gur " + diplomat_launch_url: "ynhapu va Bpgbore" + diplomat_introduction_suf: "vg'f gung gurer vf fvmrnoyr vagrerfg va PbqrPbzong va bgure pbhagevrf! Jr'er ohvyqvat n pbecf bs genafyngbef rntre gb ghea bar frg bs jbeqf vagb nabgure frg bs jbeqf gb trg PbqrPbzong nf npprffvoyr npebff gur jbeyq nf cbffvoyr. Vs lbh yvxr trggvat farnx crrxf ng hcpbzvat pbagrag naq trggvat gurfr yriryf gb lbhe sryybj angvbanyf NFNC, gura guvf pynff zvtug or sbe lbh." + diplomat_attribute_1: "Syhrapl va Ratyvfu naq gur ynathntr lbh jbhyq yvxr gb genafyngr gb. Jura pbairlvat pbzcyvpngrq vqrnf, vg'f vzcbegnag gb unir n fgebat tenfc va obgu!" + diplomat_i18n_page_prefix: "Lbh pna fgneg genafyngvat bhe yriryf ol tbvat gb bhe" + diplomat_i18n_page: "genafyngvbaf cntr" + diplomat_i18n_page_suffix: ", be bhe vagresnpr naq jrofvgr ba TvgUho." + diplomat_join_pref_github: "Svaq lbhe ynathntr ybpnyr svyr " + diplomat_github_url: "ba TvgUho" + diplomat_join_suf_github: ", rqvg vg bayvar, naq fhozvg n chyy erdhrfg. Nyfb, purpx guvf obk orybj gb xrrc hc-gb-qngr ba arj vagreangvbanyvmngvba qrirybczragf!" + diplomat_subscribe_desc: "Trg rznvyf nobhg v18a qrirybczragf naq yriryf gb genafyngr." + ambassador_introduction: "Guvf vf n pbzzhavgl jr'er ohvyqvat, naq lbh ner gur pbaarpgvbaf. Jr'ir tbg sbehzf, rznvyf, naq fbpvny argjbexf jvgu ybgf bs crbcyr gb gnyx jvgu naq uryc trg npdhnvagrq jvgu gur tnzr naq yrnea sebz. Vs lbh jnag gb uryc crbcyr trg vaibyirq naq unir sha, naq trg n tbbq srry bs gur chyfr bs PbqrPbzong naq jurer jr'er tbvat, gura guvf pynff zvtug or sbe lbh." + ambassador_attribute_1: "Pbzzhavpngvba fxvyyf. Or noyr gb vqragvsl gur ceboyrzf cynlref ner univat naq uryc gurz fbyir gurz. Nyfb, xrrc gur erfg bs hf vasbezrq nobhg jung cynlref ner fnlvat, jung gurl yvxr naq qba'g yvxr naq jnag zber bs!" + ambassador_join_desc: "gryy hf n yvggyr nobhg lbhefrys, jung lbh'ir qbar naq jung lbh'q or vagrerfgrq va qbvat. Jr'yy tb sebz gurer!" + ambassador_join_note_strong: "Abgr" + ambassador_join_note_desc: "Bar bs bhe gbc cevbevgvrf vf gb ohvyq zhygvcynlre jurer cynlref univat qvssvphygl fbyivat yriryf pna fhzzba uvture yriry jvmneqf gb uryc gurz. Guvf jvyy or n terng jnl sbe nzonffnqbef gb qb gurve guvat. Jr'yy xrrc lbh cbfgrq!" + ambassador_subscribe_desc: "Trg rznvyf ba fhccbeg hcqngrf naq zhygvcynlre qrirybczragf." + teacher_subscribe_desc: "Trg rznvyf ba hcqngrf naq naabhaprzragf sbe grnpuref." + changes_auto_save: "Punatrf ner fnirq nhgbzngvpnyyl jura lbh gbttyr purpxobkrf." + diligent_scribes: "Bhe Qvyvtrag Fpevorf:" + powerful_archmages: "Bhe Cbjreshy Nepuzntrf:" + creative_artisans: "Bhe Perngvir Negvfnaf:" + brave_adventurers: "Bhe Oenir Nqiragheref:" + translating_diplomats: "Bhe Genafyngvat Qvcybzngf:" + helpful_ambassadors: "Bhe Urycshy Nzonffnqbef:" + + ladder: + my_matches: "Zl Zngpurf" + simulate: "Fvzhyngr" + simulation_explanation: "Ol fvzhyngvat tnzrf lbh pna trg lbhe tnzr enaxrq snfgre!" + simulation_explanation_leagues: "Lbh jvyy znvayl uryc fvzhyngr tnzrf sbe nyyvrq cynlref va lbhe pynaf naq pbhefrf." + simulate_games: "Fvzhyngr Tnzrf!" + games_simulated_by: "Tnzrf fvzhyngrq ol lbh:" + games_simulated_for: "Tnzrf fvzhyngrq sbe lbh:" + games_in_queue: "Tnzrf pheeragyl va gur dhrhr:" + games_simulated: "Tnzrf fvzhyngrq" + games_played: "Tnzrf cynlrq" + ratio: "Engvb" + leaderboard: "Yrnqreobneq" + battle_as: "Onggyr nf " + summary_your: "Lbhe " + summary_matches: "Zngpurf - " + summary_wins: " Jvaf, " + summary_losses: " Ybffrf" + rank_no_code: "Ab Arj Pbqr gb Enax" + rank_my_game: "Enax Zl Tnzr!" + rank_submitting: "Fhozvggvat..." + rank_submitted: "Fhozvggrq sbe Enaxvat" + rank_failed: "Snvyrq gb Enax" + rank_being_ranked: "Tnzr Orvat Enaxrq" + rank_last_submitted: "fhozvggrq " + help_simulate: "Uryc fvzhyngr tnzrf?" + code_being_simulated: "Lbhe arj pbqr vf orvat fvzhyngrq ol bgure cynlref sbe enaxvat. Guvf jvyy erserfu nf arj zngpurf pbzr va." + no_ranked_matches_pre: "Ab enaxrq zngpurf sbe gur " + no_ranked_matches_post: " grnz! Cynl ntnvafg fbzr pbzcrgvgbef naq gura pbzr onpx urer gb trg lbhe tnzr enaxrq." + choose_opponent: "Pubbfr na Bccbarag" + select_your_language: "Fryrpg lbhe ynathntr!" + tutorial_play: "Cynl Ghgbevny" + tutorial_recommended: "Erpbzzraqrq vs lbh'ir arire cynlrq orsber" + tutorial_skip: "Fxvc Ghgbevny" + tutorial_not_sure: "Abg fher jung'f tbvat ba?" + tutorial_play_first: "Cynl gur Ghgbevny svefg." + simple_ai: "Fvzcyr PCH" + warmup: "Jnezhc" + friends_playing: "Sevraqf Cynlvat" + log_in_for_friends: "Ybt va gb cynl jvgu lbhe sevraqf!" + social_connect_blurb: "Pbaarpg naq cynl ntnvafg lbhe sevraqf!" + invite_friends_to_battle: "Vaivgr lbhe sevraqf gb wbva lbh va onggyr!" + fight: "Svtug!" + watch_victory: "Jngpu lbhe ivpgbel" + defeat_the: "Qrsrng gur" + watch_battle: "Jngpu gur onggyr" + tournament_started: ", fgnegrq" + tournament_ends: "Gbheanzrag raqf" + tournament_ended: "Gbheanzrag raqrq" + tournament_rules: "Gbheanzrag Ehyrf" + tournament_blurb: "Jevgr pbqr, pbyyrpg tbyq, ohvyq nezvrf, pehfu sbrf, jva cevmrf, naq hctenqr lbhe pnerre va bhe $40,000 Terrq gbheanzrag! Purpx bhg gur qrgnvyf" + tournament_blurb_criss_cross: "Jva ovqf, pbafgehpg cnguf, bhgjvg bccbaragf, teno trzf, naq hctenqr lbhe pnerre va bhe Pevff-Pebff gbheanzrag! Purpx bhg gur qrgnvyf" + tournament_blurb_zero_sum: "Hayrnfu lbhe pbqvat perngvivgl va obgu tbyq tngurevat naq onggyr gnpgvpf va guvf nycvar zveebe zngpu orgjrra erq fbeprere naq oyhr fbeprere. Gur gbheanzrag ortna ba Sevqnl, Znepu 27 naq jvyy eha hagvy Zbaqnl, Ncevy 6 ng 5CZ CQG. Pbzcrgr sbe sha naq tybel! Purpx bhg gur qrgnvyf" + tournament_blurb_ace_of_coders: "Onggyr vg bhg va gur sebmra tynpvre va guvf qbzvangvba-fglyr zveebe zngpu! Gur gbheanzrag ortna ba Jrqarfqnl, Frcgrzore 16 naq jvyy eha hagvy Jrqarfqnl, Bpgbore 14 ng 5CZ CQG. Purpx bhg gur qrgnvyf" + tournament_blurb_blog: "ba bhe oybt" + rules: "Ehyrf" + winners: "Jvaaref" + league: "Yrnthr" + red_ai: "Erq PCH" # "Erq NV Jvaf", ng raq bs zhygvcynlre zngpu cynlonpx + blue_ai: "Oyhr PCH" + wins: "Jvaf" # Ng raq bs zhygvcynlre zngpu cynlonpx + humans: "Erq" # Ynqqre cntr qvfcynl grnz anzr + ogres: "Oyhr" + + user: + stats: "Fgngf" + singleplayer_title: "Fvatyrcynlre Yriryf" + multiplayer_title: "Zhygvcynlre Yriryf" + achievements_title: "Npuvrirzragf" + last_played: "Ynfg Cynlrq" + status: "Fgnghf" + status_completed: "Pbzcyrgrq" + status_unfinished: "Hasvavfurq" + no_singleplayer: "Ab Fvatyrcynlre tnzrf cynlrq lrg." + no_multiplayer: "Ab Zhygvcynlre tnzrf cynlrq lrg." + no_achievements: "Ab Npuvrirzragf rnearq lrg." + favorite_prefix: "Snibevgr ynathntr vf " + favorite_postfix: "." + not_member_of_clans: "Abg n zrzore bs nal pynaf lrg." + + achievements: + last_earned: "Ynfg Rnearq" + amount_achieved: "Nzbhag" + achievement: "Npuvrirzrag" + current_xp_prefix: "" + current_xp_postfix: " va gbgny" + new_xp_prefix: "" + new_xp_postfix: " rnearq" + left_xp_prefix: "" + left_xp_infix: " hagvy yriry " + left_xp_postfix: "" + + account: + payments: "Cnlzragf" + prepaid_codes: "Cercnvq Pbqrf" + purchased: "Chepunfrq" + subscription: "Fhofpevcgvba" + invoices: "Vaibvprf" + service_apple: "Nccyr" + service_web: "Jro" + paid_on: "Cnvq Ba" + service: "Freivpr" + price: "Cevpr" + gems: "Trzf" + active: "Npgvir" + subscribed: "Fhofpevorq" + unsubscribed: "Hafhofpevorq" + active_until: "Npgvir Hagvy" + cost: "Pbfg" + next_payment: "Arkg Cnlzrag" + card: "Pneq" + status_unsubscribed_active: "Lbh'er abg fhofpevorq naq jba'g or ovyyrq, ohg lbhe nppbhag vf fgvyy npgvir sbe abj." + status_unsubscribed: "Trg npprff gb arj yriryf, urebrf, vgrzf, naq obahf trzf jvgu n PbqrPbzong fhofpevcgvba!" + not_yet_verified: "Abg lrg irevsvrq." + resend_email: "Erfraq rznvy" + email_sent: "Rznvy frag! Purpx lbhe vaobk." + verifying_email: "Irevslvat lbhe rznvy nqqerff..." + successfully_verified: "Lbh'ir fhpprffshyyl irevsvrq lbhe rznvy nqqerff!" + verify_error: "Fbzrguvat jrag jebat jura irevslvat lbhe rznvy :(" + + account_invoices: + amount: "Nzbhag va HF qbyynef" + declined: "Lbhe pneq jnf qrpyvarq" + invalid_amount: "Cyrnfr ragre n HF qbyyne nzbhag." + not_logged_in: "Ybt va be perngr na nppbhag gb npprff vaibvprf." + pay: "Cnl Vaibvpr" + purchasing: "Chepunfvat..." + retrying: "Freire reebe, ergelvat." + success: "Fhpprffshyyl cnvq. Gunaxf!" + + account_prepaid: + purchase_code: "Chepunfr n Fhofpevcgvba Pbqr" + purchase_code1: "Fhofpevcgvba Pbqrf pna or erqrrzrq gb nqq cerzvhz fhofpevcgvba gvzr gb bar be zber nppbhagf sbe gur Ubzr irefvba bs PbqrPbzong." # + purchase_code2: "Rnpu PbqrPbzong nppbhag pna bayl erqrrz n cnegvphyne Fhofpevcgvba Pbqr bapr." + purchase_code3: "Fhofpevcgvba Pbqr zbaguf jvyy or nqqrq gb gur raq bs nal rkvfgvat fhofpevcgvba ba gur nppbhag." + purchase_code4: "Fhofpevcgvba Pbqrf ner sbe nppbhagf cynlvat gur Ubzr irefvba bs PbqrPbzong, gurl pnaabg or hfrq va cynpr bs Fghqrag Yvprafrf sbe gur Pynffebbz irefvba." + purchase_code5: "Sbe zber vasbezngvba ba Fghqrag Yvprafrf, ernpu bhg gb" + users: "Hfref" + months: "Zbaguf" + purchase_total: "Gbgny" + purchase_button: "Fhozvg Chepunfr" + your_codes: "Lbhe Pbqrf" + redeem_codes: "Erqrrz n Fhofpevcgvba Pbqr" + prepaid_code: "Cercnvq Pbqr" + lookup_code: "Ybbxhc cercnvq pbqr" + apply_account: "Nccyl gb lbhe nppbhag" + copy_link: "Lbh pna pbcl gur pbqr'f yvax naq fraq vg gb fbzrbar." + quantity: "Dhnagvgl" + redeemed: "Erqrrzrq" + no_codes: "Ab pbqrf lrg!" + you_can1: "Lbh pna" + you_can2: "chepunfr n cercnvq pbqr" + you_can3: "gung pna or nccyvrq gb lbhe bja nppbhag be tvira gb bguref." + + loading_error: + could_not_load: "Reebe ybnqvat sebz freire" + connection_failure: "Pbaarpgvba Snvyrq" + connection_failure_desc: "Vg qbrfa’g ybbx yvxr lbh’er pbaarpgrq gb gur vagrearg! Purpx lbhe argjbex pbaarpgvba naq gura erybnq guvf cntr." + login_required: "Ybtva Erdhverq" + login_required_desc: "Lbh arrq gb or ybttrq va gb npprff guvf cntr." + unauthorized: "Lbh arrq gb or fvtarq va. Qb lbh unir pbbxvrf qvfnoyrq?" + forbidden: "Sbeovqqra" + forbidden_desc: "Bu ab, gurer’f abguvat jr pna fubj lbh urer! Znxr fher lbh’er ybttrq vagb gur pbeerpg nppbhag, be ivfvg bar bs gur yvaxf orybj gb trg onpx gb cebtenzzvat!" + not_found: "Abg Sbhaq" + not_found_desc: "Uz, gurer’f abguvat urer. Ivfvg bar bs gur sbyybjvat yvaxf gb trg onpx gb cebtenzzvat!" + not_allowed: "Zrgubq abg nyybjrq." + timeout: "Freire Gvzrbhg" + conflict: "Erfbhepr pbasyvpg." + bad_input: "Onq vachg." + server_error: "Freire reebe." + unknown: "Haxabja Reebe" + error: "REEBE" + general_desc: "Fbzrguvat jrag jebat, naq vg’f cebonoyl bhe snhyg. Gel jnvgvat n ovg naq gura erserfuvat gur cntr, be ivfvg bar bs gur sbyybjvat yvaxf gb trg onpx gb cebtenzzvat!" + + resources: + level: "Yriry" + patch: "Cngpu" + patches: "Cngpurf" + system: "Flfgrz" + systems: "Flfgrzf" + component: "Pbzcbarag" + components: "Pbzcbaragf" + hero: "Ureb" + campaigns: "Pnzcnvtaf" + + concepts: + advanced_css_rules: "Nqinaprq PFF Ehyrf" + advanced_css_selectors: "Nqinaprq PFF Fryrpgbef" + advanced_html_attributes: "Nqinaprq UGZY Nggevohgrf" + advanced_html_tags: "Nqinaprq UGZY Gntf" + algorithm_average: "Nytbevguz Nirentr" + algorithm_find_minmax: "Nytbevguz Svaq Zva/Znk" + algorithm_search_binary: "Nytbevguz Frnepu Ovanel" + algorithm_search_graph: "Nytbevguz Frnepu Tencu" + algorithm_sort: "Nytbevguz Fbeg" + algorithm_sum: "Nytbevguz Fhz" + arguments: "Nethzragf" + arithmetic: "Nevguzrgvp" + array_2d: "2Q Neenl" + array_index: "Neenl Vaqrkvat" + array_iterating: "Vgrengvat Bire Neenlf" + array_literals: "Neenl Yvgrenyf" + array_searching: "Neenl Frnepuvat" + array_sorting: "Neenl Fbegvat" + arrays: "Neenlf" + basic_css_rules: "Onfvp PFF ehyrf" + basic_css_selectors: "Onfvp PFF fryrpgbef" + basic_html_attributes: "Onfvp UGZY Nggevohgrf" + basic_html_tags: "Onfvp UGZY Gntf" + basic_syntax: "Onfvp Flagnk" + binary: "Ovanel" + boolean_and: "Obbyrna Naq" + boolean_equality: "Obbyrna Rdhnyvgl" + boolean_greater_less: "Obbyrna Terngre/Yrff" + boolean_logic_shortcircuit: "Obbyrna Ybtvp Fubegpvephvgvat" + boolean_not: "Obbyrna Abg" + boolean_operator_precedence: "Obbyrna Bcrengbe Cerprqrapr" + boolean_or: "Obbyrna Be" + bootstrap: "Obbgfgenc" + break_statements: "Oernx Fgngrzragf" + classes: "Pynffrf" + continue_statements: "Pbagvahr Fgngrzragf" + dom_events: "QBZ Riragf" + dynamic_styling: "Qlanzvp Fglyvat" + event_concurrency: "Rirag Pbapheerapl" + event_data: "Rirag Qngn" + event_handlers: "Rirag Unaqyref" + for_loops: "Sbe Ybbcf" + for_loops_nested: "Arfgrq Sbe Ybbcf" + for_loops_range: "Sbe Ybbcf Enatr" + functions: "Shapgvbaf" + game_ai: "Tnzr NV" + game_goals: "Tnzr Tbnyf" + game_spawn: "Tnzr Fcnja" + graphics: "Tencuvpf" + graphs: "Tencuf" + heaps: "Urncf" + if_else_statements: "Vs/Ryfr Fgngrzragf" + if_statements: "Vs Fgngrzragf" + if_statements_nested: "Arfgrq Vs Fgngrzagf" + indexing: "Neenl Vaqrkrf" + input_handling_flags: "Vachg Unaqyvat - Syntf" + input_handling_keyboard: "Vachg Unaqyvat - Xrlobneq" + input_handling_mouse: "Vachg Unaqyvat - Zbhfr" + intermediate_css_rules: "Vagrezrqvngr PFF Ehyrf" + intermediate_css_selectors: "Vagrezrqvngr PFF Fryrpgbef" + intermediate_html_attributes: "Vagrezrqvngr UGZY Nggevohgrf" + intermediate_html_tags: "Vagrezrqvngr UGZY Gntf" + jquery: "wDhrel" + jquery_animations: "wDhrel Navzngvbaf" + jquery_filtering: "wDhrel Ryrzrag Svygrevat" + jquery_selectors: "wDhrel Fryrpgbef" + length: "Neenl Yratgu" + math_geometry: "Trbzrgel" + math_operations: "Zngu Yvoenel Bcrengvbaf" + math_trigonometry: "Gevtbabzrgel" + object_literals: "Bowrpg Yvgrenyf" + parameters: "Cnenzrgref" + property_access: "Npprffvat Cebcregvrf" + property_assignment: "Nffvtavat Cebcregvrf" + queues: "Qngn Fgehpgherf - Dhrhrf" + reading_docs: "Ernqvat gur Qbpf" + recursion: "Erphefvba" + return_statements: "Erghea Fgngrzragf" + stacks: "Qngn Fgehpgherf - Fgnpxf" + strings: "Fgevatf" + strings_concatenation: "Fgevat Pbapngrangvba" + strings_substrings: "Fhofgevat" + trees: "Qngn Fgehpgherf - Gerrf" + variables: "Inevnoyrf" + vectors: "Irpgbef" + while_condition_loops: "Juvyr Ybbcf jvgu Pbaqvgvbanyf" + while_loops_simple: "Juvyr Ybbcf" + while_loops_nested: "Arfgrq Juvyr Ybbcf" + xy_coordinates: "Pnegrfvna Pbbeqvangrf" + advanced_strings: "Nqinaprq Fgevatf" # Erfg bs pbaprcgf ner qrcerpngrq + algorithms: "Nytbevguzf" + boolean_logic: "Obbyrna Ybtvp" + basic_html: "Onfvp UGZY" + basic_css: "Onfvp PFF" + basic_web_scripting: "Onfvp Jro Fpevcgvat" + intermediate_html: "Vagrezrqvngr UGZY" + intermediate_css: "Vagrezrqvngr PFF" + intermediate_web_scripting: "Vagrezrqvngr Jro Fpevcgvat" + advanced_html: "Nqinaprq UGZY" + advanced_css: "Nqinaprq PFF" + advanced_web_scripting: "Nqinaprq Jro Fpevcgvat" + input_handling: "Vachg Unaqyvat" + while_loops: "Juvyr Ybbcf" + place_game_objects: "Cynpr tnzr bowrpgf" + construct_mazes: "Pbafgehpg znmrf" + create_playable_game: "Perngr n cynlnoyr, funenoyr tnzr cebwrpg" + alter_existing_web_pages: "Nygre rkvfgvat jro cntrf" + create_sharable_web_page: "Perngr n funenoyr jro cntr" + basic_input_handling: "Onfvp Vachg Unaqyvat" + basic_game_ai: "Onfvp Tnzr NV" + basic_javascript: "Onfvp WninFpevcg" + basic_event_handling: "Onfvp Rirag Unaqyvat" + create_sharable_interactive_web_page: "Perngr n funenoyr vagrenpgvir jro cntr" + + delta: + added: "Nqqrq" + modified: "Zbqvsvrq" + not_modified: "Abg Zbqvsvrq" + deleted: "Qryrgrq" + moved_index: "Zbirq Vaqrk" + text_diff: "Grkg Qvss" + merge_conflict_with: "ZRETR PBASYVPG JVGU" + no_changes: "Ab Punatrf" + + legal: + page_title: "Yrtny" + opensource_intro: "PbqrPbzong vf pbzcyrgryl bcra fbhepr." + opensource_description_prefix: "Purpx bhg " + github_url: "bhe TvgUho" + opensource_description_center: "naq uryc bhg vs lbh yvxr! PbqrPbzong vf ohvyg ba qbmraf bs bcra fbhepr cebwrpgf, naq jr ybir gurz. Frr " + archmage_wiki_url: "bhe Nepuzntr jvxv" + opensource_description_suffix: "sbe n yvfg bs gur fbsgjner gung znxrf guvf tnzr cbffvoyr." + practices_title: "Erfcrpgshy Orfg Cenpgvprf" + practices_description: "Gurfr ner bhe cebzvfrf gb lbh, gur cynlre, va fyvtugyl yrff yrtnyrfr." + privacy_title: "Cevinpl" + privacy_description: "Jr jvyy abg fryy nal bs lbhe crefbany vasbezngvba." + security_title: "Frphevgl" + security_description: "Jr fgevir gb xrrc lbhe crefbany vasbezngvba fnsr. Nf na bcra fbhepr cebwrpg, bhe fvgr vf serryl bcra gb nalbar gb erivrj naq vzcebir bhe frphevgl flfgrzf." + email_title: "Rznvy" + email_description_prefix: "Jr jvyy abg vahaqngr lbh jvgu fcnz. Guebhtu" + email_settings_url: "lbhe rznvy frggvatf" + email_description_suffix: "be guebhtu yvaxf va gur rznvyf jr fraq, lbh pna punatr lbhe cersreraprf naq rnfvyl hafhofpevor ng nal gvzr." + cost_title: "Pbfg" + cost_description: "PbqrPbzong vf serr gb cynl sbe nyy bs vgf pber yriryf, jvgu n ${{cevpr}} HFQ/zb fhofpevcgvba sbe npprff gb rkgen yriry oenapurf naq {{trzf}} obahf trzf cre zbagu. Lbh pna pnapry jvgu n pyvpx, naq jr bssre n 100% zbarl-onpx thnenagrr." + copyrights_title: "Pbclevtugf naq Yvprafrf" + contributor_title: "Pbagevohgbe Yvprafr Nterrzrag" + contributor_description_prefix: "Nyy pbagevohgvbaf, obgu ba gur fvgr naq ba bhe TvgUho ercbfvgbel, ner fhowrpg gb bhe" + cla_url: "PYN" + contributor_description_suffix: "gb juvpu lbh fubhyq nterr orsber pbagevohgvat." + code_title: "Pbqr - ZVG" + code_description_prefix: "Nyy pbqr bjarq ol PbqrPbzong be ubfgrq ba pbqrpbzong.pbz, obgu va gur TvgUho ercbfvgbel be va gur pbqrpbzong.pbz qngnonfr, vf yvprafrq haqre gur" + mit_license_url: "ZVG yvprafr" + code_description_suffix: "Guvf vapyhqrf nyy pbqr va Flfgrzf naq Pbzcbaragf gung ner znqr ninvynoyr ol PbqrPbzong sbe gur checbfr bs perngvat yriryf." + art_title: "Neg/Zhfvp - Perngvir Pbzzbaf " + art_description_prefix: "Nyy pbzzba pbagrag vf ninvynoyr haqre gur" + cc_license_url: "Perngvir Pbzzbaf Nggevohgvba 4.0 Vagreangvbany Yvprafr" + art_description_suffix: "Pbzzba pbagrag vf nalguvat znqr trarenyyl ninvynoyr ol PbqrPbzong sbe gur checbfr bs perngvat Yriryf. Guvf vapyhqrf:" + art_music: "Zhfvp" + art_sound: "Fbhaq" + art_artwork: "Negjbex" + art_sprites: "Fcevgrf" + art_other: "Nal naq nyy bgure aba-pbqr perngvir jbexf gung ner znqr ninvynoyr jura perngvat Yriryf." + art_access: "Pheeragyl gurer vf ab havirefny, rnfl flfgrz sbe srgpuvat gurfr nffrgf. Va trareny, srgpu gurz sebz gur HEYf nf hfrq ol gur fvgr, pbagnpg hf sbe nffvfgnapr, be uryc hf va rkgraqvat gur fvgr gb znxr gurfr nffrgf zber rnfvyl npprffvoyr." + art_paragraph_1: "Sbe nggevohgvba, cyrnfr anzr naq yvax gb pbqrpbzong.pbz arne jurer gur fbhepr vf hfrq be jurer nccebcevngr sbe gur zrqvhz. Sbe rknzcyr:" + use_list_1: "Vs hfrq va n zbivr be nabgure tnzr, vapyhqr pbqrpbzong.pbz va gur perqvgf." + use_list_2: "Vs hfrq ba n jrofvgr, vapyhqr n yvax arne gur hfntr, sbe rknzcyr haqrearngu na vzntr, be va n trareny nggevohgvbaf cntr jurer lbh zvtug nyfb zragvba bgure Perngvir Pbzzbaf jbexf naq bcra fbhepr fbsgjner orvat hfrq ba gur fvgr. Fbzrguvat gung'f nyernql pyrneyl ersrerapvat PbqrPbzong, fhpu nf n oybt cbfg zragvbavat PbqrPbzong, qbrf abg arrq fbzr frcnengr nggevohgvba." + art_paragraph_2: "Vs gur pbagrag orvat hfrq vf perngrq abg ol PbqrPbzong ohg vafgrnq ol n hfre bs pbqrpbzong.pbz, nggevohgr gurz vafgrnq, naq sbyybj nggevohgvba qverpgvbaf cebivqrq va gung erfbhepr'f qrfpevcgvba vs gurer ner nal." + rights_title: "Evtugf Erfreirq" + rights_desc: "Nyy evtugf ner erfreirq sbe Yriryf gurzfryirf. Guvf vapyhqrf" + rights_scripts: "Fpevcgf" + rights_unit: "Havg pbasvthengvba" + rights_writings: "Jevgvatf" + rights_media: "Zrqvn (fbhaqf, zhfvp) naq nal bgure perngvir pbagrag znqr fcrpvsvpnyyl sbe gung Yriry naq abg znqr trarenyyl ninvynoyr jura perngvat Yriryf." + rights_clarification: "Gb pynevsl, nalguvat gung vf znqr ninvynoyr va gur Yriry Rqvgbe sbe gur checbfr bs znxvat yriryf vf haqre PP, jurernf gur pbagrag perngrq jvgu gur Yriry Rqvgbe be hcybnqrq va gur pbhefr bs perngvba bs Yriryf vf abg." + nutshell_title: "Va n Ahgfuryy" + nutshell_description: "Nal erfbheprf jr cebivqr va gur Yriry Rqvgbe ner serr gb hfr nf lbh yvxr sbe perngvat Yriryf. Ohg jr erfreir gur evtug gb erfgevpg qvfgevohgvba bs gur Yriryf gurzfryirf (gung ner perngrq ba pbqrpbzong.pbz) fb gung gurl znl or punetrq sbe." + canonical: "Gur Ratyvfu irefvba bs guvf qbphzrag vf gur qrsvavgvir, pnabavpny irefvba. Vs gurer ner nal qvfpercnapvrf orgjrra genafyngvbaf, gur Ratyvfu qbphzrag gnxrf cerprqrapr." + third_party_title: "Guveq Cnegl Freivprf" + third_party_description: "PbqrPbzong hfrf gur sbyybjvat guveq cnegl freivprf (nzbat bguref):" + + ladder_prizes: + title: "Gbheanzrag Cevmrf" # Guvf frpgvba jnf sbe na byq gbheanzrag naq qbrfa'g arrq arj genafyngvbaf abj. + blurb_1: "Gurfr cevmrf jvyy or njneqrq nppbeqvat gb" + blurb_2: "gur gbheanzrag ehyrf" + blurb_3: "gb gur gbc uhzna naq bter cynlref." + blurb_4: "Gjb grnzf zrnaf qbhoyr gur cevmrf!" + blurb_5: "(Gurer jvyy or gjb svefg cynpr jvaaref, gjb frpbaq-cynpr jvaaref, rgp.)" + rank: "Enax" + prizes: "Cevmrf" + total_value: "Gbgny Inyhr" + in_cash: "va pnfu" + custom_wizard: "Phfgbz PbqrPbzong Jvmneq" + custom_avatar: "Phfgbz PbqrPbzong ningne" + heap: "sbe fvk zbaguf bs \"Fgneghc\" npprff" + credits: "perqvgf" + one_month_coupon: "pbhcba: pubbfr rvgure Envyf be UGZY" + one_month_discount: "qvfpbhag, 30% bss: pubbfr rvgure Envyf be UGZY" + license: "yvprafr" + oreilly: "robbx bs lbhe pubvpr" + + calendar: + year: "Lrne" + day: "Qnl" + month: "Zbagu" + january: "Wnahnel" + february: "Sroehnel" + march: "Znepu" + april: "Ncevy" + may: "Znl" + june: "Whar" + july: "Whyl" + august: "Nhthfg" + september: "Frcgrzore" + october: "Bpgbore" + november: "Abirzore" + december: "Qrprzore" + + code_play_create_account_modal: + title: "Lbh qvq vg!" # Guvf frpgvba vf bayl arrqrq va HF, HX, Zrkvpb, Vaqvn, naq Treznal + body: "Lbh ner abj ba lbhe jnl gb orpbzvat n znfgre pbqre. Fvta hc gb erprvir na rkgen 100 Trzf & lbh jvyy nyfb or ragrerq sbe n punapr gb jva $2,500 & bgure Yrabib Cevmrf." + sign_up: "Fvta hc & xrrc pbqvat ▶" + victory_sign_up_poke: "Perngr n serr nppbhag gb fnir lbhe pbqr & or ragrerq sbe n punapr gb jva cevmrf!" + victory_sign_up: "Fvta hc & or ragrerq gb jva $2,500" + + server_error: + email_taken: 'Rznvy nyernql gnxra' + username_taken: 'Hfreanzr nyernql gnxra' + + esper: + line_no: "Yvar $1: " + reference_error: "ErsreraprReebe: " + argument_error: "NethzragReebe: " + type_error: "GlcrReebe: " + error: "Reebe: " + x_not_a_function: "$1 vf abg n shapgvba" + x_not_defined: "$1 vf abg qrsvarq" + spelling_issues: "Ybbx bhg sbe fcryyvat vffhrf: qvq lbh zrna `$1` vafgrnq bs `$2`?" + capitalization_issues: "Ybbx bhg sbe pncvgnyvmngvba: `$1` fubhyq or `$2`." + py_empty_block: "Rzcgl $1. Chg 4 fcnprf va sebag bs fgngrzragf vafvqr gur $2 fgngrzrag." + fx_missing_paren: "Vs lbh jnag gb pnyy `$1` nf n shapgvba, lbh arrq `()`'f" + unmatched_token: "Hazngpurq `$1`. Rirel bcravat `$2` arrqf n pybfvat `$3` gb zngpu vg." + unterminated_string: "Hagrezvangrq fgevat. Nqq n zngpuvat `\"` ng gur raq bs lbhe fgevat." + missing_semicolon: "Zvffvat frzvpbyba." + missing_quotes: "Zvffvat dhbgrf. Gel `$1`" + argument_type: "`$1`'f nethzrag `$2` fubhyq unir glcr `$3`, ohg tbg `$4`: `$5`." + argument_type2: "`$1`'f nethzrag `$2` fubhyq unir glcr `$3`, ohg tbg `$4`." + target_a_unit: "Gnetrg n havg." + attack_capitalization: "Nggnpx $1, abg $2. (Pncvgny yrggref ner vzcbegnag.)" + empty_while: "Rzcgl juvyr fgngrzrag. Chg 4 fcnprf va sebag bs fgngrzragf vafvqr gur juvyr fgngrzrag." + line_of_site: "`$1`'f nethzrag `$2` unf n ceboyrz. Vf gurer na rarzl jvguva lbhe yvar-bs-fvtug lrg?" + need_a_after_while: "Arrq n `$1` nsgre `$2`." + too_much_indentation: "Gbb zhpu vaqragngvba ng gur ortvaavat bs guvf yvar." + missing_hero: "Zvffvat `$1` xrljbeq; fubhyq or `$2`." + takes_no_arguments: "`$1` gnxrf ab nethzragf." + no_one_named: "Gurer'f ab bar anzrq \"$1\" gb gnetrg." + separated_by_comma: "Shapgvba pnyyf cnenzngref zhfg or frcrengrq ol `,`f" + protected_property: "Pna'g ernq cebgrpgrq cebcregl: $1" + need_parens_to_call: "Vs lbh jnag gb pnyy `$1` nf shapgvba, lbh arrq `()`'f" + expected_an_identifier: "Rkcrpgrq na vqragvsvre naq vafgrnq fnj '$1'." + unexpected_identifier: "Harkcrpgrq vqragvsvre" + unexpected_end_of: "Harkcrpgrq raq bs vachg" + unnecessary_semicolon: "Haarprffnel frzvpbyba." + unexpected_token_expected: "Harkcrpgrq gbxra: rkcrpgrq $1 ohg sbhaq $2 juvyr cnefvat $3" + unexpected_token: "Harkcrpgrq gbxra $1" + unexpected_token2: "Harkcrpgrq gbxra" + unexpected_number: "Harkcrpgrq ahzore" + unexpected: "Harkcrpgrq '$1'." + escape_pressed_code: "Rfpncr cerffrq; pbqr nobegrq." + target_an_enemy: "Gnetrg na rarzl ol anzr, yvxr `$1`, abg gur fgevat `$2`." + target_an_enemy_2: "Gnetrg na rarzl ol anzr, yvxr $1." + cannot_read_property: "Pnaabg ernq cebcregl '$1' bs haqrsvarq" + attempted_to_assign: "Nggrzcgrq gb nffvta gb ernqbayl cebcregl." + unexpected_early_end: "Harkcrpgrq rneyl raq bs cebtenz." + you_need_a_string: "Lbh arrq n fgevat gb ohvyq; bar bs $1" + unable_to_get_property: "Hanoyr gb trg cebcregl '$1' bs haqrsvarq be ahyy ersrerapr" # GBQB: Qb jr genafyngr haqrsvarq/ahyy? + code_never_finished_its: "Pbqr arire svavfurq. Vg'f rvgure ernyyl fybj be unf na vasvavgr ybbc." + unclosed_string: "Hapybfrq fgevat." + unmatched: "Hazngpurq '$1'." + error_you_said_achoo: "Lbh fnvq: $1, ohg gur cnffjbeq vf: $2. (Pncvgny yrggref ner vzcbegnag.)" + indentation_error_unindent_does: "Vaqragngvba Reebe: havaqrag qbrf abg zngpu nal bhgre vaqragngvba yriry" + indentation_error: "Vaqragngvba reebe." + need_a_on_the: "Arrq n `:` ba gur raq bs gur yvar sbyybjvat `$1`." + attempt_to_call_undefined: "nggrzcg gb pnyy '$1' (n avy inyhr)" + unterminated: "Hagrezvangrq `$1`" + target_an_enemy_variable: "Gnetrg na $1 inevnoyr, abg gur fgevat $2. (Gel hfvat $3.)" + error_use_the_variable: "Hfr gur inevnoyr anzr yvxr `$1` vafgrnq bs n fgevat yvxr `$2`" + indentation_unindent_does_not: "Vaqragngvba havaqrag qbrf abg zngpu nal bhgre vaqragngvba yriry" + unclosed_paren_in_function_arguments: "Hapybfrq $1 va shapgvba nethzragf." + there_is_no_enemy: "Gurer vf ab `$1`. Hfr `$2` svefg." # Uvagf fgneg urer + try_herofindnearestenemy: "Gel `$1`" + there_is_no_function: "Gurer vf ab shapgvba `$1`, ohg `$2` unf n zrgubq `$3`." + attacks_argument_enemy_has: "`$1`'f nethzrag `$2` unf n ceboyrz." + is_there_an_enemy: "Vf gurer na rarzl jvguva lbhe yvar-bs-fvtug lrg?" + target_is_null_is: "Gnetrg vf $1. Vf gurer nyjnlf n gnetrg gb nggnpx? (Hfr $2?)" + hero_has_no_method: "`$1` unf ab zrgubq `$2`." + there_is_a_problem: "Gurer vf n ceboyrz jvgu lbhe pbqr." + did_you_mean: "Qvq lbh zrna $1? Lbh qb abg unir na vgrz rdhvccrq jvgu gung fxvyy." + missing_a_quotation_mark: "Zvffvat n dhbgngvba znex. " + missing_var_use_var: "Zvffvat `$1`. Hfr `$2` gb znxr n arj inevnoyr." + you_do_not_have: "Lbh qb abg unir na vgrz rdhvccrq jvgu gur $1 fxvyy." + put_each_command_on: "Chg rnpu pbzznaq ba n frcnengr yvar" + are_you_missing_a: "Ner lbh zvffvat n '$1' nsgre '$2'? " + your_parentheses_must_match: "Lbhe cneragurfrf zhfg zngpu." diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 7e42962236d..832e9231f27 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -2308,7 +2308,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese reference_error: "参考错误:" spelling_issues: "请注意拼写错误:你指的是`$1`而不是`$2`, 对吗?" capitalization_issues: "请注意大小写:`$1` 应该改成 `$2`?" - py_empty_block: "空变量。在$1的语句中,加入4个空格。" + # py_empty_block: "空变量。在$1的语句中,加入4个空格。" # {change} fx_missing_paren: "如果你需要把`$1` 称为函数,你需要加`()`'s" unmatched_token: "非匹配`$1`。每一个开放的`$2`都需要一个`$3`配对。" unterminated_string: "未终止字符串,在字符串末加上另外一个`\"`。" diff --git a/app/schemas/languages.coffee b/app/schemas/languages.coffee index 053a89f2a54..586eaf816ec 100644 --- a/app/schemas/languages.coffee +++ b/app/schemas/languages.coffee @@ -1,6 +1,6 @@ locale = require '../locale/locale' # requiring from app; will break if we stop serving from where app lives -languages = [] +languages = [{code: 'rot13', nativeDescription: 'rot13', englishDescription: 'rot13'}] for code, localeInfo of locale languages.push code: code, nativeDescription: localeInfo.nativeDescription, englishDescription: localeInfo.englishDescription diff --git a/app/styles/editor/verifier/i18n-verifier-view.sass b/app/styles/editor/verifier/i18n-verifier-view.sass new file mode 100644 index 00000000000..bfea9702fad --- /dev/null +++ b/app/styles/editor/verifier/i18n-verifier-view.sass @@ -0,0 +1,15 @@ +#i18n-verifier-view + form + display: inline-block + table.human-readable + tr + max-width: 100vw + td + white-space: pre-line + max-width: 30vw + border-bottom: thin solid black + .export + * + white-space: nowrap + .counts + width: 4em diff --git a/app/templates/editor/verifier/i18n-verifier-view.jade b/app/templates/editor/verifier/i18n-verifier-view.jade new file mode 100644 index 00000000000..89f819e1b3e --- /dev/null +++ b/app/templates/editor/verifier/i18n-verifier-view.jade @@ -0,0 +1,113 @@ +// DNT +.container + button(@click="showCampaigns = !showCampaigns", :disabled="campaigns.length === 0") + | Toggle campaigns + span(v-if="selectedCampaign") + | Current: {{selectedCampaign.name}} + br + div(v-if="showCampaigns") + a(v-for="campaign in campaigns" + @click="selectedCampaign = campaign") + {{ campaign.name }} + =", " + button(@click="showLevels = !showLevels", :disabled="!selectedCampaign") + | Toggle levels + span(v-if="levelSlug") + | Current: {{levelSlug}} + br + div(v-if="showLevels") + button(@click="selectedLevelSlugs = selectedCampaign.levelsArray.map((l)=>{return l.slug})") + | Select All + span(v-for="level in selectedCampaign.levelsArray") + label + {{ level.name }} {{ selectedLevelSlugs.indexOf(level.slug) > -1 }} + input(type="checkbox", + :value="level.slug" + v-model="selectedLevelSlugs") + =", " + form(action="") + input(v-model:value="levelSlug") + button(@click.prevent="getProblemsAndCompare(levelSlug)") + | Get Problems + select(v-model="language") + option(v-for="locale in allLocales") + | {{ locale }} + select(v-model="messageOrHint") + option message + option hint + br + label + | Partial threshold % + input(type="number" step="1" v-model:value="partialThreshold") + label + | Complete threshold % + input(type="number" step="1" v-model:value="completeThreshold") + label + | Count threshold % + input(type="number" step="0.2" v-model:value="countThreshold") + select(v-model="displayMode") + option human-readable + option export + | Total errors: {{ totalCount }} + br + span + label + | Translated + input(type="checkbox" v-model="showTranslated") + span + label + | Untranslated + input(type="checkbox" v-model="showUntranslated") + div + span(v-if="loading") + | Loading... + table.human-readable(v-if="displayMode === 'human-readable'") + tr + th + | Original + th(v-if="showTranslated") + | Translated + th(v-if="showUntranslated") + | Untranslated + th + | # chars not translated + th + | Difference + th + | Frequency + + tr(v-for="problem in problems" + v-if="problem[messageOrHint] && problem[messageOrHint].length > 0" + v-bind:style="{ backgroundColor: color(problem) }") + td {{ problem[messageOrHint] }} + td(v-if="showTranslated") + {{ problem.translated }} + td(v-if="showUntranslated") + {{ problem.trimmed }} + td(v-if="typeof problem.trimmed === 'string'") + {{ problem.trimmed.length }} + td(v-else) + | ??? + td {{ percentDifference(problem) }}% + td + | {{ (problem.count / totalCount * 100).toFixed(1) }}% + | ({{problem.count}}/{{totalCount}}) + td + | {{ (problemFrequency(problem) * 100).toFixed(1) }}% + | ({{problem.count}}/{{problemCountByLevel[problem.levelSlug]}}) + + .export(v-else) + tr + td.counts + pre + div(v-for="problem, index in exportList", + :style="{ backgroundColor: color(problem) }") + span {{ (problem.count / totalCount * 100).toFixed(1) }}% + br + td + pre + div(v-for="problem, index in exportList", + :style="{ backgroundColor: color(problem) }") + span {{ slugifyProblem(problem) }}: "{{ problem.trimmed }}" + br + diff --git a/app/views/core/RootView.coffee b/app/views/core/RootView.coffee index 8e23839e7bd..ccf0ec6daaf 100644 --- a/app/views/core/RootView.coffee +++ b/app/views/core/RootView.coffee @@ -162,10 +162,7 @@ module.exports = class RootView extends CocoView $.i18n.setLng(newLang, {}) @saveLanguage(newLang) - loading = application.moduleLoader.loadLanguage(me.get('preferredLanguage', true)) - if loading - @listenToOnce application.moduleLoader, 'load-complete', @onLanguageLoaded - else + application.moduleLoader.loadLanguage(me.get('preferredLanguage', true)).then => @onLanguageLoaded() onLanguageLoaded: -> diff --git a/app/views/editor/verifier/i18nVerifierView.coffee b/app/views/editor/verifier/i18nVerifierView.coffee new file mode 100644 index 00000000000..3a44598871d --- /dev/null +++ b/app/views/editor/verifier/i18nVerifierView.coffee @@ -0,0 +1,143 @@ +RootComponent = require 'views/core/RootComponent' +Problem = require 'views/play/level/tome/Problem' +locale = require 'locale/locale' +api = require 'core/api' +require 'vendor/co' +utils = require 'core/utils' + +I18nVerifierComponent = Vue.extend + template: require('templates/editor/verifier/i18n-verifier-view')() + data: -> + allLocales: Object.keys(_.omit(locale, 'update', 'installVueI18n')).concat('rot13') + language: 'en' + levelSlug: null + startDay: moment(new Date()).subtract(2, 'weeks').format("YYYY-MM-DD") + endDay: moment(new Date()).format("YYYY-MM-DD") + partialThreshold: 1 + completeThreshold: 99 + countThreshold: 0 + totalCount: 0 + messageOrHint: utils.getQueryVariable('messageOrHint') or 'message' + me: me + serverConfig: serverConfig + problemsByLevel: {} + regexes: [] + otherRegexes: [] + displayMode: utils.getQueryVariable('displayMode') or 'human-readable' + showCampaigns: false + showLevels: false + showTranslated: true + showUntranslated: true + campaigns: [] + selectedCampaign: null + selectedLevelSlugs: [] + loading: true + computed: + exportList: -> + _(@problems).filter((p) => + p[@messageOrHint].length > 0 and\ + @percentDifference(p) < @completeThreshold and\ + (p.count / @totalCount) >= (@countThreshold / 100)) + .uniq((p) -> p.trimmed) + .value() + problems: -> + _.sortBy(_.flatten(Object.values(@problemsByLevel), true), (p) => -p.count) + problemCountByLevel: -> + _.mapValues @problemsByLevel, (problems) -> + _.reduce(_.map(problems, 'count'), (a,b)->a+b) + created: co.wrap -> + @levelSlug = @$options.propsData.levelSlug + @selectedLevelSlugs = [@levelSlug] + i18n.setLng(@language) + yield @loadCampaigns() + yield application.moduleLoader.loadLanguage(@language) + @setupRegexes() + newProblems = yield @getProblems(@levelSlug) + @compareStrings(newProblems) + @loading = false + watch: + language: co.wrap -> + yield application.moduleLoader.loadLanguage(@language) + console.log "Finished loading language", @language + @setupRegexes() + @compareStrings(@problems) + selectedLevelSlugs: -> + @loading = true + promises = [] + for slug in @selectedLevelSlugs + if not @problemsByLevel[slug] + promises.push @getProblems(slug) + Promise.all(promises).then (newProblems) => + @loading = false + _.defer => + @compareStrings(_.flatten(newProblems)) + messageOrHint: -> + @compareStrings(@problems) + methods: + problemFrequency: (problem) -> + problem.count / @problemCountByLevel[problem.levelSlug] + loadCampaigns: co.wrap -> + @campaigns = yield api.campaigns.getAll({ project: 'levels' }) + @selectedCampaign = _.find(@campaigns, (c) -> c.name is "Dungeon") + for campaign in @campaigns + Vue.set(campaign, 'levelsArray', Object.values(campaign.levels)) + setupRegexes: -> + en = require('locale/en').translation + # Call require like this to prevent preload.js from trying to load app/locale.js which doesn't exist + otherLang = window["require"]("locale/#{@language}").translation + translationKeys = Object.keys(en.esper) + @regexes = [] + for translationKey in translationKeys + englishString = en.esper[translationKey] + regex = Problem.prototype.makeTranslationRegex(englishString) + @regexes.push(regex) + @otherRegexes = [] + for translationKey in translationKeys + otherString = otherLang.esper?[translationKey] or '' + otherRegex = Problem.prototype.makeTranslationRegex(otherString) + @otherRegexes.push(otherRegex) + percentDifference: (problem) -> + ((1 - problem.trimmed?.length / problem[@messageOrHint].length) * 100).toFixed(0) + color: (problem) -> + amountTranslated = @percentDifference(problem) + if amountTranslated >= @completeThreshold + return 'green' + else if amountTranslated >= @partialThreshold + return 'yellow' + else + return 'red' + getProblemsAndCompare: (levelSlug) -> + @getProblems(levelSlug).then (problems) => + @compareStrings(problems) + getProblems: co.wrap (levelSlug) -> + newProblems = yield api.userCodeProblems.getCommon({ levelSlug, @startDay, @endDay }) + for problem in newProblems + problem.hint ?= '' + problem.levelSlug = levelSlug + Vue.set(@problemsByLevel, levelSlug, newProblems) + @totalCount = _.reduce(_.map(@problems, (p)->p.count), (a,b)->a+b) + return newProblems + compareStrings: (problems) -> + $.i18n.setLng(@language) + problems.forEach (problem) => + original = problem[@messageOrHint] + translated = Problem.prototype.translate(problem[@messageOrHint]) + trimmed = translated + for regex in @otherRegexes + trimmed = trimmed.replace(regex, '').replace(/^\n/, '') + Vue.set(problem, 'translated', translated) + Vue.set(problem, 'trimmed', trimmed) + slugifyProblem: (problem) -> + str = _.string.slugify(problem.trimmed) + str.split('-').slice(0,4).join('_') + +module.exports = class I18nVerifierView extends RootComponent + id: 'i18n-verifier-view' + template: require 'templates/base-flat' + VueComponent: I18nVerifierComponent + constructor: (options, @levelSlug) -> + @propsData = { @levelSlug } + super options + destroy: -> + super(arguments...) + $.i18n.setLng(me.get('preferredLanguage')) diff --git a/app/views/play/level/tome/Problem.coffee b/app/views/play/level/tome/Problem.coffee index e409fc7cc1a..c26266c8afa 100644 --- a/app/views/play/level/tome/Problem.coffee +++ b/app/views/play/level/tome/Problem.coffee @@ -104,24 +104,59 @@ module.exports = class Problem @ace.getSession().removeMarker @lineMarkerRange.id @lineMarkerRange.start.detach() @lineMarkerRange.end.detach() + + # Here we take a string from the locale file, find the placeholders ($1/$2/etc) + # and replace them with capture groups (.+), + # returns a regex that will match against the error message + # and capture any dynamic values in the text + makeTranslationRegex: (englishString) -> + escapeRegExp = (str) -> + # https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + new RegExp(escapeRegExp(englishString).replace(/\\\$\d/g, '(.+)').replace(/ +/g, ' +')) translate: (msg) -> - return msg unless msg - tx = (regex, key) -> - ki = "esper.#{key}" - key = $.i18n.t(ki) - return if key is ki - msg = msg.replace regex, key + return msg if not msg + if /\n/.test(msg) # Translate each line independently, since regexes act weirdly with newlines + return msg.split('\n').map((line) => @translate(line)).join('\n') msg = msg.replace /([A-Za-z]+Error:) \1/, '$1' - return msg if me.get('preferredLanguage', true) in ['en', 'en-US'] - tx /Line (\d+): /, 'line_no' - tx /TypeError: /, 'type_error' - tx /ReferenceError: /, 'reference_error' - tx /`([a-zA-Z.]+)` is not a function/, 'x_not_a_function' - tx /Look out for capitalization: `([a-zA-Z.]+)` should be `([a-zA-Z.]+)`./, 'capitalization_issues' - tx /Look out for spelling issues: did you mean `([a-zA-Z.]+)` instead of `([a-zA-Z.]+)`\?/, 'capitalization_issues' - tx /Empty ([a-zA-Z]+ statement). Put 4 spaces in front of statements inside the ([a-zA-Z]+ statement)\./, 'py_empty_block' - tx /Unmatched `(.)`. Every opening `(.)` needs a closing `(.)` to match it./, 'unmatched_token' - tx /Unterminated string. Add a matching `"` at the end of your string./, 'unterminated_string' - msg + return msg if i18n.lng() in ['en', 'en-US'] + + # Separately handle line number and error type prefixes + en = require('locale/en').translation + lineNumberPart = '' + if /Line \d+: /.test(msg) + lineNumber = msg.match(/Line (\d+): /)[1] + msg = msg.replace(/Line \d+: /, '') + lineNumberPart = $.i18n.t("esper.line_no").replace('$1', lineNumber) + + errorNamePart = '' + for translationKey in ['reference_error', 'argument_error', 'type_error', 'error'] + errorString = en.esper[translationKey] + if msg.startsWith(errorString) + msg = msg.replace(errorString, '') + errorNamePart = $.i18n.t("esper.#{translationKey}") + break + + applyReplacementTranslation = (regex, key) => + fullKey = "esper.#{key}" + replacementTemplate = $.i18n.t(fullKey) + return if replacementTemplate is fullKey + # This carries over any capture groups from the regex into $N placeholders in the template string + replaced = msg.replace regex, replacementTemplate + if replaced isnt msg + return [replaced.replace(/``/g, '`'), true] + return [msg, false] + + # Automatically generate and apply replacements based on entries in locale file + translationKeys = Object.keys(en.esper) + originalMessage = msg + for translationKey in translationKeys when translationKey not in ['line_no', 'reference_error', 'argument_error', 'type_error', 'error'] + englishString = en.esper[translationKey] + regex = @makeTranslationRegex(englishString) + [msg, didTranslate] = applyReplacementTranslation regex, translationKey + break if didTranslate + null + + lineNumberPart + errorNamePart + msg diff --git a/scripts/copy-i18n-tags.coffee b/scripts/copy-i18n-tags.coffee index d59eab32b74..0c64a076d47 100644 --- a/scripts/copy-i18n-tags.coffee +++ b/scripts/copy-i18n-tags.coffee @@ -2,6 +2,9 @@ fs = require 'fs' path = require 'path' en = require('../app/locale/en').translation +# Generate rot13 locale +require('./generateRot13Locale.coffee') + enSource = fs.readFileSync(path.join(__dirname, '../app/locale/en.coffee'), encoding='utf8') commentsMap = {} @@ -25,7 +28,7 @@ for section in splitByCategories commentsMap[category][comment[1]] = comment[2] dir = fs.readdirSync 'app/locale' -for file in dir when not (file in ['locale.coffee', 'en.coffee']) +for file in dir when not (file in ['locale.coffee', 'en.coffee', 'rot13.coffee']) fileSource = fs.readFileSync 'app/locale/' + file, encoding='utf8' contents = require('../app/locale/' + file) categories = contents.translation diff --git a/scripts/generateRot13Locale.coffee b/scripts/generateRot13Locale.coffee new file mode 100644 index 00000000000..29cffa333bc --- /dev/null +++ b/scripts/generateRot13Locale.coffee @@ -0,0 +1,25 @@ +fs = require 'fs' + +text = fs.readFileSync('./app/locale/en.coffee').toString() + +lines = text.split('\n') + +rot13 = (s) -> + return s.split('').map((char) -> + return char if (!char.match(/[A-Za-z]/)) + c = Math.floor(char.charCodeAt(0) / 97); + k = (char.toLowerCase().charCodeAt(0) - 83) % 26 || 26 + return String.fromCharCode(k + (if (c == 0) then 64 else 96)) + ).join(''); + +output = lines.map (line, index) -> + if index is 0 + return 'module.exports = nativeDescription: "rot13", englishDescription: "English with the letters jumbled", translation:' + return line if not line.match(':') + separator = line.match(':').index + leftHalf = line.slice(0, separator) + rightHalf = line.slice(separator) + return leftHalf + rot13(rightHalf) +.join('\n') + +fs.writeFileSync('./app/locale/rot13.coffee', output) diff --git a/spec/server/unit/locale.spec.coffee b/spec/server/unit/locale.spec.coffee new file mode 100644 index 00000000000..615dbac5260 --- /dev/null +++ b/spec/server/unit/locale.spec.coffee @@ -0,0 +1,33 @@ +locale = require('../../../app/locale/locale') +english = require("../../../app/locale/en") +_ = require('lodash') +langs = Object.keys(_.omit(locale, 'update', 'installVueI18n')).concat('rot13').map (langKey) -> + require("../../../app/locale/#{langKey}") + +describe 'esper error messages', -> + langs.forEach (language) => + describe "when language is #{language.englishDescription}", -> + esper = language.translation.esper or {} + englishEsper = english.translation.esper + + Object.keys(language.translation.esper or {}).forEach (key) -> + describe "when key is #{key}", -> + it 'should have numbered placeholders $1 through $N', -> + placeholders = (esper[key].match(/\$\d/g) or []).sort() + expectedPlaceholders = ("$#{index+1}" for val, index in placeholders) + if not _.isEqual(placeholders, expectedPlaceholders) + fail """ + Some placeholders were skipped: #{placeholders} + Translated string: #{esper[key]} + """ + + it 'should have the same placeholders in each entry as in English', -> + if not englishEsper[key] + return fail("Expected English to have a corresponding key for #{key}") + englishPlaceholders = (englishEsper[key].match(/\$\d/g) or []).sort() + placeholders = (esper[key].match(/\$\d/g) or []).sort() + if not _.isEqual(placeholders, englishPlaceholders) + fail """ + Expected translated placeholders: [#{placeholders}] (#{esper[key]}) + To match English placeholders: [#{englishPlaceholders}] (#{englishEsper[key]}) + """ diff --git a/test/app/views/play/level/tome/Problem.spec.coffee b/test/app/views/play/level/tome/Problem.spec.coffee index 84affeb9aa9..09230c02172 100644 --- a/test/app/views/play/level/tome/Problem.spec.coffee +++ b/test/app/views/play/level/tome/Problem.spec.coffee @@ -1,4 +1,5 @@ Problem = require 'views/play/level/tome/Problem' +require 'locale/rot13' describe 'Problem', -> # boilerplate problem params @@ -26,6 +27,29 @@ describe 'Problem', -> type: 'runtime' } levelID = 'awesome' + + describe '.translate()', -> + beforeEach -> + @oldLang = $.i18n.lng() + $.i18n.setLng('rot13') + afterEach -> + $.i18n.setLng(@olgLang) + it 'translates messages with line numbers, error types, and placeholders', -> + english = 'Line 12: ReferenceError: somethin is not defined' + rot13 = 'Yvar 12: ErsreraprReebe: somethin vf abg qrsvarq' + expect(Problem.prototype.translate(english)).toEqual(rot13) + english = "`foo`'s argument `bar` has a problem. Is there an enemy within your line-of-sight yet?" + rot13 = "`foo`'f nethzrag `bar` unf n ceboyrz. Vf gurer na rarzl jvguva lbhe yvar-bs-fvtug lrg?" + expect(Problem.prototype.translate(english)).toEqual(rot13) + english=""" + `attack`'s argument `target` should have type `unit`, but got `function`. + Target a unit. + """ + rot13=""" + `attack`'f nethzrag `target` fubhyq unir glcr `unit`, ohg tbg `function`. + Gnetrg n havg. + """ + expect(Problem.prototype.translate(english)).toEqual(rot13) # TODO: Problems are no longer saved when creating Problems; instead it's in SpellView. Update tests? xit 'save user code problem', -> From ef5f83b6ab8f5b1c911077c9e5d49959a617563a Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 4 Aug 2017 13:41:36 -0700 Subject: [PATCH 011/227] Improve handling of error message prefixes --- app/locale/en.coffee | 3 ++ app/locale/rot13.coffee | 3 ++ app/views/play/level/tome/Problem.coffee | 56 ++++++++++-------------- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index cadc2be65a6..000130f15c4 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -2303,9 +2303,11 @@ esper: line_no: "Line $1: " + uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "ReferenceError: " argument_error: "ArgumentError: " type_error: "TypeError: " + syntax_error: "SyntaxError: " error: "Error: " x_not_a_function: "$1 is not a function" x_not_defined: "$1 is not defined" @@ -2361,6 +2363,7 @@ error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." + unexpected_end_of_input: "Unexpected end of input" there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here try_herofindnearestenemy: "Try `$1`" there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." diff --git a/app/locale/rot13.coffee b/app/locale/rot13.coffee index c9f52852104..e70e2f70638 100644 --- a/app/locale/rot13.coffee +++ b/app/locale/rot13.coffee @@ -2303,9 +2303,11 @@ module.exports = nativeDescription: "rot13", englishDescription: "English with t esper: line_no: "Yvar $1: " + uncaught: "Hapnhtug $1" # $1 jvyy or na reebe glcr, rt "Hapnhtug FlagnkReebe" reference_error: "ErsreraprReebe: " argument_error: "NethzragReebe: " type_error: "GlcrReebe: " + syntax_error: "FlagnkReebe: " error: "Reebe: " x_not_a_function: "$1 vf abg n shapgvba" x_not_defined: "$1 vf abg qrsvarq" @@ -2361,6 +2363,7 @@ module.exports = nativeDescription: "rot13", englishDescription: "English with t error_use_the_variable: "Hfr gur inevnoyr anzr yvxr `$1` vafgrnq bs n fgevat yvxr `$2`" indentation_unindent_does_not: "Vaqragngvba havaqrag qbrf abg zngpu nal bhgre vaqragngvba yriry" unclosed_paren_in_function_arguments: "Hapybfrq $1 va shapgvba nethzragf." + unexpected_end_of_input: "Harkcrpgrq raq bs vachg" there_is_no_enemy: "Gurer vf ab `$1`. Hfr `$2` svefg." # Uvagf fgneg urer try_herofindnearestenemy: "Gel `$1`" there_is_no_function: "Gurer vf ab shapgvba `$1`, ohg `$2` unf n zrgubq `$3`." diff --git a/app/views/play/level/tome/Problem.coffee b/app/views/play/level/tome/Problem.coffee index c26266c8afa..3975c5d1db8 100644 --- a/app/views/play/level/tome/Problem.coffee +++ b/app/views/play/level/tome/Problem.coffee @@ -17,8 +17,6 @@ module.exports = class Problem { @level, @range, @message, @hint, @userInfo } = @aetherProblem { @row, @column: col } = @aetherProblem.range?[0] or {} @createdBy = 'aether' - @message = @translate @message - @hint = @translate @hint else unless userCodeHasChangedSinceLastCast @annotation = @buildAnnotationFromWebDevError(error) @@ -37,7 +35,9 @@ module.exports = class Problem @userInfo = undefined @createdBy = 'web-dev-iframe' # TODO: Include runtime/transpile error types depending on something? - + + @message = @translate(@message) + @hint = @translate(@hint) # TODO: get ACE screen line, too, for positioning, since any multiline "lines" will mess up positioning Backbone.Mediator.publish("problem:problem-created", line: @annotation.row, text: @annotation.text) if application.isIPadApp @@ -50,18 +50,19 @@ module.exports = class Problem @userCodeProblem.off() if @userCodeProblem buildAnnotationFromWebDevError: (error) -> + translatedErrorMessage = @translate(error.message) { row: error.line column: error.column - raw: error.message - text: error.message + raw: translatedErrorMessage + text: translatedErrorMessage type: 'error' createdBy: 'web-dev-iframe' } buildAnnotationFromAetherProblem: (aetherProblem) -> return unless aetherProblem.range - text = aetherProblem.message.replace /^Line \d+: /, '' + text = @translate(aetherProblem.message.replace /^Line \d+: /, '') start = aetherProblem.range[0] { row: start.row, @@ -125,38 +126,25 @@ module.exports = class Problem # Separately handle line number and error type prefixes en = require('locale/en').translation - lineNumberPart = '' - if /Line \d+: /.test(msg) - lineNumber = msg.match(/Line (\d+): /)[1] - msg = msg.replace(/Line \d+: /, '') - lineNumberPart = $.i18n.t("esper.line_no").replace('$1', lineNumber) - - errorNamePart = '' - for translationKey in ['reference_error', 'argument_error', 'type_error', 'error'] - errorString = en.esper[translationKey] - if msg.startsWith(errorString) - msg = msg.replace(errorString, '') - errorNamePart = $.i18n.t("esper.#{translationKey}") - break - - applyReplacementTranslation = (regex, key) => + applyReplacementTranslation = (text, regex, key) => fullKey = "esper.#{key}" replacementTemplate = $.i18n.t(fullKey) return if replacementTemplate is fullKey # This carries over any capture groups from the regex into $N placeholders in the template string - replaced = msg.replace regex, replacementTemplate - if replaced isnt msg + replaced = text.replace regex, replacementTemplate + if replaced isnt text return [replaced.replace(/``/g, '`'), true] - return [msg, false] + return [text, false] + + # These need to be applied in this order, before the main text is translated + prefixKeys = ['line_no', 'uncaught', 'reference_error', 'argument_error', 'type_error', 'syntax_error', 'error'] - # Automatically generate and apply replacements based on entries in locale file - translationKeys = Object.keys(en.esper) - originalMessage = msg - for translationKey in translationKeys when translationKey not in ['line_no', 'reference_error', 'argument_error', 'type_error', 'error'] - englishString = en.esper[translationKey] - regex = @makeTranslationRegex(englishString) - [msg, didTranslate] = applyReplacementTranslation regex, translationKey - break if didTranslate - null + for keySet in [prefixKeys, Object.keys(_.omit(en.esper), prefixKeys)] + for translationKey in keySet + englishString = en.esper[translationKey] + regex = @makeTranslationRegex(englishString) + [msg, didTranslate] = applyReplacementTranslation msg, regex, translationKey + break if didTranslate and keySet isnt prefixKeys + null - lineNumberPart + errorNamePart + msg + msg From 3961ce47652a4c1e8b4bc9c93e304bcb7cce8523 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 4 Aug 2017 13:42:33 -0700 Subject: [PATCH 012/227] Increase error reporting sample rate --- app/views/play/level/tome/SpellView.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee index 626f35ce423..9968c466660 100644 --- a/app/views/play/level/tome/SpellView.coffee +++ b/app/views/play/level/tome/SpellView.coffee @@ -903,7 +903,8 @@ module.exports = class SpellView extends CocoView hashValue = aether.raw + aetherProblem.message return if hashValue of @savedProblems @savedProblems[hashValue] = true - return unless Math.random() < 0.01 # Let's only save a tiny fraction of these during HoC to reduce writes. + sampleRate = Math.max(1, (me.level()-2) * 2) * 0.01 # Reduce number of errors reported on earlier levels + return unless Math.random() < sampleRate # Save new problem @userCodeProblem = new UserCodeProblem() From 7e28ed42bdf82f4ff68ee9558b53d471a1a816a3 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 4 Aug 2017 15:13:49 -0700 Subject: [PATCH 013/227] Fix race condition in test --- spec/server/functional/products.spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/server/functional/products.spec.coffee b/spec/server/functional/products.spec.coffee index b7325cc2e15..4bdfd8314fa 100644 --- a/spec/server/functional/products.spec.coffee +++ b/spec/server/functional/products.spec.coffee @@ -18,13 +18,13 @@ describe 'GET /db/products', -> it 'shouldnt leak coupon code information', utils.wrap -> url = utils.getURL('/db/products/') [res, doc] = yield request.getAsync({url, json: true}) - ls2 = _.find doc, ((x) -> /lifetime_subscription$/.test x.name) + ls2 = _.find doc, ((x) -> /^lifetime_subscription$/.test x.name) expect(ls2.coupons).toEqual([]) it 'should accept the coupon code QS', utils.wrap -> url = utils.getURL('/db/products/') [res, doc] = yield request.getAsync(url: url + '?coupon=c1', json: true) - ls2 = _.find doc, ((x) -> /lifetime/.test x.name) + ls2 = _.find doc, ((x) -> /^lifetime/.test x.name) expect(ls2.coupons[0].amount).toBe(10) expect(ls2.coupons.length).toBe(1) From f9d82796b78bd13e066b787e30fcb2403627d581 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 4 Aug 2017 15:47:47 -0700 Subject: [PATCH 014/227] Start CreateAccountModal on individual path from /play --- .../CreateAccountModal/CreateAccountModal.coffee | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/views/core/CreateAccountModal/CreateAccountModal.coffee b/app/views/core/CreateAccountModal/CreateAccountModal.coffee index 9a51b288c2b..e1b28735b58 100644 --- a/app/views/core/CreateAccountModal/CreateAccountModal.coffee +++ b/app/views/core/CreateAccountModal/CreateAccountModal.coffee @@ -75,12 +75,13 @@ module.exports = class CreateAccountModal extends ModalView } { startOnPath } = options - if startOnPath is 'student' - @signupState.set({ path: 'student', screen: 'segment-check' }) - if startOnPath is 'individual' - @signupState.set({ path: 'individual', screen: 'segment-check' }) - if startOnPath is 'teacher' - @signupState.set({ path: 'teacher', screen: 'basic-info' }) + switch startOnPath + when 'student' then @signupState.set({ path: 'student', screen: 'segment-check' }) + when 'individual' then @signupState.set({ path: 'individual', screen: 'segment-check' }) + when 'teacher' then @signupState.set({ path: 'teacher', screen: 'basic-info' }) + else + if /^\/play/.test(location.pathname) + @signupState.set({ path: 'individual', screen: 'segment-check' }) @listenTo @signupState, 'all', _.debounce @render From f01e31dd0f389f499da4e6defeac37625838f51f Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 4 Aug 2017 15:56:17 -0700 Subject: [PATCH 015/227] Change premium level play button text if free user --- app/locale/en.coffee | 1 + app/templates/play/campaign-view.jade | 5 ++++- app/views/play/CampaignView.coffee | 9 ++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 000130f15c4..364167f741c 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -340,6 +340,7 @@ create: "Create" fork: "Fork" play: "Play" # When used as an action verb, like "Play next level" + subscribe_to_play: "Subscribe to Play" retry: "Retry" actions: "Actions" info: "Info" diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 154c4b89be3..1c06ae04a87 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -148,7 +148,10 @@ if view.showAds() button.btn.btn-primary.btn.btn-lg.btn-block.btn-illustrated span(data-i18n="common.play") Play else - button.btn.btn-success.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.play") Play + if view.levelNeedsSubscription(level) + button.btn.btn-primary.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.subscribe_to_play") Subscribe to Play + else + button.btn.btn-success.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.play") Play for adjacentCampaign in adjacentCampaigns diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 793ccbde019..5ff2a87fac0 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -786,15 +786,18 @@ module.exports = class CampaignView extends RootView levelOriginal = levelElement.data('level-original') @trigger 'level-double-clicked', levelOriginal + levelNeedsSubscription: (level) -> + requiresSubscription = level.requiresSubscription or (me.isOnPremiumServer() and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names'])) + canPlayAnyway = not @requiresSubscription or level.adventurer or @levelStatusMap[level.slug] or (features.codePlay and codePlay.canPlay(level.slug)) + return requiresSubscription and not canPlayAnyway + onClickStartLevel: (e) -> levelElement = $(e.target).parents('.level-info-container') levelSlug = levelElement.data('level-slug') levelOriginal = levelElement.data('level-original') level = _.find _.values(@getLevels()), slug: levelSlug - requiresSubscription = level.requiresSubscription or (me.isOnPremiumServer() and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names'])) - canPlayAnyway = not @requiresSubscription or level.adventurer or @levelStatusMap[level.slug] or (features.codePlay and codePlay.canPlay(level.slug)) - if requiresSubscription and not canPlayAnyway + if @levelNeedsSubscription(level) @promptForSubscription levelSlug, 'map level clicked' else @startLevel levelElement From 17ec33e5d0e4e4a9adfc6fb5e441961a3e4897ff Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Mon, 7 Aug 2017 11:37:18 -0400 Subject: [PATCH 016/227] Propagate i18n --- app/locale/ar.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/bg.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ca.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/cs.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/da.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/de-AT.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/de-CH.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/de-DE.coffee | 72 ++++++++++++++++++++++++++++++++- app/locale/el.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/en-GB.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/en-US.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/eo.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/es-419.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/es-ES.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/et.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/fa.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/fi.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/fil.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/fr.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/gl.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/haw.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/he.coffee | 72 ++++++++++++++++++++++++++++++++- app/locale/hi.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/hr.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/hu.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/id.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/it.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ja.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/kk.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ko.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/lt.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/mi.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/mk-MK.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ms.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/my.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/nb.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/nl-BE.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/nl-NL.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/nl.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/nn.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/pl.coffee | 72 ++++++++++++++++++++++++++++++++- app/locale/pt-BR.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/pt-PT.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ro.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/rot13.coffee | 1 + app/locale/ru.coffee | 72 ++++++++++++++++++++++++++++++++- app/locale/sk.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/sl.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/sr.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/sv.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/th.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/tr.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/uk.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/ur.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/uz.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/vi.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/zh-HANS.coffee | 74 ++++++++++++++++++++++++++++++++-- app/locale/zh-HANT.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/zh-WUU-HANS.coffee | 76 +++++++++++++++++++++++++++++++++-- app/locale/zh-WUU-HANT.coffee | 76 +++++++++++++++++++++++++++++++++-- 60 files changed, 4240 insertions(+), 227 deletions(-) diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee index 80925d4dcd8..b54ce70e548 100644 --- a/app/locale/ar.coffee +++ b/app/locale/ar.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi create: "إنشاء" fork: "إنسخ" play: "إلعب" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "إعادة" actions: "Actions" info: "معلومات" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee index bfa9b495aa9..c8e3092af2e 100644 --- a/app/locale/bg.coffee +++ b/app/locale/bg.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "български език", englishDescri create: "Създай" fork: "Разклоняване" play: "Играй" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Отново" actions: "Действия" info: "Инфо" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "български език", englishDescri # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee index 71f45eb2315..e0ab3cceef6 100644 --- a/app/locale/ca.coffee +++ b/app/locale/ca.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr create: "Crear" fork: "Fork" play: "Jugar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Tornar a intentar" actions: "Accions" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee index 8e1b16a2405..89e494db69c 100644 --- a/app/locale/cs.coffee +++ b/app/locale/cs.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr create: "Vytvořit" fork: "Klonovat" play: "Hrát" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Znovu" actions: "Akce" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/da.coffee b/app/locale/da.coffee index ff07eaabfd4..3e3142da6f8 100644 --- a/app/locale/da.coffee +++ b/app/locale/da.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans create: "Skab" fork: "Forgren" play: "Spil" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Prøv igen" actions: "Handlinger" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee index 96f8c244dff..93debfaf529 100644 --- a/app/locale/de-AT.coffee +++ b/app/locale/de-AT.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: create: "Erstelle" fork: "Fork" play: "Abspielen" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Erneut versuchen" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee index c739178f6dd..47f9905afcb 100644 --- a/app/locale/de-CH.coffee +++ b/app/locale/de-CH.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge create: "Erstelle" # fork: "Fork" play: "Spiele" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "nomol versuche" actions: "Aktione" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index e452b073348..097a91fcd3f 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: create: "Erstellen" fork: "Kopieren" play: "Spielen" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Erneut versuchen" actions: "Aktionen" info: "Informationen" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: esper: line_no: "Zeile $1: " - x_not_a_function: "`$1` ist keine Funktion." - type_error: "TypFehler: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "BezugsFehler: " +# argument_error: "ArgumentError: " + type_error: "TypFehler: " +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "`$1` ist keine Funktion." +# x_not_defined: "$1 is not defined" spelling_issues: "Achte auf die Schreibweise: meintest du `$1` anstelle von `$2`?" capitalization_issues: "Achte auf Groß-/Kleinschreibung: `$1` sollte `$2` heißen." py_empty_block: "Leeres $1. Schreibe 4 Leerzeichen vor allen Anweisungen innerhalb des $2." fx_missing_paren: "Wenn du `$1` als Funktion verwenden möchtest, dann brauchst du `()`." unmatched_token: "`$1` ohne Gegenpart. Jede öffnende `$2` benötigt eine zugehörige schließende `$3`." unterminated_string: "String ohne Abschluss. Füge ein ein `\"` am Ende deiner Zeichenkette hinzu." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/el.coffee b/app/locale/el.coffee index f0a34fda228..29c27eb9555 100644 --- a/app/locale/el.coffee +++ b/app/locale/el.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre create: "Δημιουργία" fork: "Κλώνος" play: "Παίξε" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Ξαναδοκίμασε" actions: "Ενέργειες" info: "Πληροφορίες" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee index 1a90fe54541..2b3c05923e2 100644 --- a/app/locale/en-GB.coffee +++ b/app/locale/en-GB.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index d4b9b8a3e57..5753f30fb31 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/eo.coffee b/app/locale/eo.coffee index 7aca4553db1..df50465b1e2 100644 --- a/app/locale/eo.coffee +++ b/app/locale/eo.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto" # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index 17ca4d1e4d0..ff0bc334e76 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip create: "Crear" fork: "Bifurcar" play: "Jugar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Reintentar" actions: "Acciones" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index ee968261e22..2b03e646e31 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis create: "Crear" fork: "Bifurcar" play: "Jugar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Reintentar" actions: "Acciones" info: "Información" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/et.coffee b/app/locale/et.coffee index 451150d8e53..64419042eff 100644 --- a/app/locale/et.coffee +++ b/app/locale/et.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee index e21108e3da8..1822c72b21f 100644 --- a/app/locale/fa.coffee +++ b/app/locale/fa.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # create: "Create" # fork: "Fork" play: "سطوح" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee index 6501eb82f97..a851e9ec06f 100644 --- a/app/locale/fi.coffee +++ b/app/locale/fi.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran create: "Luo" fork: "Haarauta" play: "Pelaa" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Kokeile uudestaan" actions: "Toiminnot" info: "Tietoa" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/fil.coffee b/app/locale/fil.coffee index ddfcc965f73..c052c2443fe 100644 --- a/app/locale/fil.coffee +++ b/app/locale/fil.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Tagalog", englishDescription: "Filipino (Ph # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index 39fe76046ec..b20462c295b 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t create: "Créer" fork: "Répliquer" play: "Jouer" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Réessayer" actions: "Actions" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/gl.coffee b/app/locale/gl.coffee index dcde96e5173..580d3cfdaed 100644 --- a/app/locale/gl.coffee +++ b/app/locale/gl.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr create: "Crear" fork: "Bifurcar" play: "Xogar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Reintentar" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/haw.coffee b/app/locale/haw.coffee index d5bed2460a9..a21a34a0e79 100644 --- a/app/locale/haw.coffee +++ b/app/locale/haw.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "ʻŌlelo Hawaiʻi", englishDescription: "Ha # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/he.coffee b/app/locale/he.coffee index b05c576af76..5f722ed8ef5 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", create: "צור" fork: "פיצול" play: "שחק" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "נסה שוב" actions: "פעולות" info: "מידע" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", esper: line_no: "שורה $1: " - x_not_a_function: "'$1' אינו פונקציה" - type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " + type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "'$1' אינו פונקציה" +# x_not_defined: "$1 is not defined" spelling_issues: "חפשו בעיות כתיב: האם התכוונתם ל-'$1' במקום ל-'$2'?" capitalization_issues: "שימו לב לאותיות רישיות: `$1` אמור להיות`$2`." py_empty_block: "$1 ריק. הציבו 4 תווי רווח לפני הפסוק בתוך $2." fx_missing_paren: "אם ברצונכם לקרוא אל '$1` בתור פונקציה יש צורך ב-`()`" unmatched_token: "'$1' ללא התאמה. Every opening `$2` needs a closing `$3` to match it." unterminated_string: "מחרוזת לא גמורה. הוסיפו '\"' תואם בסיום המחרוזת." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee index 57bd3da2c47..54c1a15f3fb 100644 --- a/app/locale/hi.coffee +++ b/app/locale/hi.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/hr.coffee b/app/locale/hr.coffee index cb0239ad119..05a5f3a0c44 100644 --- a/app/locale/hr.coffee +++ b/app/locale/hr.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee index dc3c36cfe48..a901166916b 100644 --- a/app/locale/hu.coffee +++ b/app/locale/hu.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t create: "Létrehozás" fork: "Villára vesz" play: "Játszd" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Próbáld újra!" actions: "Lehetőségek" info: "Infó" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/id.coffee b/app/locale/id.coffee index 80b903a2d53..9aea0cc2678 100644 --- a/app/locale/id.coffee +++ b/app/locale/id.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # create: "Create" # fork: "Fork" play: "Mainkan" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/it.coffee b/app/locale/it.coffee index dba88436cef..5e4c935a31c 100644 --- a/app/locale/it.coffee +++ b/app/locale/it.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t create: "Crea" fork: "Fork" play: "Gioca" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Riprova" actions: "Azioni" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index f09119298dc..954954b4c5f 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", create: "作成" fork: "分かれ" play: "ゲームスタート" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "リトライ" actions: "アクション" info: "情報" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/kk.coffee b/app/locale/kk.coffee index 2b74a293c11..80c578ddbcf 100644 --- a/app/locale/kk.coffee +++ b/app/locale/kk.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "қазақ тілі", englishDescription: " # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index f67f7a49ec0..4feaa9f21d0 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t create: "생성" fork: "포크" play: "시작" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "재시도" actions: "행동" info: "정보" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee index 2d49a05f3ab..17b530ee4fb 100644 --- a/app/locale/lt.coffee +++ b/app/locale/lt.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith create: "Kurti" fork: "Išsišakojimas" play: "Žaisti" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Pakartoti" actions: "Veiksmai" info: "Informacija" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/mi.coffee b/app/locale/mi.coffee index 64e7d60e7dc..88039f2e131 100644 --- a/app/locale/mi.coffee +++ b/app/locale/mi.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/mk-MK.coffee b/app/locale/mk-MK.coffee index ac51524c032..3e6227092a9 100644 --- a/app/locale/mk-MK.coffee +++ b/app/locale/mk-MK.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Македонски", englishDescription: create: "Направи" # fork: "Fork" play: "Играј" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Обиди се повторно" actions: "Дејствија" info: "Инфо" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Македонски", englishDescription: # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee index c5c0db6dbfe..5d0d22ec5b1 100644 --- a/app/locale/ms.coffee +++ b/app/locale/ms.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # create: "Create" # fork: "Fork" play: "Mula" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/my.coffee b/app/locale/my.coffee index 26b06570266..9332d0f4f2d 100644 --- a/app/locale/my.coffee +++ b/app/locale/my.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee index 47ae597aeda..ab14f982161 100644 --- a/app/locale/nb.coffee +++ b/app/locale/nb.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg create: "Opprett" fork: "Forgrening" play: "Spill" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Prøv igjen" actions: "Handlinger" info: "Informasjon" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee index b44c328643e..e3050cb7326 100644 --- a/app/locale/nl-BE.coffee +++ b/app/locale/nl-BE.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee index e4c65fde265..be10ade2662 100644 --- a/app/locale/nl-NL.coffee +++ b/app/locale/nl-NL.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index 050b3070fbd..f3b113cb0e4 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t create: "Creëer" fork: "Fork" play: "Spelen" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Probeer opnieuw" actions: "Acties" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee index 440623fd58e..a48d2323819 100644 --- a/app/locale/nn.coffee +++ b/app/locale/nn.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee index 693a04684e0..c5b8367aa93 100644 --- a/app/locale/pl.coffee +++ b/app/locale/pl.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran create: "Stwórz" fork: "Fork" play: "Zagraj" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Ponów" actions: "Akcje" info: "Informacje" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran esper: line_no: "Wiersz $1: " - x_not_a_function: "`$1` nie jest funkcją" - type_error: "TypeError (błąd typu): " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "ReferenceError (błąd referencji): " +# argument_error: "ArgumentError: " + type_error: "TypeError (błąd typu): " +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "`$1` nie jest funkcją" +# x_not_defined: "$1 is not defined" spelling_issues: "Sprawdź dobrze pisownię: może chodziło ci o `$1` zamiast `$2`?" capitalization_issues: "Uważaj na duże i małe litery: `$1` powinno wyglądać tak: `$2`." py_empty_block: "Pusty $1. Wstaw 4 spacje przed instrukcją wewnątrz $2." fx_missing_paren: "Jeśli chcesz wywołać `$1` jako funkcję, powinieneś użyć `()`" unmatched_token: "Nawias `$1` nie ma pary. Każdy otwierający nawias `$2` powinien posiadać jego zamykający odpowiednik `$3`." unterminated_string: "Ciąg znaków nie ma końca. Umieść odpowiedni znak `\"` na końcu swojego ciągu znaków." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 7b49620e381..c8ba17747fe 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " create: "Criar" fork: "Fork" play: "Jogar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Tente novamente" actions: "Ações" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 96dd056b44d..4d79d4751f2 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: create: "Criar" fork: "Bifurcar" play: "Jogar" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Tentar Novamente" actions: "Ações" info: "Informações" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: esper: line_no: "Linha $1: " - x_not_a_function: "`$1` não é uma função" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "`$1` não é uma função" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee index 9683fce1d6e..c2b68374399 100644 --- a/app/locale/ro.coffee +++ b/app/locale/ro.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman create: "Creează" fork: "Fork" play: "Joacă" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Reîncearca" actions: "Acţiuni" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/rot13.coffee b/app/locale/rot13.coffee index e70e2f70638..de7d5810cc0 100644 --- a/app/locale/rot13.coffee +++ b/app/locale/rot13.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "rot13", englishDescription: "English with t create: "Perngr" fork: "Sbex" play: "Cynl" # Jura hfrq nf na npgvba ireo, yvxr "Cynl arkg yriry" + subscribe_to_play: "Fhofpevor gb Cynl" retry: "Ergel" actions: "Npgvbaf" info: "Vasb" diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index a5da4e04ba0..003b374b5f1 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi create: "Создать" fork: "Форк" play: "Играть" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Повторить" actions: "Действия" info: "Информация" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi esper: line_no: "Строка $1: " - x_not_a_function: "`$1` не является функцией" - type_error: "TypeError (ошибка типа данных): " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "ReferenceError (ошибка указателя): " +# argument_error: "ArgumentError: " + type_error: "TypeError (ошибка типа данных): " +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "`$1` не является функцией" +# x_not_defined: "$1 is not defined" spelling_issues: "Проверьте правильность написания: может вы хотели написать `$1` вместо `$2`?" capitalization_issues: "Проверьте заглавные и прописные буквы: `$1` должно быть `$2`." py_empty_block: "Пустой $1. Добавьте 4 пробела перед инструкциями внутри $2." fx_missing_paren: "Если вы хотите использовать `$1` как функцию, то нужно добавить `()`" unmatched_token: "Не совпадают `$1`. Каждый(ая) `$2` должен(на) закрываться `$3`." unterminated_string: "Незавершенная строка. Добавьте `\"` в конце строки при переносе." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee index b3de501284d..d779acf3e8f 100644 --- a/app/locale/sk.coffee +++ b/app/locale/sk.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", create: "Vytvoriť" fork: "Klonovať" play: "Hraj" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Znova" actions: "Príkazy" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee index 05796d9010e..428d30e9019 100644 --- a/app/locale/sl.coffee +++ b/app/locale/sl.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven create: "Ustvari" fork: "Razveji" play: "Poženi" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Ponovni poskus" actions: "Dejanja" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee index a7af74071ed..f58131e8834 100644 --- a/app/locale/sr.coffee +++ b/app/locale/sr.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian create: "Направи" fork: "Форкуј" play: "Играј" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Покушај поново" actions: "Радње" info: "Инфо" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee index 7fb13e474b3..cbfd44a4363 100644 --- a/app/locale/sv.coffee +++ b/app/locale/sv.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr create: "Skapa" fork: "Förgrena" play: "Spela" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Försök igen" actions: "Handlingar" info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/th.coffee b/app/locale/th.coffee index 1f0b3ecc36f..abf5710050b 100644 --- a/app/locale/th.coffee +++ b/app/locale/th.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # create: "Create" # fork: "Fork" play: "เล่น" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee index 11a825af369..911ba9e9c15 100644 --- a/app/locale/tr.coffee +++ b/app/locale/tr.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t create: "Oluştur" fork: "Çatalla" play: "Oyna" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Yeniden Dene" actions: "Eylemler" info: "Bilgi" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee index e33673e1ff2..5707239680f 100644 --- a/app/locale/uk.coffee +++ b/app/locale/uk.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Українська", englishDescription: create: "Створити" fork: "Форк" play: "Грати" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Повтор" actions: "Дії" info: "Інформація" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Українська", englishDescription: # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee index dee03f2883e..7ca82efa8e0 100644 --- a/app/locale/ur.coffee +++ b/app/locale/ur.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/uz.coffee b/app/locale/uz.coffee index fdda7ab650d..af0d5d657f0 100644 --- a/app/locale/uz.coffee +++ b/app/locale/uz.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee index d37b3d64e27..79a9336496e 100644 --- a/app/locale/vi.coffee +++ b/app/locale/vi.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn create: "Tạo mới" fork: "Nĩa" play: "Chơi" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "Thử lại" actions: "Các hành Động" info: "Thông tin" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 832e9231f27..1f74b06549c 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese create: "创建" fork: "派生" play: "开始" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "重试" actions: "行为" info: "信息" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese esper: line_no: "第$1行: " - x_not_a_function: "`$1` 不是一个函数" - type_error: "拼写错误:" +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "参考错误:" +# argument_error: "ArgumentError: " + type_error: "拼写错误:" +# syntax_error: "SyntaxError: " +# error: "Error: " + x_not_a_function: "`$1` 不是一个函数" +# x_not_defined: "$1 is not defined" spelling_issues: "请注意拼写错误:你指的是`$1`而不是`$2`, 对吗?" capitalization_issues: "请注意大小写:`$1` 应该改成 `$2`?" - # py_empty_block: "空变量。在$1的语句中,加入4个空格。" # {change} +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." fx_missing_paren: "如果你需要把`$1` 称为函数,你需要加`()`'s" unmatched_token: "非匹配`$1`。每一个开放的`$2`都需要一个`$3`配对。" unterminated_string: "未终止字符串,在字符串末加上另外一个`\"`。" +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee index 0fd0a33490b..fb218509dd0 100644 --- a/app/locale/zh-HANT.coffee +++ b/app/locale/zh-HANT.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese create: "創造" fork: "分支" play: "進入關卡" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "重試" actions: "行為" info: "介紹" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "繁體中文", englishDescription: "Chinese # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee index 068502d079e..2934c0f0462 100644 --- a/app/locale/zh-WUU-HANS.coffee +++ b/app/locale/zh-WUU-HANS.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # create: "Create" # fork: "Fork" # play: "Play" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" # retry: "Retry" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee index 699587bf3d1..52b05b4d8f9 100644 --- a/app/locale/zh-WUU-HANT.coffee +++ b/app/locale/zh-WUU-HANT.coffee @@ -340,6 +340,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio create: "起造" fork: "派生" play: "開來" # When used as an action verb, like "Play next level" +# subscribe_to_play: "Subscribe to Play" retry: "轉試" # actions: "Actions" # info: "Info" @@ -2303,12 +2304,79 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # esper: # line_no: "Line $1: " -# x_not_a_function: "`$1` is not a function" -# type_error: "TypeError: " +# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" # reference_error: "ReferenceError: " +# argument_error: "ArgumentError: " +# type_error: "TypeError: " +# syntax_error: "SyntaxError: " +# error: "Error: " +# x_not_a_function: "$1 is not a function" +# x_not_defined: "$1 is not defined" # spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" # capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2." -# fx_missing_paren: "If you want to call `$1` as function, you need `()`'s" +# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." +# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" # unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." # unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." +# missing_semicolon: "Missing semicolon." +# missing_quotes: "Missing quotes. Try `$1`" +# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." +# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." +# target_a_unit: "Target a unit." +# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" +# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." +# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" +# need_a_after_while: "Need a `$1` after `$2`." +# too_much_indentation: "Too much indentation at the beginning of this line." +# missing_hero: "Missing `$1` keyword; should be `$2`." +# takes_no_arguments: "`$1` takes no arguments." +# no_one_named: "There's no one named \"$1\" to target." +# separated_by_comma: "Function calls paramaters must be seperated by `,`s" +# protected_property: "Can't read protected property: $1" +# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" +# expected_an_identifier: "Expected an identifier and instead saw '$1'." +# unexpected_identifier: "Unexpected identifier" +# unexpected_end_of: "Unexpected end of input" +# unnecessary_semicolon: "Unnecessary semicolon." +# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" +# unexpected_token: "Unexpected token $1" +# unexpected_token2: "Unexpected token" +# unexpected_number: "Unexpected number" +# unexpected: "Unexpected '$1'." +# escape_pressed_code: "Escape pressed; code aborted." +# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." +# target_an_enemy_2: "Target an enemy by name, like $1." +# cannot_read_property: "Cannot read property '$1' of undefined" +# attempted_to_assign: "Attempted to assign to readonly property." +# unexpected_early_end: "Unexpected early end of program." +# you_need_a_string: "You need a string to build; one of $1" +# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? +# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." +# unclosed_string: "Unclosed string." +# unmatched: "Unmatched '$1'." +# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" +# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" +# indentation_error: "Indentation error." +# need_a_on_the: "Need a `:` on the end of the line following `$1`." +# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" +# unterminated: "Unterminated `$1`" +# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" +# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" +# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" +# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." +# unexpected_end_of_input: "Unexpected end of input" +# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here +# try_herofindnearestenemy: "Try `$1`" +# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." +# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." +# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" +# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" +# hero_has_no_method: "`$1` has no method `$2`." +# there_is_a_problem: "There is a problem with your code." +# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." +# missing_a_quotation_mark: "Missing a quotation mark. " +# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." +# you_do_not_have: "You do not have an item equipped with the $1 skill." +# put_each_command_on: "Put each command on a separate line" +# are_you_missing_a: "Are you missing a '$1' after '$2'? " +# your_parentheses_must_match: "Your parentheses must match." From bca64d15398950ce3dc19c0577dd0763064c1a71 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Mon, 7 Aug 2017 11:13:33 -0700 Subject: [PATCH 017/227] Revert "Change premium level play button text if free user" This reverts commit f01e31dd0f389f499da4e6defeac37625838f51f. Will put this back in after we make some design decisions about logged-out users. --- app/locale/en.coffee | 1 - app/templates/play/campaign-view.jade | 5 +---- app/views/play/CampaignView.coffee | 9 +++------ 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 364167f741c..000130f15c4 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -340,7 +340,6 @@ create: "Create" fork: "Fork" play: "Play" # When used as an action verb, like "Play next level" - subscribe_to_play: "Subscribe to Play" retry: "Retry" actions: "Actions" info: "Info" diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 1c06ae04a87..154c4b89be3 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -148,10 +148,7 @@ if view.showAds() button.btn.btn-primary.btn.btn-lg.btn-block.btn-illustrated span(data-i18n="common.play") Play else - if view.levelNeedsSubscription(level) - button.btn.btn-primary.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.subscribe_to_play") Subscribe to Play - else - button.btn.btn-success.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.play") Play + button.btn.btn-success.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.play") Play for adjacentCampaign in adjacentCampaigns diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 5ff2a87fac0..793ccbde019 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -786,18 +786,15 @@ module.exports = class CampaignView extends RootView levelOriginal = levelElement.data('level-original') @trigger 'level-double-clicked', levelOriginal - levelNeedsSubscription: (level) -> - requiresSubscription = level.requiresSubscription or (me.isOnPremiumServer() and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names'])) - canPlayAnyway = not @requiresSubscription or level.adventurer or @levelStatusMap[level.slug] or (features.codePlay and codePlay.canPlay(level.slug)) - return requiresSubscription and not canPlayAnyway - onClickStartLevel: (e) -> levelElement = $(e.target).parents('.level-info-container') levelSlug = levelElement.data('level-slug') levelOriginal = levelElement.data('level-original') level = _.find _.values(@getLevels()), slug: levelSlug - if @levelNeedsSubscription(level) + requiresSubscription = level.requiresSubscription or (me.isOnPremiumServer() and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names'])) + canPlayAnyway = not @requiresSubscription or level.adventurer or @levelStatusMap[level.slug] or (features.codePlay and codePlay.canPlay(level.slug)) + if requiresSubscription and not canPlayAnyway @promptForSubscription levelSlug, 'map level clicked' else @startLevel levelElement From 1d47035916ce4178104cfcd0a4644e1430a68472 Mon Sep 17 00:00:00 2001 From: joca16 Date: Mon, 7 Aug 2017 22:13:25 +0200 Subject: [PATCH 018/227] Update de-DE.coffee Minor fixes. Startet translating error messages. Thank you for the error messages in i18n! --- app/locale/de-DE.coffee | 113 +++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index 097a91fcd3f..a36a884b74c 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -65,7 +65,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: want_coco: "Wollen Sie CodeCombat an ihrer Schule?" nav: -# map: "Map" + map: "Karte" play: "Spielen" # The top nav bar entry where players choose which levels to play community: "Community" courses: "Kurse" @@ -320,7 +320,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: common: back: "Zurück" # When used as an action verb, like "Navigate backward" -# go_back: "Go Back" + go_back: "Zurückgehen" coming_soon: "Demnächst!" continue: "Weiter" # When used as an action verb, like "Continue forward" next: "Weiter" @@ -328,7 +328,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: loading: "Lade..." overview: "Übersicht" solution: "Lösung" -# table_of_contents: "Table of Contents" + table_of_contents: "Inhaltsverzeichnis" intro: "Einführung" saving: "Speichere..." sending: "Sende..." @@ -340,7 +340,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: create: "Erstellen" fork: "Kopieren" play: "Spielen" # When used as an action verb, like "Play next level" -# subscribe_to_play: "Subscribe to Play" + subscribe_to_play: "Abonniere zum Spielen" retry: "Erneut versuchen" actions: "Aktionen" info: "Informationen" @@ -428,7 +428,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: years: "Jahre" play_level: -# back_to_map: "Back to Map" + back_to_map: "Zurück zur Karte" directions: "Richtungen" edit_level: "Level bearbeiten" explore_codecombat: "CodeCombat entdecken" @@ -570,16 +570,13 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: tip_good_idea: "Die beste Möglichkeit, eine gute Idee zu haben, ist, eine Menge Ideen zu haben. – Linus Pauling" tip_programming_not_about_computers: "In der Informatik geht es ebenso wenig um Computer, wie es in der Astronomie um Teleskope geht. – Edsger Dijkstra" tip_mulan: "Glaube, dass du es kannst, dann wirst du es tun. – Mulan" -# project_complete: "Project Complete!" -# share_this_project: "Share this project with friends or family:" -# ready_to_share: "Ready to publish your project?" -# click_publish: "Click \"Publish\" to make it appear in the class gallery, then check out what your classmates built! You can come back and continue to work on this project. Any further changes will automatically be saved and shared with your classmates." -# already_published_prefix: "Your changes have been published to the class gallery." -# already_published_suffix: "Keep experimenting and making this project even better, or see what the rest of your class has built! Your changes will automatically be saved and shared with your classmates." -# view_gallery: "View Gallery" -# project_published_noty: "Your level has been published!" -# keep_editing: "Keep Editing" - + project_complete: "Projekt abgeschlossen!" + share_this_project: "Teile dieses Projekt mit Freunden oder der Familie:" + ready_to_share: "Bereit, dein Projekt zu veröffentlichen?" + click_publish: "Klicke auf \"Veröffentlichen\" damit es in der Klassengalerie erscheint, dann sieh dir an, wass deine Klassenkameraden erstellt haben. Du kannst später an diesem Projekt weiterarbeiten. Alle Änderungen werden automatisch gesichert und mit deinen Klassenkameraden geteilt." + already_published_prefix: "Deine Änderungen wurden in der Galerie veröffentlicht." + already_published_suffix: "Experimentiere weiter und mach diese Projekt noch besser oder sieh dir an, was der Rest der Klasse erstellt hat! Deine Änderungen werden automatisch gesichert und mit deinen Klassenkameraden geteilt." + play_game_dev_level: created_by: "Erstellt von {{name}}" restart: "Level neu starten" @@ -650,7 +647,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: prompt_body: "Spiele weiter und verdiene mehr!" subscribe: -# premium_already_subscribed: "You're already subscribed to Premium!" + premium_already_subscribed: "Du bist bereits Abonnent!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Werde Master Coder und bestelle das Premium-Abonnent!" premium_pricing_prefix: "Hol dir Premium für nur" @@ -722,12 +719,12 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: support_part1: "Brauchst du Hilfe bei den Zahlungsoptionen? Schicke eine E-Mail an" support_part2: "support@codecombat.com" support_part3: "wenn du Fragen hast." -# you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" -# you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" -# you_will_be_charged: "You will be charged $__priceString__ one time." -# choose_payment_method: "Choose Payment Method" -# pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" -# paypal_payment_error: "We encountered an error while charging PayPal." + you_are_purchasing_year_sub: "Du kaufst ein Jahresabonnement!" + you_are_purchasing_lifetime_sub: "Du kaufst ein lebenslanges Abonnement!" + you_will_be_charged: "Du bezahlst einmalig $__priceString__ ." + choose_payment_method: "Wähle deine Zahlungsweise" + pay_with_credit_card_or_bitcoin: "Zahle mit Kreditkarte / Bitcoin" + paypal_payment_error: "Bei der Zahlunmg mit PayPal ist ein Fehler aufgetreten." announcement: now_available: "Jetzt verfügbar für Abonnenten!" @@ -918,8 +915,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: retrostyle_blurb: "RetroStyle Games" jose_title: "Musik" jose_blurb: "Taking Off" -# bryukh_title: "Game Designer" -# bryukh_blurb: "Constructs puzzles" + bryukh_title: "Game Designer" + bryukh_blurb: "Rätselkonstruktör" community_title: "...und unsere Open-Source Community" community_subtitle: "Mehr als 500 Unterstützer haben mitgeholfen, CodeCombat zu erstellen, und es werden jede Woche mehr!" community_description_3: "CodeCombat ist ein" @@ -1101,14 +1098,14 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: delete_account_tab: "Account löschen" wrong_email: "Die Emailadresse ist falsch" wrong_password: "Das Passwort ist falsch" -# use_gravatar: "Change your profile picture by signing up for Gravatar" + use_gravatar: "Ändere dein Profilbild indem du dich bei Gravatar anmeldest" delete_this_account: "Den Account unwiderruflich löschen!" reset_progress_tab: "Spielfortschritt zurücksetzen" reset_your_progress: "Gesamten Fortschritt zurücksetzen und Spiel von vorn beginnen" god_mode: "Gottmodus" emails_tab: "Emails" admin: "Admin" - manage_subscription: "Klicke hier um ihr Abo zu verwalten." + manage_subscription: "Klicke hier um dein Abo zu verwalten." new_password: "Neues Passwort" new_password_verify: "Passwort verifizieren" type_in_email: "Email oder Benutzername eingeben um das Löschen des Accounts zu bestätigen" @@ -1261,7 +1258,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: switch_to: "Wechseln zu" greetings: "Grüße!" back_classrooms: "Zurück zu meinem Klassenraum" -# back_classroom: "Back to classroom" + back_classroom: "Zurück zum Klassenraum" back_courses: "Zurück zu meinen Kursen" edit_details: "Klassendetails bearbeiten" purchase_enrollments: "Kaufe Schüler-Lizenzen" @@ -1272,10 +1269,10 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: teacher: "Lehrer" arena: "Arena" available_levels: "Verfügbare Level" -# started: "started" -# complete: "complete" -# practice: "practice" -# required: "required" + started: "angefangen" + complete: "abgeschlossen" + practice: "Übung" +# required: "erforderlich" welcome_to_courses: "Abenteurer, willkomen zu den Kursen!" ready_to_play: "Bereit zum Spielen?" start_new_game: "Starten Sie ein neues Spiel" @@ -1288,7 +1285,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: my_classes: "Meine Klassen" class_added: "Klasse erfolgreich hinzugefügt!" view_levels: "Alle Level der Klasse betrachten" -# view_project_gallery: "view my classmates' projects" + view_project_gallery: "Projekte der Klassenkameraden ansehen" join_class: "Einer Klasse beitreten" join_class_2: "In Klasse einschreiben" ask_teacher_for_code: "Frag deine Lehrkraft ob ihr einen CodeCombat Klassencode habt! Gib ihn hier ein:" @@ -1385,10 +1382,10 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: course_membership_required_to_play: "Du musst einen Kurs belegen, um dieses Level zu spielen." license_required_to_play: "Bitte deinen Lehrer, dir eine Lizenz zuzuweisen, damit du weiter CodeCombat spielen kannst!" -# project_gallery: -# no_projects_published: "Be the first to publish a project in this course!" -# view_project: "View Project" -# edit_project: "Edit Project" + project_gallery: + no_projects_published: "Sei der oder die erste, die in diesem Kurs ein Projekt veröffentlicht" + view_project: "Projekt ansehen" + edit_project: "Projekt bearbeiten" teacher: assigning_course: "Kurs zuweisen" @@ -1509,9 +1506,9 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: status_enrolled: "Läuft ab am {{date}}" select_all: "Alle auswählen" project: "Projekt" -# project_gallery: "Project Gallery" -# view_project: "View Project" -# unpublished: "(unpublished)" + project_gallery: "Projekt-Galerie" + view_project: "Projekt ansehen" + unpublished: "(nicht veröffnetlicht)" view_arena_ladder: "Arenarangliste anzeigen" resource_hub: "Resource Hub" getting_started: "Erste Schritte" @@ -1652,7 +1649,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: teacher_quest_more: "Alle Schritte anzeigen" teacher_quest_less: "Weniger Schritte anzeigen" refresh_to_update: "(Seite aktualisieren)" -# view_project_gallery: "View Project Gallery" + view_project_gallery: "Projekt-Galerie ansehen" share_licenses: share_licenses: "Gemeinsam genutzte Lizenzen" @@ -1691,7 +1688,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: creator: "Editor" web_dev: - image_gallery_title: "Bildergallerie" + image_gallery_title: "Bildergalerie" select_an_image: "Wähle ein Bild aus, das du benutzen willst" scroll_down_for_more_images: "(Runterscrollen für mehr Bilder)" copy_the_url: "Kopiere die folgende URL" @@ -2305,33 +2302,33 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: esper: line_no: "Zeile $1: " # uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" - reference_error: "BezugsFehler: " -# argument_error: "ArgumentError: " - type_error: "TypFehler: " -# syntax_error: "SyntaxError: " -# error: "Error: " + reference_error: "Bezugs-Fehler: " + argument_error: "Argument-Fehler: " + type_error: "Typ-Fehler: " + syntax_error: "Syntax-Fehler: " + error: "Fehler: " x_not_a_function: "`$1` ist keine Funktion." -# x_not_defined: "$1 is not defined" + x_not_defined: "$1 ist nicht definiert" spelling_issues: "Achte auf die Schreibweise: meintest du `$1` anstelle von `$2`?" capitalization_issues: "Achte auf Groß-/Kleinschreibung: `$1` sollte `$2` heißen." py_empty_block: "Leeres $1. Schreibe 4 Leerzeichen vor allen Anweisungen innerhalb des $2." fx_missing_paren: "Wenn du `$1` als Funktion verwenden möchtest, dann brauchst du `()`." unmatched_token: "`$1` ohne Gegenpart. Jede öffnende `$2` benötigt eine zugehörige schließende `$3`." unterminated_string: "String ohne Abschluss. Füge ein ein `\"` am Ende deiner Zeichenkette hinzu." -# missing_semicolon: "Missing semicolon." -# missing_quotes: "Missing quotes. Try `$1`" + missing_semicolon: "Semikolon fehlt." + missing_quotes: "Anfühfrungszeichen fehlen. Versuche `$1`" # argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." # argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." -# target_a_unit: "Target a unit." -# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" -# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." + target_a_unit: "Ziel(target) sollte eine Einheit(unit) sein." + attack_capitalization: "Greife $1 an, nicht $2. (Groß- und Kleinschreibung ist wichtig.)" + empty_while: "Leere While-Schleife. Setze 4 Leerzeichen vor die Befehle innerhalb der While-Schleife." # line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" -# need_a_after_while: "Need a `$1` after `$2`." -# too_much_indentation: "Too much indentation at the beginning of this line." -# missing_hero: "Missing `$1` keyword; should be `$2`." -# takes_no_arguments: "`$1` takes no arguments." -# no_one_named: "There's no one named \"$1\" to target." -# separated_by_comma: "Function calls paramaters must be seperated by `,`s" + need_a_after_while: "`$1` erforderlich nach `$2`." + too_much_indentation: "Zu viele Leerzeichen eingerückt am Anfang dieser Zeile." + missing_hero: "Das Schlüsselwort `$1` fehlt; es sollte `$2` sein." + takes_no_arguments: "`$1` hat keine Argumente." + no_one_named: "Es gibt kein Ziel mit Namen \"$1\"." + separated_by_comma: "Parameter in Funktionsaufrufen müssen durch `,`s getrennt werden" # protected_property: "Can't read protected property: $1" # need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" # expected_an_identifier: "Expected an identifier and instead saw '$1'." From 9d505c94f9b8165c113e5fd241646f1591ee9ce7 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Mon, 7 Aug 2017 12:52:09 -0700 Subject: [PATCH 019/227] Remove payment processor choice --- app/styles/modal/subscribe-modal.sass | 18 +-- app/templates/core/subscribe-modal.jade | 117 +++++++--------- app/views/core/SubscribeModal.coffee | 50 +++---- .../app/views/core/SubscribeModal.spec.coffee | 128 ++++++++---------- 4 files changed, 133 insertions(+), 180 deletions(-) diff --git a/app/styles/modal/subscribe-modal.sass b/app/styles/modal/subscribe-modal.sass index eb05dd52653..4351d68c0e4 100644 --- a/app/styles/modal/subscribe-modal.sass +++ b/app/styles/modal/subscribe-modal.sass @@ -264,7 +264,7 @@ //- Lifetime button - .lifetime-button + .stripe-lifetime-button font-size: 24px line-height: 30px border-style: solid @@ -279,17 +279,11 @@ span pointer-events: none - // Payment method selection screen - .payment-selection-screen - .big-text:first-child - color: black - - #paypal-button-container - // Prevent jitter - height: 45px - width: 276px - display: block - margin: 0 auto 10px auto + #paypal-button-container + height: 45px + width: 250px + display: inline-block + margin: 5px auto 0px auto .email-parent-form .email_invalid diff --git a/app/templates/core/subscribe-modal.jade b/app/templates/core/subscribe-modal.jade index 7d956bc15b1..cbab6b0d49e 100644 --- a/app/templates/core/subscribe-modal.jade +++ b/app/templates/core/subscribe-modal.jade @@ -15,77 +15,56 @@ span.glyphicon.glyphicon-remove div.paper-area - if view.state === 'choosing-payment-method' - .payment-selection-screen - a.back-to-products - ="< " - span(data-i18n="common.go_back") - .container-fluid - .text-center - mixin productPurchaseInfo(productDescriptionTranslationKey) - .big-text(data-i18n=productDescriptionTranslationKey) - .med-text - = translate("subscribe.you_will_be_charged", { priceString: view.selectedProduct.adjustedPriceStringNoSymbol() }) - hr - .big-text(data-i18n="subscribe.choose_payment_method") + div.benefits-header.text-center(data-i18n="[html]subscribe.comparison_blurb") + + + .container-fluid + .row + .col-xs-5.feature-col.col-xs-offset-1 + ul + li(data-i18n="subscribe.feature_levels" data-i18n-options={premiumLevelsCount:view.i18nData.premiumLevelsCount}) + if view.basicProduct + li(data-i18n="subscribe.feature_gems", data-i18n-options={gems:view.basicProduct.get('gems')}) + li(data-i18n="subscribe.feature_heroes") + + + .col-xs-5.feature-col + ul + li(data-i18n="subscribe.feature_games") + li(data-i18n="subscribe.feature_websites") + li(data-i18n="subscribe.feature_items") + + hr + + mixin price(name, p) + - var origPrice = p.priceStringNoSymbol() + - var salePrice = p.adjustedPriceStringNoSymbol() + if origPrice == salePrice + .price(data-i18n=name, data-i18n-options={price:origPrice}) + else + div + span.old-price(data-i18n=name, data-i18n-options={price:origPrice}) + span.price(data-i18n=name, data-i18n-options={price:salePrice}) + + .row + - var secondRowClass = '.col-xs-5' + if view.basicProduct + .col-xs-5.option-col.col-xs-offset-1 + .option-header.text-center(data-i18n="subscribe.stripe_description") + +price("subscribe.month_price", view.basicProduct) + button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") + + else + - var secondRowClass = '.col-xs-12' + + if view.lifetimeProduct + .option-col(class=secondRowClass) + .option-header.text-center(data-i18n="subscribe.lifetime") + +price("subscribe.lifetime_price", view.lifetimeProduct) + if view.paymentProcessor === 'PayPal' #paypal-button-container - button#stripe-button.btn.btn-lg.btn-success(data-i18n="subscribe.pay_with_credit_card_or_bitcoin") - - if view.selectedProduct === view.lifetimeProduct - +productPurchaseInfo("subscribe.you_are_purchasing_lifetime_sub") else - h2 - | Something went wrong :( - - - else - div.benefits-header.text-center(data-i18n="[html]subscribe.comparison_blurb") - - - .container-fluid - .row - .col-xs-5.feature-col.col-xs-offset-1 - ul - li(data-i18n="subscribe.feature_levels" data-i18n-options={premiumLevelsCount:view.i18nData.premiumLevelsCount}) - if view.basicProduct - li(data-i18n="subscribe.feature_gems", data-i18n-options={gems:view.basicProduct.get('gems')}) - li(data-i18n="subscribe.feature_heroes") - - - .col-xs-5.feature-col - ul - li(data-i18n="subscribe.feature_games") - li(data-i18n="subscribe.feature_websites") - li(data-i18n="subscribe.feature_items") - - hr - - mixin price(name, p) - - var origPrice = p.priceStringNoSymbol() - - var salePrice = p.adjustedPriceStringNoSymbol() - if origPrice == salePrice - .price(data-i18n=name, data-i18n-options={price:origPrice}) - else - div - span.old-price(data-i18n=name, data-i18n-options={price:origPrice}) - span.price(data-i18n=name, data-i18n-options={price:salePrice}) - - .row - - var secondRowClass = '.col-xs-5' - if view.basicProduct - .col-xs-5.option-col.col-xs-offset-1 - .option-header.text-center(data-i18n="subscribe.stripe_description") - +price("subscribe.month_price", view.basicProduct) - button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") - - else - - var secondRowClass = '.col-xs-12' - - if view.lifetimeProduct - .option-col(class=secondRowClass) - .option-header.text-center(data-i18n="subscribe.lifetime") - +price("subscribe.lifetime_price", view.lifetimeProduct) - button.btn.btn-lg.btn-illustrated.lifetime-button(data-i18n="subscribe.buy_now") + button.stripe-lifetime-button.btn.btn-lg.btn-illustrated(data-i18n="subscribe.buy_now") div p diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index e185248e33f..f816578bd2c 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -19,14 +19,12 @@ module.exports = class SubscribeModal extends ModalView 'click .popover-content .parent-send': 'onClickParentSendButton' 'click .email-parent-complete button': 'onClickParentEmailCompleteButton' 'click .purchase-button': 'onClickPurchaseButton' - 'click .lifetime-button': 'onClickLifetimeButton' + 'click .stripe-lifetime-button': 'onClickStripeLifetimeButton' 'click .back-to-products': 'onClickBackToProducts' - 'click #stripe-button': 'onClickStripeButton' constructor: (options={}) -> super(options) @state = 'standby' - @selectedProduct = null # Used for payment processing screen if options.products # this is just to get the test demo to work @products = options.products @@ -43,7 +41,13 @@ module.exports = class SubscribeModal extends ModalView onLoaded: -> @basicProduct = @products.getBasicSubscriptionForUser(me) @lifetimeProduct = @products.getLifetimeSubscriptionForUser(me) + if @lifetimeProduct?.get('name') isnt 'lifetime_subscription' + # Use PayPal for international users with regional pricing + @paymentProcessor = 'PayPal' + else + @paymentProcessor = 'stripe' super() + @render() getRenderData: -> context = super(arguments...) @@ -56,19 +60,18 @@ module.exports = class SubscribeModal extends ModalView return if @state is 'purchasing' super(arguments...) # NOTE: The PayPal button MUST NOT be removed from the page between clicking it and completing the payment, or the payment is cancelled. - if @state is 'choosing-payment-method' and @selectedProduct - @renderPayPalButton() + @renderPayPalButton() null renderPayPalButton: -> - if @$('#paypal-button-container').length + if @$('#paypal-button-container').length and not @$('#paypal-button-container').children().length descriptionTranslationKey = 'subscribe.lifetime' - discount = @basicProduct.get('amount') * 12 - @selectedProduct.get('amount') + discount = @basicProduct.get('amount') * 12 - @lifetimeProduct.get('amount') discountString = (discount/100).toFixed(2) description = $.i18n.t(descriptionTranslationKey).replace('{{discount}}', discountString) payPal?.makeButton({ buttonContainerID: '#paypal-button-container' - product: @selectedProduct + product: @lifetimeProduct onPaymentStarted: @onPayPalPaymentStarted onPaymentComplete: @onPayPalPaymentComplete description @@ -101,11 +104,6 @@ module.exports = class SubscribeModal extends ModalView ).on 'shown.bs.popover', => application.tracker?.trackEvent 'Subscription ask parent button click' - onClickBackToProducts: (e) -> - @state = 'standby' - @selectedProduct = null - @render() - onClickParentSendButton: (e) -> # TODO: Popover sometimes dismisses immediately after send @@ -123,6 +121,7 @@ module.exports = class SubscribeModal extends ModalView onClickParentEmailCompleteButton: (e) -> @$el.find('.parent-link').popover('hide') + # For monthly subs onClickPurchaseButton: (e) -> return unless @basicProduct @playSound 'menu-button-click' @@ -156,16 +155,8 @@ module.exports = class SubscribeModal extends ModalView out.data.coupon = utils.getQueryVariable('coupon') out - onClickLifetimeButton: -> - unless @reportedLifetimeClick - application.tracker?.trackEvent 'SubscribeModal Lifetime Button Click' - @reportedLifetimeClick = true - @state = 'choosing-payment-method' - @selectedProduct = @lifetimeProduct - @render() - + # For lifetime subs onPayPalPaymentStarted: => - throw new Error("Can't use PayPal on that product! Something went wrong.") unless @selectedProduct is @lifetimeProduct @playSound 'menu-button-click' return @openModalView new CreateAccountModal() if me.get('anonymous') startEvent = 'Start Lifetime Purchase' @@ -173,14 +164,14 @@ module.exports = class SubscribeModal extends ModalView @state = 'purchasing' @render() # TODO: Make sure this doesn't break paypal from button regenerating + # For lifetime subs onPayPalPaymentComplete: (payment) => # NOTE: payment is a PayPal payment object, not a CoCo Payment model # TODO: Send payment info to server, confirm it - throw new Error("Can't use stripe on that product! Something went wrong.") unless @selectedProduct is @lifetimeProduct finishEvent = 'Finish Lifetime Purchase' failureMessage = 'Fail Lifetime Purchase' @purchasedAmount = Number(payment.transactions[0].amount.total) * 100 - return Promise.resolve(@selectedProduct.purchaseWithPayPal(payment, @makePurchaseOps())) + return Promise.resolve(@lifetimeProduct.purchaseWithPayPal(payment, @makePurchaseOps())) .then (response) => application.tracker?.trackEvent finishEvent, { value: @purchasedAmount, service: 'paypal' } me.set 'payPal', response?.payPal if response?.payPal? @@ -189,8 +180,7 @@ module.exports = class SubscribeModal extends ModalView return unless jqxhr # in case of cancellations @onSubscriptionError(jqxhr, failureMessage) - onClickStripeButton: -> - throw new Error("Can't use stripe on that product! Something went wrong.") unless @selectedProduct is @lifetimeProduct + onClickStripeLifetimeButton: -> @playSound 'menu-button-click' return @openModalView new CreateAccountModal() if me.get('anonymous') startEvent = 'Start Lifetime Purchase' @@ -198,19 +188,19 @@ module.exports = class SubscribeModal extends ModalView descriptionTranslationKey = 'subscribe.lifetime' failureMessage = 'Fail Lifetime Purchase' application.tracker?.trackEvent startEvent, { service: 'stripe' } - discount = @basicProduct.get('amount') * 12 - @selectedProduct.get('amount') + discount = @basicProduct.get('amount') * 12 - @lifetimeProduct.get('amount') discountString = (discount/100).toFixed(2) options = @stripeOptions { description: $.i18n.t(descriptionTranslationKey).replace('{{discount}}', discountString) - amount: @selectedProduct.adjustedPrice() + amount: @lifetimeProduct.adjustedPrice() } @purchasedAmount = options.amount stripeHandler.makeNewInstance().openAsync(options) .then ({token}) => @state = 'purchasing' @render() - # Purchasing a year - return Promise.resolve(@selectedProduct.purchase(token, @makePurchaseOps())) + # Purchasing a lifetime sub + return Promise.resolve(@lifetimeProduct.purchase(token, @makePurchaseOps())) .then (response) => application.tracker?.trackEvent finishEvent, { value: @purchasedAmount, service: 'stripe' } me.set 'stripe', response?.stripe if response?.stripe? diff --git a/test/app/views/core/SubscribeModal.spec.coffee b/test/app/views/core/SubscribeModal.spec.coffee index a01c0f78280..c9e5171a3fd 100644 --- a/test/app/views/core/SubscribeModal.spec.coffee +++ b/test/app/views/core/SubscribeModal.spec.coffee @@ -13,13 +13,6 @@ productList = [ planID: 'basic' } - { - _id: '2' - name: 'year_subscription' - amount: 1000 - gems: 42000 - } - { _id: '3' name: 'lifetime_subscription' @@ -28,8 +21,7 @@ productList = [ } ] -productListNoYear = _.filter(productList, (p) -> p.name isnt 'year_subscription') -productListNoLifetime = _.filter(productList, (p) -> p.name isnt 'lifetime_subscription') +productListInternational = _.map(productList, (p) -> _.assign({}, p, {name: 'brazil_' + p.name})) # Make a fake button for testing, used by calling ".click()" makeFakePayPalButton = (options) -> @@ -96,31 +88,11 @@ describe 'SubscribeModal', -> expect(options.alipayReusable).toBeDefined() expect(options.alipay).toBeDefined() - it 'lifetime demo', -> - modal = new SubscribeModal({products: new Products(productListNoYear)}) - modal.render() - jasmine.demoModal(modal) - modal.stopListening() - - it 'year sub demo', -> - modal = new SubscribeModal({products: new Products(productListNoLifetime)}) - modal.render() - jasmine.demoModal(modal) - modal.stopListening() - - it 'payment processor selection demo', -> - modal = new SubscribeModal({products: new Products(productListNoYear)}) - modal.state = 'choosing-payment-method' - modal.selectedProduct = modal.lifetimeProduct - modal.render() - jasmine.demoModal(modal) - modal.stopListening() - describe 'onClickPurchaseButton()', -> beforeEach -> me.set({_id: '1234'}) @subscribeRequest = jasmine.Ajax.stubRequest('/db/user/1234') - @modal = new SubscribeModal({products: new Products(productListNoLifetime)}) + @modal = new SubscribeModal({products: new Products(productList)}) @modal.render() jasmine.demoModal(@modal) @@ -172,57 +144,75 @@ describe 'SubscribeModal', -> ["Started subscription purchase", "Failed to finish subscription purchase"]) expect(console.error).toHaveBeenCalled() - describe 'onClickLifetimeButton()', -> - beforeEach -> - me.set({_id: '1234'}) - @purchaseRequest = jasmine.Ajax.stubRequest('/db/products/3/purchase') - @modal = new SubscribeModal({products: new Products(productListNoYear)}) - @modal.render() - jasmine.demoModal(@modal) - @openAsync.and.returnValue(tokenSuccess) - - describe 'when the purchase succeeds', -> + describe 'onClickStripeLifetimeButton()', -> + describe "when user's country does not have regional pricing", -> beforeEach -> - @purchaseRequest.andReturn({status: 200, responseText: '{}'}) - - describe 'when using PayPal', -> + me.set({_id: '1234', country: undefined}) + @purchaseRequest = jasmine.Ajax.stubRequest('/db/products/3/purchase') + @modal = new SubscribeModal({products: new Products(productList)}) + @modal.render() + jasmine.demoModal(@modal) + @openAsync.and.returnValue(tokenSuccess) + + it 'uses Stripe', -> + expect(@modal.$('.stripe-lifetime-button').length).toBe(1) + expect(@modal.$('#paypal-button-container').length).toBe(0) + expect(@payPalButton).toBeUndefined() + + describe 'when the purchase succeeds', -> + beforeEach -> + @purchaseRequest.andReturn({status: 200, responseText: '{}'}) + it 'calls hide()', wrapJasmine -> spyOn(@modal, 'hide') - @modal.onClickLifetimeButton() - yield @payPalButton.click() + yield @modal.onClickStripeLifetimeButton() expect(@modal.hide).toHaveBeenCalled() expect(@getTrackerEventNames()).toDeepEqual( - [ "SubscribeModal Lifetime Button Click", "Start Lifetime Purchase", "Finish Lifetime Purchase" ]) + [ "Start Lifetime Purchase", "Finish Lifetime Purchase" ]) + + describe 'when the Stripe purchase response is 402', -> + beforeEach -> + @purchaseRequest.andReturn({status: 402, responseText: '{}'}) + + it 'shows state "declined"', wrapJasmine -> + yield @modal.onClickStripeLifetimeButton() + expect(@modal.state).toBe('declined') + expect(@getTrackerEventNames()).toDeepEqual( + [ "Start Lifetime Purchase", "Fail Lifetime Purchase" ]) + + describe "when user's country has regional pricing", -> + beforeEach -> + me.set({_id: '1234', country: 'brazil'}) + @purchaseRequest = jasmine.Ajax.stubRequest('/db/products/3/purchase') + @modal = new SubscribeModal({products: new Products(productListInternational)}) + @modal.render() + jasmine.demoModal(@modal) + @openAsync.and.returnValue(tokenSuccess) + afterEach -> + me.set({country: undefined}) + + it 'shows PayPal button for lifetime subs', -> + expect(@modal.$('.stripe-lifetime-button').length).toBe(0) + expect(@modal.$('#paypal-button-container').length).toBe(1) + expect(@payPalButton).toBeDefined() + + describe 'when the purchase succeeds', -> + beforeEach -> + @purchaseRequest.andReturn({status: 200, responseText: '{}'}) - describe 'when using Stripe', -> it 'calls hide()', wrapJasmine -> spyOn(@modal, 'hide') - @modal.onClickLifetimeButton() - yield @modal.onClickStripeButton() + yield @payPalButton?.click() expect(@modal.hide).toHaveBeenCalled() expect(@getTrackerEventNames()).toDeepEqual( - [ "SubscribeModal Lifetime Button Click", "Start Lifetime Purchase", "Finish Lifetime Purchase" ]) - - describe 'when the purchase response is 402', -> - beforeEach -> - @purchaseRequest.andReturn({status: 402, responseText: '{}'}) - - describe 'when using Stripe', -> - it 'shows state "declined"', wrapJasmine -> - @modal.onClickLifetimeButton() - yield @modal.onClickStripeButton() - expect(@modal.state).toBe('declined') - expect(@getTrackerEventNames()).toDeepEqual( - [ "SubscribeModal Lifetime Button Click", "Start Lifetime Purchase", "Fail Lifetime Purchase" ]) + [ "Start Lifetime Purchase", "Finish Lifetime Purchase" ]) - describe 'when the purchase response is 422', -> - beforeEach -> - @purchaseRequest.andReturn({status: 422, responseText: '{"i18n": "subscribe.paypal_payment_error"}'}) + describe 'when the PayPal purchase response is 422', -> + beforeEach -> + @purchaseRequest.andReturn({status: 422, responseText: '{"i18n": "subscribe.paypal_payment_error"}'}) - describe 'when using PayPal', -> it 'shows state "error"', wrapJasmine -> - @modal.onClickLifetimeButton() - yield @payPalButton.click() + yield @payPalButton?.click() expect(@modal.state).toBe('error') expect(@getTrackerEventNames()).toDeepEqual( - [ "SubscribeModal Lifetime Button Click", "Start Lifetime Purchase", "Fail Lifetime Purchase" ]) + [ "Start Lifetime Purchase", "Fail Lifetime Purchase" ]) From c7c94da2cfaff029d6344d24b3d298084261a702 Mon Sep 17 00:00:00 2001 From: joca16 Date: Tue, 8 Aug 2017 00:56:16 +0200 Subject: [PATCH 020/227] Update de-DE.coffee --- app/locale/de-DE.coffee | 112 ++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index a36a884b74c..012985b4d9f 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -714,14 +714,14 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: lifetime_price: "$__price__" year_subscription: "Jahresabonnement" year_price: "$__price__/Jahr" - kids_message_1: "Kids! Wir senden Euren Eltern eine E-Mail, damit Sie das Abonnement für Euch bestellen können" + kids_message_1: "Kids! Wir senden Euren Eltern gern eine E-Mail, damit Sie das Abonnement für Euch bestellen können. " kids_message_2: "Fragt Eure Eltern" support_part1: "Brauchst du Hilfe bei den Zahlungsoptionen? Schicke eine E-Mail an" support_part2: "support@codecombat.com" support_part3: "wenn du Fragen hast." you_are_purchasing_year_sub: "Du kaufst ein Jahresabonnement!" you_are_purchasing_lifetime_sub: "Du kaufst ein lebenslanges Abonnement!" - you_will_be_charged: "Du bezahlst einmalig $__priceString__ ." + you_will_be_charged: "Du bezahlst einmalig __priceString__$ ." choose_payment_method: "Wähle deine Zahlungsweise" pay_with_credit_card_or_bitcoin: "Zahle mit Kreditkarte / Bitcoin" paypal_payment_error: "Bei der Zahlunmg mit PayPal ist ein Fehler aufgetreten." @@ -2301,7 +2301,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: esper: line_no: "Zeile $1: " -# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" + uncaught: "Nicht abgefangener $1" # $1 will be an error type, eg "Uncaught SyntaxError" reference_error: "Bezugs-Fehler: " argument_error: "Argument-Fehler: " type_error: "Typ-Fehler: " @@ -2316,64 +2316,64 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: unmatched_token: "`$1` ohne Gegenpart. Jede öffnende `$2` benötigt eine zugehörige schließende `$3`." unterminated_string: "String ohne Abschluss. Füge ein ein `\"` am Ende deiner Zeichenkette hinzu." missing_semicolon: "Semikolon fehlt." - missing_quotes: "Anfühfrungszeichen fehlen. Versuche `$1`" -# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." -# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." + missing_quotes: "Anführungszeichen fehlen. Versuche `$1`" + argument_type: "Das Argument `$2` von `$1` sollte den Typ `$3` haben, hat aber `$4`: `$5`." + argument_type2: "Das Argument `$2` von `$1`' sollte den Typ `$3` haben, hat aber `$4`." target_a_unit: "Ziel(target) sollte eine Einheit(unit) sein." - attack_capitalization: "Greife $1 an, nicht $2. (Groß- und Kleinschreibung ist wichtig.)" + attack_capitalization: "Greife $1 an, nicht $2. (Groß-/Kleinschreibung ist wichtig.)" empty_while: "Leere While-Schleife. Setze 4 Leerzeichen vor die Befehle innerhalb der While-Schleife." -# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" + line_of_site: "Argument `$2` von `$1` hat ein Problem. Gibt es schon einen Feind mit Sichtverbindung?" need_a_after_while: "`$1` erforderlich nach `$2`." too_much_indentation: "Zu viele Leerzeichen eingerückt am Anfang dieser Zeile." missing_hero: "Das Schlüsselwort `$1` fehlt; es sollte `$2` sein." takes_no_arguments: "`$1` hat keine Argumente." no_one_named: "Es gibt kein Ziel mit Namen \"$1\"." separated_by_comma: "Parameter in Funktionsaufrufen müssen durch `,`s getrennt werden" -# protected_property: "Can't read protected property: $1" -# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" -# expected_an_identifier: "Expected an identifier and instead saw '$1'." -# unexpected_identifier: "Unexpected identifier" -# unexpected_end_of: "Unexpected end of input" -# unnecessary_semicolon: "Unnecessary semicolon." -# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" -# unexpected_token: "Unexpected token $1" -# unexpected_token2: "Unexpected token" -# unexpected_number: "Unexpected number" -# unexpected: "Unexpected '$1'." -# escape_pressed_code: "Escape pressed; code aborted." -# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." -# target_an_enemy_2: "Target an enemy by name, like $1." -# cannot_read_property: "Cannot read property '$1' of undefined" -# attempted_to_assign: "Attempted to assign to readonly property." -# unexpected_early_end: "Unexpected early end of program." -# you_need_a_string: "You need a string to build; one of $1" -# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? -# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." -# unclosed_string: "Unclosed string." -# unmatched: "Unmatched '$1'." -# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" -# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" -# indentation_error: "Indentation error." -# need_a_on_the: "Need a `:` on the end of the line following `$1`." -# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" -# unterminated: "Unterminated `$1`" -# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" -# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" -# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" -# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." -# unexpected_end_of_input: "Unexpected end of input" -# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here -# try_herofindnearestenemy: "Try `$1`" -# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." -# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." -# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" -# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" -# hero_has_no_method: "`$1` has no method `$2`." -# there_is_a_problem: "There is a problem with your code." -# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." -# missing_a_quotation_mark: "Missing a quotation mark. " -# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." -# you_do_not_have: "You do not have an item equipped with the $1 skill." -# put_each_command_on: "Put each command on a separate line" -# are_you_missing_a: "Are you missing a '$1' after '$2'? " -# your_parentheses_must_match: "Your parentheses must match." + protected_property: "Kann geschütze Eigenschaft nicht auslesen: $1" + need_parens_to_call: "Wenn du `$1` als Funktion aufrufen willst musst du `()` verwenden" + expected_an_identifier: "Erwartete einen Bezeichner, fand stattdessen '$1'." + unexpected_identifier: "Unerwarteter Bezeichner" + unexpected_end_of: "Unerwartetes Ende der Eingabe" + unnecessary_semicolon: "Überzähliges Semikolon." + unexpected_token_expected: "Unerwartetes Token. Erwartete $1, fand aber $2 beim Parsen (aufteilen) von $3" + unexpected_token: "Unerwartetes Token $1" + unexpected_token2: "Unerwartetes Token" + unexpected_number: "Unnerwartete Zahl" + unexpected: "Unerwartet: '$1'." + escape_pressed_code: "Escape-Taste gedrückt; Programm abgebrochen." + target_an_enemy: "Wenn du einen Feind als Ziel auswählst, verwende den Namen wie `$1`, nicht den String `$2`." + target_an_enemy_2: "Wähle einen Feind als Ziel mit dem Namen, wie $1." + cannot_read_property: "Kann die Eigenschaft '$1' von Undefiniert nicht auslesen." #TODO: Do we translate undefined/null? + attempted_to_assign: "Du hast versucht, einer schreibgeschützten Eigenschaft etwas zuzuordnen." + unexpected_early_end: "Unerwartetes frühes Ende des Programms." + you_need_a_string: "Du brauchst einen String um zu bauen. Einen von $1" + unable_to_get_property: "Konnte Eigenschaft '$1' von Undefiniert oder Null-Verweis nicht auslesen." # TODO: Do we translate undefined/null? + code_never_finished_its: "Das Programm wurde nie fertig. Es ist entweder wirklich langsam oder hat eine Endlos-Schleife." + unclosed_string: "String ist nicht abgeschlossen." + unmatched: "ohne Gegenstück: '$1'." + error_you_said_achoo: "Du sagtest: $1, aber das Kennwort ist: $2. (Beachte die Groß-/Kleinschreibung.)" + indentation_error_unindent_does: "Einrück-Fehler: Das weiter nach links Einrücken passt nicht zu den äußeren Einrückebenen" + indentation_error: "Einrück-Fehler." + need_a_on_the: "Am Ende der Zeile wird ein `:` nach `$1` benötigt." + attempt_to_call_undefined: "Versuch, '$1' aufzurufen (ein null/nil-Wert)" + unterminated: "`$1` ohne Abschluss" + target_an_enemy_variable: "Wähle als Ziel Variable $1, nicht den String $2. (Versuche $3.)" + error_use_the_variable: "Benutze den Variablennamen: `$1` - und nicht als String: `$2`" + indentation_unindent_does_not: "Das weiter nach links-Einrücken passt nicht zu den äußeren Einrückebenen." + unclosed_paren_in_function_arguments: "Nicht geschlossene $1 in Argumenten der Funktion." + unexpected_end_of_input: "Unerwartetes Ende der Eingabe" + there_is_no_enemy: "Hier ist kein `$1`. Verwende zuerst `$2`." # Hints start here + try_herofindnearestenemy: "Versuche `$1`" + there_is_no_function: "Es gibt keine Funktion `$1`, aber `$2` hat eine Methode namens `$3`." + attacks_argument_enemy_has: "`$1` hat ein Problem mit argument." + is_there_an_enemy: "Gibt es schon einen Feind mit Sichtverbindung?" + target_is_null_is: "Ziel ist $1. Gibt es immer ein Ziel, das angegriffen werden kann? (Verwende $2?)" + hero_has_no_method: "`$1` hat keine Methode `$2`." + there_is_a_problem: "Es gibt ein Problem mit deinem Programm." + did_you_mean: "Meintest du $1? Du hast keinen Ausrüstungsgegenstand, der diese Fertigkeit hat." + missing_a_quotation_mark: "Fehlendes Anführungszeichen" + missing_var_use_var: "`$1` fehlt. Verwende `$2`, um eine neue Variable zu definieren." + you_do_not_have: "Du hast keinen Ausrüstungsgegenstand mit Fertigkeit $1." + put_each_command_on: "Schreibe jeden Befehl in eine eigene Zeile" + are_you_missing_a: "Fehlt ein '$1' hinter '$2'? " + your_parentheses_must_match: "Deine Klammern müssen paarweise zusammenpassen." From 2c0f76553f214eded32404fe023901a441b57f7f Mon Sep 17 00:00:00 2001 From: joca16 Date: Tue, 8 Aug 2017 01:12:35 +0200 Subject: [PATCH 021/227] Update de-DE.coffee --- app/locale/de-DE.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index 012985b4d9f..6ef6e68d804 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -2365,7 +2365,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: there_is_no_enemy: "Hier ist kein `$1`. Verwende zuerst `$2`." # Hints start here try_herofindnearestenemy: "Versuche `$1`" there_is_no_function: "Es gibt keine Funktion `$1`, aber `$2` hat eine Methode namens `$3`." - attacks_argument_enemy_has: "`$1` hat ein Problem mit argument." + attacks_argument_enemy_has: "`$1` hat ein Problem mit Argument `$2`." is_there_an_enemy: "Gibt es schon einen Feind mit Sichtverbindung?" target_is_null_is: "Ziel ist $1. Gibt es immer ein Ziel, das angegriffen werden kann? (Verwende $2?)" hero_has_no_method: "`$1` hat keine Methode `$2`." From cdd3668feeb32dcaa3f15831d1328c1c3f22de91 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 10 Aug 2017 16:23:20 -0500 Subject: [PATCH 022/227] Add API endpoint for fetching classroom member sessions --- server/middleware/api.coffee | 24 +++++++++++ server/middleware/classrooms.coffee | 27 ++---------- server/models/Classroom.coffee | 29 +++++++++++++ server/routes/index.coffee | 1 + server/swagger.yaml | 59 ++++++++++++++++++++++++++ spec/server/functional/api.spec.coffee | 54 +++++++++++++++++++++++ 6 files changed, 170 insertions(+), 24 deletions(-) diff --git a/server/middleware/api.coffee b/server/middleware/api.coffee index b4914909d6b..b47a6a7ab37 100644 --- a/server/middleware/api.coffee +++ b/server/middleware/api.coffee @@ -299,6 +299,29 @@ putClassroomCourseEnrolled = wrap (req, res) -> res.send(classroom.toObject({req, includeEnrolled: courseInstances})) +getClassroomMemberSessions = wrap (req, res, next) -> + classroom = yield database.getDocFromHandle(req, Classroom, { handleName: 'classroomHandle' }) + if not classroom + throw new errors.NotFound('Classroom not found.') + + clientHasControlOfOwner = yield User.count({_id: classroom.get('ownerID'), clientCreator: req.client._id}) + if not clientHasControlOfOwner + throw new errors.Forbidden('Must have created the user who created this classroom to perform this action.') + + member = yield database.getDocFromHandle(req, User, { handleName: 'memberHandle' }) + memberStrings = classroom.get('members').map((memberId) => memberId + '') + unless member and member.id in memberStrings + throw new errors.NotFound('Member id not found in classroom.') + + unless req.client.hasControlOfUser(member) + throw new errors.Forbidden('Must have created the member to perform this action.') + + sessions = yield classroom.fetchSessionsForMembers([member._id]) + + # Return member sessions for assigned courses + res.status(200).send(sessions) + + getUserClassrooms = wrap (req, res) -> user = yield database.getDocFromHandle(req, User) if not user @@ -370,5 +393,6 @@ module.exports = { putUserLicense putClassroomMember putClassroomCourseEnrolled + getClassroomMemberSessions getPlayTimeStats } diff --git a/server/middleware/classrooms.coffee b/server/middleware/classrooms.coffee index 22130b9f080..9cc90b0bfdb 100644 --- a/server/middleware/classrooms.coffee +++ b/server/middleware/classrooms.coffee @@ -113,34 +113,13 @@ module.exports = classroom = yield database.getDocFromHandle(req, Classroom) throw new errors.NotFound('Classroom not found.') if not classroom throw new errors.Forbidden('You do not own this classroom.') unless req.user.isAdmin() or classroom.get('ownerID').equals(req.user._id) - courseLevelsMap = {} - codeLanguage = classroom.get('aceConfig.language') - for course in classroom.get('courses') ? [] - courseLevelsMap[course._id.toHexString()] = _.map(course.levels, (l) -> - {'level.original':l.original?.toHexString(), codeLanguage: l.primerLanguage or codeLanguage} - ) - courseInstances = yield CourseInstance.find({classroomID: classroom._id}).select('_id courseID members').lean() - memberCoursesMap = {} - for courseInstance in courseInstances - for userID in courseInstance.members ? [] - memberCoursesMap[userID.toHexString()] ?= [] - memberCoursesMap[userID.toHexString()].push(courseInstance.courseID) + memberLimit = parse.getLimitFromReq(req, {default: 10, max: 100, param: 'memberLimit'}) memberSkip = parse.getSkipFromReq(req, {param: 'memberSkip'}) members = classroom.get('members') or [] members = members.slice(memberSkip, memberSkip + memberLimit) - dbqs = [] - select = 'state.complete level creator playtime changed created dateFirstCompleted submitted published' - for member in members - $or = [] - for courseID in memberCoursesMap[member.toHexString()] ? [] - for subQuery in courseLevelsMap[courseID.toHexString()] ? [] - $or.push(_.assign({creator: member.toHexString()}, subQuery)) - if $or.length - query = { $or } - dbqs.push(LevelSession.find(query).select(select).lean().exec()) - results = yield dbqs - sessions = _.flatten(results) + + sessions = yield classroom.fetchSessionsForMembers(members) res.status(200).send(sessions) fetchMembers: wrap (req, res, next) -> diff --git a/server/models/Classroom.coffee b/server/models/Classroom.coffee index 1b66146c643..5686bfba102 100644 --- a/server/models/Classroom.coffee +++ b/server/models/Classroom.coffee @@ -140,6 +140,35 @@ ClassroomSchema.methods.addMember = (user) -> members.push user._id @set('members', members) return @update(update) + +ClassroomSchema.methods.fetchSessionsForMembers = co.wrap (members) -> + CourseInstance = require('./CourseInstance') + LevelSession = require('./LevelSession') + + courseLevelsMap = {} + codeLanguage = @get('aceConfig.language') + for course in @get('courses') ? [] + courseLevelsMap[course._id.toHexString()] = _.map(course.levels, (l) -> + {'level.original':l.original?.toHexString(), codeLanguage: l.primerLanguage or codeLanguage} + ) + courseInstances = yield CourseInstance.find({classroomID: @_id}).select('_id courseID members').lean() + memberCoursesMap = {} + for courseInstance in courseInstances + for userID in courseInstance.members ? [] + memberCoursesMap[userID.toHexString()] ?= [] + memberCoursesMap[userID.toHexString()].push(courseInstance.courseID) + dbqs = [] + select = 'state.complete level creator playtime changed created dateFirstCompleted submitted published' + for member in members + $or = [] + for courseID in memberCoursesMap[member.toHexString()] ? [] + for subQuery in courseLevelsMap[courseID.toHexString()] ? [] + $or.push(_.assign({creator: member.toHexString()}, subQuery)) + if $or.length + query = { $or } + dbqs.push(LevelSession.find(query).select(select).lean().exec()) + results = yield dbqs + return _.flatten(results) ClassroomSchema.statics.jsonSchema = jsonSchema diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 3351036712e..08b46d85df1 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -12,6 +12,7 @@ module.exports.setup = (app) -> app.put('/api/classrooms/:handle/members', mw.api.putClassroomMember) app.put('/api/classrooms/:classroomHandle/courses/:courseHandle/enrolled', mw.api.putClassroomCourseEnrolled) + app.get('/api/classrooms/:classroomHandle/members/:memberHandle/sessions', mw.api.getClassroomMemberSessions) app.post('/api/users', mw.api.postUser) app.get('/api/users/:handle', mw.api.getUser) diff --git a/server/swagger.yaml b/server/swagger.yaml index fa8324c5c81..ae35909d1e7 100644 --- a/server/swagger.yaml +++ b/server/swagger.yaml @@ -359,6 +359,32 @@ paths: schema: $ref: '#/definitions/ClassroomResponse' + /classrooms/{classroomHandle}/members/{memberHandle}/sessions: + get: + tags: + - classrooms + description: | + Returns a list of all levels played by the user for the classroom. + parameters: + - name: classroomHandle + in: path + type: string + required: true + description: The classroom's `_id`. + - name: memberHandle + in: path + type: string + required: true + description: The classroom member's `_id`. + + responses: + "200": + description: 'The classroom with the user enrolled.' + schema: + type: array + items: + $ref: '#/definitions/LevelSessionResponse' + /user-lookup/{property}/{value}: get: tags: @@ -529,3 +555,36 @@ definitions: gamesPlayed: type: number description: "Number of levels played" + + LevelSessionResponse: + type: object + properties: + state: + type: object + properties: + complete: + type: boolean + level: + type: object + properties: + original: + type: string + description: 'The id for the level.' + creator: + type: 'string' + $ref: '#/definitions/objectIdString' + playtime: + type: 'integer' + description: 'Time played in seconds.' + changed: + $ref: '#/definitions/datetimeString' + created: + $ref: '#/definitions/datetimeString' + dateFirstCompleted: + $ref: '#/definitions/datetimeString' + submitted: + type: 'boolean' + description: 'For arenas. Whether or not the level has been added to the ladder.' + published: + type: 'boolean' + description: 'For shareable projects. Whether or not the project has been shared with classmates.' diff --git a/spec/server/functional/api.spec.coffee b/spec/server/functional/api.spec.coffee index 9dd5902ad27..9dfd4e702d1 100644 --- a/spec/server/functional/api.spec.coffee +++ b/spec/server/functional/api.spec.coffee @@ -11,6 +11,8 @@ Classroom = require '../../../server/models/Classroom' Course = require '../../../server/models/Course' CourseInstance = require '../../../server/models/CourseInstance' LevelSession = require '../../../server/models/LevelSession' +Campaign = require '../../../server/models/Campaign' +Level = require '../../../server/models/Level' describe 'POST /api/users', -> @@ -661,6 +663,58 @@ describe 'PUT /api/classrooms/:classroomHandle/courses/:courseHandle/enrolled', [res, body] = yield request.putAsync({url: @freeCourse.url, @json, auth: @client.auth}) expect(res.statusCode).toBe(403) + + +describe 'GET /api/classrooms/:classroomHandle/members/:memberHandle/sessions', -> + + beforeEach utils.wrap (done) -> + yield utils.clearModels([CourseInstance, Course, User, Classroom, Campaign, Level, LevelSession]) + @client = yield utils.makeAPIClient() + @teacher = yield utils.initUser({role: 'teacher', clientCreator: @client._id}) + admin = yield utils.initAdmin() + yield utils.loginUser(admin) + @levelA = yield utils.makeLevel({type: 'course'}) + @levelB = yield utils.makeLevel({type: 'course', primerLanguage: 'python'}) + @campaignA = yield utils.makeCampaign({}, {levels: [@levelA]}) + @campaignB = yield utils.makeCampaign({}, {levels: [@levelB]}) + @courseA = yield utils.makeCourse({free: true, releasePhase: 'released'}, {campaign: @campaignA}) + @courseB = yield utils.makeCourse({free: true, releasePhase: 'released'}, {campaign: @campaignB}) + @student1 = yield utils.initUser({role: 'student', clientCreator: @client._id}) + @student2 = yield utils.initUser({role: 'student', clientCreator: @client._id}) + @session1A = yield utils.makeLevelSession({codeLanguage: 'javascript', state: { complete: true }}, {creator: @student1, level: @levelA}) + @session1B = yield utils.makeLevelSession({codeLanguage: 'python', state: { complete: false }}, {creator: @student1, level: @levelB}) + @session2A = yield utils.makeLevelSession({codeLanguage: 'javascript', state: { complete: true }}, {creator: @student2, level: @levelA}) + @session2B = yield utils.makeLevelSession({codeLanguage: 'python', state: { complete: false }}, {creator: @student2, level: @levelB}) + yield utils.loginUser(@teacher) + @classroom = yield utils.makeClassroom({aceConfig: {language: 'javascript'}}, { members: [@student1, @student2] }) + @courseInstanceA = yield utils.makeCourseInstance({courseID: @courseA.id, classroomID: @classroom.id}, { members: [@student1, @student2] }) + @courseInstanceB = yield utils.makeCourseInstance({courseID: @courseB.id, classroomID: @classroom.id}, { members: [@student1] }) + yield utils.logout() + done() + + it 'returns all sessions for a member in the classroom with assigned courses', utils.wrap -> + url = getURL("/api/classrooms/#{@classroom.id}/members/#{@student1.id}/sessions") + [res, body] = yield request.getAsync({url, json: true, auth: @client.auth}) + expect(res.statusCode).toBe(200) + expect(body.length).toBe(2) + + url = getURL("/api/classrooms/#{@classroom.id}/members/#{@student2.id}/sessions") + [res, body] = yield request.getAsync({url, json: true, auth: @client.auth}) + expect(res.statusCode).toBe(200) + expect(body.length).toBe(1) + + it 'returns 403 if the client did not create the student', utils.wrap -> + yield @student1.update({$unset: {clientCreator: ''}}) + url = getURL("/api/classrooms/#{@classroom.id}/members/#{@student1.id}/sessions") + [res, body] = yield request.getAsync({url, json: true, auth: @client.auth}) + expect(res.statusCode).toBe(403) + + it 'returns 403 if the client did not create the classroom owner', utils.wrap -> + yield @teacher.update({$unset: {clientCreator: ''}}) + url = getURL("/api/classrooms/#{@classroom.id}/members/#{@student1.id}/sessions") + [res, body] = yield request.getAsync({url, json: true, auth: @client.auth}) + expect(res.statusCode).toBe(403) + describe 'GET /api/playtime-stats', -> From 0ad2fa89192dd1a1d5f3b80764ef2a5cbaa89f90 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 11 Aug 2017 13:39:58 -0700 Subject: [PATCH 023/227] Fix incorrect language about starter license purchase limits --- app/locale/en.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 000130f15c4..befe6a27d96 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -976,7 +976,7 @@ project_based_title: "Project-Based Courses" project_based_description: "Web and Game Development courses feature shareable final projects." great_for_clubs_title: "Great for clubs and electives" - great_for_clubs_description: "Teachers can purchase up to __maxQuantityStarterLicenses__ Starter Licenses per year." + great_for_clubs_description: "Teachers can purchase up to __maxQuantityStarterLicenses__ Starter Licenses." #{change} low_price_title: "Just __starterLicensePrice__ per student" low_price_description: "Starter Licenses are active for __starterLicenseLengthMonths__ months from purchase." three_great_courses: "Three great courses included in the Starter License:" From 368b462c1d031c21beaae4278dafdc97e762c0e7 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 10 Aug 2017 11:05:08 -0700 Subject: [PATCH 024/227] PayPal subscriptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switches from Stripe to PayPal for regional subscriptions. UX redirects the user to login to PayPal and approve purchase from our standard subscribe modal. Once confirmed, user is sent back to our site. This is different from the one-time purchase express checkout we use for lifetime subscriptions. Using PayPal REST APIs to manage PayPal billing agreements on our server. Billing agreements are PayPal’s notion of recurring payments. Billing plans are created manually once per environment, and then used to create billing agreements per-user. The billing plans are attached to our internal products, which are setup once manually. Payments are tracked via webhook notifications. PayPal webhook is setup once, and listens for specific events. Adds i18n support for product name and description. Closes #4423 --- app/core/Router.coffee | 4 + app/core/api/users.coffee | 26 +- app/core/utils.coffee | 3 + app/locale/en.coffee | 6 +- app/models/Product.coffee | 5 +- app/models/User.coffee | 13 +- app/schemas/models/patch.coffee | 1 + app/schemas/models/product.schema.coffee | 7 + app/schemas/models/user.coffee | 7 + app/templates/account/subscription-view.jade | 6 +- app/templates/core/subscribe-modal.jade | 3 + app/templates/i18n/i18n-home-view.jade | 2 +- app/views/account/SubscriptionView.coffee | 187 +++-- app/views/admin/AnalyticsView.coffee | 6 +- app/views/core/SubscribeModal.coffee | 24 + app/views/i18n/I18NEditProductView.coffee | 23 + app/views/i18n/I18NHomeView.coffee | 10 +- app/views/play/CampaignView.coffee | 10 + scripts/analytics/mixpanelABGemPrompt.py | 2 +- scripts/analytics/mixpanelABSubscribeCopy.py | 2 +- server/commons/mapping.coffee | 1 + server/lib/paypal.coffee | 1 + server/middleware/products.coffee | 3 + server/middleware/subscriptions.coffee | 100 ++- server/middleware/users.coffee | 4 +- server/models/Product.coffee | 12 + server/models/User.coffee | 14 +- server/routes/index.coffee | 8 + server/routes/paypal.coffee | 77 ++ .../functional/subscription.spec.coffee | 783 ++++++++++++++++-- spec/server/functional/user.spec.coffee | 134 +-- spec/server/unit/subscriptions.spec.coffee | 7 +- test/app/collections/Products.spec.coffee | 14 + 33 files changed, 1259 insertions(+), 246 deletions(-) create mode 100644 app/views/i18n/I18NEditProductView.coffee create mode 100644 server/routes/paypal.coffee create mode 100644 test/app/collections/Products.spec.coffee diff --git a/app/core/Router.coffee b/app/core/Router.coffee index 53bb1af2174..b2d23329361 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -138,6 +138,7 @@ module.exports = class CocoRouter extends Backbone.Router 'i18n/campaign/:handle': go('i18n/I18NEditCampaignView') 'i18n/poll/:handle': go('i18n/I18NEditPollView') 'i18n/course/:handle': go('i18n/I18NEditCourseView') + 'i18n/product/:handle': go('i18n/I18NEditProductView') 'identify': go('user/IdentifyView') 'il-signup': go('account/IsraelSignupView') @@ -146,6 +147,9 @@ module.exports = class CocoRouter extends Backbone.Router 'logout': 'logout' + 'paypal/subscribe-callback': go('play/CampaignView') + 'paypal/cancel-callback': go('account/SubscriptionView') + 'play(/)': go('play/CampaignView', { redirectStudents: true, redirectTeachers: true }) # extra slash is to get Facebook app to work 'play/ladder/:levelID/:leagueType/:leagueID': go('ladder/LadderView') 'play/ladder/:levelID': go('ladder/LadderView') diff --git a/app/core/api/users.coffee b/app/core/api/users.coffee index 39c0a5387ff..c9dc07eb50c 100644 --- a/app/core/api/users.coffee +++ b/app/core/api/users.coffee @@ -2,13 +2,13 @@ fetchJson = require './fetch-json' module.exports = { url: (userID, path) -> if path then "/db/user/#{userID}/#{path}" else "/db/user/#{userID}" - + getByHandle: (handle, options) -> fetchJson("/db/user/#{handle}", options) getByEmail: ({ email }, options={}) -> fetchJson("/db/user", _.merge {}, options, { data: { email } }) - + signupWithPassword: ({userID, name, email, password}, options={}) -> fetchJson(@url(userID, 'signup-with-password'), _.assign({}, options, { method: 'POST' @@ -34,16 +34,34 @@ module.exports = { .then -> window.tracker?.trackEvent 'Google Login', category: "Signup", label: 'GPlus' window.tracker?.trackEvent 'Finished Signup', category: "Signup", label: 'GPlus' - + put: (user, options={}) -> fetchJson(@url(user._id), _.assign({}, options, { method: 'PUT' json: user })) - + resetProgress: (options={}) -> store = require('core/store') fetchJson(@url(store.state.me._id, 'reset_progress'), _.assign({}, options, { method: 'POST' })) + + createBillingAgreement: ({userID, productID}, options={}) -> + fetchJson(@url(userID, "paypal/create-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {productID} + })) + + executeBillingAgreement: ({userID, token}, options={}) -> + fetchJson(@url(userID, "paypal/execute-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {token} + })) + + cancelBillingAgreement: ({userID, billingAgreementID}, options={}) -> + fetchJson(@url(userID, "paypal/cancel-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {billingAgreementID} + })) } diff --git a/app/core/utils.coffee b/app/core/utils.coffee index 1183d802f90..e11b6ef63f9 100644 --- a/app/core/utils.coffee +++ b/app/core/utils.coffee @@ -230,6 +230,8 @@ getByPath = (target, path) -> isID = (id) -> _.isString(id) and id.length is 24 and id.match(/[a-f0-9]/gi)?.length is 24 +isRegionalSubscription = (name) -> /_basic_subscription/.test(name) + isSmokeTestEmail = (email) -> /@example.com/.test(email) or /smoketest/.test(email) or /@codecombat.com/.test(email) @@ -679,6 +681,7 @@ module.exports = { initializeACE injectCSS isID + isRegionalSubscription isSmokeTestEmail keepDoingUntil kindaEqual diff --git a/app/locale/en.coffee b/app/locale/en.coffee index befe6a27d96..b5ad95322de 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -327,6 +327,7 @@ default_code: "Default Code" loading: "Loading..." overview: "Overview" + processing: "Processing..." solution: "Solution" table_of_contents: "Table of Contents" intro: "Intro" @@ -649,6 +650,7 @@ prompt_body: "Keep playing to earn more!" subscribe: + confirmation: "Congratulations! You now have a CodeCombat Premium Subscription!" premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Become a Master Coder - subscribe to Premium today!" @@ -721,9 +723,10 @@ support_part1: "Need help with payment options? Email" support_part2: "support@codecombat.com" support_part3: "if you have any questions." + you_are_purchasing_monthly_sub: "You're purchasing a Monthly Premium Subscription!" you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" - you_will_be_charged: "You will be charged $__priceString__ one time." + you_will_be_charged: "You will be charged $__priceString__" # {change} choose_payment_method: "Choose Payment Method" pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" paypal_payment_error: "We encountered an error while charging PayPal." @@ -773,6 +776,7 @@ premium_features: get_premium: "Get
CodeCombat
Premium" # Fit into the banner on the /features page master_coder: "Become a Master Coder by subscribing today!" + paypal_redirect: "You will be redirected to PayPal to complete the subscription process." subscribe_now: "Subscribe Now" hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" diff --git a/app/models/Product.coffee b/app/models/Product.coffee index e68b5a9c071..b0b068f5786 100644 --- a/app/models/Product.coffee +++ b/app/models/Product.coffee @@ -1,10 +1,13 @@ CocoModel = require './CocoModel' +utils = require 'core/utils' module.exports = class ProductModel extends CocoModel @className: 'Product' @schema: require 'schemas/models/product.schema' urlRoot: '/db/products' + isRegionalSubscription: (name) -> utils.isRegionalSubscription(name ? @get('name')) + priceStringNoSymbol: -> (@get('amount') / 100).toFixed(2) adjustedPriceStringNoSymbol: -> @@ -26,7 +29,6 @@ module.exports = class ProductModel extends CocoModel return i18n.translate('subscribe.lifetime') @get('name') - # Send the Stripe token purchase: (token, options={}) -> options.url = _.result(@, 'url') + '/purchase' options.method = 'POST' @@ -44,4 +46,3 @@ module.exports = class ProductModel extends CocoModel paymentID: payment.id payerID: payment.payer.payer_info.payer_id }, options)) - diff --git a/app/models/User.coffee b/app/models/User.coffee index 0cf0c7df40f..4f31577e3db 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -212,11 +212,14 @@ module.exports = class User extends CocoModel return me.get('testGroupNumber') % numVideos hasSubscription: -> - return false unless stripe = @get('stripe') - return true if stripe.sponsorID - return true if stripe.subscriptionID - return true if stripe.free is true - return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) + if payPal = @get('payPal') + return payPal.billingAgreementID + else if stripe = @get('stripe') + return true if stripe.sponsorID + return true if stripe.subscriptionID + return true if stripe.free is true + return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) + false isPremium: -> return true if me.isInGodMode() diff --git a/app/schemas/models/patch.coffee b/app/schemas/models/patch.coffee index a4ea3dcf9b2..a5c0698c6d5 100644 --- a/app/schemas/models/patch.coffee +++ b/app/schemas/models/patch.coffee @@ -9,6 +9,7 @@ patchables = [ 'level_component' 'level_system' 'poll' + 'product' 'thang_type' ] diff --git a/app/schemas/models/product.schema.coffee b/app/schemas/models/product.schema.coffee index 29710ccb1e0..3fdced4a8f8 100644 --- a/app/schemas/models/product.schema.coffee +++ b/app/schemas/models/product.schema.coffee @@ -4,7 +4,10 @@ module.exports = ProductSchema = { type: 'object' additionalProperties: false properties: { + i18n: {type: 'object', title: 'i18n', format: 'i18n', props: ['displayName', 'displayDescription' ]} name: { type: 'string' } + displayName: { type: 'string' } + displayDescription: {type: 'string'} amount: { type: 'integer', description: 'Cost in cents' } gems: { type: 'integer', description: 'Number of gems awarded' } coupons: { @@ -18,7 +21,11 @@ module.exports = ProductSchema = { } } } + planID: { type: 'string', description: 'Probably should remove this' } + payPalBillingPlanID: { type: 'string' } } } c.extendBasicProperties ProductSchema, 'Product' +c.extendTranslationCoverageProperties ProductSchema +c.extendPatchableProperties ProductSchema diff --git a/app/schemas/models/user.coffee b/app/schemas/models/user.coffee index 8a06ef64e1c..c32febf5900 100644 --- a/app/schemas/models/user.coffee +++ b/app/schemas/models/user.coffee @@ -311,6 +311,13 @@ _.extend UserSchema.properties, spent: {type: 'number'} stripeCustomerID: { type: 'string' } # TODO: Migrate away from this property + payPal: c.object {}, { + payerID: { type: 'string' } + billingAgreementID: { type: 'string', description: 'Set if user has PayPal monthly subscription' } + subscribeDate: c.date() + cancelDate: c.date() + } + stripe: c.object {}, { customerID: { type: 'string' } planID: { enum: ['basic'], description: 'Determines if a user has or wants to subscribe' } diff --git a/app/templates/account/subscription-view.jade b/app/templates/account/subscription-view.jade index 002b0454ffb..9fd69311675 100644 --- a/app/templates/account/subscription-view.jade +++ b/app/templates/account/subscription-view.jade @@ -104,6 +104,10 @@ block content tr th(data-i18n="account.card") td= view.personalSub.card + if view.personalSub.service + tr + th(data-i18n="account.service") + td= view.personalSub.service else if view.personalSub.free === true @@ -129,8 +133,8 @@ block content span.spr(data-i18n="account_prepaid.you_can1") a(href="/account/prepaid", data-i18n="account_prepaid.you_can2") span.spl(data-i18n="account_prepaid.you_can3") - //- Sponsored Subscriptions + //- Sponsored Subscriptions .panel.panel-default .panel-heading h3(data-i18n="subscribe.managed_subs") diff --git a/app/templates/core/subscribe-modal.jade b/app/templates/core/subscribe-modal.jade index cbab6b0d49e..3e41c87e303 100644 --- a/app/templates/core/subscribe-modal.jade +++ b/app/templates/core/subscribe-modal.jade @@ -53,6 +53,9 @@ .option-header.text-center(data-i18n="subscribe.stripe_description") +price("subscribe.month_price", view.basicProduct) button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") + if view.basicProduct.isRegionalSubscription() + //- Warn about PayPal redirect, which is only used for regional subscriptions + .small(data-i18n="premium_features.paypal_redirect") else - var secondRowClass = '.col-xs-12' diff --git a/app/templates/i18n/i18n-home-view.jade b/app/templates/i18n/i18n-home-view.jade index 5e14b40e329..dd7784be61e 100644 --- a/app/templates/i18n/i18n-home-view.jade +++ b/app/templates/i18n/i18n-home-view.jade @@ -26,7 +26,7 @@ block content tr td - a(href=model.i18nURLBase+model.get('slug'))= model.get('name') + a(href=model.i18nURLBase+(model.get('slug') || model.id))= model.get('displayName') || model.get('name') td= translatedName td= model.constructor.className td(class=model.specificallyCovered ? 'success' : 'danger')= model.specificallyCovered ? 'Yes' : 'No' diff --git a/app/views/account/SubscriptionView.coffee b/app/views/account/SubscriptionView.coffee index ce6ab717190..9c2c7345cf3 100644 --- a/app/views/account/SubscriptionView.coffee +++ b/app/views/account/SubscriptionView.coffee @@ -3,12 +3,13 @@ template = require 'templates/account/subscription-view' CocoCollection = require 'collections/CocoCollection' Products = require 'collections/Products' Product = require 'models/Product' - +payPal = require('core/services/paypal') SubscribeModal = require 'views/core/SubscribeModal' Payment = require 'models/Payment' stripeHandler = require 'core/services/stripe' User = require 'models/User' utils = require 'core/utils' +api = require 'core/api' # TODO: Link to sponsor id /user/userID instead of plain text name # TODO: Link to sponsor email instead of plain text email @@ -82,7 +83,7 @@ module.exports = class SubscriptionView extends RootView onClickConfirmEndSubscription: (e) -> message = @$el.find('.unsubscribe-feedback textarea').val().trim() - @personalSub.unsubscribe(message) + @personalSub.unsubscribe(message, => @render?()) # Sponsored subscriptions @@ -171,94 +172,138 @@ class PersonalSub render() me.patch({headers: {'X-Change-Plan': 'true'}}) - unsubscribe: (message) -> - removeStripe = => + unsubscribe: (message, render) -> + removeSub = => + payPalInfo = me.get('payPal') stripeInfo = _.clone(me.get('stripe')) - delete stripeInfo.planID - me.set('stripe', stripeInfo) - me.once 'sync', -> - window.tracker?.trackEvent 'Unsubscribe End', message: message - document.location.reload() - me.patch({headers: {'X-Change-Plan': 'true'}}) + if stripeInfo + delete stripeInfo.planID + me.set('stripe', stripeInfo) + me.once 'sync', -> + window.tracker?.trackEvent 'Unsubscribe End', message: message + document.location.reload() + me.patch({headers: {'X-Change-Plan': 'true'}}) + else if payPalInfo?.billingAgreementID + api.users.cancelBillingAgreement({userID, billingAgreementID: payPalInfo?.billingAgreementID}) + .then (response) => + window.tracker?.trackEvent 'Unsubscribe End', message: message + document.location.reload() + .catch (jqxhr) => + console.error('PayPal unsubscribe', jqxhr) + + else + console.error "Tried to unsubscribe without PayPal or Stripe user info." + @state = 'unknown_error' + @stateMessage = "You do not appear to be subscribed." + render() if message $.post '/contact', message: message, subject: 'Cancellation', (response) -> - removeStripe() + removeSub() else - removeStripe() + removeSub() update: (render) -> - return unless stripeInfo = me.get('stripe') + stripeInfo = me.get('stripe') + payPalInfo = me.get('payPal') + return unless stripeInfo or payPalInfo @state = 'loading' - if stripeInfo.sponsorID - @sponsor = true - onSubSponsorSuccess = (sponsorInfo) => - @sponsorEmail = sponsorInfo.email - @sponsorName = sponsorInfo.name - @sponsorID = stripeInfo.sponsorID - if sponsorInfo.subscription.cancel_at_period_end - @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) + if stripeInfo + if stripeInfo.sponsorID + @sponsor = true + onSubSponsorSuccess = (sponsorInfo) => + @sponsorEmail = sponsorInfo.email + @sponsorName = sponsorInfo.name + @sponsorID = stripeInfo.sponsorID + if sponsorInfo.subscription.cancel_at_period_end + @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) + delete @state + render() + @supermodel.addRequestResource('sub_sponsor', { + url: '/db/user/-/sub_sponsor' + method: 'POST' + success: onSubSponsorSuccess + }, 0).load() + + else if stripeInfo.prepaidCode + @usingPrepaidCode = true delete @state render() - @supermodel.addRequestResource('sub_sponsor', { - url: '/db/user/-/sub_sponsor' - method: 'POST' - success: onSubSponsorSuccess - }, 0).load() - - else if stripeInfo.prepaidCode - @usingPrepaidCode = true - delete @state - render() - else if stripeInfo.subscriptionID - @self = true - @active = me.isPremium() - @subscribed = stripeInfo.planID? - - options = { cache: false, url: "/db/user/#{me.id}/stripe" } - options.success = (info) => - if card = info.card - @card = "#{card.brand}: x#{card.last4}" - if sub = info.subscription - periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) - if sub.cancel_at_period_end - @activeUntil = periodEnd - else if sub.discount?.coupon?.id isnt 'free' - @nextPaymentDate = periodEnd - # NOTE: This checks the product list for one that corresponds to their - # country. This will not work for "free" or "halfsies" because there - # are not products that correspond to those. - # NOTE: This does NOT use the "amount" of the coupon in this client side calculation - # (those should be kept up to date on the server) - # TODO: Calculate and return the true price on the server side, and use that as a source of truth - if sub.discount?.coupon?.id - productName = "#{sub.discount?.coupon?.id}_basic_subscription" - else - productName = "basic_subscription" - product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) - if product - @cost = "$#{(product.get('amount')/100).toFixed(2)}" - else - @cost = "$#{(sub.plan.amount/100).toFixed(2)}" - else - console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" + else if stripeInfo.subscriptionID + @self = true + @active = me.isPremium() + @subscribed = stripeInfo.planID? + + options = { cache: false, url: "/db/user/#{me.id}/stripe" } + options.success = (info) => + if card = info.card + @card = "#{card.brand}: x#{card.last4}" + if sub = info.subscription + periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) + if sub.cancel_at_period_end + @activeUntil = periodEnd + else if sub.discount?.coupon?.id isnt 'free' + @nextPaymentDate = periodEnd + # NOTE: This checks the product list for one that corresponds to their + # country. This will not work for "free" or "halfsies" because there + # are not products that correspond to those. + # NOTE: This does NOT use the "amount" of the coupon in this client side calculation + # (those should be kept up to date on the server) + # TODO: Calculate and return the true price on the server side, and use that as a source of truth + if sub.discount?.coupon?.id + productName = "#{sub.discount?.coupon?.id}_basic_subscription" + else + productName = "basic_subscription" + product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) + if product + @cost = "$#{(product.get('amount')/100).toFixed(2)}" + else + @cost = "$#{(sub.plan.amount/100).toFixed(2)}" + else + console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" + delete @state + render() + @supermodel.addRequestResource('personal_payment_info', options).load() + + payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) + payments.once 'sync', -> + @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + render() + @supermodel.loadCollection(payments, 'payments', {cache: false}) + + else if stripeInfo.free + @free = stripeInfo.free delete @state render() - @supermodel.addRequestResource('personal_payment_info', options).load() - payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - payments.once 'sync', -> - @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + else + delete @state render() - @supermodel.loadCollection(payments, 'payments', {cache: false}) - else if stripeInfo.free - @free = stripeInfo.free + else if payPalInfo?.billingAgreementID + @self = true + @active = true + @subscribed = true + @service = "PayPal" delete @state render() - + payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) + payments.once 'sync', => + try + @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + lastPayment = _.last(_.sortBy(_.filter(payments.models, (p) -> /basic_subscription/ig.test(p.get('productID'))), (p) -> p.get('created'))) + if lastPayment + @nextPaymentDate = new Date(lastPayment.get('created')) + @nextPaymentDate.setUTCMonth(@nextPaymentDate.getUTCMonth() + 1) + @cost = "$#{(lastPayment.get('amount')/100).toFixed(2)}" + render() + else + console.error("No subscription payments found!") + catch err + console.error(JSON.stringify(err)) + @supermodel.loadCollection(payments, 'payments', {cache: false}) else delete @state render() diff --git a/app/views/admin/AnalyticsView.coffee b/app/views/admin/AnalyticsView.coffee index c177822c56d..b8061a2b3f9 100644 --- a/app/views/admin/AnalyticsView.coffee +++ b/app/views/admin/AnalyticsView.coffee @@ -127,13 +127,13 @@ module.exports = class AnalyticsView extends RootView revenueGroupFromPayment = (payment) -> product = payment.productID or payment.service - if payment.productID is 'lifetime_subcription' + if payment.productID is 'lifetime_subscription' product = "usa lifetime" else if /_lifetime_subscription/.test(payment.productID) product = "intl lifetime" - else if payment.productID is 'basic_subcription' + else if payment.productID is 'basic_subscription' product = "usa monthly" - else if /_basic_subcription/.test(payment.productID) + else if /_basic_subscription/.test(payment.productID) product = "intl monthly" else if /gems/.test(payment.productID) product = "gems" diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index f816578bd2c..4fe7bcb1034 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -1,3 +1,4 @@ +api = require 'core/api' ModalView = require 'views/core/ModalView' template = require 'templates/core/subscribe-modal' stripeHandler = require 'core/services/stripe' @@ -126,6 +127,29 @@ module.exports = class SubscribeModal extends ModalView return unless @basicProduct @playSound 'menu-button-click' return @openModalView new CreateAccountModal() if me.get('anonymous') + if @basicProduct.isRegionalSubscription() + @startPayPalSubscribe() + else + @startStripeSubscribe() + + startPayPalSubscribe: -> + application.tracker?.trackEvent 'Started subscription purchase', { service: 'paypal' } + $('.purchase-button').addClass("disabled") + $('.purchase-button').html($.i18n.t('common.processing')) + api.users.createBillingAgreement({userID: me.id, productID: @basicProduct.id}) + .then (billingAgreement) => + for link in billingAgreement.links + if link.rel is 'approval_url' + application.tracker?.trackEvent 'Continue subscription purchase', { service: 'paypal', redirectUrl: link.href } + window.location = link.href + return + throw new Error("PayPal billing agreement has no redirect link #{JSON.stringify(billingAgreement)}") + .catch (jqxhr) => + $('.purchase-button').removeClass("disabled") + $('.purchase-button').html($.i18n.t('premium_features.subscribe_now')) + @onSubscriptionError(jqxhr) + + startStripeSubscribe: -> application.tracker?.trackEvent 'Started subscription purchase', { service: 'stripe' } options = @stripeOptions { description: $.i18n.t('subscribe.stripe_description') diff --git a/app/views/i18n/I18NEditProductView.coffee b/app/views/i18n/I18NEditProductView.coffee new file mode 100644 index 00000000000..fb8bc858e29 --- /dev/null +++ b/app/views/i18n/I18NEditProductView.coffee @@ -0,0 +1,23 @@ +I18NEditModelView = require './I18NEditModelView' +Product = require 'models/Product' +deltasLib = require 'core/deltas' +Patch = require 'models/Patch' +Patches = require 'collections/Patches' +PatchModal = require 'views/editor/PatchModal' + +# TODO: Apply these changes to all i18n views if it proves to be more reliable + +module.exports = class I18NEditProductView extends I18NEditModelView + id: "i18n-edit-product-view" + modelClass: Product + + buildTranslationList: -> + lang = @selectedLanguage + + # name, description + if i18n = @model.get('i18n') + if name = @model.get('displayName') + @wrapRow 'Product short name', ['displayName'], name, i18n[lang]?.displayName, [] + if description = @model.get('displayDescription') + @wrapRow 'Product description', ['displayDescription'], description, i18n[lang]?.displayDescription, [] + diff --git a/app/views/i18n/I18NHomeView.coffee b/app/views/i18n/I18NHomeView.coffee index 60fc51a7a55..848e802fcc6 100644 --- a/app/views/i18n/I18NHomeView.coffee +++ b/app/views/i18n/I18NHomeView.coffee @@ -2,6 +2,8 @@ RootView = require 'views/core/RootView' template = require 'templates/i18n/i18n-home-view' CocoCollection = require 'collections/CocoCollection' Courses = require 'collections/Courses' +Products = require 'collections/Products' +Product = require 'models/Product' LevelComponent = require 'models/LevelComponent' ThangType = require 'models/ThangType' @@ -40,8 +42,9 @@ module.exports = class I18NHomeView extends RootView @campaigns = new CocoCollection([], { url: '/db/campaign?view=i18n-coverage', project: project, model: Campaign }) @polls = new CocoCollection([], { url: '/db/poll?view=i18n-coverage', project: project, model: Poll }) @courses = new Courses() + @products = new CocoCollection([], { url: '/db/products?view=i18n-coverage', project: project, model: Product }) - for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses] + for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses, @products] c.skip = 0 c.fetch({data: {skip: 0, limit: PAGE_SIZE}, cache:false}) @supermodel.loadCollection(c, 'documents') @@ -58,6 +61,7 @@ module.exports = class I18NHomeView extends RootView when 'Campaign' then '/i18n/campaign/' when 'Poll' then '/i18n/poll/' when 'Course' then '/i18n/course/' + when 'Product' then '/i18n/product/' getMore = collection.models.length is PAGE_SIZE @aggregateModels.add(collection.models) @render() @@ -91,9 +95,9 @@ module.exports = class I18NHomeView extends RootView updateCoverageForModel: (model, relatedLanguages) -> model.specificallyCovered = true model.generallyCovered = true - coverage = model.get('i18nCoverage') + coverage = model.get('i18nCoverage') ? [] - if @selectedLanguage not in coverage + unless @selectedLanguage in coverage model.specificallyCovered = false if not _.any((l in coverage for l in relatedLanguages)) model.generallyCovered = false diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 793ccbde019..2c628d12de3 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -31,6 +31,7 @@ Classroom = require 'models/Classroom' Course = require 'models/Course' CourseInstance = require 'models/CourseInstance' Levels = require 'collections/Levels' +payPal = require('core/services/paypal') require 'game-libraries' @@ -94,6 +95,15 @@ module.exports = class CampaignView extends RootView me.patch() pixelCode = if @terrain is 'game-dev-hoc' then 'code_combat_gamedev' else 'code_combat' $('body').append($("")) + else if location.pathname is '/paypal/subscribe-callback' + api.users.executeBillingAgreement({userID: me.id, token: utils.getQueryVariable('token')}) + .then (billingAgreement) => + value = Math.round(parseFloat(billingAgreement?.plan?.payment_definitions?[0].amount?.value ? 0) * 100) + application.tracker?.trackEvent 'Finished subscription purchase', { value, service: 'paypal' } + noty({text: $.i18n.t('subscribe.confirmation'), layout: 'topCenter', timeout: 8000}) + me.fetch(cache: false, success: => @render?()) + .catch (err) => + console.error(err) # HoC: Fake us up a "mode" for HeroVictoryModal to return hero without levels realizing they're in a copycat campaign, or clear it if we started playing. shouldReturnToGameDevHoc = @terrain is 'game-dev-hoc' diff --git a/scripts/analytics/mixpanelABGemPrompt.py b/scripts/analytics/mixpanelABGemPrompt.py index 43682f4ea9c..026236794c1 100644 --- a/scripts/analytics/mixpanelABGemPrompt.py +++ b/scripts/analytics/mixpanelABGemPrompt.py @@ -88,7 +88,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished gem purchase'] > 1: - # print "User multiple subcription purchases?" + # print "User multiple subscription purchases?" # print item elif item['Started purchase'] > 0: started += 1 diff --git a/scripts/analytics/mixpanelABSubscribeCopy.py b/scripts/analytics/mixpanelABSubscribeCopy.py index 16f406ed9e9..b711890e2a8 100644 --- a/scripts/analytics/mixpanelABSubscribeCopy.py +++ b/scripts/analytics/mixpanelABSubscribeCopy.py @@ -87,7 +87,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished subscription purchase'] > 1: - # print "User multiple subcription purchases?" + # print "User multiple subscription purchases?" # print item elif item['Started subscription purchase'] > 0: started += 1 diff --git a/server/commons/mapping.coffee b/server/commons/mapping.coffee index 1b55b664363..9438487673a 100644 --- a/server/commons/mapping.coffee +++ b/server/commons/mapping.coffee @@ -53,6 +53,7 @@ module.exports.routes = 'routes/github' 'routes/languages' 'routes/mail' + 'routes/paypal' 'routes/sprites' 'routes/queue' 'routes/stripe' diff --git a/server/lib/paypal.coffee b/server/lib/paypal.coffee index 6cbf469b000..fd493f93c9a 100644 --- a/server/lib/paypal.coffee +++ b/server/lib/paypal.coffee @@ -8,6 +8,7 @@ paypal.configure({ 'client_secret': config.paypal.clientSecret }) +Promise.promisifyAll(paypal.billingAgreement) Promise.promisifyAll(paypal.payment) module.exports = paypal diff --git a/server/middleware/products.coffee b/server/middleware/products.coffee index 7880a3ee481..00e4f8d8066 100644 --- a/server/middleware/products.coffee +++ b/server/middleware/products.coffee @@ -18,6 +18,7 @@ get = wrap (req, res) -> # Remove old unsupported subscription products products = _.filter products, (p) -> p.name not in ['year_subscription', 'lifetime_subscription2'] + products = _.filter(products, (p) -> p.i18nCoverage?) if req.query.view is 'i18n-coverage' for p in products if p.coupons? @@ -68,6 +69,7 @@ productStubs = [ amount: 100 gems: 3500 planID: 'basic' + payPalBillingPlanID: 'P-23R58281B73475317X2K7B4A' } { @@ -97,6 +99,7 @@ productStubs = [ amount: 0 gems: 1500 planID: 'basic' + payPalBillingPlanID: 'P-2KP02511G2731913DX2K4IKA' } { diff --git a/server/middleware/subscriptions.coffee b/server/middleware/subscriptions.coffee index bc0cf6732d4..1ef5ab01ffa 100644 --- a/server/middleware/subscriptions.coffee +++ b/server/middleware/subscriptions.coffee @@ -10,10 +10,11 @@ Product = require '../models/Product' Payment = require '../models/Payment' User = require '../models/User' database = require '../commons/database' -{ getSponsoredSubsAmount } = require '../../app/core/utils' +{ getSponsoredSubsAmount, isRegionalSubscription } = require '../../app/core/utils' StripeUtils = require '../lib/stripe_utils' slack = require '../slack' paypal = require '../lib/paypal' +{isProduction} = require '../../server_config' subscribeWithPrepaidCode = expressWrap (req, res) -> { ppc } = req.body @@ -31,6 +32,8 @@ subscribeWithPrepaidCode = expressWrap (req, res) -> subscribeUser = co.wrap (req, user) -> if (not req.user) or req.user.isAnonymous() or user.isAnonymous() throw new errors.Unauthorized('You must be signed in to subscribe.') + if user.get('payPal.billingAgreementID') + throw new errors.Forbidden('You already have a PayPal subscription.') # NOTE: This token is really a stripe token *id* { token, prepaidCode } = req.body.stripe @@ -220,6 +223,9 @@ purchaseProduct = expressWrap (req, res) -> unless /lifetime_subscription$/.test productName throw new errors.UnprocessableEntity('Unsupported product') + if req.user.get('payPal.billingAgreementID') + throw new errors.Forbidden('You already have a PayPal subscription.') + # if there user already has a subscription, cancel it and find the date it ends customer = yield StripeUtils.getCustomerAsync(req.user, req.body.stripe?.token or req.body.token) if customer @@ -227,7 +233,7 @@ purchaseProduct = expressWrap (req, res) -> if subscription stripeSubscriptionPeriodEndDate = new Date(subscription.current_period_end * 1000) yield StripeUtils.cancelSubscriptionImmediatelyAsync(req.user, subscription) - + paymentType = req.body.service or 'stripe' gems = product.get('gems') if paymentType is 'stripe' @@ -239,7 +245,7 @@ purchaseProduct = expressWrap (req, res) -> description: req.body.description productID: product.get('name') } - + amount = product.get('amount') if req.body.coupon? coupon = _.find product.get('coupons'), ((x) -> x.code is req.body.coupon) @@ -247,10 +253,10 @@ purchaseProduct = expressWrap (req, res) -> throw new errors.NotFound('Coupon not found') amount = coupon.amount metadata.couponCode = coupon.code - + charge = yield StripeUtils.createChargeAsync(req.user, amount, metadata) payment = yield StripeUtils.createPaymentAsync(req.user, charge, {productID: product.get('name')}) - + else if paymentType is 'paypal' { payerID, paymentID } = req.body amount = product.get('amount') @@ -282,7 +288,7 @@ purchaseProduct = expressWrap (req, res) -> productID: product.get('name') }) yield payment.save() - + else throw new errors.UnprocessableEntity('Unsupported payment provider') @@ -317,6 +323,84 @@ purchaseProduct = expressWrap (req, res) -> SubscriptionHandler.logSubscriptionError(req.user, "#{productName} sale Slack tower msg error: #{JSON.stringify(error)}") res.send(req.user.toObject({req})) +createPayPalBillingAgreement = expressWrap (req, res) -> + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to create a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() + product = yield Product.findById(req.body.productID) + throw new errors.NotFound('Product not found') unless product + planId = product.get('payPalBillingPlanID') + throw new errors.UnprocessableEntity("No PayPal billing plan for product #{product.id}") unless planId + + try + name = product.get('displayName') + name = "[TEST agreement] #{name}" unless isProduction + description = product.get('displayDescription') + description = "[TEST agreeement] #{description}" unless isProduction + # Date creation from paypal node lib example: https://github.com/paypal/PayPal-node-SDK/blob/master/samples/subscription/billing_agreements/create.js + isoDate = new Date() + isoDate.setSeconds(isoDate.getSeconds() + 4) + billingAgreementAttributes = { + name + description + "start_date": isoDate, + "plan": { + "id": planId + }, + "payer": { + "payment_method": 'paypal' + } + } + billingAgreement = yield paypal.billingAgreement.createAsync(billingAgreementAttributes) + return res.status(201).send(billingAgreement) + catch e + log.error 'PayPal create billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal create billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) + +executePayPalBillingAgreement = expressWrap (req, res) -> + # NOTE: internal payment saved in paypal webhook, not here + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to execute a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() + throw new errors.NotFound('PayPal executed billing agreement token required.') unless req.body.token + + try + billingAgreement = yield paypal.billingAgreement.executeAsync(req.body.token, {}) + userPayPalData = _.clone(req.user.get('payPal')) + userPayPalData ?= {} + if userPayPalData.payerID and userPayPalData.payerID isnt billingAgreement.payer.payer_info.payer_id + log.warning "New payerID for #{req.user.id}, #{userPayPalData.payerID} => #{billingAgreement.payer.payer_info.payer_id}" + userPayPalData.billingAgreementID = billingAgreement.id + userPayPalData.payerID = billingAgreement.payer.payer_info.payer_id + userPayPalData.subscribeDate = new Date() + req.user.set('payPal', userPayPalData) + yield req.user.save() + return res.send(billingAgreement) + catch e + log.error 'PayPal execute billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal execute billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) + +cancelPayPalBillingAgreement = expressWrap (req, res) -> + yield module.exports.cancelPayPalBillingAgreementInternal req + res.sendStatus(204) + +cancelPayPalBillingAgreementInternal = co.wrap (req) -> + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to cancel a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') unless req.user.hasSubscription() + + try + billingAgreementID = req.body.billingAgreementID ? req.user.get('payPal')?.billingAgreementID + throw new errors.UnprocessableEntity('No PayPal billing agreement') unless billingAgreementID + yield paypal.billingAgreement.cancelAsync(billingAgreementID, {"note": "Canceling CodeCombat Premium Subscription"}) + userPayPalData = _.clone(req.user.get('payPal') ? {}) + delete userPayPalData.billingAgreementID + userPayPalData.cancelDate = new Date() + req.user.set('payPal', userPayPalData) + yield req.user.save() + catch e + log.error 'PayPal cancel billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal cancel billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) # TODO: Delete all 'unsubscribeRecipient' code when managed subscriptions are no more unsubscribeRecipientEndpoint = expressWrap (req, res) -> @@ -409,6 +493,10 @@ module.exports = { unsubscribeRecipientEndpoint unsubscribeRecipientAsync purchaseProduct + createPayPalBillingAgreement + executePayPalBillingAgreement + cancelPayPalBillingAgreement + cancelPayPalBillingAgreementInternal checkForCoupon checkForExistingSubscription } diff --git a/server/middleware/users.coffee b/server/middleware/users.coffee index 2c03922e32f..5dc86cdc890 100644 --- a/server/middleware/users.coffee +++ b/server/middleware/users.coffee @@ -107,6 +107,8 @@ module.exports = # Delete personal subscription if userToDelete.get('stripe.subscriptionID') yield middleware.subscriptions.unsubscribeUser(req, userToDelete, false) + if userToDelete.get('payPal.billingAgreementID') + yield middleware.subscriptions.cancelPayPalBillingAgreementInternal(req) # Delete recipient subscription sponsorID = userToDelete.get('stripe.sponsorID') @@ -501,5 +503,5 @@ module.exports = } }) ] - return res.send(200) + return res.sendStatus(200) diff --git a/server/models/Product.coffee b/server/models/Product.coffee index 15710b3fdd2..fbef076e1ca 100644 --- a/server/models/Product.coffee +++ b/server/models/Product.coffee @@ -2,9 +2,14 @@ mongoose = require('mongoose') config = require '../../server_config' co = require 'co' ProductSchema = new mongoose.Schema({}, {strict: false,read:config.mongo.readpref}) +plugins = require '../plugins/plugins' +jsonSchema = require '../../app/schemas/models/product.schema' ProductSchema.index({name: 1}, {name: 'name index'}) +ProductSchema.plugin(plugins.TranslationCoveragePlugin) +ProductSchema.plugin(plugins.PatchablePlugin) + ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> basicProductName = 'basic_subscription' if country = user.get 'country' @@ -14,4 +19,11 @@ ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> product = yield @findOne {name: basicProductName} return product +ProductSchema.statics.jsonSchema = jsonSchema + +ProductSchema.statics.editableProperties = [ + 'i18n', + 'i18nCoverage' +] + module.exports = mongoose.model('product', ProductSchema) diff --git a/server/models/User.coffee b/server/models/User.coffee index 6551e3b8e1a..0c831ec7e7f 100644 --- a/server/models/User.coffee +++ b/server/models/User.coffee @@ -351,11 +351,15 @@ UserSchema.methods.sendWelcomeEmail = -> log.error "sendwithus post-save error: #{err}, result: #{result}" if err UserSchema.methods.hasSubscription = -> - return false unless stripeObject = @get('stripe') - return true if stripeObject.sponsorID - return true if stripeObject.subscriptionID - return true if stripeObject.free is true - return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) + if payPal = @get('payPal') + return payPal.billingAgreementID + else if stripeObject = @get('stripe') + return true if stripeObject.sponsorID + return true if stripeObject.subscriptionID + return true if stripeObject.free is true + return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) + false + UserSchema.methods.isPremium = -> return true if @isInGodMode() diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 08b46d85df1..939047639e1 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -189,6 +189,9 @@ module.exports.setup = (app) -> app.post('/db/user/:handle/check-for-new-achievement', mw.auth.checkLoggedIn(), mw.users.checkForNewAchievement) app.post('/db/user/:handle/destudent', mw.auth.checkHasPermission(['admin']), mw.users.destudent) app.post('/db/user/:handle/deteacher', mw.auth.checkHasPermission(['admin']), mw.users.deteacher) + app.post('/db/user/:handle/paypal/create-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.createPayPalBillingAgreement) + app.post('/db/user/:handle/paypal/execute-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.executePayPalBillingAgreement) + app.post('/db/user/:handle/paypal/cancel-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.cancelPayPalBillingAgreement) app.post('/db/user/:handle/reset_progress', mw.users.resetProgress) app.post('/db/user/:handle/signup-with-facebook', mw.users.signupWithFacebook) app.post('/db/user/:handle/signup-with-gplus', mw.users.signupWithGPlus) @@ -216,6 +219,11 @@ module.exports.setup = (app) -> app.post('/db/prepaid/:handle/joiners', mw.prepaids.addJoiner) app.delete('/db/prepaid/:handle/redeemers', mw.prepaids.revoke) + Product = require '../models/Product' + app.post('/db/products/:handle/patch', mw.auth.checkLoggedIn(), mw.patchable.postPatch(Product, 'product')) + app.get('/db/products/:handle/patches', mw.patchable.patches(Product)) + app.get('/db/products/:handle', mw.rest.getByHandle(Product)) + app.put('/db/products/:handle', mw.auth.checkHasUser(), mw.rest.put(Product)) app.get('/db/products', mw.auth.checkHasUser(), mw.products.get) app.post('/db/products/:handle/purchase', mw.auth.checkLoggedIn(), mw.subscriptions.purchaseProduct) diff --git a/server/routes/paypal.coffee b/server/routes/paypal.coffee new file mode 100644 index 00000000000..5c1a7c8b1a1 --- /dev/null +++ b/server/routes/paypal.coffee @@ -0,0 +1,77 @@ +errors = require '../commons/errors' +co = require 'co' +expressWrap = require 'co-express' +log = require 'winston' +Payment = require '../models/Payment' +Product = require '../models/Product' +User = require '../models/User' + +module.exports.setup = (app) -> + app.post '/paypal/webhook', expressWrap (req, res) -> + try + if req.body.event_type is "PAYMENT.SALE.COMPLETED" + yield handlePaymentSucceeded(req, res) + else if req.body.event_type is "BILLING.SUBSCRIPTION.CANCELLED" + yield handleSubscriptionCancelled(req, res) + else + log.info "PayPal webhook unknown event #{req.body.event_type}" + return res.status(200).send("PayPal webhook unknown event #{req.body.event_type}") + catch e + log.error 'PayPal webhook error:', JSON.stringify(e, null, '\t') + return res.status(500).send() + + handlePaymentSucceeded = co.wrap (req, res) -> + payPalPayment = req.body.resource + unless payPalPayment?.state is 'completed' + log.error "PayPal webhook payment incomplete state: #{payPalPayment?.id} #{payPalPayment?.state}" + return res.status(200).send("PayPal webhook payment incomplete state: #{payPalPayment?.id} #{payPalPayment?.state}") + + billingAgreementID = payPalPayment.billing_agreement_id + user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) + unless user + log.error "PayPal webhook payment no user found: #{payPalPayment.id} #{billingAgreementID}" + return res.status(200).send("PayPal webhook payment no user found: #{payPalPayment.id} #{billingAgreementID}") + + basicSubProduct = yield Product.findBasicSubscriptionForUser(user) + productID = basicSubProduct?.get('name') + unless /basic_subscription/.test(productID) + log.error "PayPal webhook unexpected sub for user: #{user.id} #{productID}" + return res.status(200).send("PayPal webhook unexpected sub for user: #{user.id} #{productID}") + + amount = Math.round(parseFloat(payPalPayment.amount.total) * 100) + + # Check for existing payment + payment = yield Payment.findOne({'payPal.id': payPalPayment.id}) + return res.status(200).send("Payment already recorded for #{payPalPayment.id}") if payment + + payment = new Payment({ + purchaser: user.id + recipient: user.id + created: new Date().toISOString() + service: 'paypal' + amount + payPal: payPalPayment + productID + }) + yield payment.save() + + return res.status(200).send() + + handleSubscriptionCancelled = co.wrap (req, res) -> + billingAgreement = req.body?.resource + unless billingAgreement + log.error("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") + return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") + + billingAgreementID = billingAgreement.id + user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) + unless user + log.error("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") + return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") + + userPayPalData = _.clone(user.get('payPal') ? {}) + delete userPayPalData.billingAgreementID + userPayPalData.cancelDate = new Date() + user.set('payPal', userPayPalData) + yield user.save() + return res.status(200).send() diff --git a/spec/server/functional/subscription.spec.coffee b/spec/server/functional/subscription.spec.coffee index 4d400c3e785..f966e3b7e02 100644 --- a/spec/server/functional/subscription.spec.coffee +++ b/spec/server/functional/subscription.spec.coffee @@ -718,6 +718,18 @@ describe 'Subscriptions', -> nockDone() done() + it 'returns 403 when trying to subscribe with stripe over an existing PayPal subscription', utils.wrap -> + user = yield utils.initUser() + yield utils.loginUser(user) + user.set('payPal.billingAgreementID', 'foo') + yield user.save() + requestBody = user.toObject() + requestBody.stripe = + planID: 'basic' + token: {id: 'bar'} + [res, body] = yield request.putAsync({uri: userURL, json: requestBody, headers: headers }) + expect(res.statusCode).toBe(403) + describe 'APIs', -> # TODO: Refactor these tests to be use yield, be independent of one another, and move to products.spec.coffee # TODO: year tests converted to lifetime, but should be reviewed for usefulness @@ -989,92 +1001,709 @@ describe 'DELETE /db/user/:handle/stripe/recipients/:recipientHandle', -> describe 'POST /db/products/:handle/purchase', -> - it 'accepts PayPal payments', utils.wrap -> - # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock + describe 'when logged in user', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + yield utils.populateProducts() - user = yield utils.initUser() - yield utils.loginUser(user) - yield utils.populateProducts() - product = yield Product.findOne({ name: 'lifetime_subscription' }) - amount = product.get('amount') - url = utils.getUrl("/db/products/#{product.id}/purchase") - json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } - - payPalResponse = { - "id": "PAY-03466", - "intent": "sale", - "state": "approved", - "cart": "3J885", - "payer": { - "payment_method": "paypal", - "status": "VERIFIED", - "payer_info": { - "email": user.get('email'), - "first_name": "test", - "last_name": "buyer", - "payer_id": "VUR529XNB59XY", + describe 'when subscribed', -> + beforeEach utils.wrap -> + @billingAgreementID = 1234 + @user.set('payPal.billingAgreementID', @billingAgreementID) + yield @user.save() + + it 'denies PayPal payments', utils.wrap -> + product = yield Product.findOne({ name: 'lifetime_subscription' }) + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(403) + + describe 'when NOT subscribed', -> + it 'accepts PayPal payments', utils.wrap -> + # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock + + product = yield Product.findOne({ name: 'lifetime_subscription' }) + amount = product.get('amount') + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } + + payPalResponse = { + "id": "PAY-03466", + "intent": "sale", + "state": "approved", + "cart": "3J885", + "payer": { + "payment_method": "paypal", + "status": "VERIFIED", + "payer_info": { + "email": @user.get('email'), + "first_name": "test", + "last_name": "buyer", + "payer_id": "VUR529XNB59XY", + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + }, + "country_code": "US" + } + }, + "transactions": [ + { + "amount": { + "total": (amount/100).toFixed(2), + "currency": "USD", + "details": {} + }, + "payee": { + "merchant_id": "7R5CJJ", + "email": "payments@codecombat.com" + }, + "description": "Lifetime Subscription", + "item_list": { + "items": [ + { + "name": "lifetime_subscription", + "sku": product.id, + "price": (amount/100).toFixed(2), + "currency": "USD", + "quantity": 1 + } + ], + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + } + }, + "related_resources": [] # bunch more info in here + } + ], + "create_time": "2017-07-13T22:35:45Z", + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", + "rel": "self", + "method": "GET" + } + ], + "httpStatusCode": 200 + } + spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) + + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(200) + payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) + expect(payment).toBeDefined() + expect(payment.get('productID')).toBe(product.get('name')) + expect(payment.get('payPal.id')).toBe(payPalResponse.id) + user = yield User.findById(@user.id) + expect(user.get('stripe.free')).toBe(true) + +describe 'POST /db/user/:handle/paypal', -> + describe '/create-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "name":"[TEST agreement] CodeCombat Premium Subscription", + "description":"[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "plan":{ + "id": "TODO", + "state":"ACTIVE", + "name":"[TEST plan] CodeCombat Premium Subscription", + "description":"[TEST plan] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "type":"INFINITE", + "payment_definitions":[ + { + "id":"PD-2M295453FC097664LX2K4IKA", + "name":"Regular payment definition", + "type":"REGULAR", + "frequency":"Day", + "amount":{ + "currency":"USD", + "value": "TODO" + }, + "cycles":"0", + "charge_models":[ + + ], + "frequency_interval":"1" + } + ], + "merchant_preferences":{ + "setup_fee":{ + "currency":"USD", + "value":"0" + }, + "max_fail_attempts":"0", + "return_url":"http://localhost:3000/paypal/subscribe-callback", + "cancel_url":"http://localhost:3000/paypal/cancel-callback", + "auto_bill_amount":"YES", + "initial_fail_amount_action":"CONTINUE" + } + }, + "links":[ + { + "href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-92B61638JR311510D", + "rel":"approval_url", + "method":"REDIRECT" + }, + { + "href":"https://api.sandbox.paypal.com/v1/payments/billing-agreements/EC-92B61638JR311510D/agreement-execute", + "rel":"execute", + "method":"POST" + } + ], + "start_date":"2017-08-08T18:47:06.681Z", + "httpStatusCode":201 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'basic_subscription' }) + + it 'returns 401 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user already subscribed', -> + beforeEach utils.wrap -> + @user.set('payPal.billingAgreementID', 'foo') + yield @user.save() + @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) + + it 'returns 403 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(403) + expect(@user.get('payPal.billingAgreementID')).toEqual('foo') + + describe 'when invalid product', -> + + it 'returns 422 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: 99999} }) + + expect(res.statusCode).toBe(422) + + describe 'when regional product', -> + beforeEach utils.wrap -> + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) + @payPalResponse.plan.id = @product.get('payPalBillingPlanID') + @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) + + it 'creates a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(201) + expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) + expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) + + describe 'when basic product', -> + beforeEach utils.wrap -> + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'basic_subscription' }) + @payPalResponse.plan.id = @product.get('payPalBillingPlanID') + @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) + + it 'creates a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(201) + expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) + expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) + + describe '/execute-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "id": "I-3HNGD4BKF09P", + "state": "Active", + "description": "[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "payer": { + "payment_method": "paypal", + "status": "verified", + "payer_info": { + "email": "foo@bar.com", + "first_name": "Foo", + "last_name": "Bar", + "payer_id": "1324", + } + }, + "plan": { + "payment_definitions": [ + { + "type": "REGULAR", + "frequency": "Day", + "amount": { + "value": "TODO" + }, + "cycles": "0", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "0.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "0.00" + } + } + ], + "frequency_interval": "1" + } + ], + "merchant_preferences": { + "setup_fee": { + "value": "0.00" + }, + "max_fail_attempts": "0", + "auto_bill_amount": "YES" + }, + "links": [], + "currency_code": "USD" + }, + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-3HNGD4BKF09P", + "rel": "self", + "method": "GET" + } + ], + "start_date": "2017-08-08T07:00:00Z", + "agreement_details": { + "outstanding_balance": { + "value": "0.00" + }, + "cycles_remaining": "0", + "cycles_completed": "0", + "next_billing_date": "2017-08-08T10:00:00Z", + "final_payment_date": "1970-01-01T00:00:00Z", + "failed_payment_count": "0" + }, + "httpStatusCode": 200 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + + it 'returns 401 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user already subscribed', -> + beforeEach utils.wrap -> + @user.set('payPal.billingAgreementID', 'foo') + yield @user.save() + + it 'returns 403 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(403) + expect(@user.get('payPal.billingAgreementID')).toEqual('foo') + + describe 'when no token', -> + + it 'returns 404 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(404) + + describe 'when token passed', -> + + it 'subscribes the user', utils.wrap -> + expect(@user.hasSubscription()).not.toBeTruthy() + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + spyOn(paypal.billingAgreement, 'executeAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {token: 'foo' }}) + expect(res.statusCode).toBe(200) + expect(body.id).toEqual(@payPalResponse.id) + user = yield User.findById @user.id + userPayPalData = user.get('payPal') + expect(userPayPalData.billingAgreementID).toEqual(@payPalResponse.id) + expect(userPayPalData.payerID).toEqual(@payPalResponse.payer.payer_info.payer_id) + expect(userPayPalData.subscribeDate).toBeDefined() + expect(userPayPalData.subscribeDate).toBeLessThan(new Date()) + expect(user.hasSubscription()).toBeTruthy() + + describe '/cancel-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "httpStatusCode": 204 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + + it 'no billing agreement cancelled', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user not subscribed', -> + + it 'no billing agreement cancelled', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(403) + + describe 'when user subscribed', -> + beforeEach utils.wrap -> + @billingAgreementID = 1234 + @user.set('payPal.billingAgreementID', @billingAgreementID) + yield @user.save() + + it 'user unsubscribed', utils.wrap -> + expect(@user.hasSubscription()).toBeTruthy() + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {billingAgreementID: @billingAgreementID} }) + expect(res.statusCode).toBe(204) + user = yield User.findById @user.id + expect(user.get('payPal').billingAgreementID).not.toBeDefined() + expect(user.get('payPal').cancelDate).toBeDefined() + expect(user.get('payPal').cancelDate).toBeLessThan(new Date()) + expect(user.hasSubscription()).not.toBeTruthy() + +describe 'POST /paypal/webhook', -> + beforeEach utils.wrap -> + yield utils.clearModels([User, Payment]) + + describe 'when unknown event', -> + + it 'returns 200 and info message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: {event_type: "UNKNOWN.EVENT"} }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual('PayPal webhook unknown event UNKNOWN.EVENT') + + describe 'when PAYMENT.SALE.COMPLETED event', -> + beforeEach utils.wrap -> + @paymentEventData = { + "id":"WH-7UE28022AT424841V-9DJ65866TC5772327", + "event_version":"1.0", + "create_time":"2017-08-07T23:33:37.176Z", + "resource_type":"sale", + "event_type":"PAYMENT.SALE.COMPLETED", + "summary":"Payment completed for $ 0.99 USD", + "resource":{ + "id":"3C172741YC758734U", + "state":"completed", + "amount":{ + "total":"0.99", + "currency":"USD", + "details":{ + + } + }, + "payment_mode":"INSTANT_TRANSFER", + "protection_eligibility":"ELIGIBLE", + "protection_eligibility_type":"ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE", + "transaction_fee":{ + "value":"0.02", + "currency":"USD" + }, + "billing_agreement_id":"I-H3HN1PXG1SEV", + "create_time":"2017-08-07T23:33:10Z", + "update_time":"2017-08-07T23:33:10Z", + "links":[ + { + "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U", + "rel":"self", + "method":"GET" + }, + { + "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U/refund", + "rel":"refund", + "method":"POST" + } + ] + }, + "links":[ + { + "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327", + "rel":"self", + "method":"GET" + }, + { + "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327/resend", + "rel":"resend", + "method":"POST" + } + ] + } + + describe 'when incomplete', -> + + it 'returns 200 and incomplete message', utils.wrap -> + @paymentEventData.resource.state = 'incomplete' + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook payment incomplete state: #{@paymentEventData.resource.id} #{@paymentEventData.resource.state}") + + describe 'when no user with billing agreement', -> + + it 'returns 200 and no user message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook payment no user found: #{@paymentEventData.resource.id} #{@paymentEventData.resource.billing_agreement_id}") + + describe 'when user with billing agreement', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + @user.set('payPal.billingAgreementID', @paymentEventData.resource.billing_agreement_id) + yield @user.save() + + xdescribe 'when no basic_subscription product for user', -> + beforeEach utils.wrap -> + # TODO: populateProducts runs once, so this could mess with following tests. + yield utils.clearModels([Product]) + + it 'returns 200 and unexpected sub message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook unexpected sub for user: #{@user.id} undefined") + + describe 'when basic_subscription product exists for user', -> + beforeEach utils.wrap -> + yield Product({name: 'basic_subscription'}).save() + + describe 'when no previous payment recorded', -> + beforeEach utils.wrap -> + yield utils.clearModels([Payment]) + + it 'creates a new payment', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + payment = yield Payment.findOne({'payPal.id': @paymentEventData.resource.id}) + expect(payment).toBeTruthy() + expect(payment.get('purchaser')).toEqual(@user.id) + + describe 'when previous payment already recorded', -> + beforeEach utils.wrap -> + yield utils.clearModels([Payment]) + yield Payment({'payPal.id': @paymentEventData.resource.id}).save() + payments = yield Payment.find({'payPal.id': @paymentEventData.resource.id}).lean() + expect(payments?.length).toEqual(1) + + it 'does not create a new payment', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("Payment already recorded for #{@paymentEventData.resource.id}") + payments = yield Payment.find({'payPal.id': @paymentEventData.resource.id}).lean() + expect(payments?.length).toEqual(1) + + describe 'when BILLING.SUBSCRIPTION.CANCELLED event', -> + beforeEach utils.wrap -> + @paymentEventData = { + "id": "WH-6TD369808N914414D-1YJ376786E892292F", + "create_time": "2016-04-28T11:53:10Z", + "resource_type": "Agreement", + "event_type": "BILLING.SUBSCRIPTION.CANCELLED", + "summary": "A billing subscription was cancelled", + "resource": { "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", + "recipient_name": "Cool Buyer", + "line1": "3rd st", + "line2": "cool", "city": "San Jose", "state": "CA", - "postal_code": "95131", + "postal_code": "95112", "country_code": "US" }, - "country_code": "US" - } - }, - "transactions": [ - { - "amount": { - "total": (amount/100).toFixed(2), - "currency": "USD", - "details": {} - }, - "payee": { - "merchant_id": "7R5CJJ", - "email": "payments@codecombat.com" - }, - "description": "Lifetime Subscription", - "item_list": { - "items": [ + "id": "I-PE7JWXKGVN0R", + "plan": { + "curr_code": "USD", + "links": [], + "payment_definitions": [ { - "name": "lifetime_subscription", - "sku": product.id, - "price": (amount/100).toFixed(2), - "currency": "USD", - "quantity": 1 + "type": "TRIAL", + "frequency": "Month", + "frequency_interval": "1", + "amount": { + "value": "5.00" + }, + "cycles": "5", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "1.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "1.00" + } + } + ] + }, + { + "type": "REGULAR", + "frequency": "Month", + "frequency_interval": "1", + "amount": { + "value": "10.00" + }, + "cycles": "15", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "2.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "1.00" + } + } + ] } ], - "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", - "city": "San Jose", - "state": "CA", - "postal_code": "95131", - "country_code": "US" + "merchant_preferences": { + "setup_fee": { + "value": "0.00" + }, + "auto_bill_amount": "YES", + "max_fail_attempts": "21" } }, - "related_resources": [] # bunch more info in here - } - ], - "create_time": "2017-07-13T22:35:45Z", - "links": [ - { - "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", - "rel": "self", - "method": "GET" - } - ], - "httpStatusCode": 200 - } - spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) + "payer": { + "payment_method": "paypal", + "status": "verified", + "payer_info": { + "email": "coolbuyer@example.com", + "first_name": "Cool", + "last_name": "Buyer", + "payer_id": "XLHKRXRA4H7QY", + "shipping_address": { + "recipient_name": "Cool Buyer", + "line1": "3rd st", + "line2": "cool", + "city": "San Jose", + "state": "CA", + "postal_code": "95112", + "country_code": "US" + } + } + }, + "description": "update desc", + "agreement_details": { + "outstanding_balance": { + "value": "0.00" + }, + "num_cycles_remaining": "5", + "num_cycles_completed": "0", + "last_payment_date": "2016-04-28T11:29:54Z", + "last_payment_amount": { + "value": "1.00" + }, + "final_payment_due_date": "2017-11-30T10:00:00Z", + "failed_payment_count": "0" + }, + "state": "Cancelled", + "links": [ + { + "href": "https://api.paypal.com/v1/payments/billing-agreements/I-PE7JWXKGVN0R", + "rel": "self", + "method": "GET" + } + ], + "start_date": "2016-04-30T07:00:00Z" + }, + "links": [ + { + "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F", + "rel": "self", + "method": "GET", + "encType": "application/json" + }, + { + "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F/resend", + "rel": "resend", + "method": "POST", + "encType": "application/json" + } + ], + "event_version": "1.0" + } - [res] = yield request.postAsync({ url, json }) - expect(res.statusCode).toBe(200) - payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) - expect(payment).toBeDefined() - expect(payment.get('productID')).toBe(product.get('name')) - expect(payment.get('payPal.id')).toBe(payPalResponse.id) - user = yield User.findById(user.id) - expect(user.get('stripe.free')).toBe(true) + describe 'when incomplete', -> + + it 'returns 200 and incomplete message', utils.wrap -> + @paymentEventData.resource.state = 'incomplete' + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: {event_type: "BILLING.SUBSCRIPTION.CANCELLED"}}) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement given for #{@paymentEventData.event_type} #{JSON.stringify({event_type: "BILLING.SUBSCRIPTION.CANCELLED"})}") + + describe 'when no user with billing agreement', -> + + it 'returns 200 and no user message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement for #{@paymentEventData.resource.id}") + + describe 'when user with billing agreement', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + @user.set('payPal.billingAgreementID', @paymentEventData.resource.id) + yield @user.save() + + it 'unsubscribes user and returns 200', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + user = yield User.findById @user.id + expect(user.get('payPal.billingAgreementID')).not.toBeDefined() + expect(user.hasSubscription()).not.toBeTruthy() diff --git a/spec/server/functional/user.spec.coffee b/spec/server/functional/user.spec.coffee index 7bbf6cea393..f8ec0e88a1a 100644 --- a/spec/server/functional/user.spec.coffee +++ b/spec/server/functional/user.spec.coffee @@ -16,13 +16,14 @@ Promise = require 'bluebird' Achievement = require '../../../server/models/Achievement' EarnedAchievement = require '../../../server/models/EarnedAchievement' LevelSession = require '../../../server/models/LevelSession' +paypal = require '../../../server/lib/paypal' mongoose = require 'mongoose' describe 'POST /db/user', -> beforeEach utils.wrap -> yield utils.clearModels [User] - + it 'converts the password into a hash', utils.wrap -> yield utils.becomeAnonymous() email = 'some-name@email.com' @@ -35,7 +36,7 @@ describe 'POST /db/user', -> expect(user.get('passwordHash')[..5] in ['31dc3d', '948c7e']).toBeTruthy() expect(user.get('permissions')).toBeUndefined() - + describe 'PUT /db/user', -> it 'returns 422 when no data is provided', utils.wrap -> @@ -51,7 +52,7 @@ describe 'PUT /db/user', -> user2 = yield utils.initUser() [res] = yield request.putAsync(utils.getUrl('/db/user'), json: {_id: user2.id}) expect(res.statusCode).toBe(403) - + it 'returns 422 for invalid data', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -60,7 +61,7 @@ describe 'PUT /db/user', -> [res] = yield request.putAsync utils.getUrl('/db/user'), { json } expect(res.statusCode).toBe(422) expect(res.body[0].message.indexOf('too long')).toBeGreaterThan(-1) - + it 'does not allow permission editing', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -108,7 +109,7 @@ describe 'PUT /db/user', -> expect(user.get('name')).toBe('Wilhelm') expect(user.get('emailLower')).toBe('new@email.com') expect(user.get('email')).toBe('New@email.com') - + it 'returns 409 if setting to a taken username ', utils.wrap -> user1 = yield utils.initUser() yield utils.loginUser(user1) @@ -137,7 +138,7 @@ describe 'PUT /db/user', -> yield new Promise (resolve) -> setTimeout(resolve, 10) classroom = yield Classroom.findById(classroom.id) expect(classroom.get('members').length).toBe(0) - + it 'changes the role regardless of emailVerified', utils.wrap -> user = yield utils.initUser() user.set('emailVerified', true) @@ -166,7 +167,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { email: '', name: '' }} expect(body.code).toBe(422) expect(body.message).toEqual('User needs a username or email address') - + it 'allows unsetting email on student accounts, even when there\'s a user with email and emailLower set to empty string', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {email: '', emailLower: ''}}) @@ -198,7 +199,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { name: '' }} expect(res.statusCode).toBe(200) expect(res.body.name).toBeUndefined() - + it 'works even when user object does not pass validation', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {propNotInSchema: '...'}}) @@ -218,7 +219,7 @@ describe 'PUT /db/user', -> user2 = yield utils.becomeAnonymous() [res] = yield request.putAsync { url: utils.getUrl("/db/user/#{user2.id}"), json: { name }} expect(res.statusCode).toBe(200) - + describe 'PUT /db/user/-/become-student', -> beforeEach utils.wrap -> @@ -458,7 +459,7 @@ describe 'GET /db/user', -> # Add to the test case above an extra data check # xit 'can fetch another user with restricted fields' - + describe 'GET /db/user?email=:email', -> beforeEach utils.wrap -> yield Promise.promisify(clearModels)([User]) @@ -547,7 +548,7 @@ describe 'GET /db/user?email=:email', -> it 'returns 403', utils.wrap -> [res, body] = yield request.getAsync({ url: @url, json: true }) expect(res.statusCode).toBe(403) - + describe 'GET /db/user/:handle', -> it 'populates coursePrepaid from coursePrepaidID', utils.wrap -> user = yield utils.initUser({coursePrepaidID: mongoose.Types.ObjectId()}) @@ -596,7 +597,7 @@ describe 'DELETE /db/user/:handle', -> expect(classroom.get('deletedMembers').length).toBe(1) expect(classroom.get('members')[0].toString()).toEqual(user2.id) expect(classroom.get('deletedMembers')[0].toString()).toEqual(user.id) - + it 'returns 401 if no cookie session', utils.wrap -> yield utils.logout() [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/1234"} @@ -638,7 +639,18 @@ describe 'DELETE /db/user/:handle', -> expect(res.statusCode).toBe(200) # other login no longer valid user = yield User.findById(user.id) expect(user.get('email')).toBe(json.email) - + + describe 'when PayPal subscribed', -> + it 'deleting user unsubscribes', utils.wrap -> + user = yield utils.initUser() + user.set('payPal.billingAgreementID', 'foo') + yield user.save() + yield utils.loginUser(user) + spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve({})) + [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{user.id}"} + user = yield User.findById user.id + expect(user.get('payPal.billingAgreementID')).not.toBeDefined() + describe 'when the user is the recipient of a subscription', -> beforeEach utils.wrap -> yield utils.clearModels([User]) @@ -667,7 +679,7 @@ describe 'DELETE /db/user/:handle', -> yield utils.populateProducts() spyOn(stripe.customers, 'cancelSubscription').and.callFake (cId, sId, cb) -> cb(null) spyOn(stripe.customers, 'updateSubscription').and.callFake (cId, sId, opts, cb) -> cb(null) - + it 'unsubscribes the user', utils.wrap -> yield utils.loginUser(@recipient1) [res] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{@recipient1.id}"} @@ -701,7 +713,7 @@ describe 'Statistics', -> ThangType = require '../../../server/models/ThangType' User = require '../../../server/models/User' UserHandler = require '../../../server/handlers/user_handler' - + beforeEach utils.wrap -> session = new LevelSession name: 'Beat Gandalf' @@ -717,7 +729,7 @@ describe 'Statistics', -> it 'keeps track of games completed', utils.wrap -> user = yield User.findById(@user.id) expect(user.get 'stats.gamesCompleted').toBe 1 - + it 'recalculates games completed', utils.wrap (done) -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -763,7 +775,7 @@ describe 'Statistics', -> admin = yield utils.initAdmin() yield utils.loginUser(admin) - + [res] = yield request.postAsync {uri:url, json: article} expect(res.statusCode).toBe 201 @@ -802,7 +814,7 @@ describe 'Statistics', -> done() - + describe 'GET /db/user/:handle/level.sessions', -> url = getURL('/db/level.session/') session = @@ -845,11 +857,11 @@ describe 'GET /db/user/:handle/level.sessions', -> describe 'POST /db/user/:handle/signup-with-password', -> - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 10)) - + it 'signs up the user with the password and sends welcome emails', utils.wrap -> spyOn(sendwithus.api, 'send') user = yield utils.becomeAnonymous() @@ -925,7 +937,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'returns 409 if there is already a user with the same slug', utils.wrap -> name = 'some username' name2 = 'Some. User.Namé' @@ -938,7 +950,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'disassociates the user from their trial request if the trial request email and signup email do not match', utils.wrap -> user = yield utils.becomeAnonymous() trialRequest = yield utils.makeTrialRequest({ properties: { email: 'one@email.com' } }) @@ -968,7 +980,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> facebookID = '12345' facebookEmail = 'some@email.com' name = 'someusername' - + validFacebookResponse = new Promise((resolve) -> resolve({ id: facebookID, email: facebookEmail, @@ -982,7 +994,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> updated_time: '2015-12-08T17:10:39+0000', verified: true })) - + invalidFacebookResponse = new Promise((resolve) -> resolve({ error: { message: 'Invalid OAuth access token.', @@ -991,11 +1003,11 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> fbtrace_id: 'EC4dEdeKHBH' } })) - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 50)) - + it 'signs up the user with the facebookID and sends welcome emails', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) spyOn(sendwithus.api, 'send') @@ -1008,7 +1020,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> expect(updatedUser.get('email')).toBe(facebookEmail) expect(updatedUser.get('facebookID')).toBe(facebookID) expect(sendwithus.api.send).toHaveBeenCalled() - + it 'returns 422 if facebook does not recognize the access token', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(invalidFacebookResponse) user = yield utils.becomeAnonymous() @@ -1016,20 +1028,20 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> json = { email: facebookEmail, facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + it 'returns 422 if the email or id do not match', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) user = yield utils.becomeAnonymous() url = getURL("/db/user/#{user.id}/signup-with-facebook") - + json = { name, email: 'some-other@email.com', facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + json = { name, email: facebookEmail, facebookID: '54321', facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + # TODO: Fix this test, res.statusCode is occasionally 200 # it 'returns 409 if there is already a user with the given email', utils.wrap -> @@ -1042,7 +1054,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> # [res, body] = yield request.postAsync({url, json}) # expect(res.statusCode).toBe(409) - + describe 'POST /db/user/:handle/signup-with-gplus', -> gplusID = '12345' gplusEmail = 'some@email.com' @@ -1126,11 +1138,11 @@ describe 'POST /db/user/:handle/signup-with-gplus', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) updatedUser = yield User.findById(user.id) - + describe 'POST /db/user/:handle/destudent', -> beforeEach utils.wrap -> yield utils.clearModels([User, Classroom, CourseInstance, Course, Campaign]) - + it 'removes a student user from all classrooms and unsets their role property', utils.wrap -> student1 = yield utils.initUser({role: 'student'}) student2 = yield utils.initUser({role: 'student'}) @@ -1146,12 +1158,12 @@ describe 'POST /db/user/:handle/destudent', -> url = getURL("/db/user/#{student1.id}/destudent") [res, body] = yield request.postAsync({url, json:true}) - + student1 = yield User.findById(student1.id) student2 = yield User.findById(student2.id) classroom = yield Classroom.findById(classroom.id) courseInstance = yield CourseInstance.findById(courseInstance.id) - + expect(student1.get('role')).toBeUndefined() expect(student2.get('role')).toBe('student') expect(classroom.get('members').length).toBe(1) @@ -1183,7 +1195,7 @@ describe 'POST /db/user/:handle/deteacher', -> teacher = yield User.findById(teacher.id) expect(teacher.get('role')).toBeUndefined() - + describe 'POST /db/user/:handle/check-for-new-achievements', -> achievementURL = getURL('/db/achievement') achievementJSON = { @@ -1200,12 +1212,12 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> description: 'Started playing Dungeon Arena.' related: 'a' } - - + + beforeEach utils.wrap -> yield utils.clearModels [Achievement, EarnedAchievement, LevelSession, User] Achievement.resetAchievements() - + it 'finds new achievements and awards them to the user', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1221,18 +1233,18 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> [res, body] = yield request.postAsync { uri: achievementURL, json: achievementJSON } achievementUpdated = res.body.updated expect(res.statusCode).toBe(201) - + user = yield User.findById(user.id) expect(user.get('earned')).toBeUndefined() - + yield utils.loginUser(user) [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(175) earned = yield EarnedAchievement.count() expect(earned).toBe(1) expect(body.lastAchievementChecked).toBe(achievementUpdated) - - + + it 'updates the user if they already earned the achievement but the rewards changed', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1267,7 +1279,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.statusCode).toBe(200) # special case: no worth, should default to 10 - + yield achievement.update({ $set: {updated: new Date().toISOString()}, $unset: {worth:''} @@ -1276,7 +1288,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.body.earned.gems).toBe(100) expect(res.body.points).toBe(110) expect(res.statusCode).toBe(200) - + it 'works for level sessions', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -1296,7 +1308,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> json = true [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(200) - + # check idempotency achievement.set('updated', new Date().toISOString()) yield achievement.save() @@ -1341,16 +1353,16 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> admin = yield User.findById(admin.id) expect(admin.get('lastAchievementChecked')).toBe(achievement.get('updated')) - + describe 'POST /db/user/:userID/request-verify-email', -> mailChimp = require '../../../server/lib/mail-chimp' - + beforeEach utils.wrap -> spyOn(mailChimp.api, 'put').and.returnValue(Promise.resolve()) @user = yield utils.initUser() verificationCode = @user.verificationCode(new Date().getTime()) @url = utils.getURL("/db/user/#{@user.id}/verify/#{verificationCode}") - + it 'sets emailVerified to true and updates MailChimp', utils.wrap -> [res, body] = yield request.postAsync({ @url, json: true }) expect(res.statusCode).toBe(200) @@ -1358,7 +1370,7 @@ describe 'POST /db/user/:userID/request-verify-email', -> user = yield User.findById(@user.id) expect(user.get('emailVerified')).toBe(true) - + describe 'POST /db/user/:userId/reset_progress', -> it 'clears the user\'s level sessions, earned achievements and various user settings', utils.wrap -> userSettings = { @@ -1369,7 +1381,7 @@ describe 'POST /db/user/:userId/reset_progress', -> spent: 10 heroConfig: {thangType: 'qwerty'} } - + user = yield utils.initUser(userSettings) otherUser = yield utils.initUser(userSettings) @@ -1377,7 +1389,7 @@ describe 'POST /db/user/:userId/reset_progress', -> otherSession = yield utils.makeLevelSession({}, {creator:otherUser}) otherEarnedAchievement = new EarnedAchievement({ user: otherUser.id }) yield otherEarnedAchievement.save() - + yield utils.loginUser(user) session = yield utils.makeLevelSession({}, {creator:user}) earnedAchievement = new EarnedAchievement({ user: user.id }) @@ -1386,19 +1398,19 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + stillExist = yield [ LevelSession.findById(session.id) EarnedAchievement.findById(earnedAchievement.id) ] expect(_.any(stillExist)).toBe(false) - + othersStillExist = yield [ LevelSession.findById(otherSession.id) EarnedAchievement.findById(otherEarnedAchievement.id) ] expect(_.all(othersStillExist)).toBe(true) # did not delete other user stuff - + user = yield User.findById(user.id).lean() expect(user.points).toBe(0) expect(user.stats.gamesCompleted).toBe(0) @@ -1407,16 +1419,16 @@ describe 'POST /db/user/:userId/reset_progress', -> expect(user.purchased.items).toDeepEqual([]) expect(user.spent).toBe(0) expect(user.heroConfig).toBeUndefined() - + otherUser = yield User.findById(otherUser.id).lean() expect(otherUser.points).toBe(10) - + it 'allows anonymous users to reset their progress', utils.wrap -> user = yield utils.becomeAnonymous() url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res, body] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + it 'returns 403 for other users', utils.wrap -> user1 = yield utils.initUser() user2 = yield utils.initUser() @@ -1424,14 +1436,14 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user2.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 403 for admins', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) url = utils.getUrl("/db/user/#{admin.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 401 for non-logged in users', utils.wrap -> yield utils.logout() url = utils.getUrl("/db/user/12345/reset_progress") diff --git a/spec/server/unit/subscriptions.spec.coffee b/spec/server/unit/subscriptions.spec.coffee index 51d1b4e57d9..2507f40642b 100644 --- a/spec/server/unit/subscriptions.spec.coffee +++ b/spec/server/unit/subscriptions.spec.coffee @@ -1,11 +1,10 @@ subscriptions = require '../../../server/middleware/subscriptions' +Product = require '../../../server/models/Product' utils = require '../utils' describe 'checkForCoupon', -> - beforeEach utils.wrap -> - yield utils.populateProducts() - it 'normally calls checkForExistingSubscription without a defined couponID', utils.wrap -> + yield utils.populateProducts() req = {} user = yield utils.initUser({country: 'united-states'}) customer = {} @@ -19,6 +18,8 @@ describe 'checkForCoupon', -> expect(couponID).toBeUndefined() it 'adds country coupons if the user is from a country with a country-specific basic product', utils.wrap -> + # TODO: yield utils.populateProducts() only yields two products when all tests run + yield Product({name: 'brazil_basic_subscription'}).save() req = {} user = yield utils.initUser({country: 'brazil'}) customer = {} diff --git a/test/app/collections/Products.spec.coffee b/test/app/collections/Products.spec.coffee new file mode 100644 index 00000000000..d57829d4130 --- /dev/null +++ b/test/app/collections/Products.spec.coffee @@ -0,0 +1,14 @@ +describe 'ProductModel', -> + # Temporarily turn ajax back on for a real call to /db/products + beforeEach -> jasmine.Ajax.uninstall() + afterEach -> jasmine.Ajax.install() + it 'basic_subscription products have payPalBillingPlanID set', (done) -> + $.ajax("/db/products") + .done (data, textStatus, jqXHR) => + for product in data + continue unless /basic_subscription/.test(product.name) + expect(product.payPalBillingPlanID).toBeDefined() + done() + .fail (jqXHR, textStatus, errorThrown) => + console.error(jqXHR, textStatus, errorThrown) + done(textStatus) From 52fc6c3177f59952aed9baf1f81e88112b014bca Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 11 Aug 2017 14:29:29 -0700 Subject: [PATCH 025/227] Add video to homepage Move screenshots up in the homepage Address CR feedback Load vimeo API asynchronously Fix lightbox buttons being in the way --- app/assets/images/pages/home/video_thumb.png | Bin 0 -> 474958 bytes app/locale/en.coffee | 3 +- app/styles/home-view.sass | 54 +++++++++++----- app/templates/home-view.jade | 63 ++++++++++--------- app/views/HomeView.coffee | 35 +++++++++-- bower.json | 3 +- config.coffee | 3 +- 7 files changed, 108 insertions(+), 53 deletions(-) create mode 100644 app/assets/images/pages/home/video_thumb.png diff --git a/app/assets/images/pages/home/video_thumb.png b/app/assets/images/pages/home/video_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce2d1a8168ebefc619960d8c956eba93573798b GIT binary patch literal 474958 zcmV)2K+M01P)(IRS5mn?ymFDR8HsfRD8YJ4eL!etc*DliAdo#xyz?v;LUsIv^k}| zq+Apgk^q+a8c9#JLU168Pf~c4albE*`wxcoo81TRtv18ZH^BfLFwPj6Xq{vtZ*Skb zeg8wG4j?WBgwOf@k>pWufwT%i{H(&3E8*qg{wrVk%Dc9U(DHez4K z(=>i-93LpZS#N7jq`QZ_%d7Qf)2&t{fdo=a1?i-GLYk-oUEkgXDRe!Y@mT7asVGWq z+-r$YpZlA-?6Agy09aGNrH>~B3J{4a?4^F4!0WK`+HpIe*TtK>DiOG#hA)2k1b6y$ zdfb=u`MsOnn~y)*-Mu$CzVM}QK7M0buW$OnNYBY69rpXv=_Iks8#(X)=f5`p{e|DW zzkmPq&A}gg-zT|9$qWL52u01BSvE?9V6D$K0X}abk&G$PK=9&&K?E4FXo-+h!Hb3^ z2VQ{$$yfJHiq|&woq0T;CYb?TmI_dpE2OIvw-wsi3;7F&6lxbhbfj{gg-3DVdAmJ=Y1Aaw0dL~DTvNKLaX-jHUbB!n^u za@=r$U{szlK^j_{Z# zyKb}D^sC`KO~=FGa6Eb`1n3x#r!p1^;c~g7fHE>$B0yogTHoz<+wILXO=q9R(-;tq z?jb3W5TX=!mjnS!Fy?+3)@!p|yd1~lem}1|j%NiIzrTAE>$}Mi3IFxqU;ewl`&Z`O>Sh;4 z_Llq3YU(=6NoGuWRc%^ts@a>(YO`8V`ojPG&v-ih-tYe2x*raYUq5~JMLm9Xh=bWl zJcEvQ0Fpx@B8a&Ghy?)#v{~?}kC5ck}nUfI3xfj za(Qu*N0j+iOcjJDT9ZvBuEBunE@my zsLPuZ2s3cu%JU});t5?Ic5wtC1ZEc1-&_39{>aN02H-1lFagL1-u~l%@BjL5{yG2g zpZ~!+b=CPnh9a=Ly}8@m>{8dm3_w9ZM1vrq2v>Sq72hXDy1w6k@>2hJ_#EOF3Te(2 zz3U)<^#1by-%&}>697p51YOrp=5`REP%*RhYAsB1_i(e+b$w2qS-*cfdWaP>UNA67 zfOs*Lgqj=>i*7+r?Q00)D`qt{Kj+VhfWGSw#P4OWX=TljO$!NlxO<7YkrVcVVs%gD-mYKh5=1!D?&4e2tqOg1p^p3kLN==n57zHb?l8COL;bqAVO%6 zbPtb7q>BMcn4wy1w&T}P6}3XJqCjPuru|_*3`5^{OHk5x zU5(F-XB-rM8296T|MvLyaD05MF*OtxAaJ+4`IR@Hd_v?rSl8u#u+`>vxBK*yPriPC z3J+KU2tc7ZqahHW(ag|Tj##Y&3Q`*oAk-4rrV~U&07he*y$&N6o9*g7EwzMl{kA9q z32gdV05ze@H*fh#1Q2@KQ&qya{8uxG`#l})6; z07DUO0e~hFfE?LMexF~I9$%_Ek^cr4|Q2|zdq_0T$t{4T8-#(<|kLJCSl=PyV zFG1y{2O6n(UXw^yHzt}e2ugbQ`YPJUfQ!Nqu48`95G1s$E)EM4S8 zF3z#|}f~GQi3s9jb9+Q_eSxU6bM#!@z1CIN{xLRj3V*=Ra+*|UL3M@Qw>L37a z5P@oE&Y5H;NDGA*kBC|ba}UA+tK^hC+{~&%vsu+xPK?Ozs z@j8tfgv`$EyqWbOa>G4kwCi|PI*lx(Ll(itce(wv3^T&umW86Sfr$huFgk96vWp`m z%^(O&V;W_EQ-r8MCNhNtL{b7t%Getqf&#n4D*~n@Flkb*z;B%1 zc}au}bYiH(VT^Acru`7Rio+1qX3LgqGFIliwANy25zJeh2F|VwfKliwyWj>BSKcOo*4lKQ#@*O|le`LT*&;J+{c$5?o=7Pp zG8@$Efg&N)T1Z-{OKXv6aXy_-8QBA7Bv;|NwZ#_mQpAqgIgbADuz$bs!ZeVKX0-0K zk#!iX)M&NCYbslds*=JxpXl;=ZRc4G$A;;Nw`#SHZ!vMkGan&Z;{t+nOdB0@?^MvP=ZLPDe> z4YaPC(p=1V|Q8P=av6okpwGi_@KMD3*pSkgL;Y7BerThg(uBaGw^eOzr%j$XQDMxO))@#|MB6&aannIg3b z8^1yO9XIXWJ_=f^lDXXiQf4pPv;K$ecIubhPTkZw@aCR{aBuvY0IR!t{K{oFWursd zwyVOQquPm^TqUN|QjxE(ug~ZCQBQRkAf!@+xhwO0e2Zm%eApkB6Hd?MCRKLsxSV&} zGBLGoh-X5=?XrTmowpLFK;Cj8xe1#Bw{~|;jm9taU}XybjV1Yg^V65qNZr@jJQuZ! zun@I1>2iLvmX^MxNz#lGv5ACV!_BR8NcR2)4S+I1${~Xh=>lo$lx5J?g6>4u<3KSp zBw;0QT{}%Qx>=8h2y6f&*h<^HCvmNVib$iX`@?7tJMC*!Q}M)g$CnaegvUGSotGs* ziwM$(p$=YX=5FRrvj42J?8e>0{*b_;CT)Tx1ZBphq?^HvsbmsKV9VzaLC`@L#2yev zgwd8|F=KAsL6g!h)g|@di82a8kakscGp^!1B^l_YR+fjuNsjGWX%VEb+R$o=&Hi&(HHT@5f!K)ku`Vc7pNTUMzAx z&TpdeTdRkMTCv-C*?;qND1~!|v#ztWA{|>+0oV_?Qob_#!7?v(v|-r!@Q$0tOfylW zQH-Xxgv1n1=jn8uBrMDF{QMlt@%T2MPUrKvosaEwdjBnenZD?~><*78wM805_Gu`C z8-&3fZmh-3jSkxSh5BGsq?*v>>P$%O(x*@mC{37y2^cdVu!v4G%KMGhX-!HRih~4{ zMi#moi&-sRhYNQ?ZmLvubJH;La2SngjKXkJF`1-$F{A=&(4uIO3SG54 zTUSNAdFIH(F3!_D zE$y7yQq2S?=Xp6DPjPD1>S(o?$^0(a{0G>_B{8jd>5HoGebgsl*LgTozj0;rcO&fG zcsphU@yaolK=y$qQPdCKOxLCG*GyB;*MFY3`0~?uSl7Z21cPnju%FgC@(YFq1rwC< z`u03|okkAW)mqru_97=_#$jJSmBT(x!^=QYseAv|ZK@8JtK()eP~wM_1pcs;?rk5w ze{AHG9l7&My)aYwW$f$N*NwN1TME<`Zh@D-j*^5)(l3<|x~i-p(JX;9s3?okiU~>~ zK^c?C^)a&cBRkw1At@7?1Zd1mkVbBLCyaMxFNjeY&9cD^O%3uo0 z4=-e(@AM)w-v8P>Z<%t}UNZ08sZ5D*nk*eCKuTAgPMO&;T_CCM>VCg0tp#8p=V>8n zynOVIi&&O_Vq$q{^ z{k~Qg#}$B~C4t<$OLLkBgH=C*9p@sW4h`iTU!@ zTAbcy*^9=1Z@cl+(-X(1!*19ehSOU!gz*}0Bi(G1huz#r5|ME_oqFga+R~Qh4$-Wz z%kreSCY%-<#sQ#t{R7yR1bfHM(GW96Es)AkLqeTcX(lIK z&}wNWFC-EYu_n^eNbou~%*<&hmp919vh0Q&or8NZceDC_%<4fql9U=Up~jqx&d5M$ z)g?oel(rJxtwPvgIw6VN){fh1%gt!Km;iZkkfPCy?vey+P3N{W^pqE{)?${@nQ9qt zr`OM?<4a~EKv+bHC1Z;H!|=3!u-!h3V-+BNpb?-LA_4|;cN;2}j7$;Qo(%~Q_Yjb& zlpG)-62DdZ-3WZpy{piLA1>uFry%dao6}132uIp0zrxF zz1^t*lCISd8435%?Qzt@pu-?XN~ug_WH7To6baTcy7h2z9EYBdNYH@HG_!FScl+Jb z<5MX$qakG=kcmi1*~c<7LXnUZk$syp8e3xu5tIx@1Eg)Y)UJ#eP$FBWn{6?c>=BeZ zd)t)Od{*tGj_}ktq;DWJY9LS}I{?S0!4B-q)6bj80J5 zE()^sr9>GAn1hZ4l;~rtz1#6T&GRx%)AQ$-@4kC^{(LFV&o3`;&oAfG#051ul-=H~ zG-JYoO!JUQmI-BMT7pR?m0Fh8(@jO1bs9@Z%3Rd-V}TS&iI4+E0@AfGIVZ?OqSNIC zBiH>8w+l~$=EP7r7Q@?I`M!`CN`>TR54+vdL)rO*>&-Ml%@oumov5R6B10BwH7P)( zKoKxd+R`PpO{3b>5`tVY(`bh6{hd0L-CAe_|4-}?)E2hllUVS{UVgza>%igQYw_!y~QmG1UL88yL)qp+{k5}BzWietz^9gj(7Dp7W@EUVsFp=(s?_P zzC75B+y;p@Cf3T2+qZYzNJy{^0`CQQq8qpCww}>8YBwmq=h8mP3F;m?yUHz4w7h~X zMG5QyC$_G`-MgnwNMK4@Pd=nVN&47bl*Fw&Z*rJ#941)Z4ny0Q7)=BgAtdPI?N&;q zO9DheW@eu%uc@~dh5tq>u$GOT2oB`(|L*rg=p;6 z3~(|dzWtB?Fxp@K^4D<~oh0p22&PCU&1}CP>frM-XCy%pyWO5RDD!llzI%R|=UHmC zJd`r1E3Po3Nm<-!%(k_O5J~m;yZdf`*gKV(jYOI*{6HBK5Y60~N=2_d)<1mHkn#Bi zndjHz+vn%0tv{V4hZ6)=ValW&sbnU@33!g)6f~uL5OeP%xvx4KM)-VSNxolCaLBG-;)2 z#gbU)ETtBc0iNN^R8FxhewBD%Vxcjj5q204kH_8PI6RKy)8Sz^ST&60zu5Z^@5YfV zc@&PgnE*&is;YJ~vv$mSzu))#|Ngu?=I6aP^V{(~?Mf0!0C{h`l90#)sZ`xH{d)Gz zob7Bii=+%e5I{!8jfktvG3zFkmnZYIT(8Vk}A~A?i;mNM)*{4g$i9(-W84s3Cew$<_j< z5i6M(668X4u294pa3j~&U$ZUZ6I|v_s}Et#X9_$GVVWHDA&_fgO(E5{L+UZ?uD={@ zo$)lYNGx*(+ZAn7np`PGJ=hA8R++u6-htNEC~WTa2hbSu09QS(hzPX<^5JShjkhPb zSp%80*0`9kNS!(G7TT~1}!b@GtMJkMT=mjW%hmhN7c*j~cD zlxZr{1fOm8C?&j5V0}Ala6IP@n5Y-4TF-j?B%$=A- zH;Dm3;SniwH+19J$sHLSFyFhP6rw`Lm4-2Q|LEr*hL`u={l?+qGMOO6ls^<>l4IXD?sQb0K5D>&&`&E~U%>n6js|d^#yvHX~`461->b!up{% zOWm&TEYGL0j3+Z0X%cBUGv(zN4iX3&xf=#Ne|}r$@#dxvVV=V8KM{6Dni(LM)7T}; z$*3@BiL&Za&M7VU(f}&f6r@08iR~JNT77XUZ4%TP_f9faQ=x<+n4xzB!UF$U&@IdB#x3Y8!MWx~@D)K80-Xllm9 zrZQRR-c_K_ysUL2j5!bcWGwSMIWOjU0w5p_{i~z2w{-opkALvPzxnv(%{TsVuV)>Z zcsG7=YRVGa>r8(CCARNBL_%$@Zs7Xs@s*5b$xtkm_^;KLv+Apkv)K0wmyIH9a=GMlnnB-@p&8Bg>`tx1Y_eemf=+k@N; zQvGII$MP{^s}K1_pOl0)X_%_sEjBfJ(vso9XmqNY14`tUFnvfWt}6NEZ`$$<*^uxX z4~u61mzwb+lOSUGZv0|#OGX9+u$_J_CMhCdV6?r|_72sK$n`$Kb_PZW?zu=FlY0Pi zAw)#m4cT%~s`HjXvSb7iAz|0;cKh93C9&_9BI!M1o0dC}M--3Z?uvyxl266Q*~^SF zt2o?!o&rc_*_N$~btNQnxzCD{V|fE15vH~tlDG_jlu06!SrwT?^|ZiJ1{eZa=6PnQ z?}yzmmw5(|%!a-%rA*UQN+AfgT}q$lk3afop32qLi>nvUFP~klVfj(lfXhlCM5|^r znvy9cW=pxd$bG)OIYBT(&Sut=2zMiM*C(@-?(5oCac7^>f!!eN@9N3@{;=zFKQbN5 zw63?T@~|QILZZf=fi&jB{vw_i`5YlqE`@_(WHuH=g!kPr>~?+M!zc$7$?QH-G&O?W z?{R8gI8Y!IKs13bTjqlV)@RUW3i-lCw6ms4JIvPPPKXj&?RQOMMGlAE;rWaAzNz2- z&hNPE`m>u4Km6#&KmOT|UV+XZe)!4H&!^*TL`pr)CR)%;0@2f8fZ0^a9L`o&6V$|y zEtAzL$Wb6zb*YPu-H$b|Oej$tkt`LGFv3kBZS{2#tXGmqV@W=98nfLT?bE)y*bi41 z`^$^{)!v>BhYRa^J2B4CnOKZH4qzwR0!1rnv28(5Rtgz#mpZV|;j;GSSZ2qq8B3Fx@MRk^4~Hx+Th?C}C)!(^#`6hx2jS#U~4em-7u;-LWw%G5i3`ysk(KWk~g;m?PE4VZHl0^tsyu0 zq)%J8+N-}|a3kAf^9z=*_o>rFHBg*mI-;ViWFhC5C63c0BXqnOmTcwmn z!!oSP+49iu@9i(y%;ssjxxI~2a!!d>ppZ)*3U`kHLot<@i%(O`1yQ0DMi4Su>-t5B zT2`PA0cx&$Lr}{^MlhO0m8_c;Mq7Yb1V}FEt@x6zDWgzXR5Nm#iYzVhSUvRx63(uKS!vPm}Vzr&^$R1i7=xXyRO^s zcj^ardH2q<>*;v9xjD&qUVL^XSpe=5pkg-UoS95gDRWM#>r&TcQVPjyzGImu$jv~u z6VF)H!i`}Lg=nUh3(Ez=F5j)^q#_oG*_L<$AFMgqs7J_WfVpGWakqc*!MEP|-gkfV z(~m#>^yA}?zW?#R`?uf!;ZJ_@(ap<9j!qMYkS!qGmgTgWN(n)AxgG){A{_Voyzg>G zEIdcl%>%T_9p1`9tU}5bbn6}oMT_xU_LtFUwo-&Km*Vr>k}w~1@mL7*HUt-EXNe@{95APx470Gr zY#_USxE%KVIF^_VQcCXL?ROvi=C|DPG|zDw)$L#ezkG(c*44FB0VKBR;B_{F5ps8Y zrQ_>Np;VO@zfN)VBont-q%l=sEw3cwGV0>>ErzZ0cPw{=*0BK+_$3`SEmmT|Sm3W! zZ>9!KAY0K#fS{R-9>wQ^oKiwcoT(@d2xhxsuuOT(KF_ze!)c;GGX`ix7_oA7Z-Bp& zUJp5{ceIsY>Pgy{d?V1@-Z3MP+F`T|OUq}kh0T4mZLdT52Kt&xqYc)tHx2$mx)$1+ zYSa!&iJ=x6wM~27n(EZHnH3f3%X{6Q=EW;N+^C0$WeBWA%-iI zxR`H6uqqH(bsk=sl?d(j!+y8#Q{N9g35TD?(|I}?fk=u76mX$kWl%)%Y4)+)vzwC? zM9>2Y0;~l@Zm$MwJZbIS8R0OtLT$5#EjIwk^~%A9S(q##C5teR@Td?yHRR;5ouDdJqp@ih80MwuDK7&#$ZGGjM% z^Ykjt{dww!v>(#dA#J#m%l&iSgghH7DumqSk-5tp<>SWkD7_(klc8Bz>;r(xZEC23q|Mqvj`&-}t zFF*K)|Kwl(hadbj<~ip}w_O;jz7*(l?*L{m;T0&>Lnk~mO%sH~v~DmZge{z0rq78eK<6H~ICLZ-(x;;|II$#V+@0hjcQYsnIYS z3OR?l07F`26-0_kGlT~r*~Ty=Bh6BmnM_0*0UIMGFjCG@Q}ekL8Fu~9rBu9lN;#Q( z2NgyUw10Nd@47iKlTSLUAZuJk94_cUi)Yr+GM)-Gm5q zc0XiIAJ?GU6ZY^%GCpcrCT^S2seyy`p;dpr$hTT@wOh4{^Fkkl5K6Z7FFoxv--;#M zHh!rP{pKF8Fm3zZ+7`C^GLtGKYObM&37(At-N3;I(DN(Ed?MMbSxvawwo*;C&qZwdb-|cq&&CT(6^5w0WWlNn|XW2v+T83G- z%e#xPqih_@IVQI#9f3@sn32GlZB;Lr`ggh|M`P7QEJ zBvUwi_FzC-y=Dj_l36lHT%NDElSoFem`qXQ`WI*$VH8^-h_py%pccIlEDUBo&*qWm zRHm-vZtnBAOV=0a>d+nbX`gm`jJ+n}q;wl}aam~v6$@4_fw6E76D+BA-zS)W)km>e zfztwM@)Dq!v*m=@10mF&qkU%1T`4}xRjP7}g!PvDp+m}PcTT&g-lSj5c|!1k@6v1v zFW~|n8G9eK1u-C{1S7s4U&UyuvR}h3PstL%h#;dm(gG5KoC#8nC`1u_Whv~-G`nuz zq6g{i?U5d{SOOnXH@|BBHa$KFo*2^R`)%)5u_SB#3KoJ(B~XBzY(X*+F?;wq#^8C5 z^YwUjGwsfP5J_&^RBO`;sX@;t#?uP%H*PrbR)cRb%`j1-mJt#{+j86ecoMpCYaV}M zZ0T9GpKdHV8x(uOm&CQ}$BG+LsxUPqi3-F5$!S=rO`{r`CBK@~t=Gi~Xr};0aEsF= zv=L1v4G1PB8DM3cr|aWcIrg1(T{4TB^GL#4JBRHdoGg_R=kqyP?sAtxr*XtIXGH>u z&^*QYTxM4(Q9R}{ozAgX(&nO4S}Hxw9u)yM;Z(6MTx0FLVvI_QNXE2DD5$e-sEJ2N zL<^E>k`0(B1qADJrpKZKX9yDRp6xFC+!=K|M_Tzb zkq(d+Fc(wq_7|7C!!hU7_d7oxHJw#Pz^l-uz^5{f(|(=<>h8A6BsI7>jnjBMdB=3f zG^Ui|4nQC0c~-a?*Nr^(dDamFMhxO-NV)J{Q2%5{QZCa(@#F_hAVPEs}Gn27_#Mpvh=cF z)6vx!N_US%S18dS5=%!>nprEhRJvL%-xXMMzzD0ZS*)ScL0DCI2*y=pBt(=bm}aCL zV>g}q>$6>+?CQ#{cHLDsT%^*YXJlzy$kw);lrYVj3q11LyRs}GbLefq+hthmPOp$i z7fLXY0+w^v`Q)K+1-$q?mV}ft7lm`gdgcY-mXf6m>&wD1k-%Epd8=YNTQ}NeuQ{TV zMfmbvs|%63W7pSZ1p6W9+~KPjUk`%d=KinAP+O2NNr-SjhB{0FoMMzH(=?AaKA+4o z5pNB`;vrO|K&qxWJk=W8fB>5;WVw|HHpz0t7gF*h|6e-OCB5Ze+E!61JULoB>19`w zNemiD0~3%UEMS5akMlUr9z%$=f~b3Y#yp+<(-G&FV>$DkND&HO#PJW}Kp}mp{iBTp zq7CC)No}7lj`IycNE?pTSYuc8h5LGoTc3{N57pHO*9&abB{maN+bXNSvLW8I%u8&i za3%RIs&i*~o>uvWI&tdF%89ogM#h7US-sfH+i4`RnbyY(L$Xm&uwCS{RM zKI{7(Q$k|U)PS-GFv24miDeOx{Or?V&mj-xcszc5jd6y%T%j_Lr};F7d(5-XC8A1X zLy?L@5~>Zz1V#;6`!c%Aa!QuEdp62ARn>05EJcaQ&(re0+(Vk@^5VsdSIq(Q(B+)n18w(5 zgw}{_m{~HQ%rIk@bN6cWJw$~BioDqEc0>N`Wmo32EpSNANM^C@5|_GRclqMQbiCc= zp`>BFemQwiFx0M$F&BA2$Yx48=Psq3a!$+&#_T2~-b0EmS+;vFck~F4B6&)P+9R&o z#{2t7a|%)109$f2nT5rO)7G$!CTwC7sPS12QZRu=38v4v&_pvYwzW4}Fzxb`A|{CY zi}aoEee3z5KjiNJ`oI3s&u*?Q6G$U06fT0POWlkZr%?*`H8d+HwuYj0ZD>eITtm53 zGhbDS%hvd!U7BRgR4E7w#qt{wAeqwg5-^E0kqQdFzB_j-G4~?AUmH~Ri2H_DOU}UU|yom6KmP!vkm~7w2!M@Kv}W{sFbh`#XPoBnrM|gJcxd7G;k_Q$ zC!3D;!h1&w)tGGy)xW=P>yxrbBcE0bKDC-{8~1eX`kNtUd-BcE?OeM*)(vK8?SA=r z%WT^iV4qC>Y!1~1Km`ziXdZPor2A%Z8EI^kn3+gx*U@HwYM|}m=CmOZ3cbB0%^uLe z);@+Bcd<-#W_9w9nwj(l+zl*EhVD`;Ze40%Bs_Tm|MzLkbM};i>L?`QGaohJ{1BK zhC1`J#q^-o2w`NSeYr-(SCmKW1`;S%?x*y!c$*YvDRo`H-^Jv9Jf9=f-$Ac*I*rpj zji>3OpMUf!;pq8`ci#WtgJ+f0Al)Ell zu07e@_xJ9d@pS9cWY$W^R7L(weRpwn$%xq%HWD%tFnNJF&BTR&TqL8mzc}phqVW8o@uKs1f-n!?)%UGhyU)cFLwL??f?G!|K%s2!} zO8N3K?{>TM`E*=(Tp%gG8qIFkV5HH&h3|u2UkGnzFohN`o3k~!A|I~(q-BR237W0@ zg>$%1WpYj8(LGPR-lu)XUVZ0enO|+`&Gqd(ox*1?6HvTN;iF;#3k}JXbLn%u_xy6d z-(Nku*w{B)xuxbij-FTCG?ua<`Un&ABP%iUD<@n&WNTbCJ7 zt3W#Dxtz||=keBkg3{uYrGl1PQMNUP-3&d*2ShY%23lL_a(z-&J+2@ksDJ_pqLzgd zx5L;P-u*I$mhpge<5S@fh_)4Pq`E>xT`eQpfs()?P)6E{AgZQX?x)kZ9}fNfMB-r1 zou7|qT|GtHxgA#7oB+qkD8<{Rtk0@$LI*fb$+O6L>o;}d3WJ@I4hp*DXV(TWc?;6MuT3<25+j<7TprdMu$RhT7sE1eE)_*HnCj~5p<{p0JM3s{({x%hk62q zzy5JF!$rJ)6g_gR)7W&S%ULM}NYxmU!ngbKKrw92#sEFOxWAT`uL zGHqJd+QsG7;jk~a!I5@^iHOYyrArUfF{ zAPqzBLUG>>{d7@I<9wdx<-d&Wg5qbVz$dU(FoMtn7Zx`d*sY&3k&yH*vh`^3@r1kG7njT)_8q_)`|dCm$}HO z6cmD_NSV;ifR;7jwMZh74NKZ4KXv(9Ai6#7n^E6iEH!%T?Ad$o{N-Q$anS##|M~y= z@aCwLPUs1P)a?J@5K&UL<DDJ3#-*&XhoX=aJAq7chHx3^2XJiu{DT}&@OJsn?`Q9eu2K{AFV z8expPGJ0nz?P!UOn2|5IavaC0Ec?=OyS5g0dHMN=Kg0dTyz|aGT{k4lxeK3*!pHH5 zGEOBr>@YmDN7Lt9g%xsRVN5U+=w6m88x<9_v;C}^KHl9GqJ0e%zaC~OJ@!}_87QTU z=i_ufmia6RQ748r42&lUtu{|TVyyHu_7jS!8o1KW;m<*?>l-w?XLfak)w|2ttiATbN0MAbw7& zXaG%}zl;`>v~CsAC}e$AeIN9u#Xt++Z0QEVveQt(kI*KirZfvR;=C#Y3?4p~86HM( z^)xnLu0qANI}ERwJjhPB=hN*`lgD{1^BpTQPbEA6z*hUWf+DH5wQC2?)h=e3t_dr&)vXcxcr8M*;k(455MU;CjKtza^ z?$0mL+@sI^T>LP{G?#Ini^??5x99UufAX_e-GeSKuPzT4UElSuM%PW4wzg_o3a*Y`_pChZ2p)i`EKN$9(N=yE@FUCs=JNcaeE zC7$Ju2qa6a#_>|hvTOsH%yQRR?m{BNxKx=5(&zbndxVGjULEf~>iy-j!?Vj5@1Kvy z)6MnqC-jh2+V+t*mu0#ch9cw8hWKfDB8uKcsZR*DV;I_WWZz=hVwk7X|!Z^ zPp#i?a1j}lNXy9*#`840O}tGUwcD`<8|oJi#5OXSb>Qe8P5DYe7EMhJu4ZIfcqp96 z_`5g09!)h9t6q& z2N9d9hseL}?x2F8mIN+{;8)XmiV!7=R(D7MTFo9FE@`>7b&~0gJ9weHrXkK5Gb?;z z3z>KlF}M3he$nBuUEq3s^2>}jVNEO#&9?f@H-ddi539t~T1b5wCBGIVBx>`Zb(CbV z4z0fyo9yqVENp1Eg*rCT$b%o?SI|RMZ$&G#f-w*c0=L>iqZ8`0%XUWiLNAH%C>~0* zb`*lFZ(7x9@oI+ax;_HqG|LqwAQ~-Oo-t7{TGT$-^6-|SmS|LqJFD(BQ*d=BwL&`E zzks2Qrr_H?Y$sv>)Ph2={G-NeYC){q3PU|#DKcE@ETz63fVx+$Ow&|CB|;D_A#>=5 zX)fn!&a-!=%%vF5=dm28@#W3OKmPGYyZzznj{3cPb=wa)Wp;^O=5E(_8D?fp&sK_& z5d|1aneHKAPRS1YVLznhILu%&b}13WYG)B^nY~QK=b87XygT+6m#@af#bGz>6bKJX zIS(C-(mgLQjk1(d$~i6Z9ibq(zpLV>;w2ZqCwJ$FFqnZ9y%ZBuVx{zi5@I9&9$zC2 zZ4svs+lft?wNsiwJh*O?3)j5Hrbo;9ZHTjdZ3_aeAl7%!-hJm!{^<9A@cj?}$-n-a z!FEmsO-KQ(8iS;HUP@$UG)t?ZJIYw*GWT7d%zV2TCIU=Mf);5B1Ov?KODn4B(vmIb zQh`h~vjuT3BrQ@3iDZ{DCBY3=f{6}tnkR+05`D$8SxUJdp6&aKclXc6%qazKiX&)6nI}lc7{TXIVsTAGJGv}GReV6-4ePL=m5ST3W>MzUW zbAjf`PB$qJ=z9U}WPGc!nS>u%1lpzfVZUS5r7T?X2b9L&(eX9%w8XTQL>o|WKw^+# zfZU@vkkn@3M!-C9%4k^y6Gnkp-M()*^pIrJuT<>76NAmXtuI4lv1N!Nga9HXxG9=} zMnQTqB~zw)6ycmX%0dPU8fjmYg!*()d7~L2J|zNdaE~k2dNKk32~e~l{6NY92R#lk|(VYL%o|-)yp41brMK)P|N3ig0fH?yaq{_;|}&Zr{V*`%srAk@f}> zTGH0*#RpujV#_i$+zdz-Ew#FN?6@ikC^4jPSMfk7NEt2B*iKi0tXtQ2xxZuFIu%7J zh$^En+R*i79Gwi&7FL9zy65b3@J1vf9v0C+OJxY~X5gZD2k54)k;^>@YbY}RK>26vY0ld+%_$&waOiSSh8${xYS!09=5UEa!WlkRc+Zu=^os zJfH8gM(2nixI9k^QU&S?N3e#WCc=T%QkBxCW?l!IID}P)ZBSdeZGS8QWhwq57GN4p zAFkyWH$AnU4*%`)H-Gb6fBn~g@uQ!7eEM`8SPFe6XcPcrcfVWaySG?eu^c%mS+cH_ zGM9NAN1DO7fKie)h14ei25a_qxKPcV2qD~yd&(*01SmoZ-94nOnt926JfAu2a?X&% z2qZ!jNz6Xqo)ii}W)9Fw>AGD?mM->}yRLtJ7;i7n*B{0CjOi>ZGj?HFHaM)H074`M z=FqI-kmz7!v()u_FQ>5ta&M_e8g7s$Us+3&k!F2K&&pwcJ{^m54@xdY5Mp|3^tYvp ze8XW{yM{ifVG&iQua@8)>vWUwcW-<>L=tAnurQiNgiEnfQx0f3<4OrzXS>z|@UdvM z&39~_TKL8N30k?c-EX%~`&j<=u_pOBcA+n|QAC?sR&)bD9Cl_DFqdhbi&>_kODu_f z?vM)16DCj(IBGt<3Ea&44fSsUV5@X(wq<$H+%{~%l&g0|DrTM)LfJZy+fOook|u}zn1M3BaY16o`n6c#d^L77%2Qj|m}A_zl6)gc%NDVl6^`EIOk zn${LSP%GPqlD`SHV#Zf{?f>D+ht#{2J_Pp4;B7l-{__4CEE%U95I*_%1%QamE& zD5cDT_c?W49{LU`E4n^++0t@o=Pq|S=aelc5L~_x-L8N4{r7+4w}0#M*`*_7gy0_i zu+Lp*OaOe*C8m^e+6{x5d4#0>e)nnsnx;vb7iU#5@)R>AKB!w zEl_~6DpFA`AFMwIZq6%$5w)mbv;@_^L9nWj5rl1s2|g;^Dgw~{>f(34^IPBh-giIz zNB=Uyk=%h;7mhS^IV-|bB$>N=xC2Hrv!NeoB+V74)5(k}_o?bx6`>MALoza%;(maZ zss$z@eD)4~&S^!ZVa8ghD8QgarVV-MGCLpKqsUQ$N2SwTr&Ah? zu-rijd54QjO%l^unAE@K*c&~1uI!l6*eZUMT0-{c0|kLk2U~8Q(yz=8)b{aP z?{sc^bp)x@*(=&)7zUrqJWt~|=8mMYVdy&c+;u=Y4Wb43(D1n>$DYztZXayH^6QYf z?cCV5^L@N>XxQipe)AVjq|)ov%JMoKA}D(hq6KHrTg-06-I^srEuvif0)5-fn&j05#(Ne?&mE0Df$EulkIHb^Bx zU_}8$Ym+ao`sf5jh3&Bl2AU~~!UpA1CbqByCPSYFAw0%;cRH7TEMfhzp!@XZaJUpK zrF^_Oe){RP``iGDKz6_7e06oX-(7}do-ileYAVyqo9k28r~TpZ%HY3HXplT+$&k9O$&z8{cl%-2cSEu?blucf$O%N4BSqJx=O4WHo8SJO7w^9Zqhb!Z+;i&p`<aTFc{2 zO^TZg2#VWP7F&YSvRjW>IE9>Z$4=5Xj<>fr{V-fyTns}mAg46nTd~|DclqAhZ+DNp6qiw!jIdCs zGQlb391*3=fO5_Yz7Kc95@ne{N}5Y4?zM;MI#No>3}9iI%WU_oc0cq>vrW(0%m^l; z?}nl8yWKt)Cu5|YaXHX{0!$=Dn>9@`Ax!(MF4Gd3xa-$KhEWVQ)~9_kTx~^W0|Js| z(dx(a#H`LYJs_#|oMF9=L_mVrrlA(Hi%=BNLU{S|6D00-7m!J{68|KT69{}g-Y^9H zntIi@;S(uY6VwqVMPpeamPq3%r7UO}Zw|g8(bCLmfuKLsyJifd+-5lp>jL9rP3KMoI z3yES5=D<3*#k-2o1HxDj%+l?{Ha7COVMb|t>Qn7|3*M69Vc1pGH34i^o{g&a31|dt zxZEe=dp1LDPHPHZHLp+oQG3e+Jk?ihjjkogOn}oUN~9ixI<1IX^#wx=A?jw4tnEdt z77~pDv|1AgW3%3C3!m$qcE9Zo)rWlAPV)reu8p;yq$N^;sIIn98a;Pq`s`NOQsOXl zAR#W1MG;=+;t>ilTk6uHQ8P0yUZ$zcB_dedipvXuY!)dc%Wf3NAQ5~W`iooc`tf}A zW)XA)CC$vw^~e>$Mk_}wMZ#4PxIJtkA%Rx6tp14v2y&2sRUN4+pG_P`yhntmp8|olS;hz-g_T>@a_lizqs7(j2OD%Vt+`+yUe)rG|lC7 z8gH&|clW){Q%>$BVm?PXC!5CMV%P76ZgR1N`qFisrL^o&QP!nlKky=7J->MOTkq}O zyW(Mxamd4XI>%gkD&41hdZ^6fROVqfT)p$`)p|9jEcuqoU{vGRN6VTJlur48Mw7swvYh8f}rRyQ=2!;z+U(_uK4LZ&T|Q8&MD`+8+Z38?rvs;)nrvN_uYar!^7!j77-8v;STfEcikps>26g1 z6YzT@QA%kcMR`A!&hy;$^F8hyvKfSA=3PfKLmvhQe1bl)g5%s*3&`vDR_sDNgMjhgVb;r|sgNE1JPdvFuX|?IbwzryjEg6ejdF0zSK;7n9X?=zf zE1M&cGRX)q>Ym!3wYI#|x&Qt!~uvM%n13wk^vtfL>f<35zKc9W7axx+&m9$jj_fwC>fsA4Wnd^Hio;?o>e1 z;#ylO6{MMEqc6B98hN$ZI<~WYJ*6pP<12an^n2ubqrGltuX|;!l`vG#B1(E)?cMHk zv!-5F2exc!vr;smR0CBbKrDWrX&SF@Z;r?FeJI)R(MKQu^d~T*hX=!dzKyRY+X#(SDGCua9KJeI{fYjLmKJH3*bRi*64g;+{~)c1YW zakgC%0dmprs_T-O>Q5-{zsfzu+F4rMJkuOzww#8UW;0)&Pal37T_8EnJ*qa9%K)!|M_~vd3?db4bQwT{Hk3fr zus;YgNvGq@&FyVU!#gk7Ki|Kp{$VhDJ)Rot!dp*c8@9##ui|KQ=8_;$vs(jN(W6=w zR+J1fseN~2?onXj^4U-zvD_sn!63DClxVX++cAyd0R@vpv7SlR5TeA*&TOpX8`~Pz z+b4MFhO+tQ{2;TMx@G|FtrF(#&B#95L)I{C6PuYP5N(Dsrnj!&=x_Ua@+FrR{vrkeb8de)t-Z&4@>+S$t4uC(%A}B2Yy; zUK>K1rMlpK9isDblg8K*#L{EB(<*2d9I{9D$>8H$ohQ8c%VsvVgA9mV9RaL-t*=eN zLQO(aF?TgpE||t7qH>%9L95$QHLnVRU<1ZR1cUV?Xsd(96>%{m1*r$Y*s7fI^3DO6 zBI;kRH_*0|JGs8c2Hoq_9Uhv2u~>=Zk}CsYm_1nBmI;E^rA!iHM4V5javsOiQC<=m z6co+F-=!|+*-@;%s@2bqEyCRv8oI_w#Y$+mO|N^1wQAd*U9qasHa+*zP^ccJYpv2v zReZBKyY#TLv+8bBs*`POHN+y?X`on8xDXo0INqLaZqL^@N0Fp`^3l(K{DU9*c>c}b z`pw__-gmz73Ty7V+~x4uOEC+g^!+~X4wr}BIE`~TFN?J0Jk7lsX^L_O4##Pl$8k0$ za9Vts!_Z$`9LzD@+?1EF&bnQ{KkRlF`+m2x%;ktmUCv#CXS2?%7xTT$dmi?$e)2%G zQZ$t!W40U~QRbYp5eYC#a?uE)>NV%Uyd(tC&}Aa67pADSmlm%@ZTz4@kW$cM)BL=u z#LY4*@oy^zMbqOVOmG+glblFG5L7#cw_|}Ub=6{hpMU$ezxmzY{np=n|K9||>fw>v zrJx0ak<1GX86uS}%jAmiD5HClrJ9{o{9e8^&Rujv*Qb;zg-66}W-?pq{xw(AR>EY{ zn%E=G<9IKf%^*UucG)o#5NnZL60|Z6CQ5FJV4@|Pt;UlXd4Jac!@8_84|#Ef7nQpdX+|+LX0nx=<8HJ-pN5?uA;@jO%ywQb3wT5$fgToE z8cNV+g%BYrJeGw^N`Yi%)|f6yo8J}NpL@79;=@-X>)PAZfXCJj&(~>Xy$)13oG_yV{EKd^|??pQ34?Y)5-;}yiF{#iSTjVv%u&~ZYm*jF(uKE%xKFT9ih|l zl)&-kww%Yb%uUs=O9Ss)Ck|r?A{nKI<=Q_FAF?6sEw9Zl%BFoNDwdibgzXL2ZDK6S zb1tLO%X;DuLt+4Y?4Xk^C@h4KN}1hDxX!2f=61Zfp2l&S#_9U{<&S>wUkLr-AAIi* z|L70C@$P$3iV(@j)GOsOPt$nXb=L0&>vGB|qF0nvTOi96krX*41E#y59~0Q+B!$t8 zT;S%*zPq82kbB$h`u#9;$qbNJh>}x+)n0_KG|nfNE-o*-p^wm1%2Y~#GiJcLuE$EA zD-^B-gK0-ehP=w%{Jj(Ibi%kg3ak*X?&h@wmCYVW{u=bWdi22(P6iNwLrm3J_+GYz&nIjff?kGsxuy z5ka$%+?^4qgJA)SrTAf%XksW(051L}riwIawYABjYLlykyNXQtoqW-lNWdP-zW^B2 zrT{)N^O9<7)|I<%ClT9)(8JI3G=@_f5^4E|BUT{Pk$W$(w4{AqT+rv9<^QpAJ62Jfvky39=gATq9MCHEy@5y*ENTw&J#4 z|5R?h2jZ`L;t6XHw77n)#A$4*GrUU4}mOtcjU#nYgYza%e`C~+C6%iU!Y zWIzfkEZgpdUD)mbq#U#YjOX!Y9HX0z`T2}87BB&uhD4w?%h?5c*cqgxpO^Rx7}|A7KlZ6$}u>b$f>#N{o=t1;tML1Ue0Yh8}1>juUQ7Z7B$0MAV!jxEeV5Z8xq z!Cml8GHR-=0;twug;Fho$WkI(r%QYI>n&t)8PU1}u+mhHwJb2-!OOYK^YzW?`qq!P zF;C^ApMChz&wrk&Kl}4P{qsNn)8G8fZ|%D7eEn+PyqTw24hT6VN#pUD$^GHb=M%%fVR!fW`#5pz``*Y{(>F;O z6UnFuTr|EGHC=6CrV68BwzwaR^!r=2PHDjq9KK*U6WpYA@f{K(mScv&r2yp~5h2z8 z5y+QaZnVL2t}U-9*g75B)^bP#TUm=wc5$m9vaR1{ITZ6ay97S6akW2zMx%*Ox{U-V zFJA9>Uk-D+y&3w8hcPvsD-wQHBrl?P42in5LBM%VGKg4LrRu2X+)|_qJoNa|L=4h$4@`?mmlv=Hy7oc0+0(4Kvdhc3Zj${ zvQla|+DH*aa)G7T@vJ$Qj$`JO;OP!ECQ=5G5ej-Nl+T@Rc$#jHsYGJRl9MunG%5Cp zL$~Y7IL;#&<2)CS+T8MV7FhbO&pGueAp?XhUd%5pHGxB7C0C=i^HQ zVPa>Ax!(_Y*TWDbi6}9TBYZYPvVkcV+3_^qo~Kx9`O}p1N{NR=rDQ2n3_st{N&FksA__K(_N@ zWuHYQP<&8@aiFP4m^0sh@7a6rzxcO5`VaB!o8%xNRtaL)_Y&@dpTfP2qYp#BII+rH zUJVbYU}h=juJ5NZPt$br)12q7?+*Ke7e5`3^E7o`-*uUwhkJxU`EH~|k%&t}hkQp(9}YaI4mFd|iNt1oF5j*3(043v;NN-Ubq+9x66iQ zw8K0ohnAgIB8noYby1ZTux(71>|sB1DOBVoe2xeO*!Vm}$d?9zu~3_Fxa?nnlHH5v z{kz}TU%i`Bw>8BH41-c)9>~s825B&mQiL4vIzykQ{*#yS;~z{v`{8h$x>#y?5#TB; z)y;hV^fZ1p;nNZ$1tTlRL1etjfxH@0J_F+v8KvWtl=r)IabPXaCa7kO!^5XCo=&a+ zFuBiylObC)6AWAoLmvBc<*b&MiAUTf9;h-|*9Kq6Z%UO(wPeN!wK9;A>)rPE#Y(M< z)(S6de<>6V7`2K_{c3_Vxf~*0emozqZ*EVcpUyg;Z5s3Oc>dW>Km6g}{4ksT{7?Vl z|NobN{=s|iTpo5gnI*EboNUP5=`b9Rx99V{9o@s^K8=&l#jMYH*bm9FS*=DSE>4Kl z~h!6OqmOe);nSgxIMjK7}DNA~B4Ch{P!4@#XcWyY%kiqNhw!2ntg;Y8BjDT5a=+ zs-}0lxXM5TF177sqWB;f%PbpUf{ZeYkjZL#1T6z15+RsrEe-=}g7H=4T>7l{-nr<~ z!Yzj&Ro*YcJ(klDNrE(w<0vra)DL~`@;&5~hnI87-K&w=ck?utX^K+%Vd#h6jN|F- zWfs(=8sRa=962l{*aM|d)IG91%_cOemK-y+&6mLHxr4zyAof6*E%? zP{TKRioPL$^;L6g;omG^UyrYDa53T;7k+y)OZ^JDhzK*wAp+GlxYVfHAxYD+Fh>Og z@g~xb*v4kmyRA6>3-fP}(oC(dOp!G{X9# z;I6H&u?1^TB3ClC@f{|>Vr_)C$jU`Cv~JRnSPO5YgDx*VkKqNTh{1Kpw(Gl;5`_$g z*=?DBRHmQ${85>2rGBTWj)y!a#wf!H=@*d`=_Pjz^Md)kZ+*j_U6f*TIBET`^MzUr`Q3=SAq*Vq7TTe{1utibA%CnHzc3TQH?9yInA);-g z+oZI@%_T=s0dm>ZpjuYvq;u&C`cIFyKls5#zx(aq%C^>~YNu=_u*q;T*XnGOaN2fozH$8OA%cN7Zjl>0wVL! z4MR34=1B@#f)|Uh5D_W7gLhC;ke-bQz4Ag`UF5507kxL>b&(7rLV^eQu(6lW+>Mfl zulivTQV32oGgwpkg_wdVg$a@t*ALpru&N>Hej zGELK}p|pFcaW{Jz=W(2nQp#P(wkRvK&BJFKt-|%DhUH27@4bMiqV`!MtZdx&SgHGPM7&k zkf5h0&&s2k<-_5k?=N=yeM?jQdVJNvmYedQ@jZW+o}z1)dWKuf}Y!#W!oT=nSugYDa)YL#AK?k z&K4ZN&u3S^B2U-WJcY(Ss*M1gIC}Z$`u4g+>U%RNv+vSn?u{OBl80_T+v#G?{BV|h z`P^FZS#2VNXv9<9HMI@L;A3j3{Yw3ImBIxmJwTr(Nn3iE2xANBbZCkwg^?1HIaq)I zrxGWRF*Lf*Dr3xNpJr#8rf*pO)_(Us4u^hFC}^i?{`u+lKbP~r_wfg1`s6%M6K-yg zFwiVWE-ceBfr}9vzO${O*x(56)&H665?!GZB|`0jxI}E{Y}qV<3^TLlJP&blO&*h@ z1YnjeXQs>q;uzzxEHg{&b6?nBsK3gGuD?RsnWdH_u==emkr_-dFq5r9MlnkZaTq1j z_eF=D4;_T?;y#6nnA{90UEiL5_|eOM^rN5tGX-Sqd-3-4$?A%mJL?6I5t|!TGJ>V(6?tz8uG! zh(akz&}+1}09z||+iJVi8jUoVRxbmmP!%Gx*gfyN`H{*Dgjs>IVu>D6bZ~w!8{Qk#3{^7G>__IIxga7uw`ODw_ zt#9nITcWf;o|Kq#Moyj2rAs*(b4vTZ8&9Wk8cQjpx-QF0nMNv-lI6tOmC_&~98tpE z42iPk#0%B9^PE6MxDjH3@?sT9s=X%zc6&PAp69u!M0gZ3YPrO$1`WitoRT?p2xmm{ z`!7T`&vZi|3KT=1%QSxc(T5*=@P3zjh+qO^si#vQ11&pWA;jt*_3B#&sFuODsq1b= zM8IX)n3AlWzezB#)a#Hr$h9g3V=dI97Iz&Hea?r&J{hPWVlAhLfTctQq_NBv-gkX9 zMoVSBJK+0n*zXQ~*O?j5=Q}M#&VAo6XMRM?(b_*5w!Me^^|Op zw(Hr))~!vOHl=D$NJ2_EYiSD6MEImfDUX7f4J=eO3ey1&&v9`a$$$(TYO?m1^d`X%IUO4xKZ1NflNODH0WfK@vs zDV}(@5lAg{q`jfWgH=n#Bc;~E5C-T$tN&(9Y*R`L+Sd9^+e|HpC7SLSg1 zhs*u&a>zMBglvV(R*`U)LO0|2G>!$~6vHoP|I_F1bpHGTwnsLa%WtRi zCsBS}#=n`*KXP4%&Cu9&v*u*hlU37Or~xhPXVY3@}(0Gni=7vMc0)C;{MJ zk<}@8kvcaM60FOq7ty@*BD3kN(`mXXE=$?EofF1PlD(3%jAwTg<gP?=kaHs9e?=A?I%dL>^bcE zY>3$H4ltyySH8F{c0R}L^(;TsxDS`RPvfgmW_R&C`!s7Z8<9)5d-?I{-~WgI@Zk@B z`2O>&Kl$VD{>7jF-nYK_tnX%`BxINY)`%o7tB%Z+(06I-^Eszs9_D%S;xqufM=*2o zna13uzRQ-4OU>B};glBfXig-I0uiQ=f}kZC=%}S)hK!wPoyH8*Au}#$9Mp31x=8H$e&}}^rF9jZ zaEDlBHqS3z)|7Jl#FncU`(qS$D-WPUmsV?tOPRB;8di=F;_@ z-M1Yw+UYKs?vzrxW{||eA!5&GH zYz>2M<{p%y;;Lqz>A_1c(=zY=$%Tg(9$JQv`FrWYaMLstN+l^X1Kizg!_C6|36-Y$ z>$!dB#kS5)MTIgWQvn|4$BvyNsnRkh@qXIv_75L@H4WoiZ@oR2=0Ho@e^XI%uBBqW zs$J)#gNVHMkx2MTHvctzJ>krEjErk?M(efErqqv;3eoSDLFXlkEQ4C=mi3hNuK{z* z9pqK{>vM55u*?iadz+LTh`Guj@3u?#?A5fAN<(W}{H841HDpN4YjNaNhvyuWb;1F4 z*Js}v@-a>U6X4X|oV}O3n#B+V}MT6R56J!_-kpfXf+Y_Jm``tK1QMm3y?4#e!j}Sa_@BR69 z8;vDfjbtK|k(_#CVhsLl82WA#q*iFGiQ=!P1)MN3as*pd0H$eY37U;_l^$!fZr=B^0bu1S#MD)jYI3e_x^^}w zeEjV3v*%BrpP!`)T=KuJowb|jr!a0WFNS_>UDX|&G>0ec@zLS&=H&QDxSI%Y1-uYS zp8%Oa1yAM-O$=k)PCXm+Y_W2Qt!69+1cK$h5Y2?KAH(Gow`>M7H(q<~kN@u9e(Q}l z5a98nM_+yU<ueRB5f$(wJ{tFOIXa~;`C zWIdat^;mZy$c5lz3$QslY7Uy4HxC;g&mUbfLftkKdCLY#vMYS>C>*@#K~K5Oq5K{VGO}D*AqMu6t4C%Y2fw`>!^lzm6Ff8? zst9&Iv>*TcqqDCb-9I_};fL@3_^0o``Nr+8jer46B~=>B2xv&I56zZ9JVVi9E&krY zplO;)ISKjCB^^vG7&L@LpmM4liF^zb(PYSPn#$UW1u)jCf~{&apq%0ekYH;zDND0% z9Q}6RPpTjrskr(RM-$})sUlHeW?|)U<{CxI!I}u{jS1O@44bCAd-vW)zxngCv$O8t z*n)U7F)|gUWu5917*k+keKPWy0A-FrMZQs=6;fUXVk@tUAWr~UR8#X8#pnu*kh{98 z`GGpZks&H|LQKn+4eLsQI-?+>m9w#`Q{iM1u_i(RECGDp)Iel`T2LYkA}~aWk{549kXcAn@-)>({TXg-v}##V}BwivU}; zXSlviKq$9mYtulwX%D;hNCdjz4_8nBu3<>emCVrMNQD8Z$pWXb#ejC4`Y=73ZyFCD zeewC{hWXabo5v@|a+3WG2CP`zR_8)%DN9X{LJVb$f0>UDt=B4$C!GYU0uJjti0+VY z@r8lQ_gET&EUQojSzbERK^lc&0ai)hq9d}bw!vg&VX%42tAH!buYb)iy6Tzc>waLX z$oLQd8ydX}bZFd-x~+)DDH2(bQYJ8@L*dC91jzIo($S_gW}yDNz{IP5tL$T|8Xc?N zLCVJ_8uq{eFpWLIJomfIMqmy(jFnAQO9$6>qg`*FOOrppkv%;$dGdl}z}rx1ON zUQ$CL&{=kEB-QfKPvjPiBZvgM{jlqLe|$2c0f=nC8=fLX)+SmDjLynE2OJp|x<8}V zjja_N3$G^EGCVGc9STR%Rl*I;2pCu~uS3MH+tgK~y{Z=7;o zy0()x)^;X4JU)B;n~#6}t6%>T!AQleb{05>DU40y`hIMy`quHSTX*l>nIE@rA0MAc z4uOT6zp5}glOocpFO8HnJxs$z5E!)vTLHF%ZCh?Ah9F=^WOr%8#YpE#Hrej?%Z)Wks;N^s@QPw za=Ro$iZd4)@ftygH34{81Xz1&ztAsa1jl*-zho}ytnNS~`Hmb*Nq8Z1K}mLEDHSe; z*dcl!ged^i6nk$YLnIqr?QJz#`{c>ffB8@U#qQywS5NN#;N7==^x<2t+&}7?fb1<- z2+F-9>GO&PEMqW)WCSSG7D>Q^rfo9Gk4p_l#zO`YrlulTL_$A~QN-ngH;G#k07pY4 z5GGemWz(lvV~quHPObn3hRU$*$Ap<0m04#J?ngQeBSlfQ8!=_Ev=CRBonbT)OkgAA z2x*B1SOzKQsylaX|K>O5;iJcQ@4o6<#|8nd90*hs1Xh8$wXarb^Cy*G%CvaMbiIN^ zOBfImfQ5zaLo6R*AuSOoB2ff-GYN`KAkfl{Wg;JmNX0cl7Acrum_w2^4Qc@~m=Z8yFo7z=VQt|ZJ zWXORt-Y16V#8aAnihGdk(yUN-H59S7n4)08teTo8YUh;XvKgWRTwB%ZAXhFU2iFrv zeQD9FqLtkrK-#L!7hY-UeW?U?`G>J=)-H)vn9t0om-+zFJ{0Gq8lmJ-Nxx@7e zv$ZaS$P(Z91C|B?WWY@PMnK3FYWl{^fa{XYSX|UtO|jV-LL*X$hHyzV!7$;9fSIps zHU{MxqJd(U4d3+hf6rfElO)ZS7fW%fuu0W_!vSnueONVz&ea5tVPZ?m9MD>VemBPR z9TIPx<6wyqmq7@XP+uqn@>r^z8mN7by7TfgEvl$2#BU51rq;%;3vDx6ONhhdA3b?` znG|Bi%YF=O1|I~F;q%MOZQmQf2+&8~F?nG#S_E*Gt=2D9$H+vEfUdSxI$+3^6vH;w z-3ojw#KZkSmFq3+EL)lN_RN8RqZNH&a#h{cwSbY9!A#zd(BSX#-Gtq(E_;t`O65vI|UpBK6_sXtOyuIy#;oO^U8-yG?>V4-jqTs>|JWbF%5D z{`vVSg@96qM`;Ph5rQ8LLsK`+!KRzvw3*+#Y1>xn&=%youI?Xl#I&b>)j&s)wS)*L zF4JfYxC!gawi%mEWsPS?3=!|J-*z3|0h5G+kf}(y#Cs2+w+UZk014Y zA433ueLtt2+x;*^sp!?)aWuQ&CqGA+m~4GHef02*y5l$BeEp5r->%zD({1LQdwz0N z6C+KdH-=glKKc27`|DqQggkAmHIQ~9sf4IzV8prf0L-fd8uTW_lor#%N`4g~R}Zob z)*_`T?}7EWxrXT(QHK<*PiTNCQ5?3U9V`LpffFmXFQRDe~&UQReN z^AL!&bk5O`QEe|&kt7z~28tBOr00MlKNYJQ13AlJg}jQ*$a1tKU5n zaR`9WIES(^voJ{_LQKy_YWHR`#As09QN|ua2G%I_f(m5XvNA{jtreQ|!U+C4Pl7Vqw5w1Owp>1n!pY`|i@0&+(t+^P)bIP)P|7#8MZKzmPXhNb#Q7SZ*P}7R zFvuEeMTrxg^%5ZjVI8L8dR+9B2yL_ybzN&;n#^+;S6y-0>j%nuJ^6!Jo4OR0a4Dj! zk-@5R#;)|*SF<%iPKv3saWA_izp%d0NR2eu3#Po5PR=N5S;+L1r8|okwfWMPQRWkc z2p=PHmWIj!FSM|lcfQI|Jv?mJAym#y~n@1M@WjxvpEJzH;yCUsp#R*2}WH3Sy8sBa9H8 ziB>*URdKaIgPbMA3rQAep)D_|2*J0|2Vi}`@7cy)bf?RE^Uty#zcgD^pE{? ze%S4Hm!mQF@7_5&I7}IppFaQm^S}DpUn#@xe7EiWm}jb>YTtVNIK-fQ_)t!>w}!^fW^#6+=Re7sxV~8N|o=9>UG-R@-C2*8U8(EIXQEKv0nFu+D zD6$RJ?OS)h{PMTk?M&xYMGSUTO_Y*52GoMO44G8GJDMN5lhs{F)@5+5(4LF%q7)nm z0Od5nP*;+&>*NF(O#V*54ABJrq9|FLWkX8552ACLubtfBXi$#wc$q4wu;i`YS1Ec)Q4#7ngFtUlc{6j=RZdY1QOTdPeFIHKnQ@pH6N!CFls?KvB+|D`h;Ve*ja&$N+Y)6Lz zXFBOuO?)pkKf#4o=`74Et*dyPR3&EJ#v&*fkc6`LWOY%A%u^=F^QIT+SXtW&qS(2| zh#WUfymgHBjf=z0<>~1(43P4GlxOTK+@3$#J?7S!VY@wh^2CqBFMj!p|IdH$A3S{g z@Ye0S!_Z&scVqCxngTL`@l0b3F-8Dm5%1UrsO2#(*uzT~ZcMj&1`@pshrVRAx ze%BuU^3VVIKmV`(13&cERo&s8uHEo7#IYaz1;qg=potc}<)9y87HB=7lx~frSW9Jt zve`O9897v_Ffc@Ij7Ny3v<#UAk{rwMr^yAmx`QF*n?I&M6|M)Nd-^2Fln>TKK_}&{o`Qdx_?;oa~G&4qTOtk?Z z{j!iAg%CswY)i0o=;gmhzaZ$?0M{xUoc$}1WJ+SeR8Th#;LOokV z9N7_723<55RDc4Fwestz5|-!ykQWXUq-S>4q#kQDY8;1Z0#JCuY-Bmr({J3k{l(|M zol6gKow&>ONTWfkNrkEv6{N%%5Hyw)K>;RSjoAj`(q@gCcj`{D$jC&5aSlYc z$lbzHN;Xz@0%}zmbHSNeUuJCZG>&1Ie59HXvu3iiKG&iV8%zx3Igl_D>^!QrEgDE* zrih{{akHMIs--_+O4R@t(#k5KnEU-c33h^M+ce>{RW(dwh=G{Wkdn&gE+IrRZ`8w7oa`$xKu+Rnw z#Q^v^J*6yYfTsUhZdv*MRvr6G3siQzBv^wk`GhY|x`}LWmT$yZy5j#pYJ=a!I@gro z%y#Fsz=5AUfZWf}{=u!)AuF0e*3``U)ojX$Vp1s*MLdJ`MewzXMmlTeJSF;ei7`M? z%`E|}&qZic*!QY&UfN;hdEut8{7%=da`!@aynf9p^X8jdXTloW<^OIP1DR4DriNubJBY3w#wWCEJHNy+7`F_^N;lll86X!Gd!@aSkxl-s6N=jeoFto7cP zHVDv~n%v0>^*6iogP{fZ@F98<{SdT9qR{HOV0*~RLQ!(i%qt@jQV*^wI6462wzJz7 z`m?hbr6yQaXvWxf6HsN$FMsy)n>S8uRsE;`$$$DE{RjWIS6_R7x1aZGpSTZ7;Zhwy zR!BRR^0c3(XHR!V#FEY)KmF(ze>H|(RfkvZpZxJpe)_aI*>8u>KmEw}JL}rl-hAta zfBg41o4dp1c=q(s7r*`F{PfY;*^@9_cCKk{*Se|(3lvAcXBecHd&K411gSzslyd^D zB``UYP$79q6SHAKZdxZzK2jPW%?4{u8W>wr^_*@>%~hnTy$CVJ7^L`XBiaGoop;{- z(ck{N_uqKKwVP%LZ@ux#yYIa6)vum@_|7Ze|KQcT_cnDKm`9Nz;^?Exvwyi#5tr5p z&`$-$XC=u-BP+51?2;#43kF6IaU^ZNN3zZl1w$Od(jN_0m4hHgMkh(OQSGdX=EtIy zY%N7YU=c!;xuk}=534??g|2pOV`~SfR=FT&HAYE1i>o0xH>21$=I5E|J59cAJJMZj z9k>R>U5aC1P}V@1{WBRP%`{fz0hZ9FPLgL80Mlfca%UJ@jwWQ3Oj8n}NLVCiE9WrV z{Iba;B%)~w+ublu(Xd^h4c+UyS6pRkK!nk!LqCiov*|h^XgV9_@O~VIAaq{IE^9C_ zuS|~+M65HxoZ~bO^0H00Nh4=f57K62q(w4S$LI~2Sb5zAxWh_(9=0T(pwT9!a-nZ}@_#bA0+?7oz zuZYxZX_itbSHw93`@HUn)r^zM+VywHC3u;&;KF1B%{X=2vhW9s?^v5_%u^NMuWRto z94zC)%Z+&on)dCZ^q8z!z>85VtJE)4wvIyAMplKmH5>?~5vpW}x!RpQu>iigOzCy& z8YR4!uKD5#3(OWI~!Fx^CUx5+gGU1rWrN4zelXV)%yVeY}t*>?^of9$oq z8@|4TzJj!h>=0y4BcjmnxBW12fJ$m-R>o%!v`6aEc1OqeZl2VwOEdV?)ELHt{qu{< zhudj8;5cG5=u9|{eBz;&xiocI{zXcZc24?c-a*II542Z*+;Cn2^iOX8tMt-Dp*0 znMDul24J2&-Cxp{xwlpAYU65(CN$g7xL_e5^b`W4 zjgccQnw6xsnOIcEfC*KP zSi!0zfCZzLo3+&9yMy*F+(tCs2a6V%tY{cQq@!C0|H*&+AOHDZ{>3m2&z?RzI(d+^ z@VuXQdn%fjOkAjbh*JG#W2NmjdOr+(-`3HG%k%U7#k1Y+@w@Nbd-qS@-MHa5KmV(X z)3Y~Td+X6|^aH)|)|;=q`3B>0dpI@o>GbOTCy&1P_~Tzcd;G9z>f`p{q&?hV<@a;T z%_n|3Bi37s7ckI-K;8$rCMU>|m0b101=22e1e7okw9PzFv}j%Mh?t=}0AowO9+wOV zVq9RYFok{Jhe&}f*+bhM+<*56AO5Ys`|A52*t&gw_VmfKuQnTa_wD=ly8U}^KX~x! zk!vP01ENtW%orwi*~4EB5@mG_C`=lV?@vn6!L>Mo{at>rI%`L{Nbk^ca6l+^{2 z1&inqmK}&_^?M4?t91%OQtc;-ak6L)EF4rp{@Di@hp8VYVi0{ZWZ+_6>PO#?qcui^ zCSZsZIrRNL#xRdj)~T=&_z)<@aqN9aW|c05HlBwlz`v*z)i&YIVV=`hsqQon4qd2% z7s_V{zLIc4=}fDpX-+y_D!kNf({yce>X5qpwB2r#pH8ZZIFx)kiV*?Dn9v*nGRw^_ zEm52F*uJ1Hnfyz?!DJQ_Hs9dn+EPz~C6N1=%Gu54M zA6&l4G67wefK({kiFWkD&NimxnoyJ()(vo)%xMKzw*`8BWfzgP9_0#3y{dA;@B$O- zdUCBV6z(PiTuoX@Z|loNV@f48e=^B6LSzVvN|o-@@=SWH$j~)#0^xUG8YMSf`#|L7 ztXDTjc~SbD;=)KFjC&Kftv8LWEGQKTDqmQ=7daC{IeB6RJ zKn-)p2*Fm&kvt7FG4+Vvna#%98%=dGza25M@%70e_D@p{wK}lXQ4I%GWR?L>YNE`6 zY4lUmbwBvwk6(NB^;;*m8(VkvW{yOolsiFHDSqjQXhvF7yKEYH#~?XZG>q12ug}qq z8*PfFa#fq4D#y&{XU~Ue{NmB0kQta@j8&cWe5ZghcMT6nvGa zDs^4d!n9p$4J@3qv|fCcgHTXtea)Ar^-Te^@_F@EphPY|O-SiS947?o(B3_{F%45B z0CYf$zZ&*?3f{=KN|NuF+vgV-#0IR5Gz^B-Bs%L5>Bc2hb-@@=WpdFrQDd9*RRL%i z_piS8>i_D0^S^%O{*7P$;xCU*Zrr_l_vz!)=iBG6z4m=$;K`$hSSRnq5Cd4QjyKKB zL?Ale96Y#l@7~GH)>ap%PcOpu@>x%lm+r5qHyAQFd5K6NQc531e6g@*mO&9E+1EpX zQAFZQpqKz8L4dGW!%M?>T)b@-@1ZycMKh5f!!X8y?VfR#7JK*I55M=5KfV3R8@4{& z54(%!+i|<&xPRl-8`a(Sjt_0y5x|5H5hUMaWYJKv*2*}yhJ{F;Vdb!;_1>Zrw-&Hj zhYnf57KpPVw>5|mMH7?_r!sHb^nMt9$kc1Ag&cXQ6>%WbQR}BEdJkBTE3N2|O8o;u zRlC#}W6=Uxh)&qXfV>he%>w(@Hf`#RJ3V{a55oxqLl#gH0yJ9}BWpfQNIFO61=0c| z`${uVwQN!jtGY+2*mudP4B}EdhQ$z4 zrKyau+Cdm5AB?e%D`%^w4ts&r$1xH&O(Ui98m)^mK*=!GS1A{4t2*@ydPygJjA%^T zb@MJ6hp`{}E$!xi2s5XOE-E-W#?iSb7SFD0Y!K>nFNOH@;&d3(aOb5nFD0XzbXwtfO zxjpNljf>j{i%C}&;4BLCa#a&kmPNYS;KxN4TMGci9Bh$|`8_k4@1kT`S6!Cnv8t_P zT5L`{ayeKo>5`tnN?{@g|3Ul}3-R!(Vu7qJW&>cW##l$=gcg06gf4<+A$DLnoh3~6 z+vhcJa;3(VS>zc)H92@yLzMrryGV)r4=DNZ$|6CYNcpjqI*@hY%fV1czre=+9y-RxE_>i>(187mr47~BYO>*NU8wVO>-)mEi4 z5F?rczduXG8UhNtVKA1RHc50{%KzeJUk}1{NV(=Q*+b`A2!jux?t@k3y2dr4>;~S) zrKsC=?%v&_?Upy4SS7~Z1B3Cw2==vzOu<3BxqJKWyKldD`^IfBX{^`WWw%e|?hpe> zOw&XmI_s2JIrBB^w(Sl!uBi}hTh~SEn?m3~yMDjh?w&n)^7!c!A7eB$`q78US!5H~ z@M=nfsPi0-9wd?{TSwD#y=llp*;ZXO&S&lSUi8Pb#rdfRn% z-ONi(Q%jdK0PEqsdPT$Xuex^Kyw6)fKoNK?8CF^~<>nYzs}!8M!a3v=M!k2g%IIs5 zqKGJnT6mbGs5g!ym{`mFuWG7L`esFyIlh0=fd3yKlH=jOx@-Ke%^FRIR-}`%i_n+Lj^+t7Y%eeMH zzO{8#@YCEob^7>hzrExNsj=AB*0*VS;WHL_8`Mib)wn}UO8*8Fg~}HY7gbVYu~cJ? z;e;orhApNjC1Ad)@u`-i$|g1@28tAoj~tPp3wG0-+O6M3$x-9Ym6zQd9ZumJu1865@r@3%TD2fT67$KaLb+H5s(&AyXy*ggUX4yQ;Dl z*n(`ysG^#l7od5d-uiv2BUd+X-}(HDPy4}3YAY`ytJy`$I58T=NP3_!H@?YOM5OAR z*>uO`Ms;9ol+2{G!wU_`L6M37GF)N;AQRE6OBw3C7Q|4x#`9E#jLcly|^5Q;q2+DpC*gA-R_Jr z`~Cj;`SYrF^Co-XIijULi zB^`{B0P$txKxV-aK;~%?>$@V6;w3^0a}=V|o$MUa6C5ZZnDX7UY+rcdNV1Y7|Kb&H zO2!0vOXVyePGizbGIGzG575D;dGN~X4_G|&Ba`@nbpZw^@Kb@7? z+~(NS8-tZ7G|dmJ+V=H>gImY9AAa$2i?sFZ+!UU zAO6W7-FxHps%>Yh#>bDo;(i)WpFe;6`LKJsfga2N9MHH0zy=Kq3kVQ(qKb&5x??Kp z#AV`4vI5qg7kt$Kj*EI4sq)b72mZMvqmxiJMxy>@{NReOk)FBu~v($T>Yk(rV55CST*5Li%# zh*(*SLcFA$8(ITV7Lb+Ym-(v9n)>JcBeVwsMlo*JRCNK$jAn~^^a-?dt~;`#Szq}LH8+F&BtFtj{6i#2is=pd5No=o)U zf~x|%dBMAi0fRA8jHZZ8!sUVrq=qL7Hlp!PEc!v(dQsOd#PImZ;~5R~(|EKwp0U7_ zlOvG2cGI=}5yn;A@5KO8RXA9Y4XZMJXqO@r*rpLRqZEh7 zGq8DhEOFx?5wH%bx{|E11+%mlti>JS#mN$^uT@cuuarxm&h?yYTh`ey8p_7plOH1m zIoM>c>ur^jL+eYq4{6Oy0RT10t4)Pm4`GBn=p*V|IY^#G8Gl=nBPmjnPS%QRc}_ZG zj8^Ek!cvP_J{`8Z{>F`?n>TOWxpQxRTwK7TN1vaaZf9)xz4zX?m3#E~@$m_F$HsMs zDdS{Uw5V+b^N~Edf4h;El#3cav1SZYg@W!bSfI$mcN+qPVML6zW4V7*jM6g0qPoLD zrem6ANJB6LM=)HN1m&-h6DVL~@;>)urL1{<`kO`DL+-Z-PI)_l&$--)$#ZB<=d zf+XMK;&0OiT}qpzB1_E3vIPLvZ=_3{LX!P_DuN_o)jYF}F<4hECQS^Q^b60$5l7I% zISO=%kz*kgSoJDU1vV(WdQ{ygAu=yTb~1pve}Ty$a<1%2DouKxQyFG~kxis(4Dn(& zUiQ<)ejH*_Ba3Rfl)WCCx(Sg}$6?Z%4RxEOkkBQnfI*DG$4J9CT4!6=)paGNDn7(8 z4^h)J%^Vx&oOI&Vshx6~JWq~Arq`xD9z*1WK2FT0s+>k0t1*=!lDLBbv+2?#Jk?s7 zuxNQojw_~^4iS{x-VcMrsutB>HarEtbP-7y!wEVKejdqc=TxbXDdIArfKp7SjCf{B zSUz=EwLw|`jk_o?w>W6!9diXV_ZD%1r*z{{kxTn>!X9Ydg>uU9H`*rjod8m)2A5(n zt}_uXQV0vvnadjZSCnfqE%ZuO?^nz|Gh|GZ5y1jF1C=4Lk-0V$Ax~|&sQbXRd-Jy` z`+xn*VGXCQD&+<;o`9>ocfp&=YdPCpra)!L0}`xZ*utySA1fO5H#_LXwv9PM2nuGJ z$jite%V~jQl)9o!cw-#3hC~J-y(Z|*!9)gj>U0dKP$~321aB&eHW2#InBagLXKRNH zK;*%AgAu@6jL`-}4>HIjGpfNTkudy$U}-{(0(+#xaCtdPKwezVH>>S#x8KdV=61guMM&8g5=l9e#%Hum-QK*J5XZ(< zU`$=t)*^Et^2D_#Hh zhbMEoId=rj|JZCcsxXrB5>o`nzGfIM*nDAEGNv+RO=Ln0O=XL2p;9j*N%L!dTAw+k zCYwvHxt1-CB(luoJE&AQD52qt_3JQ7}Nx1Qeqan!vJYSZOecCox@XE!NX8g%F*sLg3^9>L)`SBKZ*6 z7?fjg%+k8sRyg!yP~kYyl#ha=bP9lg{E_T{2M6LnrAQ=>c8R zNqLPLFJSJIz{0*;ImzjC3YA}@^qzj05C^nXL<@E2nvT&*pAaHgGCH9m)GJxq%$emS z#)Rk*jkD++0_4ICEJau-ouB|K5SHXirbSKHk`sBm+3qf5Bm^6o^p(qbiq=q6JVHj= zGHG8HWa5*5oliezfM`JTmxyTrc!4qV9^uG{Yz=C18$#4OljggnBPB$d0&T}|w%tG9 z_2X1~Cu|ZROkwrQG)*HkWq}q&ouEs!nKbrH(>V2Gq@-cwY}!*!JSx4N!jyW`FE1}Q z2b-pDthMu?fqNK+F$6Dzh82|43Cos*;TaQL-y{}~T(B+~un&VVX8y!97By)*qikW3 zi?1qeekXDKN|p2&l?60EPiBfKh)8(Nl_Tchy>OJAVGbM&rvWp;*e|r8nG!{-wxl7y zkG?d>f4UGM!pb4ouJNft1kJHVXx7<)zB0%@s2h`U|J-==Hxu6l=fs6y)TS)>MZW#~ zYpU;)YA`52Ka(vsx7GPfpUBY>7`J+YDdFgB?^j@$ln#xMJEGR$*t(8a}t_kK60m-~Lk zFvB!~F_kcuoI_`E;wViKT-TOK`XKhH;AyVI`?r9OS@yuSH2~m4R>>Lg;vSi}9 zER3pyxe`JoB5O^Zs$AWzo44=YxqmYi&_%iZXhvg?x=kyFlTKkV1+WSbK)O(ho-f9# zJZe(aKFN#LmERAFQRQ-=YJXA?8yhbVBD!KukOl450QfqKQRb-4L6+EB-zP<0YeF=H z(&)9F_x$#9yWdY?@H?YI*)`UHvoaK{8X8H9;~GRMxnWaFX|ssslb+fR!CI?lS7|KH z%WQORY-|?0!K$uLpFQ1f_f30X3@UAfveqI4(F&e|oP(>ISP;T2E29KTtw^BI(#S%< z0?#j_qI@jLrDISAZeaa(iOW^vWP~AGxmx^X$7vd- zr0$-2ce++C+Xfi~ahxti_NY!}@v3uObit7L+XN;qDM-9!Kebf_nu;$*Q8{(HWNf~z4FEw%{V;WOj9y~UbA`*rC>GGRv zvNJIR@hMcHc_BNZ=5`d6NRxN4GdOuU`%RpKy2#t-!yrOfx;xEQix)l z*SfZ@>e(psf)^6)UN{HATFp4MNU0fmbkag%RQ8CC@&`e?FBqJ4 zGv9x<2HGSY(39J@?CzuBPbN(M`Pp-h!=_7BzCb29p=`IqK9&Cr zkfva3H-&`-&b;nH(nZkW0m;1n^z5Q-H{&KC;H$4T4<5V`Zrr*&eYV|S zj{WX*97*-n(TU|1&I$d!`>!yV$6tJWnu_nwh&=w$pWZ$?G}c5QKw}~jTQ;Ei3QNw* z24zAP0*c5Wv=(g)-m*b`sqhvMEs^-IL}Lnd!7i39ap_S&5V^GA&^W}lx%1|0_uqc! zjrYIT-aLwNoEw6k@19ND)Bf2P&mVr~FQ3`rqE0gTq+01R2~BTSPSJ8k$syCOT7?A* z#|A+|$DhRsDzkS%--W2P0&6&`h>bBi+Ai6f#8Q(swrY<~j=@%`vm}XfL0wDRN@Kth znAQ2iAZ$umLE6#;PBUN4c{SHWkWUwdQ>)VNMQOb_6RZ(1BGytvpH8mr$;l0|`_Ij; zIzfeNL*LS-!eZ-Hv0;iPid~|SjjlRKU;#gi0nx&jS%B6czgj9AdJ2g7YeqmJ6}E#J z2?ig-;wQ44`D7>!q&lj{Fo&x!)ygf7Zb9 z_ugyQCOJaR!)v{r>uu%sN?9&i zvbp!ZAosE;D+nM8#>gw>&}$*d>q-gtWrnm|ASy0xNUSBzWf&(7zesvg6!GsMKC>vT zAX-L`x!Xik--!{K76%GqnVbfog&HEE;DbaSR;D?~}~SI1YV3#Hv+v zW;^-Iadd9iHBAx(s%;YF(BcPT!nVedh^p3sQ@Oo`K2%Ow$zoi@Xt(n)RRU(Y5<0{)>%e@G*SJ+|u(o4N%+jx-y5&)a?a^kLuc$Dy}q zK@xLBuojD>wjzeYCnF{!{4r#vV)?@4qn{S0yL4UDb$xJ{)bgZKPXNra9mx+sw2CM_ zM*<6}#9L?Aw(Nh(!?;oXlkmBO-c*1wgN1k0~sp2TDk(b^1K>_ z!H0PE{K5|xcWxiE=>qXM4HTnf^BzhWi?3|qdI2qO83j?{6>-yW{_TE0K0AFrP2uw5 z?9DgczIX2xns${jbJA{rP?c+CuC&|t=g%*moj*VO^0#%@)`)M-WQ%)uh~oUOw4V`4 za)-#kYZs$FwjGejJTM z6hMBmK*d_Ik*=jUH;pMSAo-{IJhmyFComTk|~ zL6E!bGU$;uDy~hyi&QEXVZzmbn5k}sHdmU!WbDCZF0it35j{-f+V-$=;*{99uCsNU zvOR-~>Y;3)d=BPDW3_v+xEMF-M=y!}LOHcB^b9lU$7gxEyhxEC9fT&Nl1oqwE4@+o z_%#@+oVOOOcD$*InU?IL0oMK_qS7s$t@9BG77&xJ+%q!6K=M)909aP&G)5l!>GINF zT<&GoBNG$K=C4K*Bi55drgRRyzaRFJI!dEexxAQXCs*vK!8;XYA=F2`|b znj{Z3|7XAq{V+|VPdc^3{IcZCd$0j8`+dLPC*O>wZbZ1(X*EB1ABo0kVq?1Wfug&K zIE`cQp%2k}-`0tQ548yxe2hMcB{`J>HDJ`BNc6&xNvNE0uz=2`?K?8-$V3k9!YW5- zz4($rZEY{KdQTCA2he9-VGfstWqrxJ>z@!3ZWGdp1!&PbyQ_ zIS_?={^HaDDCe;`X^?NOBQ}##M`M-?rTn~LUn=Z@q<07Loe2TJ=43sy#{?pU6qtq{ zXQwpOjh4B#&_r&SMNSV`3(bM1A<1?7ehkUtZ2$mQ)m*z#Y>g)amt*w1U0ZFB+vY~w z&H!U-Tm>VAp-ECNqDcpLtzuax<)bP!c(ikFnTB2D_MnY{08!htrM)uAeON1sJdw7$ z?bD}EV~BHmPPa)S>aMD!PM2)RRmKk(SVm+vaenc$rw^SIx{@d!Mj(r@rk#=CzvO~N z7dc4jonis7(L#$?3u7@YPqI#o!Gy-@ZL-9vLvwXPSy)%sgt3DwCcA zm2;a-ci44F6e+c4Vd*4ZAAQybA_z%N=kt2Dph2__(E&#&ZGUkoGNol1hs$8V*T^EW zkcoeg!z|pm7~_7wzi>>^qpi}PW@NJz<+>^y<8qx{?+_>wWE^7533BU5djs~vJ93OQUkB#owxwmkO+pyMpgI7-O-0#_3%pa5VHP5I0S%3a$clwo$y9SKqXe=6G3$AlbCFkl&E$b@) zzDO69TlQ7eGZ}zZEOE(1Wig8m$pe;+ly~aq3TLST48aO(CFz(s#~@iGY1#^fo|lJG z9S-$HhVu9<1IF@UE5rHXIRwP{kgwTXdJajXPJc1jS^uT-gO&=pSS>7FoJ(p>NW%AD zJ{VVpDcuo8eHrt=WVF-_IY*|Ku4(jgvJx@6IPp08?My7a6ly6}hLw-M?t1_kgGtsx z$|PmlxoJ01EGJT)x9`VsN}d!|E$_mRGEskVad{Bai*0g4H?@>`C;$ml9Zltkco>JqfL@U=h=0RMwhgXx(bkjEm!O-a7E(3_ znYdC`mCZs~qb!q*jPmlx5(6dGAtKSma5}i6b>C4pzcEz#a(qq>+&W5mw>-Z*{?!sW zA#*Jd_a-HC9W9n8EXzcaJSq;bcK_6t zN^RK4H?5qXGU`87#EJcAtuyw_IOX4>gX)9 zO7AUXOC7^TFsblfIbgEZBA6IG6DJU1oD9jn&Z)YT$h`VJd8ROpb3~tQsJ)d_}Bm#>Dv1^+7H4pCJ zd;PUnZ{55(r^r?I7P2CfwDwOmCMlWDnO62tS)7NOx`}m5W8hq0iWC>ht`-qFYG2cO zSSWeNdZonLY5}{pLppYrB;7T2Re_ojtcAvO&%SgJ0m#fMFa@ zA3wc3J!@Tsk^m(weaDMpG;r$RU=WE&<5xrBNYKf@ue8!$b#*JdoHM~xXYC+qR}$^-=f^Y* z6Gcg-8FH7*vLt7S5x*u{x>H7P2$~jkCgiP8WN{xaF1B@3r#!N?DGN=rrePYrHtjg; zQcvWRJ}ZR%I8HMWyiJix;QfGpOtX6;78a(RUyNw?^ANo2W2CwMp3c$aVOIMp3^KEt zrk!=JZ5lyFH;AbWA4BX@YY{s&Vs~~zFEL5)8XAi+ilCXO^cz%^|dmTrfc7s_3`cWK($=7-i~Cx3vSPW z*ySPE0taSm3@B!?atqYu$UFfDgF!A3&3Z_;e(l63j=b*iT20E+GZ&!=0w_j75}=iI zMRpdH6QU|1D&!U95rHB4;CYNbPWzDw<2bgiHi%~MAR;Ops{vse`fh!u4C&7pMnC^W#6j+=k(W;T1W+JyOoO+dUzbviVN8GfFvW7HrMma< ztB3#ezxi+e%m3=X{QH0Z@BQe9KR&r}GFR;~)Ou zr+@U555NE6om;otw$)ZvX%I(dP7777=fb>PH!WHl17(FS)_sMFda9tR_e61lHlw1J zBwj?;NEFNJtI&h)7fpI3k!`v=x9|9a#=>ALklM7=Ph$Yt2p6!ABC|#pO z1QI4kvDDOBXC#x-!LTPE{^Bow7Wca!zW;htJvcbp5XTwCoSXbFFZa_JTvf~dvBFwQ z3H^4rpa0)p?jC;i`0UBk#^ zOfzDfVjyCiJo-33{_2bS_wM_?KR-JKv}|w;p~Y&`9TCC9ufBTl#%lz;ef-7qFTNZv z&O-mpP8Wv|Y7;FuMD2YCJ^u_A+8`_}wIY43U6i@ys|XGgE9afE9Zt~#=9j2z)AG(0 zccSD7)+A(~S&untkTgg!2^N6}~=T!w7-B_Ogm7G~t@EZOiW-OX->&cU@RDrul z=>Qq%_kENy?oz>_EP`9+HY)Y5-HVdqnP|1hW6&<3KOhu~SD~4BspVNGkI->Q?cG@8e$)?kZZnTvlTbfr5|Q^_`pxa8?IyHo1WF_BMC9e;DN|v|KrrA9EZ8FBa>)Qw?z+6nci?=7HoBO{ zK~lLo;!N3O&Q&wB$ZF~`Wu!ALge5_yK%5@wWn}!=^Dspp_uFK^X25h!d(>>4T)>_w z>`YH|wx3H#TQi2##xYG}QQPrp%XDFK-Z{K+^XBKD|Mvgzzx&k(AO4_in`ciSZ})rer{v6TP{JCkyifXPXXiir z*4VoKj=J4;d;R~I-F^)|3lfz1gAF^RancBbck zMWY+l)-dkg;%BJ>Tw93vkhBU1~ zDUFnUD+?4uOrlzBeB}Kwee&y{{pG*-r=NZK@X6Ct5(6|c_U2uh`{iBReg64phbQyF zb5B40)%MY2@cWAQ9ZU^G2P!KhidfQ#hBn*puPcvvx8&3o3Xh)GD2e`xueF#k z6FamP9SPkcPxP5hyw*|xSp{4gM63l-J7d|Sl`$OE$kGDn934!?urr2<^dh~ufEYOu z%{xyl4~#yhz&@I|2-=YXYP|BSsU<{5y<%gAzE^D_@4a+lCEDfWy=0;j%j?s$vfI>E zocyE(aI-UJvr!8%g&Sw+ava8{m3eeiyTuZH?0Y}r=mejvW&Y%4Xx?svus>TBeix(A zQM7}1-up)MlPa{rT!=&3lreVnhkhl3OHzR7r;r9GY?%i!I^b0Io)c z)Gg|FwaTI~F*{Q(>NSiQ4Mb%YVMz=!kG9AwYRxi6Rnl;VDFkvAqWv!2{5mcruY3zv z(+gM`$z)5ZwXfr9#=J!2Leu9mwNU9`Uh%H}kdeiYVCiqous4GdQ4H&90uxA?*fNi# z!Vc5Am$9m_RuEtK24^+rd~t0?w@%mdpN;^;H-{Sj0A@C z?ZzzXK0w6T;5fqs+8SwA!4hk{xeSy`0d+w*6l`UEFp<8s&{pNmWFl$tDN+E6o})35 zjff$UjT4Ri)=vQdk%Eh%v5q1o`J))d=y~!RAlKRoV~9hHVn!r3h1kGB-9@Qn$-^9M zs-`l|5|~M7WWkzvV9nhMs@BEE8D>Y^I5ZHMe4+_87E$m+6LptpR_uW?mnXq=LoAnkSu(Djp7{hzG!zUrTcg(!SIMJP?BD~ywM zK@TDm$DoQ!G;6807{B@oPmYtI`mLL{W?XYN9-Y(QlN&eY9swry23EtLtI?&#=- z1)LGiaUA<$?DspI4A|HY$4%G1^7^Y6XXlsa7kc3UkkYf6xtNgauN-DD&w|umTo)@D zUYwueen0wYIGhtop3Y96??#I3PA|5QN~A4;`IrCfpS3*IesI2T*jL6k&Lscv^l{Zf zYLt(bxI%flHbG`JT#Is8^`MJ%gd-G;laP^x#a_nkRh#g7<5}~1(NN+n`oob6IbPV| zO_SP|cYb7=Ky8gmpX8dXr)BVh9xY@eS{?B+ILjca8__g(-NBUc0o^e%c&4}voTQV1 zSZ+#!XXdmO85Q?LAZMA>d&!6ZLM)24tem1X_yq=EJoD27buX|EnM`t131oaUfzo4` ze2B(48Qsz9xfdmj#4rpY#>GHV&;lhy3Tb;pA)Qx}M5X~mz{}dXrfwu*tVG5rNzc)K z*TlAJ>b6VI;(R{s`~5VHZ6myOVckqQVhC03Y6)u-+rCdkrJ)(x8Q>K6OShk6w->MU zv1>ckf(PrTA#HgahgmJSnFAXyFB+!7xkbNo0c#~`c5}eDuBX0SKKi=B$=VyRxJsZL z02f8K`RbJehOalkP=;SXM$f1pWWI~9rEbDY4^u{n*Cy$!_h*!P(PGq>uX??ug;qr1 z{uRrE3P@4dnkZO@ZK}3CIA%2aVVfXu1mY`m*m=8I1A>*; z1curB;G7qL&93{w0ZLT}kHmGR0y;^QZjVyswqENhm|Rb688CiGu@*s*8ec(^N8L@3@Krm2s8;Sh6HZ zYS&$8rJN6tDm5u%GalGW<7!0U&Ov?D-t4LXiU+e51gvtlZ7ORq@WiscnD1$n@eqZB z^wwjsO1(oC5VdS&vs=B%W{jmBpRg$VEUcb2?oBN7eFSte$}<=#T#6WsnOAxc-XeeLi3y?^-qAN{1;92f(tKp!ZswUJfY!y7XWBl#!_oRLWN z3Pfq}n)mCH=v*sjtuGwrcsVC%=TE&qi*fWmUS8~M9<`U6}U$<;CNNUp=^gf9^ROhXf0ya|w;jm0l(Tl4+50V>ETrvTMfh zGy$>|Hpd4iN1MBMZl9bS{_5ACeDvE#&z|r0{lpB;;{8`2m^dD>zqhd)O{fRgYn@K1da7imI>yT1?6u ze#nk(h$|#a5+;-f$WphE$X4hqi8X%kwYT zn0Z(`e|~;+e5BZ?ox|Ir50A2=gQzJb-6h~_G;LUMxmUqoo5bjE;p;LSSSg0DdA~Zr zwgSSJcjb*~TkHz<&z-YC3=w1It9@O3mvREE`)Jlzi-t_fESIF}1=MVPI03k-Kzi@u z{ERvdMj(>quPZ@cFNOU6!DgKnuND#1oLR^#SXnl--}f>YX{MH6r|-JHT^Zi4@4O;< zu5O*HUiO&(3X)%CA)#C%5yQtoA|$ci?A1eK8O?f!^K!caC}^F?CK0MW(l_e^gMtLC zKbS#Qmi?G_g^rauQOmu+S;JdKeJH~8#-eGZL=78Pg#DI2L{rr3bJm;v*NN8q78tmg zC+16dG+B=tFsf(;TW+0#87#Rj3Pq4D1YiOJqn6?F#DGfzB{I=zM3tV(%BAX3(S$^K zHf+LjCuX!(O>3B9?%h^O8tRD^xtw7g<_23G|qDIu4-@I zx&PW5Z=iLH?aj&)I`0uMY`pg>apnCaQcFQL1(3Tp@}Z6^!ZTz$07DDoBFf}5ZSC~z z^plT&HI3(N5{Y8J9ZpZr&bOD753F0{+>9mxvhekOaqFDd;>tduoSm9jR4xGBdi9N; z{^{R2KfQSJ=poxN(6ea@UE9vPqN!?|xu$S@eDvnqZ~7SO$|g2j5;(jt!9V)# zXJ6jF``!od*KL~|{G?BdDC#GpUYRCBf!VT$g#K4F*hxm9%Az~oH1EDuIY$J(|LXa6 zIQ#OeCv$&V{oKyjZ8r0=Xo9x;Ir_a5 z8i2!;So1V|KAWvJGR2s(%qa{x=3Ms<;&2VjV8N0x6TK}-tCfUNqg%~a_FV<&r;h4YVgV%ydd?gPx z6muF5CeLFvNn+#_kXCpVEH(rAvfp#}fQ)-(+{df*I9@fp3!@IyD?`dfgrX{ERB?Jyej>FpR&0h?qV$N3l^UZ{#JFj%rc){PH5kz-StmKH4zvc6}fMhhQ;KAlV(>$6h4v zbZd*=>$P~{JOKo=_S@%mD|ZG|qIh^NO5|Xyo&2b-n@PWO)76H3nAHw{?kBrYZVy+U+l&U!FfZJ01HA12IIu-R|df zQ`Ao(-=RT1R)ZD{jZ20C3QVnU2kQ#5$;VXb*-Njs0gIwnWgvpP_u4z}d~oucU;N^; zkA5i)=~LG>qGH`KdrjUn;jV0ba$}a+zjb;3JcPQgZiVTNms{({AN}Uw@bKQf`@x5C z=uvYWiE=ec`kaNs3UHXSU!A*fcHccb=-zzo)$PS_`e=LhtF?4MkHan?$bwaC1$@#mZiaxphU^?pRoFOgoHGLtK# z0-3^tfZVcVoiofac-4uLa)|zBed^|72^3&3(;^XdA%8Jawn^!TEZ)kcBU6)7Vxzv+ zAx0TRh_#MSORjmv;g@Ma2o`!f6u?59{7d2sWGI)ba$?K{Rz=o7gVvMxJb}zS&c%m~ zOdysDkkIv4Wj2&bNF@RhdLaxFF-AX4nr<$$M*$imQRTgKrZ>z?ixXHXf19pLSAA2v zx=KCkIkN=fxyq5aKA6V1AhFx;4RDjpKQ-yB=hV9KY!-EKinKrbBJJKYO<^WO^BWiINNFQvy>X- zt>3~cGDjZa;p!xKC3!H1tD3g%+GZzC9wJmu#;R*BlELL}XVxb?kap^nEL=Z?3^B^&+5IL_l>1 zSp%hBO{EC~AtNC3!)5 zhP`-r5M@97tIB{}?qOF{;-F|>1LkfCx<+YCQ7ZpY&QCdWOh9YEw1!<(sl2l=)6k+_ z+8?5khAM`#Kh-5A9XqeiOu98Fz~(9&E|??<%)-oxvKxIAE0lh_JHL3o7is+|Mkb#q zVf$WhU3q_kiXu^#D!W#WFBxZgou-znmt=)cZ6!vqfD80zO*A|RPHS9!_~4Bn9?Y!G zJ0Jh@&xc`0&A!YYwf*a0)84sr>*P%I)?ljjVcYbGsYUH0-T-vEroQp7BS0Ob9ui6(Hy z(wSZ;WO6B>WRz3tysCFoMid>6GI0X423_I(qn-(>ZJGrTWm(=>b|Wya^+odPEO#eE zw)_a{g{FHbr!kSUUxmJ-OyqN>!3q{I5UkQ@L_?e%jpSn%ZV<}XmDh59ecrR62r8MS zIhU-}#q=yQMGC@gQ*JjO2D;W$aG zU)3kZ#C$J>gximO*KQKg7|gc-I3WY&`P>C6Qq!>T%cFI6?w9B{ogeoxaa5*s>E=4WR*8*klsNJ=J|%+w=9E@5h+kA6f*}^otL5z zf>gECzQPADMQO#zX>Uwn0bQudSPP+5+>(+m!Zd%p9k8j?nW|8!zZ<jRI{9*|B7vk02Je5h37q`U_e%>BF*K2?V{uZ zfElHW**l%pNVL>Ai3!pg!#VxU9RPVihQ9#bi@{xp``ru+KHpxZ=l%Bb$k&pDX?6t%;W}nT(e2!+ZXvU$-SIS{^s)+8K+S`##IM5-~Q1b zAKf_q^p`)ocz)qY#DGvg->P65riYy^)^Fdw@o?By&T%Byz{b^<%%e{~{TGIQ`e%Q7 zdAq*ozb_<{ z>hh)Yn56!zoSu<@)g;&2x^3$H&iHA_);kOfb&^UCfU#_{q`A!55i*i3Kjk9}Y$)HZ zjBD2$=d~aZwKSqqn({NNAZyoUTtV=<(UJ}qr6^jp0xY|#aJvcAI2qHcQ01g##d@&T zAxo=&GEJ8UL^hsC+7(gH4tc1&ZIo%ExOU>gS*hyUNX7|^+8UxT$eq#L*Qn`3Cx!Ku zMT?nIQpgq8sBc*evT*equMk_Qh zn*yiF&&i}vJgd!NXEp~hM3_>hJExe$+;mO1>4v`F&Q*+|Z<==QR&2X=7>9lweF!r? znn2dU&IOYCvwLvenP2f_lg(5{p+7c^j)d5U|0&Op$sViyU<+Xt| zYXp{zwtO#;SbO(<7uRr2T~KN97Zm+huY0+4JCr;mGq_V)asK4dZ+`yI#BE@U{kcEB zac&(TjK2Tmvro5Mzx(O=d*A;_-F7HO1-t$3(W57GqrgnnzkmOgnLY&o-&W8mw>*~O ztj_2MB2GSg>O*}(yCRL%M@}U$B1vC{Ho2RheU;=6S{a$OnY7-ts?iOvLKT~7? z6Oy2sFO2)TX+#DOsy0<7G_{~obj%Iyyi#-F>kdd|OkFco${ZdF9Lf2g^rFT40)VkZ zR8T>k)e1Vb@*gV8`Mnv{UFEr)3*S;AMT~$GO@2&!m^q4sTTmMvy>%ps;&BQwFzKMo zCEYYx@h7+VuOW1hR{>=MCdjwU1JHG$R~ zR}mio%-dQJaf`6nB+AQHSlU{fWkJNFz=Q0Z_>0O8$S_a(EwR$A!Zb+&3`K5AhS1Dm zSl8=wyf9t-dM|~g_k*wQ9Cg$LGmA>jnw@9QpWnK>cU283u(0drfoWvyXoL zA`l`NWDn<{MT)6YNtWsUED@cqNK8z{su z3EV|_UI_w##d2M0Zl3jUv(GpH=Tp9}s-wg1@aWJ_1BHnu5`rdab{{E9K~IhIipeKY zG>(B+QxM7+uN1b?AQ`}XJyVesxH@`fHzz$`S7=cgDHfn;?VO|2EW_%ht{R?V*Xg2n z77kq9nn8z=VDxA!UZ~UilAECxIAuWx-x#4l|6KGkQ>;sGd7UigW;@wAtXyZUo5)Jt zP9#HGZinKR25VP=Qhos_Ik$w;h>ENnN6nfGLyU5TO*UUThJYiR^oSIQeWV!J`#6P| zlNdQp8CsLP6~V-nodhGMJ6CB-Qj+@%&3PdN6&%p{q>(DNWTFNl>Pt&SVw$D|PbL9Q zCrM;Q9IZw5w{&(AgUn`@g-1-y=^-T4Kr_xt!nsj^%zc#7Rom2aa)}njLN=8xR9UR; zIuP_!I*nqIj<4%!nC95+U=|&7JMlqaKQqU5GDhx*3Vu_;88g$KhTu62G;Yz<4?q3I#aEwp-6ljIq^Wfn{W!t?`S#Jn zFK*v|wb~qx-p}eJ{V-A>ZOZGCU|9RDz*~KAE`#$jVd?kVx%hQtOw&3xnpJ4~NG7o@ z!gxN0lr9*c7>%bma-4vZUd`pXf;4?U7{g;f?4-|QyPcoCF*uEJx7{zjG-!^GPfl*% zI=FFk_;<=tYv>?5~!QEVYk9pC50>}kq+0H3Y9ZY zU=+Ada>Q(dB!RLst{Ej|;6A-C7#j>~x{1cfAZTJ-8n{bC6ickAJq)I7ddXBWvvS=@ zyB4X<8J;}AIYJu{;{qL77Md!7Tp|>h2v-ed3gMJCtQR579P3ijb${UB*$sH*T`R1b zh<@?&pa1mJPaeGb%B+jjb@lCAH)l5;%67quU~2nSq->ZTCN_kyXt$G0yVyup7MGNL zN>}t{y3_Q%i1u$UpPzs6<(E%qNy*b^mlqd^jFtgaDi%i{_v54kMDBYp^PBbgpD`{C zlf{=-0K>H_X!X98OpwEBx7*I6fuYer$KZ@{hqqsOuRU~4{j zcqzq+>`s}w14~nxnKRC_S%T~I>5V(b4gyH=gn?9ZX;BzrEXt-#Ap)i4-182I)>$o% zMBq~J(_HiG7)c9c1Z!y*UjKNJaLzgWD0WjMJ>stR#izyxlC-&Np-#+ z0k52Cc}xJ^7HDp$-&14VdYX;dGDmBfMg=yLF=M2`2c11EWG#}{DY9;*>kT1Lq`0WE znH*A>09+}T%OudTF(Jq;H=ltLa!SOwYQs(eh#@)3_DN_dg+)x+A%J$c`}t8fP}jAl zn?s6Zn`s2HQIORbGmgW2$&bU(Htn1{Hcg{B`cA}?m`&R@o6Tkz<-dL)qNBqj=Pbpz z@ApLHMmdg!d7J$v7YKRPUIHec@A{6M-{<}kqFn7xPlW}n%W@2&K%08NIRCb!4J-(A z2pmU(Fpkpc48g}37dDi1U^Q*KX_`(1CLj;4-+`Mi6J%$)s^Gt3CXz9wV3_f@vNu7V z^;#|KnYF|jL|B0XMF{iq^Zl7krdS&`5M?%KT|4x{N5A^jXJ0&QHb*4f6jvoVFj4kO z^Bqk$zjel`QCh`AjD8sQxU*zhCSjoGJC}kBL|#s8WDa61;HNR}hhgi7-jDlXpX{)o zJbpBr2cDge!@RNmG9%kkm(Isr2r{ses{$%=6Kfmzd?l9Vr(!Ue&k)@r3!M?2 zVSuW^hB!oyY+Gw>+A}GO&{0%cCYkb9bAOY3Xau5_6n&oA50Y*+t~toXQFjd;5RslRWUdIAjFzk>W{v@g zmKlxO7cCHlezA3bYhglPm#fTiU9If*oo71dKKuN)AAS6r_rCYOx~UwU99ESbN6)5O z((b&&DVNeCrO>ZOoc>d}@Q5%>WAsVWWV_$a80PkJ+xPu0$@1-HN65!do}8ba&poOD zaB$dWFcLXEm?&2~8H!xN3p;@&uGuCCq_Nr|6m>6gZnkESvu(G61u7+VEJ330aD007Wfs*iKGo#I#WuSE^Zq8ocgK1G_gaM zDJ?RL8pNnvU}VrBh=yVo-qaUcw9F<7{*zh8rFxzlEne^=Cs1ihA-!4yuu3=iD(OGB z3@s&y$V4*E3k?BkaNWhl@c7XsHMj2`-GY{k-9zY2+!N{Mq9~OWb4tJ^8v@GY8KiX+ zsU&|T{VaazYk@_E$Uqd0z~n(l?QUb$T*`r!VFCOhgQgV+RL!g)$H4>7ulA;QAeF8HFrw zt#iV!uyQDugozon(Y{bmRDB|b5G;VviaUzYzrvr^TE$jHPq)SKMZ19Zxh7Xv=(rhCUJY;w@r&OQ=NwiH|0Z^aet+pFnlllwPa{x+jEaYB33iAUghVjYcheN;JYz}JYK(?Ho z87nu2;Emy?Jy0HfR`tK$?EGC6fy@F7TCUn zH6SI4z@y`vvx;&gJiok{gFIm8y856yIIg=RGB#(xxE4nL_E8RaPL9c7Bu>@d+*Dh{ zdAMYyGDin5j^5KW&B*KAW&Cu$Q6|pWqo+@w%qgZHCXOKr3sG|bm-4I5Rb(pBsR>H_ zKxPxi>G|WwPab~t%b)$#t-E*To$=~xufP57JC3=w*d(`E08QRk>E87opsyq8trq#E zew#XmQdz%#$#t)!G63hdP#ypvLu5eZYyb-uYCu58j3H3fP!)V6N;&z^vti>5uw5!6 zDiOK>Jp>eiBhy0ED?fO}?c#R{U97AX5P10@5osp*q?bAXvqbsT*I&thEq6Ec z)AaMd`inQ;dR?n&(sHqGVp-BNz0(9Al>RTR^!rG4Wvl4ZeI$m_`(eM^4$=@X7wBip z&BW8{6Tk_86lqKt$6mN!WG!zF8l3J z8V0jDx;OS)qKGP$m_EXG4c|IEtexF$FFyUvFa7?tTXRiga{#XPVd2QCO&BA|m9zlc zA_BfX;sv!z;1|H?V6yCygJtdOQ9U(e!&xC~;ilqpvKcDW6ZJA$#0i$T-pf$1y7hU+ zDVA($P2pT9r@FW_bY=8T6(kIXXndGXPVV2l`zD<3A76a&tfyu)o6SkxwJ@Fg?Z81l zg-~_fvs{_Boar)A%#-J}d14w{ZcKDT0_%X z12In`MWh$6ZceD5sNNz%ruJIqZkk4+&BE80;(PQy0O;kAfYPE?p&zSkBE76q#yO0^ zhNQ@pish-tJo*&rzIkyuQ$dtMDjG~aq%DtiRkuxBxhi=Pi8!cyh>ONJ&Sto=v`enU zUX4C-sJ?Ld2k07*g_50?BsHVI1{Yu~Q$SF;{*;0I+`fwuIEYo<%mLc(x5MN&Z6^xQ zjYU*y%owJ4dC~e%RZZo(%2km(a|Cck;=5qT<9XJM0@Z>kN-Tx6tSJ!X+Rycgo+3IK z^48%ZkcsT}qa7zc=(-1Y@4x=m+qZ7tL)%Dl9F zPcM?`ho8pY2(w(r9qn;eJ$6(+2^6@FOg6_@JgKWDMBYC>o932@N6*e5J=uSF{>}#< z+_`_h+Z;GoLGGr1iBpm+@U`-7sRb9Bbx9~ol=Ybw32Qr{D>CmZh_f{A<=T|8pU_}w z{#-V;sI7qN9d_-8q_5IVbBut7faWEUN!KAF{V4gOP_qFT7xrW(apsK6@&ba_Au zcD|Kl&P2mnG7iK{dAHIv(N#H*iq4&o2T=S^AJ5z z1jPA;);jW2!Z~-BF`CV$2Gatfx*%rnKvXcJMEUE=?kz`Jzfv~z$J}iPu*x{2kl6He z1yte%8fh~&1Yz{^7aoVlr>r@#56Kfgc-O;_J}<@Vt$0)OxIci;W- zt8X2B@~fXc{_GbuptEvV(Y9y-v8k)gH0}HTv)}w`dwS=!*I%EdB27XE}_;`^@lSF~Cs-qlky2gSxT7@?=e=-SwC&9i@9mR%)KLt|kxFER{qwM?j zsHteWauuKyOs+#SS?aEEg-d@=d5bRC7dh|5(I{)(s5zHvo_ZfiZlVlE(F-btWHOOU zpD3`ZyYUs%J}l)L?}<5vz|19&)HE$p6h(TP{1m0`@0=^64T+=?M>3MX>IqeeJTNmv z`F3(b!g?pGqo&TILWtJJlr&aYiR6b0aPGFdnR$|MK42Y`@WB&VZkPG zG86&s8gA>>I;-hyN~8UywS7}hF$7zu%-cCzP}+a*fKIrcc@=ag|0m#)o_so&TA`gJ z89*VUkP>th9KtntBsJ5J-whHRSl@uSCT_L>L2Z)ulw6?!kSmDb2dAV41AbHO!Im>FF& z{`&aw>6c$UoXh5?&*p^la;~}sUg(w%K~&0YZY$BdGXv;8(K+X$+!KpB8v!CT)}aBK zVn1GdbasCB=*j8R)9?S_2d}>I#>vfFsgXzzOui zk@qWKLbI;?=~rXjW>j`oq41!1y%lLHjj~WGX;64TZ1Ow-av)`T^9i5+^ZVnF-psK9VqOKv%TF3Hjq}gtqW>m1P+q!No;Oq@FUnJY}=a<{_ zXHOoTK6^H2l-@@z^I2=bVye&CO6~8)aRhKGB%>0Th{#2E>Z)bg3x~I`qSpWZ8iABz z2PIc{S`0BpAN|C>#>7I~?UEO$fh&5yfdrRYFW%TQzMpHfZ<#Fz$AbzWBoT(`**x>Ppx_dh$Rdig6;2 zL{d{NxFI<0o?8koBHF)#j*70G5X40$@v*>E+Jx9$Xi|{Gr(LnPQB#vM#0NdY3 z)mX;1zRS=u7=gm{_ukSvxk#AdtS8UhXz+#{?9aqM3Z?+HM2VmWPX} z^B9J(i!2JpN5^Qf&hxj`(DLtkl;mK2ykuv;m}O+T3>E#EtV5OsUQ)#D48xocT$aj1 zc`;V?=JuV}{^(Et!GqVHy!znPx8DEWox6AIrZWr&$8mFfd3^K1%n`nI??Ef#+m%b2 zvc`b5)u!FdR(m4KfZrmwR?sbXQ?Asv7JfQv@yIIjMMQ!ngc*E!_VnqTC4csOj>O zU_zNXgDC?q>BE4GJDKm4bKFItOvid9zo2qqEpS`WL?#%E;9MpzQXcIoe-08Dw3)?U zwyz7Nx5cbsmKShG^E(=f7v3>3{L znJ?x4=HSNJ^YgQ>zWhoA{?ad(!%D0pur;7GFNHQM>*i~OL#$jiPX6@S>HN>_#q(j< z_5F72dm#yEaU2*`?mBuOhhb2yY_#SD-a_#yAYB8CLS8{PuahB4p;z$ag#t@!wP1Y) zSOZd$Ka(M2(fX+$2Klz7Hd@kIrc@9N!zg|CjJ$jP)ZmA=UU{QFc@WM|l^$y6zzPj% zJC!ALI>ku4%f-kJ?e_9~*KeCmvZHpc=EXJ!8LK5#G%lZrM2lr?ocf_ZKR3hvwHvp( zu0B5KDr*rreHK{Min*Sn1%?DDgI}>qlp|bZWOXbrP%h;ALOJsZ*4_TFn&{^9j8;x< znbl80aO-*S3}KS9#|1Q-<4x7J6EnNY6MXXd=a-jHhJFkWEQp}Ij+<;8y58^ht(&R5~pn41!Fk1q3pnjn{kcu`j zn1VZsu~~|2fSEHE7)-w{G2HHqy7XIG2d_sTG0(GsIbOLm1N#lXKmPLT{eVR->WlG|4P$hIgtxlvz+sAW#*Pe+UjO=>-PPoJ$Unt z_m7T_XUed(jkHL*wyo;AJw7~1REN4@p*Bj!+1|Ku%c29cY2KqvZQmx})O`BI`xHe= zDhyapiJ@$);rRjcs^0MVw14_|R&jp%$w!}l{>A4{pPu4l%F2FfVE2L7r>0AprA$cy?msvCf$y`rU3J42hqP2hF9zQX1-UWMo5byl zRyu7!PV74(*8#{XfR%K4V9V5m?W%5J9;jBtffQ-N5doIsaVV9VW^d4rPBmpm0Ibud zG^pVrVIJ~er?m{c@xhvz`8Qyk}>dl`FoQU zHGUfsT1hil5S={=qG-x`M1NALis3-QlCxCJivcBbl2d5ISAAcCy!vtwg>)OG*XG$q zU@{c|Ql+SGH-Xgt6JuKCGbnj zHs_@X8kB;d4sn<$1VG4g6&QP2Tt=6aRy1hW>8c2)mzxuT2)u6!@b&FxZ0%tPECRM& zLqk{Iw#P^WP-^X+Uu~NvvTzm#i~?0APRe5pV&3P)|IDuR0s*0PJ7Ve5iskfR(eVs1 zT9|j5uM7)?%Lxlq3}nVYqQHPvhhO3f^RnG)zT&~cGM|L;-kotAhxIg$6s(?UP{N>) zXRaCm2#D^e<+#nTfgj{n1MQ?{z3+kd=#d(DZSJpagz_RyA*3lSyX`j3GjnFn1w&qO zs6PMfN2}G*+2!`hlk=yK&s8W+d}jsg722#)s=_Th-5V7Q)epBoz2X&V4{Yr>{RLU+9<6SEMb5TS~- zJh;^!`+|Huq%5r^&N(mhEYfB)te=X2ntG+)rcyVzjXZOslZ7?KBq)GcNf_9?=9GuJ z56r@nYorF2%HmM3VFW~LxR~UKGgmH;y4y-w3+ueLV4C9^CJvx1~nvQ)2rhno==X-I7Vk0v& zc&P_%J9rP%t#8<3XTPYOErSxl9%JsUwE-ZQtwJ5fKBj4$%928)*ftke-@J2ISc)bt z{H_&U6LTvPXdmAKPWTk^P>n(f%^;8o@5hLsx zchg!;A%vV*RGUA8i;2rKC2DOPe-`vUW@c^3S@uZqsw$ZmR3;5l z?N$U)5Hu26BvL4X`itG!*_*eVL~>TB>qbcoS~w>VDEUh`4I#z=M66I8-;1A0N{B9` z>$btRfW07HnvYL!e0sHi#Rta(`$Sa7pk zra5t*6&T6txm5fLlBQ({w2pDTnvRBOrSTAus@Y$U4bc_l^-l<70uE*b)b_7LbbXN+ z#oFtd)IcdxZ}@=qSuGy6Pc7?QJIkp|DdmMhAVM%D;YSZ2{`jXq(e=@rXO~a@_ScWU ze*5s@$HQri7*<6hUbTNLC<4mjyVwe(5Jd^_#-%IT@Mf_6TDR8~v1>y(v#oiV^Iqt= zCr6!}+&MWuAq=8Ijc)+W`@N~3Dv{Pl`))JbYG}{C*^J1QT*)FJNJtX2-y(WeqPqG> z$|Ek-O*ZQ<^4Ic{LLMQjJs^FTRMSpu=z17d(-e_fUk&B*DU*)^N(sGm??MV_?e%Cq zaW;?ATsCL$F{%x)ND{?lBGpap9(a*T1Lk;*WXT&8^tWwT`n)p9_lX(~QS zb5y|J1yp`0I>j42h`wT6qFp5f7RjJl1VecA$;W$pv%OXCo|V4YZcp}<)GO~e$(*;v zgVe&=rfF5`@se3`o{K-?*`r6F>}zRAL%E&^Z2S{i?^L|S3Ee%X4t7WiinkR=5xRj+ z;Av2`m5WL<5$#bYaZt5MGf=3lfo{|dIvC^RcOI(V7t(hTCuf;qw;6_`7$!vll#9!= zXHUL5KYRQ5@zZa=`S$IbizQ`sGC8XW+Bq*mr2&kpq0Dwf1|JNKRIQBBj5w=yZ2+szk0|JhX*PON2;zFbM~>a4X-Z0iH)@dFU~ zyI=OF^7iDgoB5*R+-xO4xjy){j#;+pREm7WTz5I%f);;4kI6>$g!tawwS^?M()H~E zeZh`KijXVvZQcoFaB~rVn_7E zlvR)oUM1^*Dfa1B4FfeSK=u3YT$FlX5Lq!S#t_HV>h$#J^mGg{?pKXzH6hT!$@vOL{s+bcC?NP<1;I8yIazalC5cFu6aE+XpQ@Y&8cy4!_w|l|s zIRFo1JUu;`R^!ot<7zzw8ZeA8L<5Rc4XlYOuCyE60pg(rk5@7MBCL{iYCn#>0@~?% zjs0!kq%LJsJYUKI2j@?%Wi&scK-c~i>K$OxH{6c zLf9oqw4ty8OoK?MNr4r>QBAAtYiZhusUkgt+1XO9)FEolK`Cbx^MA;D5$bk({?SJd zt+T8k#`>~wCsDT$?%0;y&8N;N@E7fwJBSWeS}d6=)>eoRDoaNu7AHKZBMqs%c)-ra zuIK}R0st$TE4|k!fRGMS|Jpob@4{N=wI5_Bv;3=#LJ?6wFeDl%Sd+~Rk}~I<)c&bW z9pgAsH?$n*T#zVA%WiXmIF%AApp9~;WCb85L<}lI7>LyNhHgh=%$spFAz}Q72*3_3 zer-Z8YWf6(tE(*f_3_nwvAVL|K6^XQ3#h6E`=(_#k13_&V_vO~hDg58&D;6x`zQ0h zx3gEP9IcN_nlXX6^sV8}|1=KoGW5Z5t(Ks2uvPHDj~Woxg2=p$rR~|xBuiYd=Oye~ zp=re|QyBcN!zWHUEN}`lWmyz=!?KI36%)^Sw~sk_{`C8^{djxEqDWR=0Yp(mZTm!2FVk)(oPP2L zKi&JU&=81*8rj;%OqLSiwbTn+cCbOcn>G6z70rV!2EdKFX2YOW!g-Kl)Fx@f1`frx z%Z_b?Y(^p|Q7%!0u|_6>I!zSBd*JP5g*;paRn5ZzC6!aL@Z4`7_#AVMWgtB3q!RBqylTX;70N+C^YqLtC|esFwAin$FR&HpzTR0 zP>^76Rv6k~H`Z6Tpb~UR5Gr;?+if3HTLf0(3m9VhQi93>Q!mzyS8S#rv$CFFp~ zH3lpHs4AmYw|>y1Xgdjz3VYGE)NUC@5P%R%k(h88@)96tU9a+HST1ErTMFxm;ADy+ zP%M}tR8Kgz;u%)aNT~ks=HIDu5MyBwxC!0f3uWGI_k^w(Lm?Lmp`92JRZ{kZ zTo1I+L)Tj@k6Gp5Zt_-sL!4^Q?EGK}#HK=h56>Lf!Mu^=9bfx=g>snuzY>%8~aM< z>(^;Xdn7uHLm@86lF~^^`>Smn$Cf#fd3pKr$sSx>CBEFbyIvm$8oh>%p!A+3Hvh_1bWL53#TSvo5>k z@?vwoq^)w+yo^ClrYJj75(ui9Gf1cnra*d4ehY+DfK?>2LZ>xeuU&G~SukajEh+|C zP%JZ%%qXeUMi5o0G(6_Bx6i-%dJGCY|LA8wz4!2=fJz~18O}RY^CvN9Pm6e08?B6o z_}*PpPxyJi{`W8s@|NqM0Uc~VYpug(#ayRw+kb?JM1vwwnX9~eMW71Qo8CyrJ0++K zNKFrtZmMq0EUUF#J6MR=o5D(8!$62Pt_}n=lzTY8cqxvW%^T7cHVJVcnuf7pVGY(h z1H(FMy>w}rdS)+A5K1dF6vC1U3Q8a>j3!iNOTw_?gq8;)D$-%u+eeEg?>|(JmHTC; zJ+|L_Z7YFjFieE!-FE*cr5Q=)dBdEAvt~}a?dAFTZr;}PPG%5B1uDn2R%bnk%$R+I zAy|P&i%?^kck?3bVq*lm)e*79I!opyrM;JuIq8|Z5f#>j1+qiSc2bolfg)6@5K0iK z(f+&XrHNgra3%v_LDi zD}pPAN;^b#rH2;&D^h`W<556i&C9%5Uyd=e6E^UgZH{EucxBguGeX=&!EXCz6LT16 z5@RsfVbaFdD7R97hd2v%fd-q}UdNp)naeX#YiG9;*)c;qrKanp%87`>D8lDwuNlTc z?|yQ3csnff*^_j1Kj?ZG0$_$hxhElC23eUzt|#{|?G4%mPb@9M`l`oDot8g0y7W zElGn$45mh8QILcb3JM8Sxo4EiFRd&zPv9|f8!1+?Hj;t{gNTUe^nqy_)~huJ2#Cw8 z*U!KFT6XjDqt72axIau2gt95=%2jXA zOwhjVCNcKJK#@SD`)GZM!d5s7n_;~cCKecJtbCU&6lddUbc%=-AZ$q_n=S2??GuZF z#7GpX12a*rvT{KGCS*N>cRm~HIW#ZrWc!2|K_|pD;<4f+ zax_d2?%$8Y&@vhu#K`4vAVxb5Md|>n)jEb~J0=wdQ9_M`W^G9U0|g8bD3G8EvZ~Zg zq68$8>R&m;$T3div>zogFqkS&6@8*osar7x7X#O8(^-{(*KAg++_q6y#dc8wf`cGw zG%7^&4Y5yG9oZMXRg7jzW<6&S^eKf|O_8l4ScH#pD5ss2Aci7487YDQY(M!lB7Bq< zxc^{Z+zBDf0yAKCuV$cbzvt3a)bg=ZfDjc0NHusEyvGi@jR9&IEG+8e?ebuIl`62? zd(4gFO2inUb&F1R$SuH06@5Kyc)uOtx)}MS(%(Dn9JJC(m(Gvubf?=ukCZ>lB1o~U z1nNG-3?d-yMzVTB<39KRZ2qbi{@S-S%-Wr$K|LGPs+FeT5f(dikxbfyh3ZMhU}l5b zU1_uaavM%4GF+Q0TT}?`t^iia!d&c@N+YoDTdX4=V?-hWWsj|mzdP1E{89bT=V1?4 zT^6RI=;YwGUANP{uW_CppX|$=d&BVa^RvxWB+R^b*&T+VWWaBZj*sr$y}#E=4?`e3 zB!rxoeIzX}%fpX9p4LYI0jvY^kNdcN!FrD`ZrlF`yFlObeDueCY4b3%Tgrdv@Mj5J zQ%udVqOrnT)zL7A)jztb%m;*~bimXtM5S;2w_CnW1h6Qv;^ff=0M95 zmh~D>XqZP$8I)+ryxF0Y?p79Hz~YytMfDu5J(;<3VmLEI2sZs!i82(APGL8dRQH!x zlq;6odW`W(kAJ*AD&V_Nj-J2Ro}Yd9gedQ*ktbsB&T=ptX5N) zCZ$M`rsJbf)-AIUuB!a<8Y)WKU(78_=N3)b;kWv~@t{uZj3+lpYeQSn8o`@H=Cu)s z>~PqLa`uv__P`hYF`A;Ev=%J@K@P8BpDJ8o+QUr(BxPU6x@p66IO|VbV-^9&?AFw) zO4ZWH45e=r5MuBP)B18)D%35QB?6*a>lG0&INm`dMhs<+A;^+Mg+LGj0XAJ}@2>E^ zfi`aXPQCLb%SD++5hfv<5 zu&Q3eL$cmrG$TTwP>s;UA_yBGQR<3aRtk(^2yrANH};@zK0DM0dau{0HMWUqn;#5; zpy3?_3bDnb*BcRg>%>m|;y#5+z1+{0L`v8^9Q?ncVoGOwTaiL(idJ@K!7afg$r#d| zJ8$KE;#Zxkl&=`4^k+tI5R zvTvboyo|je*Z3OTZZ&P+%=hU?><5%=M?%zZP}@MlF^(~WfYjVf`_8-C%0-oK-U!0v z^Gx;itf&zbwaPFMBLy1kuSLtmEcc5^nJT`oTm_8)(&Lxg)5mW|lX!?8wG+DYJI@P% zLUwVt)7;7=~BdsS~3hPQ9u?BV8{w{Mpv?YC6>x+Ws;DW2&nV1Bd5 zpnK>^NT`BDptzkkPo93e*RLHP--*L7m zJac&O7K`8pKwV0#%FWn46jhtHx-yKG8-QyI^R9HMDh6E>G7S@ho5}Bcl)?noGHW)dbgif03Jex}gVbXwA_DZ%UU2PFR$wr_sN2|*FOav*BgRSOVT+n=D_ z{sjI>x|XS8FLA5=Mdtf4k&cd6 zWg2&S`1~VsCp-@-AlroYIV~8Qd0SVbWhm^e7X+&UA18M*a6v&QJ%U?t9 z(6-T#q^&at*MEzeZFh}5@X-;ux$ zEL^QmKA`e- z|Kt=9?Ye7)GZDRtO1d}?6hf)~DKHiOalLx$6PwMDZ!}yare){pHWlI`?=lI9$kL=z z0LJ~c>aIxDQo7U~$W3W2 z5X(nZBT?AfXbptAqvmR3DXr(+Ok)$v*~R6O^ZMwxG&7k*4UZw(?b8Cxkq)AK)l=A@ zEjQPM@Mh!Qk|4V3Fna65UZwrYhR#51tvR%iXjVfpf=W(`Z~V4?!_oSNhh-ph!f2X` zEYhY#<5HjxFFAb-AANLs=g!63 zv%QD*o)UDgjD353S>~57uTp*Ys`k^9<8|qe5D*eAyXD1pFBW`zbo|lr(VozGVvhO$ zm=3+waIqp1twM)d^|ogah;)lGlg zv()TA?`*!kgeRSEuBmq*fQa4TN#?6K)aQ8lYRu=PJ0Q^*$}9jf4$CksSp+GGj$_Ul zgTTVay`5*l9kN@~5KmPH9`wz#X zqZC6nTWvwFUt>!MX$H3kq5C4`7bGc50n zGo3^4B6X2AfA^avRB7+fes?WyHWjn+TJ3^r>p{SvnoISG6=qBHE*^7(nB2ff%%)w+3|Y1I6wRIKl_uv{_7Bi>G=3$KZgM5!YPZWayd*x`G^Q9T}>jx zFd(5a0@(sG5sic-LLvaR-3lyhn$~_N_3oqgB_3}2Z%=ME{L&h7?U&dfx}H&mMKWJS zbV@3Sl2+3=#KA;TevDDI5o`fPIhpB>Wx6`kka@?mvSvUb1d3rCVhDm@+p;LU&V0&p zJg1x%y0{FN8@RZ{?T%6g7DdiigU1k0j*jo%y?f=>yPEcAVYkdIlIz}1`*=YQp27am z+0q{sCc%m52=GpV`#T;%9?EcxPT6dn!XUrEHM`gQdLAUv$()4mb7XRp^u2xK2S+}F2wshu*$c3K9v=T(mQhJ4@mNP^Jjd|=z zhM8G?)Ea_+3JSM#H~%h2^WQwgn}DrRqzKyg=MU7JaoCS>io3$QdS@!iP;WfpvLw*U7{_AChX2@NO%*2y-}Iyukp>|x6^+1C zO@soX)uzyQQ$J)K&@0*LhtDfoM*|x|ReKfx9j&A)$|z0>!2?}O*TT2jMC0XqyR^%g zuov(|bP2*L5>Ry6ZO`6pUw)U~K8y2N)C33;A`1|ppb8PA8mBB0L7+h82MIz@_7pUG zHOt#+6e3#VM#gdQVN8tlDRsqR{Q=*B=^Rm7={5kKUyD? z5G9-XGa`{H4#UN2brOb4+n-QSl`NV~)PxmMU?(*Y2MXoie)r)V78lsIy_rY)5GkQp z5LB%2w$_8(m7gVZQpuo9RSiSrji{XRZaXimLP%j4){~JSMKYyyob&y8K7M;Xs%VN&4;L3%kiJaF%a!Fov0AXKtdF(Z>IK5g_`{}P>(lBAquP**FZ-K zcNOpL zYKpnROEJhI!kt)0wTu4}Dz~qoNd#F9Cre$VwD|$a;oDc6f#u@j^3Chl`!3KBM`0Ad zp`_;ZFld#B8->;LvYGmXy@Bi7VD5k>ktq2VV0wG;2>{|Zp>ErMxoMnmWh=nK7R3Mpyqv#%b@Al!=K1%0@hav`RMvn=5D?f}JO!1AqOfSniDQ)r zfGt4?1vm@aJp^6mwI~SU5F!E#VxCrU7=}B02Zi+zNMj^YG@A%kjzO6KQ&LR;8886` zy!wMFEf*L2THD1qjpaK8YGfq>31Dq94h0cNM3iND`s=UWK7I1)$&;V`(|`QQAN=g- z{@p&}(x)x*5+#BF^+uPzOMVY`Q*Uoz;O+9uHV@y>h65^5TPB;f(f+9-&N|G=JG9?t z({VL6Bs(ms=vxeD4_ehi2(d_#k<(QW_T~9oS<=(*zdk>Esi-2d+iiBc?e;4A=5pUf z%{dX$vfGat5Z0?T04*u0piQCG5CmY}T%xeD9<7h2qUEH*JG{!%9R>x>O2vbgs-{6S ziab0y`okZ8MxtkD7rQwvQuv;vUB`ft+^(h?Az(*txk<8hccc#<`c9`npwhoag{aCc z$MV`E-DD#ywJ4QERorS)sYWHEo4&A!g6k}Czt9JT zA#;>G1vt@gtTLtLgofp>pZxm&_HX^uU;Hxs{0ML`Hw&w1WD$roOd|$c&jo2ctk#6V z8kYh=)M`=Wrbw)UqEc+_A?LiOS?{idi2Dz>$thupP634>lE>uBYPC|0WOGVr8wwPw zvKfHxZ=$|@(CS-MqxUKX>nc)uuq(8G#p z+nB>Jib#@zO>6FuAPE_z(2j=|l-FLt$f*>`dd%i(|DB$<~S)|Bnib1qOdN=0(sMX!RZ9spH@sn9Ik+-BA08x`?+y!+RtSVu(mfFpGx z@=$awHbhmrVS=IJTsGF7SqR`3n#OPDoEspv%>vpV=K|Z7)ZTob>|n<${yqwoA0idH z_H&xBz_Iz`(nP(P?h=@sm zl?h^{m0<{28AJznm+Mf_g;_Ur>$l&Sh$yNK2*AuoZE3aGZUD;6lv0dCv|vu4g%=UF zP9`&_WflBP{^b)O7^4DS$yql@$0oRUXLnD~Ng!?1pBc zMB3=5O*iH9V}q#zRnjKte9l`u5PC<+KA+8Lmt;RLjpWw4-Bhne_t0VS?KqXYmTi{} zT5}9N#x_7uQ<~H$bHkdB|GY3uP7e`+h6N0GiL&X!2x(v1eDdV`J-dBxbQnSu5n%=s zs>#&@bEOMpzdZK^mzHltAr)Inr^)sprf*AQoz2KFskDXC)Z_JM6&i<)Y|2>{Hj#~r zD3YQe>b3cRb5=zvsnQt?l1E7`snPn?kja~ zUp=LN^g^y0@xC9{x$S%+K>GU|Z?~psx21codtIg} z#IM7Wy$R?QmgZ?d*9(AvOI6&CP@qiHT!Ir>GhU^A!qcAumZYU?62FGcrjs4uZX}#+Is`X;x9GTO-+SynZ7JIu7Gr!WD<8q9F{^ zw6ZqvgL_Bo)c`=toL`?^ynJ((l@;jXawBtYSo>5#jO3HKx>iAFi`bc^*2PT_s54?~^mO}u zgP^7IE9piCWtEHn_<#Pt8Nc}SkNzwF1&u3Isx&jS+RYG#Qh-T`hSOnKp^&n!?%n_F z7k}{dn_umgEkQ(O$t=K06}>mqIK;?6=j>xx;~yF;7vv~ z>dpJA=8H=Q6YFlQ{gRHOS#9X;uTG7EH;q1!x_YKxGDHZKtjpy!t)AWMO&iE*!!KKN zZe?-z9o1UhwD)@0OF?NDDU`ahf21bPaV?JbW-QHjS<;@I{%zRc^1BJTs@>sH5$>A%2B+iit?s5D{#={zuHlW5xGHnv;dh%Gn1WL|(LeGJJMN$E16A_Tims!|F8DJTU61M^?l)mW^v8AWC38RZL6Xon6l7=Xtkzkuxu8bFtm4 zfVP*L?PgbUN>!Uqv!JVK99H9$Q(l%ND!>^4UC8g^VhoK8Y^nx8O{^qrblA;ila|z+ z=~5Po!x5+fHPJl8qEHb&o`x8PaJ2g5-iiM7vm|o9**$*xT(;-Clo3!1;*{#>928(F zDK2KD)s#Osy&67{>q3O6Ak3UnUNWbwfl#FqsYHz5y?&Wq38Yq;e zFa=daF&<11GbQEPqeTHkwo0Kw@cb^a>%BD{(Ej83TWIJjD0xOf@Ac7Z|46;%rJgth z{qRJ#&Tq&y-&XIj{-Sv8 zST3%noUsLOzotKX`fMDgy&TxW>p|7TNx}vHqIm2$3)POyTm38g7G%G*!(avMF#&?k%xa`lcro}O2 z=6>f%gbw#bRh!NoiLB+P_L4?|;Yx9^N~gEq37x@jmC>eBu;$3<`mlC>+RW~LP}pf3 zq`VGaze5uz{X+sv-Ip%I_qSwU%1zYSxwLAJh#JSk?ZmGu1;(e@Y%cdjcdwRvmN$Zk z1fqWsu=Szx4>tf4`;QI!ZYkvbtu$3_jJ+OlYHcM)JAfZzeyLuxQWZY|;jpo8^qUs6 ziq|%B?>Bp~6kO`IytllKR*>)fb!@io#ZIbl3wHg65m;U#(+E+BEqvO@lQ7LVX!#r;}XHJ=A0T97L z{8AC_`0@pZv4|x>7@x+r+2eR62BMPj(5H+NQPAL132C`dRn^#amK0o`o@2!4kH1N~ zv-$k>Pk;8ad;2K%)mo8+kVD8AG!#}S#B#pyAj#`?u+se>JF|}4ozVK>DDp#C;a!b~ zQ2oU^J`+--c`y`#wU8*!dGq#Sb9TPBFWnb2(=vm|yj$koPK-xb=37wN95A-#-^lVH`CKHJ6YgAPf?AyKTyB%!l6W{kNHC4NQxsoTYTu2(c#Ii1o@O zNjW|tsETiI+#rMqLZw?Q^D+#BZzHh=m0R;tvMwp?mg8COC;CW-wZOnw3;7f#gtFa_ z0b~FT0s(aZSO9CS(YP^gVJ^K_&1cF`hW5LnH66y)+h`s=5E z{nwv={&~c;?ISNYn{R*p=b!xej{>QJrnEgiUWYjBE;nC(`PKjB|MI{8xBspG+wpq* z$;0~(j>h954^R@Q3+9>zToHzWfPzSiujXR~MMPT$hYSbT(|_Ro3()?K zKUCPeMSKju$>=s#WYyUQfjnr$XBpI5ZR@LH?_(#Zx-PZ*$hI~Zo1n)pyLtQO&8vqW zeT)_l@!NiXy;y*Z0N#S=NjsGT1E$!F- zje;=R?#Tqe@UHz~_uQI2(0qOmL1Am6o01Mmf&JUwB<=ijYBe5IsM7qn8Z0Vykg}_= zc9!yb3()jdX6wDGY773VyAwji>aMkHx36A4+icI4?K!24f}%n|Mrialw?OU8QHUr@ z?GeQoLm|_E>Y81`5c_yyGmwWhB>9A`9n~xj>RGrMxPq z6X#_~?A3x8$Hu4D?nCzUYUjCPD0L7*LJX>qQ_>s+0uf%GUH z8be0NL^BOxbu_GwLQq5{B~)yD^~!v+bJY4YQbU^^@kx^y)zwGDZq<&(pnU*QXY$dl zq}Wf;?Yc#+TMxR{uU2af0hGE#9)MN~1f$wJK$r}GEVoV^8w_C8~2moA)T z+qFj(2#c{!C?AEQ$yY@H1@0bAUwry#8i&jP7%>h4uv@Ye8s}#JDD4tUYeC+IGx6QV zdhJ8nK!1WStH3NNRb9H;EY4cZqH;O;Lhy%as?1$R`b0)Q>ki-9FC zt2D19-4}YO!)Z=~#-M7Sfj~!vRe3L@7y*N7P$g0#;8t302d_&IuvI}+K$HP8AtPq3 zb(Eko0gWc=VIY#MX@Ovd-^dbFR*}xX{O&LRcmMaJyB|ILqkk2qyNF7=Wxds$I0Zpv zxmpE&^z_M#zxs>+!T;oc_`ms+|LFhu>CgW#fIRzt{qX+rN2lw7kZPz7fA-OxFCN|r znv`n8(~J2)swVU9`=VC#Z&LuMdeKZn-@LW?kib|E??I9 z&`|$S@GfY--S6IGRi1$7N1zJSsy@{8Ruc_*8MWRGEaFwoZn@~n9PV{$*NM>r=(gP^ zhypbZ3AJc2lS{c-r0x|O&tJS)mh_{0_gB+ORiSpHDocT-Zc@o6dUnBxvhiCf3Kfni zqQ)Uckiu&uZN&@}Bt%7n1>TwNN;Vi2`05W~Ta?1w)<8YUj&69jT_N*$W_c z^r3D|C-O2J8h&Mmq9(>^9+`lZeQyPh5F$mY@=B`fV;1p(Gc+$hs}-@8&pVXW+v5>I zj3W|xBh0Tci+1a(58?}<6_KeWUM8D|I>keyW>2m82CmDb!P~0`D85ZeQnp zo$ifk{|%e6cH8Zc*psck3^p5=xfw&`h21ZH65J}%EI^P+GdMdF&v z)HVL@y7t4}GmqP8mI^Pr{cC6BrvjbC^d0x^IC@jkoyy8HJvDl~Q z#Jpr8!VnEvn>Toj!@~#n?%X?7)l`6O7T8|lO=N{vZ{A*<=}r~9WBnlp5rlNW_{8g7 zosMz1+9!oTW&mExP*UZj3vnE1uz=9A^;)loVX&A=vyeeIj4BLnjvoJscDWZ>{1({5$ z6T%2O0*-8+yUPNUk+SHlAdq1fnB?jI=KuZu@x6!twfp#sKSI#sSFgT!!SDrcS+eHo z_~gO;kN@3&_doc5{ontsXD`n0efIOcE$gyuU%ucc&(=rl(fX+cl;nT$Kl97G_wSqx zM39BWc$qD85X>L+dPi;FE)cHjqz`SAYgx>8?oyGfptaF!Km8xPs8j=5R5F?(Ga>jODrjtgmaWB(W1As03D2?t&3Op=LK436iHtVH}#bhY2i& zg#g4zu-%;2+r>2+PP5pM(tP3?3lefwO<7{6gHEry5Y^+}nFm!xxi^R;v-E3X8x7&9 z4-b&?sjNH}6;2}1C)|?NMzv^FwGh@_!ri*|_U1fW)r{Ps>pOL8G@8j*gcu@o7E>#< z{dw1WJ#41q2caeWotx?6D}mVKngxQ`TI%rI47-)P9!ou|Xo_{j(6Tw~Uza7RT1!11 zpfyC?ZMR>4^VKr%w!8Bm|K!t?lT}$SYBDQg$P%~PWk^@)Bf;2OfA@nroxeS}*-ST_ zbLeW?5@vi)?7Yb;RA1-7N12d4N*k2$;2*Q_2Jl^5F}^zz6=;z7pWS}T&5yXkSxs>u{vnj9ML|t`V8$I z3TuwIdPZvhB4-t)fT~K0+l_qvtFKAn;lsNGSwJ8Xg*+}Hkc2P>8dO1$1Oubx+#p~m zB`5S`3{j`!I8zpUaNnwEx$D2tKzz3Xs{*)x65XmcgvN5(dGHF z-HIp+&+~kFv7P56YL!rBF7`Am0RzQ>!XWI)$Y8ZaE$t{N4;WPA5JNq!lvPkP1Vl4f z1w+Qkc=3t#BdwerICw#P8ZvpbYy40X+^0di$wEV5YEC{HbpEd zh}JY)tyU#c5+ZrPkf`Ojrj%GX73evRBVrBkB$OZ==e%0v2;dlG5+2L^nVlv-0%6t0 zPy~&j0n{=lk5t54^Sv8_dcT=Xw_8f}i}1{xRD*&P0pMC`Rhsgn;*nx8c@iQ~l113= zP){_p>vr{ntLfAiTgFPH!Jzw@72-JdV#SCp5dDX#CmeRJ_QUw-rU@_e<5 zX}3|;5F!h{y~r2aY-zO=fIz-_cJ`wmrSYTVpmPn*!-@#CF3Rkp0?>E;!WH@!6G~4L zFidJoS2b@WD5i(t8aAythn0KQ*qSZ3t6nbk{b*YR?Tz(A8YRk<6N+BMFtpZ4gbLC{ zkcl=t)EcK^nM2xuQOlP_XrAP1PpUHqYF}nD3k^cAVfe%%tut(;BWAt4+&+K$V%hCJ z`|R`8YE^D##ri_5TAFJ>%~u#9i@2no_ZK_yVXR)mHV*RjsY#Hk!52LA}O&rdmohVQh5@ za|U23$d}Ngxv+K8MElGzFb~e&{GxwgS9eR^QGdQ0_}6eF4FT!h0Bv<{2O{A+FiZW< zt*giZY5n&*DtDyx3qJ4%4o8o?P}^t7dC56-4ByVNAK;cE0_JiuQl7ti{ME(g`H%Ju zut)b}42CYuD4kV!Nhx2E`i5Zw4Dk0iZnfb{c89#uzm??=Z51LKYCO&JkZRJ@6iJ+3e9f_zJbXa(z zeXB(@RbW5}qHeF;HU=H*%t<(kSi1I5I1(zw_ngaX z5v_O?ONp8pQ*NY*8oC-FK-muszyoGN6;n<5U32rsfo|`vDx9_UhY;JA&9nbZry>@Q z4n!6M)~H$}!b?u`tfzO5)@$$469lae>4XBBQquB+!w@UmSQM5eq-A0`%6Xk-5(u4z z0RhBHGod0) z9YqK8p+H^i#EZf%Pb0nk^6UTSf9t>Z=>PVA$-8{{?TbHp^xz`FM@Og2-FvUc@V8H& zzc@P!NI5SmnlrO9P(TV?t%V{24HO?gfBWr|*AGsQj;Q)yt1y7picmZFKmaY5pd*L5 znxsJo#RfFG7&AeTYOEL_TJ>5{4)zg|pw6_A#K6|-!t_u}-?$Hc$eezDy*zeQIbZ+z363zE{ZEJ;N(CslEgtRSg~8F0J@&&$!W-09|byO1126Y4VWUOa!Y zy}XDFBZQnO%}GInX-7$sOvH)=q3WGI{tyd42~`8(G!0oGrwky30YhlSIF_V}eN3e7 z{k?twRPHclC(!%g%Aog}WThUkZLh=xCrTjNER>`-z;6*s?VHVA${q>&c1>CM?W?z6 zqkMGd&b_-2M%W2t*`60rhEWxP5u=793dcE~F0@KPa}Xqq7|@FnH#>E8fwcdjIHM2X zw?dp&67l8|gNQ0Ci!d*{<>JNbvlp-Dv+d^WV%}|qvx-__VxIH9!ZFXHN+2Laq-2!# zaU2087kF=wJ!OVsQ&$!OhC2P?v|5#CsS_3`4zW2@BT;3lVr)|b7I*i$9}}LY6%ozz zuBa10YG&qSJg42V7!S=9h6*IAOG*+ohCqtKtZHunO+AVv1F;H4(DiB@wwyAGb_8~n z+on40^c#rR-hH6n#{=b@lv7Siz%c-Xa^Xp4t56BE7I&2xwEuHYludL2{a&OfYMSg4ocNP_rS0mMQcrt zL6fKuWYw&?!jOQ(LSz+VspkZu32-fV%z6a4LZWM)m0=4AS=Na8_59}l_cstRuEs!- z!f<^0;O)5j=IrI`vsViX8J(;8BZOMy0x~~-5)^=WmhZoR@x`MD(}T4gb(A8%ps4OP z*v-58PFxiFUj*9r?{zk6Dh(+}p9oY0GiM0)6bJ;C1!35|p@>#9ZTUmqI_f6v_n;i? zt(EIiXlZ0F%Mz)iAnNG#jb&)n`Z78w%C;e9Q0vMFXPM`1Z8WeeI!cEjPyj+PTeEW7 zTK1XCt?W03th||bPhal+#9sXJm;dxWUe=3!ElQrir^ZqzP*Gsp9s7LUs;Bnh%zvrO z;p92Ju%r|zRPhvb5lsiT8;Y50S`R;S&PjM-&XTh(BD3NyEpuKVkU+;x25p|BKEbzC z8{(8juiN*r`nosvst?c}WghxfyZI3|xT)JG2KR`msAdRL!<3@Ub> z)U_GH=3FT(CL#8v!&j?5YM|J8_DYw|b`?54)#3O%!%}tb#SgD_{h&(6IlllY&%52u zJoH30YJCSVX%aVzGDNL@W`P?1NS_2C>c&c$o4vSE}1E z94-=l>Y42aOsaq>%k$^2zx?(0(`p@}CYeF=*!sOFOd*FnN4Olu?MQP#9pW?$I8X@W z6WM!DZ7&$t-+g0gLQWLsD@pmBQ%c+U{MDPYS8py~o~6w!Nmy8wTjPGW+dn0-VgW56 zS*11=QA$5OWwnE;rEU=@C=dgQyQCmg%FZ~(q5Ln#!45XjfTjH=D)xDuiqu+}pt_$K z&elhHyJHX9LO z7OQ9h^wuNYquW`ttpeR_g_bL8`paP)05lRwF2&-MQ{fjFrwu9KJPQ)k%UCj}%gq(m ztd>J%c7URg#d+a!<*jla8P+WOKcfgi{w$4(kU0E_I!M>mS?D?Lt@_C>Ebc@mlGq=WhZv$ulYrUA>V?_zL z9>$=4-!j{=}@HL{4S{=H>xkNXAP&Z7(PBV3dGl)A1N-KtK1 zKauG7(OxI?2Dknu9-i9H71B*%Ga=>7o6Ve4=~+J`tXIYce-fLlVH7)@8 z<4-#QGAa>jlGV@8h6R}F6g!gfRS{Uto~3GuC_!r{m{FS|L< zS##d(w&&Z8q#TG=JRalfBoM`*gaR^X2;k;5AgD;CKyrLE#Y~%wJ5dt}0aZwv(~>fa zqFC3rGtjr81u!z0;gPC+t$GbKyMnS$-0oOr?w-N+=VSoKLo(D`>SFM;oxN7wPylxO zHxe{TH*@&*n`cDB(a|)|yO5VVA>JQGn#M7P1iGW;a!i-&e0ik1K_%=?RydxFR^|;p z3mnpg4{}MB;J0q3H_KO15|Q0}{_^$qe6KXWym)oCXKL;?J6VKET~O7!=voSjDJ6B9 zJ+d+XSwv*sv4WZtim9tGkg%GOy9r0J{Ad&X55pDQM3bpD`#PzyD7<7uEKdlfsjg+- z#}ML@5?75Uios#Ud0}NW&kC4|BzPdSq$tS%%Ay!rY6$fK2`p6|vl_?MxZ=w#0H7DV zKP*WDdk1Z8=gui?o6T+WOzzr>Q)Ki$D=T?g94Q7RL8x)}cq3H8Z6yUzv0Ah$QU=cAin?l$ z5Rf4tt~DGJu2e&2!OAiYfC7q5=PY295s4%xN1M~}+vV)b^Vb(?$)rMxVx8Ig#>%lm zQI)!0Gpc03w-?)|&tLuWr=K3LM;4&^eu=~uWV<`w@C6FkhAQHSQSF}d%#cuQX@sqt+ z@Mk~&#nI7;6~!&nRK#DH@EU;I6+4dZi$x%cwI3y}gEw)KaB1pQGwOjDxJprnP*p%p zdfbLOycT3u&YF{?boHQIcVWr-ayKuF5RHO|2*due-{3V*mhuKVhivps?@g|Pk8&k6 zMitPFHz}frAOYL+(Z291iP6ps^s`+kRy}94e)qc-!Q`-H@U_{o8g%U3RIC^3J1K|_ z5FCiR8$7*zM(YOR`vaHp5SZe7>iMYdp;)gJ#1GbZ>kmJt0wtDZSww__Ph&1B%K56% z-i!Ebq%?207ev64{`61(<42D^`e**xf9mw)Bn!WN`({6Jzj^ce4}bB8AAR(ZB8V7Z zRde0jY*J2nwK|P)1&BXbfBY>ti_I?K(3H+kq1w1oG?1Kt;c=LZE3HCFrOzB%(QO^TOT@+U>vG?G#Xev`S3doev?ze%2OfBz5t1%l_(Z zsr(?iqg8jMs&@W$t#2iVd=GUQtFOBNVlyhJh39Rz=~sXA^*D{1c}mNJI8Jx(-n)AT zhCxJU3>T~2#p!Y>oR5bv2I0Vh0}xh?(|dZgc>OlpS;OB(E@T(32h8N%a{lV=#U5^6 zT<+oK<$f{WY&bIr3QJB|q)4n-i`u3t3(=`=EWlj5!D0HqGq~e6>f!q z^@^i9`4ddTJkodb#b0k;zmjE#niC6V*FiLwMC=%)_27%hc1bT^zs;k6K%H!?oJ4k|xX@e)o2*>h zYuRudsjb%O5^NFHdj9LI#MU6J*5BSt2PvbkL6tAbsGy>(In~orRYEA9?c*e20(6Yk z{=umUBC?+tzJ2ojSHJ%1_+&qa-Sve;r8%~BGJ3;MAr{-S`nm{;TndkBAJV%?h~0V! zDlAD8lv;c$XD7tavhr-J+GoFL`C~QRoNF+vMbI(l?KY(>up)J<%~py4kbau=o*jl* z>070rCQV7#3YPV=y8yhceb~ywpmGQ?57a;P6&p{?PPZ@DXo>>us^!gYUYoT|>$e@Y zx_pr~K8VdETHjCfen(@mVwZe{_#P6M+|ma>tX(xyLO=RyaF09?)VHhkj@Mh9R+@3B z73&Z7h@HC89tB&kQ`)hl5C&1JC0Fvc5wMtZDBd)!_MS^)Z(7Aq)(_|95C81X{^KR> ze)&hg+~dn}960BFh}K`ReD>LApM3hsJ`#p2f58$RDCI40cpOevtCQ+!)|c!0Xt56* z&23Z;&3s!Rigvp~fr@kpua&LXj!yfLhB&EK=?sN|KrNLwi(Sxn1KayrTb~kPe9gY| z;O&V1>hH|V`fG-IyIFYu@RmvU(n`~`zIXq@#nWe;X8@A2m?9$pUj_bbDWz$MVKv0s zutrrxinPL2R2(4=i(G6|7EO^B#ca#3$Sy5qf)6%Vvr20j5Y(NhTq{uk#G@L;vyZe1 zvHjlaW_&Ws%l7HS8t^@L6I6N+vUc?l*+H=Azd&p&tA%9?DkCPGU?frACJ4KIQs!wG za0jn)I?Kyhweyj{{-wzvBR*wYTQ)dax4UZi=q_i5j} zIp4gwxPqH|{rUOXyqzuGWJ#H?hL{uTlG*%^ZKkz_FR^fDbyaSS@CePtqnfsWG>}4Z z9AiLWKtvYV&AWL?B2vSMnac)JrOYRzOd}C^+KK{l4d%cYgOx2Bmmg5GNP)0QmtdEY? z)5?5mbu;thXWReePec6#tkTFjy~IhdMVo4?PT);orWG(+xz!+mI-LO(f}rzye4EXd za#SEcAyol2HLeSZ+Eq=qY0L{}f6lLW+mJe@RFh(@ zK~&BB1Vkh)rQ2aq1yyl{nRPd_sfX*??F3cQ;9T!~REupWB6h&r6NpfI-aA-}L3`wg zfQ<#z><9ao=4Nj270d_q-5!Apx zfe-y{3U3O(`RJ>gP9U)3jko<${EZEn)Gaoz42@z49mPeVSSqIdSe6hYbj4;7$-)2< zhwz7g_y;Ga>o33j@~{5tFMj^BUwrb(r!huRc=_tpzTtj;arVU*Ke~7C9ueBz=?8q? z&5S7HI2kFm?U;Yt{$tl{x=Fs&zQ*4}g!dCATZyzQ+H2qFyjHF`59vTjsfUT^_O(yQ zby09D|L$`A5H7IZLfB9}_z5)G`!uch=jH72i!6KvRf{AdXx-SG+DRJm9K~kya6amw;iWq(fNahctnI+|%lK=pPSjr^6+oVQJvTL@jL^Z?CmeDz-VyL9P z>9)xzs2c5?=Q%}+ejbstSaTmSKuh-kLagg0ml{+mIhlZ1=#r4KBwk_&LyUm}iZIlL zAy`?0f>GIG#63&rr}5-slb$^P8v<(!mRRRNRe7c&tadrC!?-$H57R2dtN#_DPoPLd zxSIB3wOX&HaTsFUe|dW6&hh%_>N&0{2_aAnSJA9jOy3yCAy62nakW}epny7rP=4># z-_{VArYXi~GfBSKT>SdmZ-?;a-}-m5U=U|~qqby<-sqsCFxq1}xXs)8*&@Fc_4)?` z^%V>OY{AGqb;2mg3qo$X5O!BQ3m z(RZOj2Q>vxYZ<=SB1{llyegT~%grc2zdyC*Z4ox;5D5_ekr@TV$9muX zV1xEHWa(}3R#@lqh;q)m-LgJfBUZFv)hTO#FUztzI%+Tn0&aI#tW7M_yQ+Np$)me> zPM$q~{`m3Zl+vR|ADj7H=Jf5i-|p{(pa1;lj~+f6t?ve`wM-|w`Bh3GhB%I^5LXr# z?0;3=db=+Kq67NRCiQZx%7G@vn5`X zGY&!^M6G4&#Q;{r!+LNbNxu{5EoUEP=%YF`$EDl&@+%SvH1 zSOK}~#fvD45-{W>Gv>0~Rv89R_lN6pFR5d&;JlCZvd;vlst5f2=`ALhKNX4C~+L(Fceg| ze-J}?;1s-##J*RAgy=tBR==P*e-BY*uU_ zTwCa3c++DVg{7CPd+*nUL}ij`UP{ei*fFLHgKGzXRMkx9uuIS1Y<92rTJ)E%74-i7 z2dAfZfG{x=RvZTkY%m*`5n~)s(N-?28aHK&1LOx#wY5rxts$nZ{OThGp3Z#HKX8Ia5sVp>f< z{^EP?NzqA(mBQ!; z=GL$buldva?hWzE3HMRHNJvD-r~4%HBR)T0#jBN;$OWs9N^yN!y*{cF&K-8>b zq+^OqdY%bpO$&?I2NU&rgx<(SXuD@smt^|4ZKibsCt4t5_03cy&>ok8H#fxRXr;#T z^xZMm1ZLEZ&IefM%tpY%8vewfq4bLa1~4PKBIXtq;7O|kUUN37gq;r;>-G722e(ifQ=tU#_|+qF5N{508s

OV&CssT!6gz}}El%r?Qg%B_jHQitj3|l-Q0**1r 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ℜ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�K+Dyr!E;NbS{ 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 literal 0 HcmV?d00001 diff --git a/app/locale/en.coffee b/app/locale/en.coffee index b5ad95322de..82b70a790c2 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -9,7 +9,8 @@ learn_more: "Learn more" classroom_in_a_box: "A classroom in-a-box for teaching computer science." codecombat_is: "CodeCombat is a platform for students to learn computer science while playing through a real game." - our_courses: "Our courses have been specifically playtested to excel in the classroom, even by teachers with little to no prior programming experience." + our_courses: "Our courses have been specifically playtested to excel in the classroom, even for teachers with little to no prior programming experience." + watch_how: "Watch how CodeCombat is transforming the way people learn computer science." top_screenshots_hint: "Students write code and see their changes update in real-time" designed_with: "Designed with teachers in mind" real_code: "Real, typed code" diff --git a/app/styles/home-view.sass b/app/styles/home-view.sass index 672418854a9..ff34ad9ed2d 100644 --- a/app/styles/home-view.sass +++ b/app/styles/home-view.sass @@ -101,24 +101,23 @@ #classroom-in-box-row margin: 40px 0 + h2 + line-height: 30px + margin-bottom: 18px - .top-screenshots - margin-bottom: 100px - margin-top: 50px - .label - color: black - display: block - .screenshots - text-align: center - .screenshot-grid - img - display: inline-block - margin: 6.5px - width: 800px - border-radius: 8px + .video-thumbnail + img + max-width: 100% + max-height: 100% + + .open-video-btn.video-text + color: inherit + text-decoration: underline + font-style: italic .teacher-screenshots padding: 10px + margin-bottom: 40px .label color: black display: block @@ -135,6 +134,33 @@ .modal-dialog width: auto max-width: 1024px + .modal-content + border: none + + #screenshot-carousel + .item + padding-left: 7.5% + padding-right: 7.5% + .carousel-control + background-color: black + opacity: 0.8 + width: 7.5% + .carousel-indicators + bottom: -40px + + .video-wrapper + position: relative + // Add a little to compensate for being slightly different aspect ratio than screenshots + padding-top: 2.4% + // Positioning magic to get it to fill the frame right + padding-bottom: 56.25% + height: 0 + iframe + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% #feature-spread-row .col-sm-4 diff --git a/app/templates/home-view.jade b/app/templates/home-view.jade index c8968e5b189..5a48a9f5c2d 100644 --- a/app/templates/home-view.jade +++ b/app/templates/home-view.jade @@ -73,21 +73,34 @@ block content .container#classroom-in-box-container #classroom-in-box-row.row .col-sm-6 - h2.text-navy(data-i18n="new_home.classroom_in_a_box") + a.open-video-btn.video-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='4') + img(src="/images/pages/home/video_thumb.png") .col-sm-6 + h2.text-navy(data-i18n="new_home.classroom_in_a_box") p(data-i18n="[html]new_home.codecombat_is") p(data-i18n="[html]new_home.our_courses") - - .top-screenshots - .screenshots - .hidden-sm.hidden-md.hidden-lg - small(data-i18n="new_home.top_screenshots_hint") - .screenshot-grid(title='Click to view full size') - a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='0') - img(src="/images/pages/about/desert.jpg") - .clearfix.hidden-xs - small(data-i18n="new_home.top_screenshots_hint") - + p + a.open-video-btn.video-text(data-toggle="modal", data-target="#screenshot-lightbox", data-index='4') + span(data-i18n="new_home.watch_how") + + .teacher-screenshots + .screenshots + .hidden-sm.hidden-md.hidden-lg + small(data-i18n="new_home.top_screenshots_hint") + .screenshot-grid(title='Click to view full size') + a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='0') + img(src="/images/pages/about/desert.jpg") + a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='1') + img(src="/images/pages/about/forest.jpg") + a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='2') + img(src="/images/pages/about/dungeon.jpg") + a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='3') + img(src="/images/pages/about/glacier.jpg") + .clearfix.hidden-xs + small(data-i18n="new_home.top_screenshots_hint") + + + .container #feature-spread-row.row.text-center h3(data-i18n="new_home.designed_with") .col-sm-4 @@ -195,20 +208,6 @@ block content else h3(data-i18n="new_home.request_demo_title") - .teacher-screenshots - .screenshots - .hidden-sm.hidden-md.hidden-lg - small(data-i18n="new_home.top_screenshots_hint") - .screenshot-grid(title='Click to view full size') - a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='1') - img(src="/images/pages/about/forest.jpg") - a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='2') - img(src="/images/pages/about/dungeon.jpg") - a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='3') - img(src="/images/pages/about/glacier.jpg") - .clearfix.hidden-xs - small(data-i18n="new_home.top_screenshots_hint") - if view.isTeacherWithDemo h4(data-i18n="new_home.get_started_subtitle") div @@ -319,10 +318,11 @@ block content .modal-content #screenshot-carousel.carousel ol.carousel-indicators - li(data-target=".screenshot-display", data-slide-to="0").active - li(data-target=".screenshot-display", data-slide-to="1") - li(data-target=".screenshot-display", data-slide-to="2") - li(data-target=".screenshot-display", data-slide-to="3") + li(data-target="#screenshot-carousel", data-slide-to="0").active + li(data-target="#screenshot-carousel", data-slide-to="1") + li(data-target="#screenshot-carousel", data-slide-to="2") + li(data-target="#screenshot-carousel", data-slide-to="3") + li(data-target="#screenshot-carousel", data-slide-to="4") .carousel-inner .item.active @@ -333,6 +333,9 @@ block content img#screenshot-dungeon(src="/images/pages/about/dungeon.jpg") .item img#screenshot-glacier(src="/images/pages/about/glacier.jpg") + .item.video-carousel-item + .video-wrapper + iframe.vimeo-player(src="https://player.vimeo.com/video/229304323" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen) a#carousel-left.left.carousel-control(href="#screenshot-carousel", role="button") span.glyphicon.glyphicons-chevron-left.glyphicon-chevron-left(aria-hidden="true") span.sr-only(data-i18n="about.previous") diff --git a/app/views/HomeView.coffee b/app/views/HomeView.coffee index 047500aba47..3e79fe22e98 100644 --- a/app/views/HomeView.coffee +++ b/app/views/HomeView.coffee @@ -8,6 +8,7 @@ utils = require 'core/utils' storage = require 'core/storage' {logoutUser, me} = require('core/auth') CreateAccountModal = require 'views/core/CreateAccountModal/CreateAccountModal' +application.moduleLoader.load('vendor/vimeo-player-js') # TODO: auto margin feature paragraphs @@ -17,6 +18,7 @@ module.exports = class HomeView extends RootView template: template events: + 'click .open-video-btn': 'onClickOpenVideoButton' 'click .play-btn': 'onClickPlayButton' 'change #school-level-dropdown': 'onChangeSchoolLevelDropdown' 'click .student-btn': 'onClickStudentButton' @@ -54,7 +56,6 @@ module.exports = class HomeView extends RootView else '/play' - onLoaded: -> @trialRequest = @trialRequests.first() if @trialRequests?.size() @isTeacherWithDemo = @trialRequest and @trialRequest.get('status') in ['approved', 'submitted'] @@ -64,6 +65,16 @@ module.exports = class HomeView extends RootView @openModalView(new CreateAccountModal({startOnPath: 'teacher'})) super() + onClickOpenVideoButton: (event) -> + unless @$('#screenshot-lightbox').data('bs.modal')?.isShown + event.preventDefault() + # Modal opening happens automatically from bootstrap + @$('#screenshot-carousel').carousel($(event.currentTarget).data("index")) + @vimeoPlayer.play() + + onCloseLightbox: -> + @vimeoPlayer.pause() + onClickLearnMoreLink: -> window.tracker?.trackEvent 'Homepage Click Learn More', category: 'Homepage', [] @scrollToLink('#classroom-in-box-container') @@ -106,12 +117,24 @@ module.exports = class HomeView extends RootView window.tracker?.trackEvent $(e.target).data('event-action'), category: 'Homepage', [] afterRender: -> + application.moduleLoader.loadPromises['vendor/vimeo-player-js'].then => + @vimeoPlayer = new Vimeo.Player(@$('.vimeo-player')[0]) @onChangeSchoolLevelDropdown() - @$('#screenshot-lightbox').modal() - @$('#screenshot-carousel').carousel({ - interval: 0 - keyboard: false - }) + @$('#screenshot-lightbox') + .modal() + .on 'hide.bs.modal', (e)=> + @vimeoPlayer.pause() + .on 'shown.bs.modal', (e)=> + if @$('.video-carousel-item').hasClass('active') + @vimeoPlayer.play() + @$('#screenshot-carousel') + .carousel({ + interval: 0 + keyboard: false + }) + .on 'slide.bs.carousel', (e) => + if not $(e.relatedTarget).hasClass('.video-carousel-item') + @vimeoPlayer.pause() $(window).on 'resize', @fitToPage @fitToPage() setTimeout(@fitToPage, 0) diff --git a/bower.json b/bower.json index ee0c9209042..b400d255e35 100644 --- a/bower.json +++ b/bower.json @@ -52,7 +52,8 @@ "promise-polyfill": "^5.2.1", "font-awesome": "fontawesome#^4.7.0", "fetch": "^2.0.2", - "file-saver": "^1.3.3" + "file-saver": "^1.3.3", + "vimeo-player-js": "^2.1.0" }, "overrides": { "algolia-autocomplete.js": { diff --git a/config.coffee b/config.coffee index 75b7fe9a47e..c7b25fa3cb4 100644 --- a/config.coffee +++ b/config.coffee @@ -121,7 +121,7 @@ exports.config = #- vendor.js, all the vendor libraries 'javascripts/vendor.js': [ regJoin('^vendor/scripts/(?!(Box2d|coffeescript|difflib|diffview|jasmine|co|' + gameLibraries + '))') - regJoin('^bower_components/(?!(aether|d3|treema|three.js|esper.js|jquery-ui|' + gameLibraries + '))') + regJoin('^bower_components/(?!(aether|d3|treema|three.js|esper.js|jquery-ui|vimeo-player-js|' + gameLibraries + '))') 'bower_components/treema/treema-utils.js' ] @@ -151,6 +151,7 @@ exports.config = 'javascripts/app/vendor/aether-java.js': 'bower_components/aether/build/java.js' 'javascripts/app/vendor/aether-python.js': 'bower_components/aether/build/python.js' 'javascripts/app/vendor/aether-html.js': 'bower_components/aether/build/html.js' + 'javascripts/app/vendor/vimeo-player-js.js': 'bower_components/vimeo-player-js/dist/player.min.js' # Any vendor libraries we don't want the client to load immediately 'javascripts/app/vendor/d3.js': regJoin('^bower_components/d3') From 6b99a216f855f69fcfaf846ff399473f72fe2d1f Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Mon, 14 Aug 2017 16:21:33 -0700 Subject: [PATCH 026/227] Revert "PayPal subscriptions" This reverts commit 368b462c1d031c21beaae4278dafdc97e762c0e7. --- app/core/Router.coffee | 4 - app/core/api/users.coffee | 26 +- app/core/utils.coffee | 3 - app/locale/en.coffee | 6 +- app/models/Product.coffee | 5 +- app/models/User.coffee | 13 +- app/schemas/models/patch.coffee | 1 - app/schemas/models/product.schema.coffee | 7 - app/schemas/models/user.coffee | 7 - app/templates/account/subscription-view.jade | 6 +- app/templates/core/subscribe-modal.jade | 3 - app/templates/i18n/i18n-home-view.jade | 2 +- app/views/account/SubscriptionView.coffee | 187 ++--- app/views/admin/AnalyticsView.coffee | 6 +- app/views/core/SubscribeModal.coffee | 24 - app/views/i18n/I18NEditProductView.coffee | 23 - app/views/i18n/I18NHomeView.coffee | 10 +- app/views/play/CampaignView.coffee | 10 - scripts/analytics/mixpanelABGemPrompt.py | 2 +- scripts/analytics/mixpanelABSubscribeCopy.py | 2 +- server/commons/mapping.coffee | 1 - server/lib/paypal.coffee | 1 - server/middleware/products.coffee | 3 - server/middleware/subscriptions.coffee | 100 +-- server/middleware/users.coffee | 4 +- server/models/Product.coffee | 12 - server/models/User.coffee | 14 +- server/routes/index.coffee | 8 - server/routes/paypal.coffee | 77 -- .../functional/subscription.spec.coffee | 783 ++---------------- spec/server/functional/user.spec.coffee | 134 ++- spec/server/unit/subscriptions.spec.coffee | 7 +- test/app/collections/Products.spec.coffee | 14 - 33 files changed, 246 insertions(+), 1259 deletions(-) delete mode 100644 app/views/i18n/I18NEditProductView.coffee delete mode 100644 server/routes/paypal.coffee delete mode 100644 test/app/collections/Products.spec.coffee diff --git a/app/core/Router.coffee b/app/core/Router.coffee index b2d23329361..53bb1af2174 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -138,7 +138,6 @@ module.exports = class CocoRouter extends Backbone.Router 'i18n/campaign/:handle': go('i18n/I18NEditCampaignView') 'i18n/poll/:handle': go('i18n/I18NEditPollView') 'i18n/course/:handle': go('i18n/I18NEditCourseView') - 'i18n/product/:handle': go('i18n/I18NEditProductView') 'identify': go('user/IdentifyView') 'il-signup': go('account/IsraelSignupView') @@ -147,9 +146,6 @@ module.exports = class CocoRouter extends Backbone.Router 'logout': 'logout' - 'paypal/subscribe-callback': go('play/CampaignView') - 'paypal/cancel-callback': go('account/SubscriptionView') - 'play(/)': go('play/CampaignView', { redirectStudents: true, redirectTeachers: true }) # extra slash is to get Facebook app to work 'play/ladder/:levelID/:leagueType/:leagueID': go('ladder/LadderView') 'play/ladder/:levelID': go('ladder/LadderView') diff --git a/app/core/api/users.coffee b/app/core/api/users.coffee index c9dc07eb50c..39c0a5387ff 100644 --- a/app/core/api/users.coffee +++ b/app/core/api/users.coffee @@ -2,13 +2,13 @@ fetchJson = require './fetch-json' module.exports = { url: (userID, path) -> if path then "/db/user/#{userID}/#{path}" else "/db/user/#{userID}" - + getByHandle: (handle, options) -> fetchJson("/db/user/#{handle}", options) getByEmail: ({ email }, options={}) -> fetchJson("/db/user", _.merge {}, options, { data: { email } }) - + signupWithPassword: ({userID, name, email, password}, options={}) -> fetchJson(@url(userID, 'signup-with-password'), _.assign({}, options, { method: 'POST' @@ -34,34 +34,16 @@ module.exports = { .then -> window.tracker?.trackEvent 'Google Login', category: "Signup", label: 'GPlus' window.tracker?.trackEvent 'Finished Signup', category: "Signup", label: 'GPlus' - + put: (user, options={}) -> fetchJson(@url(user._id), _.assign({}, options, { method: 'PUT' json: user })) - + resetProgress: (options={}) -> store = require('core/store') fetchJson(@url(store.state.me._id, 'reset_progress'), _.assign({}, options, { method: 'POST' })) - - createBillingAgreement: ({userID, productID}, options={}) -> - fetchJson(@url(userID, "paypal/create-billing-agreement"), _.assign({}, options, { - method: 'POST' - json: {productID} - })) - - executeBillingAgreement: ({userID, token}, options={}) -> - fetchJson(@url(userID, "paypal/execute-billing-agreement"), _.assign({}, options, { - method: 'POST' - json: {token} - })) - - cancelBillingAgreement: ({userID, billingAgreementID}, options={}) -> - fetchJson(@url(userID, "paypal/cancel-billing-agreement"), _.assign({}, options, { - method: 'POST' - json: {billingAgreementID} - })) } diff --git a/app/core/utils.coffee b/app/core/utils.coffee index e11b6ef63f9..1183d802f90 100644 --- a/app/core/utils.coffee +++ b/app/core/utils.coffee @@ -230,8 +230,6 @@ getByPath = (target, path) -> isID = (id) -> _.isString(id) and id.length is 24 and id.match(/[a-f0-9]/gi)?.length is 24 -isRegionalSubscription = (name) -> /_basic_subscription/.test(name) - isSmokeTestEmail = (email) -> /@example.com/.test(email) or /smoketest/.test(email) or /@codecombat.com/.test(email) @@ -681,7 +679,6 @@ module.exports = { initializeACE injectCSS isID - isRegionalSubscription isSmokeTestEmail keepDoingUntil kindaEqual diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 82b70a790c2..9cec5b91498 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -328,7 +328,6 @@ default_code: "Default Code" loading: "Loading..." overview: "Overview" - processing: "Processing..." solution: "Solution" table_of_contents: "Table of Contents" intro: "Intro" @@ -651,7 +650,6 @@ prompt_body: "Keep playing to earn more!" subscribe: - confirmation: "Congratulations! You now have a CodeCombat Premium Subscription!" premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Become a Master Coder - subscribe to Premium today!" @@ -724,10 +722,9 @@ support_part1: "Need help with payment options? Email" support_part2: "support@codecombat.com" support_part3: "if you have any questions." - you_are_purchasing_monthly_sub: "You're purchasing a Monthly Premium Subscription!" you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" - you_will_be_charged: "You will be charged $__priceString__" # {change} + you_will_be_charged: "You will be charged $__priceString__ one time." choose_payment_method: "Choose Payment Method" pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" paypal_payment_error: "We encountered an error while charging PayPal." @@ -777,7 +774,6 @@ premium_features: get_premium: "Get
CodeCombat
Premium" # Fit into the banner on the /features page master_coder: "Become a Master Coder by subscribing today!" - paypal_redirect: "You will be redirected to PayPal to complete the subscription process." subscribe_now: "Subscribe Now" hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" diff --git a/app/models/Product.coffee b/app/models/Product.coffee index b0b068f5786..e68b5a9c071 100644 --- a/app/models/Product.coffee +++ b/app/models/Product.coffee @@ -1,13 +1,10 @@ CocoModel = require './CocoModel' -utils = require 'core/utils' module.exports = class ProductModel extends CocoModel @className: 'Product' @schema: require 'schemas/models/product.schema' urlRoot: '/db/products' - isRegionalSubscription: (name) -> utils.isRegionalSubscription(name ? @get('name')) - priceStringNoSymbol: -> (@get('amount') / 100).toFixed(2) adjustedPriceStringNoSymbol: -> @@ -29,6 +26,7 @@ module.exports = class ProductModel extends CocoModel return i18n.translate('subscribe.lifetime') @get('name') + # Send the Stripe token purchase: (token, options={}) -> options.url = _.result(@, 'url') + '/purchase' options.method = 'POST' @@ -46,3 +44,4 @@ module.exports = class ProductModel extends CocoModel paymentID: payment.id payerID: payment.payer.payer_info.payer_id }, options)) + diff --git a/app/models/User.coffee b/app/models/User.coffee index 4f31577e3db..0cf0c7df40f 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -212,14 +212,11 @@ module.exports = class User extends CocoModel return me.get('testGroupNumber') % numVideos hasSubscription: -> - if payPal = @get('payPal') - return payPal.billingAgreementID - else if stripe = @get('stripe') - return true if stripe.sponsorID - return true if stripe.subscriptionID - return true if stripe.free is true - return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) - false + return false unless stripe = @get('stripe') + return true if stripe.sponsorID + return true if stripe.subscriptionID + return true if stripe.free is true + return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) isPremium: -> return true if me.isInGodMode() diff --git a/app/schemas/models/patch.coffee b/app/schemas/models/patch.coffee index a5c0698c6d5..a4ea3dcf9b2 100644 --- a/app/schemas/models/patch.coffee +++ b/app/schemas/models/patch.coffee @@ -9,7 +9,6 @@ patchables = [ 'level_component' 'level_system' 'poll' - 'product' 'thang_type' ] diff --git a/app/schemas/models/product.schema.coffee b/app/schemas/models/product.schema.coffee index 3fdced4a8f8..29710ccb1e0 100644 --- a/app/schemas/models/product.schema.coffee +++ b/app/schemas/models/product.schema.coffee @@ -4,10 +4,7 @@ module.exports = ProductSchema = { type: 'object' additionalProperties: false properties: { - i18n: {type: 'object', title: 'i18n', format: 'i18n', props: ['displayName', 'displayDescription' ]} name: { type: 'string' } - displayName: { type: 'string' } - displayDescription: {type: 'string'} amount: { type: 'integer', description: 'Cost in cents' } gems: { type: 'integer', description: 'Number of gems awarded' } coupons: { @@ -21,11 +18,7 @@ module.exports = ProductSchema = { } } } - planID: { type: 'string', description: 'Probably should remove this' } - payPalBillingPlanID: { type: 'string' } } } c.extendBasicProperties ProductSchema, 'Product' -c.extendTranslationCoverageProperties ProductSchema -c.extendPatchableProperties ProductSchema diff --git a/app/schemas/models/user.coffee b/app/schemas/models/user.coffee index c32febf5900..8a06ef64e1c 100644 --- a/app/schemas/models/user.coffee +++ b/app/schemas/models/user.coffee @@ -311,13 +311,6 @@ _.extend UserSchema.properties, spent: {type: 'number'} stripeCustomerID: { type: 'string' } # TODO: Migrate away from this property - payPal: c.object {}, { - payerID: { type: 'string' } - billingAgreementID: { type: 'string', description: 'Set if user has PayPal monthly subscription' } - subscribeDate: c.date() - cancelDate: c.date() - } - stripe: c.object {}, { customerID: { type: 'string' } planID: { enum: ['basic'], description: 'Determines if a user has or wants to subscribe' } diff --git a/app/templates/account/subscription-view.jade b/app/templates/account/subscription-view.jade index 9fd69311675..002b0454ffb 100644 --- a/app/templates/account/subscription-view.jade +++ b/app/templates/account/subscription-view.jade @@ -104,10 +104,6 @@ block content tr th(data-i18n="account.card") td= view.personalSub.card - if view.personalSub.service - tr - th(data-i18n="account.service") - td= view.personalSub.service else if view.personalSub.free === true @@ -133,8 +129,8 @@ block content span.spr(data-i18n="account_prepaid.you_can1") a(href="/account/prepaid", data-i18n="account_prepaid.you_can2") span.spl(data-i18n="account_prepaid.you_can3") - //- Sponsored Subscriptions + .panel.panel-default .panel-heading h3(data-i18n="subscribe.managed_subs") diff --git a/app/templates/core/subscribe-modal.jade b/app/templates/core/subscribe-modal.jade index 3e41c87e303..cbab6b0d49e 100644 --- a/app/templates/core/subscribe-modal.jade +++ b/app/templates/core/subscribe-modal.jade @@ -53,9 +53,6 @@ .option-header.text-center(data-i18n="subscribe.stripe_description") +price("subscribe.month_price", view.basicProduct) button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") - if view.basicProduct.isRegionalSubscription() - //- Warn about PayPal redirect, which is only used for regional subscriptions - .small(data-i18n="premium_features.paypal_redirect") else - var secondRowClass = '.col-xs-12' diff --git a/app/templates/i18n/i18n-home-view.jade b/app/templates/i18n/i18n-home-view.jade index dd7784be61e..5e14b40e329 100644 --- a/app/templates/i18n/i18n-home-view.jade +++ b/app/templates/i18n/i18n-home-view.jade @@ -26,7 +26,7 @@ block content tr td - a(href=model.i18nURLBase+(model.get('slug') || model.id))= model.get('displayName') || model.get('name') + a(href=model.i18nURLBase+model.get('slug'))= model.get('name') td= translatedName td= model.constructor.className td(class=model.specificallyCovered ? 'success' : 'danger')= model.specificallyCovered ? 'Yes' : 'No' diff --git a/app/views/account/SubscriptionView.coffee b/app/views/account/SubscriptionView.coffee index 9c2c7345cf3..ce6ab717190 100644 --- a/app/views/account/SubscriptionView.coffee +++ b/app/views/account/SubscriptionView.coffee @@ -3,13 +3,12 @@ template = require 'templates/account/subscription-view' CocoCollection = require 'collections/CocoCollection' Products = require 'collections/Products' Product = require 'models/Product' -payPal = require('core/services/paypal') + SubscribeModal = require 'views/core/SubscribeModal' Payment = require 'models/Payment' stripeHandler = require 'core/services/stripe' User = require 'models/User' utils = require 'core/utils' -api = require 'core/api' # TODO: Link to sponsor id /user/userID instead of plain text name # TODO: Link to sponsor email instead of plain text email @@ -83,7 +82,7 @@ module.exports = class SubscriptionView extends RootView onClickConfirmEndSubscription: (e) -> message = @$el.find('.unsubscribe-feedback textarea').val().trim() - @personalSub.unsubscribe(message, => @render?()) + @personalSub.unsubscribe(message) # Sponsored subscriptions @@ -172,138 +171,94 @@ class PersonalSub render() me.patch({headers: {'X-Change-Plan': 'true'}}) - unsubscribe: (message, render) -> - removeSub = => - payPalInfo = me.get('payPal') + unsubscribe: (message) -> + removeStripe = => stripeInfo = _.clone(me.get('stripe')) - if stripeInfo - delete stripeInfo.planID - me.set('stripe', stripeInfo) - me.once 'sync', -> - window.tracker?.trackEvent 'Unsubscribe End', message: message - document.location.reload() - me.patch({headers: {'X-Change-Plan': 'true'}}) - else if payPalInfo?.billingAgreementID - api.users.cancelBillingAgreement({userID, billingAgreementID: payPalInfo?.billingAgreementID}) - .then (response) => - window.tracker?.trackEvent 'Unsubscribe End', message: message - document.location.reload() - .catch (jqxhr) => - console.error('PayPal unsubscribe', jqxhr) - - else - console.error "Tried to unsubscribe without PayPal or Stripe user info." - @state = 'unknown_error' - @stateMessage = "You do not appear to be subscribed." - render() + delete stripeInfo.planID + me.set('stripe', stripeInfo) + me.once 'sync', -> + window.tracker?.trackEvent 'Unsubscribe End', message: message + document.location.reload() + me.patch({headers: {'X-Change-Plan': 'true'}}) if message $.post '/contact', message: message, subject: 'Cancellation', (response) -> - removeSub() + removeStripe() else - removeSub() + removeStripe() update: (render) -> - stripeInfo = me.get('stripe') - payPalInfo = me.get('payPal') - return unless stripeInfo or payPalInfo + return unless stripeInfo = me.get('stripe') @state = 'loading' - if stripeInfo - if stripeInfo.sponsorID - @sponsor = true - onSubSponsorSuccess = (sponsorInfo) => - @sponsorEmail = sponsorInfo.email - @sponsorName = sponsorInfo.name - @sponsorID = stripeInfo.sponsorID - if sponsorInfo.subscription.cancel_at_period_end - @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) - delete @state - render() - @supermodel.addRequestResource('sub_sponsor', { - url: '/db/user/-/sub_sponsor' - method: 'POST' - success: onSubSponsorSuccess - }, 0).load() - - else if stripeInfo.prepaidCode - @usingPrepaidCode = true + if stripeInfo.sponsorID + @sponsor = true + onSubSponsorSuccess = (sponsorInfo) => + @sponsorEmail = sponsorInfo.email + @sponsorName = sponsorInfo.name + @sponsorID = stripeInfo.sponsorID + if sponsorInfo.subscription.cancel_at_period_end + @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) delete @state render() + @supermodel.addRequestResource('sub_sponsor', { + url: '/db/user/-/sub_sponsor' + method: 'POST' + success: onSubSponsorSuccess + }, 0).load() + + else if stripeInfo.prepaidCode + @usingPrepaidCode = true + delete @state + render() - else if stripeInfo.subscriptionID - @self = true - @active = me.isPremium() - @subscribed = stripeInfo.planID? - - options = { cache: false, url: "/db/user/#{me.id}/stripe" } - options.success = (info) => - if card = info.card - @card = "#{card.brand}: x#{card.last4}" - if sub = info.subscription - periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) - if sub.cancel_at_period_end - @activeUntil = periodEnd - else if sub.discount?.coupon?.id isnt 'free' - @nextPaymentDate = periodEnd - # NOTE: This checks the product list for one that corresponds to their - # country. This will not work for "free" or "halfsies" because there - # are not products that correspond to those. - # NOTE: This does NOT use the "amount" of the coupon in this client side calculation - # (those should be kept up to date on the server) - # TODO: Calculate and return the true price on the server side, and use that as a source of truth - if sub.discount?.coupon?.id - productName = "#{sub.discount?.coupon?.id}_basic_subscription" - else - productName = "basic_subscription" - product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) - if product - @cost = "$#{(product.get('amount')/100).toFixed(2)}" - else - @cost = "$#{(sub.plan.amount/100).toFixed(2)}" - else - console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" - delete @state - render() - @supermodel.addRequestResource('personal_payment_info', options).load() - - payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - payments.once 'sync', -> - @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length - render() - @supermodel.loadCollection(payments, 'payments', {cache: false}) - - else if stripeInfo.free - @free = stripeInfo.free + else if stripeInfo.subscriptionID + @self = true + @active = me.isPremium() + @subscribed = stripeInfo.planID? + + options = { cache: false, url: "/db/user/#{me.id}/stripe" } + options.success = (info) => + if card = info.card + @card = "#{card.brand}: x#{card.last4}" + if sub = info.subscription + periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) + if sub.cancel_at_period_end + @activeUntil = periodEnd + else if sub.discount?.coupon?.id isnt 'free' + @nextPaymentDate = periodEnd + # NOTE: This checks the product list for one that corresponds to their + # country. This will not work for "free" or "halfsies" because there + # are not products that correspond to those. + # NOTE: This does NOT use the "amount" of the coupon in this client side calculation + # (those should be kept up to date on the server) + # TODO: Calculate and return the true price on the server side, and use that as a source of truth + if sub.discount?.coupon?.id + productName = "#{sub.discount?.coupon?.id}_basic_subscription" + else + productName = "basic_subscription" + product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) + if product + @cost = "$#{(product.get('amount')/100).toFixed(2)}" + else + @cost = "$#{(sub.plan.amount/100).toFixed(2)}" + else + console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" delete @state render() + @supermodel.addRequestResource('personal_payment_info', options).load() - else - delete @state + payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) + payments.once 'sync', -> + @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length render() + @supermodel.loadCollection(payments, 'payments', {cache: false}) - else if payPalInfo?.billingAgreementID - @self = true - @active = true - @subscribed = true - @service = "PayPal" + else if stripeInfo.free + @free = stripeInfo.free delete @state render() - payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - payments.once 'sync', => - try - @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length - lastPayment = _.last(_.sortBy(_.filter(payments.models, (p) -> /basic_subscription/ig.test(p.get('productID'))), (p) -> p.get('created'))) - if lastPayment - @nextPaymentDate = new Date(lastPayment.get('created')) - @nextPaymentDate.setUTCMonth(@nextPaymentDate.getUTCMonth() + 1) - @cost = "$#{(lastPayment.get('amount')/100).toFixed(2)}" - render() - else - console.error("No subscription payments found!") - catch err - console.error(JSON.stringify(err)) - @supermodel.loadCollection(payments, 'payments', {cache: false}) + else delete @state render() diff --git a/app/views/admin/AnalyticsView.coffee b/app/views/admin/AnalyticsView.coffee index b8061a2b3f9..c177822c56d 100644 --- a/app/views/admin/AnalyticsView.coffee +++ b/app/views/admin/AnalyticsView.coffee @@ -127,13 +127,13 @@ module.exports = class AnalyticsView extends RootView revenueGroupFromPayment = (payment) -> product = payment.productID or payment.service - if payment.productID is 'lifetime_subscription' + if payment.productID is 'lifetime_subcription' product = "usa lifetime" else if /_lifetime_subscription/.test(payment.productID) product = "intl lifetime" - else if payment.productID is 'basic_subscription' + else if payment.productID is 'basic_subcription' product = "usa monthly" - else if /_basic_subscription/.test(payment.productID) + else if /_basic_subcription/.test(payment.productID) product = "intl monthly" else if /gems/.test(payment.productID) product = "gems" diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index 4fe7bcb1034..f816578bd2c 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -1,4 +1,3 @@ -api = require 'core/api' ModalView = require 'views/core/ModalView' template = require 'templates/core/subscribe-modal' stripeHandler = require 'core/services/stripe' @@ -127,29 +126,6 @@ module.exports = class SubscribeModal extends ModalView return unless @basicProduct @playSound 'menu-button-click' return @openModalView new CreateAccountModal() if me.get('anonymous') - if @basicProduct.isRegionalSubscription() - @startPayPalSubscribe() - else - @startStripeSubscribe() - - startPayPalSubscribe: -> - application.tracker?.trackEvent 'Started subscription purchase', { service: 'paypal' } - $('.purchase-button').addClass("disabled") - $('.purchase-button').html($.i18n.t('common.processing')) - api.users.createBillingAgreement({userID: me.id, productID: @basicProduct.id}) - .then (billingAgreement) => - for link in billingAgreement.links - if link.rel is 'approval_url' - application.tracker?.trackEvent 'Continue subscription purchase', { service: 'paypal', redirectUrl: link.href } - window.location = link.href - return - throw new Error("PayPal billing agreement has no redirect link #{JSON.stringify(billingAgreement)}") - .catch (jqxhr) => - $('.purchase-button').removeClass("disabled") - $('.purchase-button').html($.i18n.t('premium_features.subscribe_now')) - @onSubscriptionError(jqxhr) - - startStripeSubscribe: -> application.tracker?.trackEvent 'Started subscription purchase', { service: 'stripe' } options = @stripeOptions { description: $.i18n.t('subscribe.stripe_description') diff --git a/app/views/i18n/I18NEditProductView.coffee b/app/views/i18n/I18NEditProductView.coffee deleted file mode 100644 index fb8bc858e29..00000000000 --- a/app/views/i18n/I18NEditProductView.coffee +++ /dev/null @@ -1,23 +0,0 @@ -I18NEditModelView = require './I18NEditModelView' -Product = require 'models/Product' -deltasLib = require 'core/deltas' -Patch = require 'models/Patch' -Patches = require 'collections/Patches' -PatchModal = require 'views/editor/PatchModal' - -# TODO: Apply these changes to all i18n views if it proves to be more reliable - -module.exports = class I18NEditProductView extends I18NEditModelView - id: "i18n-edit-product-view" - modelClass: Product - - buildTranslationList: -> - lang = @selectedLanguage - - # name, description - if i18n = @model.get('i18n') - if name = @model.get('displayName') - @wrapRow 'Product short name', ['displayName'], name, i18n[lang]?.displayName, [] - if description = @model.get('displayDescription') - @wrapRow 'Product description', ['displayDescription'], description, i18n[lang]?.displayDescription, [] - diff --git a/app/views/i18n/I18NHomeView.coffee b/app/views/i18n/I18NHomeView.coffee index 848e802fcc6..60fc51a7a55 100644 --- a/app/views/i18n/I18NHomeView.coffee +++ b/app/views/i18n/I18NHomeView.coffee @@ -2,8 +2,6 @@ RootView = require 'views/core/RootView' template = require 'templates/i18n/i18n-home-view' CocoCollection = require 'collections/CocoCollection' Courses = require 'collections/Courses' -Products = require 'collections/Products' -Product = require 'models/Product' LevelComponent = require 'models/LevelComponent' ThangType = require 'models/ThangType' @@ -42,9 +40,8 @@ module.exports = class I18NHomeView extends RootView @campaigns = new CocoCollection([], { url: '/db/campaign?view=i18n-coverage', project: project, model: Campaign }) @polls = new CocoCollection([], { url: '/db/poll?view=i18n-coverage', project: project, model: Poll }) @courses = new Courses() - @products = new CocoCollection([], { url: '/db/products?view=i18n-coverage', project: project, model: Product }) - for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses, @products] + for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses] c.skip = 0 c.fetch({data: {skip: 0, limit: PAGE_SIZE}, cache:false}) @supermodel.loadCollection(c, 'documents') @@ -61,7 +58,6 @@ module.exports = class I18NHomeView extends RootView when 'Campaign' then '/i18n/campaign/' when 'Poll' then '/i18n/poll/' when 'Course' then '/i18n/course/' - when 'Product' then '/i18n/product/' getMore = collection.models.length is PAGE_SIZE @aggregateModels.add(collection.models) @render() @@ -95,9 +91,9 @@ module.exports = class I18NHomeView extends RootView updateCoverageForModel: (model, relatedLanguages) -> model.specificallyCovered = true model.generallyCovered = true - coverage = model.get('i18nCoverage') ? [] + coverage = model.get('i18nCoverage') - unless @selectedLanguage in coverage + if @selectedLanguage not in coverage model.specificallyCovered = false if not _.any((l in coverage for l in relatedLanguages)) model.generallyCovered = false diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 2c628d12de3..793ccbde019 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -31,7 +31,6 @@ Classroom = require 'models/Classroom' Course = require 'models/Course' CourseInstance = require 'models/CourseInstance' Levels = require 'collections/Levels' -payPal = require('core/services/paypal') require 'game-libraries' @@ -95,15 +94,6 @@ module.exports = class CampaignView extends RootView me.patch() pixelCode = if @terrain is 'game-dev-hoc' then 'code_combat_gamedev' else 'code_combat' $('body').append($("")) - else if location.pathname is '/paypal/subscribe-callback' - api.users.executeBillingAgreement({userID: me.id, token: utils.getQueryVariable('token')}) - .then (billingAgreement) => - value = Math.round(parseFloat(billingAgreement?.plan?.payment_definitions?[0].amount?.value ? 0) * 100) - application.tracker?.trackEvent 'Finished subscription purchase', { value, service: 'paypal' } - noty({text: $.i18n.t('subscribe.confirmation'), layout: 'topCenter', timeout: 8000}) - me.fetch(cache: false, success: => @render?()) - .catch (err) => - console.error(err) # HoC: Fake us up a "mode" for HeroVictoryModal to return hero without levels realizing they're in a copycat campaign, or clear it if we started playing. shouldReturnToGameDevHoc = @terrain is 'game-dev-hoc' diff --git a/scripts/analytics/mixpanelABGemPrompt.py b/scripts/analytics/mixpanelABGemPrompt.py index 026236794c1..43682f4ea9c 100644 --- a/scripts/analytics/mixpanelABGemPrompt.py +++ b/scripts/analytics/mixpanelABGemPrompt.py @@ -88,7 +88,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished gem purchase'] > 1: - # print "User multiple subscription purchases?" + # print "User multiple subcription purchases?" # print item elif item['Started purchase'] > 0: started += 1 diff --git a/scripts/analytics/mixpanelABSubscribeCopy.py b/scripts/analytics/mixpanelABSubscribeCopy.py index b711890e2a8..16f406ed9e9 100644 --- a/scripts/analytics/mixpanelABSubscribeCopy.py +++ b/scripts/analytics/mixpanelABSubscribeCopy.py @@ -87,7 +87,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished subscription purchase'] > 1: - # print "User multiple subscription purchases?" + # print "User multiple subcription purchases?" # print item elif item['Started subscription purchase'] > 0: started += 1 diff --git a/server/commons/mapping.coffee b/server/commons/mapping.coffee index 9438487673a..1b55b664363 100644 --- a/server/commons/mapping.coffee +++ b/server/commons/mapping.coffee @@ -53,7 +53,6 @@ module.exports.routes = 'routes/github' 'routes/languages' 'routes/mail' - 'routes/paypal' 'routes/sprites' 'routes/queue' 'routes/stripe' diff --git a/server/lib/paypal.coffee b/server/lib/paypal.coffee index fd493f93c9a..6cbf469b000 100644 --- a/server/lib/paypal.coffee +++ b/server/lib/paypal.coffee @@ -8,7 +8,6 @@ paypal.configure({ 'client_secret': config.paypal.clientSecret }) -Promise.promisifyAll(paypal.billingAgreement) Promise.promisifyAll(paypal.payment) module.exports = paypal diff --git a/server/middleware/products.coffee b/server/middleware/products.coffee index 00e4f8d8066..7880a3ee481 100644 --- a/server/middleware/products.coffee +++ b/server/middleware/products.coffee @@ -18,7 +18,6 @@ get = wrap (req, res) -> # Remove old unsupported subscription products products = _.filter products, (p) -> p.name not in ['year_subscription', 'lifetime_subscription2'] - products = _.filter(products, (p) -> p.i18nCoverage?) if req.query.view is 'i18n-coverage' for p in products if p.coupons? @@ -69,7 +68,6 @@ productStubs = [ amount: 100 gems: 3500 planID: 'basic' - payPalBillingPlanID: 'P-23R58281B73475317X2K7B4A' } { @@ -99,7 +97,6 @@ productStubs = [ amount: 0 gems: 1500 planID: 'basic' - payPalBillingPlanID: 'P-2KP02511G2731913DX2K4IKA' } { diff --git a/server/middleware/subscriptions.coffee b/server/middleware/subscriptions.coffee index 1ef5ab01ffa..bc0cf6732d4 100644 --- a/server/middleware/subscriptions.coffee +++ b/server/middleware/subscriptions.coffee @@ -10,11 +10,10 @@ Product = require '../models/Product' Payment = require '../models/Payment' User = require '../models/User' database = require '../commons/database' -{ getSponsoredSubsAmount, isRegionalSubscription } = require '../../app/core/utils' +{ getSponsoredSubsAmount } = require '../../app/core/utils' StripeUtils = require '../lib/stripe_utils' slack = require '../slack' paypal = require '../lib/paypal' -{isProduction} = require '../../server_config' subscribeWithPrepaidCode = expressWrap (req, res) -> { ppc } = req.body @@ -32,8 +31,6 @@ subscribeWithPrepaidCode = expressWrap (req, res) -> subscribeUser = co.wrap (req, user) -> if (not req.user) or req.user.isAnonymous() or user.isAnonymous() throw new errors.Unauthorized('You must be signed in to subscribe.') - if user.get('payPal.billingAgreementID') - throw new errors.Forbidden('You already have a PayPal subscription.') # NOTE: This token is really a stripe token *id* { token, prepaidCode } = req.body.stripe @@ -223,9 +220,6 @@ purchaseProduct = expressWrap (req, res) -> unless /lifetime_subscription$/.test productName throw new errors.UnprocessableEntity('Unsupported product') - if req.user.get('payPal.billingAgreementID') - throw new errors.Forbidden('You already have a PayPal subscription.') - # if there user already has a subscription, cancel it and find the date it ends customer = yield StripeUtils.getCustomerAsync(req.user, req.body.stripe?.token or req.body.token) if customer @@ -233,7 +227,7 @@ purchaseProduct = expressWrap (req, res) -> if subscription stripeSubscriptionPeriodEndDate = new Date(subscription.current_period_end * 1000) yield StripeUtils.cancelSubscriptionImmediatelyAsync(req.user, subscription) - + paymentType = req.body.service or 'stripe' gems = product.get('gems') if paymentType is 'stripe' @@ -245,7 +239,7 @@ purchaseProduct = expressWrap (req, res) -> description: req.body.description productID: product.get('name') } - + amount = product.get('amount') if req.body.coupon? coupon = _.find product.get('coupons'), ((x) -> x.code is req.body.coupon) @@ -253,10 +247,10 @@ purchaseProduct = expressWrap (req, res) -> throw new errors.NotFound('Coupon not found') amount = coupon.amount metadata.couponCode = coupon.code - + charge = yield StripeUtils.createChargeAsync(req.user, amount, metadata) payment = yield StripeUtils.createPaymentAsync(req.user, charge, {productID: product.get('name')}) - + else if paymentType is 'paypal' { payerID, paymentID } = req.body amount = product.get('amount') @@ -288,7 +282,7 @@ purchaseProduct = expressWrap (req, res) -> productID: product.get('name') }) yield payment.save() - + else throw new errors.UnprocessableEntity('Unsupported payment provider') @@ -323,84 +317,6 @@ purchaseProduct = expressWrap (req, res) -> SubscriptionHandler.logSubscriptionError(req.user, "#{productName} sale Slack tower msg error: #{JSON.stringify(error)}") res.send(req.user.toObject({req})) -createPayPalBillingAgreement = expressWrap (req, res) -> - if (not req.user) or req.user.isAnonymous() - throw new errors.Unauthorized('You must be signed in to create a PayPal billing agreeement.') - throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() - product = yield Product.findById(req.body.productID) - throw new errors.NotFound('Product not found') unless product - planId = product.get('payPalBillingPlanID') - throw new errors.UnprocessableEntity("No PayPal billing plan for product #{product.id}") unless planId - - try - name = product.get('displayName') - name = "[TEST agreement] #{name}" unless isProduction - description = product.get('displayDescription') - description = "[TEST agreeement] #{description}" unless isProduction - # Date creation from paypal node lib example: https://github.com/paypal/PayPal-node-SDK/blob/master/samples/subscription/billing_agreements/create.js - isoDate = new Date() - isoDate.setSeconds(isoDate.getSeconds() + 4) - billingAgreementAttributes = { - name - description - "start_date": isoDate, - "plan": { - "id": planId - }, - "payer": { - "payment_method": 'paypal' - } - } - billingAgreement = yield paypal.billingAgreement.createAsync(billingAgreementAttributes) - return res.status(201).send(billingAgreement) - catch e - log.error 'PayPal create billing agreement error:', JSON.stringify(e, null, '\t') - throw new errors.UnprocessableEntity('PayPal create billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) - -executePayPalBillingAgreement = expressWrap (req, res) -> - # NOTE: internal payment saved in paypal webhook, not here - if (not req.user) or req.user.isAnonymous() - throw new errors.Unauthorized('You must be signed in to execute a PayPal billing agreeement.') - throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() - throw new errors.NotFound('PayPal executed billing agreement token required.') unless req.body.token - - try - billingAgreement = yield paypal.billingAgreement.executeAsync(req.body.token, {}) - userPayPalData = _.clone(req.user.get('payPal')) - userPayPalData ?= {} - if userPayPalData.payerID and userPayPalData.payerID isnt billingAgreement.payer.payer_info.payer_id - log.warning "New payerID for #{req.user.id}, #{userPayPalData.payerID} => #{billingAgreement.payer.payer_info.payer_id}" - userPayPalData.billingAgreementID = billingAgreement.id - userPayPalData.payerID = billingAgreement.payer.payer_info.payer_id - userPayPalData.subscribeDate = new Date() - req.user.set('payPal', userPayPalData) - yield req.user.save() - return res.send(billingAgreement) - catch e - log.error 'PayPal execute billing agreement error:', JSON.stringify(e, null, '\t') - throw new errors.UnprocessableEntity('PayPal execute billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) - -cancelPayPalBillingAgreement = expressWrap (req, res) -> - yield module.exports.cancelPayPalBillingAgreementInternal req - res.sendStatus(204) - -cancelPayPalBillingAgreementInternal = co.wrap (req) -> - if (not req.user) or req.user.isAnonymous() - throw new errors.Unauthorized('You must be signed in to cancel a PayPal billing agreeement.') - throw new errors.Forbidden('Already subscribed.') unless req.user.hasSubscription() - - try - billingAgreementID = req.body.billingAgreementID ? req.user.get('payPal')?.billingAgreementID - throw new errors.UnprocessableEntity('No PayPal billing agreement') unless billingAgreementID - yield paypal.billingAgreement.cancelAsync(billingAgreementID, {"note": "Canceling CodeCombat Premium Subscription"}) - userPayPalData = _.clone(req.user.get('payPal') ? {}) - delete userPayPalData.billingAgreementID - userPayPalData.cancelDate = new Date() - req.user.set('payPal', userPayPalData) - yield req.user.save() - catch e - log.error 'PayPal cancel billing agreement error:', JSON.stringify(e, null, '\t') - throw new errors.UnprocessableEntity('PayPal cancel billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) # TODO: Delete all 'unsubscribeRecipient' code when managed subscriptions are no more unsubscribeRecipientEndpoint = expressWrap (req, res) -> @@ -493,10 +409,6 @@ module.exports = { unsubscribeRecipientEndpoint unsubscribeRecipientAsync purchaseProduct - createPayPalBillingAgreement - executePayPalBillingAgreement - cancelPayPalBillingAgreement - cancelPayPalBillingAgreementInternal checkForCoupon checkForExistingSubscription } diff --git a/server/middleware/users.coffee b/server/middleware/users.coffee index 5dc86cdc890..2c03922e32f 100644 --- a/server/middleware/users.coffee +++ b/server/middleware/users.coffee @@ -107,8 +107,6 @@ module.exports = # Delete personal subscription if userToDelete.get('stripe.subscriptionID') yield middleware.subscriptions.unsubscribeUser(req, userToDelete, false) - if userToDelete.get('payPal.billingAgreementID') - yield middleware.subscriptions.cancelPayPalBillingAgreementInternal(req) # Delete recipient subscription sponsorID = userToDelete.get('stripe.sponsorID') @@ -503,5 +501,5 @@ module.exports = } }) ] - return res.sendStatus(200) + return res.send(200) diff --git a/server/models/Product.coffee b/server/models/Product.coffee index fbef076e1ca..15710b3fdd2 100644 --- a/server/models/Product.coffee +++ b/server/models/Product.coffee @@ -2,14 +2,9 @@ mongoose = require('mongoose') config = require '../../server_config' co = require 'co' ProductSchema = new mongoose.Schema({}, {strict: false,read:config.mongo.readpref}) -plugins = require '../plugins/plugins' -jsonSchema = require '../../app/schemas/models/product.schema' ProductSchema.index({name: 1}, {name: 'name index'}) -ProductSchema.plugin(plugins.TranslationCoveragePlugin) -ProductSchema.plugin(plugins.PatchablePlugin) - ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> basicProductName = 'basic_subscription' if country = user.get 'country' @@ -19,11 +14,4 @@ ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> product = yield @findOne {name: basicProductName} return product -ProductSchema.statics.jsonSchema = jsonSchema - -ProductSchema.statics.editableProperties = [ - 'i18n', - 'i18nCoverage' -] - module.exports = mongoose.model('product', ProductSchema) diff --git a/server/models/User.coffee b/server/models/User.coffee index 0c831ec7e7f..6551e3b8e1a 100644 --- a/server/models/User.coffee +++ b/server/models/User.coffee @@ -351,15 +351,11 @@ UserSchema.methods.sendWelcomeEmail = -> log.error "sendwithus post-save error: #{err}, result: #{result}" if err UserSchema.methods.hasSubscription = -> - if payPal = @get('payPal') - return payPal.billingAgreementID - else if stripeObject = @get('stripe') - return true if stripeObject.sponsorID - return true if stripeObject.subscriptionID - return true if stripeObject.free is true - return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) - false - + return false unless stripeObject = @get('stripe') + return true if stripeObject.sponsorID + return true if stripeObject.subscriptionID + return true if stripeObject.free is true + return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) UserSchema.methods.isPremium = -> return true if @isInGodMode() diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 939047639e1..08b46d85df1 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -189,9 +189,6 @@ module.exports.setup = (app) -> app.post('/db/user/:handle/check-for-new-achievement', mw.auth.checkLoggedIn(), mw.users.checkForNewAchievement) app.post('/db/user/:handle/destudent', mw.auth.checkHasPermission(['admin']), mw.users.destudent) app.post('/db/user/:handle/deteacher', mw.auth.checkHasPermission(['admin']), mw.users.deteacher) - app.post('/db/user/:handle/paypal/create-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.createPayPalBillingAgreement) - app.post('/db/user/:handle/paypal/execute-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.executePayPalBillingAgreement) - app.post('/db/user/:handle/paypal/cancel-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.cancelPayPalBillingAgreement) app.post('/db/user/:handle/reset_progress', mw.users.resetProgress) app.post('/db/user/:handle/signup-with-facebook', mw.users.signupWithFacebook) app.post('/db/user/:handle/signup-with-gplus', mw.users.signupWithGPlus) @@ -219,11 +216,6 @@ module.exports.setup = (app) -> app.post('/db/prepaid/:handle/joiners', mw.prepaids.addJoiner) app.delete('/db/prepaid/:handle/redeemers', mw.prepaids.revoke) - Product = require '../models/Product' - app.post('/db/products/:handle/patch', mw.auth.checkLoggedIn(), mw.patchable.postPatch(Product, 'product')) - app.get('/db/products/:handle/patches', mw.patchable.patches(Product)) - app.get('/db/products/:handle', mw.rest.getByHandle(Product)) - app.put('/db/products/:handle', mw.auth.checkHasUser(), mw.rest.put(Product)) app.get('/db/products', mw.auth.checkHasUser(), mw.products.get) app.post('/db/products/:handle/purchase', mw.auth.checkLoggedIn(), mw.subscriptions.purchaseProduct) diff --git a/server/routes/paypal.coffee b/server/routes/paypal.coffee deleted file mode 100644 index 5c1a7c8b1a1..00000000000 --- a/server/routes/paypal.coffee +++ /dev/null @@ -1,77 +0,0 @@ -errors = require '../commons/errors' -co = require 'co' -expressWrap = require 'co-express' -log = require 'winston' -Payment = require '../models/Payment' -Product = require '../models/Product' -User = require '../models/User' - -module.exports.setup = (app) -> - app.post '/paypal/webhook', expressWrap (req, res) -> - try - if req.body.event_type is "PAYMENT.SALE.COMPLETED" - yield handlePaymentSucceeded(req, res) - else if req.body.event_type is "BILLING.SUBSCRIPTION.CANCELLED" - yield handleSubscriptionCancelled(req, res) - else - log.info "PayPal webhook unknown event #{req.body.event_type}" - return res.status(200).send("PayPal webhook unknown event #{req.body.event_type}") - catch e - log.error 'PayPal webhook error:', JSON.stringify(e, null, '\t') - return res.status(500).send() - - handlePaymentSucceeded = co.wrap (req, res) -> - payPalPayment = req.body.resource - unless payPalPayment?.state is 'completed' - log.error "PayPal webhook payment incomplete state: #{payPalPayment?.id} #{payPalPayment?.state}" - return res.status(200).send("PayPal webhook payment incomplete state: #{payPalPayment?.id} #{payPalPayment?.state}") - - billingAgreementID = payPalPayment.billing_agreement_id - user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) - unless user - log.error "PayPal webhook payment no user found: #{payPalPayment.id} #{billingAgreementID}" - return res.status(200).send("PayPal webhook payment no user found: #{payPalPayment.id} #{billingAgreementID}") - - basicSubProduct = yield Product.findBasicSubscriptionForUser(user) - productID = basicSubProduct?.get('name') - unless /basic_subscription/.test(productID) - log.error "PayPal webhook unexpected sub for user: #{user.id} #{productID}" - return res.status(200).send("PayPal webhook unexpected sub for user: #{user.id} #{productID}") - - amount = Math.round(parseFloat(payPalPayment.amount.total) * 100) - - # Check for existing payment - payment = yield Payment.findOne({'payPal.id': payPalPayment.id}) - return res.status(200).send("Payment already recorded for #{payPalPayment.id}") if payment - - payment = new Payment({ - purchaser: user.id - recipient: user.id - created: new Date().toISOString() - service: 'paypal' - amount - payPal: payPalPayment - productID - }) - yield payment.save() - - return res.status(200).send() - - handleSubscriptionCancelled = co.wrap (req, res) -> - billingAgreement = req.body?.resource - unless billingAgreement - log.error("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") - return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") - - billingAgreementID = billingAgreement.id - user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) - unless user - log.error("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") - return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") - - userPayPalData = _.clone(user.get('payPal') ? {}) - delete userPayPalData.billingAgreementID - userPayPalData.cancelDate = new Date() - user.set('payPal', userPayPalData) - yield user.save() - return res.status(200).send() diff --git a/spec/server/functional/subscription.spec.coffee b/spec/server/functional/subscription.spec.coffee index f966e3b7e02..4d400c3e785 100644 --- a/spec/server/functional/subscription.spec.coffee +++ b/spec/server/functional/subscription.spec.coffee @@ -718,18 +718,6 @@ describe 'Subscriptions', -> nockDone() done() - it 'returns 403 when trying to subscribe with stripe over an existing PayPal subscription', utils.wrap -> - user = yield utils.initUser() - yield utils.loginUser(user) - user.set('payPal.billingAgreementID', 'foo') - yield user.save() - requestBody = user.toObject() - requestBody.stripe = - planID: 'basic' - token: {id: 'bar'} - [res, body] = yield request.putAsync({uri: userURL, json: requestBody, headers: headers }) - expect(res.statusCode).toBe(403) - describe 'APIs', -> # TODO: Refactor these tests to be use yield, be independent of one another, and move to products.spec.coffee # TODO: year tests converted to lifetime, but should be reviewed for usefulness @@ -1001,709 +989,92 @@ describe 'DELETE /db/user/:handle/stripe/recipients/:recipientHandle', -> describe 'POST /db/products/:handle/purchase', -> - describe 'when logged in user', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - yield utils.populateProducts() - - describe 'when subscribed', -> - beforeEach utils.wrap -> - @billingAgreementID = 1234 - @user.set('payPal.billingAgreementID', @billingAgreementID) - yield @user.save() - - it 'denies PayPal payments', utils.wrap -> - product = yield Product.findOne({ name: 'lifetime_subscription' }) - url = utils.getUrl("/db/products/#{product.id}/purchase") - json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } - [res] = yield request.postAsync({ url, json }) - expect(res.statusCode).toBe(403) - - describe 'when NOT subscribed', -> - it 'accepts PayPal payments', utils.wrap -> - # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock - - product = yield Product.findOne({ name: 'lifetime_subscription' }) - amount = product.get('amount') - url = utils.getUrl("/db/products/#{product.id}/purchase") - json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } - - payPalResponse = { - "id": "PAY-03466", - "intent": "sale", - "state": "approved", - "cart": "3J885", - "payer": { - "payment_method": "paypal", - "status": "VERIFIED", - "payer_info": { - "email": @user.get('email'), - "first_name": "test", - "last_name": "buyer", - "payer_id": "VUR529XNB59XY", - "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", - "city": "San Jose", - "state": "CA", - "postal_code": "95131", - "country_code": "US" - }, - "country_code": "US" - } - }, - "transactions": [ - { - "amount": { - "total": (amount/100).toFixed(2), - "currency": "USD", - "details": {} - }, - "payee": { - "merchant_id": "7R5CJJ", - "email": "payments@codecombat.com" - }, - "description": "Lifetime Subscription", - "item_list": { - "items": [ - { - "name": "lifetime_subscription", - "sku": product.id, - "price": (amount/100).toFixed(2), - "currency": "USD", - "quantity": 1 - } - ], - "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", - "city": "San Jose", - "state": "CA", - "postal_code": "95131", - "country_code": "US" - } - }, - "related_resources": [] # bunch more info in here - } - ], - "create_time": "2017-07-13T22:35:45Z", - "links": [ - { - "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", - "rel": "self", - "method": "GET" - } - ], - "httpStatusCode": 200 - } - spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) - - [res] = yield request.postAsync({ url, json }) - expect(res.statusCode).toBe(200) - payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) - expect(payment).toBeDefined() - expect(payment.get('productID')).toBe(product.get('name')) - expect(payment.get('payPal.id')).toBe(payPalResponse.id) - user = yield User.findById(@user.id) - expect(user.get('stripe.free')).toBe(true) - -describe 'POST /db/user/:handle/paypal', -> - describe '/create-billing-agreement', -> - beforeEach utils.wrap -> - @payPalResponse = { - "name":"[TEST agreement] CodeCombat Premium Subscription", - "description":"[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", - "plan":{ - "id": "TODO", - "state":"ACTIVE", - "name":"[TEST plan] CodeCombat Premium Subscription", - "description":"[TEST plan] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", - "type":"INFINITE", - "payment_definitions":[ - { - "id":"PD-2M295453FC097664LX2K4IKA", - "name":"Regular payment definition", - "type":"REGULAR", - "frequency":"Day", - "amount":{ - "currency":"USD", - "value": "TODO" - }, - "cycles":"0", - "charge_models":[ - - ], - "frequency_interval":"1" - } - ], - "merchant_preferences":{ - "setup_fee":{ - "currency":"USD", - "value":"0" - }, - "max_fail_attempts":"0", - "return_url":"http://localhost:3000/paypal/subscribe-callback", - "cancel_url":"http://localhost:3000/paypal/cancel-callback", - "auto_bill_amount":"YES", - "initial_fail_amount_action":"CONTINUE" - } - }, - "links":[ - { - "href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-92B61638JR311510D", - "rel":"approval_url", - "method":"REDIRECT" - }, - { - "href":"https://api.sandbox.paypal.com/v1/payments/billing-agreements/EC-92B61638JR311510D/agreement-execute", - "rel":"execute", - "method":"POST" - } - ], - "start_date":"2017-08-08T18:47:06.681Z", - "httpStatusCode":201 - } - - describe 'when user NOT logged in', -> - beforeEach utils.wrap -> - @user = yield utils.becomeAnonymous() - yield utils.populateProducts() - @product = yield Product.findOne({ name: 'basic_subscription' }) - - it 'returns 401 and does not create a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") - [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) - - expect(res.statusCode).toBe(401) - expect(@user.isAnonymous()).toBeTruthy() - - describe 'when user logged in', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - - describe 'when user already subscribed', -> - beforeEach utils.wrap -> - @user.set('payPal.billingAgreementID', 'foo') - yield @user.save() - @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) - - it 'returns 403 and does not create a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") - [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) - expect(res.statusCode).toBe(403) - expect(@user.get('payPal.billingAgreementID')).toEqual('foo') - - describe 'when invalid product', -> - - it 'returns 422 and does not create a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") - [res, body] = yield request.postAsync({ url, json: {productID: 99999} }) - - expect(res.statusCode).toBe(422) - - describe 'when regional product', -> - beforeEach utils.wrap -> - yield utils.populateProducts() - @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) - @payPalResponse.plan.id = @product.get('payPalBillingPlanID') - @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) - - it 'creates a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") - spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) - [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) - expect(res.statusCode).toBe(201) - expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) - expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) - - describe 'when basic product', -> - beforeEach utils.wrap -> - yield utils.populateProducts() - @product = yield Product.findOne({ name: 'basic_subscription' }) - @payPalResponse.plan.id = @product.get('payPalBillingPlanID') - @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) - - it 'creates a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") - spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) - [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) - expect(res.statusCode).toBe(201) - expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) - expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) - - describe '/execute-billing-agreement', -> - beforeEach utils.wrap -> - @payPalResponse = { - "id": "I-3HNGD4BKF09P", - "state": "Active", - "description": "[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", - "payer": { - "payment_method": "paypal", - "status": "verified", - "payer_info": { - "email": "foo@bar.com", - "first_name": "Foo", - "last_name": "Bar", - "payer_id": "1324", - } - }, - "plan": { - "payment_definitions": [ - { - "type": "REGULAR", - "frequency": "Day", - "amount": { - "value": "TODO" - }, - "cycles": "0", - "charge_models": [ - { - "type": "TAX", - "amount": { - "value": "0.00" - } - }, - { - "type": "SHIPPING", - "amount": { - "value": "0.00" - } - } - ], - "frequency_interval": "1" - } - ], - "merchant_preferences": { - "setup_fee": { - "value": "0.00" - }, - "max_fail_attempts": "0", - "auto_bill_amount": "YES" - }, - "links": [], - "currency_code": "USD" - }, - "links": [ - { - "href": "https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-3HNGD4BKF09P", - "rel": "self", - "method": "GET" - } - ], - "start_date": "2017-08-08T07:00:00Z", - "agreement_details": { - "outstanding_balance": { - "value": "0.00" - }, - "cycles_remaining": "0", - "cycles_completed": "0", - "next_billing_date": "2017-08-08T10:00:00Z", - "final_payment_date": "1970-01-01T00:00:00Z", - "failed_payment_count": "0" - }, - "httpStatusCode": 200 - } - - describe 'when user NOT logged in', -> - beforeEach utils.wrap -> - @user = yield utils.becomeAnonymous() - yield utils.populateProducts() - - it 'returns 401 and does not execute a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") - [res, body] = yield request.postAsync({ url }) - expect(res.statusCode).toBe(401) - expect(@user.isAnonymous()).toBeTruthy() - - describe 'when user logged in', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - - describe 'when user already subscribed', -> - beforeEach utils.wrap -> - @user.set('payPal.billingAgreementID', 'foo') - yield @user.save() - - it 'returns 403 and does not execute a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") - [res, body] = yield request.postAsync({ url }) - expect(res.statusCode).toBe(403) - expect(@user.get('payPal.billingAgreementID')).toEqual('foo') - - describe 'when no token', -> - - it 'returns 404 and does not execute a billing agreement', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") - [res, body] = yield request.postAsync({ url }) - expect(res.statusCode).toBe(404) - - describe 'when token passed', -> - - it 'subscribes the user', utils.wrap -> - expect(@user.hasSubscription()).not.toBeTruthy() - url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") - spyOn(paypal.billingAgreement, 'executeAsync').and.returnValue(Promise.resolve(@payPalResponse)) - [res, body] = yield request.postAsync({ url, json: {token: 'foo' }}) - expect(res.statusCode).toBe(200) - expect(body.id).toEqual(@payPalResponse.id) - user = yield User.findById @user.id - userPayPalData = user.get('payPal') - expect(userPayPalData.billingAgreementID).toEqual(@payPalResponse.id) - expect(userPayPalData.payerID).toEqual(@payPalResponse.payer.payer_info.payer_id) - expect(userPayPalData.subscribeDate).toBeDefined() - expect(userPayPalData.subscribeDate).toBeLessThan(new Date()) - expect(user.hasSubscription()).toBeTruthy() - - describe '/cancel-billing-agreement', -> - beforeEach utils.wrap -> - @payPalResponse = { - "httpStatusCode": 204 - } - - describe 'when user NOT logged in', -> - beforeEach utils.wrap -> - @user = yield utils.becomeAnonymous() - yield utils.populateProducts() - - it 'no billing agreement cancelled', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") - [res, body] = yield request.postAsync({ url }) - expect(res.statusCode).toBe(401) - expect(@user.isAnonymous()).toBeTruthy() - - describe 'when user logged in', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - - describe 'when user not subscribed', -> - - it 'no billing agreement cancelled', utils.wrap -> - url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") - [res, body] = yield request.postAsync({ url }) - expect(res.statusCode).toBe(403) - - describe 'when user subscribed', -> - beforeEach utils.wrap -> - @billingAgreementID = 1234 - @user.set('payPal.billingAgreementID', @billingAgreementID) - yield @user.save() - - it 'user unsubscribed', utils.wrap -> - expect(@user.hasSubscription()).toBeTruthy() - url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") - spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve(@payPalResponse)) - [res, body] = yield request.postAsync({ url, json: {billingAgreementID: @billingAgreementID} }) - expect(res.statusCode).toBe(204) - user = yield User.findById @user.id - expect(user.get('payPal').billingAgreementID).not.toBeDefined() - expect(user.get('payPal').cancelDate).toBeDefined() - expect(user.get('payPal').cancelDate).toBeLessThan(new Date()) - expect(user.hasSubscription()).not.toBeTruthy() - -describe 'POST /paypal/webhook', -> - beforeEach utils.wrap -> - yield utils.clearModels([User, Payment]) - - describe 'when unknown event', -> + it 'accepts PayPal payments', utils.wrap -> + # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock - it 'returns 200 and info message', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: {event_type: "UNKNOWN.EVENT"} }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual('PayPal webhook unknown event UNKNOWN.EVENT') - - describe 'when PAYMENT.SALE.COMPLETED event', -> - beforeEach utils.wrap -> - @paymentEventData = { - "id":"WH-7UE28022AT424841V-9DJ65866TC5772327", - "event_version":"1.0", - "create_time":"2017-08-07T23:33:37.176Z", - "resource_type":"sale", - "event_type":"PAYMENT.SALE.COMPLETED", - "summary":"Payment completed for $ 0.99 USD", - "resource":{ - "id":"3C172741YC758734U", - "state":"completed", - "amount":{ - "total":"0.99", - "currency":"USD", - "details":{ - - } - }, - "payment_mode":"INSTANT_TRANSFER", - "protection_eligibility":"ELIGIBLE", - "protection_eligibility_type":"ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE", - "transaction_fee":{ - "value":"0.02", - "currency":"USD" - }, - "billing_agreement_id":"I-H3HN1PXG1SEV", - "create_time":"2017-08-07T23:33:10Z", - "update_time":"2017-08-07T23:33:10Z", - "links":[ - { - "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U", - "rel":"self", - "method":"GET" - }, - { - "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U/refund", - "rel":"refund", - "method":"POST" - } - ] - }, - "links":[ - { - "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327", - "rel":"self", - "method":"GET" - }, - { - "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327/resend", - "rel":"resend", - "method":"POST" - } - ] - } - - describe 'when incomplete', -> - - it 'returns 200 and incomplete message', utils.wrap -> - @paymentEventData.resource.state = 'incomplete' - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("PayPal webhook payment incomplete state: #{@paymentEventData.resource.id} #{@paymentEventData.resource.state}") - - describe 'when no user with billing agreement', -> - - it 'returns 200 and no user message', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("PayPal webhook payment no user found: #{@paymentEventData.resource.id} #{@paymentEventData.resource.billing_agreement_id}") - - describe 'when user with billing agreement', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - @user.set('payPal.billingAgreementID', @paymentEventData.resource.billing_agreement_id) - yield @user.save() - - xdescribe 'when no basic_subscription product for user', -> - beforeEach utils.wrap -> - # TODO: populateProducts runs once, so this could mess with following tests. - yield utils.clearModels([Product]) - - it 'returns 200 and unexpected sub message', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("PayPal webhook unexpected sub for user: #{@user.id} undefined") - - describe 'when basic_subscription product exists for user', -> - beforeEach utils.wrap -> - yield Product({name: 'basic_subscription'}).save() - - describe 'when no previous payment recorded', -> - beforeEach utils.wrap -> - yield utils.clearModels([Payment]) - - it 'creates a new payment', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - payment = yield Payment.findOne({'payPal.id': @paymentEventData.resource.id}) - expect(payment).toBeTruthy() - expect(payment.get('purchaser')).toEqual(@user.id) - - describe 'when previous payment already recorded', -> - beforeEach utils.wrap -> - yield utils.clearModels([Payment]) - yield Payment({'payPal.id': @paymentEventData.resource.id}).save() - payments = yield Payment.find({'payPal.id': @paymentEventData.resource.id}).lean() - expect(payments?.length).toEqual(1) - - it 'does not create a new payment', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("Payment already recorded for #{@paymentEventData.resource.id}") - payments = yield Payment.find({'payPal.id': @paymentEventData.resource.id}).lean() - expect(payments?.length).toEqual(1) - - describe 'when BILLING.SUBSCRIPTION.CANCELLED event', -> - beforeEach utils.wrap -> - @paymentEventData = { - "id": "WH-6TD369808N914414D-1YJ376786E892292F", - "create_time": "2016-04-28T11:53:10Z", - "resource_type": "Agreement", - "event_type": "BILLING.SUBSCRIPTION.CANCELLED", - "summary": "A billing subscription was cancelled", - "resource": { + user = yield utils.initUser() + yield utils.loginUser(user) + yield utils.populateProducts() + product = yield Product.findOne({ name: 'lifetime_subscription' }) + amount = product.get('amount') + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } + + payPalResponse = { + "id": "PAY-03466", + "intent": "sale", + "state": "approved", + "cart": "3J885", + "payer": { + "payment_method": "paypal", + "status": "VERIFIED", + "payer_info": { + "email": user.get('email'), + "first_name": "test", + "last_name": "buyer", + "payer_id": "VUR529XNB59XY", "shipping_address": { - "recipient_name": "Cool Buyer", - "line1": "3rd st", - "line2": "cool", + "recipient_name": "test buyer", + "line1": "1 Main St", "city": "San Jose", "state": "CA", - "postal_code": "95112", + "postal_code": "95131", "country_code": "US" }, - "id": "I-PE7JWXKGVN0R", - "plan": { - "curr_code": "USD", - "links": [], - "payment_definitions": [ - { - "type": "TRIAL", - "frequency": "Month", - "frequency_interval": "1", - "amount": { - "value": "5.00" - }, - "cycles": "5", - "charge_models": [ - { - "type": "TAX", - "amount": { - "value": "1.00" - } - }, - { - "type": "SHIPPING", - "amount": { - "value": "1.00" - } - } - ] - }, + "country_code": "US" + } + }, + "transactions": [ + { + "amount": { + "total": (amount/100).toFixed(2), + "currency": "USD", + "details": {} + }, + "payee": { + "merchant_id": "7R5CJJ", + "email": "payments@codecombat.com" + }, + "description": "Lifetime Subscription", + "item_list": { + "items": [ { - "type": "REGULAR", - "frequency": "Month", - "frequency_interval": "1", - "amount": { - "value": "10.00" - }, - "cycles": "15", - "charge_models": [ - { - "type": "TAX", - "amount": { - "value": "2.00" - } - }, - { - "type": "SHIPPING", - "amount": { - "value": "1.00" - } - } - ] + "name": "lifetime_subscription", + "sku": product.id, + "price": (amount/100).toFixed(2), + "currency": "USD", + "quantity": 1 } ], - "merchant_preferences": { - "setup_fee": { - "value": "0.00" - }, - "auto_bill_amount": "YES", - "max_fail_attempts": "21" - } - }, - "payer": { - "payment_method": "paypal", - "status": "verified", - "payer_info": { - "email": "coolbuyer@example.com", - "first_name": "Cool", - "last_name": "Buyer", - "payer_id": "XLHKRXRA4H7QY", - "shipping_address": { - "recipient_name": "Cool Buyer", - "line1": "3rd st", - "line2": "cool", - "city": "San Jose", - "state": "CA", - "postal_code": "95112", - "country_code": "US" - } - } - }, - "description": "update desc", - "agreement_details": { - "outstanding_balance": { - "value": "0.00" - }, - "num_cycles_remaining": "5", - "num_cycles_completed": "0", - "last_payment_date": "2016-04-28T11:29:54Z", - "last_payment_amount": { - "value": "1.00" - }, - "final_payment_due_date": "2017-11-30T10:00:00Z", - "failed_payment_count": "0" - }, - "state": "Cancelled", - "links": [ - { - "href": "https://api.paypal.com/v1/payments/billing-agreements/I-PE7JWXKGVN0R", - "rel": "self", - "method": "GET" + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" } - ], - "start_date": "2016-04-30T07:00:00Z" - }, - "links": [ - { - "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F", - "rel": "self", - "method": "GET", - "encType": "application/json" }, - { - "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F/resend", - "rel": "resend", - "method": "POST", - "encType": "application/json" - } - ], - "event_version": "1.0" - } + "related_resources": [] # bunch more info in here + } + ], + "create_time": "2017-07-13T22:35:45Z", + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", + "rel": "self", + "method": "GET" + } + ], + "httpStatusCode": 200 + } + spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) - describe 'when incomplete', -> - - it 'returns 200 and incomplete message', utils.wrap -> - @paymentEventData.resource.state = 'incomplete' - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: {event_type: "BILLING.SUBSCRIPTION.CANCELLED"}}) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement given for #{@paymentEventData.event_type} #{JSON.stringify({event_type: "BILLING.SUBSCRIPTION.CANCELLED"})}") - - describe 'when no user with billing agreement', -> - - it 'returns 200 and no user message', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement for #{@paymentEventData.resource.id}") - - describe 'when user with billing agreement', -> - beforeEach utils.wrap -> - @user = yield utils.initUser() - yield utils.loginUser(@user) - @user.set('payPal.billingAgreementID', @paymentEventData.resource.id) - yield @user.save() - - it 'unsubscribes user and returns 200', utils.wrap -> - url = getURL('/paypal/webhook') - [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) - expect(res.statusCode).toEqual(200) - user = yield User.findById @user.id - expect(user.get('payPal.billingAgreementID')).not.toBeDefined() - expect(user.hasSubscription()).not.toBeTruthy() + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(200) + payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) + expect(payment).toBeDefined() + expect(payment.get('productID')).toBe(product.get('name')) + expect(payment.get('payPal.id')).toBe(payPalResponse.id) + user = yield User.findById(user.id) + expect(user.get('stripe.free')).toBe(true) diff --git a/spec/server/functional/user.spec.coffee b/spec/server/functional/user.spec.coffee index f8ec0e88a1a..7bbf6cea393 100644 --- a/spec/server/functional/user.spec.coffee +++ b/spec/server/functional/user.spec.coffee @@ -16,14 +16,13 @@ Promise = require 'bluebird' Achievement = require '../../../server/models/Achievement' EarnedAchievement = require '../../../server/models/EarnedAchievement' LevelSession = require '../../../server/models/LevelSession' -paypal = require '../../../server/lib/paypal' mongoose = require 'mongoose' describe 'POST /db/user', -> beforeEach utils.wrap -> yield utils.clearModels [User] - + it 'converts the password into a hash', utils.wrap -> yield utils.becomeAnonymous() email = 'some-name@email.com' @@ -36,7 +35,7 @@ describe 'POST /db/user', -> expect(user.get('passwordHash')[..5] in ['31dc3d', '948c7e']).toBeTruthy() expect(user.get('permissions')).toBeUndefined() - + describe 'PUT /db/user', -> it 'returns 422 when no data is provided', utils.wrap -> @@ -52,7 +51,7 @@ describe 'PUT /db/user', -> user2 = yield utils.initUser() [res] = yield request.putAsync(utils.getUrl('/db/user'), json: {_id: user2.id}) expect(res.statusCode).toBe(403) - + it 'returns 422 for invalid data', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -61,7 +60,7 @@ describe 'PUT /db/user', -> [res] = yield request.putAsync utils.getUrl('/db/user'), { json } expect(res.statusCode).toBe(422) expect(res.body[0].message.indexOf('too long')).toBeGreaterThan(-1) - + it 'does not allow permission editing', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -109,7 +108,7 @@ describe 'PUT /db/user', -> expect(user.get('name')).toBe('Wilhelm') expect(user.get('emailLower')).toBe('new@email.com') expect(user.get('email')).toBe('New@email.com') - + it 'returns 409 if setting to a taken username ', utils.wrap -> user1 = yield utils.initUser() yield utils.loginUser(user1) @@ -138,7 +137,7 @@ describe 'PUT /db/user', -> yield new Promise (resolve) -> setTimeout(resolve, 10) classroom = yield Classroom.findById(classroom.id) expect(classroom.get('members').length).toBe(0) - + it 'changes the role regardless of emailVerified', utils.wrap -> user = yield utils.initUser() user.set('emailVerified', true) @@ -167,7 +166,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { email: '', name: '' }} expect(body.code).toBe(422) expect(body.message).toEqual('User needs a username or email address') - + it 'allows unsetting email on student accounts, even when there\'s a user with email and emailLower set to empty string', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {email: '', emailLower: ''}}) @@ -199,7 +198,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { name: '' }} expect(res.statusCode).toBe(200) expect(res.body.name).toBeUndefined() - + it 'works even when user object does not pass validation', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {propNotInSchema: '...'}}) @@ -219,7 +218,7 @@ describe 'PUT /db/user', -> user2 = yield utils.becomeAnonymous() [res] = yield request.putAsync { url: utils.getUrl("/db/user/#{user2.id}"), json: { name }} expect(res.statusCode).toBe(200) - + describe 'PUT /db/user/-/become-student', -> beforeEach utils.wrap -> @@ -459,7 +458,7 @@ describe 'GET /db/user', -> # Add to the test case above an extra data check # xit 'can fetch another user with restricted fields' - + describe 'GET /db/user?email=:email', -> beforeEach utils.wrap -> yield Promise.promisify(clearModels)([User]) @@ -548,7 +547,7 @@ describe 'GET /db/user?email=:email', -> it 'returns 403', utils.wrap -> [res, body] = yield request.getAsync({ url: @url, json: true }) expect(res.statusCode).toBe(403) - + describe 'GET /db/user/:handle', -> it 'populates coursePrepaid from coursePrepaidID', utils.wrap -> user = yield utils.initUser({coursePrepaidID: mongoose.Types.ObjectId()}) @@ -597,7 +596,7 @@ describe 'DELETE /db/user/:handle', -> expect(classroom.get('deletedMembers').length).toBe(1) expect(classroom.get('members')[0].toString()).toEqual(user2.id) expect(classroom.get('deletedMembers')[0].toString()).toEqual(user.id) - + it 'returns 401 if no cookie session', utils.wrap -> yield utils.logout() [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/1234"} @@ -639,18 +638,7 @@ describe 'DELETE /db/user/:handle', -> expect(res.statusCode).toBe(200) # other login no longer valid user = yield User.findById(user.id) expect(user.get('email')).toBe(json.email) - - describe 'when PayPal subscribed', -> - it 'deleting user unsubscribes', utils.wrap -> - user = yield utils.initUser() - user.set('payPal.billingAgreementID', 'foo') - yield user.save() - yield utils.loginUser(user) - spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve({})) - [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{user.id}"} - user = yield User.findById user.id - expect(user.get('payPal.billingAgreementID')).not.toBeDefined() - + describe 'when the user is the recipient of a subscription', -> beforeEach utils.wrap -> yield utils.clearModels([User]) @@ -679,7 +667,7 @@ describe 'DELETE /db/user/:handle', -> yield utils.populateProducts() spyOn(stripe.customers, 'cancelSubscription').and.callFake (cId, sId, cb) -> cb(null) spyOn(stripe.customers, 'updateSubscription').and.callFake (cId, sId, opts, cb) -> cb(null) - + it 'unsubscribes the user', utils.wrap -> yield utils.loginUser(@recipient1) [res] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{@recipient1.id}"} @@ -713,7 +701,7 @@ describe 'Statistics', -> ThangType = require '../../../server/models/ThangType' User = require '../../../server/models/User' UserHandler = require '../../../server/handlers/user_handler' - + beforeEach utils.wrap -> session = new LevelSession name: 'Beat Gandalf' @@ -729,7 +717,7 @@ describe 'Statistics', -> it 'keeps track of games completed', utils.wrap -> user = yield User.findById(@user.id) expect(user.get 'stats.gamesCompleted').toBe 1 - + it 'recalculates games completed', utils.wrap (done) -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -775,7 +763,7 @@ describe 'Statistics', -> admin = yield utils.initAdmin() yield utils.loginUser(admin) - + [res] = yield request.postAsync {uri:url, json: article} expect(res.statusCode).toBe 201 @@ -814,7 +802,7 @@ describe 'Statistics', -> done() - + describe 'GET /db/user/:handle/level.sessions', -> url = getURL('/db/level.session/') session = @@ -857,11 +845,11 @@ describe 'GET /db/user/:handle/level.sessions', -> describe 'POST /db/user/:handle/signup-with-password', -> - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 10)) - + it 'signs up the user with the password and sends welcome emails', utils.wrap -> spyOn(sendwithus.api, 'send') user = yield utils.becomeAnonymous() @@ -937,7 +925,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'returns 409 if there is already a user with the same slug', utils.wrap -> name = 'some username' name2 = 'Some. User.Namé' @@ -950,7 +938,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'disassociates the user from their trial request if the trial request email and signup email do not match', utils.wrap -> user = yield utils.becomeAnonymous() trialRequest = yield utils.makeTrialRequest({ properties: { email: 'one@email.com' } }) @@ -980,7 +968,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> facebookID = '12345' facebookEmail = 'some@email.com' name = 'someusername' - + validFacebookResponse = new Promise((resolve) -> resolve({ id: facebookID, email: facebookEmail, @@ -994,7 +982,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> updated_time: '2015-12-08T17:10:39+0000', verified: true })) - + invalidFacebookResponse = new Promise((resolve) -> resolve({ error: { message: 'Invalid OAuth access token.', @@ -1003,11 +991,11 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> fbtrace_id: 'EC4dEdeKHBH' } })) - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 50)) - + it 'signs up the user with the facebookID and sends welcome emails', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) spyOn(sendwithus.api, 'send') @@ -1020,7 +1008,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> expect(updatedUser.get('email')).toBe(facebookEmail) expect(updatedUser.get('facebookID')).toBe(facebookID) expect(sendwithus.api.send).toHaveBeenCalled() - + it 'returns 422 if facebook does not recognize the access token', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(invalidFacebookResponse) user = yield utils.becomeAnonymous() @@ -1028,20 +1016,20 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> json = { email: facebookEmail, facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + it 'returns 422 if the email or id do not match', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) user = yield utils.becomeAnonymous() url = getURL("/db/user/#{user.id}/signup-with-facebook") - + json = { name, email: 'some-other@email.com', facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + json = { name, email: facebookEmail, facebookID: '54321', facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + # TODO: Fix this test, res.statusCode is occasionally 200 # it 'returns 409 if there is already a user with the given email', utils.wrap -> @@ -1054,7 +1042,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> # [res, body] = yield request.postAsync({url, json}) # expect(res.statusCode).toBe(409) - + describe 'POST /db/user/:handle/signup-with-gplus', -> gplusID = '12345' gplusEmail = 'some@email.com' @@ -1138,11 +1126,11 @@ describe 'POST /db/user/:handle/signup-with-gplus', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) updatedUser = yield User.findById(user.id) - + describe 'POST /db/user/:handle/destudent', -> beforeEach utils.wrap -> yield utils.clearModels([User, Classroom, CourseInstance, Course, Campaign]) - + it 'removes a student user from all classrooms and unsets their role property', utils.wrap -> student1 = yield utils.initUser({role: 'student'}) student2 = yield utils.initUser({role: 'student'}) @@ -1158,12 +1146,12 @@ describe 'POST /db/user/:handle/destudent', -> url = getURL("/db/user/#{student1.id}/destudent") [res, body] = yield request.postAsync({url, json:true}) - + student1 = yield User.findById(student1.id) student2 = yield User.findById(student2.id) classroom = yield Classroom.findById(classroom.id) courseInstance = yield CourseInstance.findById(courseInstance.id) - + expect(student1.get('role')).toBeUndefined() expect(student2.get('role')).toBe('student') expect(classroom.get('members').length).toBe(1) @@ -1195,7 +1183,7 @@ describe 'POST /db/user/:handle/deteacher', -> teacher = yield User.findById(teacher.id) expect(teacher.get('role')).toBeUndefined() - + describe 'POST /db/user/:handle/check-for-new-achievements', -> achievementURL = getURL('/db/achievement') achievementJSON = { @@ -1212,12 +1200,12 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> description: 'Started playing Dungeon Arena.' related: 'a' } - - + + beforeEach utils.wrap -> yield utils.clearModels [Achievement, EarnedAchievement, LevelSession, User] Achievement.resetAchievements() - + it 'finds new achievements and awards them to the user', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1233,18 +1221,18 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> [res, body] = yield request.postAsync { uri: achievementURL, json: achievementJSON } achievementUpdated = res.body.updated expect(res.statusCode).toBe(201) - + user = yield User.findById(user.id) expect(user.get('earned')).toBeUndefined() - + yield utils.loginUser(user) [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(175) earned = yield EarnedAchievement.count() expect(earned).toBe(1) expect(body.lastAchievementChecked).toBe(achievementUpdated) - - + + it 'updates the user if they already earned the achievement but the rewards changed', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1279,7 +1267,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.statusCode).toBe(200) # special case: no worth, should default to 10 - + yield achievement.update({ $set: {updated: new Date().toISOString()}, $unset: {worth:''} @@ -1288,7 +1276,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.body.earned.gems).toBe(100) expect(res.body.points).toBe(110) expect(res.statusCode).toBe(200) - + it 'works for level sessions', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -1308,7 +1296,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> json = true [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(200) - + # check idempotency achievement.set('updated', new Date().toISOString()) yield achievement.save() @@ -1353,16 +1341,16 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> admin = yield User.findById(admin.id) expect(admin.get('lastAchievementChecked')).toBe(achievement.get('updated')) - + describe 'POST /db/user/:userID/request-verify-email', -> mailChimp = require '../../../server/lib/mail-chimp' - + beforeEach utils.wrap -> spyOn(mailChimp.api, 'put').and.returnValue(Promise.resolve()) @user = yield utils.initUser() verificationCode = @user.verificationCode(new Date().getTime()) @url = utils.getURL("/db/user/#{@user.id}/verify/#{verificationCode}") - + it 'sets emailVerified to true and updates MailChimp', utils.wrap -> [res, body] = yield request.postAsync({ @url, json: true }) expect(res.statusCode).toBe(200) @@ -1370,7 +1358,7 @@ describe 'POST /db/user/:userID/request-verify-email', -> user = yield User.findById(@user.id) expect(user.get('emailVerified')).toBe(true) - + describe 'POST /db/user/:userId/reset_progress', -> it 'clears the user\'s level sessions, earned achievements and various user settings', utils.wrap -> userSettings = { @@ -1381,7 +1369,7 @@ describe 'POST /db/user/:userId/reset_progress', -> spent: 10 heroConfig: {thangType: 'qwerty'} } - + user = yield utils.initUser(userSettings) otherUser = yield utils.initUser(userSettings) @@ -1389,7 +1377,7 @@ describe 'POST /db/user/:userId/reset_progress', -> otherSession = yield utils.makeLevelSession({}, {creator:otherUser}) otherEarnedAchievement = new EarnedAchievement({ user: otherUser.id }) yield otherEarnedAchievement.save() - + yield utils.loginUser(user) session = yield utils.makeLevelSession({}, {creator:user}) earnedAchievement = new EarnedAchievement({ user: user.id }) @@ -1398,19 +1386,19 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + stillExist = yield [ LevelSession.findById(session.id) EarnedAchievement.findById(earnedAchievement.id) ] expect(_.any(stillExist)).toBe(false) - + othersStillExist = yield [ LevelSession.findById(otherSession.id) EarnedAchievement.findById(otherEarnedAchievement.id) ] expect(_.all(othersStillExist)).toBe(true) # did not delete other user stuff - + user = yield User.findById(user.id).lean() expect(user.points).toBe(0) expect(user.stats.gamesCompleted).toBe(0) @@ -1419,16 +1407,16 @@ describe 'POST /db/user/:userId/reset_progress', -> expect(user.purchased.items).toDeepEqual([]) expect(user.spent).toBe(0) expect(user.heroConfig).toBeUndefined() - + otherUser = yield User.findById(otherUser.id).lean() expect(otherUser.points).toBe(10) - + it 'allows anonymous users to reset their progress', utils.wrap -> user = yield utils.becomeAnonymous() url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res, body] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + it 'returns 403 for other users', utils.wrap -> user1 = yield utils.initUser() user2 = yield utils.initUser() @@ -1436,14 +1424,14 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user2.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 403 for admins', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) url = utils.getUrl("/db/user/#{admin.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 401 for non-logged in users', utils.wrap -> yield utils.logout() url = utils.getUrl("/db/user/12345/reset_progress") diff --git a/spec/server/unit/subscriptions.spec.coffee b/spec/server/unit/subscriptions.spec.coffee index 2507f40642b..51d1b4e57d9 100644 --- a/spec/server/unit/subscriptions.spec.coffee +++ b/spec/server/unit/subscriptions.spec.coffee @@ -1,10 +1,11 @@ subscriptions = require '../../../server/middleware/subscriptions' -Product = require '../../../server/models/Product' utils = require '../utils' describe 'checkForCoupon', -> - it 'normally calls checkForExistingSubscription without a defined couponID', utils.wrap -> + beforeEach utils.wrap -> yield utils.populateProducts() + + it 'normally calls checkForExistingSubscription without a defined couponID', utils.wrap -> req = {} user = yield utils.initUser({country: 'united-states'}) customer = {} @@ -18,8 +19,6 @@ describe 'checkForCoupon', -> expect(couponID).toBeUndefined() it 'adds country coupons if the user is from a country with a country-specific basic product', utils.wrap -> - # TODO: yield utils.populateProducts() only yields two products when all tests run - yield Product({name: 'brazil_basic_subscription'}).save() req = {} user = yield utils.initUser({country: 'brazil'}) customer = {} diff --git a/test/app/collections/Products.spec.coffee b/test/app/collections/Products.spec.coffee deleted file mode 100644 index d57829d4130..00000000000 --- a/test/app/collections/Products.spec.coffee +++ /dev/null @@ -1,14 +0,0 @@ -describe 'ProductModel', -> - # Temporarily turn ajax back on for a real call to /db/products - beforeEach -> jasmine.Ajax.uninstall() - afterEach -> jasmine.Ajax.install() - it 'basic_subscription products have payPalBillingPlanID set', (done) -> - $.ajax("/db/products") - .done (data, textStatus, jqXHR) => - for product in data - continue unless /basic_subscription/.test(product.name) - expect(product.payPalBillingPlanID).toBeDefined() - done() - .fail (jqXHR, textStatus, errorThrown) => - console.error(jqXHR, textStatus, errorThrown) - done(textStatus) From 6ea6b4fb0914d4be156c56a157bb6dd2053cad48 Mon Sep 17 00:00:00 2001 From: Cat Sync Date: Tue, 15 Aug 2017 12:46:20 -0400 Subject: [PATCH 027/227] Add Subscribe button for subscriber only items in item store. Fix for #4421 --- app/styles/play/modal/play-items-modal.sass | 4 ++-- app/templates/play/modal/item-details-view.jade | 7 +++++-- app/templates/play/modal/play-items-modal.jade | 4 +++- app/views/play/modal/PlayItemsModal.coffee | 6 ++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/styles/play/modal/play-items-modal.sass b/app/styles/play/modal/play-items-modal.sass index 8a214b20388..045adc38029 100644 --- a/app/styles/play/modal/play-items-modal.sass +++ b/app/styles/play/modal/play-items-modal.sass @@ -202,7 +202,7 @@ font-weight: bolder color: rgb(211,200,175) - .unlock-button, .unequippable + .unlock-button, .unequippable, .subscribe-button right: 1px bottom: 0 width: 93px @@ -308,7 +308,7 @@ z-index: 2 //- Unlock buttons (both in list and details areas) - .unlock-button + .unlock-button, .subscribe-button position: absolute border: 3px solid rgb(7,65,83) background: rgb(0,119,168) diff --git a/app/templates/play/modal/item-details-view.jade b/app/templates/play/modal/item-details-view.jade index f78035971b2..415f805560b 100644 --- a/app/templates/play/modal/item-details-view.jade +++ b/app/templates/play/modal/item-details-view.jade @@ -41,8 +41,11 @@ if item && !item.owned if item.unequippable button.btn.big-font.disabled.unequippable #{item.get('heroClass')} Only else - button#selected-item-unlock-button.btn.big-font.unlock-button(data-item-id=item.id) - span(data-i18n="play.unlock") Unlock + button#selected-item-unlock-button.btn.big-font(data-item-id=item.id, class=(item.get('subscriber') && !me.isPremium() ? "subscribe-button" : "unlock-button")) + if item.get('subscriber') && !me.isPremium() + span(data-i18n="subscribe.subscribe_title") + else + span(data-i18n="play.unlock") span.spl= '('+item.get('gems') img(src="/images/common/gem.png", draggable="false") span ) diff --git a/app/templates/play/modal/play-items-modal.jade b/app/templates/play/modal/play-items-modal.jade index 00208f293c1..2ea8d7e3356 100644 --- a/app/templates/play/modal/play-items-modal.jade +++ b/app/templates/play/modal/play-items-modal.jade @@ -61,7 +61,9 @@ span.cost img(src="/images/common/gem.png", draggable="false") span.big-font= item.get('gems') - if item.unequippable + if item.get('subscriber') && !me.isPremium() + span.btn.subscribe-button.big-font(data-i18n="subscribe.subscribe_title") + else if item.unequippable span.big-font.unequippable= item.get('heroClass') else button.btn.unlock-button.big-font(data-i18n="play.unlock", data-item-id=item.id) diff --git a/app/views/play/modal/PlayItemsModal.coffee b/app/views/play/modal/PlayItemsModal.coffee index 8f673310a79..75011eafb1a 100644 --- a/app/views/play/modal/PlayItemsModal.coffee +++ b/app/views/play/modal/PlayItemsModal.coffee @@ -4,6 +4,7 @@ buyGemsPromptTemplate = require 'templates/play/modal/buy-gems-prompt' ItemDetailsView = require './ItemDetailsView' BuyGemsModal = require 'views/play/modal/BuyGemsModal' CreateAccountModal = require 'views/core/CreateAccountModal' +SubscribeModal = require 'views/core/SubscribeModal' CocoCollection = require 'collections/CocoCollection' ThangType = require 'models/ThangType' @@ -50,6 +51,7 @@ module.exports = class PlayItemsModal extends ModalView 'click .item': 'onItemClicked' 'shown.bs.tab': 'onTabClicked' 'click .unlock-button': 'onUnlockButtonClicked' + 'click .subscribe-button': 'onSubscribeButtonClicked' 'click .buy-gems-prompt-button': 'onBuyGemsPromptButtonClicked' 'click #close-modal': 'hide' 'click': 'onClickedSomewhere' @@ -74,6 +76,7 @@ module.exports = class PlayItemsModal extends ModalView 'description' 'i18n' 'heroClass' + 'subscriber' ] itemFetcher = new CocoCollection([], { url: '/db/thang.type?view=items', project: project, model: ThangType }) @@ -239,6 +242,9 @@ module.exports = class PlayItemsModal extends ModalView @$el.one 'click', (e) -> button.removeClass('confirm').text($.i18n.t('play.unlock')) if e.target isnt button[0] + onSubscribeButtonClicked: (e) -> + @openModalView new SubscribeModal() + askToSignUp: -> createAccountModal = new CreateAccountModal supermodel: @supermodel return @openModalView createAccountModal From dcd44fedbf11a51f5fc71ffdd8786259f46dc3b4 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 15 Aug 2017 10:28:04 -0700 Subject: [PATCH 028/227] Add a couple small fixes found when testing * onItemClicked could be called after switch to subscribe modal. Handle that * do not show gems on subscribe button in item details view, seems to suggest it's that many gems to subscribe --- app/templates/play/modal/item-details-view.jade | 6 +++--- app/views/play/modal/PlayItemsModal.coffee | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/templates/play/modal/item-details-view.jade b/app/templates/play/modal/item-details-view.jade index 415f805560b..30b29864506 100644 --- a/app/templates/play/modal/item-details-view.jade +++ b/app/templates/play/modal/item-details-view.jade @@ -46,6 +46,6 @@ if item && !item.owned span(data-i18n="subscribe.subscribe_title") else span(data-i18n="play.unlock") - span.spl= '('+item.get('gems') - img(src="/images/common/gem.png", draggable="false") - span ) + span.spl= '('+item.get('gems') + img(src="/images/common/gem.png", draggable="false") + span ) diff --git a/app/views/play/modal/PlayItemsModal.coffee b/app/views/play/modal/PlayItemsModal.coffee index 75011eafb1a..60d17176042 100644 --- a/app/views/play/modal/PlayItemsModal.coffee +++ b/app/views/play/modal/PlayItemsModal.coffee @@ -146,6 +146,7 @@ module.exports = class PlayItemsModal extends ModalView onItemClicked: (e) -> return if $(e.target).closest('.unlock-button').length + return if @destroyed @playSound 'menu-button-click' itemEl = $(e.target).closest('.item') wasSelected = itemEl.hasClass('selected') From d78b945972b168ce52c229747d97fc22be02514e Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 15 Aug 2017 10:47:25 -0700 Subject: [PATCH 029/227] Remove Bootstrap mention on homepage --- .../images/pages/about/new_languages.png | Bin 55878 -> 49566 bytes .../images/pages/about/new_languages_xs.png | Bin 55764 -> 48248 bytes app/locale/en.coffee | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/images/pages/about/new_languages.png b/app/assets/images/pages/about/new_languages.png index 99a8c99dc9083d0b1dfe17055d598b796838e067..1f249f94990df77d5fb842585f6c08be770807c3 100644 GIT binary patch literal 49566 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 C-$e-k literal 55878 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
9(8ww+yn(k199P;k=39%ek!2Xd(=~_6 zrL%WeTt&{28?jw|W18IA8uNZGvU0j%E5F`9q!g*%%enPz&jQL)6(aVec5XR&-i%#M zrX|Fe)!@8-`XA@`k9G)Pvx+JeaLs%-V_ttSxAK@1_K(b`pU8+%HGewLrXv{1r+HL8 zk6@x0r2zzOt}p3(ZvQSm)UX;72J@q{_WuvjGk-UJwCQ@Mcv&`E3(J!+t_6_fdUU}I xWq|gd-z2CyB-v+tR`{FupZWiPuXGjJl@!L7u4LOC<2#JUqaX*CEq`wk`ah6~m`eZv diff --git a/app/assets/images/pages/about/new_languages_xs.png b/app/assets/images/pages/about/new_languages_xs.png index 7aa21cb7cc5ac746d1f7303ce967696c6f7144b5..cc09330c11af4d90697def0d0540a76d35343a1d 100644 GIT binary patch delta 21821 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 delta 29397 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 Date: Mon, 14 Aug 2017 20:51:07 -0700 Subject: [PATCH 030/227] Fix paypal subs deploy blocking bugs This reverts commit 6b99a216f855f69fcfaf846ff399473f72fe2d1f. Record lifetime purchases only once Save sale payments in separate db.payment.payPalSale field /account/subscription user Id typo Save user.payPal.payerID for lifetime purchases Add Payment.indexes for payPal.id and payPalSale.id Save ObjectId user Ids in db.payments for PayPal monthly subs Suppress CampaignView announcement when executing PayPal billing agreement. Save payment gems in PayPal webhook Closes #4427 --- app/core/Router.coffee | 4 + app/core/api/users.coffee | 26 +- app/core/utils.coffee | 3 + app/locale/en.coffee | 6 +- app/models/Product.coffee | 5 +- app/models/User.coffee | 13 +- app/schemas/models/patch.coffee | 1 + app/schemas/models/payment.schema.coffee | 4 + app/schemas/models/product.schema.coffee | 7 + app/schemas/models/user.coffee | 7 + app/templates/account/subscription-view.jade | 6 +- app/templates/core/subscribe-modal.jade | 3 + app/templates/i18n/i18n-home-view.jade | 2 +- app/views/account/SubscriptionView.coffee | 187 +++-- app/views/admin/AnalyticsView.coffee | 6 +- app/views/core/SubscribeModal.coffee | 24 + app/views/i18n/I18NEditProductView.coffee | 23 + app/views/i18n/I18NHomeView.coffee | 10 +- app/views/play/CampaignView.coffee | 12 + scripts/analytics/mixpanelABGemPrompt.py | 2 +- scripts/analytics/mixpanelABSubscribeCopy.py | 2 +- server/commons/mapping.coffee | 1 + server/lib/paypal.coffee | 1 + server/middleware/products.coffee | 3 + server/middleware/subscriptions.coffee | 107 ++- server/middleware/users.coffee | 4 +- server/models/Payment.coffee | 2 + server/models/Product.coffee | 12 + server/models/User.coffee | 14 +- server/routes/index.coffee | 8 + server/routes/paypal.coffee | 96 +++ .../functional/subscription.spec.coffee | 786 ++++++++++++++++-- spec/server/functional/user.spec.coffee | 134 +-- spec/server/unit/subscriptions.spec.coffee | 7 +- test/app/collections/Products.spec.coffee | 14 + 35 files changed, 1296 insertions(+), 246 deletions(-) create mode 100644 app/views/i18n/I18NEditProductView.coffee create mode 100644 server/routes/paypal.coffee create mode 100644 test/app/collections/Products.spec.coffee diff --git a/app/core/Router.coffee b/app/core/Router.coffee index 53bb1af2174..b2d23329361 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -138,6 +138,7 @@ module.exports = class CocoRouter extends Backbone.Router 'i18n/campaign/:handle': go('i18n/I18NEditCampaignView') 'i18n/poll/:handle': go('i18n/I18NEditPollView') 'i18n/course/:handle': go('i18n/I18NEditCourseView') + 'i18n/product/:handle': go('i18n/I18NEditProductView') 'identify': go('user/IdentifyView') 'il-signup': go('account/IsraelSignupView') @@ -146,6 +147,9 @@ module.exports = class CocoRouter extends Backbone.Router 'logout': 'logout' + 'paypal/subscribe-callback': go('play/CampaignView') + 'paypal/cancel-callback': go('account/SubscriptionView') + 'play(/)': go('play/CampaignView', { redirectStudents: true, redirectTeachers: true }) # extra slash is to get Facebook app to work 'play/ladder/:levelID/:leagueType/:leagueID': go('ladder/LadderView') 'play/ladder/:levelID': go('ladder/LadderView') diff --git a/app/core/api/users.coffee b/app/core/api/users.coffee index 39c0a5387ff..c9dc07eb50c 100644 --- a/app/core/api/users.coffee +++ b/app/core/api/users.coffee @@ -2,13 +2,13 @@ fetchJson = require './fetch-json' module.exports = { url: (userID, path) -> if path then "/db/user/#{userID}/#{path}" else "/db/user/#{userID}" - + getByHandle: (handle, options) -> fetchJson("/db/user/#{handle}", options) getByEmail: ({ email }, options={}) -> fetchJson("/db/user", _.merge {}, options, { data: { email } }) - + signupWithPassword: ({userID, name, email, password}, options={}) -> fetchJson(@url(userID, 'signup-with-password'), _.assign({}, options, { method: 'POST' @@ -34,16 +34,34 @@ module.exports = { .then -> window.tracker?.trackEvent 'Google Login', category: "Signup", label: 'GPlus' window.tracker?.trackEvent 'Finished Signup', category: "Signup", label: 'GPlus' - + put: (user, options={}) -> fetchJson(@url(user._id), _.assign({}, options, { method: 'PUT' json: user })) - + resetProgress: (options={}) -> store = require('core/store') fetchJson(@url(store.state.me._id, 'reset_progress'), _.assign({}, options, { method: 'POST' })) + + createBillingAgreement: ({userID, productID}, options={}) -> + fetchJson(@url(userID, "paypal/create-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {productID} + })) + + executeBillingAgreement: ({userID, token}, options={}) -> + fetchJson(@url(userID, "paypal/execute-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {token} + })) + + cancelBillingAgreement: ({userID, billingAgreementID}, options={}) -> + fetchJson(@url(userID, "paypal/cancel-billing-agreement"), _.assign({}, options, { + method: 'POST' + json: {billingAgreementID} + })) } diff --git a/app/core/utils.coffee b/app/core/utils.coffee index 1183d802f90..e11b6ef63f9 100644 --- a/app/core/utils.coffee +++ b/app/core/utils.coffee @@ -230,6 +230,8 @@ getByPath = (target, path) -> isID = (id) -> _.isString(id) and id.length is 24 and id.match(/[a-f0-9]/gi)?.length is 24 +isRegionalSubscription = (name) -> /_basic_subscription/.test(name) + isSmokeTestEmail = (email) -> /@example.com/.test(email) or /smoketest/.test(email) or /@codecombat.com/.test(email) @@ -679,6 +681,7 @@ module.exports = { initializeACE injectCSS isID + isRegionalSubscription isSmokeTestEmail keepDoingUntil kindaEqual diff --git a/app/locale/en.coffee b/app/locale/en.coffee index b527be0e4dc..58d52b5b82c 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -328,6 +328,7 @@ default_code: "Default Code" loading: "Loading..." overview: "Overview" + processing: "Processing..." solution: "Solution" table_of_contents: "Table of Contents" intro: "Intro" @@ -650,6 +651,7 @@ prompt_body: "Keep playing to earn more!" subscribe: + confirmation: "Congratulations! You now have a CodeCombat Premium Subscription!" premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" comparison_blurb: "Become a Master Coder - subscribe to Premium today!" @@ -722,9 +724,10 @@ support_part1: "Need help with payment options? Email" support_part2: "support@codecombat.com" support_part3: "if you have any questions." + you_are_purchasing_monthly_sub: "You're purchasing a Monthly Premium Subscription!" you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" - you_will_be_charged: "You will be charged $__priceString__ one time." + you_will_be_charged: "You will be charged $__priceString__" # {change} choose_payment_method: "Choose Payment Method" pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" paypal_payment_error: "We encountered an error while charging PayPal." @@ -774,6 +777,7 @@ premium_features: get_premium: "Get
CodeCombat
Premium" # Fit into the banner on the /features page master_coder: "Become a Master Coder by subscribing today!" + paypal_redirect: "You will be redirected to PayPal to complete the subscription process." subscribe_now: "Subscribe Now" hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" diff --git a/app/models/Product.coffee b/app/models/Product.coffee index e68b5a9c071..b0b068f5786 100644 --- a/app/models/Product.coffee +++ b/app/models/Product.coffee @@ -1,10 +1,13 @@ CocoModel = require './CocoModel' +utils = require 'core/utils' module.exports = class ProductModel extends CocoModel @className: 'Product' @schema: require 'schemas/models/product.schema' urlRoot: '/db/products' + isRegionalSubscription: (name) -> utils.isRegionalSubscription(name ? @get('name')) + priceStringNoSymbol: -> (@get('amount') / 100).toFixed(2) adjustedPriceStringNoSymbol: -> @@ -26,7 +29,6 @@ module.exports = class ProductModel extends CocoModel return i18n.translate('subscribe.lifetime') @get('name') - # Send the Stripe token purchase: (token, options={}) -> options.url = _.result(@, 'url') + '/purchase' options.method = 'POST' @@ -44,4 +46,3 @@ module.exports = class ProductModel extends CocoModel paymentID: payment.id payerID: payment.payer.payer_info.payer_id }, options)) - diff --git a/app/models/User.coffee b/app/models/User.coffee index 0cf0c7df40f..4f31577e3db 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -212,11 +212,14 @@ module.exports = class User extends CocoModel return me.get('testGroupNumber') % numVideos hasSubscription: -> - return false unless stripe = @get('stripe') - return true if stripe.sponsorID - return true if stripe.subscriptionID - return true if stripe.free is true - return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) + if payPal = @get('payPal') + return payPal.billingAgreementID + else if stripe = @get('stripe') + return true if stripe.sponsorID + return true if stripe.subscriptionID + return true if stripe.free is true + return true if _.isString(stripe.free) and new Date() < new Date(stripe.free) + false isPremium: -> return true if me.isInGodMode() diff --git a/app/schemas/models/patch.coffee b/app/schemas/models/patch.coffee index a4ea3dcf9b2..a5c0698c6d5 100644 --- a/app/schemas/models/patch.coffee +++ b/app/schemas/models/patch.coffee @@ -9,6 +9,7 @@ patchables = [ 'level_component' 'level_system' 'poll' + 'product' 'thang_type' ] diff --git a/app/schemas/models/payment.schema.coffee b/app/schemas/models/payment.schema.coffee index 05883591ad9..e6017851f71 100644 --- a/app/schemas/models/payment.schema.coffee +++ b/app/schemas/models/payment.schema.coffee @@ -30,6 +30,10 @@ PaymentSchema = c.object({title: 'Payment', required: []}, { title: 'PayPal Payment Data', description: 'The payment object as received from PayPal' } + payPalSale: { + title: 'PayPal Payment Sale Data', + description: 'The payment sale object as received from PayPal' + } }) c.extendBasicProperties(PaymentSchema, 'payment') diff --git a/app/schemas/models/product.schema.coffee b/app/schemas/models/product.schema.coffee index 29710ccb1e0..3fdced4a8f8 100644 --- a/app/schemas/models/product.schema.coffee +++ b/app/schemas/models/product.schema.coffee @@ -4,7 +4,10 @@ module.exports = ProductSchema = { type: 'object' additionalProperties: false properties: { + i18n: {type: 'object', title: 'i18n', format: 'i18n', props: ['displayName', 'displayDescription' ]} name: { type: 'string' } + displayName: { type: 'string' } + displayDescription: {type: 'string'} amount: { type: 'integer', description: 'Cost in cents' } gems: { type: 'integer', description: 'Number of gems awarded' } coupons: { @@ -18,7 +21,11 @@ module.exports = ProductSchema = { } } } + planID: { type: 'string', description: 'Probably should remove this' } + payPalBillingPlanID: { type: 'string' } } } c.extendBasicProperties ProductSchema, 'Product' +c.extendTranslationCoverageProperties ProductSchema +c.extendPatchableProperties ProductSchema diff --git a/app/schemas/models/user.coffee b/app/schemas/models/user.coffee index 8a06ef64e1c..c32febf5900 100644 --- a/app/schemas/models/user.coffee +++ b/app/schemas/models/user.coffee @@ -311,6 +311,13 @@ _.extend UserSchema.properties, spent: {type: 'number'} stripeCustomerID: { type: 'string' } # TODO: Migrate away from this property + payPal: c.object {}, { + payerID: { type: 'string' } + billingAgreementID: { type: 'string', description: 'Set if user has PayPal monthly subscription' } + subscribeDate: c.date() + cancelDate: c.date() + } + stripe: c.object {}, { customerID: { type: 'string' } planID: { enum: ['basic'], description: 'Determines if a user has or wants to subscribe' } diff --git a/app/templates/account/subscription-view.jade b/app/templates/account/subscription-view.jade index 002b0454ffb..9fd69311675 100644 --- a/app/templates/account/subscription-view.jade +++ b/app/templates/account/subscription-view.jade @@ -104,6 +104,10 @@ block content tr th(data-i18n="account.card") td= view.personalSub.card + if view.personalSub.service + tr + th(data-i18n="account.service") + td= view.personalSub.service else if view.personalSub.free === true @@ -129,8 +133,8 @@ block content span.spr(data-i18n="account_prepaid.you_can1") a(href="/account/prepaid", data-i18n="account_prepaid.you_can2") span.spl(data-i18n="account_prepaid.you_can3") - //- Sponsored Subscriptions + //- Sponsored Subscriptions .panel.panel-default .panel-heading h3(data-i18n="subscribe.managed_subs") diff --git a/app/templates/core/subscribe-modal.jade b/app/templates/core/subscribe-modal.jade index cbab6b0d49e..3e41c87e303 100644 --- a/app/templates/core/subscribe-modal.jade +++ b/app/templates/core/subscribe-modal.jade @@ -53,6 +53,9 @@ .option-header.text-center(data-i18n="subscribe.stripe_description") +price("subscribe.month_price", view.basicProduct) button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") + if view.basicProduct.isRegionalSubscription() + //- Warn about PayPal redirect, which is only used for regional subscriptions + .small(data-i18n="premium_features.paypal_redirect") else - var secondRowClass = '.col-xs-12' diff --git a/app/templates/i18n/i18n-home-view.jade b/app/templates/i18n/i18n-home-view.jade index 5e14b40e329..dd7784be61e 100644 --- a/app/templates/i18n/i18n-home-view.jade +++ b/app/templates/i18n/i18n-home-view.jade @@ -26,7 +26,7 @@ block content tr td - a(href=model.i18nURLBase+model.get('slug'))= model.get('name') + a(href=model.i18nURLBase+(model.get('slug') || model.id))= model.get('displayName') || model.get('name') td= translatedName td= model.constructor.className td(class=model.specificallyCovered ? 'success' : 'danger')= model.specificallyCovered ? 'Yes' : 'No' diff --git a/app/views/account/SubscriptionView.coffee b/app/views/account/SubscriptionView.coffee index ce6ab717190..03516dba221 100644 --- a/app/views/account/SubscriptionView.coffee +++ b/app/views/account/SubscriptionView.coffee @@ -3,12 +3,13 @@ template = require 'templates/account/subscription-view' CocoCollection = require 'collections/CocoCollection' Products = require 'collections/Products' Product = require 'models/Product' - +payPal = require('core/services/paypal') SubscribeModal = require 'views/core/SubscribeModal' Payment = require 'models/Payment' stripeHandler = require 'core/services/stripe' User = require 'models/User' utils = require 'core/utils' +api = require 'core/api' # TODO: Link to sponsor id /user/userID instead of plain text name # TODO: Link to sponsor email instead of plain text email @@ -82,7 +83,7 @@ module.exports = class SubscriptionView extends RootView onClickConfirmEndSubscription: (e) -> message = @$el.find('.unsubscribe-feedback textarea').val().trim() - @personalSub.unsubscribe(message) + @personalSub.unsubscribe(message, => @render?()) # Sponsored subscriptions @@ -171,94 +172,138 @@ class PersonalSub render() me.patch({headers: {'X-Change-Plan': 'true'}}) - unsubscribe: (message) -> - removeStripe = => + unsubscribe: (message, render) -> + removeSub = => + payPalInfo = me.get('payPal') stripeInfo = _.clone(me.get('stripe')) - delete stripeInfo.planID - me.set('stripe', stripeInfo) - me.once 'sync', -> - window.tracker?.trackEvent 'Unsubscribe End', message: message - document.location.reload() - me.patch({headers: {'X-Change-Plan': 'true'}}) + if stripeInfo + delete stripeInfo.planID + me.set('stripe', stripeInfo) + me.once 'sync', -> + window.tracker?.trackEvent 'Unsubscribe End', message: message + document.location.reload() + me.patch({headers: {'X-Change-Plan': 'true'}}) + else if payPalInfo?.billingAgreementID + api.users.cancelBillingAgreement({userID: me.id, billingAgreementID: payPalInfo?.billingAgreementID}) + .then (response) => + window.tracker?.trackEvent 'Unsubscribe End', message: message + document.location.reload() + .catch (jqxhr) => + console.error('PayPal unsubscribe', jqxhr) + + else + console.error "Tried to unsubscribe without PayPal or Stripe user info." + @state = 'unknown_error' + @stateMessage = "You do not appear to be subscribed." + render() if message $.post '/contact', message: message, subject: 'Cancellation', (response) -> - removeStripe() + removeSub() else - removeStripe() + removeSub() update: (render) -> - return unless stripeInfo = me.get('stripe') + stripeInfo = me.get('stripe') + payPalInfo = me.get('payPal') + return unless stripeInfo or payPalInfo @state = 'loading' - if stripeInfo.sponsorID - @sponsor = true - onSubSponsorSuccess = (sponsorInfo) => - @sponsorEmail = sponsorInfo.email - @sponsorName = sponsorInfo.name - @sponsorID = stripeInfo.sponsorID - if sponsorInfo.subscription.cancel_at_period_end - @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) + if stripeInfo + if stripeInfo.sponsorID + @sponsor = true + onSubSponsorSuccess = (sponsorInfo) => + @sponsorEmail = sponsorInfo.email + @sponsorName = sponsorInfo.name + @sponsorID = stripeInfo.sponsorID + if sponsorInfo.subscription.cancel_at_period_end + @endDate = new Date(sponsorInfo.subscription.current_period_end * 1000) + delete @state + render() + @supermodel.addRequestResource('sub_sponsor', { + url: '/db/user/-/sub_sponsor' + method: 'POST' + success: onSubSponsorSuccess + }, 0).load() + + else if stripeInfo.prepaidCode + @usingPrepaidCode = true delete @state render() - @supermodel.addRequestResource('sub_sponsor', { - url: '/db/user/-/sub_sponsor' - method: 'POST' - success: onSubSponsorSuccess - }, 0).load() - - else if stripeInfo.prepaidCode - @usingPrepaidCode = true - delete @state - render() - else if stripeInfo.subscriptionID - @self = true - @active = me.isPremium() - @subscribed = stripeInfo.planID? - - options = { cache: false, url: "/db/user/#{me.id}/stripe" } - options.success = (info) => - if card = info.card - @card = "#{card.brand}: x#{card.last4}" - if sub = info.subscription - periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) - if sub.cancel_at_period_end - @activeUntil = periodEnd - else if sub.discount?.coupon?.id isnt 'free' - @nextPaymentDate = periodEnd - # NOTE: This checks the product list for one that corresponds to their - # country. This will not work for "free" or "halfsies" because there - # are not products that correspond to those. - # NOTE: This does NOT use the "amount" of the coupon in this client side calculation - # (those should be kept up to date on the server) - # TODO: Calculate and return the true price on the server side, and use that as a source of truth - if sub.discount?.coupon?.id - productName = "#{sub.discount?.coupon?.id}_basic_subscription" - else - productName = "basic_subscription" - product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) - if product - @cost = "$#{(product.get('amount')/100).toFixed(2)}" - else - @cost = "$#{(sub.plan.amount/100).toFixed(2)}" - else - console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" + else if stripeInfo.subscriptionID + @self = true + @active = me.isPremium() + @subscribed = stripeInfo.planID? + + options = { cache: false, url: "/db/user/#{me.id}/stripe" } + options.success = (info) => + if card = info.card + @card = "#{card.brand}: x#{card.last4}" + if sub = info.subscription + periodEnd = new Date((sub.trial_end or sub.current_period_end) * 1000) + if sub.cancel_at_period_end + @activeUntil = periodEnd + else if sub.discount?.coupon?.id isnt 'free' + @nextPaymentDate = periodEnd + # NOTE: This checks the product list for one that corresponds to their + # country. This will not work for "free" or "halfsies" because there + # are not products that correspond to those. + # NOTE: This does NOT use the "amount" of the coupon in this client side calculation + # (those should be kept up to date on the server) + # TODO: Calculate and return the true price on the server side, and use that as a source of truth + if sub.discount?.coupon?.id + productName = "#{sub.discount?.coupon?.id}_basic_subscription" + else + productName = "basic_subscription" + product = _.findWhere(@supermodel.getModels(Product), (m) -> m.get('name') is productName) + if product + @cost = "$#{(product.get('amount')/100).toFixed(2)}" + else + @cost = "$#{(sub.plan.amount/100).toFixed(2)}" + else + console.error "Could not find personal subscription #{me.get('stripe')?.customerID} #{me.get('stripe')?.subscriptionID}" + delete @state + render() + @supermodel.addRequestResource('personal_payment_info', options).load() + + payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) + payments.once 'sync', -> + @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + render() + @supermodel.loadCollection(payments, 'payments', {cache: false}) + + else if stripeInfo.free + @free = stripeInfo.free delete @state render() - @supermodel.addRequestResource('personal_payment_info', options).load() - payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) - payments.once 'sync', -> - @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + else + delete @state render() - @supermodel.loadCollection(payments, 'payments', {cache: false}) - else if stripeInfo.free - @free = stripeInfo.free + else if payPalInfo?.billingAgreementID + @self = true + @active = true + @subscribed = true + @service = "PayPal" delete @state render() - + payments = new CocoCollection([], { url: '/db/payment', model: Payment, comparator:'_id' }) + payments.once 'sync', => + try + @monthsSubscribed = (x for x in payments.models when not x.get('productID')).length + lastPayment = _.last(_.sortBy(_.filter(payments.models, (p) -> /basic_subscription/ig.test(p.get('productID'))), (p) -> p.get('created'))) + if lastPayment + @nextPaymentDate = new Date(lastPayment.get('created')) + @nextPaymentDate.setUTCMonth(@nextPaymentDate.getUTCMonth() + 1) + @cost = "$#{(lastPayment.get('amount')/100).toFixed(2)}" + render() + else + console.error("No subscription payments found!") + catch err + console.error(JSON.stringify(err)) + @supermodel.loadCollection(payments, 'payments', {cache: false}) else delete @state render() diff --git a/app/views/admin/AnalyticsView.coffee b/app/views/admin/AnalyticsView.coffee index c177822c56d..b8061a2b3f9 100644 --- a/app/views/admin/AnalyticsView.coffee +++ b/app/views/admin/AnalyticsView.coffee @@ -127,13 +127,13 @@ module.exports = class AnalyticsView extends RootView revenueGroupFromPayment = (payment) -> product = payment.productID or payment.service - if payment.productID is 'lifetime_subcription' + if payment.productID is 'lifetime_subscription' product = "usa lifetime" else if /_lifetime_subscription/.test(payment.productID) product = "intl lifetime" - else if payment.productID is 'basic_subcription' + else if payment.productID is 'basic_subscription' product = "usa monthly" - else if /_basic_subcription/.test(payment.productID) + else if /_basic_subscription/.test(payment.productID) product = "intl monthly" else if /gems/.test(payment.productID) product = "gems" diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index f816578bd2c..4fe7bcb1034 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -1,3 +1,4 @@ +api = require 'core/api' ModalView = require 'views/core/ModalView' template = require 'templates/core/subscribe-modal' stripeHandler = require 'core/services/stripe' @@ -126,6 +127,29 @@ module.exports = class SubscribeModal extends ModalView return unless @basicProduct @playSound 'menu-button-click' return @openModalView new CreateAccountModal() if me.get('anonymous') + if @basicProduct.isRegionalSubscription() + @startPayPalSubscribe() + else + @startStripeSubscribe() + + startPayPalSubscribe: -> + application.tracker?.trackEvent 'Started subscription purchase', { service: 'paypal' } + $('.purchase-button').addClass("disabled") + $('.purchase-button').html($.i18n.t('common.processing')) + api.users.createBillingAgreement({userID: me.id, productID: @basicProduct.id}) + .then (billingAgreement) => + for link in billingAgreement.links + if link.rel is 'approval_url' + application.tracker?.trackEvent 'Continue subscription purchase', { service: 'paypal', redirectUrl: link.href } + window.location = link.href + return + throw new Error("PayPal billing agreement has no redirect link #{JSON.stringify(billingAgreement)}") + .catch (jqxhr) => + $('.purchase-button').removeClass("disabled") + $('.purchase-button').html($.i18n.t('premium_features.subscribe_now')) + @onSubscriptionError(jqxhr) + + startStripeSubscribe: -> application.tracker?.trackEvent 'Started subscription purchase', { service: 'stripe' } options = @stripeOptions { description: $.i18n.t('subscribe.stripe_description') diff --git a/app/views/i18n/I18NEditProductView.coffee b/app/views/i18n/I18NEditProductView.coffee new file mode 100644 index 00000000000..fb8bc858e29 --- /dev/null +++ b/app/views/i18n/I18NEditProductView.coffee @@ -0,0 +1,23 @@ +I18NEditModelView = require './I18NEditModelView' +Product = require 'models/Product' +deltasLib = require 'core/deltas' +Patch = require 'models/Patch' +Patches = require 'collections/Patches' +PatchModal = require 'views/editor/PatchModal' + +# TODO: Apply these changes to all i18n views if it proves to be more reliable + +module.exports = class I18NEditProductView extends I18NEditModelView + id: "i18n-edit-product-view" + modelClass: Product + + buildTranslationList: -> + lang = @selectedLanguage + + # name, description + if i18n = @model.get('i18n') + if name = @model.get('displayName') + @wrapRow 'Product short name', ['displayName'], name, i18n[lang]?.displayName, [] + if description = @model.get('displayDescription') + @wrapRow 'Product description', ['displayDescription'], description, i18n[lang]?.displayDescription, [] + diff --git a/app/views/i18n/I18NHomeView.coffee b/app/views/i18n/I18NHomeView.coffee index 60fc51a7a55..848e802fcc6 100644 --- a/app/views/i18n/I18NHomeView.coffee +++ b/app/views/i18n/I18NHomeView.coffee @@ -2,6 +2,8 @@ RootView = require 'views/core/RootView' template = require 'templates/i18n/i18n-home-view' CocoCollection = require 'collections/CocoCollection' Courses = require 'collections/Courses' +Products = require 'collections/Products' +Product = require 'models/Product' LevelComponent = require 'models/LevelComponent' ThangType = require 'models/ThangType' @@ -40,8 +42,9 @@ module.exports = class I18NHomeView extends RootView @campaigns = new CocoCollection([], { url: '/db/campaign?view=i18n-coverage', project: project, model: Campaign }) @polls = new CocoCollection([], { url: '/db/poll?view=i18n-coverage', project: project, model: Poll }) @courses = new Courses() + @products = new CocoCollection([], { url: '/db/products?view=i18n-coverage', project: project, model: Product }) - for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses] + for c in [@thangTypes, @components, @levels, @achievements, @campaigns, @polls, @courses, @products] c.skip = 0 c.fetch({data: {skip: 0, limit: PAGE_SIZE}, cache:false}) @supermodel.loadCollection(c, 'documents') @@ -58,6 +61,7 @@ module.exports = class I18NHomeView extends RootView when 'Campaign' then '/i18n/campaign/' when 'Poll' then '/i18n/poll/' when 'Course' then '/i18n/course/' + when 'Product' then '/i18n/product/' getMore = collection.models.length is PAGE_SIZE @aggregateModels.add(collection.models) @render() @@ -91,9 +95,9 @@ module.exports = class I18NHomeView extends RootView updateCoverageForModel: (model, relatedLanguages) -> model.specificallyCovered = true model.generallyCovered = true - coverage = model.get('i18nCoverage') + coverage = model.get('i18nCoverage') ? [] - if @selectedLanguage not in coverage + unless @selectedLanguage in coverage model.specificallyCovered = false if not _.any((l in coverage for l in relatedLanguages)) model.generallyCovered = false diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 793ccbde019..0e300ba254b 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -31,6 +31,7 @@ Classroom = require 'models/Classroom' Course = require 'models/Course' CourseInstance = require 'models/CourseInstance' Levels = require 'collections/Levels' +payPal = require('core/services/paypal') require 'game-libraries' @@ -94,6 +95,16 @@ module.exports = class CampaignView extends RootView me.patch() pixelCode = if @terrain is 'game-dev-hoc' then 'code_combat_gamedev' else 'code_combat' $('body').append($("")) + else if location.pathname is '/paypal/subscribe-callback' + @payPalToken = utils.getQueryVariable('token') + api.users.executeBillingAgreement({userID: me.id, token: @payPalToken}) + .then (billingAgreement) => + value = Math.round(parseFloat(billingAgreement?.plan?.payment_definitions?[0].amount?.value ? 0) * 100) + application.tracker?.trackEvent 'Finished subscription purchase', { value, service: 'paypal' } + noty({text: $.i18n.t('subscribe.confirmation'), layout: 'topCenter', timeout: 8000}) + me.fetch(cache: false, success: => @render?()) + .catch (err) => + console.error(err) # HoC: Fake us up a "mode" for HeroVictoryModal to return hero without levels realizing they're in a copycat campaign, or clear it if we started playing. shouldReturnToGameDevHoc = @terrain is 'game-dev-hoc' @@ -1101,6 +1112,7 @@ module.exports = class CampaignView extends RootView maybeShowPendingAnnouncement: () -> return false if me.freeOnly() # TODO: handle announcements that can be shown to free only servers + return false if @payPalToken latest = window.serverConfig.latestAnnouncement myLatest = me.get('lastAnnouncementSeen') return unless typeof latest is 'number' diff --git a/scripts/analytics/mixpanelABGemPrompt.py b/scripts/analytics/mixpanelABGemPrompt.py index 43682f4ea9c..026236794c1 100644 --- a/scripts/analytics/mixpanelABGemPrompt.py +++ b/scripts/analytics/mixpanelABGemPrompt.py @@ -88,7 +88,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished gem purchase'] > 1: - # print "User multiple subcription purchases?" + # print "User multiple subscription purchases?" # print item elif item['Started purchase'] > 0: started += 1 diff --git a/scripts/analytics/mixpanelABSubscribeCopy.py b/scripts/analytics/mixpanelABSubscribeCopy.py index 16f406ed9e9..b711890e2a8 100644 --- a/scripts/analytics/mixpanelABSubscribeCopy.py +++ b/scripts/analytics/mixpanelABSubscribeCopy.py @@ -87,7 +87,7 @@ convertedGroupA += 1 # TODO: is our distinct_id correct? We hit this at least once. # if item['Finished subscription purchase'] > 1: - # print "User multiple subcription purchases?" + # print "User multiple subscription purchases?" # print item elif item['Started subscription purchase'] > 0: started += 1 diff --git a/server/commons/mapping.coffee b/server/commons/mapping.coffee index 1b55b664363..9438487673a 100644 --- a/server/commons/mapping.coffee +++ b/server/commons/mapping.coffee @@ -53,6 +53,7 @@ module.exports.routes = 'routes/github' 'routes/languages' 'routes/mail' + 'routes/paypal' 'routes/sprites' 'routes/queue' 'routes/stripe' diff --git a/server/lib/paypal.coffee b/server/lib/paypal.coffee index 6cbf469b000..fd493f93c9a 100644 --- a/server/lib/paypal.coffee +++ b/server/lib/paypal.coffee @@ -8,6 +8,7 @@ paypal.configure({ 'client_secret': config.paypal.clientSecret }) +Promise.promisifyAll(paypal.billingAgreement) Promise.promisifyAll(paypal.payment) module.exports = paypal diff --git a/server/middleware/products.coffee b/server/middleware/products.coffee index 7880a3ee481..00e4f8d8066 100644 --- a/server/middleware/products.coffee +++ b/server/middleware/products.coffee @@ -18,6 +18,7 @@ get = wrap (req, res) -> # Remove old unsupported subscription products products = _.filter products, (p) -> p.name not in ['year_subscription', 'lifetime_subscription2'] + products = _.filter(products, (p) -> p.i18nCoverage?) if req.query.view is 'i18n-coverage' for p in products if p.coupons? @@ -68,6 +69,7 @@ productStubs = [ amount: 100 gems: 3500 planID: 'basic' + payPalBillingPlanID: 'P-23R58281B73475317X2K7B4A' } { @@ -97,6 +99,7 @@ productStubs = [ amount: 0 gems: 1500 planID: 'basic' + payPalBillingPlanID: 'P-2KP02511G2731913DX2K4IKA' } { diff --git a/server/middleware/subscriptions.coffee b/server/middleware/subscriptions.coffee index bc0cf6732d4..7bfb4f20261 100644 --- a/server/middleware/subscriptions.coffee +++ b/server/middleware/subscriptions.coffee @@ -10,10 +10,11 @@ Product = require '../models/Product' Payment = require '../models/Payment' User = require '../models/User' database = require '../commons/database' -{ getSponsoredSubsAmount } = require '../../app/core/utils' +{ getSponsoredSubsAmount, isRegionalSubscription } = require '../../app/core/utils' StripeUtils = require '../lib/stripe_utils' slack = require '../slack' paypal = require '../lib/paypal' +{isProduction} = require '../../server_config' subscribeWithPrepaidCode = expressWrap (req, res) -> { ppc } = req.body @@ -31,6 +32,8 @@ subscribeWithPrepaidCode = expressWrap (req, res) -> subscribeUser = co.wrap (req, user) -> if (not req.user) or req.user.isAnonymous() or user.isAnonymous() throw new errors.Unauthorized('You must be signed in to subscribe.') + if user.get('payPal.billingAgreementID') + throw new errors.Forbidden('You already have a PayPal subscription.') # NOTE: This token is really a stripe token *id* { token, prepaidCode } = req.body.stripe @@ -220,6 +223,9 @@ purchaseProduct = expressWrap (req, res) -> unless /lifetime_subscription$/.test productName throw new errors.UnprocessableEntity('Unsupported product') + if req.user.get('payPal.billingAgreementID') + throw new errors.Forbidden('You already have a PayPal subscription.') + # if there user already has a subscription, cancel it and find the date it ends customer = yield StripeUtils.getCustomerAsync(req.user, req.body.stripe?.token or req.body.token) if customer @@ -227,7 +233,7 @@ purchaseProduct = expressWrap (req, res) -> if subscription stripeSubscriptionPeriodEndDate = new Date(subscription.current_period_end * 1000) yield StripeUtils.cancelSubscriptionImmediatelyAsync(req.user, subscription) - + paymentType = req.body.service or 'stripe' gems = product.get('gems') if paymentType is 'stripe' @@ -239,7 +245,7 @@ purchaseProduct = expressWrap (req, res) -> description: req.body.description productID: product.get('name') } - + amount = product.get('amount') if req.body.coupon? coupon = _.find product.get('coupons'), ((x) -> x.code is req.body.coupon) @@ -247,10 +253,10 @@ purchaseProduct = expressWrap (req, res) -> throw new errors.NotFound('Coupon not found') amount = coupon.amount metadata.couponCode = coupon.code - + charge = yield StripeUtils.createChargeAsync(req.user, amount, metadata) payment = yield StripeUtils.createPaymentAsync(req.user, charge, {productID: product.get('name')}) - + else if paymentType is 'paypal' { payerID, paymentID } = req.body amount = product.get('amount') @@ -282,7 +288,14 @@ purchaseProduct = expressWrap (req, res) -> productID: product.get('name') }) yield payment.save() - + + if payerID = payPalPayment?.payer?.payer_info?.payer_id + userPayPalData = _.clone(req.user.get('payPal')) + userPayPalData ?= {} + userPayPalData.payerID = payerID + req.user.set('payPal', userPayPalData) + yield req.user.save() + else throw new errors.UnprocessableEntity('Unsupported payment provider') @@ -317,6 +330,84 @@ purchaseProduct = expressWrap (req, res) -> SubscriptionHandler.logSubscriptionError(req.user, "#{productName} sale Slack tower msg error: #{JSON.stringify(error)}") res.send(req.user.toObject({req})) +createPayPalBillingAgreement = expressWrap (req, res) -> + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to create a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() + product = yield Product.findById(req.body.productID) + throw new errors.NotFound('Product not found') unless product + planId = product.get('payPalBillingPlanID') + throw new errors.UnprocessableEntity("No PayPal billing plan for product #{product.id}") unless planId + + try + name = product.get('displayName') + name = "[TEST agreement] #{name}" unless isProduction + description = product.get('displayDescription') + description = "[TEST agreeement] #{description}" unless isProduction + # Date creation from paypal node lib example: https://github.com/paypal/PayPal-node-SDK/blob/master/samples/subscription/billing_agreements/create.js + isoDate = new Date() + isoDate.setSeconds(isoDate.getSeconds() + 4) + billingAgreementAttributes = { + name + description + "start_date": isoDate, + "plan": { + "id": planId + }, + "payer": { + "payment_method": 'paypal' + } + } + billingAgreement = yield paypal.billingAgreement.createAsync(billingAgreementAttributes) + return res.status(201).send(billingAgreement) + catch e + log.error 'PayPal create billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal create billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) + +executePayPalBillingAgreement = expressWrap (req, res) -> + # NOTE: internal payment saved in paypal webhook, not here + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to execute a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') if req.user.hasSubscription() + throw new errors.NotFound('PayPal executed billing agreement token required.') unless req.body.token + + try + billingAgreement = yield paypal.billingAgreement.executeAsync(req.body.token, {}) + userPayPalData = _.clone(req.user.get('payPal')) + userPayPalData ?= {} + if userPayPalData.payerID and userPayPalData.payerID isnt billingAgreement.payer.payer_info.payer_id + log.warning "New payerID for #{req.user.id}, #{userPayPalData.payerID} => #{billingAgreement.payer.payer_info.payer_id}" + userPayPalData.billingAgreementID = billingAgreement.id + userPayPalData.payerID = billingAgreement.payer.payer_info.payer_id + userPayPalData.subscribeDate = new Date() + req.user.set('payPal', userPayPalData) + yield req.user.save() + return res.send(billingAgreement) + catch e + log.error 'PayPal execute billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal execute billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) + +cancelPayPalBillingAgreement = expressWrap (req, res) -> + yield module.exports.cancelPayPalBillingAgreementInternal req + res.sendStatus(204) + +cancelPayPalBillingAgreementInternal = co.wrap (req) -> + if (not req.user) or req.user.isAnonymous() + throw new errors.Unauthorized('You must be signed in to cancel a PayPal billing agreeement.') + throw new errors.Forbidden('Already subscribed.') unless req.user.hasSubscription() + + try + billingAgreementID = req.body.billingAgreementID ? req.user.get('payPal')?.billingAgreementID + throw new errors.UnprocessableEntity('No PayPal billing agreement') unless billingAgreementID + yield paypal.billingAgreement.cancelAsync(billingAgreementID, {"note": "Canceling CodeCombat Premium Subscription"}) + userPayPalData = _.clone(req.user.get('payPal') ? {}) + delete userPayPalData.billingAgreementID + userPayPalData.cancelDate = new Date() + req.user.set('payPal', userPayPalData) + yield req.user.save() + catch e + log.error 'PayPal cancel billing agreement error:', JSON.stringify(e, null, '\t') + throw new errors.UnprocessableEntity('PayPal cancel billing agreement failed', {i18n: 'subscribe.paypal_payment_error'}) # TODO: Delete all 'unsubscribeRecipient' code when managed subscriptions are no more unsubscribeRecipientEndpoint = expressWrap (req, res) -> @@ -409,6 +500,10 @@ module.exports = { unsubscribeRecipientEndpoint unsubscribeRecipientAsync purchaseProduct + createPayPalBillingAgreement + executePayPalBillingAgreement + cancelPayPalBillingAgreement + cancelPayPalBillingAgreementInternal checkForCoupon checkForExistingSubscription } diff --git a/server/middleware/users.coffee b/server/middleware/users.coffee index 2c03922e32f..5dc86cdc890 100644 --- a/server/middleware/users.coffee +++ b/server/middleware/users.coffee @@ -107,6 +107,8 @@ module.exports = # Delete personal subscription if userToDelete.get('stripe.subscriptionID') yield middleware.subscriptions.unsubscribeUser(req, userToDelete, false) + if userToDelete.get('payPal.billingAgreementID') + yield middleware.subscriptions.cancelPayPalBillingAgreementInternal(req) # Delete recipient subscription sponsorID = userToDelete.get('stripe.sponsorID') @@ -501,5 +503,5 @@ module.exports = } }) ] - return res.send(200) + return res.sendStatus(200) diff --git a/server/models/Payment.coffee b/server/models/Payment.coffee index c29814ed2fd..e834d634620 100644 --- a/server/models/Payment.coffee +++ b/server/models/Payment.coffee @@ -3,5 +3,7 @@ config = require '../../server_config' PaymentSchema = new mongoose.Schema({}, {strict: false, read:config.mongo.readpref}) PaymentSchema.index({recipient: 1, 'stripe.timestamp': 1, 'ios.transactionID'}, {unique: true, name: 'unique payment'}) +PaymentSchema.index({'payPal.id': 1}, {unique: true, name: 'unique PayPal payment'}) +PaymentSchema.index({'payPalSale.id': 1}, {unique: true, name: 'unique PayPal sale payment'}) module.exports = mongoose.model('payment', PaymentSchema) diff --git a/server/models/Product.coffee b/server/models/Product.coffee index 15710b3fdd2..fbef076e1ca 100644 --- a/server/models/Product.coffee +++ b/server/models/Product.coffee @@ -2,9 +2,14 @@ mongoose = require('mongoose') config = require '../../server_config' co = require 'co' ProductSchema = new mongoose.Schema({}, {strict: false,read:config.mongo.readpref}) +plugins = require '../plugins/plugins' +jsonSchema = require '../../app/schemas/models/product.schema' ProductSchema.index({name: 1}, {name: 'name index'}) +ProductSchema.plugin(plugins.TranslationCoveragePlugin) +ProductSchema.plugin(plugins.PatchablePlugin) + ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> basicProductName = 'basic_subscription' if country = user.get 'country' @@ -14,4 +19,11 @@ ProductSchema.statics.findBasicSubscriptionForUser = co.wrap (user) -> product = yield @findOne {name: basicProductName} return product +ProductSchema.statics.jsonSchema = jsonSchema + +ProductSchema.statics.editableProperties = [ + 'i18n', + 'i18nCoverage' +] + module.exports = mongoose.model('product', ProductSchema) diff --git a/server/models/User.coffee b/server/models/User.coffee index 6551e3b8e1a..0c831ec7e7f 100644 --- a/server/models/User.coffee +++ b/server/models/User.coffee @@ -351,11 +351,15 @@ UserSchema.methods.sendWelcomeEmail = -> log.error "sendwithus post-save error: #{err}, result: #{result}" if err UserSchema.methods.hasSubscription = -> - return false unless stripeObject = @get('stripe') - return true if stripeObject.sponsorID - return true if stripeObject.subscriptionID - return true if stripeObject.free is true - return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) + if payPal = @get('payPal') + return payPal.billingAgreementID + else if stripeObject = @get('stripe') + return true if stripeObject.sponsorID + return true if stripeObject.subscriptionID + return true if stripeObject.free is true + return true if _.isString(stripeObject.free) and new Date() < new Date(stripeObject.free) + false + UserSchema.methods.isPremium = -> return true if @isInGodMode() diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 08b46d85df1..939047639e1 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -189,6 +189,9 @@ module.exports.setup = (app) -> app.post('/db/user/:handle/check-for-new-achievement', mw.auth.checkLoggedIn(), mw.users.checkForNewAchievement) app.post('/db/user/:handle/destudent', mw.auth.checkHasPermission(['admin']), mw.users.destudent) app.post('/db/user/:handle/deteacher', mw.auth.checkHasPermission(['admin']), mw.users.deteacher) + app.post('/db/user/:handle/paypal/create-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.createPayPalBillingAgreement) + app.post('/db/user/:handle/paypal/execute-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.executePayPalBillingAgreement) + app.post('/db/user/:handle/paypal/cancel-billing-agreement', mw.auth.checkLoggedIn(), mw.subscriptions.cancelPayPalBillingAgreement) app.post('/db/user/:handle/reset_progress', mw.users.resetProgress) app.post('/db/user/:handle/signup-with-facebook', mw.users.signupWithFacebook) app.post('/db/user/:handle/signup-with-gplus', mw.users.signupWithGPlus) @@ -216,6 +219,11 @@ module.exports.setup = (app) -> app.post('/db/prepaid/:handle/joiners', mw.prepaids.addJoiner) app.delete('/db/prepaid/:handle/redeemers', mw.prepaids.revoke) + Product = require '../models/Product' + app.post('/db/products/:handle/patch', mw.auth.checkLoggedIn(), mw.patchable.postPatch(Product, 'product')) + app.get('/db/products/:handle/patches', mw.patchable.patches(Product)) + app.get('/db/products/:handle', mw.rest.getByHandle(Product)) + app.put('/db/products/:handle', mw.auth.checkHasUser(), mw.rest.put(Product)) app.get('/db/products', mw.auth.checkHasUser(), mw.products.get) app.post('/db/products/:handle/purchase', mw.auth.checkLoggedIn(), mw.subscriptions.purchaseProduct) diff --git a/server/routes/paypal.coffee b/server/routes/paypal.coffee new file mode 100644 index 00000000000..22101475184 --- /dev/null +++ b/server/routes/paypal.coffee @@ -0,0 +1,96 @@ +errors = require '../commons/errors' +co = require 'co' +expressWrap = require 'co-express' +log = require 'winston' +mongoose = require 'mongoose' +paypal = require '../lib/paypal' +Payment = require '../models/Payment' +Product = require '../models/Product' +User = require '../models/User' + +module.exports.setup = (app) -> + app.post '/paypal/webhook', expressWrap (req, res) -> + try + if req.body.event_type is "PAYMENT.SALE.COMPLETED" + yield handlePaymentSucceeded(req, res) + else if req.body.event_type is "BILLING.SUBSCRIPTION.CANCELLED" + yield handleSubscriptionCancelled(req, res) + else + log.info "PayPal webhook unknown event #{req.body.event_type}" + return res.status(200).send("PayPal webhook unknown event #{req.body.event_type}") + catch e + log.error 'PayPal webhook error:', JSON.stringify(e, null, '\t') + return res.status(500).send() + + handlePaymentSucceeded = co.wrap (req, res) -> + payPalSalePayment = req.body.resource + unless payPalSalePayment?.state is 'completed' + log.error "PayPal webhook payment incomplete state: #{payPalSalePayment?.id} #{payPalSalePayment?.state}" + return res.status(200).send("PayPal webhook payment incomplete state: #{payPalSalePayment?.id} #{payPalSalePayment?.state}") + + if payPalSalePayment.billing_agreement_id + return yield handleBillingAgreementPaymentSucceeded(req, res, payPalSalePayment) + else if payPalSalePayment.parent_payment + # One-time full payments not handled here (e.g. lifetime subscriptions) + return res.status(200).send() + + log.warning "PayPal webhook unrecognized sale payment #{JSON.stringify(payPalSalePayment)}" + return res.status(200).send("PayPal webhook unrecognized sale payment #{JSON.stringify(payPalSalePayment)}") + + handleBillingAgreementPaymentSucceeded = co.wrap (req, res, payPalSalePayment) -> + # Recurring purchases (e.g. monthly subs) + # No full payments via parent_payment property + # Assumes only called for basic_subscription product currently + + # Check for existing payment + payment = yield Payment.findOne({'payPalSale.id': payPalSalePayment.id}) + return res.status(200).send("Payment already recorded for #{payPalSalePayment.id}") if payment + + billingAgreementID = payPalSalePayment.billing_agreement_id + user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) + unless user + log.error "PayPal webhook payment no user found: #{payPalSalePayment.id} #{billingAgreementID}" + return res.status(200).send("PayPal webhook payment no user found: #{payPalSalePayment.id} #{billingAgreementID}") + + basicSubProduct = yield Product.findBasicSubscriptionForUser(user) + productID = basicSubProduct?.get('name') + unless /basic_subscription/.test(productID) + log.error "PayPal webhook unexpected sub for user: #{user.id} #{productID}" + return res.status(200).send("PayPal webhook unexpected sub for user: #{user.id} #{productID}") + + amount = Math.round(parseFloat(payPalSalePayment.amount.total) * 100) + gems = basicSubProduct.get('gems') + + payment = new Payment({ + purchaser: user.get('_id') + recipient: user.get('_id') + created: new Date().toISOString() + service: 'paypal' + amount + gems + payPalSale: payPalSalePayment + productID + }) + yield payment.save() + + return res.status(200).send() + + + handleSubscriptionCancelled = co.wrap (req, res) -> + billingAgreement = req.body?.resource + unless billingAgreement + log.error("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") + return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement given for #{req.body.event_type} #{JSON.stringify(req.body)}") + + billingAgreementID = billingAgreement.id + user = yield User.findOne({'payPal.billingAgreementID': billingAgreementID}) + unless user + log.error("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") + return res.status(200).send("PayPal webhook subscription cancellation, no billing agreement for #{billingAgreementID}") + + userPayPalData = _.clone(user.get('payPal') ? {}) + delete userPayPalData.billingAgreementID + userPayPalData.cancelDate = new Date() + user.set('payPal', userPayPalData) + yield user.save() + return res.status(200).send() diff --git a/spec/server/functional/subscription.spec.coffee b/spec/server/functional/subscription.spec.coffee index 4d400c3e785..f31dc606b21 100644 --- a/spec/server/functional/subscription.spec.coffee +++ b/spec/server/functional/subscription.spec.coffee @@ -718,6 +718,18 @@ describe 'Subscriptions', -> nockDone() done() + it 'returns 403 when trying to subscribe with stripe over an existing PayPal subscription', utils.wrap -> + user = yield utils.initUser() + yield utils.loginUser(user) + user.set('payPal.billingAgreementID', 'foo') + yield user.save() + requestBody = user.toObject() + requestBody.stripe = + planID: 'basic' + token: {id: 'bar'} + [res, body] = yield request.putAsync({uri: userURL, json: requestBody, headers: headers }) + expect(res.statusCode).toBe(403) + describe 'APIs', -> # TODO: Refactor these tests to be use yield, be independent of one another, and move to products.spec.coffee # TODO: year tests converted to lifetime, but should be reviewed for usefulness @@ -989,92 +1001,712 @@ describe 'DELETE /db/user/:handle/stripe/recipients/:recipientHandle', -> describe 'POST /db/products/:handle/purchase', -> - it 'accepts PayPal payments', utils.wrap -> - # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock + describe 'when logged in user', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + yield utils.populateProducts() - user = yield utils.initUser() - yield utils.loginUser(user) - yield utils.populateProducts() - product = yield Product.findOne({ name: 'lifetime_subscription' }) - amount = product.get('amount') - url = utils.getUrl("/db/products/#{product.id}/purchase") - json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } - - payPalResponse = { - "id": "PAY-03466", - "intent": "sale", - "state": "approved", - "cart": "3J885", - "payer": { - "payment_method": "paypal", - "status": "VERIFIED", - "payer_info": { - "email": user.get('email'), - "first_name": "test", - "last_name": "buyer", - "payer_id": "VUR529XNB59XY", + describe 'when subscribed', -> + beforeEach utils.wrap -> + @billingAgreementID = 1234 + @user.set('payPal.billingAgreementID', @billingAgreementID) + yield @user.save() + + it 'denies PayPal payments', utils.wrap -> + product = yield Product.findOne({ name: 'lifetime_subscription' }) + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(403) + + describe 'when NOT subscribed', -> + it 'accepts PayPal payments', utils.wrap -> + # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock + + product = yield Product.findOne({ name: 'lifetime_subscription' }) + amount = product.get('amount') + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY' } + + payPalResponse = { + "id": "PAY-03466", + "intent": "sale", + "state": "approved", + "cart": "3J885", + "payer": { + "payment_method": "paypal", + "status": "VERIFIED", + "payer_info": { + "email": @user.get('email'), + "first_name": "test", + "last_name": "buyer", + "payer_id": "VUR529XNB59XY", + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + }, + "country_code": "US" + } + }, + "transactions": [ + { + "amount": { + "total": (amount/100).toFixed(2), + "currency": "USD", + "details": {} + }, + "payee": { + "merchant_id": "7R5CJJ", + "email": "payments@codecombat.com" + }, + "description": "Lifetime Subscription", + "item_list": { + "items": [ + { + "name": "lifetime_subscription", + "sku": product.id, + "price": (amount/100).toFixed(2), + "currency": "USD", + "quantity": 1 + } + ], + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + } + }, + "related_resources": [] # bunch more info in here + } + ], + "create_time": "2017-07-13T22:35:45Z", + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", + "rel": "self", + "method": "GET" + } + ], + "httpStatusCode": 200 + } + spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) + + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(200) + payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) + expect(payment).toBeDefined() + expect(payment.get('productID')).toBe(product.get('name')) + expect(payment.get('payPal.id')).toBe(payPalResponse.id) + user = yield User.findById(@user.id) + expect(user.get('stripe.free')).toBe(true) + expect(user.get('payPal').payerID).toEqual(payPalResponse.payer.payer_info.payer_id) + +describe 'POST /db/user/:handle/paypal', -> + describe '/create-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "name":"[TEST agreement] CodeCombat Premium Subscription", + "description":"[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "plan":{ + "id": "TODO", + "state":"ACTIVE", + "name":"[TEST plan] CodeCombat Premium Subscription", + "description":"[TEST plan] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "type":"INFINITE", + "payment_definitions":[ + { + "id":"PD-2M295453FC097664LX2K4IKA", + "name":"Regular payment definition", + "type":"REGULAR", + "frequency":"Day", + "amount":{ + "currency":"USD", + "value": "TODO" + }, + "cycles":"0", + "charge_models":[ + + ], + "frequency_interval":"1" + } + ], + "merchant_preferences":{ + "setup_fee":{ + "currency":"USD", + "value":"0" + }, + "max_fail_attempts":"0", + "return_url":"http://localhost:3000/paypal/subscribe-callback", + "cancel_url":"http://localhost:3000/paypal/cancel-callback", + "auto_bill_amount":"YES", + "initial_fail_amount_action":"CONTINUE" + } + }, + "links":[ + { + "href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-92B61638JR311510D", + "rel":"approval_url", + "method":"REDIRECT" + }, + { + "href":"https://api.sandbox.paypal.com/v1/payments/billing-agreements/EC-92B61638JR311510D/agreement-execute", + "rel":"execute", + "method":"POST" + } + ], + "start_date":"2017-08-08T18:47:06.681Z", + "httpStatusCode":201 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'basic_subscription' }) + + it 'returns 401 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user already subscribed', -> + beforeEach utils.wrap -> + @user.set('payPal.billingAgreementID', 'foo') + yield @user.save() + @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) + + it 'returns 403 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(403) + expect(@user.get('payPal.billingAgreementID')).toEqual('foo') + + describe 'when invalid product', -> + + it 'returns 422 and does not create a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + [res, body] = yield request.postAsync({ url, json: {productID: 99999} }) + + expect(res.statusCode).toBe(422) + + describe 'when regional product', -> + beforeEach utils.wrap -> + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'brazil_basic_subscription' }) + @payPalResponse.plan.id = @product.get('payPalBillingPlanID') + @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) + + it 'creates a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(201) + expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) + expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) + + describe 'when basic product', -> + beforeEach utils.wrap -> + yield utils.populateProducts() + @product = yield Product.findOne({ name: 'basic_subscription' }) + @payPalResponse.plan.id = @product.get('payPalBillingPlanID') + @payPalResponse.plan.payment_definitions[0].amount.value = parseFloat(@product.get('amount') / 100).toFixed(2) + + it 'creates a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/create-billing-agreement") + spyOn(paypal.billingAgreement, 'createAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {productID: @product.id} }) + expect(res.statusCode).toBe(201) + expect(body.plan.id).toEqual(@product.get('payPalBillingPlanID')) + expect(body.plan.payment_definitions[0].amount.value).toEqual(parseFloat(@product.get('amount') / 100).toFixed(2)) + + describe '/execute-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "id": "I-3HNGD4BKF09P", + "state": "Active", + "description": "[TEST agreeement] A CodeCombat Premium subscription gives you access to exclusive levels, heroes, equipment, pets and more!", + "payer": { + "payment_method": "paypal", + "status": "verified", + "payer_info": { + "email": "foo@bar.com", + "first_name": "Foo", + "last_name": "Bar", + "payer_id": "1324", + } + }, + "plan": { + "payment_definitions": [ + { + "type": "REGULAR", + "frequency": "Day", + "amount": { + "value": "TODO" + }, + "cycles": "0", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "0.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "0.00" + } + } + ], + "frequency_interval": "1" + } + ], + "merchant_preferences": { + "setup_fee": { + "value": "0.00" + }, + "max_fail_attempts": "0", + "auto_bill_amount": "YES" + }, + "links": [], + "currency_code": "USD" + }, + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-3HNGD4BKF09P", + "rel": "self", + "method": "GET" + } + ], + "start_date": "2017-08-08T07:00:00Z", + "agreement_details": { + "outstanding_balance": { + "value": "0.00" + }, + "cycles_remaining": "0", + "cycles_completed": "0", + "next_billing_date": "2017-08-08T10:00:00Z", + "final_payment_date": "1970-01-01T00:00:00Z", + "failed_payment_count": "0" + }, + "httpStatusCode": 200 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + + it 'returns 401 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user already subscribed', -> + beforeEach utils.wrap -> + @user.set('payPal.billingAgreementID', 'foo') + yield @user.save() + + it 'returns 403 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(403) + expect(@user.get('payPal.billingAgreementID')).toEqual('foo') + + describe 'when no token', -> + + it 'returns 404 and does not execute a billing agreement', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(404) + + describe 'when token passed', -> + + it 'subscribes the user', utils.wrap -> + expect(@user.hasSubscription()).not.toBeTruthy() + url = utils.getUrl("/db/user/#{@user.id}/paypal/execute-billing-agreement") + spyOn(paypal.billingAgreement, 'executeAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {token: 'foo' }}) + expect(res.statusCode).toBe(200) + expect(body.id).toEqual(@payPalResponse.id) + user = yield User.findById @user.id + userPayPalData = user.get('payPal') + expect(userPayPalData.billingAgreementID).toEqual(@payPalResponse.id) + expect(userPayPalData.payerID).toEqual(@payPalResponse.payer.payer_info.payer_id) + expect(userPayPalData.subscribeDate).toBeDefined() + expect(userPayPalData.subscribeDate).toBeLessThan(new Date()) + expect(user.hasSubscription()).toBeTruthy() + + describe '/cancel-billing-agreement', -> + beforeEach utils.wrap -> + @payPalResponse = { + "httpStatusCode": 204 + } + + describe 'when user NOT logged in', -> + beforeEach utils.wrap -> + @user = yield utils.becomeAnonymous() + yield utils.populateProducts() + + it 'no billing agreement cancelled', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(401) + expect(@user.isAnonymous()).toBeTruthy() + + describe 'when user logged in', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + + describe 'when user not subscribed', -> + + it 'no billing agreement cancelled', utils.wrap -> + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + [res, body] = yield request.postAsync({ url }) + expect(res.statusCode).toBe(403) + + describe 'when user subscribed', -> + beforeEach utils.wrap -> + @billingAgreementID = 1234 + @user.set('payPal.billingAgreementID', @billingAgreementID) + yield @user.save() + + it 'user unsubscribed', utils.wrap -> + expect(@user.hasSubscription()).toBeTruthy() + url = utils.getUrl("/db/user/#{@user.id}/paypal/cancel-billing-agreement") + spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve(@payPalResponse)) + [res, body] = yield request.postAsync({ url, json: {billingAgreementID: @billingAgreementID} }) + expect(res.statusCode).toBe(204) + user = yield User.findById @user.id + expect(user.get('payPal').billingAgreementID).not.toBeDefined() + expect(user.get('payPal').cancelDate).toBeDefined() + expect(user.get('payPal').cancelDate).toBeLessThan(new Date()) + expect(user.hasSubscription()).not.toBeTruthy() + +describe 'POST /paypal/webhook', -> + beforeEach utils.wrap -> + yield utils.clearModels([User, Payment]) + + describe 'when unknown event', -> + + it 'returns 200 and info message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: {event_type: "UNKNOWN.EVENT"} }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual('PayPal webhook unknown event UNKNOWN.EVENT') + + describe 'when PAYMENT.SALE.COMPLETED event', -> + + describe 'when billing agreement payment', -> + beforeEach utils.wrap -> + @paymentEventData = { + "id":"WH-7UE28022AT424841V-9DJ65866TC5772327", + "event_version":"1.0", + "create_time":"2017-08-07T23:33:37.176Z", + "resource_type":"sale", + "event_type":"PAYMENT.SALE.COMPLETED", + "summary":"Payment completed for $ 0.99 USD", + "resource":{ + "id":"3C172741YC758734U", + "state":"completed", + "amount":{ + "total":"0.99", + "currency":"USD", + "details":{ + + } + }, + "payment_mode":"INSTANT_TRANSFER", + "protection_eligibility":"ELIGIBLE", + "protection_eligibility_type":"ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE", + "transaction_fee":{ + "value":"0.02", + "currency":"USD" + }, + "billing_agreement_id":"I-H3HN1PXG1SEV", + "create_time":"2017-08-07T23:33:10Z", + "update_time":"2017-08-07T23:33:10Z", + "links":[ + { + "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U", + "rel":"self", + "method":"GET" + }, + { + "href":"https://api.sandbox.paypal.com/v1/payments/sale/3C172741YC758734U/refund", + "rel":"refund", + "method":"POST" + } + ] + }, + "links":[ + { + "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327", + "rel":"self", + "method":"GET" + }, + { + "href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-7UE28022AT424841V-9DJ65866TC5772327/resend", + "rel":"resend", + "method":"POST" + } + ] + } + + describe 'when incomplete', -> + + it 'returns 200 and incomplete message', utils.wrap -> + @paymentEventData.resource.state = 'incomplete' + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook payment incomplete state: #{@paymentEventData.resource.id} #{@paymentEventData.resource.state}") + + describe 'when no user with billing agreement', -> + + it 'returns 200 and no user message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook payment no user found: #{@paymentEventData.resource.id} #{@paymentEventData.resource.billing_agreement_id}") + + describe 'when user with billing agreement', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + @user.set('payPal.billingAgreementID', @paymentEventData.resource.billing_agreement_id) + yield @user.save() + + xdescribe 'when no basic_subscription product for user', -> + beforeEach utils.wrap -> + # TODO: populateProducts runs once, so this could mess with following tests. + yield utils.clearModels([Product]) + + it 'returns 200 and unexpected sub message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook unexpected sub for user: #{@user.id} undefined") + + describe 'when basic_subscription product exists for user', -> + beforeEach utils.wrap -> + yield Product({name: 'basic_subscription'}).save() + + describe 'when no previous payment recorded', -> + beforeEach utils.wrap -> + yield utils.clearModels([Payment]) + + it 'creates a new payment', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + payment = yield Payment.findOne({'payPalSale.id': @paymentEventData.resource.id}) + expect(payment).toBeTruthy() + expect(payment.get('purchaser').toString()).toEqual(@user.id) + + describe 'when previous payment already recorded', -> + beforeEach utils.wrap -> + yield utils.clearModels([Payment]) + yield Payment({'payPalSale.id': @paymentEventData.resource.id}).save() + payments = yield Payment.find({'payPalSale.id': @paymentEventData.resource.id}).lean() + expect(payments?.length).toEqual(1) + + it 'does not create a new payment', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("Payment already recorded for #{@paymentEventData.resource.id}") + payments = yield Payment.find({'payPalSale.id': @paymentEventData.resource.id}).lean() + expect(payments?.length).toEqual(1) + + describe 'when BILLING.SUBSCRIPTION.CANCELLED event', -> + beforeEach utils.wrap -> + @paymentEventData = { + "id": "WH-6TD369808N914414D-1YJ376786E892292F", + "create_time": "2016-04-28T11:53:10Z", + "resource_type": "Agreement", + "event_type": "BILLING.SUBSCRIPTION.CANCELLED", + "summary": "A billing subscription was cancelled", + "resource": { "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", + "recipient_name": "Cool Buyer", + "line1": "3rd st", + "line2": "cool", "city": "San Jose", "state": "CA", - "postal_code": "95131", + "postal_code": "95112", "country_code": "US" }, - "country_code": "US" - } - }, - "transactions": [ - { - "amount": { - "total": (amount/100).toFixed(2), - "currency": "USD", - "details": {} - }, - "payee": { - "merchant_id": "7R5CJJ", - "email": "payments@codecombat.com" - }, - "description": "Lifetime Subscription", - "item_list": { - "items": [ + "id": "I-PE7JWXKGVN0R", + "plan": { + "curr_code": "USD", + "links": [], + "payment_definitions": [ { - "name": "lifetime_subscription", - "sku": product.id, - "price": (amount/100).toFixed(2), - "currency": "USD", - "quantity": 1 + "type": "TRIAL", + "frequency": "Month", + "frequency_interval": "1", + "amount": { + "value": "5.00" + }, + "cycles": "5", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "1.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "1.00" + } + } + ] + }, + { + "type": "REGULAR", + "frequency": "Month", + "frequency_interval": "1", + "amount": { + "value": "10.00" + }, + "cycles": "15", + "charge_models": [ + { + "type": "TAX", + "amount": { + "value": "2.00" + } + }, + { + "type": "SHIPPING", + "amount": { + "value": "1.00" + } + } + ] } ], - "shipping_address": { - "recipient_name": "test buyer", - "line1": "1 Main St", - "city": "San Jose", - "state": "CA", - "postal_code": "95131", - "country_code": "US" + "merchant_preferences": { + "setup_fee": { + "value": "0.00" + }, + "auto_bill_amount": "YES", + "max_fail_attempts": "21" } }, - "related_resources": [] # bunch more info in here - } - ], - "create_time": "2017-07-13T22:35:45Z", - "links": [ - { - "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", - "rel": "self", - "method": "GET" - } - ], - "httpStatusCode": 200 - } - spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) + "payer": { + "payment_method": "paypal", + "status": "verified", + "payer_info": { + "email": "coolbuyer@example.com", + "first_name": "Cool", + "last_name": "Buyer", + "payer_id": "XLHKRXRA4H7QY", + "shipping_address": { + "recipient_name": "Cool Buyer", + "line1": "3rd st", + "line2": "cool", + "city": "San Jose", + "state": "CA", + "postal_code": "95112", + "country_code": "US" + } + } + }, + "description": "update desc", + "agreement_details": { + "outstanding_balance": { + "value": "0.00" + }, + "num_cycles_remaining": "5", + "num_cycles_completed": "0", + "last_payment_date": "2016-04-28T11:29:54Z", + "last_payment_amount": { + "value": "1.00" + }, + "final_payment_due_date": "2017-11-30T10:00:00Z", + "failed_payment_count": "0" + }, + "state": "Cancelled", + "links": [ + { + "href": "https://api.paypal.com/v1/payments/billing-agreements/I-PE7JWXKGVN0R", + "rel": "self", + "method": "GET" + } + ], + "start_date": "2016-04-30T07:00:00Z" + }, + "links": [ + { + "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F", + "rel": "self", + "method": "GET", + "encType": "application/json" + }, + { + "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-6TD369808N914414D-1YJ376786E892292F/resend", + "rel": "resend", + "method": "POST", + "encType": "application/json" + } + ], + "event_version": "1.0" + } - [res] = yield request.postAsync({ url, json }) - expect(res.statusCode).toBe(200) - payment = yield Payment.findOne({"payPal.id":"PAY-03466"}) - expect(payment).toBeDefined() - expect(payment.get('productID')).toBe(product.get('name')) - expect(payment.get('payPal.id')).toBe(payPalResponse.id) - user = yield User.findById(user.id) - expect(user.get('stripe.free')).toBe(true) + describe 'when incomplete', -> + + it 'returns 200 and incomplete message', utils.wrap -> + @paymentEventData.resource.state = 'incomplete' + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: {event_type: "BILLING.SUBSCRIPTION.CANCELLED"}}) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement given for #{@paymentEventData.event_type} #{JSON.stringify({event_type: "BILLING.SUBSCRIPTION.CANCELLED"})}") + + describe 'when no user with billing agreement', -> + + it 'returns 200 and no user message', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + expect(res.body).toEqual("PayPal webhook subscription cancellation, no billing agreement for #{@paymentEventData.resource.id}") + + describe 'when user with billing agreement', -> + beforeEach utils.wrap -> + @user = yield utils.initUser() + yield utils.loginUser(@user) + @user.set('payPal.billingAgreementID', @paymentEventData.resource.id) + yield @user.save() + + it 'unsubscribes user and returns 200', utils.wrap -> + url = getURL('/paypal/webhook') + [res, body] = yield request.postAsync({ uri: url, json: @paymentEventData }) + expect(res.statusCode).toEqual(200) + user = yield User.findById @user.id + expect(user.get('payPal.billingAgreementID')).not.toBeDefined() + expect(user.hasSubscription()).not.toBeTruthy() diff --git a/spec/server/functional/user.spec.coffee b/spec/server/functional/user.spec.coffee index 7bbf6cea393..f8ec0e88a1a 100644 --- a/spec/server/functional/user.spec.coffee +++ b/spec/server/functional/user.spec.coffee @@ -16,13 +16,14 @@ Promise = require 'bluebird' Achievement = require '../../../server/models/Achievement' EarnedAchievement = require '../../../server/models/EarnedAchievement' LevelSession = require '../../../server/models/LevelSession' +paypal = require '../../../server/lib/paypal' mongoose = require 'mongoose' describe 'POST /db/user', -> beforeEach utils.wrap -> yield utils.clearModels [User] - + it 'converts the password into a hash', utils.wrap -> yield utils.becomeAnonymous() email = 'some-name@email.com' @@ -35,7 +36,7 @@ describe 'POST /db/user', -> expect(user.get('passwordHash')[..5] in ['31dc3d', '948c7e']).toBeTruthy() expect(user.get('permissions')).toBeUndefined() - + describe 'PUT /db/user', -> it 'returns 422 when no data is provided', utils.wrap -> @@ -51,7 +52,7 @@ describe 'PUT /db/user', -> user2 = yield utils.initUser() [res] = yield request.putAsync(utils.getUrl('/db/user'), json: {_id: user2.id}) expect(res.statusCode).toBe(403) - + it 'returns 422 for invalid data', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -60,7 +61,7 @@ describe 'PUT /db/user', -> [res] = yield request.putAsync utils.getUrl('/db/user'), { json } expect(res.statusCode).toBe(422) expect(res.body[0].message.indexOf('too long')).toBeGreaterThan(-1) - + it 'does not allow permission editing', utils.wrap -> user = yield utils.initUser() yield utils.loginUser(user) @@ -108,7 +109,7 @@ describe 'PUT /db/user', -> expect(user.get('name')).toBe('Wilhelm') expect(user.get('emailLower')).toBe('new@email.com') expect(user.get('email')).toBe('New@email.com') - + it 'returns 409 if setting to a taken username ', utils.wrap -> user1 = yield utils.initUser() yield utils.loginUser(user1) @@ -137,7 +138,7 @@ describe 'PUT /db/user', -> yield new Promise (resolve) -> setTimeout(resolve, 10) classroom = yield Classroom.findById(classroom.id) expect(classroom.get('members').length).toBe(0) - + it 'changes the role regardless of emailVerified', utils.wrap -> user = yield utils.initUser() user.set('emailVerified', true) @@ -166,7 +167,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { email: '', name: '' }} expect(body.code).toBe(422) expect(body.message).toEqual('User needs a username or email address') - + it 'allows unsetting email on student accounts, even when there\'s a user with email and emailLower set to empty string', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {email: '', emailLower: ''}}) @@ -198,7 +199,7 @@ describe 'PUT /db/user', -> [res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { name: '' }} expect(res.statusCode).toBe(200) expect(res.body.name).toBeUndefined() - + it 'works even when user object does not pass validation', utils.wrap -> invalidUser = yield utils.initUser() yield invalidUser.update({$set: {propNotInSchema: '...'}}) @@ -218,7 +219,7 @@ describe 'PUT /db/user', -> user2 = yield utils.becomeAnonymous() [res] = yield request.putAsync { url: utils.getUrl("/db/user/#{user2.id}"), json: { name }} expect(res.statusCode).toBe(200) - + describe 'PUT /db/user/-/become-student', -> beforeEach utils.wrap -> @@ -458,7 +459,7 @@ describe 'GET /db/user', -> # Add to the test case above an extra data check # xit 'can fetch another user with restricted fields' - + describe 'GET /db/user?email=:email', -> beforeEach utils.wrap -> yield Promise.promisify(clearModels)([User]) @@ -547,7 +548,7 @@ describe 'GET /db/user?email=:email', -> it 'returns 403', utils.wrap -> [res, body] = yield request.getAsync({ url: @url, json: true }) expect(res.statusCode).toBe(403) - + describe 'GET /db/user/:handle', -> it 'populates coursePrepaid from coursePrepaidID', utils.wrap -> user = yield utils.initUser({coursePrepaidID: mongoose.Types.ObjectId()}) @@ -596,7 +597,7 @@ describe 'DELETE /db/user/:handle', -> expect(classroom.get('deletedMembers').length).toBe(1) expect(classroom.get('members')[0].toString()).toEqual(user2.id) expect(classroom.get('deletedMembers')[0].toString()).toEqual(user.id) - + it 'returns 401 if no cookie session', utils.wrap -> yield utils.logout() [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/1234"} @@ -638,7 +639,18 @@ describe 'DELETE /db/user/:handle', -> expect(res.statusCode).toBe(200) # other login no longer valid user = yield User.findById(user.id) expect(user.get('email')).toBe(json.email) - + + describe 'when PayPal subscribed', -> + it 'deleting user unsubscribes', utils.wrap -> + user = yield utils.initUser() + user.set('payPal.billingAgreementID', 'foo') + yield user.save() + yield utils.loginUser(user) + spyOn(paypal.billingAgreement, 'cancelAsync').and.returnValue(Promise.resolve({})) + [res, body] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{user.id}"} + user = yield User.findById user.id + expect(user.get('payPal.billingAgreementID')).not.toBeDefined() + describe 'when the user is the recipient of a subscription', -> beforeEach utils.wrap -> yield utils.clearModels([User]) @@ -667,7 +679,7 @@ describe 'DELETE /db/user/:handle', -> yield utils.populateProducts() spyOn(stripe.customers, 'cancelSubscription').and.callFake (cId, sId, cb) -> cb(null) spyOn(stripe.customers, 'updateSubscription').and.callFake (cId, sId, opts, cb) -> cb(null) - + it 'unsubscribes the user', utils.wrap -> yield utils.loginUser(@recipient1) [res] = yield request.delAsync {uri: "#{getURL(urlUser)}/#{@recipient1.id}"} @@ -701,7 +713,7 @@ describe 'Statistics', -> ThangType = require '../../../server/models/ThangType' User = require '../../../server/models/User' UserHandler = require '../../../server/handlers/user_handler' - + beforeEach utils.wrap -> session = new LevelSession name: 'Beat Gandalf' @@ -717,7 +729,7 @@ describe 'Statistics', -> it 'keeps track of games completed', utils.wrap -> user = yield User.findById(@user.id) expect(user.get 'stats.gamesCompleted').toBe 1 - + it 'recalculates games completed', utils.wrap (done) -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -763,7 +775,7 @@ describe 'Statistics', -> admin = yield utils.initAdmin() yield utils.loginUser(admin) - + [res] = yield request.postAsync {uri:url, json: article} expect(res.statusCode).toBe 201 @@ -802,7 +814,7 @@ describe 'Statistics', -> done() - + describe 'GET /db/user/:handle/level.sessions', -> url = getURL('/db/level.session/') session = @@ -845,11 +857,11 @@ describe 'GET /db/user/:handle/level.sessions', -> describe 'POST /db/user/:handle/signup-with-password', -> - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 10)) - + it 'signs up the user with the password and sends welcome emails', utils.wrap -> spyOn(sendwithus.api, 'send') user = yield utils.becomeAnonymous() @@ -925,7 +937,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'returns 409 if there is already a user with the same slug', utils.wrap -> name = 'some username' name2 = 'Some. User.Namé' @@ -938,7 +950,7 @@ describe 'POST /db/user/:handle/signup-with-password', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) expect(res.body.message).toBe('Username already taken') - + it 'disassociates the user from their trial request if the trial request email and signup email do not match', utils.wrap -> user = yield utils.becomeAnonymous() trialRequest = yield utils.makeTrialRequest({ properties: { email: 'one@email.com' } }) @@ -968,7 +980,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> facebookID = '12345' facebookEmail = 'some@email.com' name = 'someusername' - + validFacebookResponse = new Promise((resolve) -> resolve({ id: facebookID, email: facebookEmail, @@ -982,7 +994,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> updated_time: '2015-12-08T17:10:39+0000', verified: true })) - + invalidFacebookResponse = new Promise((resolve) -> resolve({ error: { message: 'Invalid OAuth access token.', @@ -991,11 +1003,11 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> fbtrace_id: 'EC4dEdeKHBH' } })) - + beforeEach utils.wrap -> yield utils.clearModels([User]) yield new Promise((resolve) -> setTimeout(resolve, 50)) - + it 'signs up the user with the facebookID and sends welcome emails', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) spyOn(sendwithus.api, 'send') @@ -1008,7 +1020,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> expect(updatedUser.get('email')).toBe(facebookEmail) expect(updatedUser.get('facebookID')).toBe(facebookID) expect(sendwithus.api.send).toHaveBeenCalled() - + it 'returns 422 if facebook does not recognize the access token', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(invalidFacebookResponse) user = yield utils.becomeAnonymous() @@ -1016,20 +1028,20 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> json = { email: facebookEmail, facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + it 'returns 422 if the email or id do not match', utils.wrap -> spyOn(facebook, 'fetchMe').and.returnValue(validFacebookResponse) user = yield utils.becomeAnonymous() url = getURL("/db/user/#{user.id}/signup-with-facebook") - + json = { name, email: 'some-other@email.com', facebookID, facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + json = { name, email: facebookEmail, facebookID: '54321', facebookAccessToken: '...' } [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(422) - + # TODO: Fix this test, res.statusCode is occasionally 200 # it 'returns 409 if there is already a user with the given email', utils.wrap -> @@ -1042,7 +1054,7 @@ describe 'POST /db/user/:handle/signup-with-facebook', -> # [res, body] = yield request.postAsync({url, json}) # expect(res.statusCode).toBe(409) - + describe 'POST /db/user/:handle/signup-with-gplus', -> gplusID = '12345' gplusEmail = 'some@email.com' @@ -1126,11 +1138,11 @@ describe 'POST /db/user/:handle/signup-with-gplus', -> [res, body] = yield request.postAsync({url, json}) expect(res.statusCode).toBe(409) updatedUser = yield User.findById(user.id) - + describe 'POST /db/user/:handle/destudent', -> beforeEach utils.wrap -> yield utils.clearModels([User, Classroom, CourseInstance, Course, Campaign]) - + it 'removes a student user from all classrooms and unsets their role property', utils.wrap -> student1 = yield utils.initUser({role: 'student'}) student2 = yield utils.initUser({role: 'student'}) @@ -1146,12 +1158,12 @@ describe 'POST /db/user/:handle/destudent', -> url = getURL("/db/user/#{student1.id}/destudent") [res, body] = yield request.postAsync({url, json:true}) - + student1 = yield User.findById(student1.id) student2 = yield User.findById(student2.id) classroom = yield Classroom.findById(classroom.id) courseInstance = yield CourseInstance.findById(courseInstance.id) - + expect(student1.get('role')).toBeUndefined() expect(student2.get('role')).toBe('student') expect(classroom.get('members').length).toBe(1) @@ -1183,7 +1195,7 @@ describe 'POST /db/user/:handle/deteacher', -> teacher = yield User.findById(teacher.id) expect(teacher.get('role')).toBeUndefined() - + describe 'POST /db/user/:handle/check-for-new-achievements', -> achievementURL = getURL('/db/achievement') achievementJSON = { @@ -1200,12 +1212,12 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> description: 'Started playing Dungeon Arena.' related: 'a' } - - + + beforeEach utils.wrap -> yield utils.clearModels [Achievement, EarnedAchievement, LevelSession, User] Achievement.resetAchievements() - + it 'finds new achievements and awards them to the user', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1221,18 +1233,18 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> [res, body] = yield request.postAsync { uri: achievementURL, json: achievementJSON } achievementUpdated = res.body.updated expect(res.statusCode).toBe(201) - + user = yield User.findById(user.id) expect(user.get('earned')).toBeUndefined() - + yield utils.loginUser(user) [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(175) earned = yield EarnedAchievement.count() expect(earned).toBe(1) expect(body.lastAchievementChecked).toBe(achievementUpdated) - - + + it 'updates the user if they already earned the achievement but the rewards changed', utils.wrap -> user = yield utils.initUser({points: 100}) yield utils.loginUser(user) @@ -1267,7 +1279,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.statusCode).toBe(200) # special case: no worth, should default to 10 - + yield achievement.update({ $set: {updated: new Date().toISOString()}, $unset: {worth:''} @@ -1276,7 +1288,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> expect(res.body.earned.gems).toBe(100) expect(res.body.points).toBe(110) expect(res.statusCode).toBe(200) - + it 'works for level sessions', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) @@ -1296,7 +1308,7 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> json = true [res, body] = yield request.postAsync({ url, json }) expect(body.points).toBe(200) - + # check idempotency achievement.set('updated', new Date().toISOString()) yield achievement.save() @@ -1341,16 +1353,16 @@ describe 'POST /db/user/:handle/check-for-new-achievements', -> admin = yield User.findById(admin.id) expect(admin.get('lastAchievementChecked')).toBe(achievement.get('updated')) - + describe 'POST /db/user/:userID/request-verify-email', -> mailChimp = require '../../../server/lib/mail-chimp' - + beforeEach utils.wrap -> spyOn(mailChimp.api, 'put').and.returnValue(Promise.resolve()) @user = yield utils.initUser() verificationCode = @user.verificationCode(new Date().getTime()) @url = utils.getURL("/db/user/#{@user.id}/verify/#{verificationCode}") - + it 'sets emailVerified to true and updates MailChimp', utils.wrap -> [res, body] = yield request.postAsync({ @url, json: true }) expect(res.statusCode).toBe(200) @@ -1358,7 +1370,7 @@ describe 'POST /db/user/:userID/request-verify-email', -> user = yield User.findById(@user.id) expect(user.get('emailVerified')).toBe(true) - + describe 'POST /db/user/:userId/reset_progress', -> it 'clears the user\'s level sessions, earned achievements and various user settings', utils.wrap -> userSettings = { @@ -1369,7 +1381,7 @@ describe 'POST /db/user/:userId/reset_progress', -> spent: 10 heroConfig: {thangType: 'qwerty'} } - + user = yield utils.initUser(userSettings) otherUser = yield utils.initUser(userSettings) @@ -1377,7 +1389,7 @@ describe 'POST /db/user/:userId/reset_progress', -> otherSession = yield utils.makeLevelSession({}, {creator:otherUser}) otherEarnedAchievement = new EarnedAchievement({ user: otherUser.id }) yield otherEarnedAchievement.save() - + yield utils.loginUser(user) session = yield utils.makeLevelSession({}, {creator:user}) earnedAchievement = new EarnedAchievement({ user: user.id }) @@ -1386,19 +1398,19 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + stillExist = yield [ LevelSession.findById(session.id) EarnedAchievement.findById(earnedAchievement.id) ] expect(_.any(stillExist)).toBe(false) - + othersStillExist = yield [ LevelSession.findById(otherSession.id) EarnedAchievement.findById(otherEarnedAchievement.id) ] expect(_.all(othersStillExist)).toBe(true) # did not delete other user stuff - + user = yield User.findById(user.id).lean() expect(user.points).toBe(0) expect(user.stats.gamesCompleted).toBe(0) @@ -1407,16 +1419,16 @@ describe 'POST /db/user/:userId/reset_progress', -> expect(user.purchased.items).toDeepEqual([]) expect(user.spent).toBe(0) expect(user.heroConfig).toBeUndefined() - + otherUser = yield User.findById(otherUser.id).lean() expect(otherUser.points).toBe(10) - + it 'allows anonymous users to reset their progress', utils.wrap -> user = yield utils.becomeAnonymous() url = utils.getUrl("/db/user/#{user.id}/reset_progress") [res, body] = yield request.postAsync({ url }) expect(res.statusCode).toBe(200) - + it 'returns 403 for other users', utils.wrap -> user1 = yield utils.initUser() user2 = yield utils.initUser() @@ -1424,14 +1436,14 @@ describe 'POST /db/user/:userId/reset_progress', -> url = utils.getUrl("/db/user/#{user2.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 403 for admins', utils.wrap -> admin = yield utils.initAdmin() yield utils.loginUser(admin) url = utils.getUrl("/db/user/#{admin.id}/reset_progress") [res] = yield request.postAsync({ url }) expect(res.statusCode).toBe(403) - + it 'returns 401 for non-logged in users', utils.wrap -> yield utils.logout() url = utils.getUrl("/db/user/12345/reset_progress") diff --git a/spec/server/unit/subscriptions.spec.coffee b/spec/server/unit/subscriptions.spec.coffee index 51d1b4e57d9..2507f40642b 100644 --- a/spec/server/unit/subscriptions.spec.coffee +++ b/spec/server/unit/subscriptions.spec.coffee @@ -1,11 +1,10 @@ subscriptions = require '../../../server/middleware/subscriptions' +Product = require '../../../server/models/Product' utils = require '../utils' describe 'checkForCoupon', -> - beforeEach utils.wrap -> - yield utils.populateProducts() - it 'normally calls checkForExistingSubscription without a defined couponID', utils.wrap -> + yield utils.populateProducts() req = {} user = yield utils.initUser({country: 'united-states'}) customer = {} @@ -19,6 +18,8 @@ describe 'checkForCoupon', -> expect(couponID).toBeUndefined() it 'adds country coupons if the user is from a country with a country-specific basic product', utils.wrap -> + # TODO: yield utils.populateProducts() only yields two products when all tests run + yield Product({name: 'brazil_basic_subscription'}).save() req = {} user = yield utils.initUser({country: 'brazil'}) customer = {} diff --git a/test/app/collections/Products.spec.coffee b/test/app/collections/Products.spec.coffee new file mode 100644 index 00000000000..d57829d4130 --- /dev/null +++ b/test/app/collections/Products.spec.coffee @@ -0,0 +1,14 @@ +describe 'ProductModel', -> + # Temporarily turn ajax back on for a real call to /db/products + beforeEach -> jasmine.Ajax.uninstall() + afterEach -> jasmine.Ajax.install() + it 'basic_subscription products have payPalBillingPlanID set', (done) -> + $.ajax("/db/products") + .done (data, textStatus, jqXHR) => + for product in data + continue unless /basic_subscription/.test(product.name) + expect(product.payPalBillingPlanID).toBeDefined() + done() + .fail (jqXHR, textStatus, errorThrown) => + console.error(jqXHR, textStatus, errorThrown) + done(textStatus) From 761e91eef182583736e884600884b1659480554f Mon Sep 17 00:00:00 2001 From: Fernanda Rodrigues Date: Wed, 16 Aug 2017 17:18:29 +0100 Subject: [PATCH 031/227] translating content to pt-br. --- app/locale/en-US.coffee | 2 +- app/locale/pt-BR.coffee | 130 ++++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index 5753f30fb31..bc99d549cd2 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -279,7 +279,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # ask_teacher_1: "Ask your teacher for your Class Code." # ask_teacher_2: "Not part of a class? Create an " # ask_teacher_3: "Individual Account" -# ask_teacher_4: " instead." +# ask_teacher_4: " ao invés." # about_to_join: "You're about to join:" # enter_parent_email: "Enter your parent’s email address:" # parent_email_error: "Something went wrong when trying to send the email. Check the email address and try again." diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index c8ba17747fe..d902d14799e 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -14,18 +14,18 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " designed_with: "Projetado com professores em mente" real_code: "Código escrito, de verdade" from_the_first_level: "a partir do primeiro nível" - getting_students: "Fazer os estudantes digitarem o código o mais rapido possível é fundamental para aprender a sintaxe de programação e estrutura apropriada." + getting_students: "Fazer os estudantes escreverem código o mais rapido possível é fundamental para aprender a sintaxe de programação e estrutura apropriada." educator_resources: "Recursos do educador" course_guides: "e guia dos cursos" - teaching_computer_science: "Ensinar ciência da computação não requer um diploma oneroso, pois nós disponibilizamos ferramentas para apoiar todos os tipos de educadores." - accessible_to: "Acessível a" + teaching_computer_science: "Ensinar ciência da computação não requer um diploma, pois nós disponibilizamos ferramentas para apoiar todos os tipos de educadores." + accessible_to: "Acessível para" everyone: "todos" - democratizing: "Democratizar o processo de aprendizagem de codificação é o objectivo da nossa filosofia. Qualquer um deve ser capaz de aprender a programar." + democratizing: "Democratizar o processo de aprendizagem de programação é o objectivo da nossa filosofia. Qualquer um deve ser capaz de aprender a programar." forgot_learning: "Eu acho que eles realmente esqueceram que estavam aprendendo de verdade." wanted_to_do: "Programar é algo que eu sempre quis fazer, e eu nunca pensei que seria capaz de aprender isso na escola." why_games: "Porque é importante aprender através de jogos?" games_reward: "Jogos recompensam o esforço produtivo." - encourage: "Jogar é um meio de encorajar a interação, descoberta, e a tentativa e erro. Um bom jogo desafia o jogador a dominar as habilidades com o tempo, que é o mesmo processo crítico que alunos passam quando eles estão aprendendo algo." + encourage: "Jogar é um meio de encorajar a interação, descoberta, e a tentativa e erro. Um bom jogo desafia o jogador a dominar as habilidades com o tempo, que é o mesmo processo crítico que alunos passam quando estão aprendendo algo." excel: "Jogos destacam-se pela recompesa do" struggle: "esforço produtivo" kind_of_struggle: "o tipo de esforço resultante do aprendizado é cativante," @@ -36,14 +36,14 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " compared: "comparados" conventional: "com métodos de avaliação convencional a diferença é clara: jogos são melhores e ajudam alunos a reter o conhecimento, concentração e" perform_at_higher_level: "desenvolver um nível superior de realização" - feedback: "Jogos também fornecem respostas em tempo real permitindo que os alunos criem seus caminhos para a solução e entendam conceitos mais holisticamente, ao invés de limitar as repostas como “corretas” ou “incorretas”." + feedback: "Jogos também fornecem respostas em tempo real permitindo que os alunos criem seus caminhos para a solução e entendam conceitos de forma mais holística, ao invés de limitar as repostas como “corretas” ou “incorretas”." real_game: "Um jogo de verdade, com programação de verdade." - great_game: "Um grande jogo é mais do que apenas emblemas e realizações - Isso é sobre a jornada de um jogador, quebra-cabeças bem desenhados, e a habilidade para enfrentar desafios com ação e confiança." - agency: "CodeCombat é um jogo que fornece aos jogadores essa ação e confiança com nosso robusto motor de digitação de código, que ajuda alunos iniciantes e avançados tanto na escrita quanto na validação do código." + great_game: "Um grande jogo é mais do que apenas emblemas e conquistas, é sobre a jornada de um jogador, enigmas bem desenhados, e a habilidade para enfrentar desafios com ação e confiança." + agency: "CodeCombat é um jogo que fornece aos jogadores essa ação e confiança com nosso robusto mecanisno de digitação de código, que ajuda alunos iniciantes e avançados tanto na escrita quanto na validação do código." request_demo_title: "Começe a ensinar hoje!" request_demo_subtitle: "Solicite uma demonstração e começe com seus alunos em menos de uma hora." - get_started_title: "Construa sua turma hoje" - get_started_subtitle: "Construa sua turma, adicione seus alunos e acompanhe o progresso deles na aprendizagem de ciência da computação." + get_started_title: "Crie sua turma hoje" + get_started_subtitle: "Crie sua turma, adicione seus alunos e acompanhe o progresso deles na aprendizagem de ciência da computação." request_demo: "Solicite uma Demonstração" setup_a_class: "Gerencie a Turma" have_an_account: "Tem uma conta?" @@ -54,19 +54,19 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " ffa: "Grátis para estudantes" lesson_time: "Tempo da lição:" coming_soon: "Em breve!" - courses_available_in: "Os cursos estão disponíveis em JavaScript, Python e Java (em breve!)" # {change} - boast: "Dispomos de enigmas que são complexos o suficiente para fascinar tanto jogadores como programadores." + courses_available_in: "Os cursos estão disponíveis em JavaScript e Python. Os cursos de desenvolvimento web utilizam HTML, CSS, jQuery e Bootstrap." # {change} + boast: "Possuimos enigmas que são complexos o suficiente para fascinar tanto jogadores como programadores." winning: "A combinação perfeita de jogabilidade de um RPG e lições de programação é o que torna a educação infantil legitimamente agradável." - run_class: "Tudo o que você precisa para criar uma turma de ciência da computação em sua escola hoje, nenhuma conhecimento em termos técnicos é necessário." + run_class: "Tudo o que você precisa para criar uma turma de ciência da computação em sua escola hoje, nenhuma conhecimento técnico é necessário." goto_classes: "Ir para Minhas Turmas" view_profile: "Visualizar Meu Perfil" view_progress: "Visualizar Progresso" go_to_courses: "Ir para Meus Cursos" - want_coco: "Quer CodeCombat na sua escola?" + want_coco: "Quer o CodeCombat na sua escola?" nav: -# map: "Map" - play: "Jogar" # The top nav bar entry where players choose which levels to play + map: "Mapa" + play: "Níveis" # The top nav bar entry where players choose which levels to play community: "Comunidade" courses: "Cursos" blog: "Blog" @@ -81,12 +81,12 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " about: "Sobre" contact: "Contate-nos" twitter_follow: "Seguir" - my_classrooms: "Minhas Salas de Aula" + my_classrooms: "Minhas Turmas" my_courses: "Meus Cursos" careers: "Carreiras" facebook: "Facebook" twitter: "Twitter" - create_a_class: "Crie uma classe" + create_a_class: "Criar uma Turma" other: "Outro" learn_to_code: "Aprenda a programar!" toggle_nav: "Alternar navegação" @@ -110,7 +110,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " diplomat_suggestion: title: "Ajude a traduzir o CodeCombat!" # This shows up when a player switches to a non-English language using the language selector. sub_heading: "Nós precisamos de suas habilidades linguísticas." - pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores de todo o mundo. Muitos deles querem jogar em Português Brasileiro por não falar Inglês, por isso, se você conhece os dois idiomas, por favor, considere inscrever-se no programa para Diplomata e assim ajudar a traduzir tanto o site do CodeCombat quanto todos os estágios para o Português Brasileiro." + pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores de todo o mundo. Muitos deles querem jogar em Português Brasileiro por não falar Inglês, por isso, se você conhece os dois idiomas, por favor, considere inscrever-se no programa para Diplomata e ajude a traduzir tanto o site do CodeCombat quanto todos os níveis para o Português Brasileiro." missing_translations: "Até que possamos traduzir todo o conteúdo para o Português Brasileiro, você lerá o texto em Inglês quando a versão em Português Brasileiro não estiver disponível." learn_more: "Saiba mais sobre ser um Diplomata" subscribe_as_diplomat: "Inscrever-se como um Diplomata" @@ -144,17 +144,17 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " anonymous: "Jogador Anônimo" level_difficulty: "Dificuldade: " play_classroom_version: "Jogue a versão de classe" # Choose a level in campaign version that you also can play in one of your courses - campaign_beginner: "Campanha Iniciante" - awaiting_levels_adventurer_prefix: "Nós liberamos cinco níveis por semana." # {change} - awaiting_levels_adventurer: "Cadastre-se como um aventureiro" - awaiting_levels_adventurer_suffix: "para ser o primeiro a jogar as novas fases." + campaign_beginner: "Campanha para Iniciantes" + awaiting_levels_adventurer_prefix: "liberamos novos níveis a cada semana." # {change} + awaiting_levels_adventurer: "Inscreva-se como um Aventureiro" + awaiting_levels_adventurer_suffix: "para ser o primeiro a jogar os novos níveis." adjust_volume: "Ajuste o volume" campaign_multiplayer: "Arenas Multijogador" campaign_multiplayer_description: "... nas quais você programará cara-a-cara contra outros jogadores." - brain_pop_done: "Você derrotou os Ogres programando! Você venceu!" -# brain_pop_challenge: "Challenge yourself to play again using a different programming language!" + brain_pop_done: "Você derrotou os Ogros programando! Você venceu!" + brain_pop_challenge: "Desafie-se a jogar novamente usando outra linguagem de programação!" # replay: "Replay" -# back_to_classroom: "Back to Classroom" + back_to_classroom: "Voltar para Turma" code: if: "se" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) @@ -166,7 +166,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " break: "parar" continue: "continuar" pass: "passar" - return: "devolver" + return: "retorna" then: "então" do: "fazer" end: "fim" @@ -215,7 +215,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " title: "Excelente Trabalho, Aprendiz" login: - sign_up: "Criar conta" + sign_up: "Criar Conta" email_or_username: "Email ou nome de usuário" log_in: "Entrar" logging_in: "Entrando" @@ -232,9 +232,9 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " create_student_header: "Criar conta de Aluno" create_teacher_header: "Criar conta de Professor" create_individual_header: "Criar conta Individual" - email_announcements: " Receber notícias por email sobre novas fases e características do CodeCombat." # {change} + email_announcements: "Receba notícias por email sobre novos níveis e características do CodeCombat." # {change} creating: "Criando uma nova conta..." - sign_up: "Criar conta" + sign_up: "Criar Conta" log_in: "Entre com a senha" required: "Você precisa fazer login antes de ir por esse caminho." login_switch: "Já possui uma conta?" @@ -244,66 +244,66 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " connected_gplus_header: "Você se conectou com sucesso ao Google+!" connected_gplus_p: "Conclua sua inscrição para que você possa fazer login com sua conta do Google+." gplus_exists: "Você já tem uma conta associada com o Google+!" - connected_facebook_header: "Você se conectou com sucesso ao Facebook!" + connected_facebook_header: "Você se conectou com sucesso usando o Facebook!" connected_facebook_p: "Conclua sua inscrição para que você possa fazer login com sua conta do Facebook." facebook_exists: "Você já tem uma conta associada com o Facebook!" - hey_students: "Estudantes, insira o código de classe do seu professor." + hey_students: "Estudantes, insiram o código de classe do seu professor." birthday: "Aniversário" - parent_email_blurb: "Nós sabemos que você não vê a hora de aprender programação ; nós estamos animados tambem ! Seus responsáveis irão receber um email com mais instruçoes em como criar uma conta para você .Mande um email {{email_link}} se ouver alguma pergunta." - classroom_not_found: "Nenhuma classe existe com esse codigo.Veja se o codigo esta correto ou peça ajuda ao seu professor." - checking: "Checando..." - account_exists: "Esse email já esta sendo usado:" - sign_in: "Logar" - email_good: "Email parece bom!" - name_taken: "Esse nome de usuario já esta sendo usado! Tente {{suggestedName}}?" + parent_email_blurb: "Sabemos que você não vê a hora de aprender programação — nós estamos animados também! Seus responsáveis irão receber um email com mais instruçoes sobre como criar uma conta para você. Mande um email para {{email_link}} se houver alguma pergunta." + classroom_not_found: "Nenhuma turma existe com esse código. Verifique se o código está correto ou peça ajuda ao seu professor." + checking: "Verificando..." + account_exists: "Este email já esta sendo usado:" + sign_in: "Entrar" + email_good: "O Email parece bom!" + name_taken: "Este nome de usuário já está sendo usado! Tente {{suggestedName}}?" name_available: "Nome disponível!" - name_is_email: "O nome de usuario não pode ser um email" + name_is_email: "O nome de usuário não pode ser um email" choose_type: "Escolha seu tipo de conta:" - teacher_type_1: "Ensine programação usando CodeCombat!" - teacher_type_2: "Organize sua sala" - teacher_type_3: "Acessar seus guias de curso" + teacher_type_1: "Ensine programação usando o CodeCombat!" + teacher_type_2: "Organize sua turma" + teacher_type_3: "Acessar Guias do Curso" teacher_type_4: "Ver progresso do estudante" signup_as_teacher: "Cadastrar Professor" student_type_1: "Aprenda programação enquanto se diverte jogando!" - student_type_2: "Jogue com sua classe" + student_type_2: "Jogue com sua turma" student_type_3: "Competir em arenas" student_type_4: "Escolha seu herói!" - student_type_5: "Tenha o seu codigo de classe pronto!" + student_type_5: "Tenha o seu código de turma pronto!" signup_as_student: "Cadastrar Estudante" - individuals_or_parents: "Individuais e resposáveis" - individual_type: "Para aprender a programar fora da classe.Os responsáveis devem requerer uma conta aqui." + individuals_or_parents: "Individuais e Resposáveis" + individual_type: "Para aprender a programar fora de uma turma. Os responsáveis devem se inscrever aqui." signup_as_individual: "Cadastrar Usuário Comum" - enter_class_code: "Coloque seu código de classe" - enter_birthdate: "Coloque sua data de aniversário:" + enter_class_code: "Coloque seu código de turma" + enter_birthdate: "Coloque sua data de nascimento:" parent_use_birthdate: "Pais ou responsável, use sua data de nascimento." ask_teacher_1: "Pergunte ao seu professor qual o código da sua turma." ask_teacher_2: "Não faz parte da turma? Crie uma " - ask_teacher_3: "Conta Pessoal" + ask_teacher_3: "Conta Individual" ask_teacher_4: " como alternativa." - about_to_join: "Sobre juntar-se:" - enter_parent_email: "Informe o endereço de e-mail de seus pais:" + about_to_join: "Você está prestes a se juntar a:" + enter_parent_email: "Informe o endereço de e-mail de seus pais ou responsável:" parent_email_error: "Algo de errado aconteceu ao tentar enviar o email. Verifique o endereço de email e tente novamente." - parent_email_sent: "Nós enviamos um email com mais instruções de como criar uma conta. Solicite aos seus pais para que verifiquem suas caixas de emails." - account_created: "Conta criada!" + parent_email_sent: "Nós enviamos um email com mais instruções de como criar uma conta. Solicite aos seus pais ou responsável para que verifiquem suas caixas de emails." + account_created: "Conta Criada!" confirm_student_blurb: "Anote suas informações para que você não esqueça. Seu professor também pode ajudá-lo reiniciando sua senha a qualquer momento." - confirm_individual_blurb: "Anote suas informações de acesso no caso de você dela depois. Verifique seu e-mail para que você possa recuperar sua senha caso a tenha esquecid. Verifique sua caixa de entrada de emails!" - write_this_down: "Escreva isso:" - start_playing: "Comece jogando!" + confirm_individual_blurb: "Anote suas informações de acesso, caso precise depois. Verifique seu e-mail para que você possa recuperar sua senha caso tenha esquecido." + write_this_down: "Anote isto:" + start_playing: "Comece a jogar!" sso_connected: "Conectado com sucesso como:" select_your_starting_hero: "Selecione um herói para começar:" you_can_always_change_your_hero_later: "Você poderá mudar seu herói depois." finish: "Fim" - teacher_ready_to_create_class: "Você está pronto para criar sua primeira classe!" + teacher_ready_to_create_class: "Você está pronto para criar sua primeira turma!" teacher_students_can_start_now: "Seus estudantes poderão começar a jogar o primeiro curso, Introdução a Ciência da Computação, imediatamente" - teacher_list_create_class: "Na próxima tela você poderá criar uma nova classe" - teacher_list_add_students: "Adicione estudantes à classe clicando no link Ver Classe, então envie para os estudantes o Código de Classe ou URL. Você também pode convidá-los por email se eles tiverem endereços de email." + teacher_list_create_class: "Na próxima tela você poderá criar uma nova turna" + teacher_list_add_students: "Adicione estudantes à turma clicando no link Ver Turma e envie o Código da Turma ou URL. Você também pode convidá-los por email, se eles tiverem." teacher_list_resource_hub_1: "Confira o" teacher_list_resource_hub_2: "Guias de Curso" - teacher_list_resource_hub_3: "para soluções de todo nível, e o" + teacher_list_resource_hub_3: "para soluções de todos os nívelis, e o" teacher_list_resource_hub_4: "Centro de Recursos" teacher_list_resource_hub_5: "para guia de currículo, atividades e mais!" teacher_additional_questions: "Isso é tudo! Se você precisar de ajuda adicional ou tiver perguntas, encontre-nos em __supportEmail__." - dont_use_our_email_silly: "Não coloque o nosso email aqui! Use o email do seus pais." + dont_use_our_email_silly: "Não coloque o nosso email aqui! Use o email do seus pais ou responsável." recover: recover_account_title: "Recuperar conta" @@ -639,7 +639,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " prompt_title: "Gemas insuficientes" prompt_body: "Você quer adquirir mais gemas?" prompt_button: "Entrar na loja" - recovered: "Gemas das compras anteriores recuperadas. Por favor atualize a pagina." + recovered: "Gemas das compras anteriores recuperadas. Por favor atualize a página." price: "x{{gems}} / mês" # buy_premium: "Buy Premium" # purchase: "Purchase" @@ -852,7 +852,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " ex: "ex" # Abbreviation of "example" current_value: "Valor Atual" default_value: "Valor Padrão" - parameters: "Parametros" + parameters: "Parâmetros" required_parameters: "Parâmetros necessários" optional_parameters: "Parâmetros opcionais" returns: "Retorno" @@ -894,7 +894,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " matt_title: "Cofundador, CTO" # {change} cat_title: "Designer de Jogos" # {change} cat_blurb: "Airbender" - scott_title: "Cofundado, Eng. de Software" # {change} + scott_title: "Cofundador, Eng. de Software" # {change} scott_blurb: "O Sensato" maka_title: "Defensor dos Clientes" maka_blurb: "Contador de Histórias" From 8bd99656ca686534d5a89f7d98bfe2f74d965c9e Mon Sep 17 00:00:00 2001 From: Fernanda Rodrigues Date: Wed, 16 Aug 2017 17:21:52 +0100 Subject: [PATCH 032/227] translating content to pt-br. --- app/locale/en-US.coffee | 2 +- app/locale/pt-BR.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index bc99d549cd2..5753f30fb31 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -279,7 +279,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # ask_teacher_1: "Ask your teacher for your Class Code." # ask_teacher_2: "Not part of a class? Create an " # ask_teacher_3: "Individual Account" -# ask_teacher_4: " ao invés." +# ask_teacher_4: " instead." # about_to_join: "You're about to join:" # enter_parent_email: "Enter your parent’s email address:" # parent_email_error: "Something went wrong when trying to send the email. Check the email address and try again." diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index d902d14799e..04f414f22e8 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -279,7 +279,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " ask_teacher_1: "Pergunte ao seu professor qual o código da sua turma." ask_teacher_2: "Não faz parte da turma? Crie uma " ask_teacher_3: "Conta Individual" - ask_teacher_4: " como alternativa." + ask_teacher_4: "ao invés." about_to_join: "Você está prestes a se juntar a:" enter_parent_email: "Informe o endereço de e-mail de seus pais ou responsável:" parent_email_error: "Algo de errado aconteceu ao tentar enviar o email. Verifique o endereço de email e tente novamente." From 7b45bff362d200a8db9f1e2d8424b1351bbdf9cb Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 12:19:36 -0700 Subject: [PATCH 033/227] Add Create Task Practice 1 doc to resource hub Also adjust styling to only add margins to root-level ul's. This is so that nested ul's (like in this added doc) don't have lots of margins. --- app/assets/markdown/create-task-practice-1.md | 518 ++++++++++++++++++ .../teachers/markdown-resource-view.sass | 2 +- .../teachers/ap-cs-principles-view.jade | 5 + 3 files changed, 524 insertions(+), 1 deletion(-) create mode 100644 app/assets/markdown/create-task-practice-1.md diff --git a/app/assets/markdown/create-task-practice-1.md b/app/assets/markdown/create-task-practice-1.md new file mode 100644 index 00000000000..3e818596cfa --- /dev/null +++ b/app/assets/markdown/create-task-practice-1.md @@ -0,0 +1,518 @@ +#### Table of Contents +* [Overview of AP CS Principles Create Task](#overview-of-ap-cs-principles-create-task) +* ["Using Game Development 1 as Practice"](#using-game-development-1-as-practice) + * ["Days 1-3"](#days-1-3) + * ["Document the Process"](#document-the-process) + * ["Brainstorming"](#brainstorming) + * ["Day 4 - Iterating"](#day-4-iterating) + * ["Design"](#design) + * ["Implement"](#implement) + * ["Test"](#test) + * ["Repeat"](#repeat) + * ["AP CS Principles Practice: Written Responses"](#ap-cs-principles-practice-written-responses) +* ["What's Next"](#what-s-next) + +# Overview of AP CS Principles Create Task + +Programming is a creative process that brings ideas to life. Programs can help solve problems, enable innovations, or express personal interests. For the Create Performance Task, students will develop a program of their choice, in a programming language of their choice. + +CodeCombat's Computer Science (CS) courses teach programming through a series of puzzles (levels) the students solve with code. Designing and implementing an original creative program requires a different approach than solving a specific, given problem - and that's where CodeCombat's Game Development (GD) and Web Development (WD) courses shine: each course leads up to a final project, where the student creates her own original work. These projects serve as a great opportunity to practice for the AP CSP Create Task, which requires the student to submit a program of their own creation, either to solve a problem they're interested in, or as a creative expression. (Learning Objectives 5.1.1 and 5.1.2) + +By playing CodeCombat's Game and Web Development courses, students will gain valuable practice in applying the iterative "design - implement - test" process, creating their own abstractions and algorithms, and collaborating with peers as co-creators and play testers. Multiple practice opportunities throughout CodeCombat’s AP CS Principles syllabus will allow students to focus on various components of the Create task. This guide focuses on the first of those practice opportunities in Game Development 1. + +Side note: Students may choose to develop their final project within CodeCombat, or they may use another programming environment that they're familiar with. + +**AP CS Principles Create Task Requirements** + +Summary of the [“Create” Performance Task for AP CS Principles (See Page 79)](https://www.google.com/url?q=https://secure-media.collegeboard.org/digitalServices/pdf/ap/ap-computer-science-principles-course-and-exam-description.pdf&sa=D&ust=1502495268157000&usg=AFQjCNHXeen0QXYWUvwHkrH6wF1D5yL73Q): + +* 24% of the final score. +* Minimum of 12 class hours for the final project. +* Submission Deadline: April 30 + +Components to the Create Task: + +* Iterative process to create a program: + * Design + * Implement + * Test +* Independently create at least one of each: + * Algorithm + * Abstraction +* Create a video that displays the running of their program and demonstrates its functionality. +* Write responses to questions about their program. +* Submit their entire program code to the AP Digital Portfolio. + +Refer to the [AP CS Principles Course Description](https://www.google.com/url?q=https://secure-media.collegeboard.org/digitalServices/pdf/ap/ap-computer-science-principles-course-and-exam-description.pdf&sa=D&ust=1502495268160000&usg=AFQjCNFD_DeH8O_v3hPqaGlsVFfeBgSkMw) for the following: + +* Teacher Overview of Performance Task: Create (page 79) +* Student Handout for Performance Task: Create (page 113) + +**CodeCombat Create Task Practice Opportunities** + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +Game Dev 1 + + + +Game Dev 2 + + + +Game Dev 3 + +
+ +Create + + + + + + + +
+ +Iterative Process + + + +Yes + + + +Yes + + + +Yes + +
+ +---- Design + + + +Yes + + + +Yes + + + +Yes + +
+ +---- Implement + + + +Yes + + + +Yes + + + +Yes + +
+ +---- Test + + + +Yes + + + +Yes + + + +Yes + +
+ +Code Requirements + + + + + + + +
+ +---- Algorithms + + + +-- + + + +-- + + + +Yes + +
+ +---- Abstractions + + + +-- + + + +Yes + + + +Yes + +
+ +Capture Video + + + +-- + + + +-- + + + +-- + +
+ +Written Responses + + + +Yes + + + +Yes + + + +Yes + +
+ +Submit to AP Portfolio + + + +-- + + + +-- + + + +-- + +
+ +# Using Game Development 1 as Practice + +Learning Objectives covered in Game Development 1: + +* 5.1.1 Develop a program for creative expression, to satisfy personal curiosity, or to create new knowledge. +* 5.1.2 Develop a correct program to solve problems. + +When teaching the Game Dev 1 course for AP CSP students, you should focus on : + +* Brainstorming for Ideas +* The Process of Game Design +* Journaling about the Process +* The Value of Collaboration + +Since the students' knowledge of programming is very basic at this level, they will have limited ability to practice the Abstractions or Algorithm components of the Create task in Game Development 1.Those will be better covered in Game Dev 2 and beyond. + +The [Game Development 1 5-Day Project Guide](https://codecombat.com/teachers/resources/gd1-5day) introduces the basic concepts of game design as the students play through the course. By guiding the students through this process, you help them develop the mental framework they need to think creatively about designing and implementing their own games, which they'll put into practice in the course's final project level. + +## Days 1-3 + +Days 1 through 3 focus on teaching students how to build a game in CodeCombat using **pieces**, **mechanics**, and **goals**. + +The levels the students play will teach the implementation details, but it's important for you to guide the discussion around the levels. Let the students know up front that, they'll soon be designing their own game, and they'll need to use the techniques and concepts they're learning when they make their own games. + +Refer to the [Game Development 1 Project Guide](https://www.google.com/url?q=https://codecombat.com/teachers/resources/gd1-5day&sa=D&ust=1502495268183000&usg=AFQjCNHFplfQxgH_Ol54QbNUC1swq4Nhog) for level-by-level tips and discussion questions. + +### Document the Process + +Keeping a list of the pieces, mechanics, and goals in their journals will not only help the students remember all of the tools they have available when creating their own games, but show them how to document their Game Dev journey. Taking good notes will make the design process easier, and help them remember the challenges they overcame while making their project - and that'll make answering the written questions at the end easier. + +For the Create Performance Task, students will need to provide written or audio responses to specific questions. As practice for the final Create submission, students should answer the following questions in their journal as they design their game: + +* Identify the programming language used. +* Identify the purpose of their program. +* Describe the incremental and iterative development process of their program. +* Describe the difficulties and/or opportunities encountered, and how they were resolved. +* Clearly indicate whether the development described was collaborative or independent. + +### Brainstorming + +At the end of Day 3, help the students get started brainstorming ideas for their course 1 projects. Encourage them to find creative combinations of the tools they've learned to make new types of games! During the course, they saw ideas for some basic games, but those are just the beginning… let the students experiment with combining the pieces, mechanics, and goals in new ways. + +Starting with Brainstorming, and continuing throughout the Iterative Design Process, the students should collaborate with each other, particularly if they are stuck. + +## Day 4 - Iterating + +Day 4 is where the bulk of the Iterative Design Process happens: + +1. Design +2. Implement +3. Test +4. Repeat + +### Design + +Design is the process of taking the student's idea, and turning it into a concrete plan. Each student should write a brief description of her idea, and then describe it in terms of the pieces, mechanics, and goals they'll use to make it happen. Encourage them to draw a rough map of what they imagine the game will look like, and how the player will interact with the game. + +Students should answer the following questions in their journal as they design their game: + +1. What is the purpose or idea behind the game? +2. What are the player's goals? +3. What pieces will be used? +4. What are the core mechanics used? +5. What programming language will be used? +6. Did you collaborate with anyone while designing your game? What was their contribution? + +### Implement + +Now that the student has a design for their game, it's time to implement! + +This is the process of creating the code that makes the game real. Students should use the Tabula Rasa level to create this Game Dev 1 practice project. Remind the students to document any difficulties they run into, and how they were able to work around those problems. In the final project, they'll need to answer questions about challenges they overcame, so this is a good opportunity to get some practice taking good notes. + +If the student collaborates with others during the Implementation phase, they should be sure to clearly mark any code they use that they did not independently create, and where it came from. + +Students should answer the following in their journal as they implement their game: + +1. What difficulties did you encounter while implementing your game? +2. How did you resolve the difficulties? +3. What new ideas or opportunities arose while implementing your game? +4. How did you decide to use, or discard, those new ideas? +5. Did you collaborate with anyone while implementing your game? What was their contribution? + +### Test + +Testing is a great opportunity to practice collaboration! First, students should play each others' games. The creator of the game should simply observe the player, and take notes of anything surprising - did the player interact with the game as intended? Did they try something completely unexpected? Did they find a bug? What part of the game did they seem to enjoy? What part seemed to frustrate them? + +Then, ask for feedback from the player. Ask some of the same kinds of questions - what they liked, what was frustrating. + +Encourage the students not to get frustrated if they run into problems -- all great games had problems at first! It's only through testing and iteration that their favorite games became so good. Problems that turn up during testing are road signs showing students the way to make their game even better. + +Students should answer the following questions in their journal as they test their game: + +1. Who tested your game? +2. What bugs did your playtesters discover while testing your game? +3. Did the players interact with your game in surprising, or unintended ways? +4. How can you use the information gained from testing to make your game better? + +### Repeat + +Iteration means to repeat the process several times, each time making adjustments and improvements. Now, armed with feedback from playtesters, the students should go back to design solutions to any problems, then implement them, and test the new version of the game! + +Students should answer the following questions in their journal while iterating on their game: + +1. How will you resolve the issues uncovered during this iteration of your game? What will you change, and why? + +## AP CS Principles Practice: Written Responses + +A major component of the AP CS Principles Create task are the written responses students will provide regarding their computational artifact. Game Development 1 offers students a chance to practice answering a subset of those questions, which are reproduced below and can also be found in the Performance Task: Create – Applications from Ideas section of the student handout materials. + +Since students will likely not have captured video for their Game Development 1 project, they can simply provide a written response for 2a. + +> **Program Purpose and Development** +> +> 2a. Provide a written response or audio narration in your video that: +> +> \- identifies the programming language; +> +> \- identifies the purpose of your program; and explains what the video illustrates. +>
*(Must not exceed 150 words)* +>

+> 2b. Describe the incremental and iterative development process of your program, focusing on two distinct points in that process. Describe the difficulties and/ or opportunities you encountered and how they were resolved or incorporated. +>

+> In your description clearly indicate whether the development described was collaborative or independent. At least one of these points must refer to independent program development. +>
*(Must not exceed 200 words)* + +Teachers can refer to the [scoring guidelines for the Create task](https://www.google.com/url?q=https://secure-media.collegeboard.org/digitalServices/pdf/ap/create-sample-tasks-sg.pdf&sa=D&ust=1502495268196000&usg=AFQjCNHJz9fdMXEo3PsZBhqsuNDyvwULfQ) to grade students’ responses to the above prompts. Here are specific areas to point out, based on the College Board’s scoring rubric and provided examples: + +* 2a. Make sure the student explains exactly what their game does and identifies the pieces, mechanics and goals. For the purposes of this practice opportunity, the “goal” of their game is the “purpose” of their program. +* 2b. Make sure the student describes two different times in their development that they made major decisions during the iterative process. They should also describe who they worked with and what collaboration took place. + +# What's Next + +Students need to complete the Computer Science 2 course before advancing on to Game Development 2\. In CS2 they'll learn more skills they need for the AP CSP Create task, including use of mathematical and logical concepts to develop abstractions. + diff --git a/app/styles/teachers/markdown-resource-view.sass b/app/styles/teachers/markdown-resource-view.sass index 0e75d19468d..489a50e6bd8 100644 --- a/app/styles/teachers/markdown-resource-view.sass +++ b/app/styles/teachers/markdown-resource-view.sass @@ -62,7 +62,7 @@ padding: none font-size: 80% - ul + & > ul margin: 0 0 30px 0 // page header // diff --git a/app/templates/teachers/ap-cs-principles-view.jade b/app/templates/teachers/ap-cs-principles-view.jade index 52e68a5c616..d37337edcb6 100644 --- a/app/templates/teachers/ap-cs-principles-view.jade +++ b/app/templates/teachers/ap-cs-principles-view.jade @@ -124,3 +124,8 @@ block content a(href="/teachers/resources/gd1-5day") span(data-i18n="teacher.gd1_guide") p(data-i18n="teacher.gd1_guide_desc") + li + a(href="/teachers/resources/create-task-practice-1") + span Create Task Practice 1: Game Development 1 + p Prepare students for the Create Task by building their own games and practicing key concepts. + From b4ed6a36661c192d3765ed85fcf12e403a5a1388 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 16 Aug 2017 14:19:51 -0700 Subject: [PATCH 034/227] Update Payment indexes to be sparse Have already applied manually in production. --- server/models/Payment.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/models/Payment.coffee b/server/models/Payment.coffee index e834d634620..6c6c4ab7753 100644 --- a/server/models/Payment.coffee +++ b/server/models/Payment.coffee @@ -3,7 +3,7 @@ config = require '../../server_config' PaymentSchema = new mongoose.Schema({}, {strict: false, read:config.mongo.readpref}) PaymentSchema.index({recipient: 1, 'stripe.timestamp': 1, 'ios.transactionID'}, {unique: true, name: 'unique payment'}) -PaymentSchema.index({'payPal.id': 1}, {unique: true, name: 'unique PayPal payment'}) -PaymentSchema.index({'payPalSale.id': 1}, {unique: true, name: 'unique PayPal sale payment'}) +PaymentSchema.index({'payPal.id': 1}, {unique: true, sparse: true, name: 'unique PayPal payment'}) +PaymentSchema.index({'payPalSale.id': 1}, {unique: true, sparse: true, name: 'unique PayPal sale payment'}) module.exports = mongoose.model('payment', PaymentSchema) From df50d076e4419dfc27e8abbd4b062edf2e9d218d Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 15:29:04 -0700 Subject: [PATCH 035/227] Make license dates more specifically formatted --- app/templates/courses/enrollments-view.jade | 4 ++-- app/views/courses/TeacherClassView.coffee | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/templates/courses/enrollments-view.jade b/app/templates/courses/enrollments-view.jade index 103e0ffa2fa..1492e1bb9c0 100644 --- a/app/templates/courses/enrollments-view.jade +++ b/app/templates/courses/enrollments-view.jade @@ -108,11 +108,11 @@ mixin prepaidCard(prepaid, className) hr i.small-details .pull-left(data-i18n="teacher.start_date") - .pull-right= moment(prepaid.get('startDate')).utc().format('l') + .pull-right= moment(prepaid.get('startDate')).utc().format('ll') .clearfix .pull-left(data-i18n="teacher.end_date") - .pull-right= moment(prepaid.get('endDate')).utc().format('l') + .pull-right= moment(prepaid.get('endDate')).utc().format('ll') .clearfix if prepaid.get('type') === 'course' .share-details.small-details.m-b-2 diff --git a/app/views/courses/TeacherClassView.coffee b/app/views/courses/TeacherClassView.coffee index 0ebe433e5dc..598f4a4f6f7 100644 --- a/app/views/courses/TeacherClassView.coffee +++ b/app/views/courses/TeacherClassView.coffee @@ -606,4 +606,4 @@ module.exports = class TeacherClassView extends RootView when 'not-enrolled' then $.i18n.t('teacher.status_not_enrolled') when 'enrolled' then (if expires then $.i18n.t('teacher.status_enrolled') else '-') when 'expired' then $.i18n.t('teacher.status_expired') - return string.replace('{{date}}', moment(expires).utc().format('l')) + return string.replace('{{date}}', moment(expires).utc().format('ll')) From 8c07a3fae7f6dddb33644d1ad2d67911e13640de Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 15:45:36 -0700 Subject: [PATCH 036/227] Disable prepaid view --- app/templates/account/main-account-view.jade | 3 - .../account/prepaid-redeem-modal.jade | 19 --- app/templates/account/prepaid-view.jade | 26 +--- app/templates/account/subscription-view.jade | 10 -- app/templates/base-flat.jade | 3 - app/templates/base.jade | 3 - app/views/account/PrepaidRedeemModal.coffee | 21 --- app/views/account/PrepaidView.coffee | 128 +----------------- 8 files changed, 2 insertions(+), 211 deletions(-) delete mode 100644 app/templates/account/prepaid-redeem-modal.jade delete mode 100644 app/views/account/PrepaidRedeemModal.coffee diff --git a/app/templates/account/main-account-view.jade b/app/templates/account/main-account-view.jade index 168f05a398c..1300a4593f0 100644 --- a/app/templates/account/main-account-view.jade +++ b/app/templates/account/main-account-view.jade @@ -25,9 +25,6 @@ block content div.col-md-4 #account-links a.btn.btn-lg.btn-primary(href="/account/subscription", data-i18n="account.subscription") - div.col-md-4 - #account-links - a.btn.btn-lg.btn-primary(href="/account/prepaid", data-i18n="account.prepaid_codes") Prepaid Codes div.col-md-4 #account-links a.btn.btn-lg.btn-primary.logout-btn(href="/account", data-i18n="login.log_out") diff --git a/app/templates/account/prepaid-redeem-modal.jade b/app/templates/account/prepaid-redeem-modal.jade deleted file mode 100644 index c2b83089e8b..00000000000 --- a/app/templates/account/prepaid-redeem-modal.jade +++ /dev/null @@ -1,19 +0,0 @@ -extends /templates/core/modal-base - -block modal-header-content - h3 Prepaid Code Details (#{view.ppc.get('code')}) - -block modal-body-content - if view.redeemedOn - p You redeemed this code: #{view.redeemedOn} - else - if view.ppc.openSpots() - p: strong Adds #{view.ppc.get('properties').months} month(s) to your current subscription. - p You can redeem this code. - else - p You cannot redeem this code. - -block modal-footer-content - button#close.btn.btn-primary(type="button", data-dismiss="modal") Cancel - if !view.redeemedOn && view.ppc.openSpots() > 0 - button#redeem.btn.btn-primary(type="button", data-dismiss="modal") Redeem Code To My Account diff --git a/app/templates/account/prepaid-view.jade b/app/templates/account/prepaid-view.jade index 18512959aa3..d9d91d3217f 100644 --- a/app/templates/account/prepaid-view.jade +++ b/app/templates/account/prepaid-view.jade @@ -23,31 +23,7 @@ block content span(data-i18n="account_prepaid.purchase_code") .panel-collapse.collapse(class=view.ppcQuery ? "": "in")#purchasepanel .panel-body - p(data-i18n="account_prepaid.purchase_code1") - p(data-i18n="account_prepaid.purchase_code2") - p(data-i18n="account_prepaid.purchase_code3") - strong - p(data-i18n="account_prepaid.purchase_code4") - p - span.spl(data-i18n="account_prepaid.purchase_code5") - span : - a(href="mailto:team@codecombat.com") team@codecombat.com - - .form-horizontal - .form-group - label.control-label.col-md-2(for="users", data-i18n="account_prepaid.users") - .col-md-2 - input#users-input.form-control(name="users", type="number", value="#{view.purchase.users}", min=1) - .form-group - label.control-label.col-md-2(for="months", data-i18n="account_prepaid.months") - .col-md-2 - input#months-input.form-control(name="months", type="number", value="#{view.purchase.months}", min=1) - .form-group - label.control-label.col-md-2(data-i18n="account_prepaid.purchase_total") - .col-md-10 - p.form-control-static $ - span#total #{(view.purchase.total/100).toFixed(2)} - button#purchase-btn.btn.btn-success.pull-right(data-i18n="account_prepaid.purchase_button") + p Prepaids are no longer available for purchase. .row .col-md-12 .panel.panel-default diff --git a/app/templates/account/subscription-view.jade b/app/templates/account/subscription-view.jade index 9fd69311675..0ee6f594139 100644 --- a/app/templates/account/subscription-view.jade +++ b/app/templates/account/subscription-view.jade @@ -124,16 +124,6 @@ block content else button.start-subscription-button.btn.btn-lg.btn-success(data-i18n="subscribe.subscribe_title") - // - Prepaid Codes - .panel.panel-default - .panel-heading - h3(data-i18n="account.prepaid_codes") - .panel-body - p - span.spr(data-i18n="account_prepaid.you_can1") - a(href="/account/prepaid", data-i18n="account_prepaid.you_can2") - span.spl(data-i18n="account_prepaid.you_can3") - //- Sponsored Subscriptions .panel.panel-default .panel-heading diff --git a/app/templates/base-flat.jade b/app/templates/base-flat.jade index 2758f8d29e9..b5edb707f37 100644 --- a/app/templates/base-flat.jade +++ b/app/templates/base-flat.jade @@ -9,9 +9,6 @@ mixin accountLinks if me.isAdmin() || !(me.isTeacher() || me.isStudent() || me.freeOnly()) || me.hasSubscription() li a(href="/account/subscription", data-i18n="account.subscription") - if me.isAdmin() || !(me.isTeacher() || me.isStudent() || me.freeOnly()) - li - a(href="/account/prepaid", data-i18n="account.prepaid_codes") if me.isAdmin() li a(href="/admin", data-i18n="account_settings.admin") diff --git a/app/templates/base.jade b/app/templates/base.jade index feda9297066..98bf3fc29a3 100644 --- a/app/templates/base.jade +++ b/app/templates/base.jade @@ -45,9 +45,6 @@ block header if me.isAdmin() || !(me.isTeacher() || me.isStudent() || me.freeOnly()) || me.hasSubscription() li a(href="/account/subscription", data-i18n="account.subscription") - if me.isAdmin() || !(me.isTeacher() || me.isStudent() || me.freeOnly()) - li - a(href="/account/prepaid", data-i18n="account.prepaid_codes") if me.isAdmin() li a(href="/admin", data-i18n="account_settings.admin") diff --git a/app/views/account/PrepaidRedeemModal.coffee b/app/views/account/PrepaidRedeemModal.coffee deleted file mode 100644 index cf729cbcdcc..00000000000 --- a/app/views/account/PrepaidRedeemModal.coffee +++ /dev/null @@ -1,21 +0,0 @@ -ModalView = require 'views/core/ModalView' -template = require 'templates/account/prepaid-redeem-modal' -{me} = require 'core/auth' - - -module.exports = class PrepaidRedeemModal extends ModalView - id: 'prepaid-redeem-modal' - template: template - closeButton: true - - events: - 'click #redeem' : 'onRedeemClicked' - - constructor: (options) -> - super options - @ppc = options.ppc - hasRedeemed = @ppc.userHasRedeemed(me.get('_id')) - @redeemedOn = new moment(hasRedeemed).calendar() if hasRedeemed - - onRedeemClicked: -> - @trigger 'confirm-redeem' diff --git a/app/views/account/PrepaidView.coffee b/app/views/account/PrepaidView.coffee index e73d26fd29e..b7a3c4dc79b 100644 --- a/app/views/account/PrepaidView.coffee +++ b/app/views/account/PrepaidView.coffee @@ -1,15 +1,11 @@ RootView = require 'views/core/RootView' template = require 'templates/account/prepaid-view' -stripeHandler = require 'core/services/stripe' {getPrepaidCodeAmount} = require '../../core/utils' CocoCollection = require 'collections/CocoCollection' Prepaid = require '../../models/Prepaid' utils = require 'core/utils' -RedeemModal = require 'views/account/PrepaidRedeemModal' -forms = require 'core/forms' Products = require 'collections/Products' -# TODO: remove redeem code modal module.exports = class PrepaidView extends RootView id: 'prepaid-view' @@ -17,22 +13,10 @@ module.exports = class PrepaidView extends RootView className: 'container-fluid' events: - 'change #users-input': 'onChangeUsersInput' - 'change #months-input': 'onChangeMonthsInput' - 'click #purchase-btn': 'onClickPurchaseButton' - 'click #redeem-btn': 'onClickRedeemButton' # DNE? 'click #lookup-code-btn': 'onClickLookupCodeButton' 'click #redeem-code-btn': 'onClickRedeemCodeButton' - subscriptions: - 'stripe:received-token': 'onStripeReceivedToken' - initialize: -> - @purchase = - total: 0 - users: 3 - months: 3 - @updateTotal() @codes = new CocoCollection([], { url: '/db/user/'+me.id+'/prepaid_codes', model: Prepaid }) @codes.on 'sync', (code) => @render?() @@ -43,92 +27,13 @@ module.exports = class PrepaidView extends RootView @ppcQuery = true @loadPrepaid(@ppc) - @products = new Products() - @supermodel.loadCollection(@products) - - onLoaded: -> - @prepaidProduct = @products.findWhere { name: 'prepaid_subscription' } - @updateTotal() - super() - afterRender: -> super() @$el.find("span[title]").tooltip() statusMessage: (message, type='alert') -> noty text: message, layout: 'topCenter', type: type, killer: false, timeout: 5000, dismissQueue: true, maxVisible: 3 - - updateTotal: -> - return unless @prepaidProduct - @purchase.total = getPrepaidCodeAmount(@prepaidProduct.get('amount'), @purchase.users, @purchase.months) - @renderSelectors("#total", "#users-input", "#months-input") - - # Form Input Callbacks - onChangeUsersInput: (e) -> - newAmount = $(e.target).val() - newAmount = 1 if newAmount < 1 - @purchase.users = newAmount - el = $('#purchasepanel') - if newAmount < 3 and @purchase.months < 3 - message = "Either Users or Months must be greater than 2" - err = [message: message, property: 'users', formatted: true] - forms.clearFormAlerts(el) - forms.applyErrorsToForm(el, err) - else - forms.clearFormAlerts(el) - - @updateTotal() - - onChangeMonthsInput: (e) -> - newAmount = $(e.target).val() - newAmount = 1 if newAmount < 1 - @purchase.months = newAmount - el = $('#purchasepanel') - if newAmount < 3 and @purchase.users < 3 - message = "Either Users or Months must be greater than 2" - err = [message: message, property: 'months', formatted: true] - forms.clearFormAlerts(el) - forms.applyErrorsToForm(el, err) - else - forms.clearFormAlerts(el) - - @updateTotal() - - onClickPurchaseButton: (e) -> - return unless $("#users-input").val() >= 3 or $("#months-input").val() >= 3 - @purchaseTimestamp = new Date().getTime() - @stripeAmount = @purchase.total - @description = "Prepaid Code for " + @purchase.users + " users / " + @purchase.months + " months" - - stripeHandler.open - amount: @stripeAmount - description: @description - bitcoin: true - alipay: if me.get('country') is 'china' or (me.get('preferredLanguage') or 'en-US')[...2] is 'zh' then true else 'auto' - - onClickRedeemButton: (e) -> - @ppc = $('#ppc').val() - - unless @ppc - @statusMessage "You must enter a code.", "error" - return - options = - url: '/db/prepaid/-/code/'+ @ppc - method: 'GET' - - options.success = (model, res, options) => - redeemModal = new RedeemModal ppc: model - redeemModal.on 'confirm-redeem', @confirmRedeem - @openModalView redeemModal - - options.error = (model, res, options) => - console.warn 'Error getting Prepaid Code' - - prepaid = new Prepaid() - prepaid.fetch(options) - # @supermodel.addRequestResource('get_prepaid', options, 0).load() - - + confirmRedeem: => options = @@ -151,37 +56,6 @@ module.exports = class PrepaidView extends RootView @supermodel.addRequestResource('subscribe_prepaid', options, 0).load() - onStripeReceivedToken: (e) -> - # TODO: show that something is happening in the UI - options = - url: '/db/prepaid/-/purchase' - method: 'POST' - - options.data = - amount: @stripeAmount - description: @description - stripe: - token: e.token.id - timestamp: @purchaseTimestamp - type: 'terminal_subscription' - maxRedeemers: @purchase.users - months: @purchase.months - - options.error = (model, response, options) => - console.error 'FAILED: Prepaid purchase', response - console.error options - @statusMessage "Error purchasing prepaid code", "error" - # Not sure when this will happen. Stripe popup seems to give appropriate error messages. - - options.success = (model, response, options) => - # console.log 'SUCCESS: Prepaid purchase', model.code - @statusMessage "Successfully purchased Prepaid Code!", "success" - @codes.add(model) - @renderSelectors('#codes-panel') - - @statusMessage "Finalizing purchase...", "information" - @supermodel.addRequestResource(options, 0).load() - loadPrepaid: (ppc) -> return unless ppc options = From dd9d57733d463d69c55510a0f82180b15b320da4 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 15:52:42 -0700 Subject: [PATCH 037/227] Fix classroom campaign view to use classroom for level numbers --- app/templates/play/campaign-view.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 154c4b89be3..b7064ed6a08 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -58,8 +58,8 @@ if view.showAds() if ((campaign.levelIsPractice(level) || !level.unlockedInSameCampaign) && level.hidden) - continue; - var levelNumber = ''; - if view.shouldShow('back-to-classroom') - - levelNumber = campaign.getLevelNumber(level.original, ''); + if view.shouldShow('back-to-classroom') && view.classroom + - levelNumber = view.classroom.getLevelNumber(level.original, ''); if (levelNumber) - levelNumber += '. '; div( From 80a601f5d5f73181ff8cd94d4a9e95f587415ed0 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 16:26:23 -0700 Subject: [PATCH 038/227] Have mongo-admin search search by slugs too --- server/middleware/users.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/server/middleware/users.coffee b/server/middleware/users.coffee index 5dc86cdc890..9766d4e1dce 100644 --- a/server/middleware/users.coffee +++ b/server/middleware/users.coffee @@ -406,6 +406,7 @@ module.exports = $or: [ {emailLower: search.toLowerCase()} {nameLower: search.toLowerCase()} + {slug: _.str.slugify(search)} ] } query.$or.push {_id: mongoose.Types.ObjectId(search)} if utils.isID search From 4741d0ea7abb1b7b26070dca50b1de9d7db0a682 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 16 Aug 2017 16:31:05 -0700 Subject: [PATCH 039/227] Direct users to sign up if they anonymously try to buy gems --- app/views/play/modal/BuyGemsModal.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/play/modal/BuyGemsModal.coffee b/app/views/play/modal/BuyGemsModal.coffee index 725002f9a1c..76e3b001f6c 100644 --- a/app/views/play/modal/BuyGemsModal.coffee +++ b/app/views/play/modal/BuyGemsModal.coffee @@ -4,6 +4,7 @@ stripeHandler = require 'core/services/stripe' utils = require 'core/utils' SubscribeModal = require 'views/core/SubscribeModal' Products = require 'collections/Products' +CreateAccountModal = require 'views/core/CreateAccountModal' module.exports = class BuyGemsModal extends ModalView id: @@ -71,6 +72,7 @@ module.exports = class BuyGemsModal extends ModalView onClickProductButton: (e) -> @playSound 'menu-button-click' + return @openModalView new CreateAccountModal() if me.get('anonymous') productID = $(e.target).closest('button').val() # Don't throw error when product is not found if productID.length == 0 From 3ee91ee427e52609c7f5e410086922381094c9fe Mon Sep 17 00:00:00 2001 From: juanda-097 Date: Wed, 16 Aug 2017 23:57:25 -0500 Subject: [PATCH 040/227] Update es-ES The next modules are functionals account_settings new_home and updated code nav login earn_gems teachers game_dev server_error --- app/locale/es-ES.coffee | 201 ++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 100 deletions(-) diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index 2b03e646e31..f2600535c7f 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -10,6 +10,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis classroom_in_a_box: "Una clase todo en uno para enseñar informática." codecombat_is: "CodeCombat es una plataforma para que los estudiantes aprendan ciencia de la computación mientras juegan a un juego real." our_courses: "Nuestros cursos han sido especialmente diseñados para ser lo mejor del aula, incluso con profesores con poca o nula preparación en programación." + watch_how: "Mira cómo CodeCombat está transformando la forma en que la gente aprende informática." top_screenshots_hint: "Los estudiantes escriben código y ven sus cambios en tiempo real." designed_with: "Diseñado pensando en los profesores" real_code: "Real, escribe código" @@ -36,36 +37,36 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis compared: "comparados" conventional: "contra los métodos convencionales de evaluación, la diferencia es clara: los juegos son mejores ayudando a los alumnos a retener conocimiento, concentrarse y" perform_at_higher_level: "desempeñarse a un nivel más alto de ejecución." -# feedback: "Games also provide real-time feedback that allows students to adjust their solution path and understand concepts more holistically, instead of being limited to just “correct” or “incorrect” answers." + feedback: "Los juegos también proporcionan retroalimentación en tiempo real que permite a los estudiantes ajustar su camino de solución y entender los conceptos de manera más holística, en lugar de limitarse a respuestas "correctas" o "incorrectas"." real_game: "Un juego real, jugado con código de verdad." -# great_game: "A great game is more than just badges and achievements - it’s about a player’s journey, well-designed puzzles, and the ability to tackle challenges with agency and confidence." -# agency: "CodeCombat is a game that gives players that agency and confidence with our robust typed code engine, which helps beginner and advanced students alike write proper, valid code." -# request_demo_title: "Get your students started today!" -# request_demo_subtitle: "Request a demo and get your students started in less than an hour." -# get_started_title: "Set up your class today" -# get_started_subtitle: "Set up a class, add your students, and monitor their progress as they learn computer science." + great_game: "Un gran juego es algo más que insignias y logros - es sobre el viaje de un jugador, rompecabezas bien diseñados y la habilidad para enfrentar los desafíos con agilidad y confianza." + agency: "CodeCombat es un juego que ofrece a los jugadores esa voluntad y confianza con nuestro motor de código robusto, que ayuda tanto a los principiantes como a los estudiantes avanzados por igual a escribir código correcto y válido." + request_demo_title: "¡Invita a tus estudiantes hoy!" + request_demo_subtitle: "Solicitar una demostración y empieza a jugar con tus estudiantes en menos de una hora." + get_started_title: "Configure su clase hoy" + get_started_subtitle: "Prepare su clase, agregue cuentas de estudiantes y siga su progreso a medida que aprenden a programar." request_demo: "Pide una demostración" setup_a_class: "Configurar una clase" have_an_account: "¿Tienes una cuenta?" -# logged_in_as: "You are currently logged in as" -# computer_science: "Computer science courses for all ages" -# show_me_lesson_time: "Show me lesson time estimates for:" -# curriculum: "Total curriculum hours:" -# ffa: "Free for all students" -# lesson_time: "Lesson time:" -# coming_soon: "More coming soon!" -# courses_available_in: "Courses are available in JavaScript and Python. Web Development courses utilize HTML, CSS, jQuery, and Bootstrap." -# boast: "Boasts riddles that are complex enough to fascinate gamers and coders alike." -# winning: "A winning combination of RPG gameplay and programming homework that pulls off making kid-friendly education legitimately enjoyable." -# run_class: "Everything you need to run a computer science class in your school today, no CS background required." -# goto_classes: "Go to My Classes" -# view_profile: "View My Profile" -# view_progress: "View Progress" + logged_in_as: "En este momento, has iniciado sesión como" + computer_science: "Cursos de informática para todas las edades" + show_me_lesson_time: "Muéstrame las estimaciones de tiempo de lección para:" + curriculum: "Horario total del plan de estudios:" + ffa: "Gratis para todos los estudiantes" + lesson_time: "Tiempo de la lección:" + coming_soon: "¡Más muy pronto!" + courses_available_in: "Los cursos están disponibles en JavaScript y Python. Los cursos de Desarrollo Web utilizan HTML, CSS, jQuery y Bootstrap." + boast: "Cuenta con acertijos lo suficiente complejos como para fascinar a jugadores y programadores por igual." + winning: "Una combinación ganadora entre un juego de rol y una tarea sobre programación que hacen la educación amigable y disfrutable para los niños." + run_class: "Todo lo que necesitas para organizar una clase de informática en tu escuela hoy mismo, sin necesidad de ningún conocimiento previo de informática." + goto_classes: "Ir a Mis clases" + view_profile: "Ver mi perfil" + view_progress: "Ver mi progreso" go_to_courses: "Ir a mis cursos" -# want_coco: "Want CodeCombat at your school?" + want_coco: "¿Quieres CodeCombat en tu escuela?" nav: -# map: "Map" + map: "Mapa" play: "Jugar" # The top nav bar entry where players choose which levels to play community: "Comunidad" courses: "Cursos" @@ -98,7 +99,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis faqs: "Preguntas frecuentes" help_pref: "¿Necesitas ayuda? ¡Email" help_suff: "y nos pondremos en contacto!" -# resource_hub: "Resource Hub" + resource_hub: "Centro de recursos" modal: close: "Cerrar" @@ -156,55 +157,55 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # replay: "Replay" # back_to_classroom: "Back to Classroom" -# code: -# if: "if" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) -# else: "else" -# elif: "else if" -# while: "while" -# loop: "loop" -# for: "for" -# break: "break" -# continue: "continue" -# pass: "pass" -# return: "return" -# then: "then" -# do: "do" -# end: "end" -# function: "function" -# def: "define" -# var: "variable" -# self: "self" -# hero: "hero" -# this: "this" -# or: "or" -# "||": "or" -# and: "and" -# "&&": "and" -# not: "not" -# "!": "not" -# "=": "assign" -# "==": "equals" -# "===": "strictly equals" -# "!=": "does not equal" -# "!==": "does not strictly equal" -# ">": "is greater than" -# ">=": "is greater than or equal" -# "<": "is less than" -# "<=": "is less than or equal" -# "*": "multiplied by" -# "/": "divided by" -# "+": "plus" -# "-": "minus" -# "+=": "add and assign" -# "-=": "subtract and assign" -# True: "True" -# true: "true" -# False: "False" -# false: "false" -# undefined: "undefined" -# null: "null" -# nil: "nil" -# None: "None" + code: +if: "si" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) + else: "otro" + elif: "si no" + while: "mientras" + loop: "ciclo" + for: "por" + break: "interrupción" + continue: "continuar" + pass: "pasar" + return: "regresar" + then: "entonces" + do: "hacer" + end: "fin" + function: "función" + def: "define" + var: "variable" + self: "yo" + hero: "heroe" + this: "este" + or: "o" + "||": "o" + and: "y" + "&&": "y" + not: "no" + "!": "no" + "=": "asigne a" + "==": "igual a" + "===": "igual a estrictamente" + "!=": "no igual a" + "!==": "no estrictamente igual" + ">": "es mayor que" + ">=": "es mayor que o igual" + "<": "es menor que" + "<=": "es menor que o igual" + "*": "multiplicado por" + "/": "dividido por" + "+": "más" + "-": "menos" + "+=": "añade y asigne" + "-=": "elimine y asigne" + True: "Verdadero" + true: "verdadero" + False: "Falso" + false: "falso" + undefined: "indefinido" + null: "nulo" + nil: "cero" + None: "Ninguno" share_progress_modal: blurb: "¡Estás progresando bastante bien! Dile a tus padres cuánto has aprendido con CodeCombat." @@ -216,7 +217,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis login: sign_up: "Crear una cuenta" -# email_or_username: "Email or username" + email_or_username: "Correo electrónico o nombre de usuario" log_in: "Entrar" logging_in: "Entrando..." log_out: "Salir" @@ -229,10 +230,10 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis signup_switch: "¿Quieres crear una cuenta?" signup: -# create_student_header: "Create Student Account" -# create_teacher_header: "Create Teacher Account" -# create_individual_header: "Create Individual Account" - email_announcements: "Recibir noticias por correo electrónico" # {change} + create_student_header: "Crear Cuenta de Estudiante" + create_teacher_header: "Crear Cuenta de Maestro" + create_individual_header: "Crear Cuenta Individual" + email_announcements: "¡Reciba anuncios sobre los nuevos niveles y características de CodeCombat!" creating: "Creando cuenta..." sign_up: "Registrarse" log_in: "Iniciar sesión con contraseña" @@ -240,21 +241,21 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis login_switch: "¿Ya tienes una cuenta?" school_name: "Nombre de la escuela y Ciudad" optional: "opcional" -# school_name_placeholder: "Example High School, Springfield, IL" + school_name_placeholder: "Ejemplo: High School, Springfield, IL" connected_gplus_header: "¡Te has conectado con éxito con Google+!" -# connected_gplus_p: "Finish signing up so you can log in with your Google+ account." -# gplus_exists: "You already have an account associated with Google+!" -# connected_facebook_header: "You've successfully connected with Facebook!" -# connected_facebook_p: "Finish signing up so you can log in with your Facebook account." + connected_gplus_p: "Termina el registro para poder iniciar sesión con su cuenta de Google+." + gplus_exists: "¡Ya tienes una cuenta asociada a Google+!" + connected_facebook_header: "¡Te has conectado correctamente con Facebook!" + connected_facebook_p: "Termina el registro para poder iniciar sesión con su cuenta de Facebook." facebook_exists: "¡Ya posees una cuenta asociada con Facebook!" hey_students: "Alumnos, ingresen el código de la clase de su maestro." -# birthday: "Birthday" + birthday: "Cumpleaños" # parent_email_blurb: "We know you can't wait to learn programming — we're excited too! Your parents will receive an email with further instructions on how to create an account for you. Email {{email_link}} if you have any questions." # classroom_not_found: "No classes exist with this Class Code. Check your spelling or ask your teacher for help." # checking: "Checking..." -# account_exists: "This email is already in use:" -# sign_in: "Sign in" -# email_good: "Email looks good!" + account_exists: "Este correo electrónico ya está en uso:" + sign_in: "Iniciar Sesión" + email_good: "¡El email parece bueno!" # name_taken: "Username already taken! Try {{suggestedName}}?" # name_available: "Username available!" # name_is_email: "Username may not be an email" @@ -263,13 +264,13 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # teacher_type_2: "Set up your class" # teacher_type_3: "Access Course Guides" # teacher_type_4: "View student progress" -# signup_as_teacher: "Sign up as a Teacher" + signup_as_teacher: "Iniciar sesión como Maestro" # student_type_1: "Learn to program while playing an engaging game!" # student_type_2: "Play with your class" # student_type_3: "Compete in arenas" # student_type_4: "Choose your hero!" # student_type_5: "Have your Class Code ready!" -# signup_as_student: "Sign up as a Student" + signup_as_student: "Iniciar sesión como Estudiante" # individuals_or_parents: "Individuals & Parents" # individual_type: "For players learning to code outside of a class. Parents should sign up for an account here." # signup_as_individual: "Sign up as an Individual" @@ -645,9 +646,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # purchase: "Purchase" # purchased: "Purchased" -# earn_gems: -# prompt_title: "Not Enough Gems" -# prompt_body: "Keep playing to earn more!" + earn_gems: + prompt_title: "No hay suficientes gemas" + prompt_body: "¡Sigue jugando para ganar más!" subscribe: # premium_already_subscribed: "You're already subscribed to Premium!" @@ -969,8 +970,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # previous: "Previous" # location_title: "We're located in downtown SF:" -# teachers: -# licenses_needed: "Licenses needed" + teachers: + licenses_needed: "Licencias necesarias" # special_offer: # special_offer: "Special Offer" @@ -1101,7 +1102,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis delete_account_tab: "Borrar tu cuenta" wrong_email: "Email incorrecto" wrong_password: "Contraseña incorrecta" -# use_gravatar: "Change your profile picture by signing up for Gravatar" + use_gravatar: "Cambia tu foto de perfil registrándote en Gravatar" delete_this_account: "Eliminar esta cuenta de forma permanente" reset_progress_tab: "Reestablecer progreso" reset_your_progress: "Elimina tu progreso y empieza de nuevo" @@ -1687,8 +1688,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # victory_course_share_suffix: "you just created." # copy_url: "Copy URL" -# game_dev: -# creator: "Creator" + game_dev: + creator: "Creador" # web_dev: # image_gallery_title: "Image Gallery" @@ -2298,9 +2299,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # victory_sign_up_poke: "Create a free account to save your code & be entered for a chance to win prizes!" # victory_sign_up: "Sign up & be entered to win $2,500" -# server_error: -# email_taken: "Email already taken" -# username_taken: "Username already taken" + server_error: + email_taken: "El correo electrónico ya ha sido tomado" + username_taken: "El nombre de usuario ya ha sido tomado" # esper: # line_no: "Line $1: " From 0990db4df2d0d6d15c64cb0de40b8c2f5ff15b32 Mon Sep 17 00:00:00 2001 From: JurianLock Date: Sun, 20 Aug 2017 18:43:04 +0200 Subject: [PATCH 041/227] Update nl.coffee Added a couple of words. --- app/locale/nl.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index f3b113cb0e4..23486859d80 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -65,7 +65,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t want_coco: "Wil je CodeCombat op jouw school?" nav: -# map: "Map" + map: "Kaart" play: "Levels" # The top nav bar entry where players choose which levels to play community: "Gemeenschap" courses: "Lessen" @@ -152,9 +152,9 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t campaign_multiplayer: "Multiplayer Arena's" campaign_multiplayer_description: "... waarin je direct tegen andere spelers speelt." brain_pop_done: "Je hebt de ogres verslagen met code! Jij wint!" -# brain_pop_challenge: "Challenge yourself to play again using a different programming language!" -# replay: "Replay" -# back_to_classroom: "Back to Classroom" + brain_pop_challenge: "Daag jezelf uit opnieuw te spelen in een andere programmeertaal!" + replay: "Herstart" + back_to_classroom: "Terug naar Klaslokaal" code: if: "als" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) @@ -351,7 +351,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t submit_changes: "Veranderingen indienen" save_changes: "veranderingen opslaan" required_field: "Verplicht veld" # {change} -# valid_phone: "Enter a valid phone number." + valid_phone: "Voer een geldig telefoonnummer in." general: and: "en" @@ -428,7 +428,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t years: "jaren" play_level: -# back_to_map: "Back to Map" + back_to_map: "Terug naar kaart" directions: "Instructies" edit_level: "Edit Level" explore_codecombat: "Verken CodeCombat" From 0077a61b2d10cd0ffa69a1959e4eb4fe7b3d5532 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Mon, 21 Aug 2017 11:21:48 -0700 Subject: [PATCH 042/227] :bug:Fix PayPal lifetime subs hasSubscription check --- app/models/User.coffee | 4 ++-- server/models/User.coffee | 4 ++-- spec/server/functional/subscription.spec.coffee | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/User.coffee b/app/models/User.coffee index 4f31577e3db..b0506e71fc8 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -213,8 +213,8 @@ module.exports = class User extends CocoModel hasSubscription: -> if payPal = @get('payPal') - return payPal.billingAgreementID - else if stripe = @get('stripe') + return true if payPal.billingAgreementID + if stripe = @get('stripe') return true if stripe.sponsorID return true if stripe.subscriptionID return true if stripe.free is true diff --git a/server/models/User.coffee b/server/models/User.coffee index 0c831ec7e7f..0e24e5fa5a2 100644 --- a/server/models/User.coffee +++ b/server/models/User.coffee @@ -352,8 +352,8 @@ UserSchema.methods.sendWelcomeEmail = -> UserSchema.methods.hasSubscription = -> if payPal = @get('payPal') - return payPal.billingAgreementID - else if stripeObject = @get('stripe') + return true if payPal.billingAgreementID + if stripeObject = @get('stripe') return true if stripeObject.sponsorID return true if stripeObject.subscriptionID return true if stripeObject.free is true diff --git a/spec/server/functional/subscription.spec.coffee b/spec/server/functional/subscription.spec.coffee index f31dc606b21..59f82ea7b38 100644 --- a/spec/server/functional/subscription.spec.coffee +++ b/spec/server/functional/subscription.spec.coffee @@ -1108,6 +1108,7 @@ describe 'POST /db/products/:handle/purchase', -> user = yield User.findById(@user.id) expect(user.get('stripe.free')).toBe(true) expect(user.get('payPal').payerID).toEqual(payPalResponse.payer.payer_info.payer_id) + expect(user.hasSubscription()).toBeTruthy() describe 'POST /db/user/:handle/paypal', -> describe '/create-billing-agreement', -> From bcabac1fce42631013e1798224a8bcf8e8c165c6 Mon Sep 17 00:00:00 2001 From: juanda-097 Date: Mon, 21 Aug 2017 20:39:32 -0500 Subject: [PATCH 043/227] Problem with "" Solved problem in the line 40 --- 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 f2600535c7f..4b17a75b8d7 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -37,7 +37,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis compared: "comparados" conventional: "contra los métodos convencionales de evaluación, la diferencia es clara: los juegos son mejores ayudando a los alumnos a retener conocimiento, concentrarse y" perform_at_higher_level: "desempeñarse a un nivel más alto de ejecución." - feedback: "Los juegos también proporcionan retroalimentación en tiempo real que permite a los estudiantes ajustar su camino de solución y entender los conceptos de manera más holística, en lugar de limitarse a respuestas "correctas" o "incorrectas"." + feedback: "Los juegos también proporcionan retroalimentación en tiempo real que permite a los estudiantes ajustar su camino de solución y entender los conceptos de manera más holística, en lugar de limitarse a respuestas 'correctas' o 'incorrectas'." real_game: "Un juego real, jugado con código de verdad." great_game: "Un gran juego es algo más que insignias y logros - es sobre el viaje de un jugador, rompecabezas bien diseñados y la habilidad para enfrentar los desafíos con agilidad y confianza." agency: "CodeCombat es un juego que ofrece a los jugadores esa voluntad y confianza con nuestro motor de código robusto, que ayuda tanto a los principiantes como a los estudiantes avanzados por igual a escribir código correcto y válido." From 4bd3bfc501f29abbfccd9f58456a648988cfdb92 Mon Sep 17 00:00:00 2001 From: juanda-097 Date: Mon, 21 Aug 2017 21:12:53 -0500 Subject: [PATCH 044/227] Update es-ES.coffee --- 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 4b17a75b8d7..bc7444492aa 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -158,7 +158,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # back_to_classroom: "Back to Classroom" code: -if: "si" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) + if: "si" # Keywords--these translations show up on hover, so please translate them all, even if it's kind of long. (In the code editor, they will still be in English.) else: "otro" elif: "si no" while: "mientras" From 98eb4e3198a3dcf734434d86c4ae05200d500259 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 22 Aug 2017 11:59:27 -0700 Subject: [PATCH 045/227] Add timeout request and a self-health checker Node doesn't handle timeouts well; by default it returns nothing and reports 200 after two minutes. Add a connect timeout middleware to limit responses to one minute and return 503. Also have production node instances continuously run healthchecks and kill themselves if they fail repeatedly. `multicore.coffee` will then spin up a replacement worker. --- package.json | 1 + server.coffee | 26 ++++++++++++++++++++++++++ server/commons/errors.coffee | 4 ++++ server/middleware/healthcheck.coffee | 14 ++++++++++++-- server/routes/index.coffee | 2 +- server_config.coffee | 2 ++ server_setup.coffee | 4 ++++ 7 files changed, 50 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 97ea987c7df..be499884c48 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "co-express": "^1.2.1", "coffee-script": "1.9.x", "compression": "^1.6.2", + "connect-timeout": "^1.9.0", "cookie-parser": "^1.4.3", "cookie-session": "^1.2.0", "country-list": "0.0.3", diff --git a/server.coffee b/server.coffee index 83f77bde80c..6dd77fa7717 100644 --- a/server.coffee +++ b/server.coffee @@ -9,12 +9,38 @@ express = require 'express' http = require 'http' log = require 'winston' serverSetup = require './server_setup' +co = require 'co' +config = require './server_config' +{ runHealthcheck } = require './server/middleware/healthcheck' +Promise = require 'bluebird' module.exports.startServer = (done) -> app = createAndConfigureApp() httpServer = http.createServer(app).listen app.get('port'), -> done?() log.info('Express SSL server listening on port ' + app.get('port')) + runHealthcheckForever() if config.isProduction {app, httpServer} + +runHealthcheckForever = -> + log.info('Running healthchecks forever') + co -> + sleep = (time, result=null) -> new Promise((resolve) -> setTimeout((-> resolve(result)), time)) + failures = 0 + yield sleep(15000) # give server time to start up + while true + passed = yield Promise.race([ + runHealthcheck() + new sleep(5000, false) + ]) + if passed + failures = 0 + yield sleep(15000) + else + failures += 1 + log.warn("Healthcheck failure ##{failures}.") + if failures >= 3 + log.error('Three healthcheck failures in a row. Killing self.') + process.exit(1) createAndConfigureApp = module.exports.createAndConfigureApp = -> serverSetup.setupLogging() diff --git a/server/commons/errors.coffee b/server/commons/errors.coffee index 12a00bfd0b9..4e63224ffa3 100644 --- a/server/commons/errors.coffee +++ b/server/commons/errors.coffee @@ -95,6 +95,10 @@ module.exports.InternalServerError = class InternalServerError extends NetworkEr code: 500 errorName: 'Internal Server Error' +module.exports.ServiceUnavailable = class ServiceUnavailable extends NetworkError + code: 503 + errorName: 'Service Unavailable' + module.exports.GatewayTimeout = class GatewayTimeout extends NetworkError code: 504 errorName: 'Gateway Timeout' diff --git a/server/middleware/healthcheck.coffee b/server/middleware/healthcheck.coffee index e80859fb99b..43d55911960 100644 --- a/server/middleware/healthcheck.coffee +++ b/server/middleware/healthcheck.coffee @@ -1,7 +1,12 @@ wrap = require 'co-express' errors = require '../commons/errors' +co = require 'co' -module.exports = wrap (req, res) -> +healthcheckRoute = wrap (req, res) -> + yield runHealthcheck() + res.status(200).send('OK') + +runHealthcheck = co.wrap -> User = require '../models/User' user = yield User.findOne({}) throw new errors.InternalServerError('No users found') unless user @@ -19,4 +24,9 @@ module.exports = wrap (req, res) -> yield hcUser.save() activity = hcUser.trackActivity('healthcheck', 1) yield hcUser.update({activity: activity}) - res.status(200).send('OK') + return true + +module.exports = { + healthcheckRoute + runHealthcheck +} diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 939047639e1..ef476b45b96 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -244,4 +244,4 @@ module.exports.setup = (app) -> app.all('/headers', mw.headers) - app.get('/healthcheck', mw.healthcheck) + app.get('/healthcheck', mw.healthcheck.healthcheckRoute) diff --git a/server_config.coffee b/server_config.coffee index 3564270ff19..68c568f3c79 100644 --- a/server_config.coffee +++ b/server_config.coffee @@ -12,6 +12,8 @@ if cluster.worker? config.unittest = global.testing config.proxy = process.env.COCO_PROXY +config.timeout = parseInt(process.env.COCO_TIMEOUT) or 60*1000 + config.chinaDomain = "cn.codecombat.com;ccombat.cn;contributors.codecombat.com" config.brazilDomain = "br.codecombat.com;contributors.codecombat.com" config.port = process.env.COCO_PORT or process.env.COCO_NODE_PORT or process.env.PORT or 3000 diff --git a/server_setup.coffee b/server_setup.coffee index d2cbd45da26..b3842539c44 100644 --- a/server_setup.coffee +++ b/server_setup.coffee @@ -31,6 +31,7 @@ wrap = require 'co-express' codePlayTags = require './server/lib/code-play-tags' morgan = require 'morgan' domainFilter = require './server/middleware/domain-filter' +timeout = require('connect-timeout') {countries} = require './app/core/utils' @@ -74,6 +75,8 @@ setupErrorMiddleware = (app) -> err = new errors.Conflict(err.response) if err.name is 'MongoError' and err.message.indexOf('timed out') err = new errors.GatewayTimeout('MongoDB timeout error.') + if req.timedout # set by connect-timeout + err = new errors.ServiceUnavailable('Request timed out.') # TODO: Make all errors use this if err instanceof errors.NetworkError @@ -279,6 +282,7 @@ setupAPIDocs = (app) -> app.use('/api-docs', swaggerUi.setup(swaggerDoc)) exports.setupMiddleware = (app) -> + app.use(timeout(config.timeout)) setupHandlerTraceMiddleware app if config.TRACE_ROUTES setupSecureMiddleware app setupPerfMonMiddleware app From dc514d985c1c8581b4799377b2c92149f5dd9e45 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 23 Aug 2017 16:55:05 -0700 Subject: [PATCH 046/227] Prevent timed out requests from throwing errors when they try to respond Even if the timedout middleware finishes the response, the logic that's taking a while can still finish and try to send a response. If this happens, the resulting error does NOT get handled by the error middleware, and just crashes the worker instead. So make the replace all response-ending functions on the response with a chainable noop, so res.status(200).send('OK') works. --- server_setup.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server_setup.coffee b/server_setup.coffee index b3842539c44..d3b8bab3a64 100644 --- a/server_setup.coffee +++ b/server_setup.coffee @@ -81,8 +81,12 @@ setupErrorMiddleware = (app) -> # TODO: Make all errors use this if err instanceof errors.NetworkError console.log err.stack if err.stack and config.TRACE_ROUTES - return res.status(err.code).send(err.toJSON()) - + res.status(err.code).send(err.toJSON()) + if req.timedout + # noop return self all response-ending functions + res.send = res.status = res.redirect = res.end = res.json = res.sendFile = res.download = res.sendStatus = -> res + return + if err.status and 400 <= err.status < 500 console.log err.stack if err.stack and config.TRACE_ROUTES return res.status(err.status).send("Error #{err.status}") From 7299d48dd1329d3ad3193a5ca92f389fc17c092b Mon Sep 17 00:00:00 2001 From: Fernanda Rodrigues Date: Fri, 25 Aug 2017 09:27:42 +0100 Subject: [PATCH 047/227] translating pt-BR --- app/locale/pt-BR.coffee | 546 ++++++++++++++++++++-------------------- 1 file changed, 273 insertions(+), 273 deletions(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 04f414f22e8..f0b1dd84523 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -153,7 +153,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " campaign_multiplayer_description: "... nas quais você programará cara-a-cara contra outros jogadores." brain_pop_done: "Você derrotou os Ogros programando! Você venceu!" brain_pop_challenge: "Desafie-se a jogar novamente usando outra linguagem de programação!" -# replay: "Replay" + replay: "Replay" back_to_classroom: "Voltar para Turma" code: @@ -306,8 +306,8 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " dont_use_our_email_silly: "Não coloque o nosso email aqui! Use o email do seus pais ou responsável." recover: - recover_account_title: "Recuperar conta" - send_password: "Recuperar senha" + recover_account_title: "Recuperar Conta" + send_password: "Recuperar Senha" recovery_sent: "Email de recuperação enviado." items: @@ -320,15 +320,15 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " common: back: "Voltar" # When used as an action verb, like "Navigate backward" -# go_back: "Go Back" + go_back: "Volte" coming_soon: "Em breve!" continue: "Continuar" # When used as an action verb, like "Continue forward" next: "Próximo" default_code: "Código padrão" loading: "Carregando..." - overview: "Visão geral" + overview: "Visão Geral" solution: "Solução" -# table_of_contents: "Table of Contents" + table_of_contents: "Índice" intro: "Introdução" saving: "Salvando..." sending: "Enviando..." @@ -340,18 +340,18 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " create: "Criar" fork: "Fork" play: "Jogar" # When used as an action verb, like "Play next level" -# subscribe_to_play: "Subscribe to Play" + subscribe_to_play: "Inscreva-se para Jogar" retry: "Tente novamente" actions: "Ações" info: "Info" help: "Ajuda" watch: "Observar" unwatch: "Não Observar" - submit_patch: "Enviar arranjo" - submit_changes: "Enviar mudanças" - save_changes: "Salvar mudanças" + submit_patch: "Enviar Arranjo" + submit_changes: "Enviar Mudanças" + save_changes: "Salvar Mudanças" required_field: "obrigatório" - valid_phone: "Preencha um número de telefone válido." + valid_phone: "Preencha com um número de telefone válido." general: and: "e" @@ -366,7 +366,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " accept: "Aceitar" reject: "Rejeitar" withdraw: "Recuar" - submitter: "Enviar" + submitter: "Remetente" submitted: "Enviado" commit_msg: "Mensagem de Submissão" version_history: "Histórico de Versão" @@ -376,7 +376,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " undo_shortcut: "(Ctrl+Z)" redo_prefix: "Refazer" redo_shortcut: "(Ctrl+Shift+Z)" - play_preview: "Executar prévia do nível atual" + play_preview: "Jogar prévia do nível atual" result: "Resultado" results: "Resultados" description: "Descrição" @@ -401,7 +401,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " player: "Jogador" player_level: "Nível" # Like player level 5, not like level: Dungeons of Kithgard warrior: "Guerreiro" - ranger: "Arqueiro" + ranger: "Guarda" wizard: "Feiticeiro" first_name: "Primeiro Nome" last_name: "Último Nome" @@ -428,7 +428,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " years: "anos" play_level: -# back_to_map: "Back to Map" + back_to_map: "Voltar para o Mapa" directions: "Direções" edit_level: "Editar Nível" explore_codecombat: "Explorar CodeCombat" @@ -444,7 +444,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " programming_language: "Linguagem de programação" show_menu: "Mostrar menu do jogo" home: "Início" # Not used any more, will be removed soon. - level: "Fase" # Like "Level: Dungeons of Kithgard" + level: "Nível" # Like "Level: Dungeons of Kithgard" skip: "Pular" game_menu: "Menu do Jogo" restart: "Reiniciar" @@ -457,29 +457,29 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " failing: "Falta" reload: "Recarregar" reload_title: "Recarregar Todo o Código?" - reload_really: "Você tem certeza que quer reiniciar a fase?" + reload_really: "Você tem certeza que quer reiniciar o nível?" reload_confirm: "Recarregar Tudo" - test_level: "Nível de Tese" + test_level: "Nível de Teste" victory: "Vitória" - victory_title_prefix: " Vitória " - victory_title_suffix: " Completado!" - victory_sign_up: "Assine para salvar progresso" - victory_sign_up_poke: "Quer receber as últimas novidades por email? Crie uma conta grátis e nós o manteremos informado!" - victory_rate_the_level: "Avalie o estágio: " # {change} - victory_return_to_ladder: "Retornar para a progressão" + victory_title_prefix: "" + victory_title_suffix: "Completo!" + victory_sign_up: "Inscreva-se para salvar o progresso" + victory_sign_up_poke: "Quer salvar seu código? Crie uma conta grátis!" + victory_rate_the_level: "Este nível foi divertido?" # {change} + victory_return_to_ladder: "Retornar para a Progressão" victory_saving_progress: "Salvando Progresso" - victory_go_home: "Ir à página inicial" + victory_go_home: "Ir para o Inicio" victory_review: "Diga-nos mais!" - victory_review_placeholder: "O que achou da fase?" + victory_review_placeholder: "O que achou do nível?" victory_hour_of_code_done: "Terminou?" victory_hour_of_code_done_yes: "Sim, eu terminei minha Hora da Programação!" - victory_experience_gained: "XP ganho" - victory_gems_gained: "Gemas ganhas" - victory_new_item: "Novo item" - victory_new_hero: "Novo herói" - victory_viking_code_school: "Pelas barbas do profeta, esse foi um nível difícil! Se você ainda não é um desenvolvedor de software, você deveria ser. Você acaba de ser priorizado para aceitação na Viking Code School, onde você pode aprender mais e se tornar um desenvolvedor web profissional em 14 semanas." - victory_become_a_viking: "Torne-se um viking" - victory_no_progress_for_teachers: "O progresso não é salvo para o professores. Mas, você mesmo pode adicionar um conta de aluno na sua turma." + victory_experience_gained: "XP Ganho" + victory_gems_gained: "Gemas Ganhas" + victory_new_item: "Novo Item" + victory_new_hero: "Novo Herói" + victory_viking_code_school: "Pelas barbas do profeta, esse foi um nível difícil! Se você ainda não é um desenvolvedor de software, você deveria ser. Você acaba de ser convidado para a Escola de Programação Viking, onde você pode aprender mais e se tornar um desenvolvedor web profissional em 14 semanas." + victory_become_a_viking: "Torne-se um Viking" + victory_no_progress_for_teachers: "O progresso não é salvo para os professores. Mas, você mesmo pode adicionar um conta de aluno na sua turma." tome_cast_button_run: "Rodar" tome_cast_button_running: "Rodando" tome_cast_button_ran: "Encerrado" @@ -491,43 +491,43 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " hints_title: "Sugestão {{number}}" code_saved: "Código Salvo" skip_tutorial: "Pular (esc)" - keyboard_shortcuts: "Teclas de atalho" - loading_start: "Iniciar fase" + keyboard_shortcuts: "Teclas de Atalho" + loading_start: "Iniciar Nível" problem_alert_title: "Altere seu Código" time_current: "Agora:" time_total: "Máximo:" time_goto: "Ir para:" non_user_code_problem_title: "Erro ao carregar o nível" infinite_loop_title: "Loop Infinito Detectado" - infinite_loop_description: "O código inicial para construir o mundo nunca parou de rodar. Talvez seja muito lento ou tenha um loop infinito. Ou talvez tenha um bug. Você pode tentar rodar este código novamente ou resetá-lo para o estado inicial. Se isto não consertá-lo, avise-nos por favor." + infinite_loop_description: "O código inicial para construir o mundo nunca parou de rodar. Talvez seja muito lento ou tenha um loop infinito. Ou talvez tenha um bug. Você pode tentar rodar este código novamente ou resetá-lo para o estado inicial. Se isto não funcionar, avise-nos por favor." check_dev_console: "Você também pode abrir o terminal do desenvolvedor para ver o que pode estar dando errado." - check_dev_console_link: "(Instruções)" - infinite_loop_try_again: "Tentar novamente" + check_dev_console_link: "(instruções)" + infinite_loop_try_again: "Tentar Novamente" infinite_loop_reset_level: "Resetar nível" infinite_loop_comment_out: "Comentar Meu Código" tip_toggle_play: "Alterne entre rodando/pausado com Ctrl+P." tip_scrub_shortcut: "Ctrl+[ e Ctrl+] Rebobinar e Avançar." - tip_guide_exists: "Clique no guia no topo da página para ter informações úteis." + tip_guide_exists: "Clique nas Sugestões, no topo da página, para ter informações úteis." tip_open_source: "CodeCombat é 100% código aberto!" - tip_tell_friends: "Está gostando do CodeCombat? Divulgue para os seus amigos!" + tip_tell_friends: "Está gostando do CodeCombat? Mostre para os seus amigos!" tip_beta_launch: "CodeCombat lançou sua versão beta em outubro de 2013." tip_think_solution: "Pense na solução, não no problema." tip_theory_practice: "Na teoria, não existe diferença entre teoria e prática. Mas, na prática, existe. - Yogi Berra" - tip_error_free: "Existem duas formas de escrever programas sem erros; apenas a terceira funciona. - Alan Perlis" - tip_debugging_program: "Se depurar é o processo de remover erros, então programar deve ser o processo de adicioná-los. - Edsger W. Dijkstra" - tip_forums: "Vá aos fóruns e diga-nos o que você pensa!" + tip_error_free: "Existem duas formas de escrever programas sem erros. Apenas a terceira funciona. - Alan Perlis" + tip_debugging_program: "Se depurar (debugar) é o processo de remover erros, então programar deve ser o processo de adicioná-los. - Edsger W. Dijkstra" + tip_forums: "Vá aos fóruns e nos diga o que você acha!" tip_baby_coders: "No futuro, até bebês serão Arquimagos." - tip_morale_improves: "O carregamento continuará até que a ânimo melhore." # {change} - tip_all_species: "Nós acreditamos em oportunidades iguais para todas as espécies aprenderem a programar." + tip_morale_improves: "O carregamento continuará até que o ânimo melhore." # {change} + tip_all_species: "Nós acreditamos em oportunidades iguais para todas aprenderem a programar." tip_reticulating: "Reticulando espinhas." tip_harry: "Você é um Feiticeiro, " - tip_great_responsibility: "Com grandes poderes de programacão vêm grandes responsabilidades de debug." + tip_great_responsibility: "Com grandes poderes de programacão vêm grandes responsabilidades de depuração." tip_munchkin: "Se você não comer legumes e verduras, um ogro virá te buscar equanto você estiver dormindo." tip_binary: "Existem apenas 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem." tip_commitment_yoda: "Um programador deve possuir um compromisso profundo, uma mente séria. ~ Yoda" tip_no_try: "Faça. Ou não faça. Não existe tentar. - Yoda" tip_patience: "Paciência você deve ter, jovem Padawan. - Yoda" - tip_documented_bug: "Um bug documentado não é um bug; é uma funcionalidade." + tip_documented_bug: "Um bug documentado não é um bug, é uma funcionalidade." tip_impossible: "Tudo parece impossível, até que seja feito. - Nelson Mandela" tip_talk_is_cheap: "Falar é fácil. Mostre-me o código. - Linus Torvalds" tip_first_language: "A coisa mais desastrosa que você pode aprender é a sua primeira linguagem de programação. - Alan Kay" @@ -535,7 +535,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " tip_hofstadters_law: "Lei de Hofstadter: Tudo demora mais do que você espera, mesmo quando você leva em consideração a Lei de Hofstadter." tip_premature_optimization: "Uma otimização prematura é a raíz de todos os males. - Donald Knuth" tip_brute_force: "Na dúvida, utilize força bruta. - Ken Thompson" - tip_extrapolation: "Existem dois tipos de pessoa: Aqueles que podem extrapolar apartir de dados incompletos..." + tip_extrapolation: "Existem dois tipos de pessoa: Aqueles que podem extrapolar a partir de dados incompletos..." tip_superpower: "Programar é a coisa mais próxima de ter super poderes." tip_control_destiny: "No verdadeiro código aberto, você tem o direito de controlar seu próprio destino. - Linus Torvalds" tip_no_code: "Nenhum código é mais rápido que código nenhum. - Kevlin Henney" @@ -543,47 +543,47 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " tip_reusable_software: "Antes do software ser reutilizável, ele primeiro precisa ser utilizável." tip_optimization_operator: "Cada linguagem tem um operador de otimização. Na maioria delas esse operador é ‘//’" tip_lines_of_code: "Medir o progresso de programação em linhas de código é como medir a construção de aeronaves pelo peso. — Bill Gates" - tip_source_code: "Eu gostaria de mudar o Mundo, mas eles não me deram o código fonte." - tip_javascript_java: "Java é para o JavaScript o que um Carro é para um Carpete. - Chris Heilmann" + tip_source_code: "Eu queria de mudar o Mundo, mas eles não me deram o código fonte." + tip_javascript_java: "Java é para o JavaScript o que um Carro é para um Tapete. - Chris Heilmann" tip_move_forward: "O que quer que você faça, continue em frente de qualquer jeito. - Martin Luther King Jr." tip_google: "Tem um problema que você não pode solucionar? Google!" tip_adding_evil: "Adicionando uma pitada de maldade." - tip_hate_computers: "As pessoas realmente pensam que odeiam computadores. O que elas realmente odeiam são programadores ruins. - Larry Niven" - tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!" + tip_hate_computers: "As pessoas pensam que odeiam computadores. O que elas realmente odeiam são programadores ruins. - Larry Niven" + tip_open_source_contribute: "Você pode ajudar o CodeCombat a melhorar!" tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch" tip_free_your_mind: "Você tem que deixar isso tudo passar, Neo. O medo, a dúvida e a descrença. Liberte sua mente - Morpheus" tip_strong_opponents: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha" tip_paper_and_pen: "Antes de começar a programar, você sempre deve planejar com papel e caneta." - tip_solve_then_write: "Primeiro, resolva o problema. Então, escreva o código. - John Johnson" - tip_compiler_ignores_comments: "Em alguns momentos acho que o compilador ignora meus comentários." - tip_understand_recursion: "A única maneira de entender a recursividade é entender recursão." + tip_solve_then_write: "Primeiro, resolva o problema. Depois, escreva o código. - John Johnson" + tip_compiler_ignores_comments: "Às vezes acho que o compilador ignora meus comentários." + tip_understand_recursion: "A única maneira de entender a recursividade é entender recursividade." tip_life_and_polymorphism: "Código aberto é como uma estrutura heterogênea totalmente polimórfica: Todos os tipos são bem vindos." tip_mistakes_proof_of_trying: "Erros no seu código apenas provam que você está tentando." - tip_adding_orgres: "Arrendodamentos ogros." + tip_adding_orgres: "Arredondando ogros." tip_sharpening_swords: "Afiando as espadas." tip_ratatouille: "Você não deve deixar que ninguém defina seus limites com base de onde você veio. Seu único limite é a alma. - Gusteau, Ratatouille" - tip_nemo: "Quando a vida te colocar para baixo, quem saber o que você faz? Apenas continue nadando, apenas continue nadando. - Dory, Finding Nemo" - tip_internet_weather: "Basta ir para a internet, é agradável aqui. Nós temos vida no interior onde o clima é sempre é incrível. - John Green" - tip_nerds: "Nerds conseguem amar simples, como pular para cima e para baixo na cadeira sem controle desse amor. - John Green" - tip_self_taught: "Eu me ensinei 90% do meu conhecimento. E isso é normal! - Hank Green" - tip_luna_lovegood: "Não se preocupe, você apenas é tão louca quanto eu sou. - Luna Lovegood" + tip_nemo: "Quando a vida te colocar para baixo, quer saber o que você tem que fazer? Apenas continue a nadar, apenas continue a nadar. - Dory, Procurando Nemo" + tip_internet_weather: "Basta ir para a internet, é agradável aqui. Nós vivemos no interior onde o clima é sempre incrível. - John Green" + tip_nerds: "Os nerds podem amar coisas, como pular-para-cima-e-para-baixo-em-uma-cadeira-sem-controle - John Green" + tip_self_taught: "Eu me ensinei 90% do que aprendi. E isso é normal! - Hank Green" + tip_luna_lovegood: "Não se preocupe, você é tão louca quanto eu sou. - Luna Lovegood" tip_good_idea: "A melhor maneira de ter uma boa idéia é ter muitas idéias. - Linus Pauling" - tip_programming_not_about_computers: "Ciência da computação não é mais sobre computadores do que astronomia é sobre telescópios. - Edsger Dijkstra" - tip_mulan: "Acredite que você pode, então você será. - Mulan" -# project_complete: "Project Complete!" -# share_this_project: "Share this project with friends or family:" -# ready_to_share: "Ready to publish your project?" -# click_publish: "Click \"Publish\" to make it appear in the class gallery, then check out what your classmates built! You can come back and continue to work on this project. Any further changes will automatically be saved and shared with your classmates." -# already_published_prefix: "Your changes have been published to the class gallery." -# already_published_suffix: "Keep experimenting and making this project even better, or see what the rest of your class has built! Your changes will automatically be saved and shared with your classmates." -# view_gallery: "View Gallery" -# project_published_noty: "Your level has been published!" -# keep_editing: "Keep Editing" + tip_programming_not_about_computers: "Ciência da Computação não é mais sobre computadores do que astronomia é sobre telescópios. - Edsger Dijkstra" + tip_mulan: "Acredite que você pode, então você vai. - Mulan" + project_complete: "Projeto Completo!" + share_this_project: "Compartilhe este projeto com seus amigos e família:" + ready_to_share: "Pronto para publicar seu projeto?" + click_publish: "Clique em \"Publicar\" para que apareça na galeria da turma, depois confira o que seus colegas construíram! Você pode voltar e continuar trabalhando neste projeto. Qualquer outra alteração será salva automaticamente e compartilhada com seus colegas." + already_published_prefix: "Suas mudanças foram publicadas na galeria da turma." + already_published_suffix: Continue experimentando e tornando este projeto ainda melhor, ou veja o que o resto da sua turma construiu! Suas mudanças serão automaticamente salvas e compartilhadas com seus colegas." + view_gallery: "Visualizar Galeria" + project_published_noty: "Seu nível foi o publicado!" + keep_editing: "Continue Editando" play_game_dev_level: created_by: "Criado por {{name}}" - restart: "Reiniciar nível" - play: "Jogar nível" + restart: "Reiniciar Nível" + play: "Jogar Nível" play_more_codecombat: "Jogue mais CodeCombat" default_student_instructions: "Clique para controlar seu herói e ganhar o jogo!" @@ -596,8 +596,8 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " guide_tips: "Dicas" multiplayer_tab: "Multijogador" auth_tab: "Registrar" - inventory_caption: "Equipar seu herói" - choose_hero_caption: "Escolha seu herói, e linguagem" + inventory_caption: "Equipe seu herói" + choose_hero_caption: "Escolha o herói e linguagem" options_caption: "Configurar preferências" guide_caption: "Documentos e Dicas" multiplayer_caption: "Jogue com seus amigos!" @@ -608,9 +608,9 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " scores: "Pontuação" top_players: "Top Jogadores por" day: "Hoje" - week: "Essa Semana" + week: "Esta Semana" all: "Todo Tempo" -# latest: "Latest" + latest: "Mais Recentes" time: "Tempo" damage_taken: "Dano Recebido" damage_dealt: "Dano Causado" @@ -625,7 +625,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " should_equip: "(Dois cliques para equipar)" equipped: "(Equipado)" locked: "(Trancado)" - restricted: "(Restrito nesse nível)" + restricted: "(Restrito neste nível)" equip: "Equipar" unequip: "Desequipar" @@ -641,64 +641,64 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " prompt_button: "Entrar na loja" recovered: "Gemas das compras anteriores recuperadas. Por favor atualize a página." price: "x{{gems}} / mês" -# buy_premium: "Buy Premium" -# purchase: "Purchase" -# purchased: "Purchased" + buy_premium: "Comprar Premium" + purchase: "Adquirir" + purchased: "Adiquirido" -# earn_gems: -# prompt_title: "Not Enough Gems" -# prompt_body: "Keep playing to earn more!" + earn_gems: + prompt_title: "Gemas Insuficientes" + prompt_body: "Continue jogando para ganhar mais!" subscribe: -# premium_already_subscribed: "You're already subscribed to Premium!" -# subscribe_modal_title: "CodeCombat Premium" - comparison_blurb: "Afine suas habilidades com uma assinatura CodeCombat!" # {change} -# premium_pricing_prefix: "Get Premium for just" -# premium_pricing_suffix: "and become a master coder." -# premium: "Premium" # Make sure the following feature translations don't go onto two lines + premium_already_subscribed: "Você já se inscreveu como Premium!" + subscribe_modal_title: "CodeCombat Premium" + comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" # {change} + premium_pricing_prefix: "Seja Premium por apenas" + premium_pricing_suffix: "e se torne um programador." + premium: "Premium" # Make sure the following feature translations don't go onto two lines free: "Grátis" month: "mês" - must_be_logged: "Você deve estar logado primeiro. Por gentileza crie uma conta ou faça o log in no menu acima." + must_be_logged: "Você deve estar logado primeiro. Por favor crie uma conta ou faça log in no menu acima." subscribe_title: "Inscrever-se" # Actually used in subscribe buttons, too unsubscribe: "Desinscrever-se" confirm_unsubscribe: "Confirmar Desinscrição" - never_mind: "Nunca esqueça, Eu continuo amando você" - thank_you_months_prefix: "Obrigado por nos apoiar" + never_mind: "Nunca esqueça, eu ainda te você" + thank_you_months_prefix: "Obrigado por nos apoiar nos últimos" thank_you_months_suffix: "meses." - thank_you: "Obrigado por estar apoiando o CodeCombat." - sorry_to_see_you_go: "É uma pena ver você indo embora! Por favor, diga o que podemos fazer para melhorar." + thank_you: "Obrigado por apoiar o CodeCombat." + sorry_to_see_you_go: "É uma pena ver você partir! Por favor, diga o que podemos fazer para melhorar." unsubscribe_feedback_placeholder: "Oh, o que nós fizemos?" - parent_button: "Pergunte aos seus pais" + parent_button: "Pergunte aos seus pais ou responsável" parent_email_description: "Nós enviaremos um e-mail para eles adquirirem uma assinatura do CodeCombat para você." parent_email_input_invalid: "Endereço de e-mail inválido." - parent_email_input_label: "Endereço de e-mail dos pais" - parent_email_input_placeholder: "Informe o e-mail dos pais" + parent_email_input_label: "Endereço de e-mail dos pais ou responsável" + parent_email_input_placeholder: "Informe o e-mail do responsável" parent_email_send: "Enviar Email" parent_email_sent: "Email enviado!" - parent_email_title: "Qual é o e-mail dos seus pais?" - parents: "Para os pais" - parents_title: "Seus filhos estão aprendendo a programar." # {change} - parents_blurb1: "Com o CodeCombat, seus filhos aprendem a programar de verdade. Eles começam a aprender comandos simples, e progridem para tópicos avançados." + parent_email_title: "Qual é o e-mail dos seus pais ou responsável?" + parents: "Para os pais ou responsáveis" + parents_title: "Seu filho está aprendendo a programar. Você irá ajudá-lo a continuar?" # {change} + parents_blurb1: "Seu filho(a) jogou __nLevels__ e aprendeu alguns conceitos básicos de programação. Ajude a cultivar seu interesse fazendo uma assinatura para que ele possa continuar jogando." parents_blurb1a: "Programação de computadores é uma habilidade essencial que seu filho com certeza usará quando adulto. Em 2020, conhecimentos basicos de software serão necessários para 77% dos empregos, e engenheiros de software estão em grande demanda ao redor do mundo. Você sabia que CIência da Computação é a formação superior mais bem paga?" - parents_blurb2: "Por apenas ${{price}} USD/mês, eles recebem novos desafios todo mês e suporte no email pessoal de programadores profissionais." # {change} - parents_blurb3: "Sem risco: 100% devolução do dinheiro garantida, basta um simples clique em desinscrever-se." - payment_methods: "Formas de pagamento" + parents_blurb2: "Por apenas ${{price}} USD/mês, eles receberão novos desafios todo mês e suporte via email de programadores profissionais." # {change} + parents_blurb3: "Sem risco: devolução do dinheiro 100% garantida, basta um simples clique em desinscrever-se." + payment_methods: "Formas de Pagamento" payment_methods_title: "Formas de pagamento aceitas" payment_methods_blurb1: "Aceitamos cartões de crédito e Alipay no momento." # {change} - payment_methods_blurb2: "Se você precisa de outra forma de pagamento, por favor contate" + payment_methods_blurb2: "Se desejar usar outra forma de pagamento, por favor entre em contato" sale_button: "Venda!" - sale_button_title: "Economize ${{discount}} quando você adquirir a assinatura de 1 ano" # {change} + sale_button_title: "Economize $21 quando você adquirir a assinatura de 1 ano" # {change} stripe_description: "Inscrição Mensal" buy_now: "Compre Agora" subscription_required_to_play: "Você precisará se inscrever para jogar este nível." unlock_help_videos: "Inscreva-se para desbloquear todos os vídeos tutoriais." personal_sub: "Inscrição individual" # Accounts Subscription View below - loading_info: "Carregando informação sobre assinatura" + loading_info: "Carregando informação sobre assinatura..." managed_by: "Gerenciada por" will_be_cancelled: "Será cancelada em" currently_free: "Atualmente você tem uma assinatura gratuita" currently_free_until: "Sua assinatura gratuita é válida até" -# free_subscription: "Free subscription" + free_subscription: "Assinatura gratuita" was_free_until: "Sua assinatura gratuita expirou em" managed_subs: "Assinaturas gerenciadas" subscribing: "Assinando..." @@ -717,81 +717,81 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " lifetime_price: "$__price__" year_subscription: "Inscrição Anual" year_price: "$__price__/ano" - kids_message_1: "Crianças! Nós vamos enviar um email para seus pais para que eles possam pagar a inscrição para vocês." - kids_message_2: "Peça ao seus pais" + kids_message_1: "Crianças! Nós vamos enviar um email para seus pais ou responsável para que eles possam pagar a inscrição para vocês." + kids_message_2: "Peça ao seus pais ou responsáveis" support_part1: "Precisa de ajuda com as opções de pagamento? Envie um email para" support_part2: "support@codecombat.com" support_part3: "se tiver qualquer pergunta." -# you_are_purchasing_year_sub: "You're purchasing a Yearly Premium Subscription!" -# you_are_purchasing_lifetime_sub: "You're purchasing a Lifetime Premium Subscription!" -# you_will_be_charged: "You will be charged $__priceString__ one time." -# choose_payment_method: "Choose Payment Method" -# pay_with_credit_card_or_bitcoin: "Pay with Credit Card / Bitcoin" -# paypal_payment_error: "We encountered an error while charging PayPal." - -# announcement: -# now_available: "Now available for subscribers!" -# subscriber: "subscriber" -# cuddly_companions: "Cuddly Companions!" # Pet Announcement Modal -# kindling_name: "Kindling Elemental" -# kindling_description: "Kindling Elementals just want to keep you warm at night. And during the day. All the time, really." -# griffin_name: "Baby Griffin" -# griffin_description: "Griffins are half eagle, half lion, all adorable." -# raven_name: "Raven" -# raven_description: "Ravens are excellent at gathering shiny bottles full of health for you." -# mimic_name: "Mimic" -# mimic_description: "Mimics can pick up coins for you. Move them on top of coins to increase your gold supply." -# cougar_name: "Cougar" -# cougar_description: "Cougars like to earn a PhD by Purring Happily Daily." -# fox_name: "Blue Fox" -# fox_description: "Blue foxes are very clever and love digging in the dirt and snow!" -# pugicorn_name: "Pugicorn" -# pugicorn_description: "Pugicorns are some of the rarest creatures and can cast spells!" -# wolf_name: "Wolf Pup" -# wolf_description: "Wolf pups excel in hunting, gathering, and playing a mean game of hide-and-seek!" + you_are_purchasing_year_sub: "Você está comprando uma assinatura premium anual!" + you_are_purchasing_lifetime_sub: "Você está comprando uma assinatura premium para vida toda!" + you_will_be_charged: "Será cobrado $__priceString__ apenas uma vez." + choose_payment_method: "Escolha o Método de Pagamento" + pay_with_credit_card_or_bitcoin: "Pague com Cartão de Crédito / Bitcoin" + paypal_payment_error: "Encontramos um erro ao carregar o PayPal." + + announcement: + now_available: "Agora disponível para assinantes!" + subscriber: "assinante" + cuddly_companions: "Companheiros fofinhos!" # Pet Announcement Modal + kindling_name: "Kindling Elemental" + kindling_description: "Kindling Elementals só quer mantê-lo aquecido à noite. E durante o dia. O tempo todo, na verdade." + griffin_name: "Grifo bebê" + griffin_description: "Os Grifos são metade águia, metade leão, todos adoráveis." + raven_name: "Corvo" + raven_description: "Os corvos são excelentes para juntar garrafas brilhantes cheias de saúde para você." + mimic_name: "Mímico" + mimic_description: "Os mímicos pode pegar moedas para você. Mova-os para as moedas e aumente seu tesouro." + cougar_name: "Puma" + cougar_description: "Os pumas gostam de ganhar PhDs." + fox_name: "Raposa Azul" + fox_description: "As raposas azuis são muito inteligentes e gostam de escavar na sujeira e na neve!" + pugicorn_name: "Pugicorn" + pugicorn_description: "Pugicorns são uma das criaturas mais raras e podem lançar feitiços!" + wolf_name: "Lobo Filhote" + wolf_description: "Os filhotes de lobo se destacam na caçar, pegar coisas e jogar esconde-esconde!" # ball_name: "Red Squeaky Ball" # ball_description: "ball.squeak()" -# collect_pets: "Collect pets for your heroes!" -# each_pet: "Each pet has a unique helper ability!" -# upgrade_to_premium: "Become a {{subscriber}} to equip pets." -# play_second_kithmaze: "Play {{the_second_kithmaze}} to unlock the Wolf Pup!" -# the_second_kithmaze: "The Second Kithmaze" -# keep_playing: "Keep playing to discover the first pet!" -# coming_soon: "Coming soon" -# ritic: "Ritic the Cold" # Ritic Announcement Modal -# ritic_description: "Ritic the Cold. Trapped in Kelvintaph Glacier for countless ages, finally free and ready to tend to the ogres that imprisoned him." -# ice_block: "A block of ice" -# ice_description: "There appears to be something trapped inside..." -# blink_name: "Blink" -# blink_description: "Ritic disappears and reappears in a blink of an eye, leaving nothing but a shadow." -# shadowStep_name: "Shadowstep" -# shadowStep_description: "A master assassin knows how to walk between the shadows." -# tornado_name: "Tornado" -# tornado_description: "It is good to have a reset button when one's cover is blown." -# wallOfDarkness_name: "Wall of Darkness" -# wallOfDarkness_description: "Hide behind a wall of shadows to prevent the gaze of prying eyes." + collect_pets: "Colete pet para seus heróis!" + each_pet: "Cada pet tem uma habilidade auxiliar exclusiva!" + upgrade_to_premium: "Torne-se um {{subscriber}} para equipar os pets." + play_second_kithmaze: "Jogue {{the_second_kithmaze}} para desbloquear o Lobo Filhote!" + the_second_kithmaze: "O Segundo Kithmaze" + keep_playing: "Continue jogando para descobrir o primeiro pet!" + coming_soon: "Em breve" + ritic: "Ritic o Frio" # Ritic Announcement Modal + ritic_description: "Ritic o Frio. Preso no Glaciar Kelvintaph por inúmeras decadas, finalmente livre e pronto para cuidar dos ogros que o aprisionaram." + ice_block: "Um bloco de gelo" + ice_description: "Parece haver algo preso dentro..." + blink_name: "Blink" + blink_description: "Ritic desaparece e reaparece em um piscar de olhos, deixando apenas uma sombra." + shadowStep_name: "Shadowstep" + shadowStep_description: "Um mestre lutador sabe como andar nas sombras." + tornado_name: "Tornado" + tornado_description: "É bom recomeçar quando tudo for pro espaço." + wallOfDarkness_name: "Muro das Trevas" + wallOfDarkness_description: "Esconda-se por trás de uma parede de sombras para evitar o olhares curiosos." premium_features: -# get_premium: "Get
CodeCombat
Premium" # Fit into the banner on the /features page -# master_coder: "Become a Master Coder by subscribing today!" + get_premium: "Assine
CodeCombat
Premium" # Fit into the banner on the /features page + master_coder: "Torne-se um programador assinando hoje!" subscribe_now: "Assine Agora" -# hero_blurb_1: "Get access to __premiumHeroesCount__ super-charged subscriber-only heroes! Harness the unstoppable power of Okar Stompfoot, the deadly precision of Naria of the Leaf, or summon \"adorable\" skeletons with Nalfar Cryptor." -# hero_blurb_2: "Premium Warriors unlock stunning martial skills like Warcry, Stomp, and Hurl Enemy. Or, play as a Ranger, using stealth and bows, throwing knives, traps! Try your skill as a true coding Wizard, and unleash a powerful array of Primordial, Necromantic or Elemental magic!" -# hero_caption: "Exciting new heroes!" -# pet_blurb_1: "Pets aren't just adorable companions, they also provide unique functionality and methods. The Baby Griffon can carry units through the air, the Wolf Pup plays catch with enemy arrows, the Cougar is fond of chasing ogres around, and the Mimic attracts coins like a magnet!" -# pet_blurb_2: "Collect all the pets to discover their unique abilities!" -# pet_caption: "Adopt pets to accompany your hero!" -# game_dev_blurb: "Learn game scripting and build new levels to share with your friends! Place the items you want, write code for unit logic and behavior, and see if your friends can beat the level!" -# game_dev_caption: "Design your own games to challenge your friends!" -# everything_in_premium: "Everything you get in CodeCombat Premium:" -# list_gems: "Receive bonus gems to buy gear, pets, and heroes" -# list_levels: "Gain access to __premiumLevelsCount__ more levels" -# list_heroes: "Unlock exclusive heroes, include Ranger and Wizard classes" -# list_game_dev: "Make and share games with friends" -# list_web_dev: "Build websites and interactive apps" -# list_items: "Equip Premium-only items like pets" -# list_support: "Get Premium support to help you debug tricky code" -# list_clans: "Create private clans to invite your friends and compete on a group leaderboard" + hero_blurb_1: "Ganhe acesso a __premiumHeroesCount__ heróis exclusivos para assinantes! Apoveite o poder imparável de Okar Stompfoot, a precisão mortal Naria of the Leaf, ou convoque esqueletos \"adoráveis\" com Nalfar Cryptor." + hero_blurb_2: "Os guerreiros desbloqueiam habilidades especiais como Grito de Guerra, Stomp e Lançar Heróis. Ou, jogue como um Patrulheiro usando discrição e arcos, jogando facas, armadilhas! Experimente sua habilidade como um autêntico Feiticeiro Programador e desenhe uma poderosa matriz de magia Primordial, Necromântica ou Elementar!" + hero_caption: "Novos heróis emocionantes!" + pet_blurb_1: "Os animais de estimação não são apenas companheiros adoráveis, eles também oferecem funcionalidades e métodos únicos. O Grifo bebê pode transportar unidades através do ar, o Lobo Filhote pega as flechas inimigas, o Puma gosta de perseguir ogros e o Mimic atrai moedas como um ímã!" + pet_blurb_2: "Colecione todos os animais de estimação para descobrir suas habilidades únicas!" + pet_caption: "Adote animais de estimação para acompanhar o seu herói!" + game_dev_blurb: "Aprenda a criar jogos e novos níveis para compartilhar com seus amigos! Coloque os itens que deseja, escreva o código para lógica e comportamento das unidades e veja se seus amigos podem vencer o nível!" + game_dev_caption: "Crie seus próprios jogos para desafiar seus amigos!" + everything_in_premium: "Tudo o que você tem direito com o CodeCombat Premium:" + list_gems: "Receba gemas para comprar equipamentos, animais de estimação e heróis" + list_levels: "Tenha acesso a mais __premiumLevelsCount__ níveis" + list_heroes: "Desbloqueie heróis exclusivos, inclua classes Ranger e Wizard (Patrulheiro e Feiticero)" + list_game_dev: "Crie e compartilhe jogos com seus amigos" + list_web_dev: "Crie sites e aplicativos interativos" + list_items: "Equipe itens exclusivos" + list_support: "Obtenha suporte Premium para ajudá-lo a depurar códigos mais complicados" + list_clans: "Crie clãs privados para convidar seus amigos e competir" choose_hero: choose_hero: "Escolha seu Herói" @@ -803,11 +803,11 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " javascript_blurb: "A linguagem da web." coffeescript_blurb: "Sintaxe de JavaScript mais legal." lua_blurb: "Linguagem de script para jogos." -# java_blurb: "(Subscriber Only) Android and enterprise." + java_blurb: "(Apenas para assinantes) Android e enterprise." status: "Status" weapons: "Armas" - weapons_warrior: "Espadas - Curta distância, Sem Magia" - weapons_ranger: "Bestas, Armas de fogo - Longa Distância, Sem Magia" + weapons_warrior: "Espadas - Curta Alcance, Sem Magia" + weapons_ranger: "Bestas, Armas de fogo - Longo Alcance, Sem Magia" weapons_wizard: "Varinhas, Bastões - Longa Distância, Magia" attack: "Ataque" # Can also translate as "Attack" health: "Vida" @@ -823,7 +823,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " health_1: "Obtem" health_2: "das listadas" health_3: "saúde da armadura." - speed_1: "Se move para" + speed_1: "Move-se para" speed_2: "metros por segundo." available_for_purchase: "Disponível para a Compra" # Shows up when you have unlocked, but not purchased, a hero in the hero store level_to_unlock: "Nível para desbloquear:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) @@ -831,12 +831,12 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " skill_docs: function: "função" # skill types - method: "metódo" + method: "método" snippet: "fragmento" number: "número" array: "ordem" object: "objeto" - string: "palavra" + string: "string" writable: "gravável" # Hover over "attack" in Your Skills while playing a level to see most of this read_only: "apenas leitura" action: "Ação" @@ -845,7 +845,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " action_cooldown: "Demora" action_specific_cooldown: "Recarregando" action_damage: "Dano" - action_range: "Distância" + action_range: "Alcance" action_radius: "Raio" action_duration: "Duração" example: "Exemplo" @@ -855,7 +855,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " parameters: "Parâmetros" required_parameters: "Parâmetros necessários" optional_parameters: "Parâmetros opcionais" - returns: "Retorno" + returns: "Retorna" granted_by: "Concebido por" save_load: @@ -867,7 +867,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " volume_label: "Volume" music_label: "Música" music_description: "Ligar/desligar música de fundo." - editor_config_title: "Editor de Configurações" + editor_config_title: "Configurações do Editor" editor_config_livecompletion_label: "Autocompletar durante a escrita" editor_config_livecompletion_description: "Mostra opções de autocompletar enquanto estiver escrevendo." editor_config_invisibles_label: "Mostrar Invisíveis" @@ -878,12 +878,12 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " editor_config_behaviors_description: "Completar automaticamente colchetes, chaves e aspas." about: - main_title: "Se você quer aprender a programar, você precisa escrever (bastante) código." + main_title: "Se quer aprender a programar, você precisa escrever (bastante) código." main_description: "No CodeCombat, nosso trabalho é assegurar que você está fazendo isso com um sorriso no rosto." mission_link: "Missão" team_link: "Time" story_link: "História" - press_link: "Pressione" + press_link: "Contato" mission_title: "Nossa missão: fazer programação acessível para todos os estudantes." mission_description_1: "Programação é mágica. É a habilidade de criar coisas apartir da pura imaginação. Criamos o CodeCombat para dar aos alunos a sensação de poder de um mago na ponta de seus dedos enquanto digita códigos." mission_description_2: "Como resultado, isso os permite aprender mais rápido também. MUITO mais rápido. É como conversar ao invés de ler um manual. Nós queremos trazer essa conversa para todas escolas e para todos estudantes, porque todos deveriam ter a chance de aprender a mágica da programação." @@ -918,13 +918,13 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " retrostyle_blurb: "Games estilo Retrô" jose_title: "Músico" jose_blurb: "Descolado" -# bryukh_title: "Game Designer" -# bryukh_blurb: "Constructs puzzles" + bryukh_title: "Game Designer" + bryukh_blurb: "Constroi enigmas" community_title: "... e nossa comunidade open-source" community_subtitle: "Mais de 500 colaboradores ajudaram a construir o CodeCombat, com mais se juntando toda semana!" community_description_3: "O CodeCombat é um " community_description_link_2: "projeto da comunidade" - community_description_1: ", com centenas de jogadores que se voluntariam para criar níveis, contribuem para o nosso código para adicionar recursos, corrigir bugs, testam o jogo e até mesmo traduzir o jogo em até 50 idiomas até agora. Funcionários, colaboradores e o site ganham compartilhando ideias e compartilhando esforços, assim como a comunidade open source em geral. O site é construído em vários projetos open source, e nós somos open source para dar a comunidade e fornecer aos jogadores curiosos um projeto familiar para explorar e experimentar. Qualquer um pode se juntar à comunidade CodeCombat! Confira nossa " + community_description_1: "com centenas de jogadores que se voluntariam para criar níveis, contribuem para o nosso código para adicionar recursos, corrigir bugs, testam o jogo e até mesmo traduzir o jogo em até 50 idiomas até agora. Funcionários, colaboradores e o site ganham compartilhando ideias e compartilhando esforços, assim como a comunidade open source em geral. O site é construído em vários projetos open source, e nós somos open source para dar a comunidade e fornecer aos jogadores curiosos um projeto familiar para explorar e experimentar. Qualquer um pode se juntar à comunidade CodeCombat! Confira nossa " community_description_link: "página de contribuições" community_description_2: "para mais informação." number_contributors: "Mais de 450 colaboradores deram o seu apoio e tempo a este projeto." @@ -2298,85 +2298,85 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # victory_sign_up_poke: "Create a free account to save your code & be entered for a chance to win prizes!" # victory_sign_up: "Sign up & be entered to win $2,500" -# server_error: -# email_taken: "Email already taken" -# username_taken: "Username already taken" - -# esper: -# line_no: "Line $1: " -# uncaught: "Uncaught $1" # $1 will be an error type, eg "Uncaught SyntaxError" -# reference_error: "ReferenceError: " -# argument_error: "ArgumentError: " -# type_error: "TypeError: " -# syntax_error: "SyntaxError: " -# error: "Error: " -# x_not_a_function: "$1 is not a function" -# x_not_defined: "$1 is not defined" -# spelling_issues: "Look out for spelling issues: did you mean `$1` instead of `$2`?" -# capitalization_issues: "Look out for capitalization: `$1` should be `$2`." -# py_empty_block: "Empty $1. Put 4 spaces in front of statements inside the $2 statement." -# fx_missing_paren: "If you want to call `$1` as a function, you need `()`'s" -# unmatched_token: "Unmatched `$1`. Every opening `$2` needs a closing `$3` to match it." -# unterminated_string: "Unterminated string. Add a matching `\"` at the end of your string." -# missing_semicolon: "Missing semicolon." -# missing_quotes: "Missing quotes. Try `$1`" -# argument_type: "`$1`'s argument `$2` should have type `$3`, but got `$4`: `$5`." -# argument_type2: "`$1`'s argument `$2` should have type `$3`, but got `$4`." -# target_a_unit: "Target a unit." -# attack_capitalization: "Attack $1, not $2. (Capital letters are important.)" -# empty_while: "Empty while statement. Put 4 spaces in front of statements inside the while statement." -# line_of_site: "`$1`'s argument `$2` has a problem. Is there an enemy within your line-of-sight yet?" -# need_a_after_while: "Need a `$1` after `$2`." -# too_much_indentation: "Too much indentation at the beginning of this line." -# missing_hero: "Missing `$1` keyword; should be `$2`." -# takes_no_arguments: "`$1` takes no arguments." -# no_one_named: "There's no one named \"$1\" to target." -# separated_by_comma: "Function calls paramaters must be seperated by `,`s" -# protected_property: "Can't read protected property: $1" -# need_parens_to_call: "If you want to call `$1` as function, you need `()`'s" -# expected_an_identifier: "Expected an identifier and instead saw '$1'." -# unexpected_identifier: "Unexpected identifier" -# unexpected_end_of: "Unexpected end of input" -# unnecessary_semicolon: "Unnecessary semicolon." -# unexpected_token_expected: "Unexpected token: expected $1 but found $2 while parsing $3" -# unexpected_token: "Unexpected token $1" -# unexpected_token2: "Unexpected token" -# unexpected_number: "Unexpected number" -# unexpected: "Unexpected '$1'." -# escape_pressed_code: "Escape pressed; code aborted." -# target_an_enemy: "Target an enemy by name, like `$1`, not the string `$2`." -# target_an_enemy_2: "Target an enemy by name, like $1." -# cannot_read_property: "Cannot read property '$1' of undefined" -# attempted_to_assign: "Attempted to assign to readonly property." -# unexpected_early_end: "Unexpected early end of program." -# you_need_a_string: "You need a string to build; one of $1" -# unable_to_get_property: "Unable to get property '$1' of undefined or null reference" # TODO: Do we translate undefined/null? -# code_never_finished_its: "Code never finished. It's either really slow or has an infinite loop." -# unclosed_string: "Unclosed string." -# unmatched: "Unmatched '$1'." -# error_you_said_achoo: "You said: $1, but the password is: $2. (Capital letters are important.)" -# indentation_error_unindent_does: "Indentation Error: unindent does not match any outer indentation level" -# indentation_error: "Indentation error." -# need_a_on_the: "Need a `:` on the end of the line following `$1`." -# attempt_to_call_undefined: "attempt to call '$1' (a nil value)" -# unterminated: "Unterminated `$1`" -# target_an_enemy_variable: "Target an $1 variable, not the string $2. (Try using $3.)" -# error_use_the_variable: "Use the variable name like `$1` instead of a string like `$2`" -# indentation_unindent_does_not: "Indentation unindent does not match any outer indentation level" -# unclosed_paren_in_function_arguments: "Unclosed $1 in function arguments." -# unexpected_end_of_input: "Unexpected end of input" -# there_is_no_enemy: "There is no `$1`. Use `$2` first." # Hints start here -# try_herofindnearestenemy: "Try `$1`" -# there_is_no_function: "There is no function `$1`, but `$2` has a method `$3`." -# attacks_argument_enemy_has: "`$1`'s argument `$2` has a problem." -# is_there_an_enemy: "Is there an enemy within your line-of-sight yet?" -# target_is_null_is: "Target is $1. Is there always a target to attack? (Use $2?)" -# hero_has_no_method: "`$1` has no method `$2`." -# there_is_a_problem: "There is a problem with your code." -# did_you_mean: "Did you mean $1? You do not have an item equipped with that skill." -# missing_a_quotation_mark: "Missing a quotation mark. " -# missing_var_use_var: "Missing `$1`. Use `$2` to make a new variable." -# you_do_not_have: "You do not have an item equipped with the $1 skill." -# put_each_command_on: "Put each command on a separate line" -# are_you_missing_a: "Are you missing a '$1' after '$2'? " -# your_parentheses_must_match: "Your parentheses must match." + server_error: + email_taken: "Email já em uso" + username_taken: "Nome do usuário já em uso" + + esper: + line_no: "Linha $1: " + uncaught: "$1 Não encontrado" # $1 will be an error type, eg "Uncaught SyntaxError" + reference_error: "ReferenceError - Erro de Referência: " + argument_error: "ArgumentError - Erro de Argumento: " + type_error: "TypeError - Erro de Tipo: " + syntax_error: "SyntaxError - Erro de Sintaxe: " + error: "Erro: " + x_not_a_function: "$1 não é uma função" + x_not_defined: "$1 não foi definido" + spelling_issues: "Procure erros de digitação: você quis dizer `$1` ao invés de `$2`?" + capitalization_issues: "Cuidado com as letras maiúsculas e minúsculas: `$1` deve ser `$2`." + py_empty_block: "$1 vazio. Coloque 4 espaços na frente do comando dentro da declaração $2." + fx_missing_paren: "Se você quer chamar `$1` como uma função, você precisa usar `()`" + unmatched_token: "`$1` incompatível. Toda `$2` de abertura precisa de uma `$3` de fechamento para combinar." + unterminated_string: "String não terminada. Adicione `\"` no final da string." + missing_semicolon: "Faltando ponto e vírgula." + missing_quotes: "Faltando aspas. Tente `$1`" + argument_type: "`$2`, argumeno de `$1`, deveria ser do tipo `$3`, mas é `$4`: `$5`." + argument_type2: "`$2`, argumeno de `$1`, deveria ser do tipo `$3`, mas é `$4`." + target_a_unit: "Mire em uma unidade." + attack_capitalization: "Ataque $1, não $2. (As letras maiúsculas são importantes.)" + empty_while: "Declaração while vazia. Coloque 4 espaços na frente dos comandos dentro do while." + line_of_site: "Problemas com o argumento `$2` de `$1`. Ainda existe um inimigo dentro da sua linha de visão?" + need_a_after_while: "Precisa de um `$1` depois de `$2`." + too_much_indentation: "Muita identação no inicio dessa linha." + missing_hero: "Faltando palavra chave `$1`; deve ser `$2`." + takes_no_arguments: "`$1` não precisa de argumentos." + no_one_named: "Não há ninguém chamado \"$1\" para atacar." + separated_by_comma: "Os parâmetros das chamadas de função devem ser separados por `,`" + protected_property: "Não é possível ler a propriedade protegida: $1" + need_parens_to_call: "Se quiser chamar `$1` como uma função, você precisa usar `()`" + expected_an_identifier: "Esperava um identificador e, ao invés, encontrou '$1'." + unexpected_identifier: "Identificador inesperado" + unexpected_end_of: "Fim inesperado de entrada" + unnecessary_semicolon: "Ponto e vírgula desnecessário." + unexpected_token_expected: "Símbolo inesperado: esperava $1, mas encontrou $2 ao analisar $3" + unexpected_token: "Símbolo $1 inesperado" + unexpected_token2: "Símbolo inesperado" + unexpected_number: "Número inesperado" + unexpected: "'$1' inesperado." + escape_pressed_code: "Esc pressionado. Código abortado." + target_an_enemy: "Ataque um inimigo pelo nome, assim `$1`, não a string `$2`." + target_an_enemy_2: "Ataque um inimigo pelo nome, assim `$1`." + cannot_read_property: "Não é possível ler a propriedade indefinida '$1'" + attempted_to_assign: "Tentativa de atribuir uma propriedade apenas de leitura." + unexpected_early_end: "Fim inesperado do programa." + you_need_a_string: "Você precisa de uma string para construir; um de $1" + unable_to_get_property: "Não é possível acessar propriedade '$1' com referência undefined ou null (indefinida ou nula)" # TODO: Do we translate undefined/null? + code_never_finished_its: "Código nunca terminado. É muito lento ou tem um loop infinito." + unclosed_string: "String não terminada." + unmatched: "'$1' incompatível." + error_you_said_achoo: "Você disse: $1, mas a senha é: $2. (Letras maiúsculas são importantes.)" + indentation_error_unindent_does: "Erro de Indentação: identação não corresponde a nenhum nível de identação" + indentation_error: "Erro de Indentação." + need_a_on_the: "Precisa de um `:` no final da linha, depois de `$1`." + attempt_to_call_undefined: "tentou chamar '$1' (um valor nulo)" + unterminated: "`$1` não terminado" + target_an_enemy_variable: "Ataque uma variável $1 variable, não a string $2. (Tente usar $3.)" + error_use_the_variable: "Use o nome da variável assim `$1` ao invés de uma string `$2`" + indentation_unindent_does_not: "Indentação não corresponde a nenhum nível de indentação externo" + unclosed_paren_in_function_arguments: "$1 aberto nos atgumentos da função." + unexpected_end_of_input: "Fim inesperado de entrada" + there_is_no_enemy: "Não existe `$1`. Use `$2` primeiro." # Hints start here + try_herofindnearestenemy: "Tente `$1`" + there_is_no_function: "Não existe função `$1`, mas `$2` tem um método `$3`." + attacks_argument_enemy_has: "Argumento `$1` de `$2` tem um problema." + is_there_an_enemy: "Ainda existe um inimigo dentro da sua linha de visão??" + target_is_null_is: "o alvo é $1. Existe sempre um alvo para atacar? (Use $2?)" + hero_has_no_method: "`$1` não tem método `$2`." + there_is_a_problem: "Há um problema com seu código." + did_you_mean: "Você quis dizer $1? Você não tem um item equipado com essa habilidade." + missing_a_quotation_mark: "Faltando uma aspa. " + missing_var_use_var: "Faltando `$1`. Use `$2` para criar uma nova variável." + you_do_not_have: "Você não tem um item equipado com a habilidade $1." + put_each_command_on: "Coloque cada comando em uma linha separada" + are_you_missing_a: "Está faltando um '$1' depois de '$2'? " + your_parentheses_must_match: "Os parênteses devem corresponder." From 5d727faec65510ec1985fab49814952c58ba31d5 Mon Sep 17 00:00:00 2001 From: Bryukhanov Valentin Date: Mon, 28 Aug 2017 13:28:50 +0300 Subject: [PATCH 048/227] Update pt-BR.coffee --- app/locale/pt-BR.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index f0b1dd84523..02e72677819 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -652,7 +652,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " subscribe: premium_already_subscribed: "Você já se inscreveu como Premium!" subscribe_modal_title: "CodeCombat Premium" - comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" # {change} + comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" premium_pricing_prefix: "Seja Premium por apenas" premium_pricing_suffix: "e se torne um programador." premium: "Premium" # Make sure the following feature translations don't go onto two lines From 3892f7c52bb44cf526fc3d82e281d0e0035960ad Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Mon, 28 Aug 2017 12:31:51 -0700 Subject: [PATCH 049/227] Remove SDR open position from /update --- app/templates/about.jade | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/templates/about.jade b/app/templates/about.jade index 53eab67d251..8d84ab783d6 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -310,15 +310,6 @@ block content p.small Come use your extensive backend experience to ensure our servers always provide the answer, and drive backend engineering excellence across the team! a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/e53fba8b-132f-48c4-989d-fce6fbc3f23f" rel="external") span(data-i18n="about.learn_more") - .col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0 - .job-listing - h5 Sales Development Representative - .text-center - small.label - | San Francisco • Full-time - p.small Bring in new leads, talk to prospects, qualify good opportunities, and drive new business with the team. - a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/db88e6ce-8597-4461-bc62-85facea7749e" rel="external") - span(data-i18n="about.learn_more") .col-sm-6.col-md-5.col-lg-4 .job-listing h5(data-i18n="about.jobs_custom_title") From fe26a1cd1b1b8fe87105a53c4c94aab7ed2a0eed Mon Sep 17 00:00:00 2001 From: Cat Sync Date: Tue, 29 Aug 2017 16:11:10 -0700 Subject: [PATCH 050/227] Add icons for 'ogres' and 'humans' --- app/views/play/level/GameDevTrackView.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/play/level/GameDevTrackView.coffee b/app/views/play/level/GameDevTrackView.coffee index 168db6a5aab..7ee561c3dd5 100644 --- a/app/views/play/level/GameDevTrackView.coffee +++ b/app/views/play/level/GameDevTrackView.coffee @@ -68,4 +68,6 @@ iconObj = 'fire-spewer': '🔥' 'fire-trap': '💥' 'ogre': '😈' + 'ogres': '😈' + 'humans': '🙂' 'victory': '🎆' From 61b3baf85d0317eaa03a359a98f2d5e98ea2dadf Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Tue, 29 Aug 2017 16:21:52 -0700 Subject: [PATCH 051/227] Add Educational Specialist to /about#jobs --- app/templates/about.jade | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/templates/about.jade b/app/templates/about.jade index 8d84ab783d6..ab85fb58a86 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -311,6 +311,16 @@ block content a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/e53fba8b-132f-48c4-989d-fce6fbc3f23f" rel="external") span(data-i18n="about.learn_more") .col-sm-6.col-md-5.col-lg-4 + .job-listing + h5 Educational Specialist + .text-center + small.label San Francisco / Remote + .text-center + small.label Contractor + p.small Use your educational expertise to help deliver amazing new learning experiences to students! + a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/cd09610e-280b-4dad-85d6-3a7ad45bdfdb" rel="external") + span(data-i18n="about.learn_more") + .col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0 .job-listing h5(data-i18n="about.jobs_custom_title") p.small(data-i18n="about.jobs_custom_description") From e40b039261c3223cceb98748fd684ec11384fc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernanda=20de=20Ara=C3=BAjo=20Gomes=20Rodrigues?= Date: Wed, 30 Aug 2017 18:05:39 +0100 Subject: [PATCH 052/227] Update pt-BR.coffee --- app/locale/pt-BR.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 02e72677819..40051572b10 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -652,7 +652,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " subscribe: premium_already_subscribed: "Você já se inscreveu como Premium!" subscribe_modal_title: "CodeCombat Premium" - comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" + comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" premium_pricing_prefix: "Seja Premium por apenas" premium_pricing_suffix: "e se torne um programador." premium: "Premium" # Make sure the following feature translations don't go onto two lines From cf54459deccf2747e966517e39e7d00bcfc0aa4d Mon Sep 17 00:00:00 2001 From: Robin Yang Date: Wed, 30 Aug 2017 10:55:32 -0700 Subject: [PATCH 053/227] Add .md files for new AP CSP activities --- app/assets/markdown/apcsp-compression.md | 115 ++++++++++++++++++++ app/assets/markdown/apcsp-crowdsourcing.md | 46 ++++++++ app/assets/markdown/apcsp-search-sort.md | 69 ++++++++++++ app/assets/markdown/apcsp-simulation.md | 53 +++++++++ app/assets/markdown/apcsp-tech-usability.md | 26 +++++ 5 files changed, 309 insertions(+) create mode 100644 app/assets/markdown/apcsp-compression.md create mode 100644 app/assets/markdown/apcsp-crowdsourcing.md create mode 100644 app/assets/markdown/apcsp-search-sort.md create mode 100644 app/assets/markdown/apcsp-simulation.md create mode 100644 app/assets/markdown/apcsp-tech-usability.md diff --git a/app/assets/markdown/apcsp-compression.md b/app/assets/markdown/apcsp-compression.md new file mode 100644 index 00000000000..0809946d3e8 --- /dev/null +++ b/app/assets/markdown/apcsp-compression.md @@ -0,0 +1,115 @@ +##### Activity +# Lossy and Lossless compression + +Data - There are trade-offs when representing information as digital data. + +### Learning Objectives +- (LO) 3.3.1 Analyze how data representation, storage, security, and transmission of data involve computational manipulation of information. [P4] + +**Information for the instructor** + +Many decisions need to be made when storing or transmitting data digitally. These can affect the amount of storage space used, bandwidth needed, and security of the digital materials. + +This activity will demonstrate Lossy and Lossless compression techniques and how they can affect data. + +Both Lossless and Lossy compression techniques will reduce the size of the data, reducing the space needed to store it or the bandwidth needed to transmit the data. + +When using Lossless compression, all the original data is still available and the original data can be completely restored to its original condition. This is a preferred method for data that has specific information that cannot be lost, such as text files and spreadsheets. + +When using Lossy compression, the file size is reduced by removing information from the original. These files cannot be fully restored to their original condition. This is a preferred method for data where the information loss will not be harmful, such as in image, sound, and video files. + +## Lossy compression + +This is a close up of a map of Backwoods Forest, held by one of CodeCombat’s heroes, Anya. + +[image needed] + +The details of the map can be clearly seen. This image is not compressed at all and takes up 194KB or storage space. This also means it takes that much bandwidth to transmit. + +Here is the same image, but after is has been compressed 90%. Now it only takes 20KB of storage space and bandwidth. + +[image needed] + +Look at how the details have become blurred. This is one of the costs of Lossy compression. + + + + +## Lossless compression + +**Lossless compression** +How much wood could a woodchuck chuck + +If a woodchuck could chuck wood? + +As much wood as a woodchuck could chuck, + +If a woodchuck could chuck wood. +How much could a +If a could ? +As much as a could , +If a could . + + +144 characters total +By using and to replace “wood” and “chuck” we reduce the total characters to 88 characters, which is about 39% compression. +Because we know what the symbols represent, we can reconstruct the original tongue-twister with no loss of data. + +**Lossy Compression** + +Peter Piper picked a peck of pickled peppers. +Did Peter Piper pick a peck of pickled peppers? +If Peter Piper Picked a peck of pickled peppers, +Where's the peck of pickled peppers Peter Piper picked? + + + +Ptr Ppr pckd a pck of pckld ppprs. +Dd Ptr Ppr pck a pck of pckld ppprs? +If Ptr Ppr Pckd a pck of pckld ppprs, +Whr's th pck of pckld ppprs Ptr Ppr pckd? +195 characters +By removing all vowels except those that start words, we reduce this to 148 characters for a compression rate of 24.1% + +Ask your students if they think Lossless would be more efficient? +Break your students into groups and have them give it a try. + +Peter Piper picked a peck of pickled peppers. +Did Peter Piper pick a peck of pickled peppers? +If Peter Piper picked a peck of pickled peppers, +Where's the peck of pickled peppers Peter Piper picked? + +Give them a few minutes to write this in a compressed format by replacing common groups of letters with words. +Peter, Piper, pickled, and peppers are all common. +However, Peter & Piper only appear together, so one symbol could replace both words. +The same is true for pickled peppers. + +Could it be compressed even more? Pick and peck are also common words (though pick is often part of picked). + + +### Video Analysis +1. Have students find a high-resolution (4K) YouTube video and click settings to change the resolution from 2160p to 1080p then to 480p and finally to 144p. +2. Have them switch back and forth from 2160p to 144p. +3. Ask them to analyze the differences in video quality. +4. Ask them to analyze the storage needs for the video at 2160p vs 144p. + +Here are four high quality videos for use if your class is still broken into teams: +- Amazing 4K Video of Colorful Liquid in Space +- Hubble The Final Frontier - Official Final Film +- NASA | 4K Video: Thermonuclear Art – The Sun In Ultra HD 4K +- 4k Hawaii Drone Footage + +Ask them to analyze if streaming music is compressed using lossy or lossless compression. + + +### Discussion Questions: +- When would you use Lossy compression? +- When would you use Lossless compression? +- What are the trade-offs when representing information digitally? +- Why is compression when transmitting data important? +- Can students think of any examples where you, as students, use compression in your lives? + +*Hopefully the students will realize they use this when they text.* +- Brt = be right there +- Lol = laughing out loud +- Smh = shaking my head diff --git a/app/assets/markdown/apcsp-crowdsourcing.md b/app/assets/markdown/apcsp-crowdsourcing.md new file mode 100644 index 00000000000..913e1e2634d --- /dev/null +++ b/app/assets/markdown/apcsp-crowdsourcing.md @@ -0,0 +1,46 @@ +##### Activity +# Crowdsourcing + +### Learning Objectives: +- [LO 1.2.5] Analyze the correctness, usability, functionality, and suitability of computational artifacts. +- [LO 7.1.2] Explain how people participate in a problem-solving process that scales. [P4] + +## What kinds of collaboration does technology enable? + +Begin by introducing the concept of worldwide collaboration through technology. Ask for services where collaboration is a feature or even a central piece. Some examples that might be suggested to engender discussion: + +- Wikipedia, a collaborative encyclopedia project +- Waze, a service which aggregates and shares traffic data between users +- Microsoft Office and Google Docs real-time collaboration +- Ratings on sites like Amazon, Yelp, Etsy +- News aggregation and rating communities, such as Reddit +- Service which informally share resources, like AirBnB, Getaround +- Open source projects, including CodeCombat and Linux, often through GitHub +- Sharing computational resources, like Electric Sheep and SETI@Home +- Reddit Place, a project for creating a collaboratively generated image + +While these services provide great opportunities to collaborate on difficult problems, how these services enable collaboration is a problem in and of itself. The challenges can be technical, societal or psychological. + +## How do documents being edited at the same time coordinate their changes? +Discuss source of truth, that is usually a server serves as an arbiter that all other actors must defer to. Multiplayer games also use this. Also mention operational transform, which is a type of algorithm that is often used to coordinate changes on documents being edited in real time. + +AirBnB has renters and owners give each other reviews before showing each other those reviews, and then do not allow them to change their responses. Otherwise, one review might affect the other. + +## How do you sort reviews or votes? + +Some sites have “reviews of reviews” where it will say “x number of customers found this review helpful”. Then, how do you sort items based on reviews? You can’t, for example, simply sort based on the average review, otherwise an item with a single 5-star review will outrank an item with an average 4.5 rating with 500 reviews, even though the latter is more reliable. But you also want to give “new” items a chance. Reddit addresses this by having separate tabs for popular and new items, so users can decide what they’d rather sort for. + +Having discussed ways in which various services harness the group to solve problems, now is a good time to discuss what happens to these services when people act in bad faith. What’s the worst thing people could do to disrupt a collaborative system? What is the effect? + +- If people post false information on Wikipedia, not all information there is trusted, and the usefulness as a source of information is reduced. +- If people are paid to provide positive but false Amazon or AirBnB reviews, they cannot be trusted, and they are not reliable for deciding what to choose. +- If people use scripts to automatically give some piece of news or product unwarranted attention on Reddit, the group can be manipulated, or simply not able to affect the type of content they want to see. + +Having generated a list of collaborative projects or services, have students group up and pick some sort of collaboration and research either how it works or one of the challenges it faces, such as any of those listed above. Have each group present to the rest of the class their findings. + +### Discussion Questions: +- What problems do these collaborative services solve? +- How exactly do people participate in these collaborations? What individual actions are people doing, as opposed to the technology involved? +- How do these services manage and coordinate the often huge number of collaborators involved, some of whom are not acting in good faith? +- Which collaborative applications are improved or only possible with mobile devices? +- What are some examples of collaborative output being false or misleading? How can users guard themselves? diff --git a/app/assets/markdown/apcsp-search-sort.md b/app/assets/markdown/apcsp-search-sort.md new file mode 100644 index 00000000000..fcbee5c1963 --- /dev/null +++ b/app/assets/markdown/apcsp-search-sort.md @@ -0,0 +1,69 @@ +##### Activity +# Searching and Sorting + +### Learning Objectives +- [LO 4.2.1] Explain the difference between algorithms that run in a reasonable time and those that do not run in a reasonable time. [P1] +- [LO 4.2.4] Evaluate algorithms analytically and empirically for efficiency, correctness, and clarity. [P4] + +This unit takes a look at some classic algorithms that come up time and again: searching and sorting. These are good examples of algorithms that can be analyzed for effectiveness and performance. + +## Search Algorithms +The teacher will start by explaining how there are often many different solutions to problems, and part of the task of a programmer is coming up with and weighing the pros and cons of each solution, and also making sure they’ll work in all cases. One of the most common tasks computers have is taking a large body of data and finding things. In real life: + +When you sign into a service, the system looks up your information based on your username or email, which could be among thousands or millions of other users. + +Search engines are hugely complex systems which take arbitrary words and find relevant results, and can also filter for specific things like when creation date, tags or popularity. + +Sometimes results are fuzzy, or unique to the user. For example, Facebook, Pinterest, Netflix, Spotify, Amazon and other services will find content or items that you may find interesting based on things you’ve chosen before. + +In video games, computer players are often searching for the “best path” to take to get to a certain location. + +For this unit, the class will brainstorm, analyze, and perform a search algorithm using real-life dictionaries. Have students come up with possible steps for finding an arbitrary word within a dictionary. Each solution must be specific about what steps are taken, so “turn the page” or “open the book one third of the way in” as opposed to “flip through until you see the right letter”. For each solution, have students evaluate: + +Will it work? Will the correct answer (what page the word is on) always be found? +How quickly will it go? Evaluate based on the expected number of steps, and compared to other solutions. + +**Here are some example algorithms that may be discussed and compared:** + +- **Linear search**: Start at the first page and flip through until you find the word. +- **Linear search from either end**: if the word is before “N”, start at the beginning, otherwise start at the end. Then flip through each page until you find the word. +- **Random search**: Pick a random page. Check if the word is there. Repeat. (special note here, this will eventually work, but only if the word is in the dictionary, otherwise this algorithm could run forever) +- **Tabbed search**: Use the letter indicators on the side of the dictionary (or add tabs if there are none) to start from, then do linear search. +- **Binary search**: Open to the middle of the book. Determine which half of the book the word is in. Take that half, look at its center point, and repeat until you find the word. + +Be sure to talk about at least linear and binary searches. As an activity, give a few students dictionaries and have them “run” searches with some of the algorithms discussed. They can be raced with each other, either in real time, or one page turn at a time. It should be pretty clear that the binary search is the winner. + +Another thing to consider is other things that can be searched for. A verb that starts with “T”. An adjective with at least two “g’s”. What algorithms would work for these searches? It seems that the linear search is the most flexible search, even if it’s not the most efficient. + +Once this activity is done, segue to sorting algorithms by asking students what sorts of algorithms they can use to find words if the dictionary is not in order. Consider how many of the algorithms they considered would not work with a shuffled dictionary. Often it makes sense to take unorganized data and make it organized so that searches can be done efficiently, which leads to the other classic set of algorithms: + +## Sorting Algorithms +Here’s a common problem: You have a bunch of things in a list, but they’re not in order. This can make finding the one you want much harder, among other things. There are a lot of ways people use computers to sort information like this. Some are much faster than others. + +One simple but very slow example is Bubble Sort. This algorithm works by going through the list from left to right, comparing adjacent pairs of values. If the pair is out of order relative to each other, they get swapped; otherwise they’re left alone. If you do this N times for an N-long list, you get a sorted list! +Q: About how many comparisons does this algorithm make? (A: N^2 — N for each time you go through the list. If your list is 1000 elements, that means 1,000,000 comparisons!) + +If you try doing this yourself, you’ll see that it goes very slowly. Let’s compare it to a better sorting algorithm, Merge Sort. Merge sort is a recursive algorithm, meaning with each step of work it breaks the problem down into smaller sized problems and solves those instead. Here’s how it works: +If your list is just 1 element, do nothing! It’s already sorted. +If your list is more than 1 element, split the list in half, and Merge Sort each half. +Once the two halves are sorted, merge them back together by taking the lowest value off the bottom of each half until you’ve taken all of the items. +Q: About how many comparisons does this algorithm make? (A: N*log2(n) — if your list is 1000 elements, that’s just about 10,000 comparisons — 100x faster than Bubble Sort!) + +There are other ways we could sort a list that are much slower. Let’s take Bogo Sort as an example. In Bogo Sort, you first check if the list is sorted. If it isn’t, randomize the order. Repeat until the list is sorted. This will not finish in a reasonable amount of time. In fact, this could take an almost infinite amount of time. + +### Activity + +Line the students up in random order, and sort them by birthday. You can start with bubble sort to show that it’s quite slow, then start over and try merge sort. + +Most ways to sort lists work in a reasonable amount of time, even if they’re slower than others (with the exception of things like Bogo Sort). But for some problems, even the best algorithms are very, very slow. One classic example is the Traveling Salesman problem, where you must find the fastest path that travels through all of a set of points on a map, which can take more than 2^N steps for N points. So 1000 points would take a number of steps too large to type into this page! + +The way around that is to find algorithms that can find a good solution, but not necessarily the best solution. By loosening that requirement, we can get much faster results. These methods tend to involve “heuristic functions”, which approximate some part of the algorithm. + + + +### Discussion Questions: +- For two algorithms, how fast are they comparatively? How else can they be compared? +- For a given algorithm, will it always work? Even in the case where the thing being looked at isn’t in the collection? How can you be sure? + +### Extra: +Audio-Visualization of various sort algorithms: https://www.youtube.com/watch?v=kPRA0W1kECg diff --git a/app/assets/markdown/apcsp-simulation.md b/app/assets/markdown/apcsp-simulation.md new file mode 100644 index 00000000000..db7a3c2e228 --- /dev/null +++ b/app/assets/markdown/apcsp-simulation.md @@ -0,0 +1,53 @@ +##### Activity +# Simulation of Predator and Prey Populations + +### Learning Objectives +- [LO 2.3.1] Use models and simulations to represent phenomena. [P3] +- [LO 2.3.2] Use models and simulations to formulate, refine, and test hypotheses. [P3] + +## Predators and Prey + +In this activity the students will use a simulation of the relationship between predators and prey to formulate, test, and refine hypotheses. + +Explain to the students that computers can be used to model real life situations, such as the interaction between predators and prey in the wild. + +Instruct the students to open the CodeCombat level "Peasants and Munchkins": +https://codecombat.com/play/level/peasants-and-munchkins + +In this simulation, we've modeled the predators as Ogres and the prey as Peasants. The prey search for food (coins) while the predators search for the prey. + +**The students can control several variables that affect how the simulation plays out:** + +- Number of ogres and peasants at the start of the simulation. +- Ogre and peasant movement speed. +- Number of peasants an ogre needs to catch to spawn a new ogre. +- Number of coins a peasant needs to collect to spawn a new peasant. +- How far an ogre can see a peasant, or a peasant can see a coin. +- Number of seconds an ogre survives without catching a peasant. +- Number of seconds a peasant survives without collecting a coin. +- Number of seconds between coin spawns. +- Number of coins in each coin spawn. + +### Activity: + +Explain to the students: + +> The goal of the simulation is to change the variables in order to create a stable ecosystem where both the predators and prey survive in harmony. Both species depend on each other for survival - so if one disappears, the other usually does, too! + +Each student should begin by running the simulation with the default settings. It fails! Then, have each student go through the following steps: + +1. Have each student write down a Hypothesis, explaining how they will change one of the simulation variables, and make a prediction about how this change will affect the outcome. +2. Have the students run the simulation with the new, changed, variable. +3. Write down what the actual outcome was, and compare with the predicted outcome. +4. Go back to step 1, and repeat. + +The students should repeat these steps multiple times, each time recording a new hypothesis and new result, building on the previous result. + + +### Discussion Questions: +- Why are simulations useful for testing real life situations? +- How do simulations use abstractions? +- How does this level accurately model real life predator/prey behavior? +- What are some weaknesses of this model? How could it be improved? +- Does this model have too many, or too few, variables? +- What other real world situations could the students use computers to model and simulate? diff --git a/app/assets/markdown/apcsp-tech-usability.md b/app/assets/markdown/apcsp-tech-usability.md new file mode 100644 index 00000000000..1a7f17c6f47 --- /dev/null +++ b/app/assets/markdown/apcsp-tech-usability.md @@ -0,0 +1,26 @@ +##### Activity +# Creative Technology - Tech Usability Review + +## Learning Objectives: +- [LO 1.2.5] Analyze the correctness, usability, functionality, and suitability of computational artifacts. [P4] +- [LO 7.1.1] Explain how computing innovations affect communication, interaction, and cognition. [P4] + + +## What is usability? + +In this unit, students are learning to think about and view technology differently than they have before. While examining technology and the creativity behind it, they must also remember that a big factor of technology is its usability. The population of technology users includes people of all backgrounds, ages, and technological comfort levels. + +In 1990, Dr. Jakob Nielsen wrote his “10 Usability Heuristics for User Interface Design”. Though written nearly 30 years ago, the principles outlined in that article provide a baseline for the elements needed to create a usable software product. By reading the article and analyzing a website or app with the 10 heuristics, students will have the opportunity to look at software differently and to practice verbalizing their thoughts on the ways in which computing affects people and their actions. + +### What you need: +A link to the 10 Usability Heuristics for students to visit on their own. If students cannot access the link electronically, you can create handouts: https://www.nngroup.com/articles/ten-usability-heuristics/ + +Give the students two minutes to think of a website or app that they use frequently. Have them silently write down the site or app with one or two sentences saying why they like using it. Then point the students to the 10 Usability Heuristics. Provide about 10 minutes for the class to read the article, then give students the opportunity to ask clarification questions about the heuristics. Encourage the students to answer each other's questions. + +Once the students are all comfortable with the content in the article, they should return to the website or app they identified earlier and analyze it with the usability heuristics. Instruct the students to put their analysis in writing and to ensure that their analysis addresses all ten of the heuristics. Students should be sure to say how the site or app fulfills each heuristic. If it does not fulfill a heuristic, students should mention that and suggest a way in which they could fulfill it. + + +### Discussion Questions: +- Why are usability heuristics such as these important when designing websites and apps? +- Do you agree with the ten usability heuristics chosen here? Would you add others? Take any away? +- Should the heuristics change based on the device you’re using? The intent of the site or app? The cultural and social norms of its users? From 8a67450e2667dde8686f926d085e308fe98d9323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernanda=20de=20Ara=C3=BAjo=20Gomes=20Rodrigues?= Date: Wed, 30 Aug 2017 18:55:51 +0100 Subject: [PATCH 054/227] Update pt-BR.coffee --- app/locale/pt-BR.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 40051572b10..eb874d964c9 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -575,7 +575,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " ready_to_share: "Pronto para publicar seu projeto?" click_publish: "Clique em \"Publicar\" para que apareça na galeria da turma, depois confira o que seus colegas construíram! Você pode voltar e continuar trabalhando neste projeto. Qualquer outra alteração será salva automaticamente e compartilhada com seus colegas." already_published_prefix: "Suas mudanças foram publicadas na galeria da turma." - already_published_suffix: Continue experimentando e tornando este projeto ainda melhor, ou veja o que o resto da sua turma construiu! Suas mudanças serão automaticamente salvas e compartilhadas com seus colegas." + already_published_suffix: "Continue experimentando e tornando este projeto ainda melhor, ou veja o que o resto da sua turma construiu! Suas mudanças serão automaticamente salvas e compartilhadas com seus colegas." view_gallery: "Visualizar Galeria" project_published_noty: "Seu nível foi o publicado!" keep_editing: "Continue Editando" From 83e42999f0d6fe60774caa0bc42fa508680e0143 Mon Sep 17 00:00:00 2001 From: Robin Yang Date: Wed, 30 Aug 2017 11:52:33 -0700 Subject: [PATCH 055/227] Update activities and AP CS Principles Resource Page --- app/assets/markdown/apcsp-data-project.md | 33 ++++++++----------- app/assets/markdown/apcsp-tech-usability.md | 2 +- app/assets/markdown/apcsp-web-quiz.md | 27 +++++++++++++++ .../teachers/ap-cs-principles-view.jade | 30 +++++++++++------ 4 files changed, 62 insertions(+), 30 deletions(-) create mode 100644 app/assets/markdown/apcsp-web-quiz.md diff --git a/app/assets/markdown/apcsp-data-project.md b/app/assets/markdown/apcsp-data-project.md index 27c96971d06..b3d451e20b1 100644 --- a/app/assets/markdown/apcsp-data-project.md +++ b/app/assets/markdown/apcsp-data-project.md @@ -1,36 +1,31 @@ #### Activity # Data - Data Project -#### AP Computer Science Principles: Learning Objectives: +### Learning Objectives: -[LO 1.1.1] Apply a creative development process when creating computational artifacts. [P2] - -[LO 1.2.2] Create a computational artifact using computing tools and techniques to solve a problem. [P2] - -[LO 1.2.3] Create a new computational artifact by combining or modifying existing artifacts. [P2] - -[LO 1.2.4] Collaborate in the creation of computational artifacts. [P6] - -[LO 3.1.1] Find patterns and test hypotheses about digitally processed information to gain insight and knowledge. [P4] - -[LO 3.1.2] Collaborate when processing information to gain insight and knowledge. [P6] - -[LO 3.1.3] Explain the insight and knowledge gained from digitally processed data by using appropriate visualizations, notations, and precise language. [P5] - -[LO 3.2.1] Extract information from data to discover and explain connections or trends. [P1] +- [LO 1.1.1] Apply a creative development process when creating computational artifacts. [P2] +- [LO 1.2.2] Create a computational artifact using computing tools and techniques to solve a problem. [P2] +- [LO 1.2.3] Create a new computational artifact by combining or modifying existing artifacts. [P2] +- [LO 1.2.4] Collaborate in the creation of computational artifacts. [P6] +- [LO 3.1.1] Find patterns and test hypotheses about digitally processed information to gain insight and knowledge. [P4] +- [LO 3.1.2] Collaborate when processing information to gain insight and knowledge. [P6] +- [LO 3.1.3] Explain the insight and knowledge gained from digitally processed data by using appropriate visualizations, notations, and precise language. [P5] +- [LO 3.2.1] Extract information from data to discover and explain connections or trends. [P1] ### What is the Data Project? The data project is a multiple day in-class partner assignment. Students will work in pairs to investigate a dataset of interest. They will apply what they learned throughout the unit to create a website displaying information about the data. -What you need: +### What you need: - Microsoft Excel or Google Sheets - CodeCombat - Publicly available data, such as fivethirtyeight.com or Google Trends -Students will work with a partner to answer a question of interest. They will first make a hypothesis then use publicly available datasets to answer the question. The students will extract information from the data, create data visualizations, process the information, and make conclusions. Finally, the students will create a webpage on CodeCombat that shows their findings. LO 1.1.1[P2], LO 1.2.2[P2], LO 1.2.3[P2], LO 1.2.4[P6], LO 2.3.1[P3], LO 2.3.2[P3], LO 3.1.1[P4], LO 3.1.2[P6], LO 3.1.3[P5], LO 3.2.1[P1] +Students will work with a partner to answer a question of interest. They will first make a hypothesis then use publicly available datasets to answer the question. The students will extract information from the data, create data visualizations, process the information, and make conclusions. Finally, the students will create a webpage on CodeCombat that shows their findings. + +This project should take four class periods - one to plan the project and locate data, one to extract information and create visualizations, one to process the information and make conclusions, and one to create the webpage. -Discussion Questions: +### Discussion Questions: - How did you decide on the layout and visualizations for your website? How do your design decisions showcase the data? - How did your partner help you gain additional insight from the data? - How did your hypothesis compare to your findings? diff --git a/app/assets/markdown/apcsp-tech-usability.md b/app/assets/markdown/apcsp-tech-usability.md index 1a7f17c6f47..c501741cbc8 100644 --- a/app/assets/markdown/apcsp-tech-usability.md +++ b/app/assets/markdown/apcsp-tech-usability.md @@ -1,5 +1,5 @@ ##### Activity -# Creative Technology - Tech Usability Review +# Tech Usability Review ## Learning Objectives: - [LO 1.2.5] Analyze the correctness, usability, functionality, and suitability of computational artifacts. [P4] diff --git a/app/assets/markdown/apcsp-web-quiz.md b/app/assets/markdown/apcsp-web-quiz.md new file mode 100644 index 00000000000..a7cb24f09e8 --- /dev/null +++ b/app/assets/markdown/apcsp-web-quiz.md @@ -0,0 +1,27 @@ +##### Activity +# Programming - Web Quiz + +### Learning Objectives: +- [LO 2.2.1] Develop an abstraction when writing a program or creating other computational artifacts. [P2] +- [LO 2.2.2] Use multiple levels of abstraction to write programs. [P3] +- [LO 4.1.1] Develop an algorithm for implementation in a program. [P2] +- [LO 4.1.2] Express an algorithm in a language. [P5] +- [LO 5.1.2] Develop a correct program to solve problems. [P2] +- [LO 5.3.1] Use abstraction to manage complexity in programs. [P3] +- [LO 5.5.1] Employ appropriate mathematical and logical concepts in programming. [P1] + +## What is a Web Quiz? + +A web quiz is an online quiz with multiple questions that changes responses based on the user’s answers. Students will apply the material from this unit and prior ones in order to create such a quiz on CodeCombat. Each student will design, develop, and submit his or her own quiz about programming. + +### What you need: +Computers with access to CodeCombat. Each student should have his or her own computer. + +In this multi-day project, students will use JavaScript in conjunction with HTML and CSS to create a web-based quiz on CodeCombat. The quiz should be related to the course, but the students may choose exactly what it covers. They should also design the quiz themselves and be able to explain their design decisions. The students may use each other as resources if they get stuck and can also help each other test their quizzes. + +In addition to the quiz, students should submit a 1-2 page write up explaining their quiz, how it works, and how they implemented it. + +### Discussion Questions: +- How did you manage complexity in developing your quiz? +- How did you implement the logic in your quiz? +- What problems did you encounter along the way? How did you solve them? diff --git a/app/templates/teachers/ap-cs-principles-view.jade b/app/templates/teachers/ap-cs-principles-view.jade index d37337edcb6..55620cc72b4 100644 --- a/app/templates/teachers/ap-cs-principles-view.jade +++ b/app/templates/teachers/ap-cs-principles-view.jade @@ -22,7 +22,8 @@ block content br | Curricular Requirements: CR1a, CR1b, CR1d, CR2a, CR2g br - i Activities coming soon! + a(href="/teachers/resources/apcsp-tech-usability") + span Unit 1 Activity: Technology Usability Review li div Unit 2: Computational Thinking @@ -47,6 +48,9 @@ block content br a(href="/teachers/resources/apcsp-hitchhikers-guide") span Unit 3 Activity: Algorithms + br + a(href="/teachers/resources/apcsp-simulation") + span Unit 3 Activity: Simulation li div Unit 4: Programming @@ -59,7 +63,9 @@ block content br a(href="/teachers/resources/apcsp-getting-abstract") span Unit 4 Activity: Abstractions - + br + a(href="/teachers/resources/apcsp-search-sort") + span Unit 4 Activity: Searching & Sorting li div Unit 5: The Internet p @@ -82,10 +88,13 @@ block content | Curricular Requirements: CR1a, CR1b, CR1c, CR1d, CR1e, CR1f, CR2a, CR2b, CR2c, CR2g br a(href="/teachers/resources/apcsp-data-project") - span Unit 6 Activity: Introduction to Data + span Unit 6 Activity: Introduction to Data br a(href="/teachers/resources/apcsp-big-data") span Unit 6 Activity: Big Data + br + a(href="/teachers/resources/apcsp-compression") + span Unit 6 Activity: Lossy & Lossless Compression li div Unit 7: Personal & Global Impact @@ -98,13 +107,17 @@ block content br a(href="/teachers/resources/apcsp-personal-and-global-impact") span Unit 7 Activity: Personal & Global Impact - + br + a(href="/teachers/resources/apcsp-crowdsourcing") + span Unit 7 Activity: Crowdsourcing li div Unit 8: Performance Tasks p | Curricular Requirements: CR3, CR4 p - i Activities coming soon! + a(href="/teachers/resources/create-task-practice-1") + span Create Task Practice 1: Game Development 1 + | - Prepare students for the Create Task by building their own games and practicing key concepts. li div Unit 9: AP Review @@ -114,7 +127,8 @@ block content li div Unit 10: Post-AP p - i Coming soon! + a(href="/teachers/resources/apcsp-web-quiz") + span Unit 10 Activity: Web Quiz li a(href="/teachers/resources/pair-programming") @@ -124,8 +138,4 @@ block content a(href="/teachers/resources/gd1-5day") span(data-i18n="teacher.gd1_guide") p(data-i18n="teacher.gd1_guide_desc") - li - a(href="/teachers/resources/create-task-practice-1") - span Create Task Practice 1: Game Development 1 - p Prepare students for the Create Task by building their own games and practicing key concepts. From a94ff5ecd4752760ceac5e92a0fa7e30bbc5eb72 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 30 Aug 2017 11:54:28 -0700 Subject: [PATCH 056/227] Add images to compression activity --- .../resources/markdown/compression-grass.png | Bin 0 -> 3059 bytes .../markdown/compression-high-res.jpg | Bin 0 -> 198540 bytes .../markdown/compression-low-res.jpg | Bin 0 -> 20461 bytes .../resources/markdown/compression-wood-x.png | Bin 0 -> 9880 bytes app/assets/markdown/apcsp-compression.md | 98 ++++++++++++++---- .../teachers/markdown-resource-view.sass | 17 +++ 6 files changed, 94 insertions(+), 21 deletions(-) create mode 100755 app/assets/images/pages/teachers/resources/markdown/compression-grass.png create mode 100755 app/assets/images/pages/teachers/resources/markdown/compression-high-res.jpg create mode 100755 app/assets/images/pages/teachers/resources/markdown/compression-low-res.jpg create mode 100755 app/assets/images/pages/teachers/resources/markdown/compression-wood-x.png diff --git a/app/assets/images/pages/teachers/resources/markdown/compression-grass.png b/app/assets/images/pages/teachers/resources/markdown/compression-grass.png new file mode 100755 index 0000000000000000000000000000000000000000..826be13bfd9f6825ea92736786fab6e2718041bd GIT binary patch literal 3059 zcmd7U=_3=40|xM!Yp!fl?rU1kLgfgVnRCg_9LW*iNC>fEVr8^RZaK;kD!I?dea!JC zlPlMdC08ND$o1>@`u7j~UOdn9?s@$oTbLQ~a0+t*0017evA)&c_4sc~M_zNYa z#aiKvaE8`0t%LuwfgBg;&1Wy=&qUb|AQe~^xcg$BplBJ`lyryRf;%2VlGeY>CCg@{ zpwE||!Fo2T;9Ne3lX+zY(niMs1T$*w*I~#2Qq`; z1F+d?tuFzf38Kg^2J@kzEW@hld5#O&gX#hPPB9WH8%cbf<$cP7%Vdf*%C(g%L$W$K zXKPTSJ(dZBlFU+d%>dp#tDOH7HlW$@o*5hMYFB7N3WAS6Biv>YW(ABTz{9Ljt#uzQ zo69*b8yWUZhaENRR@q7Zve{g8V6Eaq2Axs9si$A_MCu{1suT%l?SKmg1fm!2ygBpI zT#ZEbk1Sdy$>*Ak?GYT!fbn3gEi|PIu94;!2x>5cSNOGJLJk|qnHsR4S#kDD2B0m} zvPZN5g+&>1m*O9wzoffr{nq438q=Mf9F+8>5tyA=v@iM%9_gDvqlWK}i3c^QWADKi zO;&t(ODx;JBrm;s!x!9!zq4eb*7^~rq5BcjohCi-aJn4a_!6-jyV_PiUo)R04V zHqGXUMRrrO+}lYt?Sd_?(N>ShEOkIz`VoDf>8+4=S|+6WLr%mO!j_?o<5k^M%~=e~ z=?hI?i!fUfCH6-S@ElMVNzfVolk3;A8FLPEbIZN`J*N!=o`wi^?d<1EpENHxCfPu=zx?9e zyGOXTR7Bd?d%<_G_d)e#f_9fWL;n;3BUgyOlRKF38$R{&_HwH={8HpSZ!`#!I zQu+ed`XpkE^ufn9(~6iM?8K35rqQdQVQyFHYo`2OspK0Bv9kzolhW$0*i{>@+i7)2 z12q_vB4UVKS@38*cS;gs^B=RL+jm$~A5oCumY@{tnIeL{IeV$>I@`aNS8p(>$)=!RhlW3p+Tmes!{&I;NQ?aUG&ZG%fz#s%2t@y0Eyl z`%}X4<@JRmw{9L7UH@I1FL|*aa9)#0d;01GBnUzMfx6bZM@;nBmk>K6C-dfV3auTU zH!o+!q>VXXdcSHums&WNL|8 za+!9cEF_7(>6plJD?g1(iP7fpsS8SPjpcIB;47f9s^Ts~&I0W?rv&hYGc>=psb_56 z0z{Hx?QLF#&i6&;#39l*J&Bm4%mL>^kx9XC)Jx(HEJM9wT@*48IS_9GpV z9Byy1w(xj$EMQ zzTh0|K^HaIWWmI)_ymTrn2JhbQ7$GcLt zX*!oCLh|HoQrsI7HE;OEX8DB)flZ)_@jgz|ep-B}l1jq(+%xW<-^OkK-hTc({Jy1G zjdzcf$7jnh6R~$BD}@;Q2pSPjnryzAtoFLcNC-#Xo?)rhsN_YQ`X?;d@nj5&ov84M zj(^B{Sd_!~bs*DTFumWld0G!rm zKlMHAMq5=9m(PG(${8AZ*|}>lFKg9zFMldnen4w}A03n}ur*hZBv7=uvxUR=web2} z8y~)(R8u#m$M$I@q$)bC-P5`>#!WF$<;jU^s+7lqLXO)kp~WjsRfdtjqBtK~U;TY} z-Bb$W7M>)bB`V!x4$dHikzLb!6F3TVgC-_V6G0;_as#s=mnM!~-D%XUT^Wq=ny979 zs!&YsDkYs;U5~!3k%VA;eP!^mM_!G2C2=3(p%}hCuxoe$r28kU@QjPcfdfC2k;GU< zsi!lL@(dAjm81WaNQ5vv~GBg&k5#&CLilIJdJzIvG5qrtQFaNgRBG`{(Z`R`DZcbOy$4)5ZoY9P^Y1( z3Um*F{bn>crN=c1*s8nOrndMl=Pi4^t<=A#zMUDMR{5gql2CBjMMD&#{-b5c)r-0b z1|Z(GM#Zkix%5;*(d2kH|GzDBJd=yYC0hmT;-AX_)od#L0M#=}bKA_zN)kuq`(?@< zrXFAh)2n;8cQ=vJtR58PaB0)Kd)mZ|+KRk&T3U`k`RnYMiT+2mv%O!t{#>Nh&(DN4 z{Z;_9@oHid!}uU{T=NG6gDAP9j&fD)bM0EI^p@IT(Miks&_>;Bri+Ab-rj78+3a?k zkgY$ASRZ1XI^reTO8^K?z8^NkeI&nPmQK8qgU$`bEEztNCGQ~WH4Qmq2$MlFA(M`C zNRjKsHz~BkC;xfT9#T~;vA13RPyzR@Y8?Kg2MV2-f`abZU0jI1>;XYn|lo;-dxXfogzoKV3VC4iO+qnA`YGfB^P zd1-^TvZ6}pP3vRE1P>=W)x!!<9}O*+26$hIHQlJ|T<HFw5Koya;bG$cZUtj4*kEkJPpiO2_ct?^gg^QX2-L0bU{25};uS&F_J zZuf&}A*1(75xODJTjD|xM1uq02>Me2U@|*fxc5qC&C)jg%}V!T^{O=6R_JC;&Hh$i z^A8$zzUsl|qsfM=R6*@v4cAkib{(cqPLP&s39*UP00&jRq^r?MMylEvsAh*4JFKN= z!6x&xGI0N)#}(!N#`6)&KS|7*Debu_EDSjqw_iCBcKrF^FmrB*+E}J-zGI^1|3H3C zWajjzo#)-2>_T^2j!X|l7n0gv8hecq|JS;)kZqTVVPGYP5F+p|<^gB}GyQUu>y!Tg D2-vqS literal 0 HcmV?d00001 diff --git a/app/assets/images/pages/teachers/resources/markdown/compression-high-res.jpg b/app/assets/images/pages/teachers/resources/markdown/compression-high-res.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b336ffc0e068afac01597631be41ccf71fe259f4 GIT binary patch literal 198540 zcmeFZWmsIz(k?u>1h?QJxVyVsaCd?`GYqalf?MzeCundB?!h&WQH?0N6kK7D3KakT+z+XRd#o#ms@G7Gx^cKo_91H4sE5AwkB@%En1Xt8L?G4s>^> z13*6V@UwFBv-6R$ar3is@Uw9M05I85|B^2o`mZry0ogEr)uBcpV>}mlD40KK;s0G1 zDDr>l0!9Dtx4h>%tx3;;9~3^XhhBHW8-vqO}HP{U%vy@tnP6H`UNCTDjFh|8hiH0d12 z!KLI7S2G32SFLk72Yx<y| zDMi@zk6ZG5(=E;mAAyXPZ@}!OW(Os041)`UFZLPNn-j%DDE3MF#&i2`kO)_hW6t~h zS=B4zM+jV(NlMo=bn_Z^Gqs5j6H!=NW94U#8(zE#S?V>xPR6%%ZoG9VJqf%_8$rfD zzT}(L;87e4t3)xojgjqJRK{95sKduzv1wUtVy+(xEfJe0FghO(7`OSh{I$8nc^Ybl zmq%*iHgHf;$`LhzqMqynKv#a@vZh%6M2C8Fr4ztjBy&ChjQY#VRxb3=BmUu=b+@iueo-jx-&VS4d#b3 z1mveMy-O=gaDM?(uWnVCjAm6m6o59o2<0jf3+o#r!V;ldsB227hOwHHmL#Hi9QqV+ zsN-9ceXq;t_S!TbhrkO}9E-zMcnE1J_U@lSqWj2jFG!aWS68oRnz!N4sHaTo>P2$% zOh!d)!i9W4{=CXKROzLbp>TV(kOW`jU9>Lg=`!V@r{%vyP_W#`Z=Fi%tl#&sXUL#B z*`$gdt&day9pyXKxrxiq)}9t@EWhZB4;*!ev&%|^%mw#SQ!^-w`u&5sJ$$hY=or#G zg}jAdrycIhk>!r;1eGb!6AK4>+eTjy3oEhYs!2UnN*zcI0ff2MY2a#Mk*2;p&t!fNJKL9XJ_xwxv3+BsXGZz9w|iaQL=NDleoJ!DS^6>Rf$>^KF16XA>z=FdQ|7E<(^MW<{H_-zCuY}!T7Ko8+7ucoHUC9xVGlWQn(Uj+cWkLjlJp=9Vj=y0Gz_UR7(kk zP0KVtzTAr)E48D<))h;bIZ<`K?;Wp>v0_J432Nlqqpw_pi<_s6MHjhH6O!|%0PTIz6zwB!68 zrp;OIW~R!pfj#84^H2zR>=_S^SkW@|rvfxZeikYDBa+bN*>$nvYp&tO!RA`77=YxY zpK_P+luw}?xT?q56iX*&f~K^v8+d-A$AavnSeFkyX2MHzol67qO}e-)!4plA-Zax> zWclH87$B5Bh7-B0Z0sPch)pb5$DrIJm?bnjW1PM@?JB$3LT_3h#V-ByqDmm^Es?jP z#)c65n}UmLBy4jpP+U|Nu28fY;j2VdhF({;odVTC3)Li(>zL2AKS(!yg=U!(@mW?lUIPp=w}rpfmb%0T-W^ZI`!ofIUi>1Ng&5r*~|0g zSL#tO!kMT}(T3uVPE=i5X=#}9Hy6UC29yS~U<9#!oGUCcIQk@E3D&fcf^ zLjTkrA@#=(hH!xz1J0;-c~hNu29XjhZaNNrify;Ia{Ni}XTphOw|lt-^PpB@_geVM z?UGdz|N-SPJH_WG4pBCLTDN-_QLREA6_+u9As)%II8p&O5sL%%*Pho z_Sqkwmv{%gCW6DwRp?*Y?LQ>tIQdC^mTyh`((2B!3>>eNOD^Zm_Y>~nr%Pz5Q{qjccfd8{mPMeVyI@4XgB%4kC+%@8Tn4WuMyIm;OK#bET|)s1qU-ZOoA zxfuI|fJMI~CKWuv(lS{bgrrYKKR+v5z(J-+zC3u&=vB>GImNMBzLOK*=`X;+Oe)0{ zy+-y>Vx0;27eGT~>_$aaxbftRT0Sy$j!Mh@q_>^Y`Y*ucA@I6KKFJ##Obv~>{p!Fi zYjkx^tsw4TKrP>6+citPgl0zQDrf48vi2OHmen|cKG7CA`ZxRTd}b5@$s>+va_(WGeIbroIM>~Ogxwzohkm}AZg)j2DSmY z*Z>{Lo;jMB0$p8%$RU#cp@IYGZ?^vAXS98g1L!{$$v)-G`F$z{BKAV75U{Hon1^E%`D_3g~%a_Fx%Le^K)~vTX6F5 zaxih4@NzO)m~-+lnQ-%QGI5&ma$2(Uv9q#roBfsx(q9s2=K74_bN@d)*BodD;qf;} z5Er!MF*h;gVB#_}Gi739v*2Me<>R$rGBvZ{VdpeAGvzSh`iq+~*ak9rOzi)i>$6nm z5RT^NTpZ?RJeEwX91y8kxj8wQcrCbjnRrbtILz4DdALk1P07j3&G;>WUxf-J1a$^Ipd1kfG`Rs@v9qjDqx_cjXk8nSxrWqOioIIn~jefViRVz zXV-_w0nu01#u;K~&p#)Vx`or9HG3Pf-yX_uV)i^SgviaFJ;K7A{Ljla{{zndokoAK zb+@*FF#Qj1@&}nS(9*@-1Z*K@1+mG0fh_J@L%iZKj(iC_y>W15cmgye-QWw zf&YgP_}7lk!V&Ul;SSlaJ!hCbCjtI@f&TsB`3U`2fq{XAByGXKKtn%QV4n*lp$iTc z7V-xR`#VkT4-SxC(6BHNs{iBis|%8*1~mc;NgTucSDG3LWGjvUVf}AAatL!sJ{=Sy z5+s|91d<*G4aqe7w{}RP+H*Uk`Oow*3>XYZlG$CHt6`F5w2bD}w=!AY1NF}e{7`*g zR;i3j&aWnhWqrgI=&@ltvOiL@M}3xK&l8IarwET@kE88}rId{5?p32wleK`Z%(cQ@ zV-!vk3Z6n#6bp}Mb7o8Xq+uSFT71K!@uW@V;P^;Yo89@g%$GSzs zq+_N{JqydJFx|693U?R7!DwQnV=mj z+T0eGVhN4L^qq8*7j?eTI-etm-B#@AtA-UdEVwLv zBUr2g_Rbovs`rM$GG8QoH;@5b`GwhO-bfmec{3tQH~St=x*=-P*`caAx| zC5{`B%$zTy^quVoZRe3tLtaGx0`TdsUR)9%A>wbT6fa~Of_Iw~d18;5=RRe2mh0!c z;gv=(y|m)dj9yfF6Bn(X=$#d)c*118-%uhvCPSY?^?DL3Dr_8zt$-a`f{Z#r@~r7c zQ5Aj2WL<(%SBA8P{p%$Iw+Y~J9e8h!odKmq8Sjjdyn#}#7NyL}MXW9UBkqbvWWyyC zF2Xo&4ejLz%n-LFnEaPayp+diRJh%r5-9XL{PxT>yPdS7#i%z}tPqfPWNP-!+>;QVd^m04FkDRgye1 zRk5cqQQM0N6Ei*uxh#X`)$1s1dj%VLC*AE`qnhIQBME6ZJVV{sT#OgRmAD{OWX1MovdH)&&Ja`&3p!#ZH{8f0>2pfY6hG^jdQJ6vMr z2!uoNKg-p;&UJcG);UbyZdnxCAt)!F+SUvXr1L!AJS%(}elGBSR4+y6@oDra&=D&fbrdc?lNC zUK#v&00ts-ftZO{#Uncv{Ie-n!DDUD??&uZS6|jAa-B7q0==%wi|%muR(dR(T@02r z<-|CLStr5+NYbfI2x&XsvfhqQBAuFKV19(h5p`o6KJMy{c`!;V&mtFI$gSp|E)o(Nz^s z`=u)CmKa)|FW#9~$7!U`B(3I+<_lVJX&D^oMPSVg z3;ji)D(eRY$Z{C~RbGpMZysa_g8<+oU=Hwy8XrH!0l?$K0Fn%&bBGC2H+^L+o0w_F zT{H&ka0eYj);t`HGdIr5>)VIC$``<9i}-H=B;p@3a>@CpQ-1-9iAZ(Zn2jSI>!*L{ zEvK}*aLk_`)7y~w$5D36z9)PeZ-b?PsSvPX*yf(%cK6QUl4ubyC1!4#vfJEPCT|s4tuC;`bz2K1eek+_Ws>UD+D71TML%=z3P3rRtP;v2-`eVEU_ za4>Wz0CQ9^Upy)dQN99U-}mJ!jRUU{ZXE%It3;jcwP^>3Iy(ntLaB0E)5?{@>e;2; zXhZolqyYba-ET1PG3J}ogozXY|8YW*(qqvkZG)-z+j9DtxA?TzjTuA1Zl4d^_^H+)!_`U! zwnb-ewxtC7V6w$0!5@po?nXVvQ;igraq)*pthBAm7x5XpN%;=egLG^)(cE;nCK?gM zfN61pskvPZItHDc_JoLX#fO?{okHbIhUMmHB9f+_2|LP9?SQ-?%w|PB1uDUdn2QSE{nW>+gacdz#D@OAQGm*) z(w8;Y$gPsC+WKOUJrLm9JxY%_0D1H-`333`$-3Y>isglz&ic*>y}56 z-gTO?NM{K?9C2*+5Ae^`R<8KUIXW`{rg>_ku5roZZuul!GhLPHiveu^%v>LJz_024zuGo zhEnfJ_B4W>-3Gjk#Z6LCIj%&~+8gs`U6fVKxm&gGSCndIz|qT2Oh8hWEna2do+rBQ zqTP(`GOflojv1@}Zaxqe1fclj3b76-0r75$gl(VzH0h(whRL3cj z%{js4+y}`~l0glV3=4fGrn%ov3!-d$Z-BeE2pD-ImPAHfX*GN1-pmEbQnX+67x#Hg z=dT)9KCXHF0+{YGwQr8}^OLU;qYfaDZ4n3gYmh>BtP#U}&{4v#b}HNDo~NEklVTw{ zGS*Qc!$2gLN;DT!SA?^n4OSx?heoBu{pFcvrUa%n4S|I$6`4%g14>O8jafooz|zbYJoRsuy@^jT%ZiKtWA zUR~X)sOXD{S$Zn@d>Z-i4CODy!v5A1hO!feFahsBWG61-Y0xj|A9YpY#|9D@XUx{v z3^{GeZF@~v96`YrevXU7fZdL;8MJq)n|tp5H%aMfuvU~ z;aj!eppQpgW~#e0^f|}DYZdH8?4T|0+B>&tRhPeXz_q2)FgjW|dPUvy)q)C}LI9A= zm1+ci6|=@4w!`kJatiEut&m3#b^<5y0p3B~+jW5Z*okw7Ad?-8_I`^P(?F>cF4sh{HM~Y4oD?s&hEa-FNRafoeopp9Oyxq4sX9IK=&Xs}9x>_Qm#$`o zs`M5YLXC)Fx6ts8m*&$B7!&(?;FctLA^7&9^`i!_q=X#%oB7_^svGp|=C22?z4P?t zb+b8(O7AtbsdiC(Q{KBSOJs1bf;YY7-4#CJ{O4V^Dw8?j1!6Ug-tTxSu+~>xF2lg(9TKA{ zF+ONS70HeUYx(#Er50VV&AJLI79uDVyJUo1uq?T?&7EikCzpbQt0vv*2&rmUtQ7g1 zoedNoVPbw9Jl5-Go9Ujkaz3F33De=o=1nL{A;MY<+9yqk`j|WzzJ< z)!Lh3Vc-^TH$nGs5y?(1R!?k(!%8bq=Yk-CP5gR-gsndVCIo^7C{&RTJDwTpJ3U$_ z2#hOWb^&xLa2dUa4bllbm%#!Ap&X_3^8G zoaA^T*-`o;5;XA%#U*naGJrG;B6MC%ilH5PcD4&YF`|D3104fhxDedN0DpCuy|t$0 z3?GwlXus!l1-43yCWnA);tv5ufriC-XOf)R9AzTYdhGG~wbg9Tq4?u7N119IORp2P zr>`Y-of1HEI^UGnnfJ<>YRx~$%O)@QZW!j(?|u~6O+A*|HLnq^@2dQCyJrzNWy$`~ zF`78seW^(pdizts&Y6jIuP~<-Y@bVPx^?J|D;TWV#1*+|P{;ZS%YNhjlhTCJX5)bc zU(61zV}diN>7`jw4E_-@D#SnH_~ClD6n4>}fFHZ)vJ2o! zk)tb-{gyWhbL$}D@h4vu#v01Qa|?{H$U%W)`L&YQCSWP$ICqv zcNOstFG%gKdD`3yCi$K=KF$lree>IyQkKo{)sGGLE{u5lP8PBk(K@<=t)|~1wxXCH zZ+W%C;AgX6*`n;?*`1_VP~&KdhjtQhB_h=^;?ZNoH+P$bc$pULGwjCQf9YORHOF#U zcRN#Gewq7WdY*vxn{3G{^76sg#F9GNH1#(c!Ad|<_1o?%W-C%Pu7M>foxDE4c1-pX z(p1mHx!Zl1uS@zgS;sR(QMvldr94&JHO#qEOZNMW2Gb=?ca~p}w8cVtXX8rZ=Jr$L zql3R6?0vrOPK@;C&qL1SHzxt+8$t}?gkR2s1`o_OaU}*bzD-L5ndc*xmnUnP#S!XS zvDNOcFKkQdgpm-bf#?T9QMg;vl~5d49JUS*uBMMN3dEX!xS`FmFDJ#>Oxu_F?7k5x zUK~{i=AFK*mY1xr(=dyemQHn6K8pL8WZX|-8PT`*vB&vR9vsRb;g|QL&Kq+)-QI49 zrCb@>_wDnphrO+VsrkY<+X>IeuDR0YMqd2`TnFk^_b95{=?xI zUU*$p$lA8@OwJpnh54#q)Ja_Ogv%UX^#(Gzt3G0{*2I1i&RIQ}H(;wQ4CE^Mmfnuc;w$ zk;6(4a*dRWBtN}+e-)bepq+mTzIpWCF&*R{=?($<3X{*RYqGN*E@x#*xU{%LCpK%A zehU8>#wevEg-ZO9uU6}8kp0%j2r*5rJOP{lgWLj#F2kA2h>bm35^Sd#&ATaQitv4D z)Ib*(0fLgq1gP>wt;>hQ8xi|n;hv%X)^Qd|6VlucZ&IeD3*}t_pNrw-yWw4{sc?9z zh;vdC=Woki`Y_Wj4xRey%AepdhLl`1wtcNto*3u?*i(8f_z5JTeAd@ zNajw;*$}k=Shc-|4w@Hq z2Xk-Aj*j^4428P4ya5+Fyc}S=*BKGQlCCjav$)p1b6jR+-bxB(r~Gho0u=g7Jwz?5 zEPK4~8ibv%ae~2Xd$8I0bb;(=!M3fx03W`tR_X<8e?e5J*;h6Y@*M`OpRtb zN5u8@0S?3w!mRe)nT;#T=A?n;T~Bhp7^&T0PhrJf(s{jOg_?eW zR(Sn{;GFqvfH)H6!u|Zbz8(3(JzUa@615}0Mb*;MI?*26r3T9PI*M3Q#l4jYvPSRO zm1FG=3SURsmvPHaTNg~@WMHO5HhsS$B(0BR0+JlyZ{<6cjA@3x3BA~UglAyp`r!u5 zeS%q_X0PKS(H4ku`e~;ydm*U+z_<0LF{^MjiUu#b)Oe_LT4n8aosMKCKsn!9 z!z*plYd&hhF@XS;^3&XctQF3vO+v6SJd z*~xc<7CU7{Gm5n+k2QPOHOi9&zG62|61lQ}Qlufg{5s!q7o~c}JF;YH!faSmRCXGF z?(RFL?y=}Hi(2^Rl{8JptunC%ifC$ZJZLDrg7I@?ra)BlMs7%Ni}(wF^KWlI{00Eg zKVe{W@|97{jI}{wtzUl7>C>6pPqba&Rx#=&`_cDB2lKa+zzxke zu9U!RcmMzc10ODF0oN$9)XZD3lxKtn&)#|xzwTUNi!;rCAcm_opZAQp_!Llrm9l{9 zzU=C4b7z>QMPy+#H?!sqG!9ToJU^@$v#@YeH(xJZ(`-KM37yu~aZbeHCKA=9 zVaAgqfBy(?PWu&DPcNj0{Ykt5NfKExO#nep_sZ7ec3RU4C7N+_qm`L3*{t^&b6rhmQRn|3+P%uGBFxdy$1C2s-cV|Qv6)T$40Q)9-*&!#^#}OIc0Xio7HA3K_4`sy+WIPnhn-bp+NN38 zjaQ{38_-B8LnZaUX6ihw&LUix)dAw6x&k$@|u_5uNz7QgRfTyXc&f4LwY^!?KO8t zCCpmaz2IM^bUph8vGZ?_;%6#px>9=RO*U3-n|Ul5r(|RF4yf&DxtJ=t<8={?4NEo5 zff~n`Li++rA$IucC{$Q*!$NTU$erew7VctG5~V)N?L6Q~tRjiEmiId45?%MId)Upo zZVEpF3v~WUEHdtB&pr0yE`?y83?TFZz2VW-^_6UGs_zNjr$QvREs5+oqRy{j<8p~c zR-TdDGNRv_Rk~BFd|fq|ccV(cI$Kp;RYQ&4R2jNC7mp3LTH5Kx*8+#hMu#J*S!`iC zV&tD}X219J?RWJRz&6Y&O2}W2!FyW8=^w9px!WD9YTg5*J;zk1I6z!NStELFZY%ty z$^!e3v0~FFLOkVH`uRk|+AQxcGW&-2w5&gWB@N_L&Q=}UrW6oCwaK{$2lYKn%%`Kw zx}FJSgl0O;PY?rGlnym)6@q;~8*`U2tn zXU9WDCaI$jNDgF4ez&Dx?bY%NplVXXht>j0>dF}V`jvEl6SY26N}2G1Gy!RBpW`vD zHp;Jfh18TRRr?saxAq)UY{rK+D zhsD>HOFaUcvY^YHGN6Mzq{uVB5HfK(ypRtc3W6uOKv7SzSyt zs{5ML!~OF&PM_l*zt;nj5MxrlT0%Bke~45p&Y%+1N`+))gMS;Qa_5%hbL_r3o=KH?am(%aEuDNO&KE>2; zB{|=YeikPX?l)TfVmOmqYrC^KmF95jhuYVHfL81M773-p>k7N$yU95%;Jv`;)1q3fSG$8ESyKs84xIH zsKr!pX=-utessHGx-DaOQpx=Qn5ln~RvlF?*@YQPr03>^-gr&&!gHoEX}Nm1;^P|Y ziolRpX34}&leW~NRVuRx&X!L%VqP;qirFT^9#aBDA%I*b?amo=MG;sXlAZl@I zDzQBfQBJLNgag^Uv_d#r5QKS7OHVI|pBY4&dHqvOzwpjW=_lKClPm{J@}Va;PLoW) zT%W=Nc6jA|d1}_0Arr+eX$G-?yl_~*^XNnFD9c`t>vA}|tGz&boc^UBC(KHd$Y%_X zpXkfCD8Y9|VLyChT0;x_8%6jh?~N`*mt7MYA3~GOFIAIFcMWcEKVGy50byiUAiv0^ zHD;tAoObCfb1AHz(0@BRJi?)WoOGNr2D$r0$5qPy1r-KGmzC;fq?GE z$hT2%boP##mTOY4dpB(xwV{(MFM$GXAiG^lpZ(;mVu%2`x~aEFj?I}{TCfuLWe^@T-Rprc8YtVCe4t%-DCI;3mk{xO|cig=ep|2Zi01x z;xXv!YRlucL$E2VF-b z-k@T9#e4rqgvb9}Yq3u}Dyea3ISxIt1WD2SnA0!x>*PK2#<$AF%a71hyDTDS)=i*o zb`CSP%7cYg!8#sAn1tSg+tzmtT%?y$=)8vEQlsa@W&(kV884Bb{GTC|q;1h9otX4a zE{mS^yx-zI^&&egvGj`}PaV{Mt;b0}6!vsOutXEU%{Q+N5OcctU3 z6?DC&>b!L!%qf)~Pvhm5{3KNsX<8Z>zWY=sl3K4b&X5t;aZb~);%k#@l56HNZFj}D zBEwF=wa4GQJK0jYns2K)8qBh*lqPtmT%}YVD583aY@9G);YnQX95<}ZIE|&UPKHK&vN+mx)^uRwzUN{PXfsa-+AVIOT z0DK3eZ;`4$)oEt)kBzQ8_Wo>fK^zaWcT0gey?5k$6@Ho6?S>Qp$QDyOr?~j`IhSX& zcl5znFlx@$%&;~U{KU5_EW;KZI`G>d2-6O)R#AY3JDK0mG5UL_PpgCw3OeJ;+g3XA zx1u*(xm6i#Ha>kH21meK=(>TG$fuppc}XQ+NA9K^ z`Hp5p&sy;j*EzrAm>=+MMc6h6(pTAQC2sMxS`76ootCtMSL-Jv8>`$reV)IfZ`iW#mH9m}~S+4y<{i zB-5lGc(f`dL{D$&rfWj~v@SMCRI6xYi}5`7H*rrXZ5eE1p&`EeiGrXZ+A#i^QE3RZ zHzRuLfVb5#D|ULNXw`+IGzQ4f9;fb^#Z!Co_zUo5gF|McetGo`W^{RhZDV{9lR&ND zk9qsd2xSrNG;5EK28PzEzQob5h`!993HUk_)wHR$$0ReGB@J2ffD?&hoM#AEjq?`s z&bT+b2;~zr%~m)LXqK|RZ%6n4c+3=Oxszl3`KF2!@zQUh=OzP8l5K)i5GYDkZP4`7 z<5J`Mg_BdvWU#)-8wN(TdMEiW#7*2-R|pxNuY*dT0VG}7{RI%^?ZI@7)9vqpYzFFP z#;IZ(>_BdP>Kp&Xfhzp>u1hnZMaz4SjmD2U;c&aTpn5|M2O<-STOR zEZ^o$(Y4Al#_oH{klTGo>vKL|&Gp5r;5s9<9$XdPjPw7@ul9A@m~QWKfj@(VsHok{ z#naE2V&k|k^z(Y*?#_nMaT7g>N>ju zh6iF=osXUGrk9E1ONNBQ?~m zSMLpAmbS0`*-!D|#9^zTUW@2i3`jta{)@xiN(oiyr6xK8k$!H^mAykn3_lCW;(HNyAtaUE$AOPu&$F*VHnd-tiCULa9H5X^eRyG#A@7_ee+ku7_IqVdvB+2>`_o zs#_xkB4IZwu65%q3!Y_`2Mnj_w$=P9b_A3e$EBrX!fC2|!mmbx-a-V1v7hlh{JOqf zMhC_{o7aplKWwGpoj+@{UIw+jpE-0Ba>TDh0jyC6c3=naOS?pUR}7$em9&h*#bmKE zv~%$?UIhh#vLy6_v!7R&8-HiQF;BW*%tL^!Eia3NIzn#dq))FiLYx+Tol)fsBsnC? z?I&@%zbxPt-0z1ahyVaM#tYx&@h9QI(kzUNb{;Pd!v!18DccAyN%hJ+^-bnm;`DpCk~4B>s}?u9J)y883(rv~RNrg{Du+AFx$7 z=)N?JOZbxRAnHu(^#&_sXwt}aTV1C?@cGdMUfXIh<;XtT>?P-y*R&hnDAJeq$NWFb zqZ=-cLk-I=(F$S8!u|P4kU;53Ygsr01hd36{G<#EnOED+oQ!fL{cG98xN*p~f=pF+ zMqk}vh})H{(vI*R4Wm;CJ*ijf=ZsVtD$YnT_q>et4;r5ydsUMLaEG#=G5VuGmFH6t zH(zUOrj7UBr>Gxl>$ztVFL|gI7`Z)h@o0{4M$_O0#qA{!id0rHGt^OU?%p}pZ*3~0 zaH|Hsg~DEQRc?HhowcLA2UH%fnS4-A@oAo3bE;gu6ozA(@kzJ4YQ=3TYp*W3HkQ-e zcTCzAlj)GfMxzjE^f}t2?K|ImdvMEeBGo;li~QLom9boYj#ihLnp`wh;yaELTt$+c`+c&u{Wt8`#w-7AisAvnHcikeo>5cfhPBU{%QRFNV0 z7(^-tlq}2rr{-?&EJSHlSpPrpc|IZnSbm@vHnxXe8KLLsoZV*;k%rppH89l=SGr$3 zQWJX<>Dl<&WM<7B3CV=+`??ip6z!DE={fS@wjoFqlf7xStP%o>thF`Sm7dJbfhL|( z`q+tL>6`i-_EVoYW;}j=Wxa^#Uc*3!gYK6ibsQ_{&@V2&t2H%LCaQ6~JvJTIM=}tn z9j~i-VOQ0}6<1w`IJZ1F0tb6u^iih3=Vnk#1>#8vqrU(;H%;PcsSaD8S5z4nm;~OJ z-tw({*mV=wi3B=#CJ*E_$tP38!-7rMIkC?ucVD4jx*Xr9$Lj4>hshM};iDl#E%4K6 zov#>-oZA0b5o-QI#IKVPTf^0VV#OuG#h)7k8}LdA66yFPM9Px!E%EK!zaaAOfC85n z9Om9fUE8z@2;;U?J_c7^?CbG>_}aV@^5__7JeRJ#gdeJoO251Nnw7AVopEuFi12*4 zAaytBn8anB!@!`JtCVdZ`4N=z<&yol6&>wHGu9x_TuthOYVvCg*{Lk=A?{ zj8%Te!I8H(272c1&{~4MYYnobYLg2IJDzr~J+Whylli2}VtiAGqtz?9g4Nr1 z0(cOco$i);Z~H0pT50r;a*e;o!vts(^}-uhd9rD^ z?ay5%+wc!DQl;GQT9thwc?$<6%1ev`kl?EizrX{A?arJNW1z886JGwPnZ6`;j6@z= zV{a)}qt|(z@d^vg5D-{PSglzt8pT-|wmyImSaZaanYi+R9mUu}k+E#vq_I%w_yIv$JAGNdc1<2U#JP z7K9C5G=3~d@wH-DpLVkPs-Z%+KPRi8HuVrTpEoC&2@)rsTBV6Ksb+O@`KYT|e#_gi z&s&$)?La3?yky^{lq?{O96*N^=c&;uG<5Pr zG4{h=Cw`9edg0V+NXfr6CedegN;}s!Gp@AG2)2p=72K-HcUw6M?GIAHMGF|f9FJSx z%>)gd=_$61>rO@Nlv?-}`qr)AH1*QF4GNJ;>e=*6mwHJdDuu>1O=o-It6g@rD!O)0 z53S;ocBwOFIMC;g9eT}dG(L8P;$yWa*tzMqcK;;rtNiV8&NJXWcqn8tug0Zyk%P1j~ttQ!SKma)wEiO4Mg%RI^OwWVf zfwp$kkGrTy;27UPd1u^;&5hb^BQnLWRs$c|$ln6;hE1hH^2WdEs7n0-*8^YFghxQZj~7ny;Hi zj5T>q;T-rf!TZ)9@+P@>6sC4cDA%@eO1}>7r7QYNyeXNg?=P>!?0 zJ3G!dmi@{JV16-Z+()wQjT!xf^O9OoQHxxXQt8S@Q z5=;7S-kYN?FA?|gS_BOQ##+3MrhrfNGIfSV-wzB$6ZS?wpmA!fTY5^E7>Bz>#JRd; z)P=&VIBS-$@yqFoPp0b4)TwDMnISNBGPI)mRS$2{nA=JFfX=MtZ}yK z6HH|$dUi4yN$L&{;EeAnMN#hmBI>K-n*P4HkAy_pO0iTYFEFT-+eC`J9|LzrmmYl}Ga@!ibx;Ly>}G{HB1OXGE2 zr!#m!e8OhKAH5fko+oY9mHIciF_GQasu9oi0%D@(1obMeTLsXUomF5`S-OiJ>4Ix)u-TTe603QC6I&4hMK*T4 zclAX&`q2U!9APXy8y+cYDxrDSim3~E0~?JUb96*&I3xn*eKYVF3+*~7Oel6o?gaFZ zCvmCceUF-4_nw!gqq5uu+jlISh&2=nBz)R<;q!MH=^FW86_`%z~Kz&dVWr#bq$!=kJVfdLx=R z;Svk`*01ps?vM*HbS%n@O`S5h&SYm~AQkO-kH-R7axVVE1t-T#!IJU?;XDG11yia1 z!Pun2Gns&M-I%s>S+@G4pGsZ4+QR@SA9yBy;Pr+$k8-uRwUmiirk(<%R)C&A4alch zg2F^iVwVS)DH6wE(l44Kz?UG?+}#}&)m=-GH!0H}4?Hb`CHyHaW3?$0@rmE-@&z@_ zt56!%oaNm~eRjT)4IG)nXB-4ExZ_|yb7f3KcqX;6vU0D#l+*4~4SClx^^5;lF8yOg z^I@^qt0St})m7TtM>%aOVN_kq{kDhR>gsekJ;xgF+?#ICU+HpL8_!vML=JXr5OGQO zOuewX@IFmYyvVcYM?cC@5Edvhb!whTV-{Q7rq5Td$?V*JWBu(dZfWXKE_ZP?1wPLL zA_*4@JGdw}LLjUM3rf^)wxIGC3)FKvF7vAOaMzqeK$vT|Irqr!h)=Xy3L-?nUn_)d zfNaZ4fI4Hp4KM}}VEh@z5Mj4NNkV2~}FY>+) zq>kTSw4WMg*JKW(!e-R>${7FzI1irfIf^rBB*S^syV#;Dz(_$3{X8?GDU$Sy6jbVYCU=mNhR&sdG*zG-I(I zD9lU-#_|KldZ_~K(vpYV$rm1hlg#&AKNp8zNJS%lV2${@zM1Bg>Jyt8qv)G?v#V_vD^Zv!N3o(0IWD6%Fu z(BMmDIE-cojoj?~N=}o)SVI321-chxb zO%21Cx!LPZ!!((nlSxAQVmdOm@aAoE>x>^ZvlYXfA1mPb!dun-m5VYR7V5%LzBouCw=Z|u^hofZRR}Qq=X)Ro#>xwC z|1A(O1{Kp{Wa0h}7$8Lo(&9%s$>s{J3gT-_wObe!uypfEM~*d1gt@G}?1WxMEVM1S zhmHHbdN|7V%!7y_ii<#3(tCNQZKq}Ebi?F)GO1Y|3oDc_uq#bvbCPH&y#9=+Xmct| zNU!;~vPW~zwdJ9!Vy;=OMe}Ay5K25yR`p?0myZk!Mb3l$H&)+r>u;`hAC@Ou(s2nDY^I163LhB~&m$y0eTkSghC+q5)+6}9~W-Gr+h>H@Q-)M@G z3?8z`3f&H;n$NjYFw=V*K8#&4kLfaYxg*T;qXI3iBWBz=by&-s+jN;4g@<@(Wga-A zcZg+<0qY(c&=l{+%_>pKfVk&8mTJ~|)2n7LWkT;ug?QSQ{nj>E8KZ)~GVZaY6h4w7 zJOY#lRE|rww#yb>h}(p9c()`xa}&o>q-RNOlpHL6MSN!evRx!-tX02F-l~@Pqla#K zo%rP3#Z*m^N#2}`W#erY=ZEPvs~l3S|E6Fmb9TOY;_6Kj?GY$LFpj=_0Y^X<-rGHC zT&#*^*=J6DZE7Zp*}jdP8LmS1YsxHT%nysI9FHFcNPa3T3Z~g~7omIYT57f8!EuSckN%PoZPy~v;^RKOBE~15B3p|$aOi=-eQ1^5ibIU+Pqsf8y-=T z>83~oEqFP95wf*-w>GHvQ2*W7yQZ<&&>EJ|E5NZw*K64sy{PN!)G%Ex+^}hm1szY0 zGdfsD-)l<0lIazH&yZt~#y}mTK1qd4P^TW#v|s&O!(}Dc(-)<_07+uTc*$#+6{E`UF$Z1a@|NAG>>Jxp?KKhm6PT^vtlo@ zHeqd{Mo&pvd>nE6(+^@fhTkJK(GGn~+oKe6_jwyI50>@dC>m)X743y0`sT98T>M|2 z2RofNX5yPlA_$}`e$~I6wiSU}Cb%3Et|;bAq0AA3@^`MbIaXjW4{jI!%k}$5`CmP( zu&~ITM3knP2YOO5VO{!= zl!|SQb!HZsz2yDQ!qUx2M$rnGZgL;6p-V#wSu@GB)#t%&`_#OCB#0nRkZDu09ql>x zt0bY!I`0A?G~4oX?$P+~ER@~}WI0xs4X*|l;#OuNf8;{cP~M1#b!5tdD-u($o(0K` zvG?;3sI*8!-`?IS()P?9J+IgkKB!<5s2RyMhIt>C>GDm6Z`GGYPzIt>LAq5!DJxw* z6-vtHZ&SybweU>>{NSeina`|wh=iB@M9JH~KNSe&k9mfLgUQ90qWE{s4mRed9o+wN z@-geO|K;LSQV~#4({OM~&~k~>NlJmZ)q&DH8k+Pnm<)YFOzQpvJZvWHyL~pr7iM9w zAvv;PlOC9Ziq);2yIWNs>)xmIM=pJ=^Oz6rUe<|ExWN51y%iVV8?N%~3ZGc+n1&a&!7z6z8i^v1`Z8|zI|^}L|=AZ@47l2pLJmiC>I z?=*aW=^WR*T_>MOU5-M%Ono=I8@8_KIPW;|$537sEx0`k;sQ9hJ^_kBFQ zHh0+5u`e!y>_{;#e4FcC4$a~5w7L&(=AOZ_#{+9!iT51i!RSw7FD!HM}t5CWNYl9wQoSD`E*l>?h;QzADV!mcmeOGUW%wTA?i zO4jGGS~^ocK8@}yXK9+q_Zbd7m!+13AsRMZY)EGKc)ai9DX<}#_*RLLBIWZHK&o`+ z6xHvgOx3fWRMpkUK<@xb#$=gH5eNiW@7XA7X*4MJLf?;SN!&CXp4G*^A8kA2K|pG_ zKie-=VBke@XZQ*{?gy0>WU$ia27+TKTk|*6cU{8e@UQzrF>in7PLhpkWM3wez9-A? znD~RFem#=o4m@edg$($Ux~-L zh^GhzS0Fk0qS?%Y>N_#fRCj+2ZfwafF=SbsGk8Ph%Te0*V?H;5 z5#QIrS4O3qq^`%Gc?<&*eybnZVfe1I-j=QPCzCiX@f&GK($mNn?Mz+JP7jyt^qEb= z5$VM;nJVYH9ge7#cLrMFBaR(LDmqmrJ$_6X7^#iz_xLf79WWu5y=9Kkn1(4srz&7u zE@Lrl%RaTuZiQZ)8H{(yX{?F-m!Hpq}o{P2czRRhl4wN|r$fLaJz7 zaEGjAAhN z>dL)bLK_FQz6|S|XSXO>mQcfz&lS0qJ9)VJPA=%l8_8qE)S8)=a0fjhCK8)&RkB_q zS?1?CxM%!KgJ?hI#62Gj6bhdS(k$K`e?EG6`M%AXMD6OL1XfUy3RW`lTZ4uWD2l}a z6mtn&nc@jA^>|U8p z>HeHO{!EB%IUEV}&c4KMi5hoUi}hOp2?Ifm;zveY;@J$ZUBK@{$$oP~a!`!FYOQrs z6NwU8k^PYmr1U5@Qs3)`jO#PIIG$w|o@FG;GHgcmlzv#Ce0~tdsY}3?bVu%?0t&J> z{sHLQ4srdlENk&0P(aT`A(V^lDXG@9b+{Cw8r0C0OYOp{UOg@$Lc3JbzrW);=%2D- z)})2Pl}9BWll{yX{`Zdo3gw8`(;r&A)O7iN(EhUj-s#Z-p={0(FTR+B=XUIB(_|1W z=T4(~KI<{(w;G5zbH66o3Muus*Bbk(^!*OQh=6Swap*kN42ED=Q06hz|M;->yvpQ% z>qu;mor|%x?Lkc%}K^TtIN#n~+B>fV=%2MaD;wk^gkYl*9t$8T|yCnc(<~bqpLB zrzoI?JD{_CI<^8z#TXK8CGy}M`jxzwjdr=mQS^ z%;*CO&oYH{{$jD1Bi)%Zd#&#T;#DhToVC_21YH&D$XAW6Hk;#;BwPpr>&GdDFw7u| zk_*ur^ktxu_{Fdvc*Nl~{fRvSTMoa0xnQy;{hcP;U>rcmNyIkqP~pu0j0}z*SV1_x z>-vMHfMhxGABx{60h@s`lXl^=;~Ftp=euHXQQSDEBXoM%f~Se+(=s0@QBX`1l&Ns- zohB0*sju;R+tNe+)Vp^Mu2PqB^s$b9sWn@A zGM0z`dt^o@QO1bNyhQn?Y(|ymx-40o<2o7Eyexp*@{tTrJ-(0xwGev^+$YU!ns`o_ zsH<4lWZS!<{=6v;Lx~sz;Lx5<0A%a}nA^;{)WZ|7qXl%#7b#hO|Q41l!MD0tYF202P=Jm&KoMhqrT1a4?xk*`TBNlV6o{(Gs+r~ zw8mSDGJ5c}A2B|u>wMpgpM>4D61$0jqS#F~W73Wuu$#8N+xvWI{234elAY8c=+uFL*oN8wonkIA+GZ(`iPq?QK7C zzrr(dmi_O+xVfNk`(ll2p^*faZZL6Oo4OfEjg4E8{k=*lQIiu$mbXn&Q}(J-@uY(#}zQ*zkF)db!aS^P-$ zlF-eE#!7o-tLKvfT`ax6?|)hu*Z0L=Ungr@VwG58mBcjo>t~roalRol%tYdW+=YtY zdFf5;TKkCa5}a2qNQN8I#RwCftboBJZ*9asVC644ktO@ZYNQJggC(IUrzoU&6&GL< zLRTe_&^qs)ApY6Bio`JWp68?Fc%4yhSm{F(FsN}-kpfBv5<#r%D7w^WI+4Z8BDj{u zG*s?Wh;AKnH_kJ)bgRx~8pjsbVC=t()UL>#j|PtJU$K;GHVIVo=zzK>?Fv;`Dh+?Q zuvkJ{dWn$4U;z$PEP`15(*rOb2hB4WK>)G3-eEJb`UUO)&sc(r(9o%!{CWbZOXhYs z`c|5=e4a@s&J!ac{DltqKOit@3}bpP(dx@8(Hb(?MOF?6WCIYgLzDc5CV5SxMRib3 ztmI@yZx#=KA^3vnF7+VgYO}?{l)icSd|&PBr$Hv)Lzbn-=Bu~_+Rc8Y7#;$BxjFLh zaIl0P)Z5J^-X>1-!&zScj5M?moSdDZ{dQ}8DcgmW9yWv~Di3Ol>}A{K!m zK;~X(j4IKdQEWK%VI$GPGBEUR&=Q!Z<^d@~<-L1#;Dt=wAO6qP=3Am;KH3nhh#W^)+i+gaEB zBtqIniKAf#^FcbnF(tPc;)nI$f2xZt&(Jw!UREzN!HyaPOKf9f%Jk4=Z{tp~P6*)q zH^lnSFjOa27r=Uf$MKKnS4M!Ii`ekc7-hw(2(n2g#C+mE{p%FZx%5nEk>Iyz-z<$Q8E<%7mHO#9mT{uWP(Z5&t}km{@y^Wz1-95ZD2Bsd7PW8 zEE;aSSw5{81nbHzP;8dmXtH^{NmWKNfv6%IwiyI*Zgde-J7P}HafmYy@QVq4J{C3g z0`x8${~+=jW#VYiek}EatwZfS!JobedwiHrXk!?3OW46W`_MEl*McmmzPbliR|ZC( zYqrB}ixYg&sFJU-VwJId>5ffYu`d|LLutnCV^&;4nQ`~dGuvZSU78(Hp8t>MMwLjS zFL*$j7z|9r>U@L$SNwY~Sc7n{{ypv)0b2QVZkUrFvtdBNF#I1f1XPz9KW3`lmz>S- zg5(n(tAKfQa)gL%jW)6_CE39G-xj?(Lt<>pX*+`PTv*0K-hSF3E}qibq7iA`dM&Yo z=JEzdgDQ4Ah)sDFXE8aZJO=13__G48@<;lBbNSCM6y_)x@j(2u{(SLATsFg9Vm&km zd6U8-?mJJORdj#^fH(OWE&QGA0g}IrzF9t9GZL!&<-(S=_PouQiIhPr>>)v_sh&Wo zKn(Etn26V6En*|5iD5hDMw$)7;+1)tJPLspgb<@E@uD?$PcBHVosjqUd}(})Yv2SQ zXQ~su#4@GlWc)kdA-D2D2)(5f>%EXe#lbqSiapk8u#x^gKLqmuJ|Tsj5e_ zrjprc*w{r~ze#&OAS9nm&`8B7A0=1FM;c0}n97`0@OFNX$DNw;4!_Q=k6~;ZuvGCZ zKP+3aVhc@UG7rp)2fTtBCSs&v{^b1Ko{>(*nlDvyA{cuSx-d@*b zk_59Eo=cY}fr$dgo*r119lS7v`(=Xg`A;%ANhH$*J4a~-V&&En8_pn}GK=Pg;7;Ok z3_>uBLcnx`{y$*47(SQY`{$n}n-QY0dvt;TsaVPFej z3jFRZwsbXqc6xYw8(?)Ct!6mRUR#Mh&VgO=3`A?ZNK8#cB$25%p z!65d}7bziNnD1`|a4=5j6W*7azN$N+EB2wZUBicgbAl=g3ya6%#=2nWimqEhj1Gr(o4mb zeIudRzgR?3qhU5oe!GK+F?-kbq%tP$Fn_cCWjl*^)VyQKD>cSC{!@>kRXW)c+a8IT z187=f?@eNuG3@h&3lU=p5xF~ZW_RjiDb>vnBBH6I9{9sh4G-nk%eeI1#(WckM)yg{ zBJntjRWi~DMiyl2)Gr0$4-ytk6ZJcUd6ZXhj-i8&^1jn4a^t}el@yS1Bo)UeF`frg zLb!M%`Sa%!V81a_5dC7Z93t^EH=1isD25!FWHxR^6SISj{12u7JT~Z`yl^FwjMOxYn;=|cHSv>fbk9KX^m_yQs=!TN)^e7_TQXX>11hQ0;;ARRZTabD6D z{WRoNTxxtbr4@`Q@FE@V#O$>$&El&5#NG{^3lwslR<x;w^r!FMY>>e!;P;&fJ$+o^nk`bo9@(g)r1hPY;a05?M?h_Gxj1MWbz#R7mEv|e1={819w9nQDU6N zn@)53fuV?!yU%e@d7h6Mw<81WZP!h)i!hW`fA1JGmyCFY767;!pj5IITaPvorQ{DW_b->?x&61JqRf6$icI@`33Z*a`-<7#5BL7;>A{7iqa9~m zGVy(Ee5qiuDcG)e##aMFflE#+(w7AzX<$kN*v~k=0(bwc7xZj!WI+hW;mfAEC5FeX zowRrDzRzp-#|=akG7m4ePu>j}DR%E%i52_W7{oTzRji_zg&P$drei|!s&lP7XSsz` zY$rJ6shu7y^ybC+8`q=@#533to&!wBj33A309-1jAVdWC!HxwAlPb|FJqE1#kp!cVRKO<@$*a6t$JU`^ZZ#&ej=}~Bzs)NNmkd`Xq?84449KI zGPVQ;qWI24nV{^{l2AaygBqKPXP1 zu?ImHwM^NZXV9Z3_iFu6=W5IQV4#3qhJe-7!FZZaC#N7xGnfY`7bx+dzwE=XwUQt1 z)^Gq#avH8dBQrkDLV^_9PBvY%H;+J&$=IF}&$JGwBY%BIq1?jMmT-bqT}Kc7cvm_f z=4uo%&}8T`GV-Wk<#9JdSG&0yG2LF)v%`|rf(UnFK*dN2ni}% zeX+IDIO%&n*PYy`tnHC$P2E9rGjnz1-6#W^q2r3rWVbkTQx7nZZd+bX{zaFV>z>QQ zo*HKEmR@GbS`uJ#4IsNo{xey`X7|U3%urASb)=r62(6jC`Zm2soeAU$LE$&^l*=Is z-8ZEMd8aFUaa;uua6B2bSxBLo&Ws?5Q|N?veLHIm;_P{ee!oRioz$`tE0t|dnkPdV zlc3SM6cifWyreyiCflJf7$&Bt-+5_aFw_$XO?-*_E7nAW#89`WGq$ z9q{SQT6eLN@d-bx-Eo4;hdp7hXQfX#abX~^H?9srMLmcT&8wUjZ)T&&wg1QzSC!UA zSaaXimC#C7jYg{_iBx2Dp69)}ra=~UxvYg9s4E{zm1a8OE6D`K0wIr~iG6sgH#vuOBo5rAZoNmbF`@JwgZaws|}vldX=Tl z=@oJsij4NO$H;(f4N;7!xS$>1XhSao*S_!Q<|k88`hIN^tRwYwEQ8+pEc?scfUA{Z zK)~4Y(0Bjvc?YtfXN}OE2jO?cq-VZhRI=dkeyf$$`~lO&`2H z8$Od2#M5>!Pj}yWyGtH+>YrHf4qqM;?vzQRsG&x3KF{zLy+P_ilb*<>lc^FH*pbw9 zahS5LiHa4LudLPD9y>Sb|FuXzD+B|`+;`zb*gi;GhY^Q?s3d_(tC40|Iz-)Oln*85 zQ%U3=ENpNHwg+L`y-YW3HXW}_M9J~p$dP^1W)Tnw-L^3G|C5*h@}qa1RklRlKvIfJ z5XifH8RAzWf7}tnoYd8l7yvdI@{xdEHP%u#6D!)y;dLt4N3f@Kvv?V|tWIP|DlgYz zs3)tazCrBD%u7}wGcpPvty@98{$dcR=wQFFf}H zb&4I|cp3RsMr#yTzRqV7pt!{MkQLrM9xa(8n=Hrlv8qdUr_3}#)<#oyqeRsLtnr15 z^k}+{XsT9PR>z+_jz2{_1yg@R+bMB}QW5#q99mk^$32N(hdzw>Dm=BB$SzrGpFp+g#Jw*#Oc5<|xPfPmx2lLh8&a5sQplzYwEh`0aT7mQ z)kcevyb2R=bhEbG&JTr$ltAPYi5?nH(Ow)e;(#}uw8~K_%dICor`=|$F-Wc4N=b

IXA_Iys}jiJ&=Pl6;;cXpVO`Nj@!V&%q~P?-5UX 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%0DR>NXtB5<8!^Im8WE9<9HUn6 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 z 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%0DP|7e?V@@|H~& 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 F|JhU&`pf_T literal 0 HcmV?d00001 diff --git a/app/assets/images/pages/teachers/resources/markdown/compression-low-res.jpg b/app/assets/images/pages/teachers/resources/markdown/compression-low-res.jpg new file mode 100755 index 0000000000000000000000000000000000000000..38dde6a39182ba4926861e80e27467cdd344f410 GIT binary patch literal 20461 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 Ki6aC(EdDQV4eoaU literal 0 HcmV?d00001 diff --git a/app/assets/images/pages/teachers/resources/markdown/compression-wood-x.png b/app/assets/images/pages/teachers/resources/markdown/compression-wood-x.png new file mode 100755 index 0000000000000000000000000000000000000000..b2f2506c062a3a1d60395053634b3729e2aaad60 GIT binary patch literal 9880 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

s1r;WBZem|T(X60qQ2IB)XEs;l z1c^?=HGL)%t&?-LVi)f0@aM2Fl~eMas}cR^XiRIbfs4jeFeK-Z`CR<>rN|Y&FM>qe zj{r9R`Ce#X42raqpbKc4C^4?c21@-e&NUm!r$pglm&$U#!0@te! z&#sY8bjL=YD9s2r2DlLf`Mu+FbY&(T<;x~d-+jK2CaR6rw{_*xQ>Vuco>i;pH zl5|2EJgOEiDN=u!E#(|2a|~WyVAuT%h!Ap&q6@&7S(#Z2TdG`1K_z_qVo00Ax*ptI zmQ^IAt7iyQ@}o1z_cfOp7-XZ)(_IQhSnpXeAgYXco}4qx_jQzN#j-HW3wiI#0u7<_ zgE`qvm875oh3Ap!LLR6{8^FqXV9-e`-<-{|6uE*Jh4s0z&t}rNv5SW^dq_j_WlfBrsB?U5Z>`P!1xcbOupA zD=1P%L0>VlD9xQ63=Vc3ohp_Lh$_{e>n{EvQ>$Jq)@(h|RxsrCFx)HFBn7@^weE{$ zr7$qR11JXv(#8F^G?$=it5lQnzzONinUmJ|iglfz^asV|>4dfi#%WJ;I(Wvz{C;I3 zI0U|y(wUm;Ey25HDU<4N8;<4^B+xOe~mbi8WY$&^Lb{UUZfC0?k z9-XHFgd>sNBJPFOXHMW=id;E16cQH@=<2R>i(A`s*PL~`APv=8=54HDnF7CXfXb$n z_||3*D5E@Er&lNoLq!>Lfw%`UzopC5;s&1!ljDD*z$lUd_6GRN6Y z;A5Vm-Sw1!s9H}npo7DKor^`FyvSlzMdnQ(nTv^PsHG30j@k+aC&x_y0dvZa`5tN6 zTMB!r0qzcFVP*%VbbF{WQg}{|wR{hPcoa!rl7;cc@@6(8{8CJ=a23>B(7-C7c-g}A1%eYw<~ercbGd!FxB6iVPO)? zVR&+7p0R38tbuV+52uMf07~I}GV6T|Og&PgPK`w9&5T>!lBV`%BuXT{c=3sRkFnj0fU$E4nw_w_%YgIHkt`!V-5@PJ$m_ zKZ`tISn>};X0c1f&bq$`l!7>X&NPMcxA;bxImv&9^HXeYEH&Kl3?}L!3(6G+h0{x? z5$lmjev__7>iEpRCy&QVM~|PN;FV8kvwM_W$+-SHWZ^uz2FV55H3-e#U?ZJL4bH^HLL{l(hyEseO===jL_bQ) z?AVeDkfTFkx`+Z7_7r2Ya&D2=Q~tPf*dZRbsrp@BIDpRicV|c z!-C7KAO#oXh`C0D|K13d_RlkQ>Z5TFeRsTr+S*#Fp}xU*+3egb4G&)>PjcRD0FGy`6UN*hwyAf1K~V zKogS_G&nR&w|fVu))`43=CO!4aW%JJ7&NdBsex&kG@n`dAuKQc2sLx&_DkOxO&2rz z{qWqP)I1zPW;dcwZ4OlAP7I)ECQjV^Qg+4RxqyQh0jsg5f!b{tgD@~1r>k>uqhx>w zHV08fLvZFjh9oud(Lh)WWx}mUOM(xpM0BE12RX*J+9Lzg3Q^W7`?I9|x5oUkQ4Xud z46aN?V(l%a>jmY?yYtPI@HbFvOAEQ(Zlhn=#N;H!;_;j+Tz(I0Yj0m(AS9?5FE&#N zmqlmmLl8d}{|)&_EtaC4i0+`DOg7U%Y%vaA85yOqp?;%y#o85TGz_XhqL?fxusyc8 zz;1Y1x54-MKwRsp(0BkR-t2}q&(RA_0B#m7jCX`HwayF(^2AVnr-^j=UE#D>R(H2m zIJ6Q5o12eifZ>85ZWqGVJ(u9^&B#AC04s5?-FJm`7uq>(L<6VX*n5|2lDa)pIa@F^ z9~URk9xxQkBww52Dmje<{78Q5LW1%`>%6p~JU2g=>+U|Db5I{>X<%%Y8gR5L0}JU1EPU;An^SW7>g%R6Bx`W1S&xIJ~(6zNN)1`1Z_Q0$8C`vnO6IoUz@9V<> z#PoD=Br28!$flOGYI+|xlQGp3zSbY1Q{d@gSXF5FWzP<{HTS0x||sVwl}zJ3!=f-2E<7L0k|RSnOO{mwAlKdzfG}`Z@YTzKi~l z%)&S!L#nrI;d5D@oga(^_?zgHQVsdT^^|fw=O!aal1Q`PWdp(w-Hz6EoX_-Q1Z6Iv z@d_s&??V->>=ngwqCef_XWAD6ileS!3pG#>HgGv>ZD%5!ZisB3L>5Q#?~^Ep?T7YJNKOPA_JX|-Ii@dDlXISA zVLr3%jL@|1U(VkH$WTkyb>{=lsW|hnwxySg#dsAesO-{OHzJDJ$$D&o!9B0GRhmJ; z&5$osNPlOm`zlzNS*|b({+S~2Jo4o;14wh&wroApeZhy-lm8oc_H;@!| zHpRS-K3JdqQ|j5Yi4xE<4!!#xojZAiM$a9=90Kl+vK)`CYLAdzE>KFW+(20xX7sJg za4=>xP_7DAe6hgag`gFZA#H(yut(Dz)HIqjJDwXYOT^DEEQk*WV-B;+h1bpsLJEtq zf-(&@0RI^j4JVbGy6%OL9e)|@Usq{adm0^2JIL`IPt00Y7Yr=FY2(kJa+OnWHXzV* z7g$&)dM)z3Y+rEUqv~Y5r|+UiANvBWU*Bfz^}FxAPrVl}(){QE-B&(bP+o9odgWM3%tO}m=LY2hK!noePRgtkG4+c)YEJ7vLFhBO}pt{`;(cJ6|4IF+$oI`sm zhe%~guG4N4rWW&F49vy_0%2M>s*4z8W?e=4J}Vgf8|;v3nMPzZFmpLv$K_(Ipj-ly zrSQqD%XHp^TS0sZ zUr*dZkAC?H^zKdPmmmK46YBlsZAuIs7lYGL$$E3X|023x>lwFn5~MSUy2EBAI40nbPrMjwc=zGz23JJf_RN3Kh z(tH37FkwixIA>|6cT5S$74&WDGc~z4-^A5OK}G7OxioAgnfWE~$a1~Coy~GJQAt<* zTj;Jk?xf9|dnf{9@7?#`r~bhqy4^WMrJ-x$=Vya(>lkhujj8+6OiZ)%X@emcHxz(j zL>|rG#fRzGxSrEPID3N%6fQFcxoHVxe{aq-S&0iC?mn#_w-+2vr@CsT2w8fn1%f$3zu{LK7f z%@FJazU&v))YxeB3*#{}I|o12WVV4DyYs(uG(Z*bpO&HqQ&ovPJQ>xeg5Z6ov81BU zOdJHI28;C{=rTt!0J0m+$W&u%rBmG5l(t z)j-){7XHC_OuRoF(^M>q=Tl~v3-JO{H=njk-ONjC%`CbY3*&zygnNXUSr{97AH~+A zHB~9(tHWqU#-l__(VsLAW?LK{9p|QPA?iW%0_z?PAksJkdrNl6S$5H9rYR;mJ7hq~ z*1T@5EJ>Tfo@OpnlT%JoP zdvmC&k@&sKY2B^L%r914!~&lUNmLPMztgb3k0mCDIcPG-%42+?5%=M%01OMSda;?qRI>0h}#v? z0Q_t14QV@v!C=`NHPxmYY_>=REiwdKd6KbM$O-rg?wL1X(yEVMPzZGL)c1}uZr~I-nED%D;u5}b~ zAl9T@tU9@OSF`5of-ke^$c@k5}^pLk;^ zjDI~KY0sh*D(!NrR|^4RfRg@Kbn@yWxwy!##9QU0M5ss{8H;LArE*@$niQuenGL=S zbuX)2p(r4BA5((#c2V$!Xu^=l7h#iYsje^PL0FpUiYD3b7g_!{{tF`jI#cYhF ztZzkt@Wgp~zO+}+QCh0TRtiyRQA__MmUELrZUVB#c3_Py=O%^R1Z0ivz#3c5O$u3Kfc!si+?ua&{3k>J0000< KMNUMnLSTZnr3>@` literal 0 HcmV?d00001 diff --git a/app/assets/markdown/apcsp-compression.md b/app/assets/markdown/apcsp-compression.md index 0809946d3e8..d05272a87cf 100644 --- a/app/assets/markdown/apcsp-compression.md +++ b/app/assets/markdown/apcsp-compression.md @@ -22,13 +22,13 @@ When using Lossy compression, the file size is reduced by removing information f This is a close up of a map of Backwoods Forest, held by one of CodeCombat’s heroes, Anya. -[image needed] +high res image The details of the map can be clearly seen. This image is not compressed at all and takes up 194KB or storage space. This also means it takes that much bandwidth to transmit. Here is the same image, but after is has been compressed 90%. Now it only takes 20KB of storage space and bandwidth. -[image needed] +low res image Look at how the details have become blurred. This is one of the costs of Lossy compression. @@ -38,18 +38,65 @@ Look at how the details have become blurred. This is one of the costs of Lossy c ## Lossless compression **Lossless compression** -How much wood could a woodchuck chuck - -If a woodchuck could chuck wood? -As much wood as a woodchuck could chuck, + -If a woodchuck could chuck wood. -How much could a -If a could ? -As much as a could , -If a could . + + + + + + + + + + + + + + + + + + + +
+ +How much wood could a woodchuck chuck + + +If a woodchuck could chuck wood? + + +As much wood as a woodchuck could chuck, + + +If a woodchuck could chuck wood. + + + +How much wood image could a wood imagegrass grass  + +If a wood imagegrass could grass wood image? + +As much wood image as a wood imagegrass could grass, + +If a wood imagegrass could grass wood image. + + + +
+ +144 characters total + + + +By using wood image and grassto replace “wood” and “chuck” we reduce the total characters to 88 characters, which is about 39% compression. + +Because we know what the symbols represent, we can reconstruct the original tongue-twister with no loss of data. + +
144 characters total By using and to replace “wood” and “chuck” we reduce the total characters to 88 characters, which is about 39% compression. @@ -57,20 +104,29 @@ Because we know what the symbols represent, we can reconstruct the original tong **Lossy Compression** -Peter Piper picked a peck of pickled peppers. -Did Peter Piper pick a peck of pickled peppers? -If Peter Piper Picked a peck of pickled peppers, -Where's the peck of pickled peppers Peter Piper picked? + + + + + + + + + + + + + + + + + -Ptr Ppr pckd a pck of pckld ppprs. -Dd Ptr Ppr pck a pck of pckld ppprs? -If Ptr Ppr Pckd a pck of pckld ppprs, -Whr's th pck of pckld ppprs Ptr Ppr pckd? -195 characters -By removing all vowels except those that start words, we reduce this to 148 characters for a compression rate of 24.1% + +
Peter Piper picked a peck of pickled peppers. Did Peter Piper pick a peck of pickled peppers? If Peter Piper Picked a peck of pickled peppers, Where's the peck of pickled peppers Peter Piper picked?Ptr Ppr pckd a pck of pckld ppprs. Dd Ptr Ppr pck a pck of pckld ppprs? If Ptr Ppr Pckd a pck of pckld ppprs, Whr's th pck of pckld ppprs Ptr Ppr pckd?
195 charactersBy removing all vowels except those that start words, we reduce this to 148 characters for a compression rate of 24.1%
Ask your students if they think Lossless would be more efficient? Break your students into groups and have them give it a try. diff --git a/app/styles/teachers/markdown-resource-view.sass b/app/styles/teachers/markdown-resource-view.sass index 489a50e6bd8..d0458d31178 100644 --- a/app/styles/teachers/markdown-resource-view.sass +++ b/app/styles/teachers/markdown-resource-view.sass @@ -163,3 +163,20 @@ .ace_cursor-layer .ace_cursor display: none + + + // compression page + .res-image + width: 100% + + .wood + width: 22px + + .grass + width: 22px + + table.woodchuck, table.peter-piper + td + width: 50% + text-align: center + padding: 20px From b499ff572122e93e58a303e353626ca8ea336042 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Wed, 30 Aug 2017 12:32:06 -0700 Subject: [PATCH 057/227] Improve sorting algorithm activity --- app/assets/markdown/apcsp-search-sort.md | 29 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/app/assets/markdown/apcsp-search-sort.md b/app/assets/markdown/apcsp-search-sort.md index fcbee5c1963..e33f0dc720d 100644 --- a/app/assets/markdown/apcsp-search-sort.md +++ b/app/assets/markdown/apcsp-search-sort.md @@ -43,27 +43,36 @@ Here’s a common problem: You have a bunch of things in a list, but they’re n One simple but very slow example is Bubble Sort. This algorithm works by going through the list from left to right, comparing adjacent pairs of values. If the pair is out of order relative to each other, they get swapped; otherwise they’re left alone. If you do this N times for an N-long list, you get a sorted list! Q: About how many comparisons does this algorithm make? (A: N^2 — N for each time you go through the list. If your list is 1000 elements, that means 1,000,000 comparisons!) -If you try doing this yourself, you’ll see that it goes very slowly. Let’s compare it to a better sorting algorithm, Merge Sort. Merge sort is a recursive algorithm, meaning with each step of work it breaks the problem down into smaller sized problems and solves those instead. Here’s how it works: -If your list is just 1 element, do nothing! It’s already sorted. -If your list is more than 1 element, split the list in half, and Merge Sort each half. -Once the two halves are sorted, merge them back together by taking the lowest value off the bottom of each half until you’ve taken all of the items. -Q: About how many comparisons does this algorithm make? (A: N*log2(n) — if your list is 1000 elements, that’s just about 10,000 comparisons — 100x faster than Bubble Sort!) +If you try doing this yourself, you’ll see that it goes very slowly. Let’s compare it to better sorting algorithm, Radix Sort. With a list of numbers, Radix Sort works by first sorting by just the highest digit, then within each bucket sorting by the next highest digit, down until you sort by the 1s place. +Q: About how many comparisons does this algorithm make? (A: Just N*W, for N numbers with W digits each. So for sorting a list of 1000 4-digit numbers, it would only take 4000 comparisons) There are other ways we could sort a list that are much slower. Let’s take Bogo Sort as an example. In Bogo Sort, you first check if the list is sorted. If it isn’t, randomize the order. Repeat until the list is sorted. This will not finish in a reasonable amount of time. In fact, this could take an almost infinite amount of time. -### Activity - -Line the students up in random order, and sort them by birthday. You can start with bubble sort to show that it’s quite slow, then start over and try merge sort. - Most ways to sort lists work in a reasonable amount of time, even if they’re slower than others (with the exception of things like Bogo Sort). But for some problems, even the best algorithms are very, very slow. One classic example is the Traveling Salesman problem, where you must find the fastest path that travels through all of a set of points on a map, which can take more than 2^N steps for N points. So 1000 points would take a number of steps too large to type into this page! The way around that is to find algorithms that can find a good solution, but not necessarily the best solution. By loosening that requirement, we can get much faster results. These methods tend to involve “heuristic functions”, which approximate some part of the algorithm. +### Activity + +Line the students up in random order, and sort them by birthday. You can start with bubble sort to show that it’s quite slow, then start over and try radix sort. + +Instructions for bubble sorting students: +- Starting at the left side, point to the two students at the end, and have them say their birthdays. + - If the one on the left is later than the one on the right, have them swap positions. + - Move one student to the right (eg from positions 1 and 2 to positions 2 and 3) + - Repeat until you get to the right side of the list +- Repeat the above once for each student in your class (or until you decide you've demonstrated it enough — it's pretty slow!) +Instructions for radix sorting students: +- First, identify what years students were born in. Separate them out into one group per year. +- In each year group, separate them out into one bucket for each month of that year. +- In each month group, separate them out into three buckets — one for 1-10, one for 11-20, and one for 21-31 +- In each of those buckets, separate them out by the exact day of the month. +- While doing this, keep all the groups in order. At the end, the class should be sorted! ### Discussion Questions: - For two algorithms, how fast are they comparatively? How else can they be compared? - For a given algorithm, will it always work? Even in the case where the thing being looked at isn’t in the collection? How can you be sure? -### Extra: +### Extra: Audio-Visualization of various sort algorithms: https://www.youtube.com/watch?v=kPRA0W1kECg From 94c82720b5f80d93de53bc55510f9c0d629426e4 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 31 Aug 2017 09:49:53 -0700 Subject: [PATCH 058/227] Fix BuyGemsModal translations Two years ago, I forgot to add an i18n property to the product schema, which the BuyGemsModal depended on to translate labels. This hidden property was a string that pointed to the static translation. https://github.com/codecombat/codecombat/commit/7c516c4d9fe334af8db3fc0d8fe8840dca543519 More recently, we added the ability to translate products for PayPal payments. This created an i18n property, but an object, for database-stored translations. https://github.com/codecombat/codecombat/commit/b02069e33757e4d55ccfb7b014b167f2bf13ced1 This broke the BuyGemsModal. It didn't really make sense to store translation strings specifically for the BuyGemsModal anyway, so I just have that view handle relating gem product names to descriptions. --- app/templates/play/modal/buy-gems-modal.jade | 2 +- app/views/play/modal/BuyGemsModal.coffee | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/templates/play/modal/buy-gems-modal.jade b/app/templates/play/modal/buy-gems-modal.jade index e6fa896bb06..2b57ee802bd 100644 --- a/app/templates/play/modal/buy-gems-modal.jade +++ b/app/templates/play/modal/buy-gems-modal.jade @@ -19,7 +19,7 @@ for product in view.products.models .product h4 x#{product.get('gems')} - h3(data-i18n=product.get('i18n')) + h3(data-i18n=view.getProductDescription(product.get('name'))) button.btn.btn-illustrated.btn-lg(value=product.get('name')) span= product.get('priceString') diff --git a/app/views/play/modal/BuyGemsModal.coffee b/app/views/play/modal/BuyGemsModal.coffee index 76e3b001f6c..f6f126eadf2 100644 --- a/app/views/play/modal/BuyGemsModal.coffee +++ b/app/views/play/modal/BuyGemsModal.coffee @@ -69,6 +69,13 @@ module.exports = class BuyGemsModal extends ModalView # newProducts.push localProduct # @products = _.sortBy newProducts, 'gems' # @render() + + getProductDescription: (productName) -> + return switch productName + when 'gems_5' then 'buy_gems.few_gems' + when 'gems_10' then 'buy_gems.pile_gems' + when 'gems_20' then 'buy_gems.chest_gems' + else '' onClickProductButton: (e) -> @playSound 'menu-button-click' @@ -85,7 +92,7 @@ module.exports = class BuyGemsModal extends ModalView else application.tracker?.trackEvent 'Started gem purchase', { productID: productID } stripeHandler.open({ - description: $.t(product.get('i18n')) + description: $.t(@getProductDescription(product.get('name'))) amount: product.get('amount') bitcoin: true alipay: if me.get('country') is 'china' or (me.get('preferredLanguage') or 'en-US')[...2] is 'zh' then true else 'auto' From d786b971f95ed8182a2d9bc0dc26c88bde40fbfd Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 31 Aug 2017 10:50:05 -0700 Subject: [PATCH 059/227] Update README to use files in Amazon S3 instead of Dropbox --- README.md | 106 +++++++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 5299365fef7..f74b9a8b76f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

@@ -52,57 +52,57 @@ so we can accept your pull requests. It is easy. ![Scott Erickson](http://codecombat.com/images/pages/about/team-avatars/scott-avatar.png "Scott Erickson") ![Matt Lott](http://codecombat.com/images/pages/about/team-avatars/matt-avatar.png "Matt Lott") ![Catherine Weresow](http://codecombat.com/images/pages/about/team-avatars/cat-avatar.png "Catherine Weresow") -![Maka Gradin](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Maka%20Gradin/maka_gradin_100.png "Maka Gradin") -![Rob Blanckaert](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Rob%20Blanckaert/rob_blanckaert_100.png "Rob Blanckaert") -![Josh Callebaut](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Josh%20Callebaut/josh_callebaut_100.png "Josh Callebaut") +![Maka Gradin](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Maka%20Gradin/maka_gradin_100.png "Maka Gradin") +![Rob Blanckaert](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Rob%20Blanckaert/rob_blanckaert_100.png "Rob Blanckaert") +![Josh Callebaut](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Josh%20Callebaut/josh_callebaut_100.png "Josh Callebaut") ![Michael Schmatz](http://codecombat.com/images/pages/about/michael_small.png "Michael Schmatz") ![Josh Lee](http://codecombat.com/images/pages/about/josh_small.png "Josh Lee") -![Dan TDM](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Dan_TDM/dan_tdm_100.png "Dan TDM") -![Alex Cotsarelis](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Alex%20Cotsarelis/alex_100.png "Alex Cotsarelis") -![Alex Crooks](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Alex%20Crooks/alex_100.png "Alex Crooks") -![Alexandru Caciulescu](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Alexandru%20Caciulescu/alexandru_100.png "Alexandru Caciulescu") -![Andreas Linn](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Andreas%20Linn/andreas_100.png "Andreas Linn") -![Andrew Witcher](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Andrew%20Witcher/andrew_100.png "Andrew Witcher") -![Axandre Oge](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Axandre%20Oge/axandre_100.png "Axandre Oge") -![Bang Honam](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Bang%20Honam/bang_100.png "Bang Honam") -![Benjamin Stern](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Benjamin%20Stern/benjamin_100.png "Benjamin Stern") -![Brad Dickason](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Brad%20Dickason/brad_100.png "Brad Dickason") -![Carlos Maia](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Carlos%20Maia/carlos_maia_100.png "Carlos Maia") -![Chloe Fan](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Chloe%20Fan/chloe_100.png "Chloe Fan") -![Dan Ristic](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Dan%20Ristic/dan_100.png "Dan Ristic") -![Danny Whittaker](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Danny%20Whittaker/danny_100.png "Danny Whittaker") -![David Liu](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/David%20Liu/david_liu_100.png "David Liu") -![David Pendray](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/David%20Pendray/david_100.png "David Pendray") -![Deepak1556](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Deepak1556/deepak_100.png "Deepak1556") -![Derek Wong](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Derek%20Wong/derek_100.png "Derek Wong") -![Dominik Kundel](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Dominik%20Kundel/dominik_k_100.png "Dominik Kundel") -![Glen De Cauwsemaecker](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Glen%20de%20Cauwsemaecker/glen_100.png "Glen De Cauwsemaecker") -![Ian Li](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Ian%20Li/ian_100.png "Ian Li") -![Jeremy Arns](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Jeremy%20Arns/jeremy_100.png "Jeremy Arns") -![Joachim Brehmer](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Joachim%20Brehmer/joachim_100.png "Joachim Brehmer") -![Jose Antonini](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Jose%20Antonini/jose_antonini_100.png "Jose Antonini") -![Katharine Chan](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Katharine%20Chan/katharine_100.png "Katharine Chan") -![Ken Stanley](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Ken%20Stanley/ken_100.png "Ken Stanley") -![Kevin Holland](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Kevin%20Holland/kevin_100.png "Kevin Holland") -![Laura Watiker](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Laura%20Watiker/laura_100.png "Laura Watiker") -![Michael Heasell](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Michael%20Heasell/michael_100.png "Michael Heasell") -![Michael Polyak](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Michael%20Polyak/michael_100.png "Michael Polyak") -![Mischa Lewis-Norelle](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Mischa%20Lewis-Norelle/mischa_100.png "Mischa Lewis-Norelle") -![Nathan Gosset](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Nathan%20Gosset/nathan_100.png "Nathan Gosset") -![Oleg Ulyanicky](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Oleg%20Ulyanickiy/oleg_100.png "Oleg Ulyanicky") -![Paul Buser](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Paul%20Buser/paul_100.png "Paul Buser") -![Pavel Konstantynov](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Pavel%20Konstantinov/pavel_100.png "Pavel Konstantynov") -![Popey Gilbert](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Popey%20Gilbert/popey_100.png "Popey Gilbert") -![Prabhsimran Baweja](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Prabhsimran%20Baweja/prabhsimran_100.png "Prabhsimran Baweja") -![Rachel Xiang](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Rachel%20Xiang/rachel_100.png "Rachel Xiang") -![Rebecca Saines](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Rebecca%20Saines/rebecca_100.png "Rebecca Saines") -![Robert Moreton](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Robert%20Moreton/robert_100.png "Robert Moreton") -![Ronnie Cheng](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Ronnie%20Cheng/ronnie_100.png "Ronnie Cheng") -![Ruben Vereecken](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Ruben%20Vereecken/ruben_100.png "Ruben Vereecken") -![Russ Fan](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Russ%20Fan/russ_100.png "Russ Fan") -![Shiying Zheng](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Shying%20Zheng/shiyeng_100.png "Shiying Zheng") -![Sébastien Moratinos](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Tom%20Steinbrecher/tom_100.png "Sébastien Moratinos") -![Thanish Muhammed](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Thanish%20Muhammed/thanish_100.png "Thanish Muhammed") -![Tom Steinbrecher](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Tom%20Steinbrecher/tom_100.png "Tom Steinbrecher") -![Yang Shun Tay](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Yang%20Shun%20Tay/yang_shun_tay_100.png "Yang Shun Tay") -![Zach Martin](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/avatars/Zach%20Martin/zack_100.png "Zach Martin") +![Dan TDM](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Dan_TDM/dan_tdm_100.png "Dan TDM") +![Alex Cotsarelis](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Alex%20Cotsarelis/alex_100.png "Alex Cotsarelis") +![Alex Crooks](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Alex%20Crooks/alex_100.png "Alex Crooks") +![Alexandru Caciulescu](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Alexandru%20Caciulescu/alexandru_100.png "Alexandru Caciulescu") +![Andreas Linn](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Andreas%20Linn/andreas_100.png "Andreas Linn") +![Andrew Witcher](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Andrew%20Witcher/andrew_100.png "Andrew Witcher") +![Axandre Oge](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Axandre%20Oge/axandre_100.png "Axandre Oge") +![Bang Honam](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Bang%20Honam/bang_100.png "Bang Honam") +![Benjamin Stern](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Benjamin%20Stern/benjamin_100.png "Benjamin Stern") +![Brad Dickason](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Brad%20Dickason/brad_100.png "Brad Dickason") +![Carlos Maia](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Carlos%20Maia/carlos_maia_100.png "Carlos Maia") +![Chloe Fan](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Chloe%20Fan/chloe_100.png "Chloe Fan") +![Dan Ristic](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Dan%20Ristic/dan_100.png "Dan Ristic") +![Danny Whittaker](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Danny%20Whittaker/danny_100.png "Danny Whittaker") +![David Liu](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/David%20Liu/david_liu_100.png "David Liu") +![David Pendray](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/David%20Pendray/david_100.png "David Pendray") +![Deepak1556](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Deepak1556/deepak_100.png "Deepak1556") +![Derek Wong](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Derek%20Wong/derek_100.png "Derek Wong") +![Dominik Kundel](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Dominik%20Kundel/dominik_k_100.png "Dominik Kundel") +![Glen De Cauwsemaecker](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Glen%20de%20Cauwsemaecker/glen_100.png "Glen De Cauwsemaecker") +![Ian Li](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Ian%20Li/ian_100.png "Ian Li") +![Jeremy Arns](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Jeremy%20Arns/jeremy_100.png "Jeremy Arns") +![Joachim Brehmer](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Joachim%20Brehmer/joachim_100.png "Joachim Brehmer") +![Jose Antonini](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Jose%20Antonini/jose_antonini_100.png "Jose Antonini") +![Katharine Chan](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Katharine%20Chan/katharine_100.png "Katharine Chan") +![Ken Stanley](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Ken%20Stanley/ken_100.png "Ken Stanley") +![Kevin Holland](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Kevin%20Holland/kevin_100.png "Kevin Holland") +![Laura Watiker](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Laura%20Watiker/laura_100.png "Laura Watiker") +![Michael Heasell](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Michael%20Heasell/michael_100.png "Michael Heasell") +![Michael Polyak](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Michael%20Polyak/michael_100.png "Michael Polyak") +![Mischa Lewis-Norelle](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Mischa%20Lewis-Norelle/mischa_100.png "Mischa Lewis-Norelle") +![Nathan Gosset](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Nathan%20Gosset/nathan_100.png "Nathan Gosset") +![Oleg Ulyanicky](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Oleg%20Ulyanickiy/oleg_100.png "Oleg Ulyanicky") +![Paul Buser](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Paul%20Buser/paul_100.png "Paul Buser") +![Pavel Konstantynov](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Pavel%20Konstantinov/pavel_100.png "Pavel Konstantynov") +![Popey Gilbert](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Popey%20Gilbert/popey_100.png "Popey Gilbert") +![Prabhsimran Baweja](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Prabhsimran%20Baweja/prabhsimran_100.png "Prabhsimran Baweja") +![Rachel Xiang](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Rachel%20Xiang/rachel_100.png "Rachel Xiang") +![Rebecca Saines](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Rebecca%20Saines/rebecca_100.png "Rebecca Saines") +![Robert Moreton](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Robert%20Moreton/robert_100.png "Robert Moreton") +![Ronnie Cheng](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Ronnie%20Cheng/ronnie_100.png "Ronnie Cheng") +![Ruben Vereecken](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Ruben%20Vereecken/ruben_100.png "Ruben Vereecken") +![Russ Fan](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Russ%20Fan/russ_100.png "Russ Fan") +![Shiying Zheng](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Shying%20Zheng/shiyeng_100.png "Shiying Zheng") +![Sébastien Moratinos](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Tom%20Steinbrecher/tom_100.png "Sébastien Moratinos") +![Thanish Muhammed](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Thanish%20Muhammed/thanish_100.png "Thanish Muhammed") +![Tom Steinbrecher](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Tom%20Steinbrecher/tom_100.png "Tom Steinbrecher") +![Yang Shun Tay](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Yang%20Shun%20Tay/yang_shun_tay_100.png "Yang Shun Tay") +![Zach Martin](https://s3.amazonaws.com/files.codecombat.com/wiki-images/avatars/Zach%20Martin/zack_100.png "Zach Martin") From 781e772b8e6cec29e4bb5e9153b68bb8806c32ab Mon Sep 17 00:00:00 2001 From: Robin Yang Date: Thu, 31 Aug 2017 11:42:56 -0700 Subject: [PATCH 060/227] Add and revise AP CS P activities --- app/assets/markdown/apcsp-big-data.md | 40 ++++++++-- app/assets/markdown/apcsp-binary-sequences.md | 33 ++++---- app/assets/markdown/apcsp-computing-lesson.md | 24 ++++++ app/assets/markdown/apcsp-getting-abstract.md | 4 +- .../markdown/apcsp-hitchhikers-guide.md | 17 ++-- .../apcsp-internet-chat-simulation.md | 59 ++++++++++++++ .../markdown/apcsp-internet-simulation.md | 20 ++--- app/assets/markdown/apcsp-pair-algorithms.md | 35 +++++++++ .../apcsp-personal-and-global-impact.md | 28 +++---- app/assets/markdown/apcsp-refactoring.md | 78 +++++++++++++++++++ .../teachers/ap-cs-principles-view.jade | 17 +++- 11 files changed, 288 insertions(+), 67 deletions(-) create mode 100644 app/assets/markdown/apcsp-computing-lesson.md create mode 100644 app/assets/markdown/apcsp-internet-chat-simulation.md create mode 100644 app/assets/markdown/apcsp-pair-algorithms.md create mode 100644 app/assets/markdown/apcsp-refactoring.md diff --git a/app/assets/markdown/apcsp-big-data.md b/app/assets/markdown/apcsp-big-data.md index d6a4c348bfb..4b865ef81c9 100644 --- a/app/assets/markdown/apcsp-big-data.md +++ b/app/assets/markdown/apcsp-big-data.md @@ -1,9 +1,9 @@ ##### Activity # Big Data -AP Computer Science Principles: Learning Objectives -LO 3.2.2 Determine how large data sets impact the use of computational processes to discover information and knowledge. [P3] -LO 3.3.1 Analyze how data representation, storage, security, and transmission of data involve computational manipulation of information. [P4] +### AP Computer Science Principles: Learning Objectives +- LO 3.2.2 Determine how large data sets impact the use of computational processes to discover information and knowledge. [P3] +- LO 3.3.1 Analyze how data representation, storage, security, and transmission of data involve computational manipulation of information. [P4] ## What is Data? Data, in the context of Computer Science, is stored information. A computer stores all sorts of data: instructions on how to execute a program, the contents of your word documents, the background image for your desktop. All those are forms of data which are abstracted differently based on their use. It is important to understand the context of data when displaying it. Displaying the binary values that make up an image isn't useful, and conversely, displaying a compiled program as an image doesn't have much use either! @@ -20,8 +20,8 @@ Trying to monitor all the tweets as they come in is nearly impossible. However, Think of working with big data as trying to create an abstraction. Simplify what you need into a series of inputs and -### Activity: What You Need - +## Activity 1: Census Explorer +### What you need: - census.gov's Census Explorer: https://www.census.gov/censusexplorer/censusexplorer-youngadults.html - Some way to record information and compare (Paper and pencils. Computer and a note-taking or spreadsheet program.) @@ -32,6 +32,30 @@ Locate your home county on the website and record various details for the curren Pick a neighboring county and record it's values for the categories you picked. Compare between the two. Are there any major differences between the two? What does the data say about the two countys when viewed that way? Does it reflect your perception of these two countys? ### Discussion Questions -1. How much disk space do you think this census takes? 1MB? 1GB? 1TB? More? -1. Are you able to identify any specific person or group through the census data? If so, who could you see? If not, why do you think this was? -2. Can you think of any risks of having publicly accessible census data available to anyone in the world? +- How much disk space do you think this census takes? 1MB? 1GB? 1TB? More? +- Are you able to identify any specific person or group through the census data? If so, who could you see? If not, why do you think this was? +- Can you think of any risks of having publicly accessible census data available to anyone in the world? + + +## Activity 2: Group Data Exploration +### What you need: +- Link to TED Talk https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data?language=en#t-746603 +- Links to large data sets, such as: + - https://www.data.gov/ + - https://www.cia.gov/library/publications/the-world-factbook/ + - https://aws.amazon.com/datasets/ + - http://www.gapminder.org/data/ + - https://www.google.com/finance?ei=16GnWbGlGMW-jAHuy5iABQ + + +Begin by showing the TED talk linked above. Then lead a short discussion debriefing the video for about five minutes. Use the questions listed below if you need starting points. + +Next, split the students up into small groups of 3 or 4 people. Each group should explore at least two different big data sites. For each site, the group should determine if the site contains big data, how the site visualizes the data, if the visualizations are helpful, and where the data is coming from. In addition, the group should download at least one large data set as a CSV and try to open it. Each group should submit their findings from each site and from the CSV download in writing at the end of class. + +### Discussion Questions: +- How would you describe big data? +- How do large data sets impact the use of computational approaches? +- What are the security concerns with large data sets? +- How are large data sets transmitted? +- How are large data sets manipulated? +- What kinds of visualizations can be used for large data sets? diff --git a/app/assets/markdown/apcsp-binary-sequences.md b/app/assets/markdown/apcsp-binary-sequences.md index 1835b84d2be..e3566fd6df2 100644 --- a/app/assets/markdown/apcsp-binary-sequences.md +++ b/app/assets/markdown/apcsp-binary-sequences.md @@ -1,17 +1,16 @@ #### Activity # Binary Sequences -Learning Objectives -2.1.2 Explain how binary sequences are used to represent digital data. +### Learning Objectives += 2.1.2 Explain how binary sequences are used to represent digital data. Binary is used to encode different types of data, depending on the context in which it's used. One example of this is the "ASCII standard" for encoding text. -What you need: +### What you need: - A "binary to ascii" and "ascii to binary" converting webpage. - http://www.binaryhexconverter.com/binary-to-ascii-text-converter - http://www.binaryhexconverter.com/ascii-text-to-binary-converter - - https://direct.codecombat.com/play/web-dev-level/quizlet/59541a742600c500205a4007 - An ASCII encoded binary "secret message". - Create your own with the ascii to binary converter, or use this one: ``` @@ -26,18 +25,22 @@ What you need: ### Activity #1: Decode the Secret Message -Give the students the "secret message". -Direct the students to go to a "binary to ascii converter" in a web browser (or have them use Google to find one). -Each student copies the binary code into the converter to decipher its contents. +1. Give the students the "secret message". +2. Direct the students to go to a "binary to ascii converter" in a web browser (or have them use Google to find one). +3. Each student copies the binary code into the converter to decipher its contents. ### Activity #2: Send a Secret Message -Pair the students up. -Direct each student to an "ascii to binary converter" web page. -Each student will type a secret message in ASCII text, then use the converter to change it into binary. -The students should exchange secret messages with their partner, and use a "binary to ascii converter" to decipher their partner's secret message. +1. Pair the students up. +2. Direct each student to an "ascii to binary converter" web page. +3. Each student will type a secret message in ASCII text, then use the converter to change it into binary. +4. The students should exchange secret messages with their partner, and use a "binary to ascii converter" to decipher their partner's secret message. - -Discussion Questions: - - TODO + +### Discussion Questions: +- ASCII is a standard format used to represent text in binary form. Can you think of any other digital formats you use online? For images? For music? +- Why is it important to have commonly agreed upon formats for digital data? + +### Challenge Questions: +- A sequence of bits can represent many different things. The letter A, in binary is 01000001. If the same bits were used to represent a number, what number would it be? +- If you only have 8 bits, what is the highest integer you can represent in binary? diff --git a/app/assets/markdown/apcsp-computing-lesson.md b/app/assets/markdown/apcsp-computing-lesson.md new file mode 100644 index 00000000000..daadd42f446 --- /dev/null +++ b/app/assets/markdown/apcsp-computing-lesson.md @@ -0,0 +1,24 @@ +##### Activity +# Computing Lesson Project + +### AP Computer Science Principles: Learning Objectives: +- [LO 1.2.4] Collaborate in the creation of computational artifacts. [P6] +- [LO 2.1.1] Describe the variety of abstractions used to represent data. [P3] +- [LO 2.3.1] Use models and simulations to represent phenomena. [P3] + +## What is a computing lesson? +A computing lesson is a computational artifact that teaches others about a computing concept. In this project, students will create artifacts to teach others about a concept of their choice. They will work in pairs and develop ways to represent their chosen concept to an audience with a limited knowledge of computing. + +### What you need: +Computers - one for each pair of students + +Throughout Unit 2, the students will learn about computing concepts and the basis of computational thinking. For an end of unit assessment, students will work in pairs to create a computational artifact that teaches others about one of the computing concepts covered in Unit 2. Students should assume that the artifact will be consumed by others who do not have much computational knowledge. Thus the students should focus on using simple language and analogies that will be relatable to their audience. + +The students may choose both the topic of their computational artifact as well as the intended audience. For example, they may choose to teach elementary school students about different number systems or grandparents about computer storage hardware. The students must work together to choose a topic and audience, plan the computational artifact, identify a model or simulation to represent the topic, and create the computational artifact. Each student pair will present their artifact to the class. + +This lesson will take four days - one day for planning the lesson, two days for designing and creating the artifact, and one day for presentations, discussion, and reflection. + +### Discussion Questions: +- Describe how you and your partner collaborated to create the computational artifact. +- How does your model/simulation represent the topic you chose to teach others about? How well does it model the phenomenon? What aspects are not modeled well? +- Why did you choose the model you did? How does it fit the intended audience? diff --git a/app/assets/markdown/apcsp-getting-abstract.md b/app/assets/markdown/apcsp-getting-abstract.md index 93ca92ce9fb..8d25965730a 100644 --- a/app/assets/markdown/apcsp-getting-abstract.md +++ b/app/assets/markdown/apcsp-getting-abstract.md @@ -1,8 +1,8 @@ #### Activity # Getting Abstract! -Learning Objective: -2.2.3 Identify multiple levels of abstractions that are used when writing programs. +### Learning Objective: += 2.2.3 Identify multiple levels of abstractions that are used when writing programs. #### Activity #1: Discussion of Layers of Abstraction diff --git a/app/assets/markdown/apcsp-hitchhikers-guide.md b/app/assets/markdown/apcsp-hitchhikers-guide.md index a43ecb9a909..2c8f26f3a5c 100644 --- a/app/assets/markdown/apcsp-hitchhikers-guide.md +++ b/app/assets/markdown/apcsp-hitchhikers-guide.md @@ -1,24 +1,21 @@ -#### Activity +##### Activity # Algorithms - Hitchhiker's Guide -#### AP Computer Science Principles: Learning Objectives - -[LO 4.1.2] Express an algorithm in a language. [P5] - -[LO 4.2.2] Explain the difference between solvable and unsolvable problems in computer science. [P1] - -[LO 4.2.3] Explain the existence of undecidable problems in computer science. [P1] +### AP Computer Science Principles: Learning Objectives +- [LO 4.1.2] Express an algorithm in a language. [P5] +- [LO 4.2.2] Explain the difference between solvable and unsolvable problems in computer science. [P1] +- [LO 4.2.3] Explain the existence of undecidable problems in computer science. [P1] What are unsolvable and undecidable problems? -What you need: +## What you need: - [Video clip](https://www.youtube.com/watch?v=aboZctrHfK8) - [Halting Problem article](http://www.huffingtonpost.com/entry/how-to-describing-alan-turings-halting-problem-to_us_58d1ae08e4b062043ad4add7) Students will watch a video clip from The Hitchhiker’s Guide to the Galaxy. After watching the clip, they will break into small groups and discuss the clip. In particular, they will focus on the problem the computer was attempting to solve - what is the answer to life, the universe, and everything. They will work together to try and determine an algorithm that could solve that problem then share the algorithm with the class. A whole-class discussion on unsolvable and undecidable problems will follow. The discussion will include an introduction to the Halting Problem, guiding students to see that it is undecidable. LO 4.1.2[P5], LO 4.2.2[P1], LO 4.2.3[P1] -Discussion Questions: +### Discussion Questions: - What makes a problem unsolvable? - What makes a problem undecidable? - Does it surprise you that computers cannot solve everything? diff --git a/app/assets/markdown/apcsp-internet-chat-simulation.md b/app/assets/markdown/apcsp-internet-chat-simulation.md new file mode 100644 index 00000000000..b28ab12cf58 --- /dev/null +++ b/app/assets/markdown/apcsp-internet-chat-simulation.md @@ -0,0 +1,59 @@ +##### Activity +# Chat Room Simulation + +### Learning Objectives: +- [LO 2.3.1] Use models and simulations to represent phenomena. [P3] +- [LO 6.1.1] Explain the abstractions in the Internet and how the Internet functions. [P3] +- [LO 6.2.1] Explain characteristics of the Internet and the systems built on it. [P5] +- [LO 6.2.2] Explain how the characteristics of the Internet influence the systems built on it. [P4] +- [LO 6.3.1] Identify existing cybersecurity concerns and potential options to address these issues with the Internet and the systems built on it. [P1] + +## Overview + +In this lesson, students will explore and act out the way in which computers communicate with each other over the internet. They do this by simulating a chat room, in which they must send secure messages to other students in the class. Throughout the activity, the students must develop ways to identify the sender and intended recipient of the message, and also to keep it secure. + +This activity will likely span two class periods. Be sure to give the students enough time to brainstorm different problem solving solutions for the later rounds. You will also want to leave enough time to go over the discussion questions. + + +### What you need: +- Post-it notes, index cards, or small pieces of paper for the messages +- Pens or pencils to write the messages +- YouTube access to play this video https://www.youtube.com/watch?v=AYdF7b3nMto&feature=youtu.be + +Begin by splitting up the students into two groups. One group will be the message senders and the other group will be the recipients. Assign each sender a recipient to give a message to. You can choose to have the sender pick the recipient’s name from a box or to whisper it to them so the recipient does not know who the sender is. If you’d like, you can also determine what the message should be. You can choose to have all senders deliver the same message, or have them all deliver separate ones. For example, perhaps each sender delivers the message of his or her birthday to their assigned recipient. + +Have the students all stand up and tell the senders to deliver their message to the recipients. In this first round, they will likely just approach their assigned recipient and tell him or her the desired message. After the messages have been delivered, ask the recipients if they know what the message was and who it came from. Ask them how they knew this - at this point it should be obvious; the sender told them the message and they know who the sender was since they saw and heard them. + +For the second round, have the senders choose new recipients. You can also choose to switch who the senders and recipients are with each round if you’d like. Once again, you may determine what the message should be that the senders deliver. For this round, be sure that the post-it notes and writing utensils are somewhere in view for the students. Instruct the senders to deliver their messages to the recipients, but this time without talking. The students will likely write their message and give it to their recipient, but you may also find that they try to mime the message as well. Feel free to let them explore different ways in which to do this. + +After the messages have been delivered, ask the recipients how they know what the message said and who the sender was. They will likely respond saying that they could read the message and see who the person was who gave it to them. + +Repeat the whole process again for a third round, but this time break the students up into three different groups. One group is the senders, one is the recipients, and the third is the routers. The routers’ job is to deliver the message from a sender to the recipient. + +For this round, tell the students that the recipients must keep their eyes closed (or put their heads on their desks) while the routers deliver messages to them. In addition, the senders must determine how they will deliver the message via the router and ensure that the recipients know who the message came from. Most of them will likely write the recipient’s name and their own name on the message (i.e. “To Dave … From, Jane”). + +Once the messages have been delivered, ask the routers how they knew who to deliver the messages to. Then ask the recipients how they knew who the message was from. Both groups will likely indicate that it was because of names written on the message. + +For the fourth round, the students should repeat the process from round 3, but this time the senders are limited to sending only 8 characters at a time. Thus the senders must send their message in different pieces. Be sure that the senders need at least three different pieces in order to transmit the recipient’s name, the message, and their own name. + +Instruct the senders to break the message up into pieces of no more than 8 characters. In addition, they need a way to tell the recipient how many pieces of the message there are and the order of the pieces. This allows the recipient to fully reconstruct the message, even though it is delivered in pieces. If necessary, allow the senders to work together in order to develop a system that allows them to number the pieces. + +Have the senders give the pieces of the message to the router to be delivered to the recipient one by one. Once the recipients have received the entire message, have a quick discussion on how they were able to assemble the messages. Ask the senders about the protocols they developed to see if students came up with different methods. + +At this point, you can also encourage the students to think about ways in which they can limit the length of their messages. For example, instead of saying “To Dave...from Jane” with each message, perhaps the class could have a system in which each student is assigned a number. Then the recipient’s number could be at the beginning of the message and the sender’s number could be at the end. Naturally, this would reduce the number of characters in the message, and thus the number of packets that need to be sent. + +In the fifth and final round, have the students repeat the process one more time. In this round, however, tell the students that there is now a potential security breach in the chat room. In order to deliver the messages securely, the students have to devise a way for the senders to encrypt the messages and the recipients to decrypt and read them. + +The best way to do this is for the sender to work with the recipient to develop a code together. Then the sender can use the code to encrypt the message and the recipient can use it to decrypt the message. If students need help coming up with encryption methods, you can suggest cipher shifts (where the entire alphabet is shifted by a certain number) or replacing letters with numbers that they are mapped to. + +Once the sender and recipient have decided on an encryption/decryption method, the senders should write the encrypted message in pieces (up to 8 characters at a time) and give the pieces to the router to deliver to the recipient. After the messages have been delivered, ask the students to describe their encryption methods. Have a short class discussion about the different methods students chose and which ones may be more secure than others. + +After the final round, show the video above to give students a better sense of how transfers actually occur over the internet. Then spend at least ten minutes leading a class discussion with the following questions. Encourage the students to think about the video and the chat room simulation as you go through each question. + + +### Discussion Questions: +- How did the chat room simulation represent the way in which information is transferred via the Internet? What details were abstracted in the simulation? +- What are some characteristics of the Internet? +- Describe how the Internet transfers information from one device to another. +- Why is data transferred in packets? How does this reflect on the characteristics of the Internet? +- How did you address cybersecurity issues in the simulation? What other ways could you have addressed it? diff --git a/app/assets/markdown/apcsp-internet-simulation.md b/app/assets/markdown/apcsp-internet-simulation.md index 48787277985..3ef3f8a0c63 100644 --- a/app/assets/markdown/apcsp-internet-simulation.md +++ b/app/assets/markdown/apcsp-internet-simulation.md @@ -1,19 +1,15 @@ -#### Activity +##### Activity # The Internet - Internet Simulation -#### AP Computer Science Principles: Learning Objectives: +### AP Computer Science Principles: Learning Objectives: -[LO 2.3.1] Use models and simulations to represent phenomena. [P3] - -[LO 6.1.1] Explain the abstractions in the Internet and how the Internet functions. [P3] - -[LO 6.2.1] Explain characteristics of the Internet and the systems built on it. [P5] - -[LO 6.2.2] Explain how the characteristics of the Internet influence the systems built on it. [P4] - -[LO 6.3.1] Identify existing cybersecurity concerns and potential options to address these issues with the Internet and the systems built on it. [P1] +- [LO 2.3.1] Use models and simulations to represent phenomena. [P3] +- [LO 6.1.1] Explain the abstractions in the Internet and how the Internet functions. [P3] +- [LO 6.2.1] Explain characteristics of the Internet and the systems built on it. [P5] +- [LO 6.2.2] Explain how the characteristics of the Internet influence the systems built on it. [P4] +- [LO 6.3.1] Identify existing cybersecurity concerns and potential options to address these issues with the Internet and the systems built on it. [P1] -### What is packet transfer? +## What is packet transfer? Packet transfer is a way of moving data through the Internet. It involves breaking up the data into smaller pieces, called packets, when sending it over a network. diff --git a/app/assets/markdown/apcsp-pair-algorithms.md b/app/assets/markdown/apcsp-pair-algorithms.md new file mode 100644 index 00000000000..d613c76374c --- /dev/null +++ b/app/assets/markdown/apcsp-pair-algorithms.md @@ -0,0 +1,35 @@ +##### Activity +# Pair Design and Programming + +### Learning Objectives: +- [LO 2.2.1] Develop an abstraction when writing a program or creating other computational artifacts. [P2] +- [LO 2.2.2] Use multiple levels of abstraction to write programs. [P3] +- [LO 2.2.3] Identify multiple levels of abstractions that are used when writing programs. [P3] +- [LO 4.1.1] Develop an algorithm for implementation in a program. [P2] +- [LO 4.1.2] Express an algorithm in a language. [P5] +- [LO 5.1.2] Develop a correct program to solve problems. [P2] +- [LO 5.1.3] Collaborate to develop a program. [P6] + +## What is Pair Design and Programming? + +Throughout this unit, students will learn about algorithms through a mix of discussion, exploration, and basic programming. At the end of the unit, the students will put their knowledge of algorithms and programming to use in order to complete the level Wakka Maul in the Introduction to Computer Science course on CodeCombat. In their collaboration, the students will work together to create algorithms, execute them in code, and analyze them. + +### What you need: +- Computers with access to CodeCombat. Each student pair should have one computer. + +Have the students navigate to Level 21, Wakka Maul, in CodeCombat’s Introduction to Computer Science course. Students will examine the level individually then take about five minutes to develop an abstraction for a program that can solve the level. Their abstraction can include a structure diagram or simply a general description of what their program will do. For example, perhaps they first move the character to the end of the hallway then move it to the nearest gem. + +Once the students have completed their abstractions, place them into groups of two. Give the students ten minutes to share their abstraction with their partner then write algorithms for both abstractions using either natural language or pseudocode. Circle around while the partner groups are working and encourage them to discuss their abstractions and algorithms outloud if necessary. + +Next, have each partner group implement both algorithms in code and analyze them. Their analysis should include which algorithm worked better and why. Each partner group will then work together to create additional algorithms to implement and analyze. Encourage them to rethink their original abstractions and algorithms to find an ideal solution. + +Finally, have each partner group submit a report describing the abstractions and algorithms they developed and their analysis of them. + +### Discussion Questions: +- How did you break up the problem into smaller, more manageable pieces? +- How did your abstraction for the program differ from your partner’s? +- How did you determine an algorithm for this level? +- How did your algorithm compare to your partner’s? +- Did you find it easier or harder to collaborate to develop an algorithm? Why? +- Which algorithm was the best? Which was the worst? Why? +- What are the multiple levels of abstraction that can be used in this program? diff --git a/app/assets/markdown/apcsp-personal-and-global-impact.md b/app/assets/markdown/apcsp-personal-and-global-impact.md index adb3bc89f6f..972050ec2fe 100644 --- a/app/assets/markdown/apcsp-personal-and-global-impact.md +++ b/app/assets/markdown/apcsp-personal-and-global-impact.md @@ -3,25 +3,17 @@ #### AP Computer Science Principles: Learning Objectives -[LO 1.2.2] Create a computational artifact using computing tools and techniques to solve a problem. [P2] - -[LO 1.2.3] Create a new computational artifact by combining or modifying existing artifacts. [P2] - -[LO 7.1.1] Explain how computing innovations affect communication, interaction, and cognition. [P4] - -[LO 7.1.2] Explain how people participate in a problem-solving process that scales. [P4] - -[LO 7.2.1] Explain how computing has impacted innovations in other fields. [P1] - -[LO 7.3.1] Analyze the beneficial and harmful effects of computing. [P4] - -[LO 7.4.1] Explain the connections between computing and real-world contexts, including economic, social, and cultural contexts. [P1] - -[LO 7.5.1] Access, manage, and attribute information using effective strategies. [P1] - -[LO 7.5.2] Evaluate online and print sources for appropriateness and credibility. [P5] +- [LO 1.2.2] Create a computational artifact using computing tools and techniques to solve a problem. [P2] +- [LO 1.2.3] Create a new computational artifact by combining or modifying existing artifacts. [P2] +- [LO 7.1.1] Explain how computing innovations affect communication, interaction, and cognition. [P4] +- [LO 7.1.2] Explain how people participate in a problem-solving process that scales. [P4] +- [LO 7.2.1] Explain how computing has impacted innovations in other fields. [P1] +- [LO 7.3.1] Analyze the beneficial and harmful effects of computing. [P4] +- [LO 7.4.1] Explain the connections between computing and real-world contexts, including economic, social, and cultural contexts. [P1] +- [LO 7.5.1] Access, manage, and attribute information using effective strategies. [P1] +- [LO 7.5.2] Evaluate online and print sources for appropriateness and credibility. [P5] -### What is the Emerging Technology Project? +## What is the Emerging Technology Project? The emerging technology project is a multi-day project that will allow students to apply what they have learned in Unit 7 through the creation of a computational artifact. Students will research an emerging technology and create some form of computational artifact to show what the technology is, how it works, and its impact on the world. ### What you need: diff --git a/app/assets/markdown/apcsp-refactoring.md b/app/assets/markdown/apcsp-refactoring.md new file mode 100644 index 00000000000..02d30b1b2d0 --- /dev/null +++ b/app/assets/markdown/apcsp-refactoring.md @@ -0,0 +1,78 @@ +##### Activity + +# Agrippa Refactored + +### Learning Objectives +- [LO 2.2.1] Develop an abstraction when writing a program or creating other computational artifacts. [P2] +- [LO 2.2.3] Identify multiple levels of abstractions that are used when writing programs. [P3] + +## Refactoring Code + +**Activity:** + +Have the students play [The Agrippa Defense](https://codecombat.com/play/level/the-agrippa-defense), which can be found in Computer Science 2. + +The obvious solution to this level uses an algorithm consisting of three levels of nested IF/ELSE statements: + +``` +while True: + enemy = hero.findNearestEnemy() + if enemy: + distance = hero.distanceTo(enemy) + if distance < 5: + if hero.isReady("cleave"): + hero.cleave(enemy) + else: + hero.attack(enemy) +``` + +Using multiple levels of abstraction, students can eventually simplify the core logic of the level to just three lines: + +``` +while True: + enemy = hero.findNearestEnemy() + cleaveOrAttack(enemy) +``` + +This code is much easier to understand at a glance, because it is a higher level of abstraction! + +Instruct the students to identify the pieces of logic that can be abstracted out in order to get from the first program to the second program. If they need help, you can guide them to two core abstractions: + +1. Determining if there is an appropriate enemy to target. +2. Determining the appropriate attack to use. + +### Abstraction 1: Determining if there is an appropriate enemy to target. + +The key to this abstraction is to create a function that accepts the `enemy` as a parameter, and returns false if the enemy is null (there is no enemy) or if the enemy is 5 or more meters away. It should return true if the enemy exists, and is closer than 5 meters. + +The code should look something like this: + +``` +def enemyInRange(enemy): + if not enemy: + return False + if hero.distanceTo(enemy) < 5: + return True + else: + return False +``` + +### Abstraction 2: Determining the appropriate attack to use. + +The key to this abstraction is to create a function that accepts the `enemy` as a parameter, and then uses the function from abstraction 1 in an `if` statement to make sure the enemy is appropriate to attack. If so, then use the `cleave` attack if it's ready, otherwise use a normal `attack`. The code should look something like this: + +``` +def cleaveOrAttack(enemy): + if enemyInRange(enemy): + if hero.isReady('cleave'): + hero.cleave(enemy) + else: + hero.attack(enemy) +``` + + + +### Discussion Questions: +- How does using abstraction to break a problem into smaller, separate, problems help make programs better? +- How does using abstractions make programs easier to understand? +- What other abstractions are used in computer programming? diff --git a/app/templates/teachers/ap-cs-principles-view.jade b/app/templates/teachers/ap-cs-principles-view.jade index 55620cc72b4..c25205061ef 100644 --- a/app/templates/teachers/ap-cs-principles-view.jade +++ b/app/templates/teachers/ap-cs-principles-view.jade @@ -36,6 +36,9 @@ block content br a(href="/teachers/resources/apcsp-binary-sequences") span Unit 2 Activity: Binary Sequences + br + a(href="/teachers/resources/apcsp-computing-lesson") + span Unit 2 Activity: Computing Lesson Project li div Unit 3: Algorithms @@ -47,10 +50,13 @@ block content | Curricular Requirements: CR1a, CR1b, CR1c, CR1d, CR1e, CR1f, CR2b, CR2d, CR2e br a(href="/teachers/resources/apcsp-hitchhikers-guide") - span Unit 3 Activity: Algorithms + span Unit 3 Activity: Algorithms - Hitchhiker's Guide br a(href="/teachers/resources/apcsp-simulation") - span Unit 3 Activity: Simulation + span Unit 3 Activity: Simulation - Predator & Prey + br + a(href="/teachers/resources/apcsp-pair-algorithms") + span Unit 3 Activity: Algorithms - Pair Design and Programming li div Unit 4: Programming @@ -66,6 +72,10 @@ block content br a(href="/teachers/resources/apcsp-search-sort") span Unit 4 Activity: Searching & Sorting + br + a(href="/teachers/resources/apcsp-refactoring") + span Unit 4 Activity: Refactoring + li div Unit 5: The Internet p @@ -77,6 +87,9 @@ block content br a(href="/teachers/resources/apcsp-internet-simulation") span Unit 5 Activity: The Internet + br + a(href="/teachers/resources/apcsp-internet-chat-simulation") + span Unit 5 Activity: Chat Room Simulation li div Unit 6: Data From 7ff652f8e724da7645730563a79e3f04b89e2446 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Thu, 31 Aug 2017 14:14:05 -0700 Subject: [PATCH 061/227] Allow non-smoketest codecombat emails to use intercom --- app/core/utils.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/utils.coffee b/app/core/utils.coffee index e11b6ef63f9..eff42ed30f2 100644 --- a/app/core/utils.coffee +++ b/app/core/utils.coffee @@ -233,7 +233,7 @@ isID = (id) -> _.isString(id) and id.length is 24 and id.match(/[a-f0-9]/gi)?.le isRegionalSubscription = (name) -> /_basic_subscription/.test(name) isSmokeTestEmail = (email) -> - /@example.com/.test(email) or /smoketest/.test(email) or /@codecombat.com/.test(email) + /@example.com/.test(email) or /smoketest/.test(email) round = _.curry (digits, n) -> n = +n.toFixed(digits) From 2ecb02671a771bea496af5ed4620cba80097b44b Mon Sep 17 00:00:00 2001 From: Fernanda Rodrigues Date: Fri, 1 Sep 2017 12:11:23 +0100 Subject: [PATCH 062/227] fixing text overflow in pt-br content e translating content. --- app/locale/pt-BR.coffee | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index f0b1dd84523..4b10268a370 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -652,7 +652,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " subscribe: premium_already_subscribed: "Você já se inscreveu como Premium!" subscribe_modal_title: "CodeCombat Premium" - comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" # {change} + comparison_blurb: "Seja um programador. Faça a inscrição Premium hoje!" # {change} premium_pricing_prefix: "Seja Premium por apenas" premium_pricing_suffix: "e se torne um programador." premium: "Premium" # Make sure the following feature translations don't go onto two lines @@ -775,12 +775,12 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " get_premium: "Assine
CodeCombat
Premium" # Fit into the banner on the /features page master_coder: "Torne-se um programador assinando hoje!" subscribe_now: "Assine Agora" - hero_blurb_1: "Ganhe acesso a __premiumHeroesCount__ heróis exclusivos para assinantes! Apoveite o poder imparável de Okar Stompfoot, a precisão mortal Naria of the Leaf, ou convoque esqueletos \"adoráveis\" com Nalfar Cryptor." - hero_blurb_2: "Os guerreiros desbloqueiam habilidades especiais como Grito de Guerra, Stomp e Lançar Heróis. Ou, jogue como um Patrulheiro usando discrição e arcos, jogando facas, armadilhas! Experimente sua habilidade como um autêntico Feiticeiro Programador e desenhe uma poderosa matriz de magia Primordial, Necromântica ou Elementar!" + hero_blurb_1: "Ganhe acesso a __premiumHeroesCount__ heróis exclusivos para assinantes! Aproveite o força de Okar Stompfoot, a precisão de Naria of the Leaf, ou convoque esqueletos \"adoráveis\" com Nalfar Cryptor." + hero_blurb_2: "Os guerreiros desbloqueiam habilidades especiais como Grito de Guerra, Stomp e Lançar Heróis. Ou, jogue como um Patrulheiro usando arcos, facas, armadilhas! Teste suas habilidades como um autêntico Feiticeiro Programador e desenhe uma poderosa matriz de magia Primordial, Necromântica ou Elementar!" hero_caption: "Novos heróis emocionantes!" - pet_blurb_1: "Os animais de estimação não são apenas companheiros adoráveis, eles também oferecem funcionalidades e métodos únicos. O Grifo bebê pode transportar unidades através do ar, o Lobo Filhote pega as flechas inimigas, o Puma gosta de perseguir ogros e o Mimic atrai moedas como um ímã!" + pet_blurb_1: "Os animais de estimação (pets) não são apenas companheiros adoráveis, eles também oferecem funcionalidades e métodos únicos. O Grifo bebê pode transportar unidades através do ar, o Lobo Filhote pega as flechas inimigas, o Puma gosta de perseguir ogros e o Mimic atrai moedas como um ímã!" pet_blurb_2: "Colecione todos os animais de estimação para descobrir suas habilidades únicas!" - pet_caption: "Adote animais de estimação para acompanhar o seu herói!" + pet_caption: "Adote pets para acompanhar o seu herói!" game_dev_blurb: "Aprenda a criar jogos e novos níveis para compartilhar com seus amigos! Coloque os itens que deseja, escreva o código para lógica e comportamento das unidades e veja se seus amigos podem vencer o nível!" game_dev_caption: "Crie seus próprios jogos para desafiar seus amigos!" everything_in_premium: "Tudo o que você tem direito com o CodeCombat Premium:" @@ -799,7 +799,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " programming_language_description: "Qual Linguagem de Programação você gostaria de usar?" default: "Padrão" experimental: "Experimental" - python_blurb: "Simples mas poderosa, Python é uma linguagem de programação de uso geral." + python_blurb: "Simples, porém poderosa, é ótima para iniciantes e especialistas." javascript_blurb: "A linguagem da web." coffeescript_blurb: "Sintaxe de JavaScript mais legal." lua_blurb: "Linguagem de script para jogos." @@ -1268,7 +1268,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " remove_student: "remover aluno" # assign: "Assign" # to_assign: "to assign paid courses." -# student: "Student" + student: "Estudante" teacher: "Professor" # arena: "Arena" available_levels: "Fases disponíveis" @@ -1288,7 +1288,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " my_classes: "Turmas Atuais" # class_added: "Class successfully added!" view_levels: "visualizar todas as fases no curso" -# view_project_gallery: "view my classmates' projects" +# view_project_gallery: "veja os projetos dos seus colegas" join_class: "JUNTE - SE A UMA TURMA" # join_class_2: "Join class" ask_teacher_for_code: "Pergunte ao seu professor se você tem o código de uma turma do CodeCombat! Se sim, insira - o abaixo:" @@ -1385,10 +1385,10 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " # course_membership_required_to_play: "You'll need to join a course to play this level." # license_required_to_play: "Ask your teacher to assign a license to you so you can continue to play CodeCombat!" -# project_gallery: -# no_projects_published: "Be the first to publish a project in this course!" -# view_project: "View Project" -# edit_project: "Edit Project" + project_gallery: + no_projects_published: "Seja o primeiro a publicar um projeto neste curso!" + view_project: "Visualizar Projeto" + edit_project: "Editar Projeto" teacher: # assigning_course: "Assigning course" From efebaf3a77cb84ca0f42aa897d4c5b4650b34731 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Fri, 1 Sep 2017 08:06:12 -0700 Subject: [PATCH 063/227] Redirect brazil subscriptions --- app/views/account/SubscriptionView.coffee | 3 +++ app/views/core/SubscribeModal.coffee | 3 +++ 2 files changed, 6 insertions(+) diff --git a/app/views/account/SubscriptionView.coffee b/app/views/account/SubscriptionView.coffee index 03516dba221..bfe3e257ca0 100644 --- a/app/views/account/SubscriptionView.coffee +++ b/app/views/account/SubscriptionView.coffee @@ -50,6 +50,9 @@ module.exports = class SubscriptionView extends RootView constructor: (options) -> super(options) + inBrazil = document.location.host is 'br.codecombat.com' + if inBrazil and not me.hasSubscription() + document.location.href = 'http://codecombat.net.br/' prepaidCode = utils.getQueryVariable '_ppc' @personalSub = new PersonalSub(@supermodel, prepaidCode) @recipientSubs = new RecipientSubs(@supermodel) diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index 4fe7bcb1034..a6b5e05341b 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -24,6 +24,9 @@ module.exports = class SubscribeModal extends ModalView 'click .back-to-products': 'onClickBackToProducts' constructor: (options={}) -> + if document.location.host is 'br.codecombat.com' + document.location.href = 'http://codecombat.net.br/' + super(options) @state = 'standby' if options.products From 96e8c2f8117cccad9029a14ddcdf8a6c99579f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernanda=20de=20Ara=C3=BAjo=20Gomes=20Rodrigues?= Date: Fri, 1 Sep 2017 17:25:33 +0100 Subject: [PATCH 064/227] Update pt-BR.coffee --- app/locale/pt-BR.coffee | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 0cf06ee87b5..bbdd598e711 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -652,11 +652,7 @@ module.exports = nativeDescription: "Português (Brasil)", englishDescription: " subscribe: premium_already_subscribed: "Você já se inscreveu como Premium!" subscribe_modal_title: "CodeCombat Premium" -<<<<<<< HEAD comparison_blurb: "Seja um programador. Faça a inscrição Premium hoje!" # {change} -======= - comparison_blurb: "Seja um programador - faça a inscrição Premium hoje!" ->>>>>>> 8a67450e2667dde8686f926d085e308fe98d9323 premium_pricing_prefix: "Seja Premium por apenas" premium_pricing_suffix: "e se torne um programador." premium: "Premium" # Make sure the following feature translations don't go onto two lines From d9f0d2cef62210a59514065983dcc0b881609fd9 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 5 Sep 2017 09:27:56 -0700 Subject: [PATCH 065/227] Remove erroring console.log --- server/middleware/versions.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/server/middleware/versions.coffee b/server/middleware/versions.coffee index ba618f3e23d..2e466be79e9 100644 --- a/server/middleware/versions.coffee +++ b/server/middleware/versions.coffee @@ -83,7 +83,6 @@ exports.saveNewVersion = wrap (doc, major=null) -> version.isLatestMinor = false raw = yield latest.update({$set: {version: version}, $unset: {index: 1, slug: 1}}) if not raw.nModified - console.error('Conditions', conditions) console.error('Doc', doc) console.error('Raw response', raw) throw new errors.InternalServerError('Latest version could not be modified.') From cf9ba1d59ea8312cf9ce1402a5b30b09ff33b417 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 5 Sep 2017 12:00:23 -0700 Subject: [PATCH 066/227] Fix fetch-json overwriting options object --- app/core/api/classrooms.coffee | 1 - app/core/api/fetch-json.coffee | 3 ++- test/app/core/api/fetch-json.spec.coffee | 31 ++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test/app/core/api/fetch-json.spec.coffee diff --git a/app/core/api/classrooms.coffee b/app/core/api/classrooms.coffee index ac84f105916..e8e3532bcc1 100644 --- a/app/core/api/classrooms.coffee +++ b/app/core/api/classrooms.coffee @@ -18,7 +18,6 @@ module.exports = { options.remove = false jqxhrs = [] while skip < size - options = _.cloneDeep(options) options.data.memberSkip = skip jqxhrs.push(fetchJson(url, options)) skip += limit diff --git a/app/core/api/fetch-json.coffee b/app/core/api/fetch-json.coffee index 056e85c8823..833436f321a 100644 --- a/app/core/api/fetch-json.coffee +++ b/app/core/api/fetch-json.coffee @@ -12,6 +12,7 @@ ### fetchWrapper = (url, options={}) -> + options = _.cloneDeep(options) unless _.isUndefined(options.json) options.headers ?= {} options.headers['content-type'] = 'application/json' @@ -32,6 +33,6 @@ fetchWrapper = (url, options={}) -> else # old style (handler) raw text response. Wrap it in an object. return res.text().then (message) -> Promise.reject({message, code: res.status }) - return if isJson then res.json() else res.text() + return if isJson then res.json() else res.text() module.exports = fetchWrapper diff --git a/test/app/core/api/fetch-json.spec.coffee b/test/app/core/api/fetch-json.spec.coffee new file mode 100644 index 00000000000..88c740cbfd1 --- /dev/null +++ b/test/app/core/api/fetch-json.spec.coffee @@ -0,0 +1,31 @@ +fetchJson = require('core/api/fetch-json') + +describe 'fetchJson', -> + beforeEach -> + spyOn(window, 'fetch').and.returnValue(Promise.resolve({ + status: 200 + json: -> {} + text: -> '{}' + headers: { + get: (attr) -> + if attr is 'content-type' + return 'application/json' + else + throw new Error("Tried to access a value on the response that we didn't stub!") + } + })) + + it 'should leave the original `options` intact', -> + options = { + url: 'foo' + json: { + thing: 'stuff' + } + data: { + something: 1 + another: 30 + } + } + originalOptions = _.cloneDeep(options) + fetchJson("/db/classroom/classroomID/courses/courseID/levels", options) + expect(options).toDeepEqual(originalOptions) From ff6ac83f6a1c98b0662f4bd8223abbf47393cd93 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 5 Sep 2017 16:46:47 -0700 Subject: [PATCH 067/227] Disallow selecting spell palette entries Otherwise users can drag and drop, and the text is not set up to work properly that way. --- app/styles/play/level/tome/spell_palette_entry.sass | 1 + 1 file changed, 1 insertion(+) diff --git a/app/styles/play/level/tome/spell_palette_entry.sass b/app/styles/play/level/tome/spell_palette_entry.sass index fed46a87b4d..7e8dc175d4a 100644 --- a/app/styles/play/level/tome/spell_palette_entry.sass +++ b/app/styles/play/level/tome/spell_palette_entry.sass @@ -24,6 +24,7 @@ span cursor: pointer + user-select: none &:hover color: #f3cd90 From ad6d9ac0fd6cb9c6b67b4f7a53f5447493581727 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 6 Sep 2017 09:28:33 -0700 Subject: [PATCH 068/227] Make "peasants and munchkins" level teacher, student accessible --- app/views/play/level/PlayLevelView.coffee | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee index 7eac572581e..740f71d2c15 100644 --- a/app/views/play/level/PlayLevelView.coffee +++ b/app/views/play/level/PlayLevelView.coffee @@ -154,7 +154,14 @@ module.exports = class PlayLevelView extends RootView onLevelLoaded: (e) -> return if @destroyed - if (me.isStudent() or me.isTeacher()) and not @courseID and not e.level.isType('course-ladder') + if _.all([ + (me.isStudent() or me.isTeacher()), + not @courseID, + not e.level.isType('course-ladder') + + # TODO: Add a general way for standalone levels to be accessed by students, teachers + e.level.get('slug') isnt 'peasants-and-munchkins' + ]) return _.defer -> application.router.redirectHome() unless e.level.isType('web-dev') From f2e5ca05c12fb477bfeefa771236da500948d4cb Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 5 Sep 2017 14:44:53 -0700 Subject: [PATCH 069/227] Refactor AnalyticsLogEvent on server and client * handler -> middleware * Backbone model/supermodel -> api * Add a test * Be explicit about returning the doc promise in the model's logEvent function The handler also had a good chunk of logic that wasn't being used anywhere, was partially migrated a while ago to the 'per day' analytics handler. The model also wasn't being used anywhere in the app; the Tracker was calling the supermodel directly with the url. --- app/core/Tracker.coffee | 8 +- app/core/api/analytics-log-events.coffee | 12 + app/core/api/index.coffee | 1 + app/models/AnalyticsLogEvent.coffee | 6 - server/commons/mapping.coffee | 2 - .../analytics_log_event_handler.coffee | 315 ------------------ server/middleware/analytics-log-events.coffee | 27 ++ server/middleware/index.coffee | 1 + server/models/AnalyticsLogEvent.coffee | 13 +- server/routes/index.coffee | 2 + .../analytics-log-events.spec.coffee | 62 ++++ 11 files changed, 119 insertions(+), 330 deletions(-) create mode 100644 app/core/api/analytics-log-events.coffee delete mode 100644 app/models/AnalyticsLogEvent.coffee delete mode 100644 server/handlers/analytics_log_event_handler.coffee create mode 100644 server/middleware/analytics-log-events.coffee create mode 100644 spec/server/functional/analytics-log-events.spec.coffee diff --git a/app/core/Tracker.coffee b/app/core/Tracker.coffee index 5b4c85eb5ec..28617d8f9a5 100644 --- a/app/core/Tracker.coffee +++ b/app/core/Tracker.coffee @@ -3,6 +3,7 @@ SuperModel = require 'models/SuperModel' utils = require 'core/utils' CocoClass = require 'core/CocoClass' loadSegmentIo = require('core/services/segment') +api = require('core/api') debugAnalytics = false targetInspectJSLevelSlugs = ['cupboards-of-kithgard'] @@ -210,12 +211,7 @@ module.exports = class Tracker extends CocoClass properties[key] = value for key, value of @explicitTraits if @explicitTraits? console.log 'Tracking internal analytics event:', event, properties if debugAnalytics - request = @supermodel.addRequestResource { - url: '/db/analytics.log.event/-/log_event' - data: {event: event, properties: properties} - method: 'POST' - }, 0 - request.load() + api.analyticsLogEvents.post({event, properties}) trackTiming: (duration, category, variable, label) -> # https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings diff --git a/app/core/api/analytics-log-events.coffee b/app/core/api/analytics-log-events.coffee new file mode 100644 index 00000000000..117b9db0d6f --- /dev/null +++ b/app/core/api/analytics-log-events.coffee @@ -0,0 +1,12 @@ +fetchJson = require './fetch-json' + +module.exports = { + post: ({event, properties}, options) -> + fetchJson('/db/analytics.log.event/-/log_event', _.assign({}, options, { + method: 'POST', + json: { + event, + properties + } + })) +} diff --git a/app/core/api/index.coffee b/app/core/api/index.coffee index c6775c9ef73..59af656b8fc 100644 --- a/app/core/api/index.coffee +++ b/app/core/api/index.coffee @@ -1,5 +1,6 @@ module.exports = { admin: require('./admin') + analyticsLogEvents: require('./analytics-log-events') campaigns: require('./campaigns') classrooms: require('./classrooms') courses: require('./courses') diff --git a/app/models/AnalyticsLogEvent.coffee b/app/models/AnalyticsLogEvent.coffee deleted file mode 100644 index 7b631ef3df5..00000000000 --- a/app/models/AnalyticsLogEvent.coffee +++ /dev/null @@ -1,6 +0,0 @@ -CocoModel = require './CocoModel' - -module.exports = class AnalyticsLogEvent extends CocoModel - @className: 'AnalyticsLogEvent' - @schema: require 'schemas/models/analytics_log_event' - urlRoot: '/db/analytics.log.event' diff --git a/server/commons/mapping.coffee b/server/commons/mapping.coffee index 9438487673a..55b733e74c9 100644 --- a/server/commons/mapping.coffee +++ b/server/commons/mapping.coffee @@ -1,5 +1,4 @@ module.exports.handlers = - 'analytics_log_event': 'handlers/analytics_log_event_handler' 'analytics_perday': 'handlers/analytics_perday_handler' 'analytics_string': 'handlers/analytics_string_handler' 'analytics_stripe_invoice': 'handlers/analytics_stripe_invoice_handler' @@ -30,7 +29,6 @@ module.exports.handlers = 'user_polls_record': 'handlers/user_polls_record_handler' module.exports.handlerUrlOverrides = - 'analytics_log_event': 'analytics.log.event' 'analytics_stripe_invoice': 'analytics.stripe.invoice' 'level_component': 'level.component' 'level_feedback': 'level.feedback' diff --git a/server/handlers/analytics_log_event_handler.coffee b/server/handlers/analytics_log_event_handler.coffee deleted file mode 100644 index b2bac8b64fb..00000000000 --- a/server/handlers/analytics_log_event_handler.coffee +++ /dev/null @@ -1,315 +0,0 @@ -log = require 'winston' -mongoose = require 'mongoose' -utils = require '../lib/utils' -AnalyticsLogEvent = require './../models/AnalyticsLogEvent' -Campaign = require '../models/Campaign' -Level = require '../models/Level' -Handler = require '../commons/Handler' - -class AnalyticsLogEventHandler extends Handler - modelClass: AnalyticsLogEvent - jsonSchema: require '../../app/schemas/models/analytics_log_event' - editableProperties: [ - 'e' - 'p' - 'event' - 'properties' - ] - - hasAccess: (req) -> - req.method in ['POST'] or req.user?.isAdmin() - - makeNewInstance: (req) -> - instance = super(req) - instance.set('u', req.user._id) - # TODO: Remove 'user' after we stop querying for it (probably 30 days, ~2/16/15) - instance.set('user', req.user._id) - instance - - getByRelationship: (req, res, args...) -> - return @logEvent(req, res) if args[1] is 'log_event' - # TODO: Remove these APIs - # return @getLevelCompletionsBySlug(req, res) if args[1] is 'level_completions' - # return @getCampaignCompletionsBySlug(req, res) if args[1] is 'campaign_completions' - super(arguments...) - - logEvent: (req, res) -> - # Converts strings to string IDs where possible, and logs the event - user = req.user?._id - event = req.query.event or req.body.event - properties = req.query.properties or req.body.properties - @sendSuccess res # Return request immediately - AnalyticsLogEvent.logEvent user, event, properties - - getLevelCompletionsBySlug: (req, res) -> - # Returns an array of per-day level starts and finishes - # Parameters: - # slug - level slug - # startDay - Inclusive, optional, e.g. '2014-12-14' - # endDay - Exclusive, optional, e.g. '2014-12-16' - - # TODO: An uncached call can take over 50s locally - # TODO: mapReduce() was slower than find() - - levelSlug = req.query.slug or req.body.slug - startDay = req.query.startDay or req.body.startDay - endDay = req.query.endDay or req.body.endDay - - return @sendSuccess res, [] unless levelSlug? - - # log.warn "level_completions levelSlug='#{levelSlug}' startDay=#{startDay} endDay=#{endDay}" - - # Cache results for 1 day - @levelCompletionsCache ?= {} - @levelCompletionsCachedSince ?= new Date() - if (new Date()) - @levelCompletionsCachedSince > 86400 * 1000 # Dumb cache expiration - @levelCompletionsCache = {} - @levelCompletionsCachedSince = new Date() - cacheKey = levelSlug - cacheKey += 's' + startDay if startDay? - cacheKey += 'e' + endDay if endDay? - return @sendSuccess res, levelCompletions if levelCompletions = @levelCompletionsCache[cacheKey] - - levelDateMap = {} - - # Build query - queryParams = {$and: [ - {$or: [{"event" : 'Started Level'}, {"event" : 'Saw Victory'}]} - ]} - queryParams["$and"].push _id: {$gte: utils.objectIdFromTimestamp(startDay + "T00:00:00.000Z")} if startDay? - queryParams["$and"].push _id: {$lt: utils.objectIdFromTimestamp(endDay + "T00:00:00.000Z")} if endDay? - - # Query stream is better for large results - # http://mongoosejs.com/docs/api.html#query_Query-stream - stream = AnalyticsLogEvent.find(queryParams).select('created event properties user').stream() - stream.on 'data', (item) => - # Build per-level-day started and finished counts - created = item.get('created').toISOString().substring(0, 10) - event = item.get('event') - properties = item.get('properties') - if properties.level? then level = properties.level.toLowerCase().replace new RegExp(' ', 'g'), '-' - else if properties.levelID? then level = properties.levelID - else return - user = item.get('user') - - # log.warn "level_completions data " + " " + created + " " + event + " " + level - - levelDateMap[level] ?= {} - levelDateMap[level][created] ?= {} - levelDateMap[level][created]['finished'] ?= {} - levelDateMap[level][created]['started'] ?= {} - if event is 'Saw Victory' then levelDateMap[level][created]['finished'][user] = true - else levelDateMap[level][created]['started'][user] = true - .on 'error', (err) => - return @sendDatabaseError res, err - .on 'close', () => - # Build list of level completions - # Cache every level, since we had to grab all this data anyway - completions = {} - for level of levelDateMap - completions[level] = [] - for created, item of levelDateMap[level] - completions[level].push - level: level - created: created - started: Object.keys(item.started).length - finished: Object.keys(item.finished).length - cacheKey = level - cacheKey += 's' + startDay if startDay? - cacheKey += 'e' + endDay if endDay? - @levelCompletionsCache[cacheKey] = completions[level] - unless levelSlug of completions then completions[levelSlug] = [] - @sendSuccess res, completions[levelSlug] - - getCampaignCompletionsBySlug: (req, res) -> - # Returns a dictionary of per-campaign level starts, finishes, and drop-offs - # Drop-off: last started or finished level event - # Parameters: - # slugs - array of campaign slugs - # startDay - Inclusive, optional, e.g. '2014-12-14' - # endDay - Exclusive, optional, e.g. '2014-12-16' - - # TODO: Must be a better way to organize this series of database calls (campaigns, levels, analytics) - # TODO: An uncached call can take over 50s locally - # TODO: Returns all the campaigns - # TODO: Calculate overall campaign stats - # TODO: Assumes db campaign levels are in progression order. Should build this based on actual progression. - # TODO: Remove earliest duplicate event so our dropped counts will be more accurate. - - campaignSlug = req.query.slug or req.body.slug - startDay = req.query.startDay or req.body.startDay - endDay = req.query.endDay or req.body.endDay - - # log.warn "campaign_completions campaignSlug='#{campaignSlug}' startDay=#{startDay} endDay=#{endDay}" - - return @sendSuccess res, [] unless campaignSlug? - - # Cache results for 1 day - @campaignDropOffsCache ?= {} - @campaignDropOffsCachedSince ?= new Date() - if (new Date()) - @campaignDropOffsCachedSince > 86400 * 1000 # Dumb cache expiration - @campaignDropOffsCache = {} - @campaignDropOffsCachedSince = new Date() - cacheKey = campaignSlug - cacheKey += 's' + startDay if startDay? - cacheKey += 'e' + endDay if endDay? - return @sendSuccess res, campaignDropOffs if campaignDropOffs = @campaignDropOffsCache[cacheKey] - - getCompletions = (campaigns, userProgression) => - # Calculate campaign drop off rates - # Input: - # campaigns - per-campaign dictionary of ordered level slugs - # userProgression - per-user event lists - - # Remove duplicate user events - for user of userProgression - userProgression[user] = _.uniq userProgression[user], false, (val, index, arr) -> val.event + val.level - - # Order user progression by created - for user of userProgression - userProgression[user].sort (a,b) -> if a.created < b.created then return -1 else 1 - - # Per-level start/drop/finish/drop - levelProgression = {} - for user of userProgression - for i in [0...userProgression[user].length] - event = userProgression[user][i].event - level = userProgression[user][i].level - levelProgression[level] ?= - started: 0 - startDropped: 0 - finished: 0 - finishDropped: 0 - if event is 'Started Level' - levelProgression[level].started++ - levelProgression[level].startDropped++ if i is userProgression[user].length - 1 - else if event is 'Saw Victory' - levelProgression[level].finished++ - levelProgression[level].finishDropped++ if i is userProgression[user].length - 1 - - # Put in campaign order - completions = {} - for level of levelProgression - for campaign of campaigns - if level in campaigns[campaign] - started = levelProgression[level].started - startDropped = levelProgression[level].startDropped - finished = levelProgression[level].finished - finishDropped = levelProgression[level].finishDropped - completions[campaign] ?= - levels: [] - # overall: - # started: 0, - # startDropped: 0, - # finished: 0, - # finishDropped: 0 - completions[campaign].levels.push - level: level - started: started - startDropped: startDropped - finished: finished - finishDropped: finishDropped - break - - # Sort level data by campaign order - for campaign of completions - completions[campaign].levels.sort (a, b) -> - if campaigns[campaign].indexOf(a.level) < campaigns[campaign].indexOf(b.level) then return -1 else 1 - - # Return all campaign data for simplicity - # Cache other individual campaigns too, since we have them - @campaignDropOffsCache[cacheKey] = completions - for campaign of completions - cacheKey = campaign - cacheKey += 's' + startDay if startDay? - cacheKey += 'e' + endDay if endDay? - @campaignDropOffsCache[cacheKey] = completions - unless campaignSlug of completions then completions[campaignSlug] = levels: [] - @sendSuccess res, completions - - getUserEventData = (campaigns) => - # Gather user start and finish event data - # Input: - # campaigns - per-campaign dictionary of ordered level slugs - # Output: - # userProgression - per-user event lists - - userProgression = {} - - queryParams = {$and: [{$or: [ {"event" : 'Started Level'}, {"event" : 'Saw Victory'}]}]} - queryParams["$and"].push _id: {$gte: utils.objectIdFromTimestamp(startDay + "T00:00:00.000Z")} if startDay? - queryParams["$and"].push _id: {$lt: utils.objectIdFromTimestamp(endDay + "T00:00:00.000Z")} if endDay? - - # Query stream is better for large results - # http://mongoosejs.com/docs/api.html#query_Query-stream - stream = AnalyticsLogEvent.find(queryParams).select('created event properties user').stream() - stream.on 'data', (item) => - created = item.get('created') - event = item.get('event') - if event is 'Saw Victory' - level = item.get('properties.level').toLowerCase().replace new RegExp(' ', 'g'), '-' - else - level = item.get('properties.levelID') - return unless level? - user = item.get('user') - userProgression[user] ?= [] - userProgression[user].push - created: created - event: event - level: level - .on 'error', (err) => - return @sendDatabaseError res, err - .on 'close', () => - getCompletions campaigns, userProgression - - getLevelData = (campaigns, campaignLevelIDs) => - # Get level data and replace levelIDs with level slugs in campaigns - # Input: - # campaigns - per-campaign dictionary of ordered levelIDs - # campaignLevelIDs - dictionary of all campaign levelIDs - # Output: - # campaigns - per-campaign dictionary of ordered level slugs - - Level.find({original: {$in: campaignLevelIDs}, "version.isLatestMajor": true, "version.isLatestMinor": true}).exec (err, documents) => - if err? then return @sendDatabaseError res, err - - levelSlugMap = {} - for doc in documents - levelID = doc.get('original') - levelSlug = doc.get('name').toLowerCase().replace new RegExp(' ', 'g'), '-' - levelSlugMap[levelID] = levelSlug - - # Replace levelIDs with level slugs - for campaign of campaigns - mapFn = (item) -> levelSlugMap[item] - campaigns[campaign] = _.map campaigns[campaign], mapFn, @ - - getUserEventData campaigns - - getCampaignData = () => - # Get campaign data - # Output: - # campaigns - per-campaign dictionary of ordered levelIDs - # campaignLevelIDs - dictionary of all campaign levelIDs - - Campaign.find().exec (err, documents) => - if err? then return @sendDatabaseError res, err - - campaigns = {} - levelCampaignMap = {} - campaignLevelIDs = [] - for doc in documents - slug = doc.get('slug') - levels = doc.get('levels') - campaigns[slug] = [] - levelCampaignMap[slug] = {} - for levelID of levels - campaigns[slug].push levelID - campaignLevelIDs.push levelID - levelCampaignMap[levelID] = slug - - getLevelData campaigns, campaignLevelIDs - - getCampaignData() - -module.exports = new AnalyticsLogEventHandler() diff --git a/server/middleware/analytics-log-events.coffee b/server/middleware/analytics-log-events.coffee new file mode 100644 index 00000000000..8bc73f4806b --- /dev/null +++ b/server/middleware/analytics-log-events.coffee @@ -0,0 +1,27 @@ +wrap = require 'co-express' +AnalyticsLogEvent = require '../models/AnalyticsLogEvent' +slack = require '../slack' +database = require '../commons/database' + +post = wrap (req, res) -> + # Converts strings to string IDs where possible, and logs the event + user = req.user?._id + { event, properties } = req.body + + doc = new AnalyticsLogEvent({ + user: user + event: event + properties: properties + }) + database.validateDoc(doc) + + res.status(201).send({}) + try + yield doc.save() + catch e + slack.sendSlackMessage("Event '#{event}' with props #{properties} not created because #{e.message}.", ['#ops']) + # response already created + +module.exports = { + post +} diff --git a/server/middleware/index.coffee b/server/middleware/index.coffee index f31f7369279..e616fa1d519 100644 --- a/server/middleware/index.coffee +++ b/server/middleware/index.coffee @@ -1,6 +1,7 @@ module.exports = achievements: require './achievements' admin: require './admin' + analyticsLogEvents: require './analytics-log-events' api: require './api' auth: require './auth' branches: require './branches' diff --git a/server/models/AnalyticsLogEvent.coffee b/server/models/AnalyticsLogEvent.coffee index e43791d2298..fcca4407f3e 100644 --- a/server/models/AnalyticsLogEvent.coffee +++ b/server/models/AnalyticsLogEvent.coffee @@ -4,6 +4,7 @@ plugins = require '../plugins/plugins' utils = require '../lib/utils' http = require 'http' config = require '../../server_config' +jsonschema = require '../../app/schemas/models/analytics_log_event' AnalyticsLogEventSchema = new mongoose.Schema({ user: String #Actually a `mongoose.Schema.Types.ObjectId` but ... @@ -15,6 +16,16 @@ AnalyticsLogEventSchema.index({event: 1, _id: -1}) AnalyticsLogEventSchema.index({event: 1, 'properties.level': 1}) AnalyticsLogEventSchema.index({event: 1, 'properties.levelID': 1}) AnalyticsLogEventSchema.index({user: 1, event: 1}) +AnalyticsLogEventSchema.statics.jsonSchema = jsonschema + +if global.testing + AnalyticsLogEventSchema.pre('save', (next) -> + # for testing + if AnalyticsLogEvent.errorOnSave + next(new Error('stap')) + else + next() +) AnalyticsLogEventSchema.statics.logEvent = (user, event, properties={}) -> unless user? @@ -26,7 +37,7 @@ AnalyticsLogEventSchema.statics.logEvent = (user, event, properties={}) -> event: event properties: properties - doc.save() + return doc.save() unless config.proxy analyticsMongoose = mongoose.createConnection config.mongo.analytics_replica_string, (error) -> diff --git a/server/routes/index.coffee b/server/routes/index.coffee index ef476b45b96..61be18b8667 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -61,6 +61,8 @@ module.exports.setup = (app) -> app.post('/db/achievement/:handle/patch', mw.auth.checkLoggedIn(), mw.patchable.postPatch(Achievement, 'achievement')) app.post('/db/achievement/:handle/watchers', mw.patchable.joinWatchers(Achievement)) app.delete('/db/achievement/:handle/watchers', mw.patchable.leaveWatchers(Achievement)) + + app.post('/db/analytics.log.event/-/log_event', mw.auth.checkHasUser(), mw.analyticsLogEvents.post) Article = require '../models/Article' app.get('/db/article', mw.rest.get(Article)) diff --git a/spec/server/functional/analytics-log-events.spec.coffee b/spec/server/functional/analytics-log-events.spec.coffee new file mode 100644 index 00000000000..7cbf9e20a91 --- /dev/null +++ b/spec/server/functional/analytics-log-events.spec.coffee @@ -0,0 +1,62 @@ +utils = require '../utils' +Promise = require 'bluebird' +AnalyticsLogEvent = require '../../../server/models/AnalyticsLogEvent' +slack = require '../../../server/slack' +request = require '../request' +mongoose = require 'mongoose' + +describe 'POST /db/analytics.log.event/-/log_event', -> + it 'posts an event to the log db', utils.wrap -> + user = yield utils.initUser() + yield utils.loginUser(user) + json = { + event: 'Some Name' + properties: { + 'some': 'property' + number: 1234 + } + } + url = utils.getUrl('/db/analytics.log.event/-/log_event') + [res] = yield request.postAsync({url, json}) + expect(res.statusCode).toBe(201) + yield new Promise((resolve) -> setTimeout(resolve, 50)) # make sure event gets created + events = yield AnalyticsLogEvent.find({user: user._id}) + expect(events.length).toBe(1) + expect(events[0].event).toBe(json.event) + expect(events[0].properties).toDeepEqual(json.properties) + expect(events[0].user).toBe(user.id) + + it 'ignores invalid events', utils.wrap -> + user = yield utils.initUser() + yield utils.loginUser(user) + json = { + event: false + properties: 1 + } + url = utils.getUrl('/db/analytics.log.event/-/log_event') + [res] = yield request.postAsync({url, json}) + expect(res.statusCode).toBe(422) + yield new Promise((resolve) -> setTimeout(resolve, 50)) + events = yield AnalyticsLogEvent.find({user: user._id}) + expect(events.length).toBe(0) + + it 'sends a slack message if the event fails to save', utils.wrap -> + AnalyticsLogEvent.errorOnSave = true + spyOn(slack, 'sendSlackMessage') + user = yield utils.initUser() + yield utils.loginUser(user) + json = { + event: 'Some Name' + properties: { + 'some': 'property' + number: 1234 + } + } + url = utils.getUrl('/db/analytics.log.event/-/log_event') + [res] = yield request.postAsync({url, json}) + expect(res.statusCode).toBe(201) + yield new Promise((resolve) -> setTimeout(resolve, 50)) # make sure event gets created + events = yield AnalyticsLogEvent.find({user: user._id}) + expect(events.length).toBe(0) + expect(slack.sendSlackMessage).toHaveBeenCalled() + AnalyticsLogEvent.errorOnSave = false From 8e84bc41792a7412d761209ee509ac7c35329f74 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 8 Sep 2017 14:24:42 -0700 Subject: [PATCH 070/227] :bug:Do not route students to /premium --- app/core/Router.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/Router.coffee b/app/core/Router.coffee index b2d23329361..bad157b833f 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -21,7 +21,7 @@ module.exports = class CocoRouter extends Backbone.Router return @routeDirectly 'play/CampaignView', ['picoctf'], {} if utils.getQueryVariable 'hour_of_code' return @navigate "/play?hour_of_code=true", {trigger: true, replace: true} - unless me.isAnonymous() or me.isTeacher() or me.isAdmin() or me.hasSubscription() + unless me.isAnonymous() or me.isStudent() or me.isTeacher() or me.isAdmin() or me.hasSubscription() delete window.alreadyLoadedView return @navigate "/premium", {trigger: true, replace: true} return @routeDirectly('HomeView', []) From 2520ddbc81049aa1da31d2bab73366f846998309 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 8 Sep 2017 14:27:53 -0700 Subject: [PATCH 071/227] Fix CreateAccountModal tests --- test/app/views/core/CreateAccountModal.spec.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/app/views/core/CreateAccountModal.spec.coffee b/test/app/views/core/CreateAccountModal.spec.coffee index 7c51e7ff6a5..6a3546be2ba 100644 --- a/test/app/views/core/CreateAccountModal.spec.coffee +++ b/test/app/views/core/CreateAccountModal.spec.coffee @@ -16,7 +16,7 @@ responses = { } -xdescribe 'CreateAccountModal', -> +describe 'CreateAccountModal', -> modal = null @@ -601,6 +601,7 @@ describe 'CreateAccountModal Vue Store', -> spyOn(api.users, 'signupWithFacebook').and.returnValue(Promise.resolve()) spyOn(api.users, 'signupWithPassword').and.returnValue(Promise.resolve()) spyOn(api.trialRequests, 'post').and.returnValue(Promise.resolve()) + spyOn(application.tracker, 'updateTrialRequestData').and.returnValue(Promise.resolve()) @dispatch = jasmine.createSpy() @commit = jasmine.createSpy() @rootState = { From 202f94c3c004807bb126883232bdf45a211a6600 Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Fri, 8 Sep 2017 14:38:37 -0700 Subject: [PATCH 072/227] Disable tests that still make travis unhappy --- test/app/views/core/CreateAccountModal.spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/app/views/core/CreateAccountModal.spec.coffee b/test/app/views/core/CreateAccountModal.spec.coffee index 6a3546be2ba..2a8d3031c93 100644 --- a/test/app/views/core/CreateAccountModal.spec.coffee +++ b/test/app/views/core/CreateAccountModal.spec.coffee @@ -16,7 +16,7 @@ responses = { } -describe 'CreateAccountModal', -> +xdescribe 'CreateAccountModal', -> modal = null From 7a20bb8576eded4346713dcb64d0de991c08120c Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Sun, 10 Sep 2017 13:03:26 -0700 Subject: [PATCH 073/227] Add delay to auth endpoints --- server/middleware/auth.coffee | 4 ++++ server/routes/index.coffee | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/server/middleware/auth.coffee b/server/middleware/auth.coffee index 4475f9354b4..a3bebbb9d37 100644 --- a/server/middleware/auth.coffee +++ b/server/middleware/auth.coffee @@ -19,6 +19,10 @@ OAuthProvider = require '../models/OAuthProvider' querystring = require 'querystring' module.exports = + authDelay: (req, res, next) -> + ms = 0 if global.testing + setTimeout(next, ms) + checkDocumentPermissions: (req, res, next) -> return next() if req.user?.isAdmin() if not req.doc.hasPermissionsForMethod(req.user, req.method) diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 61be18b8667..c40722248f8 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -27,11 +27,11 @@ module.exports.setup = (app) -> app.get('/api/playtime-stats', mw.api.getPlayTimeStats) passport = require('passport') - app.post('/auth/login', passport.authenticate('local'), mw.auth.afterLogin) - app.post('/auth/login-facebook', mw.auth.loginByFacebook, mw.auth.afterLogin) - app.post('/auth/login-gplus', mw.auth.loginByGPlus, mw.auth.afterLogin) - app.get('/auth/login-clever', mw.auth.loginByClever, mw.auth.redirectAfterLogin) - app.get('/auth/login-o-auth', mw.auth.loginByOAuthProvider, mw.auth.redirectOnError, mw.auth.redirectAfterLogin) + app.post('/auth/login', mw.auth.authDelay, passport.authenticate('local'), mw.auth.afterLogin) + app.post('/auth/login-facebook', mw.auth.authDelay, mw.auth.loginByFacebook, mw.auth.afterLogin) + app.post('/auth/login-gplus', mw.auth.authDelay, mw.auth.loginByGPlus, mw.auth.afterLogin) + app.get('/auth/login-clever', mw.auth.authDelay, mw.auth.loginByClever, mw.auth.redirectAfterLogin) + app.get('/auth/login-o-auth', mw.auth.authDelay, mw.auth.loginByOAuthProvider, mw.auth.redirectOnError, mw.auth.redirectAfterLogin) app.post('/auth/logout', mw.auth.logout) app.get('/auth/name/?(:name)?', mw.auth.name) app.get('/auth/email/?(:email)?', mw.auth.email) From 5c46f4f6ed4e8ec4d4dd9ad30639bc5bda0bf43f Mon Sep 17 00:00:00 2001 From: Federico Tomas Date: Sun, 10 Sep 2017 21:19:16 -0300 Subject: [PATCH 074/227] Update es-419.coffee Hey, long time!. --- app/locale/es-419.coffee | 68 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index ff0bc334e76..087dfb718b2 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -1445,7 +1445,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip started: "Iniciado" click_to_view_progress: "click para ver el progreso" no_progress: "Sin progreso" -# not_required: "Not required" + not_required: "No requerido" select_course: "Selecciona el curso a ver" # progress_color_key: "Progress color key:" # level_in_progress: "Level in Progress" @@ -1591,7 +1591,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # student_warn_detail: "This student might need some help with new concepts that have been introduced in this course." # student_great: "is doing great in" # student_great_detail: "This student might be a good candidate to help other students working through this course." -# full_license: "Full License" + full_license: "Licencia full" # starter_license: "Starter License" # trial: "Trial" # hoc_welcome: "Happy Computer Science Education Week" @@ -1618,9 +1618,9 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # remember_new_courses: "Remember to assign new courses!" # more_info: "More Info" # how_to_assign_courses: "How to Assign Courses" -# select_students: "Select Students" + select_students: "Seleccionar Estudiantes" # select_instructions: "Click the checkbox next to each student you want to assign courses to." -# choose_course: "Choose Course" + choose_course: "Elegir curso" # choose_instructions: "Select the course from the dropdown menu you’d like to assign, then click “Assign to Selected Students.”" # push_projects: "We recommend assigning Web Development 1 or Game Development 1 after students have finished Introduction to Computer Science! See our {{resource_hub}} for more details on those courses." # teacher_quest: "Teacher's Quest for Success" @@ -1687,8 +1687,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # victory_course_share_suffix: "you just created." # copy_url: "Copy URL" -# game_dev: -# creator: "Creator" + game_dev: + creator: "Creador" # web_dev: # image_gallery_title: "Image Gallery" @@ -1731,7 +1731,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip article_title: "Editor de Artículo" thang_title: "Editor de Tiliches" level_title: "Editor de Nivel" -# course_title: "Course Editor" + course_title: "Editor de Curso" achievement_title: "Editor de logros" poll_title: "Editor de Encuesta" back: "Atrás" @@ -2001,12 +2001,12 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip card: "Tarjeta" status_unsubscribed_active: "No estas suscrito y no se te cobrará, pero tu cuenta está activa por ahora." status_unsubscribed: "¡Obtén acceso a nuevos niveles, héroes, items y gemas extras con la suscripción a CodeCombat!" -# not_yet_verified: "Not yet verified." -# resend_email: "Resend email" -# email_sent: "Email sent! Check your inbox." -# verifying_email: "Verifying your email address..." -# successfully_verified: "You've successfully verified your email address!" -# verify_error: "Something went wrong when verifying your email :(" + not_yet_verified: "No verificado todavía." + resend_email: "Reenviar email" + email_sent: "¡Email enviado! Revisa tu casilla." + verifying_email: "Verificando tu email..." + successfully_verified: "¡Has verificado tu email con exito!" + verify_error: "Algo salio mal al verificar tu email :(" account_invoices: amount: "Cantidad en dólares." @@ -2074,10 +2074,10 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip campaigns: "Campañas" concepts: -# advanced_css_rules: "Advanced CSS Rules" -# advanced_css_selectors: "Advanced CSS Selectors" -# advanced_html_attributes: "Advanced HTML Attributes" -# advanced_html_tags: "Advanced HTML Tags" + advanced_css_rules: "Reglas CSS Avanzadas" + advanced_css_selectors: "Selectores CSS Avanzados" + advanced_html_attributes: "Atributos HTML Avanzados" + advanced_html_tags: "Etiquetas HTML Avanzados" # algorithm_average: "Algorithm Average" # algorithm_find_minmax: "Algorithm Find Min/Max" # algorithm_search_binary: "Algorithm Search Binary" @@ -2086,27 +2086,27 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # algorithm_sum: "Algorithm Sum" arguments: "Argumentos" arithmetic: "Aritmética" -# array_2d: "2D Array" + array_2d: "Array 2D" # array_index: "Array Indexing" # array_iterating: "Iterating Over Arrays" # array_literals: "Array Literals" # array_searching: "Array Searching" # array_sorting: "Array Sorting" arrays: "Arreglos" -# basic_css_rules: "Basic CSS rules" -# basic_css_selectors: "Basic CSS selectors" -# basic_html_attributes: "Basic HTML Attributes" -# basic_html_tags: "Basic HTML Tags" + basic_css_rules: "Reglas CSS Básicas" + basic_css_selectors: "Selectores CSS Básicos" + basic_html_attributes: "Atributos HTML Básicos" + basic_html_tags: "Etiquetas HTML Básicas" basic_syntax: "Sintaxis Básica" -# binary: "Binary" + binary: "Binario" # boolean_and: "Boolean And" # boolean_equality: "Boolean Equality" # boolean_greater_less: "Boolean Greater/Less" # boolean_logic_shortcircuit: "Boolean Logic Shortcircuiting" # boolean_not: "Boolean Not" # boolean_operator_precedence: "Boolean Operator Precedence" -# boolean_or: "Boolean Or" -# bootstrap: "Bootstrap" + boolean_or: "Booleano O" + bootstrap: "Bootstrap" break_statements: "Sentencias Break" classes: "Clases" continue_statements: "Sentencias Continue" @@ -2132,12 +2132,12 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip # input_handling_flags: "Input Handling - Flags" # input_handling_keyboard: "Input Handling - Keyboard" # input_handling_mouse: "Input Handling - Mouse" -# intermediate_css_rules: "Intermediate CSS Rules" -# intermediate_css_selectors: "Intermediate CSS Selectors" -# intermediate_html_attributes: "Intermediate HTML Attributes" -# intermediate_html_tags: "Intermediate HTML Tags" -# jquery: "jQuery" -# jquery_animations: "jQuery Animations" + intermediate_css_rules: "Reglas CSS Intermedias" + intermediate_css_selectors: "Selectores CSS Intermedios" + intermediate_html_attributes: "Atributos HTML Intermedios" + intermediate_html_tags: "Etiquetas HTML Intermedias" + jquery: "jQuery" + jquery_animations: "Animaciones jQuery" # jquery_filtering: "jQuery Element Filtering" # jquery_selectors: "jQuery Selectors" # length: "Array Length" @@ -2298,9 +2298,9 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip victory_sign_up_poke: "¡ABRE UNA CUENTA GRATUITA PARA GUARDAR TU CÓDIGO Y PARTICIPAR EN UN SORTEO DONDE PODRÁS GANAR PREAMIOS!" victory_sign_up: "REGÍSTRATE PARA PODER GANAR $50,000" -# server_error: -# email_taken: "Email already taken" -# username_taken: "Username already taken" + server_error: + email_taken: "Email ya utilizado" + username_taken: "El nombre de usuario ya existe" # esper: # line_no: "Line $1: " From 499d02c0aab462711dd537374736bb9a7a67a70c Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Mon, 11 Sep 2017 13:30:58 -0700 Subject: [PATCH 075/227] Add prod ms delay to auth endpoints --- server/middleware/auth.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/middleware/auth.coffee b/server/middleware/auth.coffee index a3bebbb9d37..b409b80bbe6 100644 --- a/server/middleware/auth.coffee +++ b/server/middleware/auth.coffee @@ -20,7 +20,7 @@ querystring = require 'querystring' module.exports = authDelay: (req, res, next) -> - ms = 0 if global.testing + ms = if global.testing then 0 else 500 setTimeout(next, ms) checkDocumentPermissions: (req, res, next) -> From 97f5bf56d273f8a68870d946314affa91d2a7ac3 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Mon, 11 Sep 2017 13:31:48 -0700 Subject: [PATCH 076/227] Have sass-brunch use normal version Was having trouble brunching style files, it was just selecting a handful. Upgrading to 1.9.2 fixed the issue. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be499884c48..0fb21e39877 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "parse-domain": "^0.2.1", "pg": "^6.1.2", "requirejs": "~2.1.10", - "sass-brunch": "https://github.com/basicer/sass-brunch-bleeding/archive/1.9.1-bleeding.tar.gz", + "sass-brunch": "^1.9.1", "telepath-brunch": "https://github.com/nwinter/telepath-brunch/tarball/master", "uglify-js": "^2.5.0" }, From 8bf1a22e528fa76117dcd51f9999aba3edfc714f Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Mon, 11 Sep 2017 13:32:33 -0700 Subject: [PATCH 077/227] Add extra domain fallback to setupCountryRedirectMiddleware We had a few 500 errors when neither of them had anything set, which apparently sometimes happens. --- server_setup.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_setup.coffee b/server_setup.coffee index d3b8bab3a64..17f3d2276fb 100644 --- a/server_setup.coffee +++ b/server_setup.coffee @@ -176,7 +176,7 @@ setupCountryTaggingMiddleware = (app) -> setupCountryRedirectMiddleware = (app, country='china', host='cn.codecombat.com') -> hosts = host.split /;/g shouldRedirectToCountryServer = (req) -> - reqHost = (req.hostname ? req.host).toLowerCase() # Work around express 3.0 + reqHost = (req.hostname ? req.host ? '').toLowerCase() # Work around express 3.0 return req.country is country and reqHost not in hosts and reqHost.indexOf(config.unsafeContentHostname) is -1 app.use (req, res, next) -> From f3383a0f5fa95a09b69e075e9dc1e06337ae091a Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Mon, 11 Sep 2017 22:32:38 -0700 Subject: [PATCH 078/227] Add coupon support for PayPal lifetime sub purchases --- server/middleware/products.coffee | 1 + server/middleware/subscriptions.coffee | 7 ++ .../functional/subscription.spec.coffee | 91 +++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/server/middleware/products.coffee b/server/middleware/products.coffee index 00e4f8d8066..39b79216938 100644 --- a/server/middleware/products.coffee +++ b/server/middleware/products.coffee @@ -120,6 +120,7 @@ productStubs = [ name: 'brazil_lifetime_subscription' amount: 1001 gems: 42000 + coupons: [{code: 'c1', amount: 10}, {code: 'c2', amount: 99}] } ] diff --git a/server/middleware/subscriptions.coffee b/server/middleware/subscriptions.coffee index 7bfb4f20261..497e8c8af0c 100644 --- a/server/middleware/subscriptions.coffee +++ b/server/middleware/subscriptions.coffee @@ -259,7 +259,14 @@ purchaseProduct = expressWrap (req, res) -> else if paymentType is 'paypal' { payerID, paymentID } = req.body + amount = product.get('amount') + if req.body.coupon? + coupon = _.find product.get('coupons'), ((x) -> x.code is req.body.coupon) + if not coupon? + throw new errors.NotFound('Coupon not found') + amount = coupon.amount + unless payerID and paymentID throw new errors.UnprocessableEntity('Must provide payerID and paymentID for PayPal purchases') execute_payment_json = { diff --git a/spec/server/functional/subscription.spec.coffee b/spec/server/functional/subscription.spec.coffee index 59f82ea7b38..4f17e310657 100644 --- a/spec/server/functional/subscription.spec.coffee +++ b/spec/server/functional/subscription.spec.coffee @@ -1105,6 +1105,97 @@ describe 'POST /db/products/:handle/purchase', -> expect(payment).toBeDefined() expect(payment.get('productID')).toBe(product.get('name')) expect(payment.get('payPal.id')).toBe(payPalResponse.id) + expect(payment.get('amount')).toBe(product.get('amount')) + user = yield User.findById(@user.id) + expect(user.get('stripe.free')).toBe(true) + expect(user.get('payPal').payerID).toEqual(payPalResponse.payer.payer_info.payer_id) + expect(user.hasSubscription()).toBeTruthy() + + it 'accepts PayPal payments with coupon', utils.wrap -> + # TODO: figure out how to create test payments through PayPal API, set this up with fixtures through Nock + + product = yield Product.findOne({ name: 'lifetime_subscription' }) + amount = product.get('coupons')[0].amount + url = utils.getUrl("/db/products/#{product.id}/purchase") + json = { service: 'paypal', paymentID: "PAY-74521676DM528663SLFT63RA", payerID: 'VUR529XNB59XY', coupon: 'c1' } + + payPalResponse = { + "id": "PAY-84848", + "intent": "sale", + "state": "approved", + "cart": "3J885", + "payer": { + "payment_method": "paypal", + "status": "VERIFIED", + "payer_info": { + "email": @user.get('email'), + "first_name": "test", + "last_name": "buyer", + "payer_id": "VUR529XNB59XY", + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + }, + "country_code": "US" + } + }, + "transactions": [ + { + "amount": { + "total": (amount/100).toFixed(2), + "currency": "USD", + "details": {} + }, + "payee": { + "merchant_id": "7R5CJJ", + "email": "payments@codecombat.com" + }, + "description": "Lifetime Subscription", + "item_list": { + "items": [ + { + "name": "lifetime_subscription", + "sku": product.id, + "price": (amount/100).toFixed(2), + "currency": "USD", + "quantity": 1 + } + ], + "shipping_address": { + "recipient_name": "test buyer", + "line1": "1 Main St", + "city": "San Jose", + "state": "CA", + "postal_code": "95131", + "country_code": "US" + } + }, + "related_resources": [] # bunch more info in here + } + ], + "create_time": "2017-07-13T22:35:45Z", + "links": [ + { + "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-034662230Y592723RLFT7LLA", + "rel": "self", + "method": "GET" + } + ], + "httpStatusCode": 200 + } + spyOn(paypal.payment, 'executeAsync').and.returnValue(Promise.resolve(payPalResponse)) + + [res] = yield request.postAsync({ url, json }) + expect(res.statusCode).toBe(200) + payment = yield Payment.findOne({"payPal.id":"PAY-84848"}) + expect(payment).toBeDefined() + expect(payment.get('productID')).toBe(product.get('name')) + expect(payment.get('payPal.id')).toBe(payPalResponse.id) + expect(payment.get('amount')).toBe(product.get('coupons')[0].amount) user = yield User.findById(@user.id) expect(user.get('stripe.free')).toBe(true) expect(user.get('payPal').payerID).toEqual(payPalResponse.payer.payer_info.payer_id) From 406f3bd7638b5b0f220a4c2c3208f61e68942582 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Mon, 11 Sep 2017 22:43:38 -0700 Subject: [PATCH 079/227] Remove unused a/b test getAnnouncesActionAudioGroup --- app/models/User.coffee | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/models/User.coffee b/app/models/User.coffee index b0506e71fc8..63a28fe7722 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -168,18 +168,6 @@ module.exports = class User extends CocoModel return return errors - getAnnouncesActionAudioGroup: -> - return @announcesActionAudioGroup if @announcesActionAudioGroup - group = me.get('testGroupNumber') % 4 - @announcesActionAudioGroup = switch group - when 0 then 'all-audio' - when 1 then 'no-audio' - when 2 then 'just-take-damage' - when 3 then 'without-take-damage' - @announcesActionAudioGroup = 'all-audio' if me.isAdmin() - application.tracker.identify announcesActionAudioGroup: @announcesActionAudioGroup unless me.isAdmin() - @announcesActionAudioGroup - getCampaignAdsGroup: -> return @campaignAdsGroup if @campaignAdsGroup # group = me.get('testGroupNumber') % 2 From 86d967616c87b96ff3a18d38df63d263bb9faefc Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 12 Sep 2017 11:33:43 -0700 Subject: [PATCH 080/227] Fix some pages not updating after user subscribes --- app/views/PremiumFeaturesView.coffee | 6 ++++++ app/views/core/SubscribeModal.coffee | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/views/PremiumFeaturesView.coffee b/app/views/PremiumFeaturesView.coffee index f3c8e95b064..6faf8e1a2f3 100644 --- a/app/views/PremiumFeaturesView.coffee +++ b/app/views/PremiumFeaturesView.coffee @@ -11,6 +11,9 @@ module.exports = class PremiumFeaturesView extends RootView events: 'click .buy': 'onClickBuy' + + subscriptions: + 'subscribe-modal:subscribed': 'onSubscribed' constructor: (options={}) -> super(options) @@ -27,3 +30,6 @@ module.exports = class PremiumFeaturesView extends RootView @openSubscriptionModal() buttonLocation = $(e.currentTarget).data('button-location') window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: "get premium view #{buttonLocation}" + + onSubscribed: -> + @render() diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index a6b5e05341b..0f78a030606 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -237,9 +237,10 @@ module.exports = class SubscribeModal extends ModalView @onSubscriptionError(jqxhr, failureMessage) onSubscriptionSuccess: -> - Backbone.Mediator.publish 'subscribe-modal:subscribed', {} @playSound 'victory' - @hide() + me.fetch().then => + Backbone.Mediator.publish 'subscribe-modal:subscribed', {} + @hide() onSubscriptionError: (jqxhrOrError, errorEventName) -> jqxhr = null From 7f1e15ee472f288e64921eb2be8dc3cd2479f08b Mon Sep 17 00:00:00 2001 From: Phoenix Eliot Date: Tue, 12 Sep 2017 12:05:40 -0700 Subject: [PATCH 081/227] Fix SubscribeModal specs --- test/app/views/core/SubscribeModal.spec.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/app/views/core/SubscribeModal.spec.coffee b/test/app/views/core/SubscribeModal.spec.coffee index c9e5171a3fd..8db114d0602 100644 --- a/test/app/views/core/SubscribeModal.spec.coffee +++ b/test/app/views/core/SubscribeModal.spec.coffee @@ -165,6 +165,7 @@ describe 'SubscribeModal', -> it 'calls hide()', wrapJasmine -> spyOn(@modal, 'hide') + spyOn(me, 'fetch').and.returnValue(Promise.resolve()) yield @modal.onClickStripeLifetimeButton() expect(@modal.hide).toHaveBeenCalled() expect(@getTrackerEventNames()).toDeepEqual( @@ -202,6 +203,7 @@ describe 'SubscribeModal', -> it 'calls hide()', wrapJasmine -> spyOn(@modal, 'hide') + spyOn(me, 'fetch').and.returnValue(Promise.resolve()) yield @payPalButton?.click() expect(@modal.hide).toHaveBeenCalled() expect(@getTrackerEventNames()).toDeepEqual( From f1191e25f20bb199b12a1413827d8d1dc467010f Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 12 Sep 2017 12:59:09 -0700 Subject: [PATCH 082/227] Reverting back to the previous sass-brunch package With 1.9.2, strange zero-width characters appeared in a few places in production build files, in particular before `.secret` which broke the item modal, goals, and victory modal at least. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fb21e39877..be499884c48 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "parse-domain": "^0.2.1", "pg": "^6.1.2", "requirejs": "~2.1.10", - "sass-brunch": "^1.9.1", + "sass-brunch": "https://github.com/basicer/sass-brunch-bleeding/archive/1.9.1-bleeding.tar.gz", "telepath-brunch": "https://github.com/nwinter/telepath-brunch/tarball/master", "uglify-js": "^2.5.0" }, From ddd1df125b42802949d0001e147cc278fcb413cf Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Tue, 12 Sep 2017 13:04:44 -0700 Subject: [PATCH 083/227] Update homepage courses info --- app/locale/en.coffee | 2 +- app/styles/home-view.sass | 4 ++-- app/templates/home-view.jade | 13 ------------- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 58d52b5b82c..b707d6a5c1d 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -49,7 +49,7 @@ setup_a_class: "Set Up a Class" have_an_account: "Have an account?" logged_in_as: "You are currently logged in as" - computer_science: "Computer science courses for all ages" + computer_science: "Our self-paced courses cover basic syntax to advanced concepts" # {change} show_me_lesson_time: "Show me lesson time estimates for:" curriculum: "Total curriculum hours:" ffa: "Free for all students" diff --git a/app/styles/home-view.sass b/app/styles/home-view.sass index ff34ad9ed2d..589f32f6361 100644 --- a/app/styles/home-view.sass +++ b/app/styles/home-view.sass @@ -295,7 +295,7 @@ padding: 50px 15px 0 text-align: center position: relative - height: 350px + height: 340px color: $navy &:first-child @@ -328,7 +328,7 @@ position: absolute left: 38px left: calc((100% - 147px) / 2) - bottom: 50px + bottom: 20px .course-duration position: absolute diff --git a/app/templates/home-view.jade b/app/templates/home-view.jade index 5a48a9f5c2d..583351deddf 100644 --- a/app/templates/home-view.jade +++ b/app/templates/home-view.jade @@ -223,15 +223,6 @@ block content if !serverConfig.static h3.text-center(data-i18n="new_home.computer_science") - h4.text-center - span#school-level-label(data-i18n="new_home.show_me_lesson_time") - select#school-level-dropdown.form-control.text-navy - option(value='elementary', data-i18n="teachers_quote.elementary_school") - option(value='middle', selected=true, data-i18n="teachers_quote.middle_school") - option(value='high', data-i18n="teachers_quote.high_school") - h5.text-center#total-hours-header - span.spr(data-i18n="new_home.curriculum") - span#semester-duration #courses-row.row - var conceptsSeen = {}; for course, courseIndex in view.courses.models @@ -260,10 +251,6 @@ block content if total === 0 span= course.get('description') img.media-object(src="/images/pages/home/" + course.get('slug') + ".png") - h6.course-duration - span.spr(data-i18n="new_home.lesson_time") - span.course-hours= course.get('duration') || 0 - span.spl.unit(data-i18n="units.hours") .col-md-3.col-sm-4 .media.disabled .media-body From 69803556f87e6d8f702049b1df97f0699878dcf2 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Tue, 12 Sep 2017 21:34:08 -0700 Subject: [PATCH 084/227] Update subscribe modal Cleaining up existing dual sub lifetime/monthly version Adding A/B test for 2nd lifetime only version Can use query param subtype=[both-subs|lifetime-only] to force a specific version, otherwise user testGroupNumber will determine. --- .../pages/play/modal/heroes-and-pets.png | Bin 0 -> 302237 bytes .../images/pages/play/modal/three-pets.png | Bin 0 -> 32062 bytes app/locale/en.coffee | 10 +- app/models/User.coffee | 10 ++ app/styles/modal/subscribe-modal.sass | 97 ++++++------ app/templates/core/subscribe-modal.jade | 138 ++++++++++-------- app/views/core/SubscribeModal.coffee | 1 + 7 files changed, 147 insertions(+), 109 deletions(-) create mode 100644 app/assets/images/pages/play/modal/heroes-and-pets.png create mode 100644 app/assets/images/pages/play/modal/three-pets.png diff --git a/app/assets/images/pages/play/modal/heroes-and-pets.png b/app/assets/images/pages/play/modal/heroes-and-pets.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dfcdfcf86e7174e1244e9c0398aa4dee9f3d15 GIT binary patch literal 302237 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� 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�mHLZY}Wp+3SPq9Rn6sZ)>FV!K-02DG~&MxuFJF@ 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/pages/play/modal/three-pets.png b/app/assets/images/pages/play/modal/three-pets.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc201f95d1c0f08a7cde9eabd802f93a259c158 GIT binary patch literal 32062 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 literal 0 HcmV?d00001 diff --git a/app/locale/en.coffee b/app/locale/en.coffee index b707d6a5c1d..b6ef8f3d746 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -651,6 +651,7 @@ prompt_body: "Keep playing to earn more!" subscribe: + best_deal: "Best Deal!" confirmation: "Congratulations! You now have a CodeCombat Premium Subscription!" premium_already_subscribed: "You're already subscribed to Premium!" subscribe_modal_title: "CodeCombat Premium" @@ -708,14 +709,15 @@ unsubscribing: "Unsubscribing" subscribe_prepaid: "Click Subscribe to use prepaid code" using_prepaid: "Using prepaid code for monthly subscription" - feature_levels: "Access __premiumLevelsCount__ levels available" + feature_levels: "Access 300+ levels available" # {change} feature_gems: "Receive __gems__ gems per month" - feature_heroes: "Unlock exclusive heroes" + feature_heroes: "Unlock exclusive heroes and pets" # {change} feature_games: "Make games for your friends" feature_websites: "Build websites and apps" feature_items: "Equip more powerful items" - month_price: "$__price__/mo" - lifetime: "Lifetime Subscription" + feature_learn: "Learn to make games and websites" # {change} + month_price: "$__price__" # {change} + lifetime: "Lifetime Access" # {change} lifetime_price: "$__price__" year_subscription: "Yearly Subscription" year_price: "$__price__/year" diff --git a/app/models/User.coffee b/app/models/User.coffee index 63a28fe7722..fd853526c3c 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -179,6 +179,16 @@ module.exports = class User extends CocoModel application.tracker.identify campaignAdsGroup: @campaignAdsGroup unless me.isAdmin() @campaignAdsGroup + getSubModalGroup: -> + return @subModalGroup if @subModalGroup + group = me.get('testGroupNumber') % 4 + @subModalGroup = switch group + when 0, 1 then 'both-subs' + when 2, 3 then 'lifetime-only' + @subModalGroup = 'both-subs' if me.isAdmin() + application.tracker.identify subModalGroup: @subModalGroup unless me.isAdmin() + @subModalGroup + # Signs and Portents was receiving updates after test started, and also had a big bug on March 4, so just look at test from March 5 on. # ... and stopped working well until another update on March 10, so maybe March 11+... # ... and another round, and then basically it just isn't completing well, so we pause the test until we can fix it. diff --git a/app/styles/modal/subscribe-modal.sass b/app/styles/modal/subscribe-modal.sass index 4351d68c0e4..7c1a6380a78 100644 --- a/app/styles/modal/subscribe-modal.sass +++ b/app/styles/modal/subscribe-modal.sass @@ -31,7 +31,7 @@ text-shadow: black 4px 4px 0, black -4px -4px 0, black 4px -4px 0, black -4px 4px 0, black 4px 0px 0, black 0px -4px 0, black -4px 0px 0, black 0px 4px 0, black 6px 6px 6px font-variant: normal text-transform: uppercase - + margin-left: -30px //- Close modal button @@ -69,9 +69,9 @@ position: absolute top: 114px right: 65px - + //- Paper area - + .paper-area position: absolute top: 114px @@ -83,49 +83,51 @@ display: flex flex-direction: column justify-content: space-between - + .benefits-header, .big-text font-weight: bold font-size: 20px - margin: 10px 0 - + margin: 10px 40px 10px 0px + ul, .med-text font-size: 16px font-weight: bold - + table width: 100% margin: 20px 0 text-align: center - + ul list-style: none padding: 0 - + li::before content: "• " - + hr border-top: 1px solid gray - margin: 20px 40px - + margin: 10px 40px + th font-size: 36px text-align: center line-height: 36px color: #59882f text-shadow: 1px 1px 1px rgba(0,0,0,0.5) - + .option-col text-align: center - + .option-header font-weight: bold font-size: 16px - + .price - font-weight: bold - font-size: 24px + font-size: 50px + + .price-subtext + margin-bottom: 5px .old-price text-decoration: line-through; @@ -133,16 +135,37 @@ color: red margin-left: -85px margin-right: 10px - + p margin: 5px 0 0 20px - + button min-width: 250px - - .row - margin-bottom: 17px + .short-row + margin-bottom: 0px + + .best-deal + font-size: 15px + color: darkgreen + text-transform: uppercase + + .buy-now-text + opacity: 1.0 + + .buy-lock-icon + opacity: 1.0 + float: right + + .left-image + width: 100% + margin-top: 10px + margin-left: 10px + height: 335px + padding: 20px + + .features-list + padding-right: 20px //- Feature comparison table @@ -240,31 +263,7 @@ height: 70px margin: 0 5px - //- Purchase button - - .purchase-button - flex-grow: 1 - font-size: 24px - line-height: 30px - border-style: solid - border-image: url(/images/common/button-background-primary-active.png) 14 20 20 20 fill round - border-width: 14px 20px 20px 20px - color: darken(white, 5%) - - span - pointer-events: none - - &:hover - border-image: url(/images/common/button-background-primary-disabled.png) 14 20 20 20 fill round - - &:active - border-image: url(/images/common/button-background-primary-pressed.png) 14 20 20 20 fill round - padding: 2px 0 0 2px - color: white - - //- Lifetime button - - .stripe-lifetime-button + .purchase-button, .stripe-lifetime-button font-size: 24px line-height: 30px border-style: solid @@ -278,7 +277,7 @@ span pointer-events: none - + #paypal-button-container height: 45px width: 250px @@ -301,6 +300,8 @@ top: 20px border: 5px solid gray +.support-blurb + margin-top: 10px body[lang='fr'] #subscribe-modal diff --git a/app/templates/core/subscribe-modal.jade b/app/templates/core/subscribe-modal.jade index 3e41c87e303..4cace57a4d7 100644 --- a/app/templates/core/subscribe-modal.jade +++ b/app/templates/core/subscribe-modal.jade @@ -1,3 +1,17 @@ +mixin price(name, p) + - var origPrice = p.priceStringNoSymbol() + if origPrice % 1 === 0 + - origPrice = Math.floor(origPrice); + - var salePrice = p.adjustedPriceStringNoSymbol() + if salePrice % 1 === 0 + - salePrice = Math.floor(salePrice); + if origPrice == salePrice + .price(data-i18n=name, data-i18n-options={price:origPrice}) + else + div + span.old-price(data-i18n=name, data-i18n-options={price:origPrice}) + span.price(data-i18n=name, data-i18n-options={price:salePrice}) + .modal-dialog .modal-content if view.state === 'purchasing' @@ -15,66 +29,78 @@ span.glyphicon.glyphicon-remove div.paper-area - div.benefits-header.text-center(data-i18n="[html]subscribe.comparison_blurb") - + if view.subType === 'both-subs' + div.benefits-header.text-center(data-i18n="[html]subscribe.comparison_blurb") - .container-fluid - .row - .col-xs-5.feature-col.col-xs-offset-1 - ul - li(data-i18n="subscribe.feature_levels" data-i18n-options={premiumLevelsCount:view.i18nData.premiumLevelsCount}) - if view.basicProduct - li(data-i18n="subscribe.feature_gems", data-i18n-options={gems:view.basicProduct.get('gems')}) - li(data-i18n="subscribe.feature_heroes") - - - .col-xs-5.feature-col - ul - li(data-i18n="subscribe.feature_games") - li(data-i18n="subscribe.feature_websites") - li(data-i18n="subscribe.feature_items") - - hr - - mixin price(name, p) - - var origPrice = p.priceStringNoSymbol() - - var salePrice = p.adjustedPriceStringNoSymbol() - if origPrice == salePrice - .price(data-i18n=name, data-i18n-options={price:origPrice}) - else - div - span.old-price(data-i18n=name, data-i18n-options={price:origPrice}) - span.price(data-i18n=name, data-i18n-options={price:salePrice}) - - .row - - var secondRowClass = '.col-xs-5' - if view.basicProduct + .container-fluid + .row .col-xs-5.option-col.col-xs-offset-1 - .option-header.text-center(data-i18n="subscribe.stripe_description") - +price("subscribe.month_price", view.basicProduct) - button.btn.btn-lg.btn-illustrated.purchase-button(data-i18n="premium_features.subscribe_now") - if view.basicProduct.isRegionalSubscription() - //- Warn about PayPal redirect, which is only used for regional subscriptions - .small(data-i18n="premium_features.paypal_redirect") + img(src="/images/pages/play/modal/three-pets.png") + .col-xs-6 + ul.features-list + li(data-i18n="subscribe.feature_levels") + li(data-i18n="subscribe.feature_heroes") + li(data-i18n="subscribe.feature_learn") - else - - var secondRowClass = '.col-xs-12' + hr if view.lifetimeProduct - .option-col(class=secondRowClass) - .option-header.text-center(data-i18n="subscribe.lifetime") - +price("subscribe.lifetime_price", view.lifetimeProduct) - if view.paymentProcessor === 'PayPal' - #paypal-button-container + .short-row.row + if view.basicProduct + .col-xs-5.option-col.col-xs-offset-1 + .option-col(class='.col-xs-5') + .option-header.best-deal(data-i18n="subscribe.best_deal") else - button.stripe-lifetime-button.btn.btn-lg.btn-illustrated(data-i18n="subscribe.buy_now") - - div - p - span(data-i18n="subscribe.kids_message_1") - =" " - a.parent-link(data-i18n="subscribe.kids_message_2") - + .option-col(class='.col-xs-12') + .option-header.best-deal(data-i18n="subscribe.best_deal") + .row + - var secondRowClass = '.col-xs-5' + if view.basicProduct + .col-xs-5.option-col.col-xs-offset-1 + +price("subscribe.month_price", view.basicProduct) + .option-header.price-subtext.text-center(data-i18n="subscribe.stripe_description") + button.btn.btn-lg.btn-illustrated.purchase-button + span.buy-now-text(data-i18n="subscribe.buy_now") + span.buy-lock-icon 🔒 + + else + - var secondRowClass = '.col-xs-12' + + if view.lifetimeProduct + .option-col(class=secondRowClass) + +price("subscribe.lifetime_price", view.lifetimeProduct) + .option-header.price-subtext.text-center(data-i18n="subscribe.lifetime") + if view.paymentProcessor === 'PayPal' + #paypal-button-container + else + button.stripe-lifetime-button.btn.btn-lg.btn-illustrated + span.buy-now-text(data-i18n="subscribe.buy_now") + span.buy-lock-icon 🔒 + + else + //- lifetime-only modal + .container-fluid + .row + .col-xs-5.text-center + img.left-image(src="/images/pages/play/modal/heroes-and-pets.png") + .col-xs-7 + div.benefits-header.text-center(data-i18n="[html]subscribe.comparison_blurb") + ul + li(data-i18n="subscribe.feature_levels") + li(data-i18n="subscribe.feature_heroes") + li(data-i18n="subscribe.feature_learn") + if view.lifetimeProduct + .option-col(class=secondRowClass) + +price("subscribe.lifetime_price", view.lifetimeProduct) + .option-header.text-center(data-i18n="subscribe.lifetime") + if view.paymentProcessor === 'PayPal' + #paypal-button-container + else + button.stripe-lifetime-button.btn.btn-lg.btn-illustrated + span.buy-now-text(data-i18n="subscribe.buy_now") + span.buy-lock-icon 🔒 + + div.support-blurb.text-center p span(data-i18n="subscribe.support_part1") =" " @@ -82,9 +108,6 @@ =" " span(data-i18n="subscribe.support_part3") - - - if view.state === 'declined' #declined-alert.alert.alert-danger.alert-dismissible span(data-i18n="buy_gems.declined") @@ -116,3 +139,4 @@ .email-parent-complete p(data-i18n="subscribe.parent_email_sent") button.btn(type='button', onclick="$('.parent-link').popover('hide');", data-i18n="modal.close") + diff --git a/app/views/core/SubscribeModal.coffee b/app/views/core/SubscribeModal.coffee index 0f78a030606..c9abb9b236c 100644 --- a/app/views/core/SubscribeModal.coffee +++ b/app/views/core/SubscribeModal.coffee @@ -41,6 +41,7 @@ module.exports = class SubscribeModal extends ModalView @supermodel.trackRequest @products.fetch {data} @trackTimeVisible({ trackViewLifecycle: true }) payPal.loadPayPal().then => @render() + @subType = utils.getQueryVariable('subtype', me.getSubModalGroup()) onLoaded: -> @basicProduct = @products.getBasicSubscriptionForUser(me) From 7b5b3711e9c5f7706c726002685160b249a8af1d Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 13 Sep 2017 16:01:47 -0700 Subject: [PATCH 085/227] Adjust intro goals display to be within the background image Otherwise at tall screens, 'goals' appears on the edges of the intro "papers" --- app/styles/play/level/level-loading-view.sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/styles/play/level/level-loading-view.sass b/app/styles/play/level/level-loading-view.sass index b1ec3c1a75b..582e79cb41a 100644 --- a/app/styles/play/level/level-loading-view.sass +++ b/app/styles/play/level/level-loading-view.sass @@ -72,7 +72,7 @@ $UNVEIL_TIME: 1.2s pointer-events: all @include transition($UNVEIL_TIME ease-in-out) - padding: 80px 70px 40px 50px + padding: 11vh 70px 40px 50px .progress-or-start-container.intro-footer bottom: 30px From d19c8161d30a4a6b4fb0b3c5b621016c5387d184 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 13 Sep 2017 16:45:27 -0700 Subject: [PATCH 086/227] Hide home link when teacher/student and no 'course' is in the url This handles levels which are linked directly, like Peasants and Munchkins, which otherwise would send these players to a home premium campaign. --- app/templates/play/level/control-bar-view.jade | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/templates/play/level/control-bar-view.jade b/app/templates/play/level/control-bar-view.jade index 6b9a258e3c6..56afd39bc9d 100644 --- a/app/templates/play/level/control-bar-view.jade +++ b/app/templates/play/level/control-bar-view.jade @@ -1,13 +1,16 @@ -.left-cap +- var includeHomeLink = !((me.isStudent() || me.isTeacher()) && !view.course); +if includeHomeLink + .left-cap .right-cap .center-chain .right-chain .wood-background -.levels-link-area - a.levels-link(href=homeLink || "/") - .glyphicon.glyphicon-play - span(data-i18n=me.isSessionless() ? "nav.courses" : (ladderGame ? "general.ladder" : "nav.map")).home-text +if includeHomeLink + .levels-link-area + a.levels-link(href=homeLink || "/") + .glyphicon.glyphicon-play + span(data-i18n=me.isSessionless() ? "nav.courses" : (ladderGame ? "general.ladder" : "nav.map")).home-text .level-name-area-container .level-name-area From 58dd413d3e01651fdf443dca0760df4e8805b648 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 14 Sep 2017 14:20:38 -0700 Subject: [PATCH 087/227] Update teacher signup conversion script Adding more intermediary events. --- .../analytics/teacherFormToClassConversion.js | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/scripts/analytics/teacherFormToClassConversion.js b/scripts/analytics/teacherFormToClassConversion.js index 6ed2de0b30b..523db310b49 100644 --- a/scripts/analytics/teacherFormToClassConversion.js +++ b/scripts/analytics/teacherFormToClassConversion.js @@ -25,15 +25,27 @@ const mongoConnUrlAnalytics = process.argv[2]; const debugOutput = true; const daysToViewForm = 7; const daysToCreateClass = 7; -const endDay = "2017-02-03"; +const endDay = "2017-09-11"; let startDay = new Date(`${endDay}T00:00:00.000Z`); startDay.setUTCDate(startDay.getUTCDate() - daysToViewForm - daysToCreateClass); startDay = startDay.toISOString().substring(0, 10); debug(`Measuring days ${startDay} to ${endDay}`); -const startEvents = ['Teachers Request Demo Loaded', 'Teachers Create Account Loaded', 'Teachers Convert Account Loaded']; -const remainingOrderedEvents = ['Teachers Classes Loaded', 'Teachers Classes Create New Class Started', 'Teachers Classes Create New Class Finished']; +const startEventValues = ['Teachers Request Demo Loaded', 'Teachers Create Account Loaded', 'Teachers Convert Account Loaded', 'Homepage Click Teacher Button CTA']; +const remainingOrderedEventValues = [ + 'CreateAccountModal Teacher BasicInfoView Submit Clicked', + 'CreateAccountModal Teacher BasicInfoView Submit Success', + 'CreateAccountModal Teacher SchoolInfoPanel Continue Clicked', + 'CreateAccountModal Teacher SchoolInfoPanel Continue Success', + 'CreateAccountModal Teacher TeacherRolePanel Continue Clicked', + 'CreateAccountModal Teacher TeacherRolePanel Continue Success', + 'CreateAccountModal Teacher DemographicsPanel Signup Clicked', + 'CreateAccountModal Teacher DemographicsPanel Signup Success', + // 'Teachers Classes Loaded', + // 'Teachers Classes Create New Class Started', + // 'Teachers Classes Create New Class Finished' +]; co(function*() { const analyticsDb = yield MongoClient.connect(mongoConnUrlAnalytics, {connectTimeoutMS: 1000 * 60 * 60, socketTimeoutMS: 1000 * 60 * 60}); @@ -44,11 +56,11 @@ co(function*() { const midObjectId = objectIdWithTimestamp(formEndDate); debug(`Finding view teacher form events between ${startDay} and ${formEndDate.toISOString().substring(0, 10)}...`); - let query = {$and: [{_id: {$gte: startObjectId}}, {_id: {$lt: midObjectId}}, {event: {$in: startEvents}}]}; - const formEvents = yield analyticsDb.collection('log').find(query, {user: 1}).toArray(); - debug(`Teacher form events found ${formEvents.length}`); + let query = {$and: [{_id: {$gte: startObjectId}}, {_id: {$lt: midObjectId}}, {event: {$in: startEventValues}}]}; + const startEvents = yield analyticsDb.collection('log').find(query, {user: 1}).toArray(); + debug(`Teacher form events found ${startEvents.length}`); const userFormMap = {}; - for (const event of formEvents) { + for (const event of startEvents) { userFormMap[event.user] = event._id.getTimestamp(); } const userIds = Object.keys(userFormMap); @@ -56,7 +68,8 @@ co(function*() { debug(`Finding rest of create class funnel events between ${startDay} and ${endDay}...`); const endObjectId = objectIdWithTimestamp(new Date(`${endDay}T00:00:00.000Z`)); - query = {$and: [{_id: {$gte: startObjectId}}, {_id: {$lt: endObjectId}}, {event: {$in: remainingOrderedEvents}}, {user: {$in: userIds}}]}; + + query = {$and: [{_id: {$gte: startObjectId}}, {_id: {$lt: endObjectId}}, {event: {$in: remainingOrderedEventValues}}, {user: {$in: userIds}}]}; const classEvents = yield analyticsDb.collection('log').find(query, {event: 1, user: 1}).toArray(); debug(`Class created events found ${classEvents.length}`); const userFunnelEventsMap = {}; @@ -73,12 +86,12 @@ co(function*() { const usersSawTeacherForm = userIds.length; let teachersCreatedClass = 0; - console.log(`Looking at events from ${startDay} to ${endDay}:`); + debug(`Looking at events from ${startDay} to ${endDay}:`); console.log(`100% ${usersSawTeacherForm} users saw teacher form`); - for (const event of remainingOrderedEvents) { + for (const event of remainingOrderedEventValues) { const currentEventCount = Object.keys(userFunnelEventsMap[event] || {}).length; console.log(`${(currentEventCount * 100.0 / usersSawTeacherForm).toFixed(2)}% ${currentEventCount} users saw event ${event}`); - if (event === 'Teachers Classes Create New Class Finished') { + if (event === remainingOrderedEventValues[remainingOrderedEventValues.length - 1]) { teachersCreatedClass = currentEventCount; } } From 9d06b459e02b760c4e1ccfc15ee31142377ba2b3 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 14 Sep 2017 14:22:41 -0700 Subject: [PATCH 088/227] Add YoY data to trial request counts script --- .../mongodb/queries/teacherSurveyCounts.js | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/scripts/analytics/mongodb/queries/teacherSurveyCounts.js b/scripts/analytics/mongodb/queries/teacherSurveyCounts.js index 482fe45ae22..dae8d1b1b39 100644 --- a/scripts/analytics/mongodb/queries/teacherSurveyCounts.js +++ b/scripts/analytics/mongodb/queries/teacherSurveyCounts.js @@ -3,6 +3,15 @@ // Usage: // mongo
:/