From 715939dfb1e97f9031061e731ed6a4c48c4f4fa7 Mon Sep 17 00:00:00 2001 From: themaka Date: Fri, 29 Jul 2016 15:20:24 -0400 Subject: [PATCH 01/18] Adding Croatian language to locale --- app/locale/hr.coffee | 2019 ++++++++++++++++++++++ app/locale/locale.coffee | 1 + app/views/contribute/DiplomatView.coffee | 1 + 3 files changed, 2021 insertions(+) create mode 100644 app/locale/hr.coffee diff --git a/app/locale/hr.coffee b/app/locale/hr.coffee new file mode 100644 index 000000000..24fc1bfc0 --- /dev/null +++ b/app/locale/hr.coffee @@ -0,0 +1,2019 @@ +module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norwegian (Nynorsk)", translation: +# home: +# slogan: "Learn to Code by Playing a Game" +# no_ie: "CodeCombat does not run in Internet Explorer 8 or older. Sorry!" # Warning that only shows up in IE8 and older +# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!" # Warning that shows up on mobile devices +# play: "Play" # The big play button that opens up the campaign view. +# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses +# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari +# old_browser_suffix: "You can try anyway, but it probably won't work." +# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval." +# campaign: "Campaign" +# for_beginners: "For Beginners" +# multiplayer: "Multiplayer" # Not currently shown on home page +# for_developers: "For Developers" # Not currently shown on home page. +# or_ipad: "Or download for iPad" + +# new_home: +# slogan: "The most engaging game for learning programming." +# classroom_edition: "Classroom Edition:" +# learn_to_code: "Learn to code:" +# teacher: "Teacher" +# student: "Student" +# play_now: "Play Now" +# im_a_teacher: "I'm a Teacher" +# im_a_student: "I'm a Student" +# learn_more: "Learn more" +# classroom_in_a_box: "A classroom in-a-box for teaching computer science." +# codecombat_is: "CodeCombat is a platform 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." +# top_screenshots_hint: "Students write code and see their changes update in real-time" +# designed_with: "Designed with teachers in mind" +# real_code: "Real, typed code" +# from_the_first_level: "from the first level" +# getting_students: "Getting students to typed code as quickly as possible is critical to learning programming syntax and proper structure." +# educator_resources: "Educator resources" +# course_guides: "and course guides" +# teaching_computer_science: "Teaching computer science does not require a costly degree, because we provide tools to support educators of all backgrounds." +# accessible_to: "Accessible to" +# everyone: "everyone" +# democratizing: "Democratizing the process of learning coding is at the core of our philosophy. Everyone should be able to learn to code." +# forgot_learning: "I think they actually forgot that they were actually learning something." +# wanted_to_do: " Coding is something I've always wanted to do, and I never thought I would be able to learn it in school." +# why_games: "Why is learning through games important?" +# games_reward: "Games reward the productive struggle." +# encourage: "Gaming is a medium that encourages interaction, discovery, and trial-and-error. A good game challenges the player to master skills over time, which is the same critical process students go through as they learn." +# excel: "Games excel at rewarding" +# struggle: "productive struggle" +# kind_of_struggle: "the kind of struggle that results in learning that’s engaging and" +# motivating: "motivating" +# not_tedious: "not tedious." +# gaming_is_good: "Studies suggest gaming is good for children’s brains. (it’s true!)" +# 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" +# view_my_classes: "View my classes" +# computer_science: "Computer science courses for all ages" +# show_me_lesson_time: "Show me lesson time estimates for:" +# curriculum: "Total curriculum hours:" +# ffa: "Free for all students" +# lesson_time: "Lesson time:" +# coming_soon: "Coming this fall!" +# courses_available_in: "Courses are available in JavaScript, Python, and Java (coming soon!)" +# 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." +# teachers: "Teachers!" +# teachers_and_educators: "Teachers & Educators" +# class_in_box: "Learn how our classroom-in-a-box platform fits into your curriculum." +# get_started: "Get Started" +# students: "Students:" +# join_class: "Join Class" +# role: "Your role:" +# student_count: "Number of students:" +# start_playing_for_free: "Start Playing for Free!" +# students_and_players: "Students & Players" +# goto_classes: "Go to My Classes" +# view_profile: "View My Profile" +# view_progress: "View Progress" +# check_out_wiki: "Check out our new Educator Wiki" +# want_coco: "Want CodeCombat at your school?" +# form_select_role: "Select primary role" +# form_select_range: "Select class size" + +# nav: +# play: "Levels" # The top nav bar entry where players choose which levels to play +# community: "Community" +# courses: "Courses" +# editor: "Editor" +# blog: "Blog" +# forum: "Forum" +# account: "Account" +# my_account: "My Account" +# profile: "Profile" +# stats: "Stats" +# code: "Code" +# home: "Home" +# contribute: "Contribute" +# legal: "Legal" +# about: "About" +# contact: "Contact" +# twitter_follow: "Follow" +# students: "Students" +# teachers: "Teachers" +# careers: "Careers" +# facebook: "Facebook" +# twitter: "Twitter" +# create_a_class: "Create a Class" +# other: "Other" +# learn_to_code: "Learn to Code!" +# toggle_nav: "Toggle navigation" +# jobs: "Jobs" +# schools: "Schools" +# educator_wiki: "Educator Wiki" +# 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!" + +# modal: +# cancel: "Cancel" +# close: "Close" +# okay: "Okay" + +# not_found: +# page_not_found: "Page not found" + + diplomat_suggestion: +# title: "Help translate CodeCombat!" # This shows up when a player switches to a non-English language using the language selector. +# sub_heading: "We need your language skills." + pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Croatian but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Croatian." + missing_translations: "Until we can translate everything into Croatian, you'll see English when Croatian isn't available." +# learn_more: "Learn more about being a Diplomat" +# subscribe_as_diplomat: "Subscribe as a Diplomat" + +# play: +# play_as: "Play As" # Ladder page +# compete: "Compete!" # Course details page +# spectate: "Spectate" # Ladder page +# players: "players" # Hover over a level on /play +# hours_played: "hours played" # Hover over a level on /play +# items: "Items" # Tooltip on item shop button from /play +# unlock: "Unlock" # For purchasing items and heroes +# confirm: "Confirm" +# owned: "Owned" # For items you own +# locked: "Locked" +# purchasable: "Purchasable" # For a hero you unlocked but haven't purchased +# available: "Available" +# skills_granted: "Skills Granted" # Property documentation details +# heroes: "Heroes" # Tooltip on hero shop button from /play +# achievements: "Achievements" # Tooltip on achievement list button from /play +# account: "Account" # Tooltip on account button from /play +# settings: "Settings" # Tooltip on settings button from /play +# poll: "Poll" # Tooltip on poll button from /play +# next: "Next" # Go from choose hero to choose inventory before playing a level +# change_hero: "Change Hero" # Go back from choose inventory to choose hero +# buy_gems: "Buy Gems" +# subscription_required: "Subscription Required" +# anonymous: "Anonymous Player" +# level_difficulty: "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: "Beginner Campaign" +# awaiting_levels_adventurer_prefix: "We release new levels every week." +# awaiting_levels_adventurer: "Sign up as an Adventurer" +# awaiting_levels_adventurer_suffix: "to be the first to play new levels." +# adjust_volume: "Adjust volume" +# campaign_multiplayer: "Multiplayer Arenas" +# campaign_multiplayer_description: "... in which you code head-to-head against other players." +# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" +# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." + +# 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" + +# share_progress_modal: +# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat." +# email_invalid: "Email address invalid." +# form_blurb: "Enter your parent's email below and we’ll show them!" +# form_label: "Email Address" +# placeholder: "email address" +# title: "Excellent Work, Apprentice" + +# login: +# sign_up: "Create Account" +# email_or_username: "Email or username" +# log_in: "Log In" +# logging_in: "Logging In" +# log_out: "Log Out" +# forgot_password: "Forgot your password?" +# authenticate_gplus: "Authenticate G+" +# load_profile: "Load G+ Profile" +# finishing: "Finishing" +# sign_in_with_facebook: "Sign in with Facebook" +# sign_in_with_gplus: "Sign in with G+" +# signup_switch: "Want to create an account?" + +# signup: +# create_student_header: "Create Student Account" +# create_teacher_header: "Create Teacher Account" +# create_individual_header: "Create Individual Account" +# create_header: "Create Account" +# email_announcements: "Receive announcements about new CodeCombat levels and features!" +# creating: "Creating Account..." +# create_account: "Create Account" +# sign_up: "Sign Up" +# log_in: "log in with password" +# required: "You need to log in before you can go that way." +# login_switch: "Already have an account?" +# school_name: "School Name and City" +# optional: "optional" +# school_name_placeholder: "Example High School, Springfield, IL" +# connect_with: "Connect with:" +# connected_gplus_header: "You've successfully connected with Google+!" +# connected_gplus_p: "Finish signing up so you can log in with your Google+ account." +# gplus_exists: "You already have an account associated with Google+!" +# connected_facebook_header: "You've successfully connected with Facebook!" +# connected_facebook_p: "Finish signing up so you can log in with your Facebook account." +# facebook_exists: "You already have an account associated with Facebook!" +# hey_students: "Students, enter the class code from your teacher." +# 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:" # {change} +# 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:" +# 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:" + +# recover: +# recover_account_title: "Recover Account" +# send_password: "Send Recovery Password" +# recovery_sent: "Recovery email sent." + +# items: +# primary: "Primary" +# secondary: "Secondary" +# armor: "Armor" +# accessories: "Accessories" +# misc: "Misc" +# books: "Books" + + common: +# back: "Back" # When used as an action verb, like "Navigate backward" +# continue: "Continue" # When used as an action verb, like "Continue forward" +# loading: "Loading..." +# saving: "Saving..." +# sending: "Sending..." +# send: "Send" +# sent: "Sent" +# type: "Type" +# cancel: "Cancel" +# save: "Save" +# publish: "Publish" +# create: "Create" +# fork: "Fork" +# play: "Play" # When used as an action verb, like "Play next level" +# retry: "Retry" +# actions: "Actions" +# info: "Info" +# help: "Help" +# watch: "Watch" +# unwatch: "Unwatch" +# submit_patch: "Submit Patch" +# submit_changes: "Submit Changes" +# save_changes: "Save Changes" +# required_field: "Required field" + +# general: +# and: "and" +# name: "Name" +# date: "Date" +# body: "Body" +# version: "Version" +# pending: "Pending" +# accepted: "Accepted" +# rejected: "Rejected" +# withdrawn: "Withdrawn" +# accept: "Accept" +# reject: "Reject" +# withdraw: "Withdraw" +# submitter: "Submitter" +# submitted: "Submitted" +# commit_msg: "Commit Message" +# version_history: "Version History" +# version_history_for: "Version History for: " +# select_changes: "Select two changes below to see the difference." +# undo_prefix: "Undo" +# undo_shortcut: "(Ctrl+Z)" +# redo_prefix: "Redo" +# redo_shortcut: "(Ctrl+Shift+Z)" +# play_preview: "Play preview of current level" +# result: "Result" +# results: "Results" +# description: "Description" +# or: "or" +# subject: "Subject" +# email: "Email" +# password: "Password" +# confirm_password: "Confirm Password" +# message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" +# player: "Player" +# player_level: "Level" # Like player level 5, not like level: Dungeons of Kithgard +# warrior: "Warrior" +# ranger: "Ranger" +# wizard: "Wizard" +# first_name: "First Name" +# last_name: "Last Name" +# last_initial: "Last Initial" +# username: "Username" + +# units: +# second: "second" +# seconds: "seconds" +# minute: "minute" +# minutes: "minutes" +# hour: "hour" +# hours: "hours" +# day: "day" +# days: "days" +# week: "week" +# weeks: "weeks" +# month: "month" +# months: "months" +# year: "year" +# years: "years" + +# play_level: +# level_complete: "Level Complete" +# completed_level: "Completed Level:" +# course: "Course:" +# done: "Done" +# next_level: "Next Level" +# next_game: "Next game" +# programming_language: "Programming language" +# show_menu: "Show game menu" +# home: "Home" # Not used any more, will be removed soon. +# level: "Level" # Like "Level: Dungeons of Kithgard" +# skip: "Skip" +# game_menu: "Game Menu" +# guide: "Guide" +# restart: "Restart" +# goals: "Goals" +# goal: "Goal" +# running: "Running..." +# success: "Success!" +# incomplete: "Incomplete" +# timed_out: "Ran out of time" +# failing: "Failing" +# reload: "Reload" +# reload_title: "Reload All Code?" +# reload_really: "Are you sure you want to reload this level back to the beginning?" +# reload_confirm: "Reload All" +# victory: "Victory" +# victory_title_prefix: "" +# victory_title_suffix: " Complete" +# victory_sign_up: "Sign Up to Save Progress" +# victory_sign_up_poke: "Want to save your code? Create a free account!" +# victory_rate_the_level: "How fun was this level?" +# victory_return_to_ladder: "Return to Ladder" +# victory_saving_progress: "Saving Progress" +# victory_go_home: "Go Home" +# victory_review: "Tell us more!" +# victory_review_placeholder: "How was the level?" +# victory_hour_of_code_done: "Are You Done?" +# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!" +# victory_experience_gained: "XP Gained" +# victory_gems_gained: "Gems Gained" +# victory_new_item: "New Item" +# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." +# victory_become_a_viking: "Become a Viking" +# victory_no_progress_for_teachers: "Progress is not saved for teachers. But, you can add a student account to your classroom for yourself." +# guide_title: "Guide" +# tome_cast_button_run: "Run" +# tome_cast_button_running: "Running" +# tome_cast_button_ran: "Ran" +# tome_submit_button: "Submit" +# tome_reload_method: "Reload original code to restart the level" +# tome_available_spells: "Available Spells" +# tome_your_skills: "Your Skills" +# tome_current_method: "Current Method" +# hints: "Hints" +# hints_title: "Hint {{number}}" +# code_saved: "Code Saved" +# skip_tutorial: "Skip (esc)" +# keyboard_shortcuts: "Key Shortcuts" +# loading_ready: "Ready!" +# loading_start: "Start Level" +# problem_alert_title: "Fix Your Code" +# time_current: "Now:" +# time_total: "Max:" +# time_goto: "Go to:" +# non_user_code_problem_title: "Unable to Load Level" +# infinite_loop_title: "Infinite Loop Detected" +# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." +# check_dev_console: "You can also open the developer console to see what might be going wrong." +# check_dev_console_link: "(instructions)" +# infinite_loop_try_again: "Try Again" +# infinite_loop_reset_level: "Reset Level" +# infinite_loop_comment_out: "Comment Out My Code" +# tip_toggle_play: "Toggle play/paused with Ctrl+P." +# tip_scrub_shortcut: "Use Ctrl+[ and Ctrl+] to rewind and fast-forward." +# tip_guide_exists: "Click the guide, inside game menu (at the top of the page), for useful info." +# tip_open_source: "CodeCombat is 100% open source!" +# tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!" +# tip_beta_launch: "CodeCombat launched its beta in October, 2013." +# tip_think_solution: "Think of the solution, not the problem." +# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" +# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" +# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" +# tip_forums: "Head over to the forums and tell us what you think!" +# tip_baby_coders: "In the future, even babies will be Archmages." +# tip_morale_improves: "Loading will continue until morale improves." +# tip_all_species: "We believe in equal opportunities to learn programming for all species." +# tip_reticulating: "Reticulating spines." +# tip_harry: "Yer a Wizard, " +# tip_great_responsibility: "With great coding skill comes great debug responsibility." +# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep." +# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't." +# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" +# tip_no_try: "Do. Or do not. There is no try. - Yoda" +# tip_patience: "Patience you must have, young Padawan. - Yoda" +# tip_documented_bug: "A documented bug is not a bug; it is a feature." +# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" +# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" +# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" +# tip_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem." +# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." +# tip_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: "Coding is the closest thing we have to a superpower." +# tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds" +# tip_no_code: "No code is faster than no code." +# tip_code_never_lies: "Code never lies, comments sometimes do. — Ron Jeffries" +# 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: "Whatever you do, keep moving forward. - Martin Luther King Jr." +# tip_google: "Have a problem you can't solve? Google it!" +# tip_adding_evil: "Adding a pinch of 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" + +# game_menu: +# inventory_tab: "Inventory" +# save_load_tab: "Save/Load" +# options_tab: "Options" +# guide_tab: "Guide" +# guide_video_tutorial: "Video Tutorial" +# guide_tips: "Tips" +# multiplayer_tab: "Multiplayer" +# 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!" +# auth_caption: "Save your progress." + +# leaderboard: +# view_other_solutions: "View Leaderboards" +# scores: "Scores" +# top_players: "Top Players by" +# day: "Today" +# week: "This Week" +# all: "All-Time" +# time: "Time" +# damage_taken: "Damage Taken" +# damage_dealt: "Damage Dealt" +# difficulty: "Difficulty" +# gold_collected: "Gold Collected" + +# inventory: +# equipped_item: "Equipped" +# required_purchase_title: "Required" +# available_item: "Available" +# restricted_title: "Restricted" +# should_equip: "(double-click to equip)" +# equipped: "(equipped)" +# locked: "(locked)" +# restricted: "(restricted in this level)" +# equip: "Equip" +# unequip: "Unequip" + +# buy_gems: +# few_gems: "A few gems" +# pile_gems: "Pile of gems" +# chest_gems: "Chest of gems" +# purchasing: "Purchasing..." +# declined: "Your card was declined" +# retrying: "Server error, retrying." +# prompt_title: "Not Enough Gems" +# prompt_body: "Do you want to get more?" +# prompt_button: "Enter Shop" +# recovered: "Previous gems purchase recovered. Please refresh the page." +# price: "x{{gems}} / mo" + +# subscribe: +# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!" +# feature1: "__levelsCount__+ basic levels across __worldsCount__ worlds" +# feature2: "__heroesCount__ powerful new heroes with unique skills!" +# feature3: "__bonusLevelsCount__+ bonus levels" +# feature4: "{{gems}} bonus gems every month!" +# feature5: "Video tutorials" +# feature6: "Premium email support" +# feature7: "Private Clans" +# feature8: "No ads!" +# free: "Free" +# month: "month" +# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above." +# subscribe_title: "Subscribe" +# unsubscribe: "Unsubscribe" +# confirm_unsubscribe: "Confirm Unsubscribe" +# never_mind: "Never Mind, I Still Love You" +# thank_you_months_prefix: "Thank you for supporting us these last" +# thank_you_months_suffix: "months." +# thank_you: "Thank you for supporting CodeCombat." +# sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better." +# unsubscribe_feedback_placeholder: "O, what have we done?" +# parent_button: "Ask your parent" +# parent_email_description: "We'll email them so they can buy you a CodeCombat subscription." +# parent_email_input_invalid: "Email address invalid." +# parent_email_input_label: "Parent email address" +# parent_email_input_placeholder: "Enter parent email" +# parent_email_send: "Send Email" +# parent_email_sent: "Email sent!" +# parent_email_title: "What's your parent's email?" +# parents: "For Parents" +# parents_title: "Dear Parent: Your child is learning to code. Will you help them continue?" +# 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" +# stripe_description: "Monthly Subscription" +# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" +# subscription_required_to_play: "You'll need a subscription to play this level." +# unlock_help_videos: "Subscribe to unlock all video tutorials." +# 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" +# 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" + +# choose_hero: +# choose_hero: "Choose Your Hero" +# programming_language: "Programming Language" +# programming_language_description: "Which programming language do you want to use?" +# default: "Default" +# experimental: "Experimental" +# python_blurb: "Simple yet powerful, great for beginners and experts." +# javascript_blurb: "The language of the web. (Not the same as Java.)" +# coffeescript_blurb: "Nicer JavaScript syntax." +# lua_blurb: "Game scripting language." +# java_blurb: "(Subscriber Only) Android and enterprise." +# status: "Status" +# hero_type: "Type" +# weapons: "Weapons" +# weapons_warrior: "Swords - Short Range, No Magic" +# weapons_ranger: "Crossbows, Guns - Long Range, No Magic" +# weapons_wizard: "Wands, Staffs - Long Range, Magic" +# attack: "Damage" # Can also translate as "Attack" +# health: "Health" +# speed: "Speed" +# regeneration: "Regeneration" +# range: "Range" # As in "attack or visual range" +# blocks: "Blocks" # As in "this shield blocks this much damage" +# backstab: "Backstab" # As in "this dagger does this much backstab damage" +# skills: "Skills" +# attack_1: "Deals" +# attack_2: "of listed" +# attack_3: "weapon damage." +# health_1: "Gains" +# health_2: "of listed" +# health_3: "armor health." +# speed_1: "Moves at" +# speed_2: "meters per second." +# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store +# level_to_unlock: "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: "Only certain heroes can play this level." + +# skill_docs: +# function: "function" # skill types +# method: "method" +# snippet: "snippet" +# number: "number" +# array: "array" +# object: "object" +# string: "string" +# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this +# read_only: "read-only" +# action: "Action" +# spell: "Spell" +# action_name: "name" +# action_cooldown: "Takes" +# action_specific_cooldown: "Cooldown" +# action_damage: "Damage" +# action_range: "Range" +# action_radius: "Radius" +# action_duration: "Duration" +# example: "Example" +# ex: "ex" # Abbreviation of "example" +# current_value: "Current Value" +# default_value: "Default value" +# parameters: "Parameters" +# returns: "Returns" +# granted_by: "Granted by" + +# save_load: +# granularity_saved_games: "Saved" +# granularity_change_history: "History" + +# options: +# general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level +# volume_label: "Volume" +# music_label: "Music" +# music_description: "Turn background music on/off." +# editor_config_title: "Editor Configuration" +# editor_config_livecompletion_label: "Live Autocompletion" +# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." + +# 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: "Cofounder, CEO" +# nick_blurb: "Motivation Guru" +# matt_title: "Cofounder, CTO" +# cat_title: "Game Designer" +# cat_blurb: "Airbender" +# scott_title: "Cofounder, Software Engineer" +# scott_blurb: "Reasonable One" +# 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: "UX Design & Research" +# robin_blurb: "Scaffolding" +# josh_title: "Game Designer" +# josh_blurb: "Floor Is Lava" +# phoenix_title: "Software Engineer" +# nolan_title: "Territory Manager" +# elliot_title: "Partnership Manager" +# elliot_blurb: "Mindreader" +# lisa_title: "Market Development Rep" +# retrostyle_title: "Illustration" +# retrostyle_blurb: "RetroStyle Games" +# jose_title: "Music" +# jose_blurb: "Taking Off" +# community_title: "...and our open-source community" +# community_subtitle: "Over 450 contributors have helped build CodeCombat, with more joining every week!" +# community_description_1: "CodeCombat is a community project, with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our" +# community_description_link: "contribute page" +# 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" +# 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" +# next: "Next" +# location_title: "We're located in downtown SF:" + +# teachers: +# who_for_title: "Who is CodeCombat for?" +# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed. We've designed CodeCombat to appeal to both boys and girls." +# who_for_2: "Our Courses system allows teachers to set up classrooms, track progress and assign additional content to students through a dedicated interface." +# more_info_title: "Where can I find more information?" +# more_info_1: "Our" +# more_info_2: "teachers forum" +# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat." +# licenses_needed: "Licenses needed" + +# teachers_quote: +# name: "Demo Form" +# title: "Request a Demo" +# 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: "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" +# organization_label: "Name of School/District" +# city: "City" +# state: "State" +# country: "Country" +# num_students_help: "How many do you anticipate enrolling in CodeCombat?" +# 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" +# 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" +# setup_a_class: "Set Up a Class" + +# versions: +# save_version_title: "Save New Version" +# new_major_version: "New Major Version" +# submitting_patch: "Submitting Patch..." +# cla_prefix: "To save changes, first you must agree to our" +# cla_url: "CLA" +# cla_suffix: "." +# cla_agree: "I AGREE" +# owner_approve: "An owner will need to approve it before your changes will become visible." + +# contact: +# contact_us: "Contact CodeCombat" +# welcome: "Good to hear from you! Use this form to send us email. " +# forum_prefix: "For anything public, please try " +# forum_page: "our forum" +# forum_suffix: " instead." +# faq_prefix: "There's also a" +# faq: "FAQ" +# subscribe_prefix: "If you need help figuring out a level, please" +# subscribe: "buy a CodeCombat subscription" +# subscribe_suffix: "and we'll be happy to help you with your code." +# subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support." +# screenshot_included: "Screenshot included." +# where_reply: "Where should we reply?" +# send: "Send Feedback" + +# account_settings: +# title: "Account Settings" +# not_logged_in: "Log in or create an account to change your settings." +# autosave: "Changes Save Automatically" +# me_tab: "Me" +# picture_tab: "Picture" +# delete_account_tab: "Delete Your Account" +# wrong_email: "Wrong Email" +# wrong_password: "Wrong Password" +# upload_picture: "Upload a picture" +# delete_this_account: "Delete this account permanently" +# reset_progress_tab: "Reset All Progress" +# reset_your_progress: "Clear all your progress and start over" +# god_mode: "God Mode" +# password_tab: "Password" +# emails_tab: "Emails" +# admin: "Admin" +# manage_subscription: "Click here to manage your subscription." +# new_password: "New Password" +# new_password_verify: "Verify" +# type_in_email: "Type in your email or username to confirm account deletion." +# type_in_email_progress: "Type in your email to confirm deleting your progress." +# type_in_password: "Also, type in your password." +# email_subscriptions: "Email Subscriptions" +# email_subscriptions_none: "No Email Subscriptions." +# email_announcements: "Announcements" +# email_announcements_description: "Get emails on the latest news and developments at CodeCombat." +# email_notifications: "Notifications" +# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." +# email_any_notes: "Any Notifications" +# email_any_notes_description: "Disable to stop all activity notification emails." +# email_news: "News" +# email_recruit_notes: "Job Opportunities" +# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job." +# contributor_emails: "Contributor Class Emails" +# contribute_prefix: "We're looking for people to join our party! Check out the " +# contribute_page: "contribute page" +# contribute_suffix: " to find out more." +# email_toggle: "Toggle All" +# error_saving: "Error Saving" +# saved: "Changes Saved" +# password_mismatch: "Password does not match." +# password_repeat: "Please repeat your password." + +# keyboard_shortcuts: +# keyboard_shortcuts: "Keyboard Shortcuts" +# space: "Space" +# enter: "Enter" +# press_enter: "press enter" +# escape: "Escape" +# shift: "Shift" +# run_code: "Run current code." +# run_real_time: "Run in real time." +# continue_script: "Continue past current script." +# skip_scripts: "Skip past all skippable scripts." +# toggle_playback: "Toggle play/pause." +# scrub_playback: "Scrub back and forward through time." +# single_scrub_playback: "Scrub back and forward through time by a single frame." +# scrub_execution: "Scrub through current spell execution." +# toggle_debug: "Toggle debug display." +# toggle_grid: "Toggle grid overlay." +# toggle_pathfinding: "Toggle pathfinding overlay." +# beautify: "Beautify your code by standardizing its formatting." +# maximize_editor: "Maximize/minimize code editor." + +# community: +# main_title: "CodeCombat Community" +# introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!" +# level_editor_prefix: "Use the 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: "We call units within the game 'thangs'. Use the" +# 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: "Find us on these sites" +# social_github: "Check out all our code on GitHub" +# social_blog: "Read the CodeCombat blog on Sett" +# social_discource: "Join the discussion on our Discourse forum" +# social_facebook: "Like CodeCombat on Facebook" +# social_twitter: "Follow CodeCombat on Twitter" +# social_gplus: "Join CodeCombat on Google+" +# social_slack: "Chat with us in the public CodeCombat Slack channel" +# contribute_to_the_project: "Contribute to the project" + +# clans: +# clan: "Clan" +# clans: "Clans" +# new_name: "New clan name" +# new_description: "New clan description" +# make_private: "Make clan private" +# subs_only: "subscribers only" +# create_clan: "Create New Clan" +# private_preview: "Preview" +# private_clans: "Private Clans" +# public_clans: "Public Clans" +# my_clans: "My Clans" +# clan_name: "Clan Name" +# name: "Name" +# chieftain: "Chieftain" +# type: "Type" +# edit_clan_name: "Edit Clan Name" +# edit_clan_description: "Edit Clan Description" +# edit_name: "edit name" +# edit_description: "edit description" +# private: "(private)" +# summary: "Summary" +# average_level: "Average Level" +# average_achievements: "Average Achievements" +# delete_clan: "Delete Clan" +# leave_clan: "Leave Clan" +# join_clan: "Join Clan" +# invite_1: "Invite:" +# invite_2: "*Invite players to this Clan by sending them this link." +# members: "Members" +# progress: "Progress" +# not_started_1: "not started" +# started_1: "started" +# complete_1: "complete" +# exp_levels: "Expand levels" +# rem_hero: "Remove Hero" +# status: "Status" +# complete_2: "Complete" +# started_2: "Started" +# not_started_2: "Not Started" +# view_solution: "Click to view solution." +# view_attempt: "Click to view attempt." +# latest_achievement: "Latest Achievement" +# playtime: "Playtime" +# last_played: "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: +# course: "Course" +# courses: "courses" +# create_new_class: "Create New Class" +# not_enrolled: "You are not enrolled in this course." +# visit_pref: "Please visit the" +# visit_suf: "page to enroll." +# select_class: "Select one of your classes" +# unnamed: "*unnamed*" +# select: "Select" +# unnamed_class: "Unnamed Class" +# edit_settings: "edit class settings" +# edit_settings1: "Edit Class Settings" +# progress: "Class Progress" +# 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:" +# furthest_level: "Furthest level completed:" +# students: "Students" +# students1: "students" +# concepts: "Concepts" +# levels: "levels" +# played: "Played" +# play_time: "Play time:" +# completed: "Completed:" +# invite_students: "Invite students to join this class." +# invite_link_header: "Link to join course" +# invite_link_p_1: "Give this link to students you would like to have join the course." +# invite_link_p_2: "Or have us email them directly:" +# capacity_used: "Course slots used:" +# enter_emails: "Enter student emails to invite, one per line" +# send_invites: "Send Invites" +# creating_class: "Creating class..." +# purchasing_course: "Purchasing course..." +# buy_course: "Buy Course" +# buy_course1: "Buy this course" +# select_all_courses: "Select 'All Courses' for a 50% discount!" +# all_courses: "All Courses" +# number_programming_students: "Number of Programming Students" +# number_total_students: "Total Students in School/District" +# enter_number_students: "Enter the number of students you need for this class." +# name_class: "Name your class" +# displayed_course_page: "This will be displayed on the course page for you and your students. It can be changed later." +# buy: "Buy" +# purchasing_for: "You are purchasing a license for" +# creating_for: "You are creating a class for" +# for: "for" # Like in 'for 30 students' +# receive_code: "Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class." +# free_trial: "Free trial for teachers!" +# get_access: "to get individual access to all courses for evalutaion purposes." +# questions: "Questions?" +# teachers_click: "Teachers Click Here" +# students_click: "Students Click Here" +# courses_on_coco: "Courses on CodeCombat" +# designed_to: "Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours." +# more_in_less: "Learn more in less time" +# no_experience: "No coding experience necesssary" +# easy_monitor: "Easily monitor student progress" +# purchase_for_class: "Purchase a course for your entire class. It's easy to sign up your students!" +# see_the: "See the" +# more_info: "for more information." +# choose_course: "Choose Your Course:" +# enter_code: "Enter an unlock code to join an existing class" +# enter_code1: "Enter unlock code" +# enroll: "Enroll" +# pick_from_classes: "Pick from your current classes" +# enter: "Enter" +# or: "Or" +# topics: "Topics" +# hours_content: "Hours of content:" +# get_free: "Get FREE course" +# enroll_paid: "Enroll Students in Paid Courses" +# you_have1: "You have" +# you_have2: "unused student licenses" +# use_one: "Use 1 student license for" +# use_multiple: "Use licenses for the following students:" +# already_enrolled: "already enrolled" +# licenses_remaining: "licenses remaining:" +# insufficient_enrollments: "insufficient student licenses" +# 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_courses: "Back to my courses" +# edit_details: "Edit class details" +# enrolled_courses: "enrolled in paid courses:" +# purchase_enrollments: "Purchase Student Licenses" +# remove_student: "remove student" +# assign: "Assign" +# to_assign: "to assign paid courses." +# student: "Student" +# teacher: "Teacher" +# complete: "Complete" +# none: "None" +# save: "Save" +# play_campaign_title: "Play the Campaign" +# play_campaign_description: "You’re ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!" +# create_account_title: "Create an Account" +# create_account_description: "Sign up for a FREE CodeCombat account and gain access to more levels, more programming skills, and more fun!" +# preview_campaign_title: "Preview Campaign" +# preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account." +# arena: "Arena" +# arena_soon_title: "Arena Coming Soon" +# arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of" +# not_enrolled1: "Not enrolled" +# not_enrolled2: "Ask your teacher to enroll you in the next course." +# next_course: "Next Course" +# coming_soon1: "Coming soon" +# coming_soon2: "We are hard at work making more courses for you!" +# available_levels: "Available Levels" +# welcome_to_courses: "Adventurers, welcome to Courses!" +# ready_to_play: "Ready to play?" +# start_new_game: "Start New Game" +# play_now_learn_header: "Play now to learn" +# play_now_learn_1: "basic syntax to control your character" +# play_now_learn_2: "while loops to solve pesky puzzles" +# play_now_learn_3: "strings & variables to customize actions" +# play_now_learn_4: "how to defeat an ogre (important life skills!)" +# welcome_to_page: "Welcome to your Courses page!" +# completed_hoc: "Amazing! You've completed the Hour of Code course!" +# ready_for_more_header: "Ready for more? Play the campaign mode!" +# ready_for_more_1: "Use gems to unlock new items!" +# ready_for_more_2: "Play through brand new worlds and challenges" +# ready_for_more_3: "Learn even more programming!" +# saved_games: "Saved Games" +# hoc: "Hour of Code" +# my_classes: "My Classes" +# class_added: "Class successfully added!" +# view_class: "view class" +# view_levels: "view levels" +# 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" +# start: "Start" +# last_level: "Last Level" +# welcome_to_hoc: "Adventurers, welcome to our Hour of Code!" +# logged_in_as: "Logged in as:" +# not_you: "Not you?" +# welcome_back: "Hi adventurer, welcome back!" +# continue_playing: "Continue Playing" +# more_options: "More options:" +# option1_header: "Option 1: Invite students via email" +# option1_body: "Students will automatically be sent an invitation to join this class, and will need to create an account with a username and password." +# option2_header: "Option 2: Send URL to your students" +# option2_body: "Students will be asked to enter an email address, username and password to create an account." +# option3_header: "Option 3: Direct students to codecombat.com/courses" +# option3_body: "Give students the following passcode to enter along with an email address, username and password when they create an account." +# thank_you_pref: "Thank you for your purchase! You can now assign" +# thank_you_suff: "more students to paid courses." +# return_to_class: "Return to classroom" +# return_to_course_man: "Return to course management." +# students_not_enrolled: "students not enrolled" +# total_all_classes: "Total Across All Classes" +# how_many_enrollments: "How many additional student licenses do you need?" +# each_student_access: "Each student in a class will get access to Courses 2-4 once they are enrolled in paid courses. You may assign each course to each student individually." +# purchase_now: "Purchase Now" +# enrollments: "licenses" +# 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" +# to_join_ask: "To join a class, ask your teacher for an unlock code." +# join_this_class: "Join Class" +# enter_here: "" +# successfully_joined: "Successfully joined" +# click_to_start: "Click here to start taking" +# my_courses: "My Courses" +# classroom: "Classroom" +# use_school_email: "use your school email if you have one" +# unique_name: "a unique name no one has chosen" +# pick_something: "pick something you can remember" +# class_code: "Class Code" +# optional_ask: "optional - ask your teacher to give you one!" +# optional_school: "optional - what school do you go to?" +# start_playing: "Start Playing" +# skip_this: "Skip this, I'll create an account later!" +# welcome: "Welcome" +# getting_started: "Getting Started with Courses" +# download_getting_started: "Download Getting Started Guide [PDF]" +# getting_started_1: "Create a new class by clicking the green 'Create New Class' button below." +# getting_started_2: "Once you've created a class, click the blue 'Add Students' button." +# getting_started_3: "You'll see student's progress below as they sign up and join your class." +# educator_wiki_pref: "Or check out our new" +# educator_wiki_mid: "educator wiki" +# educator_wiki_suff: "to browse the guide online." +# your_classes: "Your Classes" +# no_classes: "No classes yet!" +# create_new_class1: "create new class" +# available_courses: "Available Courses" +# unused_enrollments: "Unused licenses available:" +# students_access: "All students get access to Introduction to Computer Science for free. One license per student is required to assign them to paid CodeCombat courses. A single student does not need multiple licenses to access all paid courses." +# active_courses: "active courses" +# no_students: "No students yet!" +# add_students1: "add students" +# view_edit: "view/edit" +# students_enrolled: "students enrolled" +# students_assigned: "students assigned" +# length: "Length:" +# title: "Courses" # Flat style redesign +# subtitle: "Review course guidelines, solutions, and levels" +# changelog: "View latest changes to course levels." +# select_language: "Select language" +# select_level: "Select level" +# play_level: "Play Level" +# concepts_covered: "Concepts covered" +# print_guide: "Print Guide (PDF)" +# view_guide_online: "View Guide Online (PDF)" +# last_updated: "Last updated:" +# grants_lifetime_access: "Grants access to all Courses." +# enrollment_credits_available: "Licenses Available:" +# description: "Description" # ClassroomSettingsModal +# language_select: "Select a language" +# language_cannot_change: "Language cannot be changed once students join a class." +# learn_p: "Learn Python" +# learn_j: "Learn JavaScript" +# 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:" # {change} +# 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." +# update_account_remain_student: "Remain a Student" +# update_account_update_student: "Update to Student" +# 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 \"Select Hero\"" +# select_this_hero: "Select this Hero" + +# teacher: +# teacher_dashboard: "Teacher Dashboard" # Navbar +# my_classes: "My Classes" +# courses: "Course Guides" +# enrollments: "Student Licenses" +# resources: "Resources" +# help: "Help" +# students: "Students" # Shared +# language: "Language" +# edit_class_settings: "edit class settings" +# complete: "Complete" +# 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." +# try_refreshing: "(You may need to refresh the page)" +# add_students: "Add Students" +# 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" +# adding_students: "Adding students" +# 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" +# started: "Started" +# click_to_view_progress: "click to view progress" +# no_progress: "No progress" +# select_course: "Select course to view" +# course_overview: "Course Overview" +# copy_class_code: "Copy Class Code" +# class_code_blurb: "New students can enter this class code on their dashboard or visit codecombat.com/courses to join the class." +# copy_class_url: "Copy Class URL" +# class_join_url_blurb: "New students can visit this URL while logged in to join the class." +# add_students_manually: "Add Students Manually" +# bulk_assign: "Bulk-assign" +# assign_to_selected_students: "Assign to Selected Students" +# assigned: "Assigned" +# enroll_selected_students: "Enroll Selected Students" +# cant_assign_to_unenrolled: "Course cannot be assigned to students who are not enrolled." +# no_students_selected: "No students were selected." +# guides_coming_soon: "Guides coming soon!" # Courses +# show_students_from: "Show students from" # Enroll students modal +# enroll_the_following_students: "Enroll the following students" +# all_students: "All Students" +# enroll_students: "Enroll Students" +# not_enough_enrollments: "Not enough licenses available." +# enrollments_blurb_1: "Students taking Computer Science" +# enrollments_blurb_2: "require a license to access the courses." +# credits_available: "Licenses Available" +# total_unique_students: "Total Students" +# total_enrolled_students: "Enrolled Students" +# unenrolled_students: "Unenrolled Students" +# add_enrollment_credits: "Add Licenses" +# purchasing: "Purchasing..." +# purchased: "Purchased!" +# purchase_now: "Purchase Now" +# how_to_enroll: "How to Enroll Students" +# how_to_enroll_blurb_1: "If a student is not enrolled yet, there will be an \"Enroll\" button next to their course progress in your class." +# how_to_enroll_blurb_2: "To bulk-enroll multiple students, select them using the checkboxes on the left side of the classroom page and click the \"Enroll Selected Students\" button." +# how_to_enroll_blurb_3: "Once a student is enrolled, they will have access to all of the course content." +# bulk_pricing_blurb: "Purchasing for more than 25 students? Contact us to discuss next steps." +# total_unenrolled: "Total unenrolled" +# 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" # {change} +# pending_credits: "Pending Licenses" # {change} +# credits: "licenses" +# start_date: "start date:" +# end_date: "end date:" +# num_enrollments_needed: "Number of licenses needed:" # {change} +# get_enrollments_blurb: " We'll help you build a solution that meets the needs of your class, school or district." +# enroll_request_sent_blurb1: "Thanks! Your request has been sent." +# enroll_request_sent_blurb2: "Our classroom success team will be in touch shortly to help you find the best solution for your students' needs!" +# enroll_request_sent_blurb3: "Please reach out to schools@codecombat.com if you have additional questions at this time." +# request_sent: "Request Sent!" +# enrollment_status: "Enrollment Status" +# status_expired: "Expired on {{date}}" +# status_not_enrolled: "Not Enrolled" +# status_enrolled: "Expires on {{date}}" +# select_all: "Select All" +# projects: "Projects" + +# sharing: +# game: "Game" +# webpage: "Webpage" +# 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" +# image_gallery_description: "Copy these images into your webpage, or find your own image URLs online." + +# classes: +# archmage_title: "Archmage" +# archmage_title_description: "(Coder)" +# archmage_summary: "If you are a developer interested in coding educational games, become an archmage to help us build CodeCombat!" +# artisan_title: "Artisan" +# artisan_title_description: "(Level Builder)" +# artisan_summary: "Build and share levels for you and your friends to play. Become an Artisan to learn the art of teaching others to program." +# adventurer_title: "Adventurer" +# adventurer_title_description: "(Level Playtester)" +# adventurer_summary: "Get our new levels (even our subscriber content) for free one week early and help us work out bugs before our public release." +# scribe_title: "Scribe" +# scribe_title_description: "(Article Editor)" +# scribe_summary: "Good code needs good documentation. Write, edit, and improve the docs read by millions of players across the globe." +# diplomat_title: "Diplomat" +# diplomat_title_description: "(Translator)" +# diplomat_summary: "CodeCombat is localized in 45+ languages by our Diplomats. Help us out and contribute translations." +# ambassador_title: "Ambassador" +# ambassador_title_description: "(Support)" +# ambassador_summary: "Tame our forum users and provide direction for those with questions. Our ambassadors represent CodeCombat to the world." +# teacher_title: "Teacher" + +# editor: +# main_title: "CodeCombat Editors" +# article_title: "Article Editor" +# thang_title: "Thang Editor" +# level_title: "Level Editor" +# achievement_title: "Achievement Editor" +# poll_title: "Poll Editor" +# back: "Back" +# revert: "Revert" +# revert_models: "Revert Models" +# pick_a_terrain: "Pick A Terrain" +# dungeon: "Dungeon" +# indoor: "Indoor" +# desert: "Desert" +# grassy: "Grassy" +# mountain: "Mountain" +# glacier: "Glacier" +# small: "Small" +# large: "Large" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# generate_terrain: "Generate Terrain" +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# thang_main: "Main" +# thang_spritesheets: "Spritesheets" +# thang_colors: "Colors" +# level_some_options: "Some Options?" +# level_tab_thangs: "Thangs" +# level_tab_scripts: "Scripts" +# level_tab_settings: "Settings" +# level_tab_components: "Components" +# level_tab_systems: "Systems" +# level_tab_docs: "Documentation" +# level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" +# level_tab_thangs_conditions: "Starting Conditions" +# level_tab_thangs_add: "Add Thangs" +# level_tab_thangs_search: "Search thangs" +# add_components: "Add Components" +# component_configs: "Component Configurations" +# config_thang: "Double click to configure a thang" +# delete: "Delete" +# duplicate: "Duplicate" +# stop_duplicate: "Stop Duplicate" +# rotate: "Rotate" +# level_settings_title: "Settings" +# level_component_tab_title: "Current Components" +# level_component_btn_new: "Create New Component" +# level_systems_tab_title: "Current Systems" +# level_systems_btn_new: "Create New System" +# level_systems_btn_add: "Add System" +# level_components_title: "Back to All Thangs" +# level_components_type: "Type" +# level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" +# level_system_edit_title: "Edit System" +# create_system_title: "Create New System" +# new_component_title: "Create New Component" +# new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# new_article_title_login: "Log In to Create a New Article" +# new_thang_title_login: "Log In to Create a New Thang Type" +# new_level_title_login: "Log In to Create a New Level" +# new_achievement_title: "Create a New Achievement" +# new_achievement_title_login: "Log In to Create a New Achievement" +# new_poll_title: "Create a New Poll" +# new_poll_title_login: "Log In to Create a New Poll" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" +# achievement_search_title: "Search Achievements" +# poll_search_title: "Search Polls" +# read_only_warning2: "Note: you can't save any edits here, because you're not logged in." +# no_achievements: "No achievements have been added for this level yet." +# achievement_query_misc: "Key achievement off of miscellanea" +# achievement_query_goals: "Key achievement off of level goals" +# level_completion: "Level Completion" +# pop_i18n: "Populate I18N" +# tasks: "Tasks" +# clear_storage: "Clear your local changes" +# add_system_title: "Add Systems to Level" +# done_adding: "Done Adding" + +# article: +# edit_btn_preview: "Preview" +# edit_article_title: "Edit Article" + +# polls: +# priority: "Priority" + +# contribute: +# page_title: "Contributing" +# 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: "Hey there!" +# 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: "Knowledge in " +# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." +# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." +# how_to_join: "How To Join" +# join_desc_1: "Anyone can help out! Just check out our " +# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " +# join_desc_3: ", or find us in our " +# join_desc_4: "and we'll go from there!" +# join_url_email: "Email us" +# join_url_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:" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses." +# simulate_games: "Simulate Games!" +# games_simulated_by: "Games simulated by you:" +# games_simulated_for: "Games simulated for you:" +# games_in_queue: "Games currently in the queue:" +# games_simulated: "Games simulated" +# games_played: "Games played" +# ratio: "Ratio" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# rank_last_submitted: "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: "Choose an Opponent" +# select_your_language: "Select your language!" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple CPU" +# warmup: "Warmup" +# friends_playing: "Friends Playing" +# log_in_for_friends: "Log in to play with your friends!" +# social_connect_blurb: "Connect and play against your friends!" +# invite_friends_to_battle: "Invite your friends to join you in battle!" +# fight: "Fight!" +# watch_victory: "Watch your victory" +# defeat_the: "Defeat the" +# watch_battle: "Watch the battle" +# tournament_started: ", started" +# tournament_ends: "Tournament ends" +# tournament_ended: "Tournament ended" +# tournament_rules: "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" +# tournament_blurb_blog: "on our blog" +# rules: "Rules" +# winners: "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" + +# user: +# stats: "Stats" +# singleplayer_title: "Singleplayer Levels" +# multiplayer_title: "Multiplayer Levels" +# achievements_title: "Achievements" +# last_played: "Last Played" +# status: "Status" +# status_completed: "Completed" +# status_unfinished: "Unfinished" +# no_singleplayer: "No Singleplayer games played yet." +# no_multiplayer: "No Multiplayer games played yet." +# no_achievements: "No Achievements earned yet." +# favorite_prefix: "Favorite language is " +# favorite_postfix: "." +# not_member_of_clans: "Not a member of any clans yet." + +# achievements: +# last_earned: "Last Earned" +# amount_achieved: "Amount" +# achievement: "Achievement" +# current_xp_prefix: "" +# current_xp_postfix: " in total" +# new_xp_prefix: "" +# new_xp_postfix: " earned" +# left_xp_prefix: "" +# left_xp_infix: " until level " +# left_xp_postfix: "" + +# account: +# payments: "Payments" +# prepaid_codes: "Prepaid Codes" +# purchased: "Purchased" +# subscription: "Subscription" +# invoices: "Invoices" +# service_apple: "Apple" +# service_web: "Web" +# paid_on: "Paid On" +# service: "Service" +# price: "Price" +# gems: "Gems" +# active: "Active" +# subscribed: "Subscribed" +# unsubscribed: "Unsubscribed" +# active_until: "Active Until" +# cost: "Cost" +# next_payment: "Next Payment" +# card: "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!" +# back_to_student_page: "Go back to student things" +# back_to_teacher_page: "Go to My Classes" +# back_to_game: "Go play some more levels!" +# verify_error: "Something went wrong when verifying your email :(" + +# account_invoices: +# amount: "Amount in US dollars" +# declined: "Your card was declined" +# invalid_amount: "Please enter a US dollar amount." +# not_logged_in: "Log in or create an account to access invoices." +# pay: "Pay Invoice" +# purchasing: "Purchasing..." +# retrying: "Server error, retrying." +# success: "Successfully paid. Thanks!" + +# account_prepaid: +# purchase_code: "Purchase a Subscription Code" +# purchase_code1: "Subscription Codes can be redeemed to add premium subscription time to one or more CodeCombat accounts." +# purchase_code2: "Each CodeCombat account can only redeem a particular Subscription Code once." +# purchase_code3: "Subscription Code months will be added to the end of any existing subscription on the account." +# users: "Users" +# months: "Months" +# purchase_total: "Total" +# 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." + +# coppa_deny: +# text1: "Can’t wait to learn programming?" +# text2: "Your parents will need to create an account for you to use! Email team@codecombat.com if you have any questions." +# close: "Close Window" + +# loading_error: +# could_not_load: "Error loading from server" +# connection_failure: "Connection Failed" +# 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: "You need to be signed in. Do you have cookies disabled?" +# forbidden: "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" +# not_found_desc: "Hm, there’s nothing here. Visit one of the following links to get back to programming!" +# not_allowed: "Method not allowed." +# timeout: "Server Timeout" +# conflict: "Resource conflict." +# bad_input: "Bad input." +# server_error: "Server error." +# unknown: "Unknown Error" +# 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!" + +# resources: +# level: "Level" +# patch: "Patch" +# patches: "Patches" +# system: "System" +# systems: "Systems" +# component: "Component" +# components: "Components" +# hero: "Hero" +# campaigns: "Campaigns" + +# concepts: +# advanced_strings: "Advanced Strings" +# algorithms: "Algorithms" +# arguments: "Arguments" +# arithmetic: "Arithmetic" +# arrays: "Arrays" +# basic_syntax: "Basic Syntax" +# boolean_logic: "Boolean Logic" +# break_statements: "Break Statements" +# classes: "Classes" +# continue_statements: "Continue Statements" +# for_loops: "For Loops" +# functions: "Functions" +# graphics: "Graphics" +# if_statements: "If Statements" +# input_handling: "Input Handling" +# math_operations: "Math Operations" +# object_literals: "Object Literals" +# parameters: "Parameters" +# strings: "Strings" +# variables: "Variables" +# vectors: "Vectors" +# while_loops: "While Loops" +# recursion: "Recursion" +# basic_html: "Basic HTML" # TODO: these web-dev concepts will change, don't need to translate +# 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" +# jquery: "jQuery" +# bootstrap: "Bootstrap" + +# delta: +# added: "Added" +# modified: "Modified" +# not_modified: "Not Modified" +# deleted: "Deleted" +# moved_index: "Moved Index" +# text_diff: "Text Diff" +# merge_conflict_with: "MERGE CONFLICT WITH" +# no_changes: "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_description: "Description" +# rights_writings: "Writings" +# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." +# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." +# nutshell_title: "In a Nutshell" +# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." +# canonical: "The English version of this document is the definitive, canonical version. If there are any 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" diff --git a/app/locale/locale.coffee b/app/locale/locale.coffee index e012325c5..da25b94b4 100644 --- a/app/locale/locale.coffee +++ b/app/locale/locale.coffee @@ -39,6 +39,7 @@ module.exports = 'id': { nativeDescription: 'Bahasa Indonesia', englishDescription: 'Indonesian' } 'it': { nativeDescription: 'Italiano', englishDescription: 'Italian' } 'he': { nativeDescription: 'עברית', englishDescription: 'Hebrew' } + 'hr': { nativeDescription: 'hrvatski jezik', englishDescription: 'Croatian' } 'hu': { nativeDescription: 'magyar', englishDescription: 'Hungarian' } 'lt': { nativeDescription: 'lietuvių kalba', englishDescription: 'Lithuanian' } 'mk-MK': { nativeDescription: 'Македонски', englishDescription: 'Macedonian' } diff --git a/app/views/contribute/DiplomatView.coffee b/app/views/contribute/DiplomatView.coffee index 1a17f67bf..59362a370 100644 --- a/app/views/contribute/DiplomatView.coffee +++ b/app/views/contribute/DiplomatView.coffee @@ -56,6 +56,7 @@ require("locale/eo") require("locale/uz") require("locale/my") require("locale/et") +require("locale/hr") module.exports = class DiplomatView extends ContributeClassView id: 'diplomat-view' From 66817657f0c1f7db476311f9564341f4923fb5f9 Mon Sep 17 00:00:00 2001 From: themaka Date: Fri, 29 Jul 2016 15:34:34 -0400 Subject: [PATCH 02/18] =?UTF-8?q?Added=20"te=20reo=20M=C4=81ori"=20(M?= =?UTF-8?q?=C4=81ori)=20to=20locale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/locale/locale.coffee | 1 + app/locale/mi.coffee | 2018 ++++++++++++++++++++++ app/views/contribute/DiplomatView.coffee | 1 + 3 files changed, 2020 insertions(+) create mode 100644 app/locale/mi.coffee diff --git a/app/locale/locale.coffee b/app/locale/locale.coffee index da25b94b4..dca1e7246 100644 --- a/app/locale/locale.coffee +++ b/app/locale/locale.coffee @@ -42,6 +42,7 @@ module.exports = 'hr': { nativeDescription: 'hrvatski jezik', englishDescription: 'Croatian' } 'hu': { nativeDescription: 'magyar', englishDescription: 'Hungarian' } 'lt': { nativeDescription: 'lietuvių kalba', englishDescription: 'Lithuanian' } + 'mi': { nativeDescription: 'te reo Māori', englishDescription: 'Māori' } 'mk-MK': { nativeDescription: 'Македонски', englishDescription: 'Macedonian' } 'hi': { nativeDescription: 'मानक हिन्दी', englishDescription: 'Hindi' } 'ms': { nativeDescription: 'Bahasa Melayu', englishDescription: 'Bahasa Malaysia' } diff --git a/app/locale/mi.coffee b/app/locale/mi.coffee new file mode 100644 index 000000000..2ff327e60 --- /dev/null +++ b/app/locale/mi.coffee @@ -0,0 +1,2018 @@ +# home: +# slogan: "Learn to Code by Playing a Game" +# no_ie: "CodeCombat does not run in Internet Explorer 8 or older. Sorry!" # Warning that only shows up in IE8 and older +# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!" # Warning that shows up on mobile devices +# play: "Play" # The big play button that opens up the campaign view. +# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses +# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari +# old_browser_suffix: "You can try anyway, but it probably won't work." +# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval." +# campaign: "Campaign" +# for_beginners: "For Beginners" +# multiplayer: "Multiplayer" # Not currently shown on home page +# for_developers: "For Developers" # Not currently shown on home page. +# or_ipad: "Or download for iPad" + +# new_home: +# slogan: "The most engaging game for learning programming." +# classroom_edition: "Classroom Edition:" +# learn_to_code: "Learn to code:" +# teacher: "Teacher" +# student: "Student" +# play_now: "Play Now" +# im_a_teacher: "I'm a Teacher" +# im_a_student: "I'm a Student" +# learn_more: "Learn more" +# classroom_in_a_box: "A classroom in-a-box for teaching computer science." +# codecombat_is: "CodeCombat is a platform 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." +# top_screenshots_hint: "Students write code and see their changes update in real-time" +# designed_with: "Designed with teachers in mind" +# real_code: "Real, typed code" +# from_the_first_level: "from the first level" +# getting_students: "Getting students to typed code as quickly as possible is critical to learning programming syntax and proper structure." +# educator_resources: "Educator resources" +# course_guides: "and course guides" +# teaching_computer_science: "Teaching computer science does not require a costly degree, because we provide tools to support educators of all backgrounds." +# accessible_to: "Accessible to" +# everyone: "everyone" +# democratizing: "Democratizing the process of learning coding is at the core of our philosophy. Everyone should be able to learn to code." +# forgot_learning: "I think they actually forgot that they were actually learning something." +# wanted_to_do: " Coding is something I've always wanted to do, and I never thought I would be able to learn it in school." +# why_games: "Why is learning through games important?" +# games_reward: "Games reward the productive struggle." +# encourage: "Gaming is a medium that encourages interaction, discovery, and trial-and-error. A good game challenges the player to master skills over time, which is the same critical process students go through as they learn." +# excel: "Games excel at rewarding" +# struggle: "productive struggle" +# kind_of_struggle: "the kind of struggle that results in learning that’s engaging and" +# motivating: "motivating" +# not_tedious: "not tedious." +# gaming_is_good: "Studies suggest gaming is good for children’s brains. (it’s true!)" +# 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" +# view_my_classes: "View my classes" +# computer_science: "Computer science courses for all ages" +# show_me_lesson_time: "Show me lesson time estimates for:" +# curriculum: "Total curriculum hours:" +# ffa: "Free for all students" +# lesson_time: "Lesson time:" +# coming_soon: "Coming this fall!" +# courses_available_in: "Courses are available in JavaScript, Python, and Java (coming soon!)" +# 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." +# teachers: "Teachers!" +# teachers_and_educators: "Teachers & Educators" +# class_in_box: "Learn how our classroom-in-a-box platform fits into your curriculum." +# get_started: "Get Started" +# students: "Students:" +# join_class: "Join Class" +# role: "Your role:" +# student_count: "Number of students:" +# start_playing_for_free: "Start Playing for Free!" +# students_and_players: "Students & Players" +# goto_classes: "Go to My Classes" +# view_profile: "View My Profile" +# view_progress: "View Progress" +# check_out_wiki: "Check out our new Educator Wiki" +# want_coco: "Want CodeCombat at your school?" +# form_select_role: "Select primary role" +# form_select_range: "Select class size" + +# nav: +# play: "Levels" # The top nav bar entry where players choose which levels to play +# community: "Community" +# courses: "Courses" +# editor: "Editor" +# blog: "Blog" +# forum: "Forum" +# account: "Account" +# my_account: "My Account" +# profile: "Profile" +# stats: "Stats" +# code: "Code" +# home: "Home" +# contribute: "Contribute" +# legal: "Legal" +# about: "About" +# contact: "Contact" +# twitter_follow: "Follow" +# students: "Students" +# teachers: "Teachers" +# careers: "Careers" +# facebook: "Facebook" +# twitter: "Twitter" +# create_a_class: "Create a Class" +# other: "Other" +# learn_to_code: "Learn to Code!" +# toggle_nav: "Toggle navigation" +# jobs: "Jobs" +# schools: "Schools" +# educator_wiki: "Educator Wiki" +# 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!" + +# modal: +# cancel: "Cancel" +# close: "Close" +# okay: "Okay" + +# not_found: +# page_not_found: "Page not found" + + diplomat_suggestion: +# title: "Help translate CodeCombat!" # This shows up when a player switches to a non-English language using the language selector. +# sub_heading: "We need your language skills." + pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Māori but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Māori." + missing_translations: "Until we can translate everything into Māori, you'll see English when Māori isn't available." +# learn_more: "Learn more about being a Diplomat" +# subscribe_as_diplomat: "Subscribe as a Diplomat" + +# play: +# play_as: "Play As" # Ladder page +# compete: "Compete!" # Course details page +# spectate: "Spectate" # Ladder page +# players: "players" # Hover over a level on /play +# hours_played: "hours played" # Hover over a level on /play +# items: "Items" # Tooltip on item shop button from /play +# unlock: "Unlock" # For purchasing items and heroes +# confirm: "Confirm" +# owned: "Owned" # For items you own +# locked: "Locked" +# purchasable: "Purchasable" # For a hero you unlocked but haven't purchased +# available: "Available" +# skills_granted: "Skills Granted" # Property documentation details +# heroes: "Heroes" # Tooltip on hero shop button from /play +# achievements: "Achievements" # Tooltip on achievement list button from /play +# account: "Account" # Tooltip on account button from /play +# settings: "Settings" # Tooltip on settings button from /play +# poll: "Poll" # Tooltip on poll button from /play +# next: "Next" # Go from choose hero to choose inventory before playing a level +# change_hero: "Change Hero" # Go back from choose inventory to choose hero +# buy_gems: "Buy Gems" +# subscription_required: "Subscription Required" +# anonymous: "Anonymous Player" +# level_difficulty: "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: "Beginner Campaign" +# awaiting_levels_adventurer_prefix: "We release new levels every week." +# awaiting_levels_adventurer: "Sign up as an Adventurer" +# awaiting_levels_adventurer_suffix: "to be the first to play new levels." +# adjust_volume: "Adjust volume" +# campaign_multiplayer: "Multiplayer Arenas" +# campaign_multiplayer_description: "... in which you code head-to-head against other players." +# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" +# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." + +# 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" + +# share_progress_modal: +# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat." +# email_invalid: "Email address invalid." +# form_blurb: "Enter your parent's email below and we’ll show them!" +# form_label: "Email Address" +# placeholder: "email address" +# title: "Excellent Work, Apprentice" + +# login: +# sign_up: "Create Account" +# email_or_username: "Email or username" +# log_in: "Log In" +# logging_in: "Logging In" +# log_out: "Log Out" +# forgot_password: "Forgot your password?" +# authenticate_gplus: "Authenticate G+" +# load_profile: "Load G+ Profile" +# finishing: "Finishing" +# sign_in_with_facebook: "Sign in with Facebook" +# sign_in_with_gplus: "Sign in with G+" +# signup_switch: "Want to create an account?" + +# signup: +# create_student_header: "Create Student Account" +# create_teacher_header: "Create Teacher Account" +# create_individual_header: "Create Individual Account" +# create_header: "Create Account" +# email_announcements: "Receive announcements about new CodeCombat levels and features!" +# creating: "Creating Account..." +# create_account: "Create Account" +# sign_up: "Sign Up" +# log_in: "log in with password" +# required: "You need to log in before you can go that way." +# login_switch: "Already have an account?" +# school_name: "School Name and City" +# optional: "optional" +# school_name_placeholder: "Example High School, Springfield, IL" +# connect_with: "Connect with:" +# connected_gplus_header: "You've successfully connected with Google+!" +# connected_gplus_p: "Finish signing up so you can log in with your Google+ account." +# gplus_exists: "You already have an account associated with Google+!" +# connected_facebook_header: "You've successfully connected with Facebook!" +# connected_facebook_p: "Finish signing up so you can log in with your Facebook account." +# facebook_exists: "You already have an account associated with Facebook!" +# hey_students: "Students, enter the class code from your teacher." +# 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:" # {change} +# 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:" +# 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:" + +# recover: +# recover_account_title: "Recover Account" +# send_password: "Send Recovery Password" +# recovery_sent: "Recovery email sent." + +# items: +# primary: "Primary" +# secondary: "Secondary" +# armor: "Armor" +# accessories: "Accessories" +# misc: "Misc" +# books: "Books" + + common: +# back: "Back" # When used as an action verb, like "Navigate backward" +# continue: "Continue" # When used as an action verb, like "Continue forward" + loading: "Loading..." +# saving: "Saving..." +# sending: "Sending..." +# send: "Send" +# sent: "Sent" +# type: "Type" +# cancel: "Cancel" +# save: "Save" +# publish: "Publish" +# create: "Create" +# fork: "Fork" +# play: "Play" # When used as an action verb, like "Play next level" +# retry: "Retry" +# actions: "Actions" +# info: "Info" +# help: "Help" +# watch: "Watch" +# unwatch: "Unwatch" +# submit_patch: "Submit Patch" +# submit_changes: "Submit Changes" +# save_changes: "Save Changes" +# required_field: "Required field" + +# general: +# and: "and" +# name: "Name" +# date: "Date" +# body: "Body" +# version: "Version" +# pending: "Pending" +# accepted: "Accepted" +# rejected: "Rejected" +# withdrawn: "Withdrawn" +# accept: "Accept" +# reject: "Reject" +# withdraw: "Withdraw" +# submitter: "Submitter" +# submitted: "Submitted" +# commit_msg: "Commit Message" +# version_history: "Version History" +# version_history_for: "Version History for: " +# select_changes: "Select two changes below to see the difference." +# undo_prefix: "Undo" +# undo_shortcut: "(Ctrl+Z)" +# redo_prefix: "Redo" +# redo_shortcut: "(Ctrl+Shift+Z)" +# play_preview: "Play preview of current level" +# result: "Result" +# results: "Results" +# description: "Description" +# or: "or" +# subject: "Subject" +# email: "Email" +# password: "Password" +# confirm_password: "Confirm Password" +# message: "Message" +# code: "Code" +# ladder: "Ladder" +# when: "When" +# opponent: "Opponent" +# rank: "Rank" +# score: "Score" +# win: "Win" +# loss: "Loss" +# tie: "Tie" +# easy: "Easy" +# medium: "Medium" +# hard: "Hard" +# player: "Player" +# player_level: "Level" # Like player level 5, not like level: Dungeons of Kithgard +# warrior: "Warrior" +# ranger: "Ranger" +# wizard: "Wizard" +# first_name: "First Name" +# last_name: "Last Name" +# last_initial: "Last Initial" +# username: "Username" + +# units: +# second: "second" +# seconds: "seconds" +# minute: "minute" +# minutes: "minutes" +# hour: "hour" +# hours: "hours" +# day: "day" +# days: "days" +# week: "week" +# weeks: "weeks" +# month: "month" +# months: "months" +# year: "year" +# years: "years" + +# play_level: +# level_complete: "Level Complete" +# completed_level: "Completed Level:" +# course: "Course:" +# done: "Done" +# next_level: "Next Level" +# next_game: "Next game" +# programming_language: "Programming language" +# show_menu: "Show game menu" +# home: "Home" # Not used any more, will be removed soon. +# level: "Level" # Like "Level: Dungeons of Kithgard" +# skip: "Skip" +# game_menu: "Game Menu" +# guide: "Guide" +# restart: "Restart" +# goals: "Goals" +# goal: "Goal" +# running: "Running..." +# success: "Success!" +# incomplete: "Incomplete" +# timed_out: "Ran out of time" +# failing: "Failing" +# reload: "Reload" +# reload_title: "Reload All Code?" +# reload_really: "Are you sure you want to reload this level back to the beginning?" +# reload_confirm: "Reload All" +# victory: "Victory" +# victory_title_prefix: "" +# victory_title_suffix: " Complete" +# victory_sign_up: "Sign Up to Save Progress" +# victory_sign_up_poke: "Want to save your code? Create a free account!" +# victory_rate_the_level: "How fun was this level?" +# victory_return_to_ladder: "Return to Ladder" +# victory_saving_progress: "Saving Progress" +# victory_go_home: "Go Home" +# victory_review: "Tell us more!" +# victory_review_placeholder: "How was the level?" +# victory_hour_of_code_done: "Are You Done?" +# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!" +# victory_experience_gained: "XP Gained" +# victory_gems_gained: "Gems Gained" +# victory_new_item: "New Item" +# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." +# victory_become_a_viking: "Become a Viking" +# victory_no_progress_for_teachers: "Progress is not saved for teachers. But, you can add a student account to your classroom for yourself." +# guide_title: "Guide" +# tome_cast_button_run: "Run" +# tome_cast_button_running: "Running" +# tome_cast_button_ran: "Ran" +# tome_submit_button: "Submit" +# tome_reload_method: "Reload original code to restart the level" +# tome_available_spells: "Available Spells" +# tome_your_skills: "Your Skills" +# tome_current_method: "Current Method" +# hints: "Hints" +# hints_title: "Hint {{number}}" +# code_saved: "Code Saved" +# skip_tutorial: "Skip (esc)" +# keyboard_shortcuts: "Key Shortcuts" +# loading_ready: "Ready!" +# loading_start: "Start Level" +# problem_alert_title: "Fix Your Code" +# time_current: "Now:" +# time_total: "Max:" +# time_goto: "Go to:" +# non_user_code_problem_title: "Unable to Load Level" +# infinite_loop_title: "Infinite Loop Detected" +# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." +# check_dev_console: "You can also open the developer console to see what might be going wrong." +# check_dev_console_link: "(instructions)" +# infinite_loop_try_again: "Try Again" +# infinite_loop_reset_level: "Reset Level" +# infinite_loop_comment_out: "Comment Out My Code" +# tip_toggle_play: "Toggle play/paused with Ctrl+P." +# tip_scrub_shortcut: "Use Ctrl+[ and Ctrl+] to rewind and fast-forward." +# tip_guide_exists: "Click the guide, inside game menu (at the top of the page), for useful info." +# tip_open_source: "CodeCombat is 100% open source!" +# tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!" +# tip_beta_launch: "CodeCombat launched its beta in October, 2013." +# tip_think_solution: "Think of the solution, not the problem." +# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" +# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" +# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" +# tip_forums: "Head over to the forums and tell us what you think!" +# tip_baby_coders: "In the future, even babies will be Archmages." +# tip_morale_improves: "Loading will continue until morale improves." +# tip_all_species: "We believe in equal opportunities to learn programming for all species." +# tip_reticulating: "Reticulating spines." +# tip_harry: "Yer a Wizard, " +# tip_great_responsibility: "With great coding skill comes great debug responsibility." +# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep." +# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't." +# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" +# tip_no_try: "Do. Or do not. There is no try. - Yoda" +# tip_patience: "Patience you must have, young Padawan. - Yoda" +# tip_documented_bug: "A documented bug is not a bug; it is a feature." +# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" +# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" +# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" +# tip_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem." +# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." +# tip_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: "Coding is the closest thing we have to a superpower." +# tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds" +# tip_no_code: "No code is faster than no code." +# tip_code_never_lies: "Code never lies, comments sometimes do. — Ron Jeffries" +# 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: "Whatever you do, keep moving forward. - Martin Luther King Jr." +# tip_google: "Have a problem you can't solve? Google it!" +# tip_adding_evil: "Adding a pinch of 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" + +# game_menu: +# inventory_tab: "Inventory" +# save_load_tab: "Save/Load" +# options_tab: "Options" +# guide_tab: "Guide" +# guide_video_tutorial: "Video Tutorial" +# guide_tips: "Tips" +# multiplayer_tab: "Multiplayer" +# 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!" +# auth_caption: "Save your progress." + +# leaderboard: +# view_other_solutions: "View Leaderboards" +# scores: "Scores" +# top_players: "Top Players by" +# day: "Today" +# week: "This Week" +# all: "All-Time" +# time: "Time" +# damage_taken: "Damage Taken" +# damage_dealt: "Damage Dealt" +# difficulty: "Difficulty" +# gold_collected: "Gold Collected" + +# inventory: +# equipped_item: "Equipped" +# required_purchase_title: "Required" +# available_item: "Available" +# restricted_title: "Restricted" +# should_equip: "(double-click to equip)" +# equipped: "(equipped)" +# locked: "(locked)" +# restricted: "(restricted in this level)" +# equip: "Equip" +# unequip: "Unequip" + +# buy_gems: +# few_gems: "A few gems" +# pile_gems: "Pile of gems" +# chest_gems: "Chest of gems" +# purchasing: "Purchasing..." +# declined: "Your card was declined" +# retrying: "Server error, retrying." +# prompt_title: "Not Enough Gems" +# prompt_body: "Do you want to get more?" +# prompt_button: "Enter Shop" +# recovered: "Previous gems purchase recovered. Please refresh the page." +# price: "x{{gems}} / mo" + +# subscribe: +# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!" +# feature1: "__levelsCount__+ basic levels across __worldsCount__ worlds" +# feature2: "__heroesCount__ powerful new heroes with unique skills!" +# feature3: "__bonusLevelsCount__+ bonus levels" +# feature4: "{{gems}} bonus gems every month!" +# feature5: "Video tutorials" +# feature6: "Premium email support" +# feature7: "Private Clans" +# feature8: "No ads!" +# free: "Free" +# month: "month" +# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above." +# subscribe_title: "Subscribe" +# unsubscribe: "Unsubscribe" +# confirm_unsubscribe: "Confirm Unsubscribe" +# never_mind: "Never Mind, I Still Love You" +# thank_you_months_prefix: "Thank you for supporting us these last" +# thank_you_months_suffix: "months." +# thank_you: "Thank you for supporting CodeCombat." +# sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better." +# unsubscribe_feedback_placeholder: "O, what have we done?" +# parent_button: "Ask your parent" +# parent_email_description: "We'll email them so they can buy you a CodeCombat subscription." +# parent_email_input_invalid: "Email address invalid." +# parent_email_input_label: "Parent email address" +# parent_email_input_placeholder: "Enter parent email" +# parent_email_send: "Send Email" +# parent_email_sent: "Email sent!" +# parent_email_title: "What's your parent's email?" +# parents: "For Parents" +# parents_title: "Dear Parent: Your child is learning to code. Will you help them continue?" +# 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" +# stripe_description: "Monthly Subscription" +# stripe_description_year_sale: "1 Year Subscription (${{discount}} discount)" +# subscription_required_to_play: "You'll need a subscription to play this level." +# unlock_help_videos: "Subscribe to unlock all video tutorials." +# 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" +# 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" + +# choose_hero: +# choose_hero: "Choose Your Hero" +# programming_language: "Programming Language" +# programming_language_description: "Which programming language do you want to use?" +# default: "Default" +# experimental: "Experimental" +# python_blurb: "Simple yet powerful, great for beginners and experts." +# javascript_blurb: "The language of the web. (Not the same as Java.)" +# coffeescript_blurb: "Nicer JavaScript syntax." +# lua_blurb: "Game scripting language." +# java_blurb: "(Subscriber Only) Android and enterprise." +# status: "Status" +# hero_type: "Type" +# weapons: "Weapons" +# weapons_warrior: "Swords - Short Range, No Magic" +# weapons_ranger: "Crossbows, Guns - Long Range, No Magic" +# weapons_wizard: "Wands, Staffs - Long Range, Magic" +# attack: "Damage" # Can also translate as "Attack" +# health: "Health" +# speed: "Speed" +# regeneration: "Regeneration" +# range: "Range" # As in "attack or visual range" +# blocks: "Blocks" # As in "this shield blocks this much damage" +# backstab: "Backstab" # As in "this dagger does this much backstab damage" +# skills: "Skills" +# attack_1: "Deals" +# attack_2: "of listed" +# attack_3: "weapon damage." +# health_1: "Gains" +# health_2: "of listed" +# health_3: "armor health." +# speed_1: "Moves at" +# speed_2: "meters per second." +# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store +# level_to_unlock: "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: "Only certain heroes can play this level." + +# skill_docs: +# function: "function" # skill types +# method: "method" +# snippet: "snippet" +# number: "number" +# array: "array" +# object: "object" +# string: "string" +# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this +# read_only: "read-only" +# action: "Action" +# spell: "Spell" +# action_name: "name" +# action_cooldown: "Takes" +# action_specific_cooldown: "Cooldown" +# action_damage: "Damage" +# action_range: "Range" +# action_radius: "Radius" +# action_duration: "Duration" +# example: "Example" +# ex: "ex" # Abbreviation of "example" +# current_value: "Current Value" +# default_value: "Default value" +# parameters: "Parameters" +# returns: "Returns" +# granted_by: "Granted by" + +# save_load: +# granularity_saved_games: "Saved" +# granularity_change_history: "History" + +# options: +# general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level +# volume_label: "Volume" +# music_label: "Music" +# music_description: "Turn background music on/off." +# editor_config_title: "Editor Configuration" +# editor_config_livecompletion_label: "Live Autocompletion" +# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." +# editor_config_invisibles_label: "Show Invisibles" +# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." +# editor_config_indentguides_label: "Show Indent Guides" +# editor_config_indentguides_description: "Displays vertical lines to see indentation better." +# editor_config_behaviors_label: "Smart Behaviors" +# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." + +# 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: "Cofounder, CEO" +# nick_blurb: "Motivation Guru" +# matt_title: "Cofounder, CTO" +# cat_title: "Game Designer" +# cat_blurb: "Airbender" +# scott_title: "Cofounder, Software Engineer" +# scott_blurb: "Reasonable One" +# 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: "UX Design & Research" +# robin_blurb: "Scaffolding" +# josh_title: "Game Designer" +# josh_blurb: "Floor Is Lava" +# phoenix_title: "Software Engineer" +# nolan_title: "Territory Manager" +# elliot_title: "Partnership Manager" +# elliot_blurb: "Mindreader" +# lisa_title: "Market Development Rep" +# retrostyle_title: "Illustration" +# retrostyle_blurb: "RetroStyle Games" +# jose_title: "Music" +# jose_blurb: "Taking Off" +# community_title: "...and our open-source community" +# community_subtitle: "Over 450 contributors have helped build CodeCombat, with more joining every week!" +# community_description_1: "CodeCombat is a community project, with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our" +# community_description_link: "contribute page" +# 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" +# 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" +# next: "Next" +# location_title: "We're located in downtown SF:" + +# teachers: +# who_for_title: "Who is CodeCombat for?" +# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed. We've designed CodeCombat to appeal to both boys and girls." +# who_for_2: "Our Courses system allows teachers to set up classrooms, track progress and assign additional content to students through a dedicated interface." +# more_info_title: "Where can I find more information?" +# more_info_1: "Our" +# more_info_2: "teachers forum" +# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat." +# licenses_needed: "Licenses needed" + +# teachers_quote: +# name: "Demo Form" +# title: "Request a Demo" +# 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: "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" +# organization_label: "Name of School/District" +# city: "City" +# state: "State" +# country: "Country" +# num_students_help: "How many do you anticipate enrolling in CodeCombat?" +# 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" +# 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" +# setup_a_class: "Set Up a Class" + +# versions: +# save_version_title: "Save New Version" +# new_major_version: "New Major Version" +# submitting_patch: "Submitting Patch..." +# cla_prefix: "To save changes, first you must agree to our" +# cla_url: "CLA" +# cla_suffix: "." +# cla_agree: "I AGREE" +# owner_approve: "An owner will need to approve it before your changes will become visible." + +# contact: +# contact_us: "Contact CodeCombat" +# welcome: "Good to hear from you! Use this form to send us email. " +# forum_prefix: "For anything public, please try " +# forum_page: "our forum" +# forum_suffix: " instead." +# faq_prefix: "There's also a" +# faq: "FAQ" +# subscribe_prefix: "If you need help figuring out a level, please" +# subscribe: "buy a CodeCombat subscription" +# subscribe_suffix: "and we'll be happy to help you with your code." +# subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support." +# screenshot_included: "Screenshot included." +# where_reply: "Where should we reply?" +# send: "Send Feedback" + +# account_settings: +# title: "Account Settings" +# not_logged_in: "Log in or create an account to change your settings." +# autosave: "Changes Save Automatically" +# me_tab: "Me" +# picture_tab: "Picture" +# delete_account_tab: "Delete Your Account" +# wrong_email: "Wrong Email" +# wrong_password: "Wrong Password" +# upload_picture: "Upload a picture" +# delete_this_account: "Delete this account permanently" +# reset_progress_tab: "Reset All Progress" +# reset_your_progress: "Clear all your progress and start over" +# god_mode: "God Mode" +# password_tab: "Password" +# emails_tab: "Emails" +# admin: "Admin" +# manage_subscription: "Click here to manage your subscription." +# new_password: "New Password" +# new_password_verify: "Verify" +# type_in_email: "Type in your email or username to confirm account deletion." +# type_in_email_progress: "Type in your email to confirm deleting your progress." +# type_in_password: "Also, type in your password." +# email_subscriptions: "Email Subscriptions" +# email_subscriptions_none: "No Email Subscriptions." +# email_announcements: "Announcements" +# email_announcements_description: "Get emails on the latest news and developments at CodeCombat." +# email_notifications: "Notifications" +# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." +# email_any_notes: "Any Notifications" +# email_any_notes_description: "Disable to stop all activity notification emails." +# email_news: "News" +# email_recruit_notes: "Job Opportunities" +# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job." +# contributor_emails: "Contributor Class Emails" +# contribute_prefix: "We're looking for people to join our party! Check out the " +# contribute_page: "contribute page" +# contribute_suffix: " to find out more." +# email_toggle: "Toggle All" +# error_saving: "Error Saving" +# saved: "Changes Saved" +# password_mismatch: "Password does not match." +# password_repeat: "Please repeat your password." + +# keyboard_shortcuts: +# keyboard_shortcuts: "Keyboard Shortcuts" +# space: "Space" +# enter: "Enter" +# press_enter: "press enter" +# escape: "Escape" +# shift: "Shift" +# run_code: "Run current code." +# run_real_time: "Run in real time." +# continue_script: "Continue past current script." +# skip_scripts: "Skip past all skippable scripts." +# toggle_playback: "Toggle play/pause." +# scrub_playback: "Scrub back and forward through time." +# single_scrub_playback: "Scrub back and forward through time by a single frame." +# scrub_execution: "Scrub through current spell execution." +# toggle_debug: "Toggle debug display." +# toggle_grid: "Toggle grid overlay." +# toggle_pathfinding: "Toggle pathfinding overlay." +# beautify: "Beautify your code by standardizing its formatting." +# maximize_editor: "Maximize/minimize code editor." + +# community: +# main_title: "CodeCombat Community" +# introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!" +# level_editor_prefix: "Use the 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: "We call units within the game 'thangs'. Use the" +# 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: "Find us on these sites" +# social_github: "Check out all our code on GitHub" +# social_blog: "Read the CodeCombat blog on Sett" +# social_discource: "Join the discussion on our Discourse forum" +# social_facebook: "Like CodeCombat on Facebook" +# social_twitter: "Follow CodeCombat on Twitter" +# social_gplus: "Join CodeCombat on Google+" +# social_slack: "Chat with us in the public CodeCombat Slack channel" +# contribute_to_the_project: "Contribute to the project" + +# clans: +# clan: "Clan" +# clans: "Clans" +# new_name: "New clan name" +# new_description: "New clan description" +# make_private: "Make clan private" +# subs_only: "subscribers only" +# create_clan: "Create New Clan" +# private_preview: "Preview" +# private_clans: "Private Clans" +# public_clans: "Public Clans" +# my_clans: "My Clans" +# clan_name: "Clan Name" +# name: "Name" +# chieftain: "Chieftain" +# type: "Type" +# edit_clan_name: "Edit Clan Name" +# edit_clan_description: "Edit Clan Description" +# edit_name: "edit name" +# edit_description: "edit description" +# private: "(private)" +# summary: "Summary" +# average_level: "Average Level" +# average_achievements: "Average Achievements" +# delete_clan: "Delete Clan" +# leave_clan: "Leave Clan" +# join_clan: "Join Clan" +# invite_1: "Invite:" +# invite_2: "*Invite players to this Clan by sending them this link." +# members: "Members" +# progress: "Progress" +# not_started_1: "not started" +# started_1: "started" +# complete_1: "complete" +# exp_levels: "Expand levels" +# rem_hero: "Remove Hero" +# status: "Status" +# complete_2: "Complete" +# started_2: "Started" +# not_started_2: "Not Started" +# view_solution: "Click to view solution." +# view_attempt: "Click to view attempt." +# latest_achievement: "Latest Achievement" +# playtime: "Playtime" +# last_played: "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: +# course: "Course" +# courses: "courses" +# create_new_class: "Create New Class" +# not_enrolled: "You are not enrolled in this course." +# visit_pref: "Please visit the" +# visit_suf: "page to enroll." +# select_class: "Select one of your classes" +# unnamed: "*unnamed*" +# select: "Select" +# unnamed_class: "Unnamed Class" +# edit_settings: "edit class settings" +# edit_settings1: "Edit Class Settings" +# progress: "Class Progress" +# 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:" +# furthest_level: "Furthest level completed:" +# students: "Students" +# students1: "students" +# concepts: "Concepts" +# levels: "levels" +# played: "Played" +# play_time: "Play time:" +# completed: "Completed:" +# invite_students: "Invite students to join this class." +# invite_link_header: "Link to join course" +# invite_link_p_1: "Give this link to students you would like to have join the course." +# invite_link_p_2: "Or have us email them directly:" +# capacity_used: "Course slots used:" +# enter_emails: "Enter student emails to invite, one per line" +# send_invites: "Send Invites" +# creating_class: "Creating class..." +# purchasing_course: "Purchasing course..." +# buy_course: "Buy Course" +# buy_course1: "Buy this course" +# select_all_courses: "Select 'All Courses' for a 50% discount!" +# all_courses: "All Courses" +# number_programming_students: "Number of Programming Students" +# number_total_students: "Total Students in School/District" +# enter_number_students: "Enter the number of students you need for this class." +# name_class: "Name your class" +# displayed_course_page: "This will be displayed on the course page for you and your students. It can be changed later." +# buy: "Buy" +# purchasing_for: "You are purchasing a license for" +# creating_for: "You are creating a class for" +# for: "for" # Like in 'for 30 students' +# receive_code: "Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class." +# free_trial: "Free trial for teachers!" +# get_access: "to get individual access to all courses for evalutaion purposes." +# questions: "Questions?" +# teachers_click: "Teachers Click Here" +# students_click: "Students Click Here" +# courses_on_coco: "Courses on CodeCombat" +# designed_to: "Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours." +# more_in_less: "Learn more in less time" +# no_experience: "No coding experience necesssary" +# easy_monitor: "Easily monitor student progress" +# purchase_for_class: "Purchase a course for your entire class. It's easy to sign up your students!" +# see_the: "See the" +# more_info: "for more information." +# choose_course: "Choose Your Course:" +# enter_code: "Enter an unlock code to join an existing class" +# enter_code1: "Enter unlock code" +# enroll: "Enroll" +# pick_from_classes: "Pick from your current classes" +# enter: "Enter" +# or: "Or" +# topics: "Topics" +# hours_content: "Hours of content:" +# get_free: "Get FREE course" +# enroll_paid: "Enroll Students in Paid Courses" +# you_have1: "You have" +# you_have2: "unused student licenses" +# use_one: "Use 1 student license for" +# use_multiple: "Use licenses for the following students:" +# already_enrolled: "already enrolled" +# licenses_remaining: "licenses remaining:" +# insufficient_enrollments: "insufficient student licenses" +# 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_courses: "Back to my courses" +# edit_details: "Edit class details" +# enrolled_courses: "enrolled in paid courses:" +# purchase_enrollments: "Purchase Student Licenses" +# remove_student: "remove student" +# assign: "Assign" +# to_assign: "to assign paid courses." +# student: "Student" +# teacher: "Teacher" +# complete: "Complete" +# none: "None" +# save: "Save" +# play_campaign_title: "Play the Campaign" +# play_campaign_description: "You’re ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!" +# create_account_title: "Create an Account" +# create_account_description: "Sign up for a FREE CodeCombat account and gain access to more levels, more programming skills, and more fun!" +# preview_campaign_title: "Preview Campaign" +# preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account." +# arena: "Arena" +# arena_soon_title: "Arena Coming Soon" +# arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of" +# not_enrolled1: "Not enrolled" +# not_enrolled2: "Ask your teacher to enroll you in the next course." +# next_course: "Next Course" +# coming_soon1: "Coming soon" +# coming_soon2: "We are hard at work making more courses for you!" +# available_levels: "Available Levels" +# welcome_to_courses: "Adventurers, welcome to Courses!" +# ready_to_play: "Ready to play?" +# start_new_game: "Start New Game" +# play_now_learn_header: "Play now to learn" +# play_now_learn_1: "basic syntax to control your character" +# play_now_learn_2: "while loops to solve pesky puzzles" +# play_now_learn_3: "strings & variables to customize actions" +# play_now_learn_4: "how to defeat an ogre (important life skills!)" +# welcome_to_page: "Welcome to your Courses page!" +# completed_hoc: "Amazing! You've completed the Hour of Code course!" +# ready_for_more_header: "Ready for more? Play the campaign mode!" +# ready_for_more_1: "Use gems to unlock new items!" +# ready_for_more_2: "Play through brand new worlds and challenges" +# ready_for_more_3: "Learn even more programming!" +# saved_games: "Saved Games" +# hoc: "Hour of Code" +# my_classes: "My Classes" +# class_added: "Class successfully added!" +# view_class: "view class" +# view_levels: "view levels" +# 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" +# start: "Start" +# last_level: "Last Level" +# welcome_to_hoc: "Adventurers, welcome to our Hour of Code!" +# logged_in_as: "Logged in as:" +# not_you: "Not you?" +# welcome_back: "Hi adventurer, welcome back!" +# continue_playing: "Continue Playing" +# more_options: "More options:" +# option1_header: "Option 1: Invite students via email" +# option1_body: "Students will automatically be sent an invitation to join this class, and will need to create an account with a username and password." +# option2_header: "Option 2: Send URL to your students" +# option2_body: "Students will be asked to enter an email address, username and password to create an account." +# option3_header: "Option 3: Direct students to codecombat.com/courses" +# option3_body: "Give students the following passcode to enter along with an email address, username and password when they create an account." +# thank_you_pref: "Thank you for your purchase! You can now assign" +# thank_you_suff: "more students to paid courses." +# return_to_class: "Return to classroom" +# return_to_course_man: "Return to course management." +# students_not_enrolled: "students not enrolled" +# total_all_classes: "Total Across All Classes" +# how_many_enrollments: "How many additional student licenses do you need?" +# each_student_access: "Each student in a class will get access to Courses 2-4 once they are enrolled in paid courses. You may assign each course to each student individually." +# purchase_now: "Purchase Now" +# enrollments: "licenses" +# 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" +# to_join_ask: "To join a class, ask your teacher for an unlock code." +# join_this_class: "Join Class" +# enter_here: "" +# successfully_joined: "Successfully joined" +# click_to_start: "Click here to start taking" +# my_courses: "My Courses" +# classroom: "Classroom" +# use_school_email: "use your school email if you have one" +# unique_name: "a unique name no one has chosen" +# pick_something: "pick something you can remember" +# class_code: "Class Code" +# optional_ask: "optional - ask your teacher to give you one!" +# optional_school: "optional - what school do you go to?" +# start_playing: "Start Playing" +# skip_this: "Skip this, I'll create an account later!" +# welcome: "Welcome" +# getting_started: "Getting Started with Courses" +# download_getting_started: "Download Getting Started Guide [PDF]" +# getting_started_1: "Create a new class by clicking the green 'Create New Class' button below." +# getting_started_2: "Once you've created a class, click the blue 'Add Students' button." +# getting_started_3: "You'll see student's progress below as they sign up and join your class." +# educator_wiki_pref: "Or check out our new" +# educator_wiki_mid: "educator wiki" +# educator_wiki_suff: "to browse the guide online." +# your_classes: "Your Classes" +# no_classes: "No classes yet!" +# create_new_class1: "create new class" +# available_courses: "Available Courses" +# unused_enrollments: "Unused licenses available:" +# students_access: "All students get access to Introduction to Computer Science for free. One license per student is required to assign them to paid CodeCombat courses. A single student does not need multiple licenses to access all paid courses." +# active_courses: "active courses" +# no_students: "No students yet!" +# add_students1: "add students" +# view_edit: "view/edit" +# students_enrolled: "students enrolled" +# students_assigned: "students assigned" +# length: "Length:" +# title: "Courses" # Flat style redesign +# subtitle: "Review course guidelines, solutions, and levels" +# changelog: "View latest changes to course levels." +# select_language: "Select language" +# select_level: "Select level" +# play_level: "Play Level" +# concepts_covered: "Concepts covered" +# print_guide: "Print Guide (PDF)" +# view_guide_online: "View Guide Online (PDF)" +# last_updated: "Last updated:" +# grants_lifetime_access: "Grants access to all Courses." +# enrollment_credits_available: "Licenses Available:" +# description: "Description" # ClassroomSettingsModal +# language_select: "Select a language" +# language_cannot_change: "Language cannot be changed once students join a class." +# learn_p: "Learn Python" +# learn_j: "Learn JavaScript" +# 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:" # {change} +# 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." +# update_account_remain_student: "Remain a Student" +# update_account_update_student: "Update to Student" +# 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 \"Select Hero\"" +# select_this_hero: "Select this Hero" + +# teacher: +# teacher_dashboard: "Teacher Dashboard" # Navbar +# my_classes: "My Classes" +# courses: "Course Guides" +# enrollments: "Student Licenses" +# resources: "Resources" +# help: "Help" +# students: "Students" # Shared +# language: "Language" +# edit_class_settings: "edit class settings" +# complete: "Complete" +# 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." +# try_refreshing: "(You may need to refresh the page)" +# add_students: "Add Students" +# 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" +# adding_students: "Adding students" +# 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" +# started: "Started" +# click_to_view_progress: "click to view progress" +# no_progress: "No progress" +# select_course: "Select course to view" +# course_overview: "Course Overview" +# copy_class_code: "Copy Class Code" +# class_code_blurb: "New students can enter this class code on their dashboard or visit codecombat.com/courses to join the class." +# copy_class_url: "Copy Class URL" +# class_join_url_blurb: "New students can visit this URL while logged in to join the class." +# add_students_manually: "Add Students Manually" +# bulk_assign: "Bulk-assign" +# assign_to_selected_students: "Assign to Selected Students" +# assigned: "Assigned" +# enroll_selected_students: "Enroll Selected Students" +# cant_assign_to_unenrolled: "Course cannot be assigned to students who are not enrolled." +# no_students_selected: "No students were selected." +# guides_coming_soon: "Guides coming soon!" # Courses +# show_students_from: "Show students from" # Enroll students modal +# enroll_the_following_students: "Enroll the following students" +# all_students: "All Students" +# enroll_students: "Enroll Students" +# not_enough_enrollments: "Not enough licenses available." +# enrollments_blurb_1: "Students taking Computer Science" +# enrollments_blurb_2: "require a license to access the courses." +# credits_available: "Licenses Available" +# total_unique_students: "Total Students" +# total_enrolled_students: "Enrolled Students" +# unenrolled_students: "Unenrolled Students" +# add_enrollment_credits: "Add Licenses" +# purchasing: "Purchasing..." +# purchased: "Purchased!" +# purchase_now: "Purchase Now" +# how_to_enroll: "How to Enroll Students" +# how_to_enroll_blurb_1: "If a student is not enrolled yet, there will be an \"Enroll\" button next to their course progress in your class." +# how_to_enroll_blurb_2: "To bulk-enroll multiple students, select them using the checkboxes on the left side of the classroom page and click the \"Enroll Selected Students\" button." +# how_to_enroll_blurb_3: "Once a student is enrolled, they will have access to all of the course content." +# bulk_pricing_blurb: "Purchasing for more than 25 students? Contact us to discuss next steps." +# total_unenrolled: "Total unenrolled" +# 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" # {change} +# pending_credits: "Pending Licenses" # {change} +# credits: "licenses" +# start_date: "start date:" +# end_date: "end date:" +# num_enrollments_needed: "Number of licenses needed:" # {change} +# get_enrollments_blurb: " We'll help you build a solution that meets the needs of your class, school or district." +# enroll_request_sent_blurb1: "Thanks! Your request has been sent." +# enroll_request_sent_blurb2: "Our classroom success team will be in touch shortly to help you find the best solution for your students' needs!" +# enroll_request_sent_blurb3: "Please reach out to schools@codecombat.com if you have additional questions at this time." +# request_sent: "Request Sent!" +# enrollment_status: "Enrollment Status" +# status_expired: "Expired on {{date}}" +# status_not_enrolled: "Not Enrolled" +# status_enrolled: "Expires on {{date}}" +# select_all: "Select All" +# projects: "Projects" + +# sharing: +# game: "Game" +# webpage: "Webpage" +# 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" +# image_gallery_description: "Copy these images into your webpage, or find your own image URLs online." + +# classes: +# archmage_title: "Archmage" +# archmage_title_description: "(Coder)" +# archmage_summary: "If you are a developer interested in coding educational games, become an archmage to help us build CodeCombat!" +# artisan_title: "Artisan" +# artisan_title_description: "(Level Builder)" +# artisan_summary: "Build and share levels for you and your friends to play. Become an Artisan to learn the art of teaching others to program." +# adventurer_title: "Adventurer" +# adventurer_title_description: "(Level Playtester)" +# adventurer_summary: "Get our new levels (even our subscriber content) for free one week early and help us work out bugs before our public release." +# scribe_title: "Scribe" +# scribe_title_description: "(Article Editor)" +# scribe_summary: "Good code needs good documentation. Write, edit, and improve the docs read by millions of players across the globe." +# diplomat_title: "Diplomat" +# diplomat_title_description: "(Translator)" +# diplomat_summary: "CodeCombat is localized in 45+ languages by our Diplomats. Help us out and contribute translations." +# ambassador_title: "Ambassador" +# ambassador_title_description: "(Support)" +# ambassador_summary: "Tame our forum users and provide direction for those with questions. Our ambassadors represent CodeCombat to the world." +# teacher_title: "Teacher" + +# editor: +# main_title: "CodeCombat Editors" +# article_title: "Article Editor" +# thang_title: "Thang Editor" +# level_title: "Level Editor" +# achievement_title: "Achievement Editor" +# poll_title: "Poll Editor" +# back: "Back" +# revert: "Revert" +# revert_models: "Revert Models" +# pick_a_terrain: "Pick A Terrain" +# dungeon: "Dungeon" +# indoor: "Indoor" +# desert: "Desert" +# grassy: "Grassy" +# mountain: "Mountain" +# glacier: "Glacier" +# small: "Small" +# large: "Large" +# fork_title: "Fork New Version" +# fork_creating: "Creating Fork..." +# generate_terrain: "Generate Terrain" +# more: "More" +# wiki: "Wiki" +# live_chat: "Live Chat" +# thang_main: "Main" +# thang_spritesheets: "Spritesheets" +# thang_colors: "Colors" +# level_some_options: "Some Options?" +# level_tab_thangs: "Thangs" +# level_tab_scripts: "Scripts" +# level_tab_settings: "Settings" +# level_tab_components: "Components" +# level_tab_systems: "Systems" +# level_tab_docs: "Documentation" +# level_tab_thangs_title: "Current Thangs" +# level_tab_thangs_all: "All" +# level_tab_thangs_conditions: "Starting Conditions" +# level_tab_thangs_add: "Add Thangs" +# level_tab_thangs_search: "Search thangs" +# add_components: "Add Components" +# component_configs: "Component Configurations" +# config_thang: "Double click to configure a thang" +# delete: "Delete" +# duplicate: "Duplicate" +# stop_duplicate: "Stop Duplicate" +# rotate: "Rotate" +# level_settings_title: "Settings" +# level_component_tab_title: "Current Components" +# level_component_btn_new: "Create New Component" +# level_systems_tab_title: "Current Systems" +# level_systems_btn_new: "Create New System" +# level_systems_btn_add: "Add System" +# level_components_title: "Back to All Thangs" +# level_components_type: "Type" +# level_component_edit_title: "Edit Component" +# level_component_config_schema: "Config Schema" +# level_component_settings: "Settings" +# level_system_edit_title: "Edit System" +# create_system_title: "Create New System" +# new_component_title: "Create New Component" +# new_component_field_system: "System" +# new_article_title: "Create a New Article" +# new_thang_title: "Create a New Thang Type" +# new_level_title: "Create a New Level" +# new_article_title_login: "Log In to Create a New Article" +# new_thang_title_login: "Log In to Create a New Thang Type" +# new_level_title_login: "Log In to Create a New Level" +# new_achievement_title: "Create a New Achievement" +# new_achievement_title_login: "Log In to Create a New Achievement" +# new_poll_title: "Create a New Poll" +# new_poll_title_login: "Log In to Create a New Poll" +# article_search_title: "Search Articles Here" +# thang_search_title: "Search Thang Types Here" +# level_search_title: "Search Levels Here" +# achievement_search_title: "Search Achievements" +# poll_search_title: "Search Polls" +# read_only_warning2: "Note: you can't save any edits here, because you're not logged in." +# no_achievements: "No achievements have been added for this level yet." +# achievement_query_misc: "Key achievement off of miscellanea" +# achievement_query_goals: "Key achievement off of level goals" +# level_completion: "Level Completion" +# pop_i18n: "Populate I18N" +# tasks: "Tasks" +# clear_storage: "Clear your local changes" +# add_system_title: "Add Systems to Level" +# done_adding: "Done Adding" + +# article: +# edit_btn_preview: "Preview" +# edit_article_title: "Edit Article" + +# polls: +# priority: "Priority" + +# contribute: +# page_title: "Contributing" +# 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: "Hey there!" +# 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: "Knowledge in " +# archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax." +# archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you." +# how_to_join: "How To Join" +# join_desc_1: "Anyone can help out! Just check out our " +# join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? " +# join_desc_3: ", or find us in our " +# join_desc_4: "and we'll go from there!" +# join_url_email: "Email us" +# join_url_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:" + +# ladder: +# please_login: "Please log in first before playing a ladder game." +# my_matches: "My Matches" +# simulate: "Simulate" +# simulation_explanation: "By simulating games you can get your game ranked faster!" +# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses." +# simulate_games: "Simulate Games!" +# games_simulated_by: "Games simulated by you:" +# games_simulated_for: "Games simulated for you:" +# games_in_queue: "Games currently in the queue:" +# games_simulated: "Games simulated" +# games_played: "Games played" +# ratio: "Ratio" +# leaderboard: "Leaderboard" +# battle_as: "Battle as " +# summary_your: "Your " +# summary_matches: "Matches - " +# summary_wins: " Wins, " +# summary_losses: " Losses" +# rank_no_code: "No New Code to Rank" +# rank_my_game: "Rank My Game!" +# rank_submitting: "Submitting..." +# rank_submitted: "Submitted for Ranking" +# rank_failed: "Failed to Rank" +# rank_being_ranked: "Game Being Ranked" +# rank_last_submitted: "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: "Choose an Opponent" +# select_your_language: "Select your language!" +# tutorial_play: "Play Tutorial" +# tutorial_recommended: "Recommended if you've never played before" +# tutorial_skip: "Skip Tutorial" +# tutorial_not_sure: "Not sure what's going on?" +# tutorial_play_first: "Play the Tutorial first." +# simple_ai: "Simple CPU" +# warmup: "Warmup" +# friends_playing: "Friends Playing" +# log_in_for_friends: "Log in to play with your friends!" +# social_connect_blurb: "Connect and play against your friends!" +# invite_friends_to_battle: "Invite your friends to join you in battle!" +# fight: "Fight!" +# watch_victory: "Watch your victory" +# defeat_the: "Defeat the" +# watch_battle: "Watch the battle" +# tournament_started: ", started" +# tournament_ends: "Tournament ends" +# tournament_ended: "Tournament ended" +# tournament_rules: "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" +# tournament_blurb_blog: "on our blog" +# rules: "Rules" +# winners: "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" + +# user: +# stats: "Stats" +# singleplayer_title: "Singleplayer Levels" +# multiplayer_title: "Multiplayer Levels" +# achievements_title: "Achievements" +# last_played: "Last Played" +# status: "Status" +# status_completed: "Completed" +# status_unfinished: "Unfinished" +# no_singleplayer: "No Singleplayer games played yet." +# no_multiplayer: "No Multiplayer games played yet." +# no_achievements: "No Achievements earned yet." +# favorite_prefix: "Favorite language is " +# favorite_postfix: "." +# not_member_of_clans: "Not a member of any clans yet." + +# achievements: +# last_earned: "Last Earned" +# amount_achieved: "Amount" +# achievement: "Achievement" +# current_xp_prefix: "" +# current_xp_postfix: " in total" +# new_xp_prefix: "" +# new_xp_postfix: " earned" +# left_xp_prefix: "" +# left_xp_infix: " until level " +# left_xp_postfix: "" + +# account: +# payments: "Payments" +# prepaid_codes: "Prepaid Codes" +# purchased: "Purchased" +# subscription: "Subscription" +# invoices: "Invoices" +# service_apple: "Apple" +# service_web: "Web" +# paid_on: "Paid On" +# service: "Service" +# price: "Price" +# gems: "Gems" +# active: "Active" +# subscribed: "Subscribed" +# unsubscribed: "Unsubscribed" +# active_until: "Active Until" +# cost: "Cost" +# next_payment: "Next Payment" +# card: "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!" +# back_to_student_page: "Go back to student things" +# back_to_teacher_page: "Go to My Classes" +# back_to_game: "Go play some more levels!" +# verify_error: "Something went wrong when verifying your email :(" + +# account_invoices: +# amount: "Amount in US dollars" +# declined: "Your card was declined" +# invalid_amount: "Please enter a US dollar amount." +# not_logged_in: "Log in or create an account to access invoices." +# pay: "Pay Invoice" +# purchasing: "Purchasing..." +# retrying: "Server error, retrying." +# success: "Successfully paid. Thanks!" + +# account_prepaid: +# purchase_code: "Purchase a Subscription Code" +# purchase_code1: "Subscription Codes can be redeemed to add premium subscription time to one or more CodeCombat accounts." +# purchase_code2: "Each CodeCombat account can only redeem a particular Subscription Code once." +# purchase_code3: "Subscription Code months will be added to the end of any existing subscription on the account." +# users: "Users" +# months: "Months" +# purchase_total: "Total" +# 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." + +# coppa_deny: +# text1: "Can’t wait to learn programming?" +# text2: "Your parents will need to create an account for you to use! Email team@codecombat.com if you have any questions." +# close: "Close Window" + +# loading_error: +# could_not_load: "Error loading from server" +# connection_failure: "Connection Failed" +# 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: "You need to be signed in. Do you have cookies disabled?" +# forbidden: "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" +# not_found_desc: "Hm, there’s nothing here. Visit one of the following links to get back to programming!" +# not_allowed: "Method not allowed." +# timeout: "Server Timeout" +# conflict: "Resource conflict." +# bad_input: "Bad input." +# server_error: "Server error." +# unknown: "Unknown Error" +# 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!" + +# resources: +# level: "Level" +# patch: "Patch" +# patches: "Patches" +# system: "System" +# systems: "Systems" +# component: "Component" +# components: "Components" +# hero: "Hero" +# campaigns: "Campaigns" + +# concepts: +# advanced_strings: "Advanced Strings" +# algorithms: "Algorithms" +# arguments: "Arguments" +# arithmetic: "Arithmetic" +# arrays: "Arrays" +# basic_syntax: "Basic Syntax" +# boolean_logic: "Boolean Logic" +# break_statements: "Break Statements" +# classes: "Classes" +# continue_statements: "Continue Statements" +# for_loops: "For Loops" +# functions: "Functions" +# graphics: "Graphics" +# if_statements: "If Statements" +# input_handling: "Input Handling" +# math_operations: "Math Operations" +# object_literals: "Object Literals" +# parameters: "Parameters" +# strings: "Strings" +# variables: "Variables" +# vectors: "Vectors" +# while_loops: "While Loops" +# recursion: "Recursion" +# basic_html: "Basic HTML" # TODO: these web-dev concepts will change, don't need to translate +# 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" +# jquery: "jQuery" +# bootstrap: "Bootstrap" + +# delta: +# added: "Added" +# modified: "Modified" +# not_modified: "Not Modified" +# deleted: "Deleted" +# moved_index: "Moved Index" +# text_diff: "Text Diff" +# merge_conflict_with: "MERGE CONFLICT WITH" +# no_changes: "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_description: "Description" +# rights_writings: "Writings" +# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." +# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." +# nutshell_title: "In a Nutshell" +# nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening." +# canonical: "The English version of this document is the definitive, canonical version. If there are any 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" diff --git a/app/views/contribute/DiplomatView.coffee b/app/views/contribute/DiplomatView.coffee index 59362a370..d091b288a 100644 --- a/app/views/contribute/DiplomatView.coffee +++ b/app/views/contribute/DiplomatView.coffee @@ -57,6 +57,7 @@ require("locale/uz") require("locale/my") require("locale/et") require("locale/hr") +require("locale/mi") module.exports = class DiplomatView extends ContributeClassView id: 'diplomat-view' From 2d87a51f304a116dcf703cc999bbac7e615271c6 Mon Sep 17 00:00:00 2001 From: themaka Date: Fri, 29 Jul 2016 15:39:37 -0400 Subject: [PATCH 03/18] Forgot to update language names in first line of hr/mi .coffee --- app/locale/hr.coffee | 2 +- app/locale/mi.coffee | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/locale/hr.coffee b/app/locale/hr.coffee index 24fc1bfc0..91a6d4e28 100644 --- a/app/locale/hr.coffee +++ b/app/locale/hr.coffee @@ -1,4 +1,4 @@ -module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norwegian (Nynorsk)", translation: +module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croatian", translation: # home: # slogan: "Learn to Code by Playing a Game" # no_ie: "CodeCombat does not run in Internet Explorer 8 or older. Sorry!" # Warning that only shows up in IE8 and older diff --git a/app/locale/mi.coffee b/app/locale/mi.coffee index 2ff327e60..658f3be24 100644 --- a/app/locale/mi.coffee +++ b/app/locale/mi.coffee @@ -1,3 +1,4 @@ +module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori", translation: # home: # slogan: "Learn to Code by Playing a Game" # no_ie: "CodeCombat does not run in Internet Explorer 8 or older. Sorry!" # Warning that only shows up in IE8 and older From 8135bd73d08fd6dbb628a06f941a975f574de217 Mon Sep 17 00:00:00 2001 From: themaka Date: Fri, 29 Jul 2016 15:53:01 -0400 Subject: [PATCH 04/18] =?UTF-8?q?Added=20M=C4=81ori=20and=20Croatian=20to?= =?UTF-8?q?=20list=20of=20languages=20to=20display=20on=20Diplomat=20page.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/contribute/DiplomatView.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/contribute/DiplomatView.coffee b/app/views/contribute/DiplomatView.coffee index d091b288a..75c439081 100644 --- a/app/views/contribute/DiplomatView.coffee +++ b/app/views/contribute/DiplomatView.coffee @@ -142,3 +142,5 @@ module.exports = class DiplomatView extends ContributeClassView uz: [] # O'zbekcha, Uzbek my: [] # မြန်မာစကား, Myanmar language et: [] # Eesti, Estonian + hr: [] # hrvatski jezik, Croatian + mi: [] # te reo Māori, Māori From 2e3d1531bfa8d258682b6c721f32ee1c70fc9092 Mon Sep 17 00:00:00 2001 From: Valentin Bryukhanov Date: Mon, 1 Aug 2016 08:48:00 +0300 Subject: [PATCH 05/18] Add bunch of Russian translation --- app/locale/ru.coffee | 217 ++++++++++++++++++++++--------------------- 1 file changed, 109 insertions(+), 108 deletions(-) diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index d6667eee7..d017fd295 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -132,7 +132,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi help_suff: "и мы свяжемся!" modal: -# cancel: "Cancel" + cancel: "Отмена" close: "Закрыть" okay: "OK" @@ -234,7 +234,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi None: "значение, которое не указывает ни на один объект (ничто)" share_progress_modal: - blurb: "Вы отлично продвигаетесь! Расскажите своим родителям, как много вы уже выучили с CodeCombat." + blurb: "Вы показываете отличные результаты! Расскажите своим родителям, как много вы уже выучили с CodeCombat." email_invalid: "Email-адрес некорректен." form_blurb: "Введите их email-адреса ниже, и мы покажем им!" form_label: "Email-адрес" @@ -243,9 +243,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi login: sign_up: "Создать аккаунт" -# email_or_username: "Email or username" + email_or_username: "Email или имя пользователя" log_in: "Войти" - logging_in: "Вход..." + logging_in: "Входим..." log_out: "Выйти" forgot_password: "Забыли пароль?" authenticate_gplus: "Аутентификация G+" @@ -256,72 +256,72 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi signup_switch: "Хотите создать аккаунт?" signup: -# create_student_header: "Create Student Account" -# create_teacher_header: "Create Teacher Account" -# create_individual_header: "Create Individual Account" -# create_header: "Create Account" - email_announcements: "Получать оповещения по email" # {change} - creating: "Создание аккаунта..." -# create_account: "Create Account" + create_student_header: "Создать учетную запись Ученика" + create_teacher_header: "Создать учетную запись Учителя" + create_individual_header: "Создать личную учетную запись" + create_header: "Создать учетную запись" + email_announcements: "Получать оповещения по email о новых уровнях и возможностях на CodeCombat" + creating: "Создаем учетную запись..." + create_account: "Создать учетную запись" sign_up: "Регистрация" log_in: "вход с паролем" required: "Войдите для того, чтобы продолжить." - login_switch: "Уже есть аккаунт?" - school_name: "Название школы and город" + login_switch: "Уже есть учетная запись?" + school_name: "Название школы и город" optional: "не обязательно" school_name_placeholder: "Школа № 2, город Электросталь, Московская область" -# connect_with: "Connect with:" + connect_with: "Зарегистрироваться с помощью:" connected_gplus_header: "Вы успешно авторизовались через Google+!" connected_gplus_p: "Теперь можно войти используя аккаунт Google+." gplus_exists: "У вас уже имеется аккаунт связанный с Google+!" connected_facebook_header: "Вы успешно авторизовались через Facebook!" connected_facebook_p: "Теперь можно войти используя аккаунт Facebook." - facebook_exists: "У вас уже имеется аккаунт связанный сh Facebook!" + facebook_exists: "У вас уже имеется аккаунт связанный с Facebook!" hey_students: "Студенты, введите код от класса вашего учителя." -# 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:" # {change} -# 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:" -# 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:" + birthday: "День рождения" + parent_email_blurb: "Мы знаем что вы в нетерпении начать учиться программировать — мы тоже! Ваши родители получат письмо с дальнейшими инструкциями, как создать учетную запись. Пишите нам на email {{email_link}} если есть любые вопросы." + classroom_not_found: "Нет класса с таким кодом. Проверьте написание или попросите учителя помочь." + checking: "Проверяем..." + account_exists: "Этот email-адрес уже используется:" # {change} + sign_in: "Зарегистрироваться" + email_good: "С email-адресом все в порядке!" + name_taken: "Имя пользователя уже используется! Может {{suggestedName}}?" + name_available: "Имя пользователя доступно!" + name_is_email: "Имя пользователя не должно быть 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: "Введите вашу дату рождения:" + ask_teacher_1: "Спросите вашего учителя код для класса." + ask_teacher_2: "Не относишься к учебному классу? Создай " + ask_teacher_3: "Личную учетную запись" + ask_teacher_4: " вместо этого." + about_to_join: "Вы присоединяетесь к:" + enter_parent_email: "Введите email-адрес одного из родителей:" + parent_email_error: "Что-то пошло не так, когда мы отправляли письмо. Проверьте email-адрес и повторите." + parent_email_sent: "Мы послали электронное письмо с дальнейшими инструкциями, как создать учетную запись. Попроси родителей проверить их входящие письма." + account_created: "Учетная запись создана!" + confirm_student_blurb: "Запишите ваши данные, чтобы не забыть их. Ваш учитель, если что сможет помочь сбросить пароль в любое время." + 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: "Запишите это:" + start_playing: "Начать играть!" + sso_connected: "Успешно подключились с помощью:" recover: - recover_account_title: "Восстановить аккаунт" + recover_account_title: "Восстановить учетную запись" send_password: "Отправить пароль для восстановления" recovery_sent: "Письмо с паролем отправлено." @@ -340,8 +340,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi saving: "Сохранение..." sending: "Отправка..." send: "Отправить" -# sent: "Sent" -# type: "Type" + sent: "Отправлено" + type: "Тип" cancel: "Отмена" save: "Сохранить" publish: "Опубликовать" @@ -411,8 +411,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi wizard: "Волшебник" first_name: "Имя" last_name: "Фамилия" -# last_initial: "Last Initial" - username: "Имя юзера" + last_initial: "Инициалы фамилии" + username: "Имя пользователя" units: second: "секунда" @@ -431,13 +431,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi years: "лет" play_level: - level_complete: "Уровень завершен" - completed_level: "Завершённый уровень:" + level_complete: "Уровень пройден" + completed_level: "Пройденный уровень:" course: "Курс:" done: "Готово" next_level: "Следующий уровень" next_game: "Следующая игра" -# programming_language: "Programming language" + programming_language: "Язык программирования" show_menu: "Показать меню игры" home: "На главную" # Not used any more, will be removed soon. level: "Уровень" # Like "Level: Dungeons of Kithgard" @@ -458,12 +458,12 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi reload_confirm: "Перезагрузить всё" victory: "Победа" victory_title_prefix: "Уровень " - victory_title_suffix: " завершён" + victory_title_suffix: " пройден" victory_sign_up: "Зарегистрируйтесь, чтобы сохранить прогресс" - victory_sign_up_poke: "Хотите сохранить ваш код? Создайте бесплатный аккаунт!" + victory_sign_up_poke: "Хотите сохранить ваш код? Создайте бесплатную учетную запись!" victory_rate_the_level: "Оцените уровень:" # {change} - victory_return_to_ladder: "Вернуться к ладдеру" - victory_saving_progress: "Процесс сохранения" + victory_return_to_ladder: "Вернуться к таблице" + victory_saving_progress: "Сохранить прогресс" victory_go_home: "На главную" victory_review: "Расскажите нам больше!" victory_review_placeholder: "Как вам уровень?" @@ -474,13 +474,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi victory_new_item: "Новый предмет" victory_viking_code_school: "Ого, это было тяжелый уровень! Если вы еще не разработчик программ, вам стоит им стать. Вы только что ускорири принятие в Школу Викингов, где вы сможете поднять свои навыки на новый уровень и стать профессиональным веб-разработчиком за 14 недель." victory_become_a_viking: "Станьте Викингом" - victory_no_progress_for_teachers: "Прогресс не сохраняется для учителей. Но, вы можете для себя добавить аккаунт студента в свою классную комнату." + victory_no_progress_for_teachers: "Прогресс не сохраняется для учителей. Но, вы можете для себя добавить учетную запись ученика в свою классную комнату." guide_title: "Руководство" tome_cast_button_run: "Запустить" tome_cast_button_running: "В процессе" tome_cast_button_ran: "Запущен" tome_submit_button: "Завершить" - tome_reload_method: "Загрузить оригинальный код для этого метода" # {change} + tome_reload_method: "Загрузить оригинальный код и начать уровень заново" # {change} tome_available_spells: "Доступные заклинания" tome_your_skills: "Ваши навыки" tome_current_method: "Текущий метод" @@ -491,13 +491,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi keyboard_shortcuts: "Горячие клавиши" loading_ready: "Готово!" loading_start: "Начать уровень" - problem_alert_title: "Исправьте ваш Код" + problem_alert_title: "Исправьте код" time_current: "Текущее:" time_total: "Максимальное:" time_goto: "Перейти на:" non_user_code_problem_title: "Невозможно загрузить уровень" infinite_loop_title: "Обнаружен бесконечный цикл" - infinite_loop_description: "Код сотворения мира не завершил выполнение. Это могло случиться из-за реально медленного кода или наличия бесконечного цикла. Или там может быть баг. Вы можете попытаться запустить этот код еще раз или сбросить код в состояние по умолчанию. Если проблема не будет решена, дайте нам знать." + infinite_loop_description: "Код сотворения мира не завершил выполнение. Это могло случиться из-за очень медленного кода или наличия бесконечного цикла. Или там может быть баг. Вы можете попытаться запустить этот код еще раз или сбросить код в состояние по умолчанию. Если проблема не будет решена, дайте нам знать." check_dev_console: "Вы так же можете открыть консоль разработчика, чтобы увидеть, что может идти не так." check_dev_console_link: "(инструкции)" infinite_loop_try_again: "Попробовать снова" @@ -542,32 +542,32 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi tip_optimization_operator: "В каждом языке есть оператор оптимизации. В большинстве языков это оператор ‘//’" tip_lines_of_code: "Измерение прогресса программирования в строках кода - это как измерять прогресс построения самолета по его весу. — Bill Gates" tip_source_code: "Я хочу изменить мир, но они вряд ли дадут мне исходники." - tip_javascript_java: "Java к JavaScript относится так же, как кол относится к колготкам. - Chris Heilmann (перефраз.)" - tip_move_forward: "Что бы вы ни делали, вы должны двигаться вперед. - Martin Luther King Jr" + tip_javascript_java: "Java к JavaScript относится так же, как кол относится к колготкам. (перефраз.) - Крис Хейльман" + tip_move_forward: "Что бы вы ни делали, вы должны двигаться вперед. - Мартин Лютер Кинг Мл." tip_google: "У вас проблема, которую вы не можете решить? Гуглите!" tip_adding_evil: "Добавим щепотку зла." - tip_hate_computers: "Есть одна вещь в людях, которые думают, что они ненавидят компьютеры. Что они на самом деле ненавидят, так это плохих программистов. - Larry Niven" - tip_open_source_contribute: "Вы можете помочь сделать CodeCombat лучше!" + tip_hate_computers: "Есть одна вещь в людях, которые думают, что они ненавидят компьютеры. Что они на самом деле ненавидят, так это плохих программистов. - Ларри Нивен" + tip_open_source_contribute: "Ты можешь помочь сделать CodeCombat лучше!" tip_recurse: "Итерация свойственна человеку, рекурсия божественна. - L. Peter Deutsch" - tip_free_your_mind: "Отвлекись от всего, Нео. Страх, неверие, сомнения отбрось — очисти свой разум. - Morpheus" - tip_strong_opponents: "Даже сильнейший противник имеет слабость. - Itachi Uchiha" + 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: "Rounding up ogres." -# tip_sharpening_swords: "Sharpening the swords." + tip_adding_orgres: "Собираем огров." + tip_sharpening_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_self_taught: "Я самостоятельно научился 90% из того чему учился. И это нормально! - Хэнк Грин" + tip_luna_lovegood: "Не переживай, ты также в своем уме, как и я. - Луна Лавгуд" + tip_good_idea: "Лучший способ найти хорошую идею - иметь множество идей. - Линус Полинг" # tip_programming_not_about_computers: "Computer Science is no more about computers than astronomy is about telescopes. - Edsger Dijkstra" -# tip_mulan: "Believe you can, then you will. - Mulan" + tip_mulan: "Верь, что можешь и получится. - Мулан" game_menu: inventory_tab: "Инвентарь" @@ -694,7 +694,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi javascript_blurb: "Язык для Сети." coffeescript_blurb: "Улучшенный синтаксис JavaScript." lua_blurb: "Скриптовый язык для игр." -# java_blurb: "(Subscriber Only) Android and enterprise." + java_blurb: "(только для подписчиков) Андроид и бизнес." status: "Статус" hero_type: "Тип" weapons: "Оружие" @@ -705,7 +705,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi health: "Жизнь" speed: "Скорость" regeneration: "Регенерация" - range: "Зона" # As in "attack or visual range" + 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: "Умения" @@ -775,32 +775,33 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi story_link: "История" press_link: "Прессе" mission_title: "Наша задача: сделать доступным программирование для каждого учащегося на земле." -# 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." + mission_description_1: "Программирование - это магия. + Это способность создавать что-то с помощью воображения. Мы создавали CodeCombat, чтобы дать учащимся чувство силы волшебства на кончиках пальцев, когда они пишут код." + mission_description_2: "Как оказалось, это позволяет им учится быстрее. СИЛЬНО быстрее. Это как живой рассказ вместо чтения учебника. Мы хотим принести этот метод в каждую школу и каждому ученику, потому что все должны иметь шанс научится магии программирования." team_title: "Присоединяйтесь к команде CodeCombat" -# team_values: "We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our GitHub contributors, because we value growth and learning in our team." - nick_title: "Сооснователь" # {change} + team_values: "Мы ценим открытый и вежливый диалог, где побеждают лучшие идеи. Наши решения основаны на иследовании пожеланий клиентов и наш процесс направлен на то, чтобы приносить осязаемые результаты им. У нас все при деле, от CEO до контрибьютеров на GitHub, потому что мы ценим рост и обучение в нашей команде." + nick_title: "Сооснователь, CEO" nick_blurb: "Гуру мотивации" - matt_title: "Сооснователь" # {change} - cat_title: "Главный ремесленник" # {change} + matt_title: "Сооснователь, CTO" + cat_title: "Гейм дизайнер" 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: "UX Design & Research" -# robin_blurb: "Scaffolding" - josh_title: "Дизайнер игры" + scott_title: "Сооснователь, инженер программист" # {change} + scott_blurb: "Благоразумный" + maka_title: "Адвокат клиентов" + maka_blurb: "Рассказчик" + rob_title: "Инженер программист" + rob_blurb: "Программирует все" + josh_c_title: "Гейм дизайнер" + josh_c_blurb: "Делает игры" + robin_title: "UX дизайнер & Исследования" + # robin_blurb: "Scaffolding" + josh_title: "Гейм дизайнер" josh_blurb: "Пол - это лава" -# phoenix_title: "Software Engineer" -# nolan_title: "Territory Manager" -# elliot_title: "Partnership Manager" -# elliot_blurb: "Mindreader" -# lisa_title: "Market Development Rep" + phoenix_title: "Инженер программист" + nolan_title: "Региональный менеджер" + elliot_title: "Менеджер партнерства" + elliot_blurb: "Читающий мысли" + lisa_title: "Представитель по развитию рынка" retrostyle_title: "Иллюстрирование" retrostyle_blurb: "RetroStyle Games" jose_title: "Музыка" From 69178430188d3a93eaf2145a2e70b09b4dd304ff Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Wed, 3 Aug 2016 13:32:49 -0700 Subject: [PATCH 06/18] Add a couple animations to defaultActions while game-dev lazy rendering isn't working --- app/models/ThangType.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee index cb21350f8..240fb302d 100644 --- a/app/models/ThangType.coffee +++ b/app/models/ThangType.coffee @@ -38,7 +38,7 @@ module.exports = class ThangType extends CocoModel urlRoot: '/db/thang.type' building: {} editableByArtisans: true - @defaultActions: ['idle', 'die', 'move', 'attack'] + @defaultActions: ['idle', 'die', 'move', 'attack', 'trick', 'cast'] initialize: -> super() From 796c35f66d3768b7a442e3044fda47a0a27d6647 Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Wed, 3 Aug 2016 14:53:03 -0700 Subject: [PATCH 07/18] Tweak campaign connecton arrows so they point more accurately to the next level --- app/views/play/CampaignView.coffee | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index 931a5244c..b6cb3bc50 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -365,12 +365,13 @@ module.exports = class CampaignView extends RootView return experienceScore createLine: (o1, o2) -> - p1 = x: o1.x, y: 0.66 * o1.y + 0.5 - p2 = x: o2.x, y: 0.66 * o2.y + 0.5 + ratio = parseFloat($(".map").css("width")) / parseFloat($(".map").css("height")) + p1 = x: o1.x, y: o1.y / ratio - 0.5 + p2 = x: o2.x, y: o2.y / ratio length = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)) angle = Math.atan2(p1.y - p2.y, p2.x - p1.x) * 180 / Math.PI transform = "rotate(#{angle}deg)" - line = $('
').appendTo('.map').addClass('next-level-line').css(transform: transform, width: length + '%', left: o1.x + '%', bottom: (o1.y + 0.5) + '%') + line = $('
').appendTo('.map').addClass('next-level-line').css(transform: transform, width: length + '%', left: o1.x + '%', bottom: (o1.y - 0.5) + '%') line.append($('
')).append($('
')) applyCampaignStyles: -> From 41cf864dc7ae6295eee241f75c9767c45b216042 Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Thu, 4 Aug 2016 10:20:50 -0700 Subject: [PATCH 08/18] Add divide by zero check' --- app/views/play/CampaignView.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index b6cb3bc50..6b9bc9e7f 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -365,7 +365,10 @@ module.exports = class CampaignView extends RootView return experienceScore createLine: (o1, o2) -> - ratio = parseFloat($(".map").css("width")) / parseFloat($(".map").css("height")) + mapHeight = parseFloat($(".map").css("height")) + mapWidth = parseFloat($(".map").css("width")) + return unless mapHeight > 0 + ratio = mapWidth / mapHeight p1 = x: o1.x, y: o1.y / ratio - 0.5 p2 = x: o2.x, y: o2.y / ratio length = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)) From 246469bdde862b6e5ea5afbcc1e6825b34cc4734 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Thu, 4 Aug 2016 18:37:01 -0700 Subject: [PATCH 09/18] A couple fixes for demo flow --- .../teachers/hovers/progress-dot-single-student-level.jade | 4 +++- app/views/courses/TeacherCoursesView.coffee | 5 ++++- server/middleware/classrooms.coffee | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/templates/teachers/hovers/progress-dot-single-student-level.jade b/app/templates/teachers/hovers/progress-dot-single-student-level.jade index 0c77f5853..db167a122 100644 --- a/app/templates/teachers/hovers/progress-dot-single-student-level.jade +++ b/app/templates/teachers/hovers/progress-dot-single-student-level.jade @@ -13,7 +13,9 @@ if completed .small-details.nowrap span.spr(data-i18n='teacher.completed') | Completed - span= new Date(session.get('dateFirstCompleted')).toLocaleString() + - var dateCompleted = session.get('dateFirstCompleted') || session.get('created') || session.get('changed'); + if dateCompleted + span= new Date(dateCompleted).toLocaleString() +timePlayed //- .small-details //- i(data-i18n='teacher.click_to_view_solution') diff --git a/app/views/courses/TeacherCoursesView.coffee b/app/views/courses/TeacherCoursesView.coffee index d1cf6d024..004485754 100644 --- a/app/views/courses/TeacherCoursesView.coffee +++ b/app/views/courses/TeacherCoursesView.coffee @@ -41,7 +41,10 @@ module.exports = class TeacherCoursesView extends RootView @ownedClassrooms.fetchMine({data: {project: '_id'}}) @supermodel.trackCollection(@ownedClassrooms) @courses = new Courses() - @supermodel.trackRequest @courses.fetchReleased() + if me.isAdmin() + @supermodel.trackRequest @courses.fetch() + else + @supermodel.trackRequest @courses.fetchReleased() @campaigns = new Campaigns() @supermodel.trackRequest @campaigns.fetchByType('course', { data: { project: 'levels,levelsUpdated' } }) @ diff --git a/server/middleware/classrooms.coffee b/server/middleware/classrooms.coffee index b04045fce..2a300a435 100644 --- a/server/middleware/classrooms.coffee +++ b/server/middleware/classrooms.coffee @@ -105,13 +105,13 @@ module.exports = members = classroom.get('members') or [] members = members.slice(memberSkip, memberSkip + memberLimit) dbqs = [] - select = 'state.complete level creator playtime changed dateFirstCompleted submitted' + select = 'state.complete level creator playtime changed created dateFirstCompleted submitted' for member in members dbqs.push(LevelSession.find({creator: member.toHexString()}).select(select).exec()) results = yield dbqs sessions = _.flatten(results) res.status(200).send(sessions) - + fetchMembers: wrap (req, res, next) -> throw new errors.Unauthorized() unless req.user memberLimit = parse.getLimitFromReq(req, {default: 10, max: 100, param: 'memberLimit'}) From d5e3be62a41effef711a62e79cfb7b4a0b8682c8 Mon Sep 17 00:00:00 2001 From: Matt Sanders Date: Fri, 5 Aug 2016 16:52:02 +1200 Subject: [PATCH 10/18] fixed the background issue on the achievements view --- .../editor/level/related-achievements.jade | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/app/templates/editor/level/related-achievements.jade b/app/templates/editor/level/related-achievements.jade index 6f496866d..2676244ef 100644 --- a/app/templates/editor/level/related-achievements.jade +++ b/app/templates/editor/level/related-achievements.jade @@ -1,23 +1,25 @@ -button.btn.btn-primary#new-achievement-button(disabled=(me.isAdmin() === true || me.isArtisan() === true) ? undefined : "true" data-i18n="editor.new_achievement_title") Create a New Achievement +.nano.editor-nano-container + .nano-content + button.btn.btn-primary#new-achievement-button(disabled=(me.isAdmin() === true || me.isArtisan() === true) ? undefined : "true" data-i18n="editor.new_achievement_title") Create a New Achievement -if !view.achievements.models.length - .panel - .panel-body - p(data-i18n="editor.no_achievements") No achievements added for this level yet. -else - table.table.table-hover - thead - tr - th - th(data-i18n="general.name") Name - th(data-i18n="general.description") Description - th XP - tbody - each achievement in view.achievements.models - tr - td(style="width: 20px") - img.achievement-icon-small(src=achievement.getImageURL() alt="#{achievement.get('name') icon") - td - a(href="/editor/achievement/#{achievement.get('slug')}")= achievement.get('name', true) - td= achievement.get('description', true) - td= achievement.get('worth', true) + if !view.achievements.models.length + .panel + .panel-body + p(data-i18n="editor.no_achievements") No achievements added for this level yet. + else + table.table.table-hover + thead + tr + th + th(data-i18n="general.name") Name + th(data-i18n="general.description") Description + th XP + tbody + each achievement in view.achievements.models + tr + td(style="width: 20px") + img.achievement-icon-small(src=achievement.getImageURL() alt="#{achievement.get('name') icon") + td + a(href="/editor/achievement/#{achievement.get('slug')}")= achievement.get('name', true) + td= achievement.get('description', true) + td= achievement.get('worth', true) From 95146e7820025a766734193f888db1ee56ac600b Mon Sep 17 00:00:00 2001 From: Matt Sanders Date: Fri, 5 Aug 2016 17:02:22 +1200 Subject: [PATCH 11/18] fixed the background issue on the tasks tab --- app/templates/editor/level/tasks-tab.jade | 82 ++++++++++++----------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/app/templates/editor/level/tasks-tab.jade b/app/templates/editor/level/tasks-tab.jade index 247653b4d..70a2870be 100644 --- a/app/templates/editor/level/tasks-tab.jade +++ b/app/templates/editor/level/tasks-tab.jade @@ -1,42 +1,44 @@ -mixin task-row(cid) - - var task = view.getTaskByCID(cid) - - var taskName = task.get('name'); - - var isComplete = task.get('complete') - tr.task-row(data-task-cid=cid) - td.task-check - div.checkbox - input(type='checkbox', checked=(isComplete || false)).task-input - if task.get('curEdit') == true - td.edit-cell - td.task-name - input(type="input", value=taskName)#cur-edit - else - td.edit-cell - span.glyphicon.glyphicon-edit.start-edit - td.task-name - - var result = view.getTaskURL(taskName) - if result !== null - // https://github.com/codecombat/codecombat/wiki/Tasks-Tab# - a(href='https://github.com/codecombat/codecombat/wiki/Tasks-Tab#' + result, target='blank')= taskName +.nano.editor-nano-container + .nano-content + mixin task-row(cid) + - var task = view.getTaskByCID(cid) + - var taskName = task.get('name'); + - var isComplete = task.get('complete') + tr.task-row(data-task-cid=cid) + td.task-check + div.checkbox + input(type='checkbox', checked=(isComplete || false)).task-input + if task.get('curEdit') == true + td.edit-cell + td.task-name + input(type="input", value=taskName)#cur-edit else - span= taskName + td.edit-cell + span.glyphicon.glyphicon-edit.start-edit + td.task-name + - var result = view.getTaskURL(taskName) + if result !== null + // https://github.com/codecombat/codecombat/wiki/Tasks-Tab# + a(href='https://github.com/codecombat/codecombat/wiki/Tasks-Tab#' + result, target='blank')= taskName + else + span= taskName -block - table.table.table-striped.table-hover - tr - th.task-check Complete - th.edit-cell Edit - th Incomplete Tasks - for task in (view.taskArray() || []) - if task.get('revert').complete !== true - +task-row(task.cid) - tr - th.task-check - th.edit-cell - th Completed Tasks - for task in (view.taskArray() || []) - if task.get('revert').complete === true - +task-row(task.cid) - button#create-task.btn.btn-primary Add Task - if view.missingDefaults().length !== 0 - button#add-default-tasks.btn.btn-default Add Default Tasks + block + table.table.table-striped.table-hover + tr + th.task-check Complete + th.edit-cell Edit + th Incomplete Tasks + for task in (view.taskArray() || []) + if task.get('revert').complete !== true + +task-row(task.cid) + tr + th.task-check + th.edit-cell + th Completed Tasks + for task in (view.taskArray() || []) + if task.get('revert').complete === true + +task-row(task.cid) + button#create-task.btn.btn-primary Add Task + if view.missingDefaults().length !== 0 + button#add-default-tasks.btn.btn-default Add Default Tasks From ef7b9aa3aa104d0624220c600e1c2595980eb6af Mon Sep 17 00:00:00 2001 From: Matt Sanders Date: Fri, 5 Aug 2016 17:12:18 +1200 Subject: [PATCH 12/18] fixes #3794 by not making everything 100% height --- app/styles/docs/components-documentation-view.sass | 2 +- app/templates/editor/level/edit.jade | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/styles/docs/components-documentation-view.sass b/app/styles/docs/components-documentation-view.sass index 0a5bdb7fc..325254d59 100644 --- a/app/styles/docs/components-documentation-view.sass +++ b/app/styles/docs/components-documentation-view.sass @@ -1,6 +1,6 @@ #components-documentation-view background-color: #e4cf8c - height: 100% + height: calc(100% - 90px) #toggle-all-component-code margin: 10px diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index b4d1e7791..f137b92fd 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -144,12 +144,12 @@ block outer_content div.tab-pane#related-achievements-view div.tab-pane#editor-level-documentation - ul.nav.nav-pills.nav-justified - li - a(href="#components-documentation-view", data-toggle="pill", data-i18n="resources.components") Components - li - a(href="#systems-documentation-view", data-toggle="pill", data-i18n="resources.systems") Systems div.tab-content + ul.nav.nav-pills.nav-justified + li + a(href="#components-documentation-view", data-toggle="pill", data-i18n="resources.components") Components + li + a(href="#systems-documentation-view", data-toggle="pill", data-i18n="resources.systems") Systems div.tab-pane#components-documentation-view div.tab-pane#systems-documentation-view From 96cbcfada2304f03c548f41c684b327d13672aa3 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 5 Aug 2016 09:21:37 -0700 Subject: [PATCH 13/18] :bug:Fix prepaids middleware missing this.logError --- server/middleware/prepaids.coffee | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/middleware/prepaids.coffee b/server/middleware/prepaids.coffee index 80192ddac..11fc9bde2 100644 --- a/server/middleware/prepaids.coffee +++ b/server/middleware/prepaids.coffee @@ -11,10 +11,6 @@ cutoffDate = new Date(2015,11,11) cutoffID = mongoose.Types.ObjectId(Math.floor(cutoffDate/1000).toString(16)+'0000000000000000') module.exports = - logError: (user, msg) -> - console.warn "Prepaid Error: [#{user.get('slug')} (#{user._id})] '#{msg}'" - - post: wrap (req, res) -> validTypes = ['course'] unless req.body.type in validTypes @@ -71,7 +67,7 @@ module.exports = update = { $push: { redeemers : { date: new Date(), userID: user._id } }} result = yield Prepaid.update(query, update) if result.nModified is 0 - @logError(req.user, "POST prepaid redeemer lost race on maxRedeemers") + console.error("Prepaid redeem error: [#{req.user.get('slug')} (#{req.user._id})] 'POST prepaid redeemer lost race on maxRedeemers'") throw new errors.Forbidden('This prepaid is exhausted') update = { From adda9747e9bce48a7dea9a72b8e9be53fcc4ab40 Mon Sep 17 00:00:00 2001 From: Catsync Date: Fri, 5 Aug 2016 13:31:46 -0400 Subject: [PATCH 14/18] Add a value 'hidden' for campaign's type property (#3819) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nick would have to manually remove the defaulted ‘hero’ type from new campaigns to make sure it wasn’t included in various campaign related queries until we were ready. Now we can set this to hidden in the campaign editor. --- app/schemas/models/campaign.schema.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/schemas/models/campaign.schema.coffee b/app/schemas/models/campaign.schema.coffee index 82b0eb763..8dfbe6f19 100644 --- a/app/schemas/models/campaign.schema.coffee +++ b/app/schemas/models/campaign.schema.coffee @@ -9,7 +9,7 @@ _.extend CampaignSchema.properties, { i18n: {type: 'object', title: 'i18n', format: 'i18n', props: ['name', 'fullName', 'description']} fullName: { type: 'string', title: 'Full Name', description: 'Ex.: "Kithgard Dungeon"' } description: { type: 'string', format: 'string', description: 'How long it takes and what players learn.' } - type: c.shortString(title: 'Type', description: 'What kind of campaign this is.', 'enum': ['hero', 'course']) + type: c.shortString(title: 'Type', description: 'What kind of campaign this is.', 'enum': ['hero', 'course','hidden']) ambientSound: c.object {}, mp3: { type: 'string', format: 'sound-file' } From 8b8086a95d84204392beec3683a73fa6d5c4b9da Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 5 Aug 2016 12:09:36 -0700 Subject: [PATCH 15/18] :bug:Fix admin classrooms levels page campaign lookup --- app/templates/admin/admin-classroom-levels.jade | 4 ++++ app/views/admin/AdminClassroomLevelsView.coffee | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/templates/admin/admin-classroom-levels.jade b/app/templates/admin/admin-classroom-levels.jade index 88de2be94..463e2d85e 100644 --- a/app/templates/admin/admin-classroom-levels.jade +++ b/app/templates/admin/admin-classroom-levels.jade @@ -16,6 +16,8 @@ block content th Course each course in view.courses.models - var campaign = view.campaigns.get(course.get('campaignID')); + if !campaign + - continue; - var levels = campaign.getLevels().models; - levelsTotal += levels.length; tr @@ -26,6 +28,8 @@ block content td All each course in view.courses.models - var campaign = view.campaigns.get(course.get('campaignID')); + if !campaign + - continue; - var levels = campaign.getLevels().models; - levelCounts = levels.length; strong #{course.get('name')} diff --git a/app/views/admin/AdminClassroomLevelsView.coffee b/app/views/admin/AdminClassroomLevelsView.coffee index 906e0b382..8ed441cd3 100644 --- a/app/views/admin/AdminClassroomLevelsView.coffee +++ b/app/views/admin/AdminClassroomLevelsView.coffee @@ -1,6 +1,6 @@ RootView = require 'views/core/RootView' CocoCollection = require 'collections/CocoCollection' -Campaigns = require 'collections/Campaigns' +Campaign = require 'models/Campaign' Course = require 'models/Course' module.exports = class AdminClassroomLevelsView extends RootView @@ -9,8 +9,8 @@ module.exports = class AdminClassroomLevelsView extends RootView initialize: -> return super() unless me.isAdmin() - @campaigns = new Campaigns() - @supermodel.trackRequest @campaigns.fetchByType('course', { data: { project: 'levels,levelsUpdated' } }) + @campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign}) + @supermodel.loadCollection(@campaigns, 'campaigns') @courses = new CocoCollection([], { url: "/db/course", model: Course}) @supermodel.loadCollection(@courses, 'courses') super() From 175d8a9983fd2bbfcee09d5a9081aa884ae09a34 Mon Sep 17 00:00:00 2001 From: themaka Date: Fri, 5 Aug 2016 15:11:15 -0400 Subject: [PATCH 16/18] Comment out the "common" Which I've learned is not used until someone's actually translated something in that section ... --- app/locale/hr.coffee | 2 +- app/locale/mi.coffee | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/locale/hr.coffee b/app/locale/hr.coffee index 91a6d4e28..7772c964c 100644 --- a/app/locale/hr.coffee +++ b/app/locale/hr.coffee @@ -333,7 +333,7 @@ module.exports = nativeDescription: "hrvatski jezik", englishDescription: "Croat # misc: "Misc" # books: "Books" - common: +# common: # back: "Back" # When used as an action verb, like "Navigate backward" # continue: "Continue" # When used as an action verb, like "Continue forward" # loading: "Loading..." diff --git a/app/locale/mi.coffee b/app/locale/mi.coffee index 658f3be24..8c7503fa3 100644 --- a/app/locale/mi.coffee +++ b/app/locale/mi.coffee @@ -333,10 +333,10 @@ module.exports = nativeDescription: "te reo Māori", englishDescription: "Māori # misc: "Misc" # books: "Books" - common: +# common: # back: "Back" # When used as an action verb, like "Navigate backward" # continue: "Continue" # When used as an action verb, like "Continue forward" - loading: "Loading..." +# loading: "Loading..." # saving: "Saving..." # sending: "Sending..." # send: "Send" From f4c0e4144ea92af0b8fcee76eb2b309f605d7fa3 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Fri, 5 Aug 2016 13:23:44 -0700 Subject: [PATCH 17/18] Add some comments and a TODO for the supermodel retrying system --- app/lib/LevelLoader.coffee | 3 +++ app/models/SuperModel.coffee | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee index 3b2712f13..6d5acbeca 100644 --- a/app/lib/LevelLoader.coffee +++ b/app/lib/LevelLoader.coffee @@ -22,6 +22,9 @@ LOG = false # * Sprite map generation # * Connecting to Firebase +# LevelLoader depends on SuperModel retrying timed out requests, as these occasionally happen during play. +# If LevelLoader ever moves away from SuperModel, it will have to manage its own retries. + module.exports = class LevelLoader extends CocoClass constructor: (options) -> diff --git a/app/models/SuperModel.coffee b/app/models/SuperModel.coffee index 45c555e60..22e500c66 100644 --- a/app/models/SuperModel.coffee +++ b/app/models/SuperModel.coffee @@ -298,6 +298,10 @@ class ModelResource extends Resource @loadsAttempted = 0 load: -> + # TODO: Track progress on requests and don't retry if progress was made recently. + # Probably use _.debounce and attach event listeners to xhr objects. + + # This logic is for handling failed responses for level loading. timeToWait = 5000 tryLoad = => return if this.isLoaded From 6f08d5e42209bebeb6d0abbc5e0dfb89937ac03c Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 5 Aug 2016 09:08:37 -0700 Subject: [PATCH 18/18] Add required district field to teacher trial request forms School now optional N/A placeholder on district field and don't save it if it's n/a Updating required field error UI a bit, and there is some larger refactoring needed here later. NCES phone number for district only entries will currently be a child school, will fix later. Closes #3818 --- app/core/forms.coffee | 2 +- app/locale/en.coffee | 6 +- app/styles/teachers/request-quote-view.sass | 96 ----- .../teachers/teacher-trial-requests.sass | 81 ++++ app/templates/admin/demo-requests.jade | 6 +- .../convert-to-teacher-account-view.jade | 51 +-- .../teachers/create-teacher-account-view.jade | 59 +-- .../teachers/request-quote-view.jade | 92 ++--- .../ConvertToTeacherAccountView.coffee | 62 ++- .../teachers/CreateTeacherAccountView.coffee | 74 ++-- app/views/teachers/RequestQuoteView.coffee | 59 ++- .../teachers/TeachersContactModal.coffee | 3 +- scripts/updateCloseIoLeads.js | 4 +- server/middleware/prepaids.coffee | 2 +- test/app/factories.coffee | 1 + .../ConvertToTeacherAccountView.spec.coffee | 46 +++ .../CreateTeacherAccountView.spec.coffee | 51 ++- .../teachers/RequestQuoteView.spec.coffee | 361 ++++++++++-------- 18 files changed, 630 insertions(+), 426 deletions(-) delete mode 100644 app/styles/teachers/request-quote-view.sass create mode 100644 app/styles/teachers/teacher-trial-requests.sass diff --git a/app/core/forms.coffee b/app/core/forms.coffee index b6c115ed4..c632e4beb 100644 --- a/app/core/forms.coffee +++ b/app/core/forms.coffee @@ -45,7 +45,7 @@ module.exports.applyErrorsToForm = (el, errors, warning=false) -> for error in errors if error.code is tv4.errorCodes.OBJECT_REQUIRED prop = _.last(_.string.words(error.message)) # hack - message = 'Required field' + message = $.i18n.t('common.required_field') else if error.dataPath prop = error.dataPath[1..] diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 09b17cf3e..2d856e6d8 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -356,7 +356,7 @@ submit_patch: "Submit Patch" submit_changes: "Submit Changes" save_changes: "Save Changes" - required_field: "Required field" + required_field: "required" # {change} general: and: "and" @@ -885,7 +885,9 @@ evaluate_recommend: "Evaluate/Recommend" approve_funds: "Approve Funds" no_purchaser_role: "No role in purchase decisions" - organization_label: "Name of School/District" + district_label: "District" + district_na: "Enter N/A if not applicable" + organization_label: "School" # {change} city: "City" state: "State" country: "Country" diff --git a/app/styles/teachers/request-quote-view.sass b/app/styles/teachers/request-quote-view.sass deleted file mode 100644 index f4c61da92..000000000 --- a/app/styles/teachers/request-quote-view.sass +++ /dev/null @@ -1,96 +0,0 @@ -@import "app/styles/mixins" -@import "app/styles/bootstrap/variables" - -#request-quote-view - #site-content-area - margin: 50px 0 100px - .row - margin: 20px 0 - - #conversion-warning - margin-top: 20px - - .form-group - label - margin-bottom: 0 - - label.checkbox - font-weight: normal - - .help-block - margin: -4px 0 2px - - p - margin: 0 0 20px - - .checkbox, .checkbox-inline - input - margin-top: 8px - - #other-education-level-input - label - display: inline-block - display: inline-block - width: 200px - margin-left: 5px - - #submit-request-btn - margin-left: 10px - - // After submit (anonymous) - - h5 - margin-top: 50px - - #social-network-signups - margin: 20px 0 - button - margin-left: 10px - - .text-h1 - margin: 40px 0 30px - - -.algolia-autocomplete - width: 100%; - - .aa-input - width: 100% - - .aa-hint - color: #999 - width: 100% - - .aa-dropdown-menu - background-color: #fff - border: 1px solid #999 - border-top: none - width: 100% - - .aa-suggestion - cursor: pointer - padding: 5px 4px - border-top: 1px solid #ccc - - .school - font-family: Open Sans - font-size: 14px - line-height: 20px - font-weight: bold - - .district - font-family: Open Sans - font-size: 14px - line-height: 20px - - span - white-space: nowrap - - - .aa-suggestion.aa-cursor - background-color: #B2D7FF - - em - font-weight: bold - font-style: normal - diff --git a/app/styles/teachers/teacher-trial-requests.sass b/app/styles/teachers/teacher-trial-requests.sass new file mode 100644 index 000000000..b933f00e9 --- /dev/null +++ b/app/styles/teachers/teacher-trial-requests.sass @@ -0,0 +1,81 @@ +#create-teacher-account-view, #convert-to-teacher-account-view, #request-quote-view + .algolia-autocomplete + width: 100%; + + .aa-input + width: 100% + + .aa-hint + color: #999 + width: 100% + + .aa-dropdown-menu + background-color: #fff + border: 1px solid #999 + border-top: none + width: 100% + + .aa-suggestion + cursor: pointer + padding: 5px 4px + border-top: 1px solid #ccc + + .school + font-family: Open Sans + font-size: 14px + line-height: 20px + font-weight: bold + + .district + font-family: Open Sans + font-size: 14px + line-height: 20px + + span + white-space: nowrap + + + .aa-suggestion.aa-cursor + background-color: #B2D7FF + + em + font-weight: bold + font-style: normal + + // TODO: update form validation instead of overwriting these styles + + .control-label + font-weight: bold + width: 100% + + .error-help-block + margin-top: inherit + margin-bottom: 0px + float: right + font-size: 13px + font-style: italic + font-weight: normal + + .text-muted + float: right + font-size: 13px + font-style: italic + font-weight: normal + + .nullify-form-control + display: inherit + width: inherit + height: inherit + padding: inherit + font-size: inherit + line-height: inherit + color: inherit + vertical-align: inherit + background-color: inherit + background-image: inherit + border: inherit + border-radius: inherit + -webkit-box-shadow: inherit + box-shadow: inherit + -webkit-transition: inherit + transition: inherit diff --git a/app/templates/admin/demo-requests.jade b/app/templates/admin/demo-requests.jade index d072b64e6..ad4d251fa 100644 --- a/app/templates/admin/demo-requests.jade +++ b/app/templates/admin/demo-requests.jade @@ -30,8 +30,8 @@ block content thead tr th Created - th NCES District th School Name + th School District th.number NCES District Schools th.number NCES District Students th.number NCES School Students @@ -44,8 +44,8 @@ block content - continue; tr td.created= trialRequest.get('created').substring(0, 10) - td= trialRequest.get('properties').nces_district || '' - td= trialRequest.get('properties').organization || '' + td= trialRequest.get('properties').nces_name || trialRequest.get('properties').organization || '' + td= trialRequest.get('properties').nces_district || trialRequest.get('properties').district || '' td= trialRequest.get('properties').nces_district_schools || '' td= trialRequest.get('properties').nces_district_students || '' td= trialRequest.get('properties').nces_students || '' diff --git a/app/templates/teachers/convert-to-teacher-account-view.jade b/app/templates/teachers/convert-to-teacher-account-view.jade index 3feab53ac..ec754d4c8 100644 --- a/app/templates/teachers/convert-to-teacher-account-view.jade +++ b/app/templates/teachers/convert-to-teacher-account-view.jade @@ -28,40 +28,36 @@ block content .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.username") + span.control-label(data-i18n="general.username") input.form-control(disabled=true value=me.get('name')) .col-md-4.col-sm-6 #email-form-group.form-group - label.control-label(data-i18n="general.email") + span.control-label(data-i18n="general.email") input.form-control(name='email' disabled=true value=me.get('email')) .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.first_name") + span.control-label(data-i18n="general.first_name") input.form-control(name="firstName" value=me.get('firstName') || '') .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.last_name") + span.control-label(data-i18n="general.last_name") input.form-control(name="lastName" value=me.get('lastName') || '') .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="teachers_quote.phone_number") span.spl.text-muted(data-i18n="signup.optional") - .help-block.small - em.text-info(data-i18n="teachers_quote.phone_number_help") - input.form-control(name="phoneNumber") + input.form-control(name="phoneNumber", data-i18n="[placeholder]teachers_quote.phone_number_help") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.primary_role_label") - .help-block.small - em.text-info(data-i18n="teachers_quote.role_help") + span.control-label(data-i18n="teachers_quote.primary_role_label") select.form-control(name="role") option(data-i18n="teachers_quote.role_default", , value='') option(data-i18n="courses.teacher", value="Teacher") @@ -75,30 +71,40 @@ block content .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.organization_label") + span.control-label + span(data-i18n="teachers_quote.organization_label") + span.spl.text-muted(data-i18n="signup.optional") input.form-control#organization-control(name="organization") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.city") - input.form-control(name="city") + //- TODO: algolia and form errors both change form-control + //- TODO: District not red on validation error + span.control-label.form-control.nullify-form-control(data-i18n="teachers_quote.district_label") + input.form-control#district-control(name="district", data-i18n="[placeholder]teachers_quote.district_na") .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.state") - input.form-control(name="state") + span.control-label(data-i18n="teachers_quote.city") + input.form-control(name="city") .col-md-4.col-sm-6 .form-group - label.control-labellabel.control-label(data-i18n="teachers_quote.country") + span.control-label(data-i18n="teachers_quote.state") + input.form-control(name="state") + + .row.m-y-2 + .col-md-offset-2.col-md-4.col-sm-6 + .form-group + span.control-labelspan.control-label(data-i18n="teachers_quote.country") input.form-control(name="country") #form-students-info .row.m-y-2 .col-md-offset-2.col-md-4 .form-group - label.control-label(data-i18n="courses.number_programming_students") + span.control-label(data-i18n="courses.number_programming_students") .help-block.small em.text-info(data-i18n="teachers_quote.num_students_help") select.form-control(name="numStudents") @@ -113,7 +119,7 @@ block content .col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="courses.number_total_students") span.spl.text-muted(data-i18n="signup.optional") select.form-control(name="numStudentsTotal") @@ -126,11 +132,10 @@ block content .form-group .row.m-y-2 - .col-md-offset-2.col-md-10 - label.control-label(data-i18n="teachers_quote.education_level_label") + .col-md-offset-2.col-md-4 + span.control-label(data-i18n="teachers_quote.education_level_label") .help-block.small em.text-info(data-i18n="teachers_quote.education_level_help") - .col-md-offset-2.col-md-5 .checkbox label input(type="checkbox" name="educationLevel" value="Elementary") @@ -156,7 +161,7 @@ block content #anything-else-row.row.m-y-2 .col-md-offset-2.col-md-8 - label.control-label + span.control-label span(data-i18n="teachers_quote.anything_else") span.spl.text-muted(data-i18n="signup.optional") textarea.form-control(rows=8, name="notes") diff --git a/app/templates/teachers/create-teacher-account-view.jade b/app/templates/teachers/create-teacher-account-view.jade index e7a4e940e..742b509cd 100644 --- a/app/templates/teachers/create-teacher-account-view.jade +++ b/app/templates/teachers/create-teacher-account-view.jade @@ -34,49 +34,47 @@ block content .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.username") + span.control-label(data-i18n="general.username") input.form-control(name="name") .col-md-4.col-sm-6 #email-form-group.form-group - label.control-label(data-i18n="general.email") + span.control-label(data-i18n="general.email") input.form-control(name="email") .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.first_name") + span.control-label(data-i18n="general.first_name") input.form-control(name="firstName") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.last_name") + span.control-label(data-i18n="general.last_name") input.form-control(name="lastName") .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.password") + span.control-label(data-i18n="general.password") input.form-control(name="password1", type="password") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.confirm_password") + span.control-label(data-i18n="general.confirm_password") input.form-control(name="password2", type="password") .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="teachers_quote.phone_number") span.spl.text-muted(data-i18n="signup.optional") - .help-block.small - em.text-info(data-i18n="teachers_quote.phone_number_help") - input.form-control(name="phoneNumber") + input.form-control(name="phoneNumber", data-i18n="[placeholder]teachers_quote.phone_number_help") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.primary_role_label") + span.control-label(data-i18n="teachers_quote.primary_role_label") select.form-control(name="role") option(data-i18n="teachers_quote.role_default", , value='') option(data-i18n="courses.teacher", value="Teacher") @@ -90,30 +88,40 @@ block content .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.organization_label") + span.control-label + span(data-i18n="teachers_quote.organization_label") + span.spl.text-muted(data-i18n="signup.optional") input.form-control#organization-control(name="organization") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.city") - input.form-control(name="city") + //- TODO: algolia and form errors both change form-control + //- TODO: District not red on validation error + span.control-label.form-control.nullify-form-control(data-i18n="teachers_quote.district_label") + input.form-control#district-control(name="district", data-i18n="[placeholder]teachers_quote.district_na") .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.state") - input.form-control(name="state") + span.control-label(data-i18n="teachers_quote.city") + input.form-control(name="city") .col-md-4.col-sm-6 .form-group - label.control-labellabel.control-label(data-i18n="teachers_quote.country") + span.control-label(data-i18n="teachers_quote.state") + input.form-control(name="state") + + .row.m-y-2 + .col-md-offset-2.col-md-4.col-sm-6 + .form-group + span.control-label(data-i18n="teachers_quote.country") input.form-control(name="country") #form-students-info .row.m-y-2 .col-md-offset-2.col-md-4 .form-group - label.control-label(data-i18n="courses.number_programming_students") + span.control-label(data-i18n="courses.number_programming_students") .help-block.small em.text-info(data-i18n="teachers_quote.num_students_help") select.form-control(name="numStudents") @@ -128,7 +136,7 @@ block content .col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="courses.number_total_students") span.spl.text-muted(data-i18n="signup.optional") select.form-control(name="numStudentsTotal") @@ -140,14 +148,11 @@ block content option 10,000+ .form-group - .row.m-y-2 - .col-md-offset-2.col-md-10 - label.control-label(data-i18n="teachers_quote.education_level_label") - .help-block.small - em.text-info(data-i18n="teachers_quote.education_level_help") - - .col-md-offset-2.col-md-5 + .col-md-offset-2.col-md-4 + span.control-label(data-i18n="teachers_quote.education_level_label") + .help-block.small + em.text-info(data-i18n="teachers_quote.education_level_help") .checkbox label input(type="checkbox" name="educationLevel" value="Elementary") @@ -173,7 +178,7 @@ block content #anything-else-row.row.m-y-2 .col-md-offset-2.col-md-8 - label.control-label + span.control-label span(data-i18n="teachers_quote.anything_else") span.spl.text-muted(data-i18n="signup.optional") diff --git a/app/templates/teachers/request-quote-view.jade b/app/templates/teachers/request-quote-view.jade index f92a53fa3..0dffd6446 100644 --- a/app/templates/teachers/request-quote-view.jade +++ b/app/templates/teachers/request-quote-view.jade @@ -36,7 +36,7 @@ block content .row .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="general.username") span.spl.text-muted(data-i18n="signup.optional") - var name = me.get('name') || ''; @@ -44,20 +44,20 @@ block content .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="share_progress_modal.form_label") + span.control-label(data-i18n="share_progress_modal.form_label") - var email = me.get('email') || ''; input.form-control(name="email" value=email, disabled=!!email) .row .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.first_name") + span.control-label(data-i18n="general.first_name") - var firstName = me.get('firstName') || ''; input.form-control(name="firstName" value=firstName, disabled=!!firstName) .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="general.last_name") + span.control-label(data-i18n="general.last_name") - var lastName = me.get('lastName') || ''; input.form-control(name="lastName" value=lastName, disabled=!!lastName) @@ -65,33 +65,30 @@ block content .row .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label - span(data-i18n="teachers_quote.phone_number") - .help-block.small - em.text-info(data-i18n="teachers_quote.phone_number_help") - input.form-control(name="phoneNumber") - + span.control-label(data-i18n="teachers_quote.phone_number") + input.form-control(name="phoneNumber", data-i18n="[placeholder]teachers_quote.phone_number_help") + if me.isAnonymous() .row .col-md-offset-2.col-md-4.col-sm-6 #email-form-group.form-group - label.control-label(data-i18n="general.email") + span.control-label(data-i18n="general.email") - var email = me.get('email') || ''; input.form-control(name="email" type="email", value=email, disabled=!!email) .col-md-4.col-sm-6 .form-group - label.control-label + span.control-label span(data-i18n="teachers_quote.phone_number") .help-block.small em.text-info(data-i18n="teachers_quote.phone_number_help") - input.form-control(name="phoneNumber") + input.form-control(name="phoneNumber") + - .row .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.primary_role_label") + span.control-label(data-i18n="teachers_quote.primary_role_label") select.form-control(name="role") option(data-i18n="teachers_quote.primary_role_default", , value='') option(data-i18n="courses.teacher", value="Teacher") @@ -100,45 +97,55 @@ block content option(data-i18n="teachers_quote.principal", value="Principal") option(data-i18n="teachers_quote.superintendent", value="Superintendent") option(data-i18n="teachers_quote.parent", value="Parent") - - .col-md-4.col-sm-6 + + .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.purchaser_role_label") + span.control-label(data-i18n="teachers_quote.purchaser_role_label") select.form-control(name="purchaserRole") option(data-i18n="teachers_quote.purchaser_role_default", , value='') option(data-i18n="teachers_quote.influence_advocate", value="Influence/Advocate") option(data-i18n="teachers_quote.evaluate_recommend", value="Evaluate/Recommend") option(data-i18n="teachers_quote.approve_funds", value="Approve Funds") option(data-i18n="teachers_quote.no_purchaser_role", value="No role in purchase decisions") - + #form-school-info - .row + .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.organization_label") + span.control-label + span(data-i18n="teachers_quote.organization_label") + span.spl.text-muted(data-i18n="signup.optional") input.form-control#organization-control(name="organization") .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.city") - input.form-control(name="city") + //- TODO: algolia and form errors both change form-control + //- TODO: District not red on validation error + span.control-label.form-control.nullify-form-control(data-i18n="teachers_quote.district_label") + input.form-control#district-control(name="district", data-i18n="[placeholder]teachers_quote.district_na") - .row + .row.m-y-2 .col-md-offset-2.col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="teachers_quote.state") - input.form-control(name="state") + span.control-label(data-i18n="teachers_quote.city") + input.form-control(name="city") .col-md-4.col-sm-6 .form-group - label.control-labellabel.control-label(data-i18n="teachers_quote.country") + span.control-label(data-i18n="teachers_quote.state") + input.form-control(name="state") + + .row.m-y-2 + .col-md-offset-2.col-md-4.col-sm-6 + .form-group + span.control-labelspan.control-label(data-i18n="teachers_quote.country") input.form-control(name="country") #form-students-info .row .col-md-offset-2.col-md-4 .form-group - label.control-label(data-i18n="courses.number_programming_students") + span.control-label(data-i18n="courses.number_programming_students") .help-block.small em.text-info(data-i18n="teachers_quote.num_students_help") select.form-control(name="numStudents") @@ -150,10 +157,10 @@ block content option 201-500 option 501-1000 option 1000+ - + .col-md-4.col-sm-6 .form-group - label.control-label(data-i18n="courses.number_total_students") + span.control-label(data-i18n="courses.number_total_students") select.form-control(name="numStudentsTotal") option(data-i18n="teachers_quote.num_students_default", value='') option 1-500 @@ -163,14 +170,11 @@ block content option 10,000+ .form-group - - .row - .col-md-offset-2.col-md-10 - label.control-label(data-i18n="teachers_quote.education_level_label") - .help-block.small - em.text-info(data-i18n="teachers_quote.education_level_help") - - .col-md-offset-2.col-md-5 + .row.m-y-2 + .col-md-offset-2.col-md-4 + span.control-label(data-i18n="teachers_quote.education_level_label") + .help-block.small + em.text-info(data-i18n="teachers_quote.education_level_help") .checkbox label input(type="checkbox" name="educationLevel" value="Elementary") @@ -196,7 +200,7 @@ block content #anything-else-row.row .col-md-offset-2.col-md-8 - label.control-label + span.control-label span(data-i18n="teachers_quote.anything_else") span.spl.text-muted(data-i18n="signup.optional") @@ -210,7 +214,7 @@ block content input(type="hidden" name="nces_students") input(type="hidden" name="nces_phone") - #buttons-row.row.text-center + #buttons-row.row.m-y-2.text-center input#submit-request-btn.btn.btn-lg.btn-primary(type="submit" data-i18n="[value]teachers_quote.title") #form-submit-success.text-center(class=showDone ? '' : 'hide') @@ -219,7 +223,7 @@ block content p span.spr(data-i18n="teachers_quote.thanks_p") a.spl(href="mailto:team@codecombat.com") team@codecombat.com - + unless me.isAnonymous() a.btn.btn-lg.btn-navy(href="/teachers/classes") span(data-i18n='teachers_quote.back_to_classes') @@ -244,17 +248,17 @@ block content .row .col-md-offset-2.col-md-4 .form-group - label.control-label(data-i18n="general.username") + span.control-label(data-i18n="general.username") input.form-control(name="name") .row .col-md-offset-2.col-md-4 .form-group - label.control-label(data-i18n="general.password") + span.control-label(data-i18n="general.password") input.form-control(name="password1", type="password") .col-md-4 .form-group - label.control-label(data-i18n="general.confirm_password") + span.control-label(data-i18n="general.confirm_password") input.form-control(name="password2", type="password") .text-center diff --git a/app/views/teachers/ConvertToTeacherAccountView.coffee b/app/views/teachers/ConvertToTeacherAccountView.coffee index ad3e3b7f5..79f0eb04a 100644 --- a/app/views/teachers/ConvertToTeacherAccountView.coffee +++ b/app/views/teachers/ConvertToTeacherAccountView.coffee @@ -7,9 +7,9 @@ errors = require 'core/errors' User = require 'models/User' ConfirmModal = require 'views/editor/modal/ConfirmModal' algolia = require 'core/services/algolia' -NCES_KEYS = ['id', 'name', 'district', 'district_id', 'district_schools', 'district_students', 'students', 'phone'] -FORM_KEY = 'request-quote-form' +DISTRICT_NCES_KEYS = ['district', 'district_id', 'district_schools', 'district_students', 'phone'] +SCHOOL_NCES_KEYS = DISTRICT_NCES_KEYS.concat(['id', 'name', 'students']) module.exports = class ConvertToTeacherAccountView extends RootView id: 'convert-to-teacher-account-view' @@ -40,13 +40,13 @@ module.exports = class ConvertToTeacherAccountView extends RootView return 'Your account has not been updated! If you continue, your changes will be lost.' invalidateNCES: -> - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val '' onLoaded: -> if @trialRequests.size() and me.isTeacher() return application.router.navigate('/teachers', { trigger: true, replace: true }) - + super() afterRender: -> @@ -75,16 +75,34 @@ module.exports = class ConvertToTeacherAccountView extends RootView "
#{hr.name.value}
" + "
#{hr.district.value}, " + "#{hr.city?.value}, #{hr.state.value}
" - ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="district"]').val suggestion.district @$('input[name="city"]').val suggestion.city @$('input[name="state"]').val suggestion.state - @$('input[name="district"]').val suggestion.district @$('input[name="country"]').val 'USA' - - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val suggestion[key] + @onChangeForm() + $("#district-control").algolia_autocomplete({hint: false}, [ + source: (query, callback) -> + algolia.schoolsIndex.search(query, { hitsPerPage: 5, aroundLatLngViaIP: false }).then (answer) -> + callback answer.hits + , -> + callback [] + displayKey: 'district', + templates: + suggestion: (suggestion) -> + hr = suggestion._highlightResult + "
#{hr.district.value}, " + + "#{hr.city?.value}, #{hr.state.value}
" + ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="organization"]').val '' # TODO: does not persist on tabbing: back to school, back to district + @$('input[name="city"]').val suggestion.city + @$('input[name="state"]').val suggestion.state + @$('input[name="country"]').val 'USA' + for key in DISTRICT_NCES_KEYS + @$('input[name="nces_' + key + '"]').val suggestion[key] @onChangeForm() onChangeForm: -> @@ -97,28 +115,35 @@ module.exports = class ConvertToTeacherAccountView extends RootView form = @$('form') attrs = forms.formToObject(form) - + trialRequestAttrs = _.cloneDeep(attrs) + + # Don't save n/a district entries, but do validate required district client-side + trialRequestAttrs = _.omit(trialRequestAttrs, 'district') if trialRequestAttrs.district?.replace(/\s/ig, '').match(/n\/a/ig) + if @$('#other-education-level-checkbox').is(':checked') val = @$('#other-education-level-input').val() - attrs.educationLevel.push(val) if val + trialRequestAttrs.educationLevel.push(val) if val forms.clearFormAlerts(form) - result = tv4.validateMultiple(attrs, formSchema) + result = tv4.validateMultiple(trialRequestAttrs, formSchema) error = false if not result.valid forms.applyErrorsToForm(form, result.errors) error = true - if not _.size(attrs.educationLevel) - forms.setErrorToProperty(form, 'educationLevel', 'Include at least one.') + if not _.size(trialRequestAttrs.educationLevel) + forms.setErrorToProperty(form, 'educationLevel', 'include at least one') + error = true + unless attrs.district + forms.setErrorToProperty(form, 'district', $.i18n.t('common.required_field')) error = true if error forms.scrollToFirstError() return - attrs['siteOrigin'] = 'convert teacher' + trialRequestAttrs['siteOrigin'] = 'convert teacher' @trialRequest = new TrialRequest({ type: 'course' - properties: attrs + properties: trialRequestAttrs }) if me.get('role') is 'student' and not me.isAnonymous() modal = new ConfirmModal({ @@ -151,15 +176,14 @@ module.exports = class ConvertToTeacherAccountView extends RootView formSchema = { type: 'object' - required: [ - 'firstName', 'lastName', 'organization', 'role', 'numStudents', 'city', 'state', 'country' - ] + required: ['firstName', 'lastName', 'role', 'numStudents', 'city', 'state', 'country'] properties: firstName: { type: 'string' } lastName: { type: 'string' } phoneNumber: { type: 'string' } role: { type: 'string' } organization: { type: 'string' } + district: { type: 'string' } city: { type: 'string' } state: { type: 'string' } country: { type: 'string' } @@ -172,5 +196,5 @@ formSchema = { notes: { type: 'string' } } -for key in NCES_KEYS +for key in SCHOOL_NCES_KEYS formSchema['nces_' + key] = type: 'string' diff --git a/app/views/teachers/CreateTeacherAccountView.coffee b/app/views/teachers/CreateTeacherAccountView.coffee index b0107e08c..8f1e103f7 100644 --- a/app/views/teachers/CreateTeacherAccountView.coffee +++ b/app/views/teachers/CreateTeacherAccountView.coffee @@ -7,9 +7,9 @@ errors = require 'core/errors' User = require 'models/User' algolia = require 'core/services/algolia' -FORM_KEY = 'request-quote-form' SIGNUP_REDIRECT = '/teachers/classes' -NCES_KEYS = ['id', 'name', 'district', 'district_id', 'district_schools', 'district_students', 'students', 'phone'] +DISTRICT_NCES_KEYS = ['district', 'district_id', 'district_schools', 'district_students', 'phone'] +SCHOOL_NCES_KEYS = DISTRICT_NCES_KEYS.concat(['id', 'name', 'students']) module.exports = class CreateTeacherAccountView extends RootView id: 'create-teacher-account-view' @@ -43,12 +43,12 @@ module.exports = class CreateTeacherAccountView extends RootView super() invalidateNCES: -> - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val '' - + afterRender: -> super() - + # apply existing trial request on form properties = @trialRequest.get('properties') if properties @@ -58,7 +58,7 @@ module.exports = class CreateTeacherAccountView extends RootView otherLevel = _.first(_.difference(submittedLevels, commonLevels)) or '' @$('#other-education-level-checkbox').attr('checked', !!otherLevel) @$('#other-education-level-input').val(otherLevel) - + $("#organization-control").algolia_autocomplete({hint: false}, [ source: (query, callback) -> algolia.schoolsIndex.search(query, { hitsPerPage: 5, aroundLatLngViaIP: false }).then (answer) -> @@ -72,16 +72,34 @@ module.exports = class CreateTeacherAccountView extends RootView "
#{hr.name.value}
" + "
#{hr.district.value}, " + "#{hr.city?.value}, #{hr.state.value}
" - ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="district"]').val suggestion.district @$('input[name="city"]').val suggestion.city @$('input[name="state"]').val suggestion.state - @$('input[name="district"]').val suggestion.district @$('input[name="country"]').val 'USA' - - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val suggestion[key] + @onChangeForm() + $("#district-control").algolia_autocomplete({hint: false}, [ + source: (query, callback) -> + algolia.schoolsIndex.search(query, { hitsPerPage: 5, aroundLatLngViaIP: false }).then (answer) -> + callback answer.hits + , -> + callback [] + displayKey: 'district', + templates: + suggestion: (suggestion) -> + hr = suggestion._highlightResult + "
#{hr.district.value}, " + + "#{hr.city?.value}, #{hr.state.value}
" + ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="organization"]').val '' # TODO: does not persist on tabbing: back to school, back to district + @$('input[name="city"]').val suggestion.city + @$('input[name="state"]').val suggestion.state + @$('input[name="country"]').val 'USA' + for key in DISTRICT_NCES_KEYS + @$('input[name="nces_' + key + '"]').val suggestion[key] @onChangeForm() onClickLoginLink: -> @@ -95,35 +113,41 @@ module.exports = class CreateTeacherAccountView extends RootView onSubmitForm: (e) -> e.preventDefault() - + # Creating Trial Request first, validate user attributes but do not use them form = @$('form') allAttrs = forms.formToObject(form) trialRequestAttrs = _.omit(allAttrs, 'name', 'password1', 'password2') - + + # Don't save n/a district entries, but do validate required district client-side + trialRequestAttrs = _.omit(trialRequestAttrs, 'district') if trialRequestAttrs.district?.replace(/\s/ig, '').match(/n\/a/ig) + if @$('#other-education-level-checkbox').is(':checked') val = @$('#other-education-level-input').val() trialRequestAttrs.educationLevel.push(val) if val - + forms.clearFormAlerts(form) - + result = tv4.validateMultiple(trialRequestAttrs, formSchema) error = false if not result.valid forms.applyErrorsToForm(form, result.errors) error = true - if not forms.validateEmail(trialRequestAttrs.email) - forms.setErrorToProperty(form, 'email', 'Invalid email.') + if not error and not forms.validateEmail(trialRequestAttrs.email) + forms.setErrorToProperty(form, 'email', 'invalid email') error = true if not _.size(trialRequestAttrs.educationLevel) - forms.setErrorToProperty(form, 'educationLevel', 'Include at least one.') + forms.setErrorToProperty(form, 'educationLevel', 'include at least one') + error = true + unless allAttrs.district + forms.setErrorToProperty(form, 'district', $.i18n.t('common.required_field')) error = true unless @gplusAttrs or @facebookAttrs if not allAttrs.password1 - forms.setErrorToProperty(form, 'password1', 'Required field') + forms.setErrorToProperty(form, 'password1', $.i18n.t('common.required_field')) error = true else if not allAttrs.password2 - forms.setErrorToProperty(form, 'password2', 'Required field') + forms.setErrorToProperty(form, 'password2', $.i18n.t('common.required_field')) error = true else if allAttrs.password1 isnt allAttrs.password2 forms.setErrorToProperty(form, 'password1', 'Password fields are not equivalent') @@ -151,7 +175,7 @@ module.exports = class CreateTeacherAccountView extends RootView .addClass('has-error') .append($("
#{userExists} ")) forms.scrollToFirstError() - else + else errors.showNotyNetworkError(arguments...) onClickEmailExistsLoginLink: -> @@ -225,7 +249,6 @@ module.exports = class CreateTeacherAccountView extends RootView @$('input[type="password"]').attr('disabled', true) @$('#gplus-logged-in-row, #social-network-signups').toggleClass('hide') - # Facebook signup onClickFacebookSignupButton: -> @@ -269,13 +292,9 @@ module.exports = class CreateTeacherAccountView extends RootView @$('#facebook-logged-in-row, #social-network-signups').toggleClass('hide') - formSchema = { type: 'object' - required: [ - 'firstName', 'lastName', 'email', 'organization', 'role', 'numStudents', 'city' - 'state', 'country' - ] + required: ['firstName', 'lastName', 'email', 'role', 'numStudents', 'city', 'state', 'country'] properties: password1: { type: 'string' } password2: { type: 'string' } @@ -286,6 +305,7 @@ formSchema = { phoneNumber: { type: 'string' } role: { type: 'string' } organization: { type: 'string' } + district: { type: 'string' } city: { type: 'string' } state: { type: 'string' } country: { type: 'string' } @@ -298,5 +318,5 @@ formSchema = { notes: { type: 'string' } } -for key in NCES_KEYS +for key in SCHOOL_NCES_KEYS formSchema['nces_' + key] = type: 'string' diff --git a/app/views/teachers/RequestQuoteView.coffee b/app/views/teachers/RequestQuoteView.coffee index b48a9d355..be34f5ad2 100644 --- a/app/views/teachers/RequestQuoteView.coffee +++ b/app/views/teachers/RequestQuoteView.coffee @@ -8,7 +8,8 @@ ConfirmModal = require 'views/editor/modal/ConfirmModal' algolia = require 'core/services/algolia' SIGNUP_REDIRECT = '/teachers' -NCES_KEYS = ['id', 'name', 'district', 'district_id', 'district_schools', 'district_students', 'students', 'phone'] +DISTRICT_NCES_KEYS = ['district', 'district_id', 'district_schools', 'district_students', 'phone'] +SCHOOL_NCES_KEYS = DISTRICT_NCES_KEYS.concat(['id', 'name', 'students']) module.exports = class RequestQuoteView extends RootView id: 'request-quote-view' @@ -46,7 +47,7 @@ module.exports = class RequestQuoteView extends RootView super() invalidateNCES: -> - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val '' afterRender: -> @@ -75,16 +76,34 @@ module.exports = class RequestQuoteView extends RootView "
#{hr.name.value}
" + "
#{hr.district.value}, " + "#{hr.city?.value}, #{hr.state.value}
" - ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="district"]').val suggestion.district @$('input[name="city"]').val suggestion.city @$('input[name="state"]').val suggestion.state - @$('input[name="district"]').val suggestion.district @$('input[name="country"]').val 'USA' - - for key in NCES_KEYS + for key in SCHOOL_NCES_KEYS @$('input[name="nces_' + key + '"]').val suggestion[key] + @onChangeRequestForm() + $("#district-control").algolia_autocomplete({hint: false}, [ + source: (query, callback) -> + algolia.schoolsIndex.search(query, { hitsPerPage: 5, aroundLatLngViaIP: false }).then (answer) -> + callback answer.hits + , -> + callback [] + displayKey: 'district', + templates: + suggestion: (suggestion) -> + hr = suggestion._highlightResult + "
#{hr.district.value}, " + + "#{hr.city?.value}, #{hr.state.value}
" + ]).on 'autocomplete:selected', (event, suggestion, dataset) => + @$('input[name="organization"]').val '' # TODO: does not persist on tabbing: back to school, back to district + @$('input[name="city"]').val suggestion.city + @$('input[name="state"]').val suggestion.state + @$('input[name="country"]').val 'USA' + for key in DISTRICT_NCES_KEYS + @$('input[name="nces_' + key + '"]').val suggestion[key] @onChangeRequestForm() onChangeRequestForm: -> @@ -96,32 +115,39 @@ module.exports = class RequestQuoteView extends RootView e.preventDefault() form = @$('#request-form') attrs = forms.formToObject(form) + trialRequestAttrs = _.cloneDeep(attrs) + + # Don't save n/a district entries, but do validate required district client-side + trialRequestAttrs = _.omit(trialRequestAttrs, 'district') if trialRequestAttrs.district?.replace(/\s/ig, '').match(/n\/a/ig) # custom other input logic if @$('#other-education-level-checkbox').is(':checked') val = @$('#other-education-level-input').val() - attrs.educationLevel.push(val) if val + trialRequestAttrs.educationLevel.push(val) if val forms.clearFormAlerts(form) requestFormSchema = if me.isAnonymous() then requestFormSchemaAnonymous else requestFormSchemaLoggedIn - result = tv4.validateMultiple(attrs, requestFormSchemaAnonymous) + result = tv4.validateMultiple(trialRequestAttrs, requestFormSchemaAnonymous) error = false if not result.valid forms.applyErrorsToForm(form, result.errors) error = true - if not forms.validateEmail(attrs.email) - forms.setErrorToProperty(form, 'email', 'Invalid email.') + if not error and not forms.validateEmail(trialRequestAttrs.email) + forms.setErrorToProperty(form, 'email', 'invalid email') error = true - if not _.size(attrs.educationLevel) - forms.setErrorToProperty(form, 'educationLevel', 'Include at least one.') + if not _.size(trialRequestAttrs.educationLevel) + forms.setErrorToProperty(form, 'educationLevel', 'include at least one') + error = true + unless attrs.district + forms.setErrorToProperty(form, 'district', $.i18n.t('common.required_field')) error = true if error forms.scrollToFirstError() return - attrs['siteOrigin'] = 'demo request' + trialRequestAttrs['siteOrigin'] = 'demo request' @trialRequest = new TrialRequest({ type: 'course' - properties: attrs + properties: trialRequestAttrs }) if me.get('role') is 'student' and not me.isAnonymous() modal = new ConfirmModal({ @@ -262,7 +288,7 @@ module.exports = class RequestQuoteView extends RootView requestFormSchemaAnonymous = { type: 'object' required: [ - 'firstName', 'lastName', 'email', 'organization', 'role', 'purchaserRole', 'numStudents', + 'firstName', 'lastName', 'email', 'role', 'purchaserRole', 'numStudents', 'numStudentsTotal', 'phoneNumber', 'city', 'state', 'country'] properties: firstName: { type: 'string' } @@ -273,6 +299,7 @@ requestFormSchemaAnonymous = { role: { type: 'string' } purchaserRole: { type: 'string' } organization: { type: 'string' } + district: { type: 'string' } city: { type: 'string' } state: { type: 'string' } country: { type: 'string' } @@ -285,7 +312,7 @@ requestFormSchemaAnonymous = { notes: { type: 'string' }, } -for key in NCES_KEYS +for key in SCHOOL_NCES_KEYS requestFormSchemaAnonymous['nces_' + key] = type: 'string' # same form, but add username input diff --git a/app/views/teachers/TeachersContactModal.coffee b/app/views/teachers/TeachersContactModal.coffee index 0d3dbb0f8..1f86a1cc9 100644 --- a/app/views/teachers/TeachersContactModal.coffee +++ b/app/views/teachers/TeachersContactModal.coffee @@ -34,7 +34,8 @@ module.exports = class TeachersContactModal extends ModalView message = """ Hi CodeCombat! I want to learn more about the Classroom experience and get licenses so that my students can access Computer Science 2 and on. - Name of School/District: #{props.organization or ''} + Name of School #{props.nces_name or props.organization or ''} + Name of District: #{props.nces_district or props.district or ''} Role: #{props.role or ''} Phone Number: #{props.phoneNumber or ''} """ diff --git a/scripts/updateCloseIoLeads.js b/scripts/updateCloseIoLeads.js index 1fcc5209a..6a1ca5d9f 100644 --- a/scripts/updateCloseIoLeads.js +++ b/scripts/updateCloseIoLeads.js @@ -16,7 +16,7 @@ if (process.argv.length !== 10) { // TODO: Cleanup country/status lookup code // Save as custom fields instead of user-specific lead notes (also saving nces_ props) -const commonTrialProperties = ['organization', 'city', 'state', 'country']; +const commonTrialProperties = ['organization', 'district', 'city', 'state', 'country']; // Old properties which are deprecated or moved const customFieldsToRemove = [ @@ -327,7 +327,7 @@ function findCocoLeads(done) { if (!trialRequest.properties || !trialRequest.properties.email) continue; const email = trialRequest.properties.email.toLowerCase(); emails.push(email); - const name = trialRequest.properties.nces_name || trialRequest.properties.organization || trialRequest.properties.school || email; + const name = trialRequest.properties.nces_name || trialRequest.properties.organization || trialRequest.properties.school || trialRequest.properties.district || trialRequest.properties.nces_district || email; if (!leads[name]) leads[name] = new CocoLead(name); leads[name].addTrialRequest(email, trialRequest); emailLeadMap[email] = leads[name]; diff --git a/server/middleware/prepaids.coffee b/server/middleware/prepaids.coffee index 11fc9bde2..4b8b625fc 100644 --- a/server/middleware/prepaids.coffee +++ b/server/middleware/prepaids.coffee @@ -138,7 +138,7 @@ module.exports = trialRequests = yield TrialRequest.find({$and: [{type: 'course'}, {applicant: {$in: userIDs}}]}, {applicant: 1, properties: 1}).lean() schoolPrepaidsMap = {} for trialRequest in trialRequests - school = trialRequest.properties?.organization ? trialRequest.properties?.school + school = trialRequest.properties?.nces_name ? trialRequest.properties?.organization ? trialRequest.properties?.school continue unless school if userPrepaidsMap[trialRequest.applicant.valueOf()]?.length > 0 schoolPrepaidsMap[school] ?= [] diff --git a/test/app/factories.coffee b/test/app/factories.coffee index e23bd0630..88c5a9dcb 100644 --- a/test/app/factories.coffee +++ b/test/app/factories.coffee @@ -184,6 +184,7 @@ module.exports = { email: 'an@email.com' phoneNumber: '555-555-5555' organization: 'Greendale' + district: 'Green District' } }, attrs) } diff --git a/test/app/views/teachers/ConvertToTeacherAccountView.spec.coffee b/test/app/views/teachers/ConvertToTeacherAccountView.spec.coffee index d853030c7..8a36b4782 100644 --- a/test/app/views/teachers/ConvertToTeacherAccountView.spec.coffee +++ b/test/app/views/teachers/ConvertToTeacherAccountView.spec.coffee @@ -31,6 +31,7 @@ describe 'ConvertToTeacherAccountView (/teachers/update-account)', -> phoneNumber: '555-555-5555' role: 'Teacher' organization: 'School' + district: 'District' city: 'Springfield' state: 'AA' country: 'asdf' @@ -168,3 +169,48 @@ describe 'ConvertToTeacherAccountView (/teachers/update-account)', -> }) expect(me.get('role')).toBe(successForm.role.toLowerCase()) + describe 'submitting the form without school', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['organization']) + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include school setting', -> + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.organization).toBeUndefined() + expect(attrs.properties?.district).toEqual('District') + + describe 'submitting the form without district', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['district']) + forms.objectToForm(form, formData) + form.submit() + + it 'displays a validation error on district and not school', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(true) + + describe 'submitting the form district set to n/a', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['organization']) + formData.district = 'N/A' + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include district setting', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(false) + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.district).toBeUndefined() diff --git a/test/app/views/teachers/CreateTeacherAccountView.spec.coffee b/test/app/views/teachers/CreateTeacherAccountView.spec.coffee index ee8903535..20d132651 100644 --- a/test/app/views/teachers/CreateTeacherAccountView.spec.coffee +++ b/test/app/views/teachers/CreateTeacherAccountView.spec.coffee @@ -33,6 +33,7 @@ describe 'CreateTeacherAccountView', -> phoneNumber: '555-555-5555' role: 'Teacher' organization: 'School' + district: 'District' city: 'Springfield' state: 'AA' country: 'asdf' @@ -219,6 +220,8 @@ describe 'CreateTeacherAccountView', -> expect(attrs.password2).toBeUndefined() expect(attrs.name).toBeUndefined() expect(attrs.properties?.siteOrigin).toBe('create teacher') + expect(attrs.properties?.organization).toEqual('School') + expect(attrs.properties?.district).toEqual('District') describe 'after saving the new trial request', -> beforeEach -> @@ -266,5 +269,49 @@ describe 'CreateTeacherAccountView', -> spyOn(view, 'openModalView') view.$('#email-form-group .login-link').click() expect(view.openModalView).toHaveBeenCalled() - - \ No newline at end of file + + describe 'submitting the form without school', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['organization']) + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include school setting', -> + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.organization).toBeUndefined() + expect(attrs.properties?.district).toEqual('District') + + describe 'submitting the form without district', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['district']) + forms.objectToForm(form, formData) + form.submit() + + it 'displays a validation error on district and not school', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(true) + + describe 'submitting the form district set to n/a', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('form') + formData = _.omit(successForm, ['organization']) + formData.district = 'N/A' + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include district setting', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(false) + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.district).toBeUndefined() diff --git a/test/app/views/teachers/RequestQuoteView.spec.coffee b/test/app/views/teachers/RequestQuoteView.spec.coffee index 73d2c3386..060d50375 100644 --- a/test/app/views/teachers/RequestQuoteView.spec.coffee +++ b/test/app/views/teachers/RequestQuoteView.spec.coffee @@ -2,16 +2,17 @@ RequestQuoteView = require 'views/teachers/RequestQuoteView' forms = require 'core/forms' describe 'RequestQuoteView', -> - + view = null - - successFormValues = { + + successForm = { firstName: 'A' lastName: 'B' email: 'C@D.com' phoneNumber: '555-555-5555' role: 'Teacher' organization: 'School' + district: 'District' city: 'Springfield' state: 'AA' country: 'asdf' @@ -20,10 +21,10 @@ describe 'RequestQuoteView', -> purchaserRole: 'Approve Funds' educationLevel: ['Middle'] } - + isSubmitRequest = (r) -> _.string.startsWith(r.url, '/db/trial.request') and r.method is 'POST' - describe 'when user is anonymous and has an existing trial request', -> + describe 'when an anonymous user', -> beforeEach (done) -> me.clear() me.set('_id', '1234') @@ -32,184 +33,220 @@ describe 'RequestQuoteView', -> view = new RequestQuoteView() view.render() jasmine.demoEl(view.$el) - - request = jasmine.Ajax.requests.mostRecent() - request.respondWith({ - status: 200 - responseText: JSON.stringify([{ - _id: '1' - properties: { - firstName: 'First' - lastName: 'Last' - } - }]) - }) - _.defer done # Let SuperModel finish - - it 'shows request received', -> - expect(view.$('#request-form').hasClass('hide')).toBe(true) - expect(view.$('#form-submit-success').hasClass('hide')).toBe(false) - - - describe 'when user is signed in and has an existing trial request', -> - beforeEach (done) -> - me.clear() - me.set('_id', '1234') - me._revertAttributes = {} - spyOn(me, 'isAnonymous').and.returnValue(false) - view = new RequestQuoteView() - view.render() - jasmine.demoEl(view.$el) - - request = jasmine.Ajax.requests.mostRecent() - request.respondWith({ - status: 200 - responseText: JSON.stringify([{ - _id: '1' - properties: { - firstName: 'First' - lastName: 'Last' - } - }]) - }) _.defer done # Let SuperModel finish - it 'shows form with data from the most recent request', -> - expect(view.$('input[name="firstName"]').val()).toBe('First') - - describe 'when a user is anonymous and does NOT have an existing trial request', -> - beforeEach (done) -> - me.clear() - me.set('_id', '1234') - me._revertAttributes = {} - spyOn(me, 'isAnonymous').and.returnValue(true) - view = new RequestQuoteView() - view.render() - jasmine.demoEl(view.$el) - - request = jasmine.Ajax.requests.mostRecent() - request.respondWith({ - status: 200 - responseText: '[]' - }) - _.defer done # Let SuperModel finish - - describe 'when the form is unchanged', -> - it 'does not prevent navigating away', -> - expect(_.result(view, 'onLeaveMessage')).toBeFalsy() - - describe 'when the form has changed but is not submitted', -> - beforeEach -> - view.$el.find('#request-form').trigger('change') - - it 'prevents navigating away', -> - expect(_.result(view, 'onLeaveMessage')).toBeTruthy() - - describe 'on successful form submit', -> - beforeEach -> - view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented - forms.objectToForm(view.$el, successFormValues) - view.$('#request-form').submit() - @submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) - @submitRequest.respondWith({ - status: 201 - responseText: JSON.stringify(_.extend({_id: 'a'}, successFormValues)) + describe 'has an existing trial request', -> + beforeEach (done) -> + request = jasmine.Ajax.requests.mostRecent() + request.respondWith({ + status: 200 + responseText: JSON.stringify([{ + _id: '1' + properties: { + firstName: 'First' + lastName: 'Last' + } + }]) }) + _.defer done # Let SuperModel finish - it 'does not prevent navigating away', -> - expect(_.result(view, 'onLeaveMessage')).toBeFalsy() - - it 'creates a new trial request', -> - expect(@submitRequest).toBeTruthy() - expect(@submitRequest.method).toBe('POST') - attrs = JSON.parse(@submitRequest.params) - expect(attrs.properties?.siteOrigin).toBe('demo request') - - it 'sets the user\'s role to the one they chose', -> - request = _.last(jasmine.Ajax.requests.filter((r) -> _.string.startsWith(r.url, '/db/user'))) - expect(request).toBeTruthy() - expect(request.method).toBe('PUT') - expect(JSON.parse(request.params).role).toBe('teacher') - - it 'shows a signup form', -> - expect(view.$('#form-submit-success').hasClass('hide')).toBe(false) + it 'shows request received', -> expect(view.$('#request-form').hasClass('hide')).toBe(true) - - describe 'signup form', -> + expect(view.$('#form-submit-success').hasClass('hide')).toBe(false) + + describe 'does NOT have an existing trial request', -> + beforeEach (done) -> + request = jasmine.Ajax.requests.mostRecent() + request.respondWith({ + status: 200 + responseText: '[]' + }) + _.defer done # Let SuperModel finish + + describe 'when the form is unchanged', -> + it 'does not prevent navigating away', -> + expect(_.result(view, 'onLeaveMessage')).toBeFalsy() + + describe 'when the form has changed but is not submitted', -> beforeEach -> - application.facebookHandler.fakeAPI() - application.gplusHandler.fakeAPI() - - it 'fills the username field with the given first and last names', -> - expect(view.$('input[name="name"]').val()).toBe('A B') - - it 'includes a facebook button which will sign them in immediately', -> - view.$('#facebook-signup-btn').click() - request = jasmine.Ajax.requests.mostRecent() - expect(request.method).toBe('PUT') - expect(request.url).toBe('/db/user?facebookID=abcd&facebookAccessToken=1234') - - it 'includes a gplus button which will sign them in immediately', -> - view.$('#gplus-signup-btn').click() - request = jasmine.Ajax.requests.mostRecent() - expect(request.method).toBe('PUT') - expect(request.url).toBe('/db/user?gplusID=abcd&gplusAccessToken=1234') - - it 'can sign them up with username and password', -> - form = view.$('#signup-form') - forms.objectToForm(form, { - password1: 'asdf' - password2: 'asdf' - name: 'some name' + view.$el.find('#request-form').trigger('change') + + it 'prevents navigating away', -> + expect(_.result(view, 'onLeaveMessage')).toBeTruthy() + + describe 'on successful form submit', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + forms.objectToForm(view.$el, successForm) + view.$('#request-form').submit() + @submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) + @submitRequest.respondWith({ + status: 201 + responseText: JSON.stringify(_.extend({_id: 'a'}, successForm)) }) - form.submit() - request = jasmine.Ajax.requests.mostRecent() + + it 'does not prevent navigating away', -> + expect(_.result(view, 'onLeaveMessage')).toBeFalsy() + + it 'creates a new trial request', -> + expect(@submitRequest).toBeTruthy() + expect(@submitRequest.method).toBe('POST') + attrs = JSON.parse(@submitRequest.params) + expect(attrs.properties?.siteOrigin).toBe('demo request') + + it 'sets the user\'s role to the one they chose', -> + request = _.last(jasmine.Ajax.requests.filter((r) -> _.string.startsWith(r.url, '/db/user'))) + expect(request).toBeTruthy() expect(request.method).toBe('PUT') - expect(request.url).toBe('/db/user/1234') - - describe 'when an anonymous user tries to submit a request with an existing user\'s email', -> - + expect(JSON.parse(request.params).role).toBe('teacher') + + it 'shows a signup form', -> + expect(view.$('#form-submit-success').hasClass('hide')).toBe(false) + expect(view.$('#request-form').hasClass('hide')).toBe(true) + + describe 'signup form', -> + beforeEach -> + application.facebookHandler.fakeAPI() + application.gplusHandler.fakeAPI() + + it 'fills the username field with the given first and last names', -> + expect(view.$('input[name="name"]').val()).toBe('A B') + + it 'includes a facebook button which will sign them in immediately', -> + view.$('#facebook-signup-btn').click() + request = jasmine.Ajax.requests.mostRecent() + expect(request.method).toBe('PUT') + expect(request.url).toBe('/db/user?facebookID=abcd&facebookAccessToken=1234') + + it 'includes a gplus button which will sign them in immediately', -> + view.$('#gplus-signup-btn').click() + request = jasmine.Ajax.requests.mostRecent() + expect(request.method).toBe('PUT') + expect(request.url).toBe('/db/user?gplusID=abcd&gplusAccessToken=1234') + + it 'can sign them up with username and password', -> + form = view.$('#signup-form') + forms.objectToForm(form, { + password1: 'asdf' + password2: 'asdf' + name: 'some name' + }) + form.submit() + request = jasmine.Ajax.requests.mostRecent() + expect(request.method).toBe('PUT') + expect(request.url).toBe('/db/user/1234') + + describe 'tries to submit a request with an existing user\'s email', -> beforeEach -> - forms.objectToForm(view.$el, successFormValues) + forms.objectToForm(view.$el, successForm) view.$('#request-form').submit() @submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) @submitRequest.respondWith({ status: 409 responseText: '{}' }) - + it 'shows an error that the email already exists', -> expect(view.$('#email-form-group').hasClass('has-error')).toBe(true) expect(view.$('#email-form-group .error-help-block').length).toBe(1) - - describe 'when user is signed in and has role "student"', -> + + describe 'submits the form without school', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('#request-form') + formData = _.omit(successForm, ['organization']) + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include school setting', -> + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.organization).toBeUndefined() + expect(attrs.properties?.district).toEqual('District') + + describe 'submits the form without district', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('#request-form') + formData = _.omit(successForm, ['district']) + forms.objectToForm(form, formData) + form.submit() + + it 'displays a validation error on district and not school', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(true) + + describe 'submits form with district set to n/a', -> + beforeEach -> + view.$el.find('#request-form').trigger('change') # to confirm navigating away isn't prevented + form = view.$('#request-form') + formData = _.omit(successForm, ['organization']) + formData.district = 'N/A' + forms.objectToForm(form, formData) + form.submit() + + it 'submits a trial request, which does not include district setting', -> + expect(view.$('#organization-control').parent().hasClass('has-error')).toEqual(false) + expect(view.$('#district-control').parent().hasClass('has-error')).toEqual(false) + request = jasmine.Ajax.requests.mostRecent() + expect(request.url).toBe('/db/trial.request') + expect(request.method).toBe('POST') + attrs = JSON.parse(request.params) + expect(attrs.properties?.district).toBeUndefined() + + describe 'when a signed in user', -> beforeEach (done) -> - me.set('role', 'student') - me.set('name', 'Some User') + me.clear() + me.set('_id', '1234') + me._revertAttributes = {} spyOn(me, 'isAnonymous').and.returnValue(false) view = new RequestQuoteView() view.render() jasmine.demoEl(view.$el) - - request = jasmine.Ajax.requests.mostRecent() - request.respondWith({ status: 200, responseText: '[]'}) _.defer done # Let SuperModel finish - - it 'shows a conversion warning', -> - expect(view.$('#conversion-warning').length).toBe(1) - - it 'requires confirmation to submit the form', -> - form = view.$('#request-form') - forms.objectToForm(form, successFormValues) - spyOn(view, 'openModalView') - form.submit() - expect(view.openModalView).toHaveBeenCalled() - - submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) - expect(submitRequest).toBeFalsy() - confirmModal = view.openModalView.calls.argsFor(0)[0] - confirmModal.trigger 'confirm' - submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) - expect(submitRequest).toBeTruthy() - - \ No newline at end of file + + describe 'has an existing trial request', -> + beforeEach (done) -> + request = jasmine.Ajax.requests.mostRecent() + request.respondWith({ + status: 200 + responseText: JSON.stringify([{ + _id: '1' + properties: { + firstName: 'First' + lastName: 'Last' + } + }]) + }) + _.defer done # Let SuperModel finish + + it 'shows form with data from the most recent request', -> + expect(view.$('input[name="firstName"]').val()).toBe('First') + + describe 'has role "student"', -> + beforeEach (done) -> + me.clear() + me.set('role', 'student') + me.set('name', 'Some User') + request = jasmine.Ajax.requests.mostRecent() + request.respondWith({ status: 200, responseText: '[]'}) + _.defer done # Let SuperModel finish + + it 'shows a conversion warning', -> + expect(view.$('#conversion-warning').length).toBe(1) + + it 'requires confirmation to submit the form', -> + form = view.$('#request-form') + forms.objectToForm(form, successForm) + spyOn(view, 'openModalView') + form.submit() + expect(view.openModalView).toHaveBeenCalled() + + submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) + expect(submitRequest).toBeFalsy() + confirmModal = view.openModalView.calls.argsFor(0)[0] + confirmModal.trigger 'confirm' + submitRequest = _.last(jasmine.Ajax.requests.filter(isSubmitRequest)) + expect(submitRequest).toBeTruthy()