Merge pull request #633 from codecombat/master

Master into production
This commit is contained in:
Michael Schmatz 2014-03-20 16:50:32 -07:00
commit fe42419935
13 changed files with 517 additions and 475 deletions

View file

@ -530,6 +530,8 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
simulation_explanation: "By simulating games you can get your game ranked faster!" simulation_explanation: "By simulating games you can get your game ranked faster!"
simulate_games: "Simulate Games!" simulate_games: "Simulate Games!"
simulate_all: "RESET AND SIMULATE GAMES" simulate_all: "RESET AND SIMULATE GAMES"
games_simulated_by: "Games simulated by you:"
games_simulated_for: "Games simulated for you:"
leaderboard: "Leaderboard" leaderboard: "Leaderboard"
battle_as: "Battle as " battle_as: "Battle as "
summary_your: "Your " summary_your: "Your "

View file

@ -2,15 +2,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
common: common:
loading: "Laddar..." loading: "Laddar..."
saving: "Sparar..." saving: "Sparar..."
# sending: "Sending..." sending: "Skickar..."
cancel: "Avbryt" cancel: "Avbryt"
# save: "Save" save: "Spara"
delay_1_sec: "1 sekund" delay_1_sec: "1 sekund"
delay_3_sec: "3 sekunder" delay_3_sec: "3 sekunder"
delay_5_sec: "5 sekunder" delay_5_sec: "5 sekunder"
manual: "Manuellt" manual: "Manuellt"
# fork: "Fork" fork: "Förgrena"
# play: "Play" play: "Spela"
modal: modal:
close: "Stäng" close: "Stäng"
@ -31,15 +31,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
about: "Om oss" about: "Om oss"
contact: "Kontakt" contact: "Kontakt"
twitter_follow: "Följ oss på Twitter" twitter_follow: "Följ oss på Twitter"
# employers: "Employers" employers: "Arbetsgivare"
# versions: versions:
# save_version_title: "Save New Version" save_version_title: "Spara ny version"
# new_major_version: "New Major Version" new_major_version: "Ny betydande version"
# cla_prefix: "To save changes, first you must agree to our" cla_prefix: "För att spara ändringar måste du först godkänna vår"
# cla_url: "CLA" # cla_url: "CLA"
# cla_suffix: "." # cla_suffix: "."
# cla_agree: "I AGREE" cla_agree: "JAG GODKÄNNER"
login: login:
sign_up: "Skapa Konto" sign_up: "Skapa Konto"
@ -47,12 +47,12 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
log_out: "Logga Ut" log_out: "Logga Ut"
recover: "glömt lösenord" recover: "glömt lösenord"
# recover: recover:
# recover_account_title: "Recover Account" recover_account_title: "Återskapa ditt konto"
# send_password: "Send Recovery Password" send_password: "Skicka återskapningslösenord"
signup: signup:
# create_account_title: "Create Account to Save Progress" create_account_title: "Skapa ett konto för att spara dina framsteg"
description: "Det är gratis. Vi behöver bara lite information och sen är du redo att börja:" description: "Det är gratis. Vi behöver bara lite information och sen är du redo att börja:"
email_announcements: "Mottag nyheter via e-post" email_announcements: "Mottag nyheter via e-post"
coppa: "13+ eller ej i USA" coppa: "13+ eller ej i USA"
@ -66,12 +66,12 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
no_ie: "CodeCombat fungerar tyvärr inte i IE8 eller äldre." no_ie: "CodeCombat fungerar tyvärr inte i IE8 eller äldre."
no_mobile: "CodeCombat är inte designat för mobila enhter och kanske inte fungerar!" no_mobile: "CodeCombat är inte designat för mobila enhter och kanske inte fungerar!"
play: "Spela" play: "Spela"
# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!" old_browser: "Oj då, din webbläsare är för gammal för att köra CodeCombat. Förlåt!"
# old_browser_suffix: "You can try anyway, but it probably won't work." old_browser_suffix: "Du kan försöka ändå, men det kommer nog inte fungera."
# campaign: "Campaign" campaign: "Kampanj"
# for_beginners: "For Beginners" for_beginners: "För nybörjare"
# multiplayer: "Multiplayer" multiplayer: "Flera spelare"
# for_developers: "For Developers" for_developers: "För utvecklare"
play: play:
choose_your_level: "Välj din nivå" choose_your_level: "Välj din nivå"
@ -79,16 +79,16 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
adventurer_forum: "Äventyrarforumet" adventurer_forum: "Äventyrarforumet"
adventurer_suffix: "." adventurer_suffix: "."
campaign_beginner: "Nybörjarkampanj" campaign_beginner: "Nybörjarkampanj"
# campaign_beginner_description: "... in which you learn the wizardry of programming." campaign_beginner_description: "... i vilken du lär dig programmerandets magi."
campaign_dev: "Slumpmässig Svårare Nivå" campaign_dev: "Slumpmässig Svårare Nivå"
campaign_dev_description: "... där du lär dig att hantera gränssnittet medan du gör något lite svårare." campaign_dev_description: "... där du lär dig att hantera gränssnittet medan du gör något lite svårare."
campaign_multiplayer: "Flerspelararenor" campaign_multiplayer: "Flerspelararenor"
# campaign_multiplayer_description: "... in which you code head-to-head against other players." campaign_multiplayer_description: "... i vilken du tävlar i kodande mot andra spelare"
campaign_player_created: "Spelarskapade" campaign_player_created: "Spelarskapade"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra <a href=\"/contribute#artisan\">Hantverkartrollkarlar</a>."
level_difficulty: "Svårighetsgrad: " level_difficulty: "Svårighetsgrad: "
# play_as: "Play As " play_as: "Spela som "
# spectate: "Spectate" spectate: "Titta på"
contact: contact:
contact_us: "Kontakta CodeCombat" contact_us: "Kontakta CodeCombat"
@ -96,7 +96,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
contribute_prefix: "Om du är intresserad av att bidra, koll in vår " contribute_prefix: "Om du är intresserad av att bidra, koll in vår "
contribute_page: "bidragarsida" contribute_page: "bidragarsida"
contribute_suffix: "!" contribute_suffix: "!"
# forum_prefix: "For anything public, please try " forum_prefix: "För någonting offentlig, var vänlig testa "
forum_page: "vårt forum" forum_page: "vårt forum"
forum_suffix: " istället." forum_suffix: " istället."
send: "Skicka Feedback" send: "Skicka Feedback"
@ -109,17 +109,17 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
learn_more: "Läs mer om att vara en Diplomat" learn_more: "Läs mer om att vara en Diplomat"
subscribe_as_diplomat: "Registrera dig som Diplomat" subscribe_as_diplomat: "Registrera dig som Diplomat"
# wizard_settings: wizard_settings:
# title: "Wizard Settings" title: "Trollkarlsinställningar"
# customize_avatar: "Customize Your Avatar" customize_avatar: "Skräddarsy din avatar"
# clothes: "Clothes" clothes: "Kläder"
# trim: "Trim" trim: "Dekorationer"
# cloud: "Cloud" cloud: "Moln"
# spell: "Spell" spell: "Trollformel"
# boots: "Boots" boots: "Stövlar"
# hue: "Hue" hue: "Nyans"
# saturation: "Saturation" saturation: "Mättnad"
# lightness: "Lightness" lightness: "Ljusstyrka"
account_settings: account_settings:
title: "Kontoinställningar" title: "Kontoinställningar"
@ -130,7 +130,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
wizard_tab: "Trollkarl" wizard_tab: "Trollkarl"
password_tab: "Lösenord" password_tab: "Lösenord"
emails_tab: "E-postadresser" emails_tab: "E-postadresser"
# admin: "Admin" admin: "Administratör"
gravatar_select: "Välj ett Gravatar foto att använda" gravatar_select: "Välj ett Gravatar foto att använda"
gravatar_add_photos: "Lägg till miniatyrbilder och fotografier i ett Gravatar konto kopplat till din mail för att välja profilbild." gravatar_add_photos: "Lägg till miniatyrbilder och fotografier i ett Gravatar konto kopplat till din mail för att välja profilbild."
gravatar_add_more_photos: "Lägg till mer fotografier till i ditt Gravatar konto för att använda dem här." gravatar_add_more_photos: "Lägg till mer fotografier till i ditt Gravatar konto för att använda dem här."
@ -139,10 +139,10 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
new_password_verify: "Verifiera" new_password_verify: "Verifiera"
email_subscriptions: "E-post Prenumerationer" email_subscriptions: "E-post Prenumerationer"
email_announcements: "Meddelanden" email_announcements: "Meddelanden"
# email_notifications: "Notifications" email_notifications: "Påminnelser"
# email_notifications_description: "Get periodic notifications for your account." email_notifications_description: "Få periodiska påminnelser för ditt konto."
email_announcements_description: "Få e-post med de senaste nyheterna och utvecklingen på CodeCombat." email_announcements_description: "Få e-post med de senaste nyheterna och utvecklingen på CodeCombat."
# contributor_emails: "Contributor Class Emails" contributor_emails: "Bidragarmail"
contribute_prefix: "Vi söker mer folk som vill var med och hjälpa till! Kolla in " contribute_prefix: "Vi söker mer folk som vill var med och hjälpa till! Kolla in "
contribute_page: "bidragarsida" contribute_page: "bidragarsida"
contribute_suffix: " tför att få veta mer." contribute_suffix: " tför att få veta mer."
@ -187,9 +187,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
victory_sign_up: "Registrera dig för att få uppdateringar" victory_sign_up: "Registrera dig för att få uppdateringar"
victory_sign_up_poke: "Vill du ha de senaste nyheterna vi e-post? Skapa ett gratiskonto så håller vi dig informerad!" victory_sign_up_poke: "Vill du ha de senaste nyheterna vi e-post? Skapa ett gratiskonto så håller vi dig informerad!"
victory_rate_the_level: "Betygsätt nivån: " victory_rate_the_level: "Betygsätt nivån: "
# victory_rank_my_game: "Rank My Game" victory_rank_my_game: "Ranka min match"
# victory_ranking_game: "Submitting..." victory_ranking_game: "Skickar..."
# victory_return_to_ladder: "Return to Ladder" victory_return_to_ladder: "Gå tillbaka till stegen"
victory_play_next_level: "Spela Nästa Nivå" victory_play_next_level: "Spela Nästa Nivå"
victory_go_home: "Gå Hem" victory_go_home: "Gå Hem"
victory_review: "Berätta mer!" victory_review: "Berätta mer!"
@ -204,352 +204,352 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
tome_minion_spells: "Dina Soldaters Förmågor" tome_minion_spells: "Dina Soldaters Förmågor"
tome_read_only_spells: "Skrivskyddade Förmågor" tome_read_only_spells: "Skrivskyddade Förmågor"
tome_other_units: "Andra Enheter" tome_other_units: "Andra Enheter"
# tome_cast_button_castable: "Cast Spell" tome_cast_button_castable: "Använd besvärjelse"
# tome_cast_button_casting: "Casting" tome_cast_button_casting: "Besvärjer"
# tome_cast_button_cast: "Spell Cast" tome_cast_button_cast: "Besvärjelse använd"
# tome_autocast_delay: "Autocast Delay" tome_autocast_delay: "Autoanvändningsfördröjning"
tome_select_spell: "Välj en Förmåga" tome_select_spell: "Välj en Förmåga"
tome_select_a_thang: "Välj Någon för " tome_select_a_thang: "Välj Någon för "
tome_available_spells: "Tillgängliga Förmågor" tome_available_spells: "Tillgängliga Förmågor"
# hud_continue: "Continue (shift+space)" hud_continue: "Fortsätt (skift+mellanslag)"
# spell_saved: "Spell Saved" spell_saved: "Besvärjelse sparad"
# skip_tutorial: "Skip (esc)" skip_tutorial: "Hoppa över (esc)"
# editor_config: "Editor Config" editor_config: "Ställ in redigerare"
# editor_config_title: "Editor Configuration" editor_config_title: "Redigerarinställningar"
# editor_config_keybindings_label: "Key Bindings" editor_config_keybindings_label: "Kortkommandon"
# editor_config_keybindings_default: "Default (Ace)" editor_config_keybindings_default: "Standard (Ace)"
# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." editor_config_keybindings_description: "Lägger till ytterligare kortkommandon kända från vanliga redigerare."
# editor_config_invisibles_label: "Show Invisibles" editor_config_invisibles_label: "Visa osynliga"
# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." editor_config_invisibles_description: "Visar osynliga tecken såsom mellanrum och nyradstecken."
# editor_config_indentguides_label: "Show Indent Guides" editor_config_indentguides_label: "Visa indenteringsguider"
# editor_config_indentguides_description: "Displays vertical lines to see indentation better." editor_config_indentguides_description: "Visar vertikala linjer för att kunna se indentering bättre."
# editor_config_behaviors_label: "Smart Behaviors" editor_config_behaviors_label: "Smart beteende"
# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." editor_config_behaviors_description: "Avsluta automatiskt hakparenteser, parenteser, och citat."
# admin: admin:
# av_title: "Admin Views" av_title: "Administratörsvyer"
# av_entities_sub_title: "Entities" av_entities_sub_title: "Enheter"
# av_entities_users_url: "Users" av_entities_users_url: "Användare"
# av_entities_active_instances_url: "Active Instances" av_entities_active_instances_url: "Aktiva instanser"
# av_other_sub_title: "Other" av_other_sub_title: "Övrigt"
# av_other_debug_base_url: "Base (for debugging base.jade)" av_other_debug_base_url: "Base (för avlusning av base.jade)"
# u_title: "User List" u_title: "Användarlista"
# lg_title: "Latest Games" lg_title: "Senaste matcher"
# editor: editor:
# main_title: "CodeCombat Editors" main_title: "CodeCombatredigerar"
# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!" main_description: "Bygg dina egna banor, kampanjer, enheter och undervisningsinnehåll. Vi tillhandahåller alla verktyg du behöver!"
# article_title: "Article Editor" article_title: "Artikelredigerare"
# article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns." article_description: "Skriv artiklar som ger spelare en överblick över programmeringskoncept som kan användas i många olika nivåer och kampanjer."
# thang_title: "Thang Editor" thang_title: "Enhetsredigerare"
# thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics." thang_description: "Bygg enheter, genom att definerade deras förinställda logik, grafik och ljud. Stöder för närvarande endast import av Flashexporterad vektorgrafik."
# level_title: "Level Editor" level_title: "Nivåredigerare"
# level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!" level_description: "Innehåller verktygen för att skripta, ladda upp ljud och konstruera skräddarsydd logik för att skapa alla möjliga sorters nivåer. Allting vi själva använder!"
# security_notice: "Many major features in these editors are not currently enabled by default. As we improve the security of these systems, they will be made generally available. If you'd like to use these features sooner, " security_notice: "Många huvudfunktioner i dessa redigerare är för närvarande inte aktiverade från början. Allt eftersom vi ökar säkerheten i dessa system, okmmer de att bli allmänt tillgängliga. Om du skulle vilja använda dessa funktioner tidigare, "
# contact_us: "contact us!" contact_us: "kontakta oss!"
# hipchat_prefix: "You can also find us in our" hipchat_prefix: "Du kan också hitta oss i vårt"
# hipchat_url: "HipChat room." hipchat_url: "HipChat-rum."
# revert: "Revert" revert: "Återställ"
# revert_models: "Revert Models" revert_models: "Återställ modeller"
# level_some_options: "Some Options?" level_some_options: "Några inställningar?"
# level_tab_thangs: "Thangs" level_tab_thangs: "Enheter"
# level_tab_scripts: "Scripts" level_tab_scripts: "Skript"
# level_tab_settings: "Settings" level_tab_settings: "Inställningar"
# level_tab_components: "Components" level_tab_components: "Komponenter"
# level_tab_systems: "Systems" level_tab_systems: "System"
# level_tab_thangs_title: "Current Thangs" level_tab_thangs_title: "Nuvarande enheter"
# level_tab_thangs_conditions: "Starting Conditions" level_tab_thangs_conditions: "Startvillkor"
# level_tab_thangs_add: "Add Thangs" level_tab_thangs_add: "Lägg till enheter"
# level_settings_title: "Settings" level_settings_title: "Inställningar"
# level_component_tab_title: "Current Components" level_component_tab_title: "Nuvarande komponenter"
# level_component_btn_new: "Create New Component" level_component_btn_new: "Skapa ny komponent"
# level_systems_tab_title: "Current Systems" level_systems_tab_title: "Nuvarande system"
# level_systems_btn_new: "Create New System" level_systems_btn_new: "Skapa nytt system"
# level_systems_btn_add: "Add System" level_systems_btn_add: "Lägg till system"
# level_components_title: "Back to All Thangs" level_components_title: "Tillbaka till alla enheter"
# level_components_type: "Type" level_components_type: "Typ"
# level_component_edit_title: "Edit Component" level_component_edit_title: "Redigera komponent"
# level_component_config_schema: "Config Schema" level_component_config_schema: "Konfigurera schema"
# level_component_settings: "Settings" level_component_settings: "Inställningar"
# level_system_edit_title: "Edit System" level_system_edit_title: "Redigera system"
# create_system_title: "Create New System" create_system_title: "Skapa nytt system"
# new_component_title: "Create New Component" new_component_title: "Skapa ny komponent"
# new_component_field_system: "System" new_component_field_system: "System"
# new_article_title: "Create a New Article" new_article_title: "Skapa ny artikel"
# new_thang_title: "Create a New Thang Type" new_thang_title: "Skapa ny enhetstyp"
# new_level_title: "Create a New Level" new_level_title: "Skapa ny nivå"
# article_search_title: "Search Articles Here" article_search_title: "Sök artiklar här"
# thang_search_title: "Search Thang Types Here" thang_search_title: "Sök enhetstyper här"
# level_search_title: "Search Levels Here" level_search_title: "Sök nivåer här"
# article: article:
# edit_btn_preview: "Preview" edit_btn_preview: "Förhandsgranska"
# edit_article_title: "Edit Article" edit_article_title: "Redigera artikel"
# general: general:
# and: "and" and: "och"
# name: "Name" name: "Namn"
# body: "Body" body: "Kropp"
# version: "Version" version: "Version"
# commit_msg: "Commit Message" commit_msg: "Förbindelsemeddelande"
# history: "History" history: "Historik"
# version_history_for: "Version History for: " version_history_for: "Versionshistorik för: "
# result: "Result" result: "Resultat"
# results: "Results" results: "Resultat"
# description: "Description" description: "Beskrivning"
# or: "or" or: "eller"
# email: "Email" email: "Email"
# password: "Password" password: "Lösenord"
# message: "Message" message: "Meddelande"
# code: "Code" code: "Kod"
# ladder: "Ladder" ladder: "Stege"
# when: "When" when: "När"
# opponent: "Opponent" opponent: "Fiende"
# rank: "Rank" rank: "Rank"
# score: "Score" score: "Poäng"
# win: "Win" win: "Vinst"
# loss: "Loss" loss: "Förlust"
# tie: "Tie" tie: "Oavgjord"
# easy: "Easy" easy: "Lätt"
# medium: "Medium" medium: "Medium"
# hard: "Hard" hard: "Svår"
# about: about:
# who_is_codecombat: "Who is CodeCombat?" who_is_codecombat: "Vilka är CodeCombat?"
# why_codecombat: "Why CodeCombat?" why_codecombat: "Varför CodeCombat?"
# who_description_prefix: "together started CodeCombat in 2013. We also created " who_description_prefix: "startade tillsammans CodeCombat 2013. Vi skapade också "
# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." who_description_suffix: "i 2008, och fick det att växa till #1 webb- och iOS-applikation för att lära sig skriva kinesiska och japanska tecken."
# who_description_ending: "Now it's time to teach people to write code." who_description_ending: "Nu är det dags att lära folk skriva kod."
# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." why_paragraph_1: "När han gjorde Skritter, visste inte George hur man programmerar och var ständigt frustrerad av sin oförmåga att implementera sina idéer. Efteråt försökte han lära sig, men lektionerna var för långsama. Hans husgranne, som ville lära sig något nytt och sluta undervisa, försökte med Codecademy men \"tröttnade\". Varje vecka började en annan vän med Codecademy, för att sedan sluta. Vi insåg att det var samma problem vi hade löst med Skritter: folk lär sig en färdighet via långsamma, intensiva lektioner när det de behöver är snabb, omfattande övning. Vi vet hur man fixar det"
# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." why_paragraph_2: "Behöver du lära dig att koda? Du behöver inte lektioner. Du behöver skriva mycket kod och ha roligt medan du gör det."
# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" why_paragraph_3_prefix: "Det är vad programmering handlar om. Det måste vara roligt. Inte roligt som i"
# why_paragraph_3_italic: "yay a badge" why_paragraph_3_italic: "hurra, en medalj"
# why_paragraph_3_center: "but fun like" why_paragraph_3_center: "utan roligt som i"
# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" why_paragraph_3_italic_caps: "NEJ MAMMA JAG MÅSTE BLI KLAR MED DEN HÄR NIVÅN"
# why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." why_paragraph_3_suffix: "Därför är CodeCombat ett flerspelarspel, inte en spelifierad kurs. Vi slutar inte förrän du inte kan sluta - men den här gången är det en bra sak."
# why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." why_paragraph_4: "Om du tänker bli beroende av något spel, bli beroende av det här och bli en av teknikålderns trollkarlar."
# why_ending: "And hey, it's free. " why_ending: "Och du, det är gratis. "
# why_ending_url: "Start wizarding now!" why_ending_url: "Bli en trollkarl nu!"
# george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere." george_description: "VD, affärskille, webbdesignare, speldesignare, och förkämpe för förstagångsprogrammerare överallt."
# scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one." scott_description: "Extraordinär programmerare, mjukvaruarkitekt, kökstrollkarl och finansmästare. Scott är den den förståndiga."
# nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." nick_description: "Programmeringstrollkarl, excentrisk motivationsmagiker och upp-och-ner-experimenterare. Nick kan göra vad som helst och väljer att bygga CodeCombat."
# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." jeremy_description: "Kundsupportsmagiker, användbarhetstestare och gemenskapsorganisatör; du har förmodligen redan pratat med Jeremy."
# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." michael_description: "Programmerare, sys-admin, och studerande tekniskt underbarn, Michael är personen som håller våra servrar online."
# glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that mather. The word impossible can't be found in his dictionary. Learning new skills is his joy!" glen_description: "Programmerare och passionerad spelutvecklare, med motivationen att göra denna värld till ett bättre ställe genom att utveckla saker som spelar roll. Ordet omöjligt finns inte i hans ordbok. Att lära sig nya färdigheter är hans lycka."
# legal: legal:
# page_title: "Legal" page_title: "Juridik"
# opensource_intro: "CodeCombat is free to play and completely open source." opensource_intro: "CodeCombat är gratis att spela och helt öppen programvara."
# opensource_description_prefix: "Check out " opensource_description_prefix: "Spana in "
# github_url: "our GitHub" github_url: "r GitHub"
# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " opensource_description_center: " och hjälp till om du vill! CodeCombat är byggt på dussintals projekt med öppen källkod, och vi älskar dem. Se "
# archmage_wiki_url: "our Archmage wiki" archmage_wiki_url: "vår Huvudmagiker-wiki"
# opensource_description_suffix: "for a list of the software that makes this game possible." opensource_description_suffix: "för en lista över mjukvaran som gör detta spel möjligt."
# practices_title: "Respectful Best Practices" practices_title: "Respektfulla \"best practices\""
# practices_description: "These are our promises to you, the player, in slightly less legalese." practices_description: "Dessa är våra löften till dig, spelaren, på lite mindre juristspråk."
# privacy_title: "Privacy" privacy_title: "Integritet"
# privacy_description: "We will not sell any of your personal information. We intend to make money through recruitment eventually, but rest assured we will not distribute your personal information to interested companies without your explicit consent." privacy_description: "Vi kommer inte att sälja någon av din personliga information. Vi har för avsikt att tjäna pengar genom rekrytering så småningom, men var så säker på att vi inte kommer att distribuera din personliga information till intresserade företag utan ditt explicita samtycke."
# security_title: "Security" security_title: "Säkerhet"
# security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems." security_description: "Vi strävar efter att hålla din personliga information säker. Eftersom vår källkod är öppen är vår det fritt fram för vem som helst att granska och förbättra våra säkerhetssystem."
# email_title: "Email" email_title: "Email"
# email_description_prefix: "We will not inundate you with spam. Through" email_description_prefix: "Vi kommer inte att översvämma dig med spam. Genom "
# email_settings_url: "your email settings" email_settings_url: "dina email-inställningar"
# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." email_description_suffix: "eller genom länkar i mailen vi skickar kan du ändra dina inställningar och lätt avprenumerera när som helst."
# cost_title: "Cost" cost_title: "Kostnad"
# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" cost_description: "För närvarande är CodeCombat 100 % gratis! Ett av våra främsta mål är att behålla det så, så att så många som möjligt kan spela, oavsett plats i livet. Om himlen mörknar, kanske vi behöver ta betalt för prenumerationer eller något innehåll, men helst slipper vi det. Med lite tur lyckas vi hålla liv i företag med:"
# recruitment_title: "Recruitment" recruitment_title: "Rekrytering"
# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizardnot just in the game, but also in real life." recruitment_description_prefix: "Här på CodeCombat kommer du att bli en mäktig trollkarl - inte bara i spelet, utan också i verkliga livet."
# url_hire_programmers: "No one can hire programmers fast enough" url_hire_programmers: "Ingen kan anställa programmerare tillräckligt snabbt"
# recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you" recruitment_description_suffix: "så när du har vässat dina kunskaper, och om du godkänner, kommer vi att demonstrera dina största kodbedrifter för de tusentals arbetsgivare som dreglar över chansen att anställa dig. De betalar oss lite, de betalar dig"
# recruitment_description_italic: "a lot" recruitment_description_italic: "mycket"
# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan." recruitment_description_ending: "sajten fortsätter vara gratis och alla är nöjda. Det är planen."
# copyrights_title: "Copyrights and Licenses" copyrights_title: "Upphovsrätt och licenser"
# contributor_title: "Contributor License Agreement" contributor_title: "Överenskommelse för bidragarlicens"
# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" contributor_description_prefix: "Alla bidrag, både på sajten och på vårt GitHub-repo, faller under vår"
# cla_url: "CLA" cla_url: "CLA"
# contributor_description_suffix: "to which you should agree before contributing." contributor_description_suffix: ", som du borde godkänna innan du börjar bidra."
# code_title: "Code - MIT" code_title: "Kod - MIT"
# code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the" code_description_prefix: "All kod som ägs av CodeCombat eller som finns på codecombat.com, både i GitHub-repot och i codecombat.com-databasen, är licensierad under"
# mit_license_url: "MIT license" 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." code_description_suffix: "Detta inkluderar all kod i system och komponenter som gjorts tillgänglig för CodeCombat i syftet att skapa nivåer."
# art_title: "Art/Music - Creative Commons " art_title: "Konst/Musik - Creative Commons "
# art_description_prefix: "All common content is available under the" art_description_prefix: "Allt gemensamt innehåll är tillgängligt under"
# cc_license_url: "Creative Commons Attribution 4.0 International License" cc_license_url: "Creative Commons Erkännande 4.0 Internationell-licensen"
# art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:" art_description_suffix: "Gemensamt innehåll är vad som helst som gjorts allmänt tillgängligt för CodeCombat i syfte att skapa nivåer. Detta inkluderar:"
# art_music: "Music" art_music: "Musik"
# art_sound: "Sound" art_sound: "Ljud"
# art_artwork: "Artwork" art_artwork: "Illustrationer"
# art_sprites: "Sprites" art_sprites: "Sprites"
# art_other: "Any and all other non-code creative works that are made available when creating Levels." art_other: "Allt (icke-kod) kreativt arbete som görs tillgängliga när nivåer skapas."
# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." art_access: "För tillfället finns det inget universellt, enkelt system för att hämta dessa tillgångar. Allmänt gäller: hämta dem från URL:erna som sajten använder, kontakta oss för hjälp, eller hjälp oss att utöka sajten för att göra dessa tillgångar mer lättillgängliga."
# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" art_paragraph_1: "För tillskrivning, var vänlig namnge och länka till codecombat.com i närheten av var källan används eller där det är passande för mediet. Till exempel:"
# use_list_1: "If used in a movie or another game, include codecombat.com in the credits." use_list_1: "Om det används i en film eller ett annat spel, inkludera codecombat.com i eftertexterna."
# use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution." use_list_2: "Om det används på en webbplats, inkludera en länk nära användandet, till exempel under en bild eller i en allmän tilldelningssida där du också kan nämna andra Create Commons-resurser och öppen programvara som används på webbplatsen. Någonting som redan tydligt refererar till CodeCombat, exempelvis en bloggpost som nämner CodeCombat, behöver ingen separat tillskrivning."
# art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any." art_paragraph_2: "Om innehållet som används inte är skapat av CodeCombat utan istället av en användare av codecombat.com, tillskriv dem istället, och följ tillskrivningsinstruktioner som ges i den resursens beskrivning om det finns några."
# rights_title: "Rights Reserved" rights_title: "Rättigheter förbehålls"
# rights_desc: "All rights are reserved for Levels themselves. This includes" rights_desc: "Alla rättigheter förbehålls för själva nivåerna. Detta inkluderar:"
# rights_scripts: "Scripts" rights_scripts: "Script"
# rights_unit: "Unit configuration" rights_unit: "Enhetskonfiguration"
# rights_description: "Description" rights_description: "Beskrivning"
# rights_writings: "Writings" rights_writings: "Skifter"
# rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels." rights_media: "Media (ljud, musik) och annat kreativt innehåll som skapats specifikt för denna nivå och inte gjorts allmänt tillgängligt när nivåer skapats."
# rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not." rights_clarification: "För att klargöra, allt som gjorts tillgängligt i nivåredigeraren i syfte att skapa nivåer är under CC, medan innehållet skapat med nivåredigeraren eller uppladdat under skapandet inte är detta."
# nutshell_title: "In a Nutshell" nutshell_title: "I ett nötskal"
# 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." nutshell_description: "Alla resurser vi tillhandahåller i nivåredigeraren är gratis att använda som du vill för att skapa nivåer. Men vi reserverar oss rättigheten att begränsa distribution av nivåerna själva (som skapas på codecombat.com) så att de kan tas betalt för i framtiden, om det är så det blir."
# canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence." canonical: "Den engelska versionen av detta dokument är den definitiva, erkända versionen. Om det finns några skillnader mellan översättningar är det det engelska dokumentet som tar företräde."
# contribute: contribute:
# page_title: "Contributing" page_title: "Bidragande"
# character_classes_title: "Character Classes" character_classes_title: "Karaktärklasser"
# introduction_desc_intro: "We have high hopes for CodeCombat." introduction_desc_intro: "Vi har store förhoppningar för CodeCombat."
# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, " introduction_desc_pref: "Vi vill vara stället dit alla sorters programmerare kommer för att lära och spela tillsammans, introducera andra till kodandets underbara värld, och visa upp de bästa delarna av gemenskapen. Vi kan inte och vi vill inte gör det ensamma; vad som gör projekt som GitHub, Stack Overflow och Linux fantastiska är människorna som använder och bygger dem. Av den anledningen "
# introduction_desc_github_url: "CodeCombat is totally open source" introduction_desc_github_url: "CodeCombat is totally open source"
# introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours." introduction_desc_suf: ", och vi siktar på att tillhandahålla så många sätt som möjligt för dig att delta och göra det här projektet till lika mycket ditt som vårt."
# introduction_desc_ending: "We hope you'll join our party!" introduction_desc_ending: "Vi hoppas att du vill vara med!"
# introduction_desc_signature: "- Nick, George, Scott, Michael, and Jeremy" introduction_desc_signature: "- Nick, George, Scott, Michael, och Jeremy"
# alert_account_message_intro: "Hey there!" alert_account_message_intro: "Hej där!"
# alert_account_message_pref: "To subscribe for class emails, you'll need to " alert_account_message_pref: "För att prenumerera på klassmail måste du"
# alert_account_message_suf: "first." alert_account_message_suf: "först."
# alert_account_message_create_url: "create an account" alert_account_message_create_url: "skapa ett konto"
# archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever." archmage_summary: "Intresserad av att jobba med spelgrafik, användargränssnittsdesign, databas- och serveroptimering, flerspelarnätverkadnde, fysik, ljud eller spelmotorprestation? Vill du hjälpa till att bygga ett spel för att hjälpa andra människor lära sig det du är bra på? Vi har mycket att göra och om du är en erfaren programmerare och vill utveckla för CodeCombat är denna klassen för dig. Vi skulle älska din hjälp med att bygga det bästa programmeringsspelet någonsin."
# 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." archmage_introduction: "En av de bästa delarna med att bygga spel är att de syntetiserar så många olika saker. Grafik, ljud, realtidsnätverkande, socialt netvärkande och så klart många av de vanligare aspekterna av programmering, från databashantering och serveradministration på låg nivå till användargränssnitt och gränsnittsbyggande. Det finns mycket att göra, och om du är en erfaren programmerare som längtar efter att dyka ner i CodeCombats detaljer kan den här klassen vara för dig. Vi skulle älska din hjälp med att bygga det bästa programmeringsspelet någonsin."
# class_attributes: "Class Attributes" class_attributes: "Klassattribut"
# archmage_attribute_1_pref: "Knowledge in " archmage_attribute_1_pref: "Kunskap om "
# 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_1_suf: ", eller en vilja att lära. Det mesta av vår kod är i det här språket. Är du ett fan av Ruby eller Python kommer du att känna dig hemma. Det är Javascript, men med en trevligare 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." archmage_attribute_2: "Viss erfarenhet av programmering och personligt initiativ. Vi hjälper dig att bli orienterad, men kan inte lägga mycket tid på att träna dig."
# how_to_join: "How To Join" how_to_join: "Hur man går med"
# join_desc_1: "Anyone can help out! Just check out our " join_desc_1: "Alla kan hjälpa till! Kolla bara in vår "
# 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_2: "för att komma igång, och kryssa i rutan nedanför för att markera att du är en modig huvudmagiker och få de senaste nyheterna via email. Vill du chatta om vad som ska göras eller hur du bli mer involverad?"
# join_desc_3: ", or find us in our " join_desc_3: ", eller hitta oss i vår "
# join_desc_4: "and we'll go from there!" join_desc_4: "så tar vi det därifrån!"
# join_url_email: "Email us" join_url_email: "Maila oss"
# join_url_hipchat: "public HipChat room" join_url_hipchat: "offentliga HipChat-rum"
# more_about_archmage: "Learn More About Becoming an Archmage" more_about_archmage: "Lär dig mer om att bli en huvudmagiker"
# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements." archmage_subscribe_desc: "Få mail om nya kodmöjligheter och tillkännagivanden."
# artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to" artisan_summary_pref: "Vill du designa nivåer och utvidga CodeCombats arsenal? Folk spelar igenom vårt innehåll snabbare än vi kan bygga! För tillfället är vår nivåredigerare ganska mager, så var uppmärksam. Att skapa nivåer kommer att vara lite utmanande och buggigt. Om du har visioner av kampanjer som sträcker sig från for-loopar till"
# artisan_summary_suf: "then this class is for you." artisan_summary_suf: "är den här klassen för dig."
# 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_pref: "Vi måste bygga fler nivåer! Människor kräver mer innehåll, och vi kan bara bygga en viss mängd själva. Just nu är arbetsstation nivå ett; vår nivåredigerare är knappt användbar ens av dess skapare, så var uppmärksam. Om du har visioner av kampanjer som sträcker sig från for-loopar till"
# artisan_introduction_suf: "then this class might be for you." artisan_introduction_suf: "är den här klassen kanske något för dig."
# 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_1: "Någon erfarenhet av att bygga liknande innehåll vore bra, som till exempel Blizzards nivåredigerare. Det är dock inget krav!"
# 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_2: "En vilja att göra en hel del testande och upprepning. För att göra bra nivåer, måste du ta dem till andra och se dem spela den, och vara beredd på att hitta många saker att laga."
# 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_attribute_3: "För tillfället, uthållighet i klass med en äventyrare. Vår nivåredigerare är väldigt preliminär och frustrerande att använda. Du är varnad!"
# artisan_join_desc: "Use the Level Editor in these steps, give or take:" artisan_join_desc: "Använd nivåredigeraren i dessa steg, mer eller mindre:"
# artisan_join_step1: "Read the documentation." artisan_join_step1: "Läs dokumentationen."
# artisan_join_step2: "Create a new level and explore existing levels." artisan_join_step2: "Skapa en ny nivå och utforska existerande nivåer."
# artisan_join_step3: "Find us in our public HipChat room for help." artisan_join_step3: "Hitta oss i vårt offentliga HipChat-rum för hjälp."
# artisan_join_step4: "Post your levels on the forum for feedback." artisan_join_step4: "Anslå dina nivåer på forumet för feedback."
# more_about_artisan: "Learn More About Becoming an Artisan" more_about_artisan: "Lär dig mer om att bli en hantverkare"
# artisan_subscribe_desc: "Get emails on level editor updates and announcements." artisan_subscribe_desc: "Få mail om nivåredigeraruppdateringar och tillkännagivanden"
# adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_summary: "Låt oss vara tydliga med din roll: du är tanken. Du kommer att ta stor skada. Vi behöver människor som kan testa splitternya nivåer och hjälpa till att identifiera hur man kan göra saker bättre. Smärtan kommer att vara enorm; att göra bra spel är en lång process och ingen gör rätt första gången. Om du kan härda ut och tål mycket stryk är det här klassen för dig."
# 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_introduction: "Låt oss vara tydliga med din roll: du är tanken. Du kommer att ta stor skada. Vi behöver människor som kan testa splitternya nivåer och hjälpa till att identifiera hur man kan göra saker bättre. Smärtan kommer att vara enorm; att göra bra spel är en lång process och ingen gör rätt första gången. Om du kan härda ut och tål mycket stryk är det här kanske klassen för dig."
# 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_1: "En törst efter att lära sig. Du vill lära dig att koda och vi vill lära dig att koda. Du kommer förmodligen att vara den som lär ut mest i det här fallet, dock."
# adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." adventurer_attribute_2: "Karismatisk. Var varsammen tydlig med vad som behöver förbättras, och erbjud förslag på hur förbättringar kan ske."
# 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_join_pref: "Antingen träffar (eller rekryterar!) du en hantverkare och jobbar med denna, eller så kryssar du i rutan nedanför för att få mail när det finns nya nivåer att testa. Vi kommer också att anslå nivåer som behöver granskas på nätverk som"
# adventurer_forum_url: "our forum" adventurer_forum_url: "vårt forum"
# adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" adventurer_join_suf: "så om du föredrar att bli notifierad på sådana sätt, bli medlem där!"
# more_about_adventurer: "Learn More About Becoming an Adventurer" more_about_adventurer: "Lär dig mer om att bli en äventyrare"
# adventurer_subscribe_desc: "Get emails when there are new levels to test." adventurer_subscribe_desc: "Få mail när det finns nya nivåer att testa."
# scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " scribe_summary_pref: "CodeCombat kommer inte bara att vara ett gäng nivåer. Det kommer också att vara en resurs för programmeringskunskap som spelar kan koppla in sig i. På det sättet kan varje hantverkare länka till en detaljerad artikel för spelarens uppbyggelse:dokumentation på ett sätt som liknar vad "
# scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_summary_suf: " har byggt. Om du tycker om att förklara programmeringskoncept är det här klassen för dig."
# 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_pref: "CodeCombat kommer inte att vara bara ett gäng nivåer. Det kommer också att inkludera en resurs för kunskap, en wiki av programmeringskoncept som nivåer kan ansluta till. På det sättet slipper varje hantverkare förklara i detalj vad en jämförelseoperator är, utan kan bara länka sin nivå till artikeln som förklarar det och redan är skriven, till spelarens uppbyggelse. Någonting i stil med vad "
# scribe_introduction_url_mozilla: "Mozilla Developer Network" 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_introduction_suf: " har byggt. Om du tycker att det är kul att uttrycka programmeringskoncept i Markdown-form, är det här klassen för dig."
# 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." scribe_attribute_1: "Förmåga med ord är i princip allt du behöver. Inte bara grammatik och stavning, utan förmåga att förmedla komplicerade idéer till andra."
# contact_us_url: "Contact us" contact_us_url: "Kontakta oss"
# scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!" scribe_join_description: "Berätta lite om dig själv, din erfarenhet med programmering och vilka saker du skulle vilja skriva om. Vi går vidare därifrån!"
# more_about_scribe: "Learn More About Becoming a Scribe" more_about_scribe: "Lär dig mer om att bli en skriftlärd"
# scribe_subscribe_desc: "Get emails about article writing announcements." scribe_subscribe_desc: "Få mail om tillkännagivanden om artiklar."
# diplomat_summary: "There is a large interest in CodeCombat in other countries that do not speak English! We are looking for translators who are willing to spend their time translating the site's corpus of words so that CodeCombat is accessible across the world as soon as possible. If you'd like to help getting CodeCombat international, then this class is for you." diplomat_summary: "Det finns ett stort intresse för CodeCombat i länder som inte pratar engelska! Vi letar efter översättare som är villiga att tillbringa tid med att översätta huvuddelen av webbplatsens ord så att CodeCombat är tillgänglig över hela världen så snart som möjligt. Om du vill hjälpa till med att göra CodeCombat internationellt är det här klassen för dig."
# diplomat_introduction_pref: "So, if there's one thing we learned from the " diplomat_introduction_pref: "Om vi lärde oss någonting från "
# diplomat_launch_url: "launch in October" diplomat_launch_url: "lanseringen i oktober"
# 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_introduction_suf: "är det att det finns ett stort intresse för CodeCombat i andra länder! Vi bygger en kår av översättare ivriga att förvandla en samling ord till en annan samling ord för att få CodeCombat så tillgänglig i världen som möjligt. Om du gillar att få tjuvkikar på kommande innehåll och att få dessa nivåer till de andra i ditt land så snart som möjligt är det här kanske klassen för dig."
# 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_attribute_1: "Flytande engelska och språket du vill översätta till. När man förmedlar komplicerade idéer är det viktigt att ha ett starkt grepp om båda!"
# diplomat_join_pref_github: "Find your language locale file " diplomat_join_pref_github: "Hitta ditt språks locale-fil "
# diplomat_github_url: "on GitHub" diplomat_github_url: " 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_join_suf_github: ", redigera den online, och skicka en ryckförfrågan. Kryssa också i rutan här nedanför för att hålla dig uppdaterad om nya internationaliseringsutvecklingar."
# more_about_diplomat: "Learn More About Becoming a Diplomat" more_about_diplomat: "Lär dig mer om att bli en diplomat"
# diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." diplomat_subscribe_desc: "Få mail om i18n-utvecklingar och nivåer att översätta."
# ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you." ambassador_summary: "Vi försöker bygga en gemenskap, och varje gemenskap behöver ett supportteam när det blir problem. Vi har chatt, mail och sociala nätverk så att våra användare kan bekanta sig med spelet. Om du vill hjälpa folk att bli involverade, ha kul, och lära dig en del programmering är det här klassen för dig."
# ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." ambassador_introduction: "Det är en gemenskap vi bygger, och du är anslutningarna. Vi har Olark-chatter, mail och sociala nätverk med många människor att prata med och hjälpa bekanta sig med spelet och lära sig från. Om du vill hjälpa människor att bli involverade och ha kul, och ha bra koll på CodeCombats puls och var vi är på väg, kanske det här är klassen för dig."
# ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" ambassador_attribute_1: "Kommunikationsfärdigheter. Kunna identifiera problemen spelarna har och hjälpa till att lösa dem. Också att hålla resten av oss informerade om vad spelarna säger, vad de gillar och vad de inte gillar och vad de vill ha mer av!"
# ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" ambassador_join_desc: "berätta om dig själv, vad du har gjort och vad du skulle vara intresserad av att göra. Vi tar det därifrån!"
# ambassador_join_note_strong: "Note" ambassador_join_note_strong: "Notera"
# ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" ambassador_join_note_desc: "En av våra högsta prioriteringar är att bygga ett flerspelarläge där spelare som har problem med att lösa nivåer kan kalla på trollkarlar av en högre nivå för att hjälpa dem. Det kommer att vara ett jättebra sätt för ambassadörer att göra sin grej. Vi håller dig informerad!"
# more_about_ambassador: "Learn More About Becoming an Ambassador" more_about_ambassador: "Lär dig mer om att bli en ambassadör"
# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." ambassador_subscribe_desc: "Få mail om supportuppdateringar och flerspelarutvecklingar"
# counselor_summary: "None of the above roles fit what you are interested in? Do not worry, we are on the lookout for anybody who wants a hand in the development of CodeCombat! If you are interested in teaching, game development, open source management, or anything else that you think will be relevant to us, then this class is for you." counselor_summary: "Passar ingen av rollerna ovanför det du är intresserad av? Oroa dig inte, vi håller utkik efter alla som vill vara inblandade i utvecklingen av CodeCombat! Om du är intresserad av undervisning, spelutveckling, skötsel av öppen programvara eller någonting annat som du tror skulle vara relevent för oss, är det här klassen för dig."
# counselor_introduction_1: "Do you have life experience? A different perspective on things that can help us decide how to shape CodeCombat? Of all these roles, this will probably take the least time, but individually you may make the most difference. We're on the lookout for wisened sages, particularly in areas like: teaching, game development, open source project management, technical recruiting, entrepreneurship, or design." counselor_introduction_1: "Har du livserfarenhet? Ett annat perspektiv på saker som kan hjälpa oss besluta hur vi ska forma CodeCombat? Av alla dessa roller kommer förmodligen denna ta minst tid, men individuellt kommer du att göra störst skillnad. Vi letar efter skrynkliga visa människor, särskilt inom områden som: undervisning, spelutveckling, skötsel av öppen programvara, teknisk rekrytering, entrepenörskap eller design."
# counselor_introduction_2: "Or really anything that is relevant to the development of CodeCombat. If you have knowledge and want to share it to help grow this project, then this class might be for you." counselor_introduction_2: "Eller egentligen vad som helst som är relevant för CodeCombats utveckling. Om du har kunskap och vill dela med dig av den för att hjälpa det här projektet att växa, är kanske det här klassen för dig."
# counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful." counselor_attribute_1: "Erfarenhet, i ett av områdena ovan eller någonting annat du tror kan vara hjälpsamt."
# counselor_attribute_2: "A little bit of free time!" counselor_attribute_2: "Lite fritid!"
# counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)." counselor_join_desc: "berätta om dig själv, vad har du gjort och vad skulle du vara intresserad av att göra. Vi lägger dig i vår kontaktlista och hör av oss när vi behöver råd (inte alltför ofta)"
# more_about_counselor: "Learn More About Becoming a Counselor" more_about_counselor: "Lär dig mer om att bli en skritflärd"
# changes_auto_save: "Changes are saved automatically when you toggle checkboxes." changes_auto_save: "Förändringar sparas automatiskt när du ändrar kryssrutor."
# diligent_scribes: "Our Diligent Scribes:" diligent_scribes: "Våra flitiga skriftlärda:"
# powerful_archmages: "Our Powerful Archmages:" powerful_archmages: "Våra kraftfulla huvudmagiker:"
# creative_artisans: "Our Creative Artisans:" creative_artisans: "Våra kreativa hantverkare:"
# brave_adventurers: "Our Brave Adventurers:" brave_adventurers: "Våra modiga äventyrare:"
# translating_diplomats: "Our Translating Diplomats:" translating_diplomats: "Våra översättande diplomater:"
# helpful_ambassadors: "Our Helpful Ambassadors:" helpful_ambassadors: "Våra hjälpfulla ambassadörer:"
# classes: classes:
# archmage_title: "Archmage" archmage_title: "Huvudmagiker"
# archmage_title_description: "(Coder)" archmage_title_description: "(Kodare)"
# artisan_title: "Artisan" artisan_title: "Hantverkare"
# artisan_title_description: "(Level Builder)" artisan_title_description: "(Nivåbyggare)"
# adventurer_title: "Adventurer" adventurer_title: "Äventyrare"
# adventurer_title_description: "(Level Playtester)" adventurer_title_description: "(Nivåtestare)"
# scribe_title: "Scribe" scribe_title: "Skriftlärd"
# scribe_title_description: "(Article Editor)" scribe_title_description: "(Artikelredigerare)"
# diplomat_title: "Diplomat" diplomat_title: "Diplomat"
# diplomat_title_description: "(Translator)" diplomat_title_description: "(Översättare)"
# ambassador_title: "Ambassador" ambassador_title: "Ambassadör"
# ambassador_title_description: "(Support)" ambassador_title_description: "(Support)"
# counselor_title: "Counselor" counselor_title: "Rådgivare"
# counselor_title_description: "(Expert/Teacher)" counselor_title_description: "(Expert/Lärare)"
# ladder: ladder:
# please_login: "Please log in first before playing a ladder game." please_login: "Var vänlig logga in innan du spelar en stegmatch."
# my_matches: "My Matches" my_matches: "Mina matcher"
# simulate: "Simulate" simulate: "Simulera"
# simulation_explanation: "By simulating games you can get your game ranked faster!" simulation_explanation: "Genom att simulera matcher kan du få dina matcher rankade fortare."
# simulate_games: "Simulate Games!" simulate_games: "Simulera matcher!"
# simulate_all: "RESET AND SIMULATE GAMES" simulate_all: "ÅTERSTÄLL OCH SIMULERA MATCHER"
# leaderboard: "Leaderboard" leaderboard: "Resultattavla"
# battle_as: "Battle as " battle_as: "Kämpa som "
# summary_your: "Your " summary_your: "Dina "
# summary_matches: "Matches - " summary_matches: "Matcher - "
# summary_wins: " Wins, " summary_wins: " Vinster, "
# summary_losses: " Losses" summary_losses: " Förlustar"
# rank_no_code: "No New Code to Rank" rank_no_code: "Ingen ny kod att ranka"
# rank_my_game: "Rank My Game!" rank_my_game: "Ranka min match!"
# rank_submitting: "Submitting..." rank_submitting: "Skickar..."
# rank_submitted: "Submitted for Ranking" rank_submitted: "Inskickad för rankning"
# rank_failed: "Failed to Rank" rank_failed: "Kunde inte ranka"
# rank_being_ranked: "Game Being Ranked" rank_being_ranked: "Matchen blir rankad"
# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." code_being_simulated: "Din nya kod håller på att bli simulerad av andra spelare för rankning. Detta kommer att uppdateras allt eftersom nya matcher kommer in."
# no_ranked_matches_pre: "No ranked matches for the " no_ranked_matches_pre: "Inga rankade matcher för "
# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." no_ranked_matches_post: " laget! Spela mot några motståndare och kom sedan tillbaka it för att få din match rankad."
# choose_opponent: "Choose an Opponent" choose_opponent: "Välj en motståndare"
# tutorial_play: "Play Tutorial" tutorial_play: "Spela tutorial"
# tutorial_recommended: "Recommended if you've never played before" tutorial_recommended: "Rekommenderas om du aldrig har spelat tidigare"
# tutorial_skip: "Skip Tutorial" tutorial_skip: "Hoppa över tutorial"
# tutorial_not_sure: "Not sure what's going on?" tutorial_not_sure: "Inte säker på vad som händer?"
# tutorial_play_first: "Play the Tutorial first." tutorial_play_first: "Spela tutorial först."
# simple_ai: "Simple AI" simple_ai: "Enkelt AI"
# warmup: "Warmup" warmup: "Uppvärmning"
# vs: "VS" vs: "VS"
# multiplayer_launch: multiplayer_launch:
# introducing_dungeon_arena: "Introducing Dungeon Arena" introducing_dungeon_arena: "Introducerar grottarenan"
# new_way: "March 17, 2014: The new way to compete with code." new_way: "17 mars 2014: Det nya sättet att tävla i kod."
# to_battle: "To Battle, Developers!" to_battle: "Till slagfältet, utvecklare!"
# modern_day_sorcerer: "You know how to code? That's badass. You're a modern-day sorcerer! Isn't about time that you used your magic coding powers to command your minions in epic combat? And we're not talking robots here." modern_day_sorcerer: "Du vet hur man kodar? Det är coolt. Du är en modern trollkarl! Är det inte dags att du använde dina magiska kodarkrafter för att leda dina undersåtar i episka strider? Och vi snackar inte om robotar nu."
# arenas_are_here: "CodeCombat head-to-head multiplayer arenas are here." arenas_are_here: "CodeCombats flerspelararenor är här."
# ladder_explanation: "Choose your heroes, enchant your human or ogre armies, and climb your way over defeated fellow Wizards to reach the top of the laddersthen challenge your friends in our glorious, asynchronous multiplayer coding arenas. If you're feeling creative, you can even" ladder_explanation: "Välj dina hjältar, förtrolla dina människo- eller orch-arméer och klättra över besegrade trollkarlar, för att nå toppen av stegen - och utmana sedan dina vänner i våra ärorika, asynkrona flerspelararenor. Om du känner dig kreativ kan du till och med"
# fork_our_arenas: "fork our arenas" fork_our_arenas: "förgrena våra arenor"
# create_worlds: "and create your own worlds." create_worlds: "och skapa dina egna världer."
# javascript_rusty: "JavaScript a bit rusty? Don't worry; there's a" javascript_rusty: "JavaScript lite rostigt? Oroa dig inte, det finns en"
# tutorial: "tutorial" tutorial: "tutorial"
# new_to_programming: ". New to programming? Hit our beginner campaign to skill up." new_to_programming: ". Ny till programmering? Gå till vår nybörjarkampanj för att öva upp dina färdigheter."
# so_ready: "I Am So Ready for This" so_ready: "Jag är så redo för det här."

View file

@ -5,8 +5,12 @@
.tab-pane .tab-pane
margin-top: 10px margin-top: 10px
.rank-cell, .fight-cell
text-align: center
.score-cell .score-cell
width: 50px width: 50px
text-align: center
.play-button .play-button
margin-bottom: 10px margin-bottom: 10px
@ -22,6 +26,12 @@
white-space: nowrap white-space: nowrap
overflow: hidden overflow: hidden
.ellipsis-row
text-align: center
td
padding: 1px 2px
tr.stale tr.stale
opacity: 0.5 opacity: 0.5

View file

@ -47,3 +47,13 @@ block content
if false && me.isAdmin() if false && me.isAdmin()
p p
button(data-i18n="ladder.simulate_all").btn.btn-danger.btn-lg.highlight#simulate-all-button RESET AND SIMULATE GAMES button(data-i18n="ladder.simulate_all").btn.btn-danger.btn-lg.highlight#simulate-all-button RESET AND SIMULATE GAMES
p.simulation-count
span(data-i18n="ladder.games_simulated_by") Games simulated by you:
|
span#simulated-by-you= me.get('simulatedBy') || 0
p.simulation-count
span(data-i18n="ladder.games_simulated_by") Games simulated for you:
|
span#simulated-for-you= me.get('simulatedFor') || 0

View file

@ -3,23 +3,39 @@ div#columns.row
div.column.col-md-6 div.column.col-md-6
table.table.table-bordered.table-condensed.table-hover table.table.table-bordered.table-condensed.table-hover
tr tr
th(colspan=4, style="color: #{team.primaryColor}") th
th(colspan=3, style="color: #{team.primaryColor}")
span= team.name span= team.name
span span
span(data-i18n="ladder.leaderboard") Leaderboard span(data-i18n="ladder.leaderboard") Leaderboard
tr tr
th(data-i18n="general.rank") Rank th
th(data-i18n="general.score") Score th(data-i18n="general.score") Score
th(data-i18n="general.name").name-col-cell Name th(data-i18n="general.name").name-col-cell Name
th th
for session, rank in team.leaderboard.topPlayers.models - var topSessions = team.leaderboard.topPlayers.models;
- var inTheTop = team.leaderboard.inTopSessions();
- if(!inTheTop) topSessions = topSessions.slice(0, 10);
for session, rank in topSessions
- var myRow = session.get('creator') == me.id - var myRow = session.get('creator') == me.id
tr(class=myRow ? "success" : "") tr(class=myRow ? "success" : "")
td.rank-cell= rank + 1 td.rank-cell= rank + 1
td.score-cell= Math.round(session.get('totalScore') * 100) td.score-cell= Math.round(session.get('totalScore') * 100)
td.name-col-cell= session.get('creatorName') || "Anonymous" td.name-col-cell= session.get('creatorName') || "Anonymous"
td td.fight-cell
a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}") a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}")
span(data-i18n="ladder.battle_as") Battle as span(data-i18n="ladder.fight") Fight!
| #{team.otherTeam}!
if !inTheTop
tr(class="active")
td(colspan=4).ellipsis-row ...
for session in team.leaderboard.nearbySessions()
- var myRow = session.get('creator') == me.id
tr(class=myRow ? "success" : "")
td.rank-cell= session.rank
td.score-cell= Math.round(session.get('totalScore') * 100)
td.name-col-cell= session.get('creatorName') || "Anonymous"
td.fight-cell
a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}")
span(data-i18n="ladder.fight") Fight!

View file

@ -29,9 +29,7 @@ module.exports = class LadderTabView extends CocoView
refreshLadder: -> refreshLadder: ->
for team in @teams for team in @teams
@leaderboards[team.id]?.off 'sync' @leaderboards[team.id]?.off 'sync'
# teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id
teamSession = null
# console.log "Team session: #{JSON.stringify teamSession}"
@leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession) @leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession)
@leaderboards[team.id].once 'sync', @onLeaderboardLoaded, @ @leaderboards[team.id].once 'sync', @onLeaderboardLoaded, @
@ -55,51 +53,43 @@ module.exports = class LadderTabView extends CocoView
class LeaderboardData class LeaderboardData
constructor: (@level, @team, @session) -> constructor: (@level, @team, @session) ->
_.extend @, Backbone.Events _.extend @, Backbone.Events
limit = 200 # if @session then 10 else 20 # We need to figure out paging. @topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: 20})
@topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: limit}) promises = []
@topPlayers.fetch() promises.push @topPlayers.fetch()
@topPlayers.comparator = (model) -> @topPlayers.once 'sync', @onceLeaderboardPartLoaded, @
return -model.get('totalScore')
@topPlayers.sort()
@topPlayers.once 'sync', @leaderboardPartLoaded, @ if @session
score = @session.get('totalScore') or 10
@playersAbove = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 4, team: @team})
promises.push @playersAbove.fetch()
@playersAbove.once 'sync', @onceLeaderboardPartLoaded, @
@playersBelow = new LeaderboardCollection(@level, {order:-1, scoreOffset: score, limit: 4, team: @team})
promises.push @playersBelow.fetch()
@playersBelow.once 'sync', @onceLeaderboardPartLoaded, @
level = "#{level.get('original')}.#{level.get('version').major}"
success = (@myRank) =>
promises.push $.ajax "/db/level/#{level}/leaderboard_rank?scoreOffset=#{@session.get('totalScore')}&team=#{@team}", {success}
$.when(promises...).then @onLoad
# if @session onLoad: =>
# score = @session.get('totalScore') or 25
# @playersAbove = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 4, team: @team})
# @playersAbove.fetch()
# @playersAbove.once 'sync', @leaderboardPartLoaded, @
# @playersBelow = new LeaderboardCollection(@level, {order:-1, scoreOffset: score, limit: 4, team: @team})
# @playersBelow.fetch()
# @playersBelow.once 'sync', @leaderboardPartLoaded, @
leaderboardPartLoaded: ->
# Forget loading the up-to-date names, that's way too slow for something that refreshes all the time, we learned.
@loaded = true @loaded = true
@trigger 'sync' @trigger 'sync'
return # TODO: cache user ids -> names mapping, and load them here as needed,
if @session # and apply them to sessions. Fetching each and every time is too costly.
if @topPlayers.loaded # and @playersAbove.loaded and @playersBelow.loaded
@loaded = true inTopSessions: ->
@fetchNames() return me.id in (session.attributes.creator for session in @topPlayers.models)
else
@loaded = true nearbySessions: ->
@fetchNames() return unless @session
l = []
fetchNames: -> above = @playersAbove.models
sessionCollections = [@topPlayers, @playersAbove, @playersBelow] above.reverse()
sessionCollections = (s for s in sessionCollections when s) l = l.concat(above)
ids = [] l.push @session
for collection in sessionCollections l = l.concat(@playersBelow.models)
ids.push model.get('creator') for model in collection.models if @myRank
startRank = @myRank - 4
success = (nameMap) => session.rank = startRank + i for session, i in l
for collection in sessionCollections l
session.set('creatorName', nameMap[session.get('creator')]) for session in collection.models
@trigger 'sync'
$.ajax('/db/user/-/names', {
data: {ids: ids}
type: 'POST'
success: success
})

View file

@ -88,8 +88,8 @@ module.exports = class MyMatchesTabView extends CocoView
# Let's try being independent of time. # Let's try being independent of time.
times = (i for s, i in scoreHistory) times = (i for s, i in scoreHistory)
scores = (s[1] for s in scoreHistory) scores = (s[1] for s in scoreHistory)
lowest = _.min scores.concat([0]) lowest = _.min scores #.concat([0])
highest = _.max scores.concat(50) highest = _.max scores #.concat(50)
scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores) scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores)
team.chartData = times.join(',') + '|' + scores.join(',') team.chartData = times.join(',') + '|' + scores.join(',')
team.minScore = Math.round(100 * lowest) team.minScore = Math.round(100 * lowest)

View file

@ -72,7 +72,7 @@ module.exports = class LadderView extends RootView
@showPlayModal(hash) if @sessions.loaded @showPlayModal(hash) if @sessions.loaded
fetchSessionsAndRefreshViews: -> fetchSessionsAndRefreshViews: ->
return if @destroyed or application.userIsIdle or @$el.find('#simulate.active').length or (new Date() - 2000 < @lastRefreshTime) return if @destroyed or application.userIsIdle or @$el.find('#simulate.active').length or (new Date() - 2000 < @lastRefreshTime) or @startsLoading
@sessions.fetch({"success": @refreshViews}) @sessions.fetch({"success": @refreshViews})
refreshViews: => refreshViews: =>
@ -83,7 +83,7 @@ module.exports = class LadderView extends RootView
console.log "Refreshed sessions for ladder and matches." console.log "Refreshed sessions for ladder and matches."
onIdleChanged: (e) -> onIdleChanged: (e) ->
@refreshViews() unless e.idle @fetchSessionsAndRefreshViews() unless e.idle
# Simulations # Simulations

View file

@ -30,6 +30,7 @@ LevelHandler = class LevelHandler extends Handler
getByRelationship: (req, res, args...) -> getByRelationship: (req, res, args...) ->
return @getSession(req, res, args[0]) if args[1] is 'session' return @getSession(req, res, args[0]) if args[1] is 'session'
return @getLeaderboard(req, res, args[0]) if args[1] is 'leaderboard' return @getLeaderboard(req, res, args[0]) if args[1] is 'leaderboard'
return @getMyLeaderboardRank(req, res, args[0]) if args[1] is 'leaderboard_rank'
return @getMySessions(req, res, args[0]) if args[1] is 'my_sessions' return @getMySessions(req, res, args[0]) if args[1] is 'my_sessions'
return @getFeedback(req, res, args[0]) if args[1] is 'feedback' return @getFeedback(req, res, args[0]) if args[1] is 'feedback'
return @getRandomSessionPair(req,res,args[0]) if args[1] is 'random_session_pair' return @getRandomSessionPair(req,res,args[0]) if args[1] is 'random_session_pair'
@ -118,28 +119,11 @@ LevelHandler = class LevelHandler extends Handler
if err then @sendDatabaseError(res, err) else @sendSuccess res, results if err then @sendDatabaseError(res, err) else @sendSuccess res, results
getLeaderboard: (req, res, id) -> getLeaderboard: (req, res, id) ->
@validateLeaderboardRequestParameters req sessionsQueryParameters = @makeLeaderboardQueryParameters(req, id)
[original, version] = id.split '.'
version = parseInt(version) ? 0
scoreQuery = {}
scoreQuery[if req.query.order is 1 then "$gte" else "$lte"] = req.query.scoreOffset
sessionsQueryParameters =
level:
original: original
majorVersion: version
team: req.query.team
totalScore: scoreQuery
submitted: true
sortParameters = sortParameters =
"totalScore": req.query.order "totalScore": req.query.order
selectProperties = ['totalScore', 'creatorName', 'creator']
selectProperties = [
'totalScore'
'creatorName'
'creator'
]
query = Session query = Session
.find(sessionsQueryParameters) .find(sessionsQueryParameters)
@ -152,6 +136,33 @@ LevelHandler = class LevelHandler extends Handler
resultSessions ?= [] resultSessions ?= []
@sendSuccess res, resultSessions @sendSuccess res, resultSessions
getMyLeaderboardRank: (req, res, id) ->
req.query.order = 1
sessionsQueryParameters = @makeLeaderboardQueryParameters(req, id)
Session.count sessionsQueryParameters, (err, count) =>
return @sendDatabaseError(res, err) if err
res.send JSON.stringify(count + 1)
makeLeaderboardQueryParameters: (req, id) ->
@validateLeaderboardRequestParameters req
[original, version] = id.split '.'
version = parseInt(version) ? 0
scoreQuery = {}
scoreQuery[if req.query.order is 1 then "$gt" else "$lt"] = req.query.scoreOffset
query =
level:
original: original
majorVersion: version
team: req.query.team
totalScore: scoreQuery
submitted: true
query
validateLeaderboardRequestParameters: (req) ->
req.query.order = parseInt(req.query.order) ? -1
req.query.scoreOffset = parseFloat(req.query.scoreOffset) ? 100000
req.query.team ?= 'humans'
req.query.limit = parseInt(req.query.limit) ? 20
getLeaderboardFriends: (req, res, id) -> getLeaderboardFriends: (req, res, id) ->
friendIDs = req.body.friendIDs or [] friendIDs = req.body.friendIDs or []
@ -222,15 +233,6 @@ LevelHandler = class LevelHandler extends Handler
@sendSuccess res, sessions @sendSuccess res, sessions
validateLeaderboardRequestParameters: (req) ->
req.query.order = parseInt(req.query.order) ? -1
req.query.scoreOffset = parseFloat(req.query.scoreOffset) ? 100000
req.query.team ?= 'humans'
req.query.limit = parseInt(req.query.limit) ? 20
getFeedback: (req, res, id) -> getFeedback: (req, res, id) ->
return @sendNotFoundError(res) unless req.user return @sendNotFoundError(res) unless req.user
@fetchLevelByIDAndHandleErrors id, req, res, (err, level) => @fetchLevelByIDAndHandleErrors id, req, res, (err, level) =>

View file

@ -9,6 +9,7 @@ mongoose = require 'mongoose'
queues = require '../commons/queue' queues = require '../commons/queue'
LevelSession = require '../levels/sessions/LevelSession' LevelSession = require '../levels/sessions/LevelSession'
Level = require '../levels/Level' Level = require '../levels/Level'
User = require '../users/User'
TaskLog = require './task/ScoringTask' TaskLog = require './task/ScoringTask'
bayes = new (require 'bayesian-battle')() bayes = new (require 'bayesian-battle')()
@ -24,7 +25,7 @@ connectToScoringQueue = ->
if error? then throw new Error "There was an error registering the scoring queue: #{error}" if error? then throw new Error "There was an error registering the scoring queue: #{error}"
scoringTaskQueue = data scoringTaskQueue = data
log.info "Connected to scoring task queue!" log.info "Connected to scoring task queue!"
module.exports.messagesInQueueCount = (req, res) -> module.exports.messagesInQueueCount = (req, res) ->
scoringTaskQueue.totalMessagesInQueue (err, count) -> scoringTaskQueue.totalMessagesInQueue (err, count) ->
if err? then return errors.serverError res, "There was an issue finding the Mongoose count:#{err}" if err? then return errors.serverError res, "There was an issue finding the Mongoose count:#{err}"
@ -148,6 +149,9 @@ module.exports.processTaskResult = (req, res) ->
addMatchToSessions clientResponseObject, newScoresObject, (err, data) -> addMatchToSessions clientResponseObject, newScoresObject, (err, data) ->
if err? then return errors.serverError res, "There was an error updating the sessions with the match! #{JSON.stringify err}" if err? then return errors.serverError res, "There was an error updating the sessions with the match! #{JSON.stringify err}"
incrementUserSimulationCount req.user._id, 'simulatedBy'
incrementUserSimulationCount levelSession.creator, 'simulatedFor'
originalSessionID = clientResponseObject.originalSessionID originalSessionID = clientResponseObject.originalSessionID
originalSessionTeam = clientResponseObject.originalSessionTeam originalSessionTeam = clientResponseObject.originalSessionTeam
originalSessionRank = parseInt clientResponseObject.originalSessionRank originalSessionRank = parseInt clientResponseObject.originalSessionRank
@ -225,7 +229,7 @@ findNearestBetterSessionID = (levelOriginalID, levelMajorVersion, sessionID, ses
submittedCode: submittedCode:
$exists: true $exists: true
team: opposingTeam team: opposingTeam
if opponentSessionTotalScore < 30 if opponentSessionTotalScore < 30
queryParameters["totalScore"]["$gt"] = opponentSessionTotalScore + 1 queryParameters["totalScore"]["$gt"] = opponentSessionTotalScore + 1
@ -265,6 +269,11 @@ calculateOpposingTeam = (sessionTeam) ->
opposingTeams = _.pull teams, sessionTeam opposingTeams = _.pull teams, sessionTeam
return opposingTeams[0] return opposingTeams[0]
incrementUserSimulationCount = (userID, type) ->
inc = {}
inc[type] = 1
User.update {_id: userID}, {$inc: inc}, (err, affected) ->
log.error "Error incrementing #{type} for #{userID}: #{err}" if err
validatePermissions = (req, sessionID, callback) -> validatePermissions = (req, sessionID, callback) ->
if isUserAnonymous req then return callback null, false if isUserAnonymous req then return callback null, false

View file

@ -156,8 +156,8 @@ getScoreHistoryGraphURL = (session, daysAgo) ->
times = (s[0] for s in scoreHistory) times = (s[0] for s in scoreHistory)
times = ((100 * (t - times[0]) / (times[times.length - 1] - times[0])).toFixed(1) for t in times) times = ((100 * (t - times[0]) / (times[times.length - 1] - times[0])).toFixed(1) for t in times)
scores = (s[1] for s in scoreHistory) scores = (s[1] for s in scoreHistory)
lowest = _.min scores.concat([0]) lowest = _.min scores #.concat([0])
highest = _.max scores.concat(50) highest = _.max scores #.concat(50)
scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores) scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores)
currentScore = Math.round scoreHistory[scoreHistory.length - 1][1] * 100 currentScore = Math.round scoreHistory[scoreHistory.length - 1][1] * 100
minScore = Math.round(100 * lowest) minScore = Math.round(100 * lowest)

View file

@ -18,7 +18,7 @@ UserHandler = class UserHandler extends Handler
'name', 'photoURL', 'password', 'anonymous', 'wizardColor1', 'volume', 'name', 'photoURL', 'password', 'anonymous', 'wizardColor1', 'volume',
'firstName', 'lastName', 'gender', 'facebookID', 'emailSubscriptions', 'firstName', 'lastName', 'gender', 'facebookID', 'emailSubscriptions',
'testGroupNumber', 'music', 'hourOfCode', 'hourOfCodeComplete', 'preferredLanguage', 'testGroupNumber', 'music', 'hourOfCode', 'hourOfCodeComplete', 'preferredLanguage',
'wizard', 'aceConfig' 'wizard', 'aceConfig', 'simulatedBy', 'simulatedFor'
] ]
jsonSchema: schema jsonSchema: schema
@ -108,17 +108,17 @@ UserHandler = class UserHandler extends Handler
if req.user?._id.equals(id) if req.user?._id.equals(id)
return @sendSuccess(res, @formatEntity(req, req.user)) return @sendSuccess(res, @formatEntity(req, req.user))
super(req, res, id) super(req, res, id)
getNamesByIds: (req, res) -> getNamesByIds: (req, res) ->
ids = req.query.ids or req.body.ids ids = req.query.ids or req.body.ids
ids = ids.split(',') if _.isString ids ids = ids.split(',') if _.isString ids
ids = _.uniq ids ids = _.uniq ids
# TODO: Extend and repurpose this handler to return other public info about a user more flexibly, # TODO: Extend and repurpose this handler to return other public info about a user more flexibly,
# say by a query parameter that lists public properties to return. # say by a query parameter that lists public properties to return.
returnWizard = req.query.wizard or req.body.wizard returnWizard = req.query.wizard or req.body.wizard
query = if returnWizard then {name:1, wizard:1} else {name:1} query = if returnWizard then {name:1, wizard:1} else {name:1}
makeFunc = (id) -> makeFunc = (id) ->
(callback) -> (callback) ->
User.findById(id, query).exec (err, document) -> User.findById(id, query).exec (err, document) ->
@ -127,12 +127,12 @@ UserHandler = class UserHandler extends Handler
callback(null, {name:document.get('name'), wizard:document.get('wizard') or {}}) callback(null, {name:document.get('name'), wizard:document.get('wizard') or {}})
else else
callback(null, document?.get('name') or '') callback(null, document?.get('name') or '')
funcs = {} funcs = {}
for id in ids for id in ids
return errors.badInput(res, "Given an invalid id: #{id}") unless Handler.isID(id) return errors.badInput(res, "Given an invalid id: #{id}") unless Handler.isID(id)
funcs[id] = makeFunc(id) funcs[id] = makeFunc(id)
async.parallel funcs, (err, results) -> async.parallel funcs, (err, results) ->
return errors.serverError err if err return errors.serverError err if err
res.send results res.send results

View file

@ -51,6 +51,9 @@ UserSchema = c.object {},
indentGuides: {type: 'boolean', 'default': false} indentGuides: {type: 'boolean', 'default': false}
behaviors: {type: 'boolean', 'default': false} behaviors: {type: 'boolean', 'default': false}
simulatedBy: {type: 'integer', minimum: 0, default: 0}
simulatedFor: {type: 'integer', minimum: 0, default: 0}
c.extendBasicProperties UserSchema, 'user' c.extendBasicProperties UserSchema, 'user'
module.exports = UserSchema module.exports = UserSchema