diff --git a/app/assets/index.html b/app/assets/index.html
index 567a2f9bf..24d9d600a 100644
--- a/app/assets/index.html
+++ b/app/assets/index.html
@@ -31,8 +31,7 @@
-
-
+
@@ -76,8 +75,8 @@
// Additional JS functions here
window.fbAsyncInit = function() {
FB.init({
- appId : '148832601965463', // App ID
- channelUrl : 'http://codecombat.com/channel.html', // Channel File
+ appId : document.location.origin === 'http://localhost:3000' ? '607435142676437' : '148832601965463', // App ID
+ channelUrl : document.location.origin +'/channel.html', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
@@ -113,7 +112,14 @@
-
+
+
diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee
index 6dad97a9a..a91ec2306 100644
--- a/app/lib/simulator/Simulator.coffee
+++ b/app/lib/simulator/Simulator.coffee
@@ -101,6 +101,8 @@ module.exports = class Simulator extends CocoClass
handleTaskResultsTransferSuccess: (result) =>
console.log "Task registration result: #{JSON.stringify result}"
@trigger 'statusUpdate', 'Results were successfully sent back to server!'
+ simulatedBy = parseInt($('#simulated-by-you').text(), 10) + 1
+ $('#simulated-by-you').text(simulatedBy)
handleTaskResultsTransferError: (error) =>
@trigger 'statusUpdate', 'There was an error sending the results back to the server.'
diff --git a/app/lib/surface/CocoSprite.coffee b/app/lib/surface/CocoSprite.coffee
index 8dd5980ac..d223ac571 100644
--- a/app/lib/surface/CocoSprite.coffee
+++ b/app/lib/surface/CocoSprite.coffee
@@ -252,6 +252,12 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
return
scaleX = if @getActionProp 'flipX' then -1 else 1
scaleY = if @getActionProp 'flipY' then -1 else 1
+ if @thangType.get('name') is 'Arrow'
+ # scale the arrow so it appears longer when flying parallel to horizon
+ angle = @getRotation()
+ angle = -angle if angle < 0
+ angle = 180 - angle if angle > 90
+ scaleX = 0.5 + 0.5 * (90 - angle) / 90
scaleFactorX = @thang.scaleFactorX ? @scaleFactor
scaleFactorY = @thang.scaleFactorY ? @scaleFactor
@imageObject.scaleX = @originalScaleX * scaleX * scaleFactorX
diff --git a/app/lib/surface/Mark.coffee b/app/lib/surface/Mark.coffee
index 516862446..58df6ded3 100644
--- a/app/lib/surface/Mark.coffee
+++ b/app/lib/surface/Mark.coffee
@@ -55,7 +55,7 @@ module.exports = class Mark extends CocoClass
if @name is 'bounds' then @buildBounds()
else if @name is 'shadow' then @buildShadow()
else if @name is 'debug' then @buildDebug()
- else if @name.match(".*Range$") then @buildRadius(@name)
+ else if @name.match(/.+Range$/) then @buildRadius(@name)
else if @thangType then @buildSprite()
else console.error "Don't know how to build mark for", @name
@mark?.mouseEnabled = false
@@ -142,7 +142,7 @@ module.exports = class Mark extends CocoClass
@mark.graphics.beginFill colors[range]
else
@mark.graphics.beginFill extracolors[i]
-
+
# Draw the outer circle
@mark.graphics.drawCircle 0, 0, @sprite.thang[range] * Camera.PPM
diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index 26346f12d..69cd93343 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -530,6 +530,8 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
simulation_explanation: "By simulating games you can get your game ranked faster!"
simulate_games: "Simulate Games!"
simulate_all: "RESET AND SIMULATE GAMES"
+ games_simulated_by: "Games simulated by you:"
+ games_simulated_for: "Games simulated for you:"
leaderboard: "Leaderboard"
battle_as: "Battle as "
summary_your: "Your "
diff --git a/app/locale/locale.coffee b/app/locale/locale.coffee
index fb32c09c1..e53b3b1d6 100644
--- a/app/locale/locale.coffee
+++ b/app/locale/locale.coffee
@@ -50,4 +50,4 @@ module.exports =
uk: require './uk' # українська мова, Ukranian
hi: require './hi' # मानक हिन्दी, Hindi
ur: require './ur' # اُردُو, Urdu
- 'ms-BA': require './ms-BA' # Bahasa Melayu, Bahasa Malaysia
+ ms: require './ms' # Bahasa Melayu, Bahasa Malaysia
diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee
index 9b6be828c..470f7f3c7 100644
--- a/app/locale/pl.coffee
+++ b/app/locale/pl.coffee
@@ -66,12 +66,12 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
no_ie: "CodeCombat nie działa na Internet Explorer 9 lub starszym. Przepraszamy!"
no_mobile: "CodeCombat nie został zaprojektowany dla użądzeń przenośnych więc może nie działać!"
play: "Graj"
-# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!"
-# old_browser_suffix: "You can try anyway, but it probably won't work."
-# campaign: "Campaign"
-# for_beginners: "For Beginners"
+ old_browser: "Wygląda na to, że twoja przeglądarka jest zbyt stara, by obsłużyć CodeCombat. Wybacz!"
+ old_browser_suffix: "Możesz spróbowac mimo tego, ale prawdopodobnie gra nie będzie działać."
+ campaign: "Kampania"
+ for_beginners: "Dla początkujących"
# multiplayer: "Multiplayer"
-# for_developers: "For Developers"
+ for_developers: "Dla developerów"
play:
choose_your_level: "Wybierz poziom"
@@ -88,7 +88,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
campaign_player_created_description: "... w których walczysz przeciwko dziełom Czarodziejów Rękodzielnictwa"
level_difficulty: "Poziom trudności: "
play_as: "Graj jako "
-# spectate: "Spectate"
+ spectate: "Oglądaj"
contact:
contact_us: "Kontakt z CodeCombat"
@@ -104,7 +104,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
diplomat_suggestion:
title: "Pomóż w tłumaczeniu CodeCombat!"
sub_heading: "Potrzebujemy twoich zdolności językowych."
- pitch_body: "Tworzymy CodeCombat w języku angielskim, jednak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, jak i samej gry."
+ pitch_body: "Tworzymy CodeCombat w języku angielskim, jednak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, jak i samej gry."
missing_translations: "Dopóki nie przetłumaczymy wszystkiego na polski, będziesz widział niektóre napisy w języku angielskim."
learn_more: "Dowiedz się więcej o Dyplomatach"
subscribe_as_diplomat: "Dołącz do Dyplomatów"
@@ -198,7 +198,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
multiplayer_title: "Ustawienia multiplayer"
multiplayer_link_description: "Przekaż ten link, jeśli chcesz, by ktoś do ciebie dołączył."
multiplayer_hint_label: "Podpowiedź:"
- multiplayer_hint: "Klikjnij link by zaznaczyć wszystko, potem wciśnij Cmd-C lub Ctrl-C by skopiować ten link."
+ multiplayer_hint: "Kliknij link by zaznaczyć wszystko, potem wciśnij Cmd-C lub Ctrl-C by skopiować ten link."
multiplayer_coming_soon: "Wkrótce więcej opcji multiplayer"
guide_title: "Przewodnik"
tome_minion_spells: "Czary twojego podopiecznego"
@@ -240,12 +240,12 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
main_title: "Edytory CodeCombat"
main_description: "Stwórz własne poziomy, kampanie, jednostki i materiały edukacyjne. Zapewniamy wszystkie narzędzia, jakich będziesz potrzebował!"
article_title: "Edytor artykułów"
- article_description: "Pisz artykuły, które dostarczą graczom wiedzy co do konceptów programistycznych, które będą mogli użyć w poziomach i kampaniach."
+ article_description: "Pisz artykuły, które dostarczą graczom wiedzy co do konceptów programistycznych, których będą mogli użyć w poziomach i kampaniach."
thang_title: "Edytor obiektów"
thang_description: "Twórz jednostki, definiuj ich domyślną logikę, grafiki i dźwięki. Aktualnie wspiera wyłącznie importowanie grafik wektorowych wyeksportowanych przez Flash."
level_title: "Edytor poziomów"
level_description: "Zawiera narzędzia do skryptowania, przesyłania dźwięków i konstruowania spersonalizowanych logik, by móc tworzyć najrozmaitsze poziomy. Wszystko to, czego sami używamy!"
- security_notice: "Wiele ważnych fukncji nie jest obecnie domyślnie włączonych we wspomnianych edytorach. Wraz z ulepszeniem zabezpieczenia tych narzędzi, staną się one dostępne publicznie. Jeśli chciałbyś użyć ich już teraz, "
+ security_notice: "Wiele ważnych funkcji nie jest obecnie domyślnie włączonych we wspomnianych edytorach. Wraz z ulepszeniem zabezpieczenia tych narzędzi, staną się one dostępne publicznie. Jeśli chciałbyś użyć ich już teraz, "
contact_us: "skontaktuj się z nami!"
hipchat_prefix: "Możesz nas też spotkać w naszym"
hipchat_url: "pokoju HipChat."
@@ -259,7 +259,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
level_tab_systems: "Systemy"
level_tab_thangs_title: "Aktualne obiekty"
level_tab_thangs_conditions: "Warunki początkowe"
- level_tab_thangs_add: "Dodoaj obiekty"
+ level_tab_thangs_add: "Dodaj obiekty"
level_settings_title: "Ustawienia"
level_component_tab_title: "Aktualne komponenty"
level_component_btn_new: "Stwórz nowy komponent"
@@ -318,9 +318,9 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
who_is_codecombat: "Czym jest CodeCombat?"
why_codecombat: "Dlaczego CodeCombat?"
who_description_prefix: "założyli CodeCombat w 2013 roku. Stworzyliśmy również "
- who_description_suffix: "w roku 2008, doprowadzajac go do pierwszego miejsca wśród aplikacji do nauki zapisu chińskich i japońskich znaków zarówno wśród aplikacji internetowych, jak i aplikcji dla iOS."
+ who_description_suffix: "w roku 2008, doprowadzajac go do pierwszego miejsca wśród aplikacji do nauki zapisu chińskich i japońskich znaków zarówno wśród aplikacji internetowych, jak i aplikacji dla iOS."
who_description_ending: "Teraz nadszedł czas, by nauczyć ludzi programowania."
- why_paragraph_1: "Podczas tworzenia Skrittera, George nie umiał programować i ciągle towarzyszyła mu frustracja - nie mógł zaimplementować swoich pomysłów. Próbował się uczyć, lecz lekcje były zbyt wolne. Jego współlokator, chcąc się przebranżowić, spróbował Codeacademy, lecz \"nudziło go to.\" Każdego tygodnia któryś z kolegów podchodził do Codeacadem, by wkrótce potem zrezygnować. Zdaliśmy sobie sprawę, że mamy do czynienia z tym samym problemem, który rozwiązaliśmy Skritterem: ludzie uczący się umiejętności poprzez powolne, ciężkie lekcje, podczas gdy potrzebują oni szybkiej, energicznej praktyki. Wiemy, jak to naprawić."
+ why_paragraph_1: "Podczas tworzenia Skrittera, George nie umiał programować i ciągle towarzyszyła mu frustracja - nie mógł zaimplementować swoich pomysłów. Próbował się uczyć, lecz lekcje były zbyt wolne. Jego współlokator, chcąc się przebranżowić, spróbował Codeacademy, lecz \"nudziło go to.\" Każdego tygodnia któryś z kolegów podchodził do Codeacademy, by wkrótce potem zrezygnować. Zdaliśmy sobie sprawę, że mamy do czynienia z tym samym problemem, który rozwiązaliśmy Skritterem: ludzie uczący się umiejętności poprzez powolne, ciężkie lekcje, podczas gdy potrzebują oni szybkiej, energicznej praktyki. Wiemy, jak to naprawić."
why_paragraph_2: "Chcesz nauczyć się programowania? Nie potrzeba ci lekcji. Potrzeba ci pisania dużej ilości kodu w sposób sprawiający ci przyjemność."
why_paragraph_3_prefix: "O to chodzi w programowaniu - musi sprawiać radość. Nie radość w stylu"
why_paragraph_3_italic: "hura, nowa odznaka"
@@ -332,10 +332,10 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
why_ending_url: "Zostań czarodziejem już teraz!"
george_description: "CEO, człowiek od biznesu, web designer, game designer, i mistrz wszystkich początkujących programistów."
scott_description: "Programista niezwykły, software architect, czarodziej kuchenny i mistrz finansów. Scott to ten rozsądny."
- nick_description: "Programistyczny czarownik, ekscentryczny magik i eksperymentator pełną gębą. Nich może robić cokolwiek, a decyduje się pracować przy CodeCombat."
+ nick_description: "Programistyczny czarownik, ekscentryczny magik i eksperymentator pełną gębą. Nick może robić cokolwiek, a decyduje się pracować przy CodeCombat."
jeremy_description: "Magik od kontaktów z klientami, tester użyteczności i organizator społeczności; prawdopodobnie już rozmawiałeś z Jeremym."
- michael_description: "Programista, sys-admin, cudowne dziecko studiów technicznych, Michael to osoba utrzymująca nase serwery 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!"
+ michael_description: "Programista, sys-admin, cudowne dziecko studiów technicznych, Michael to osoba utrzymująca nasze serwery 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!"
legal:
page_title: "Nota prawna"
@@ -356,7 +356,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
email_settings_url: "twoje ustawienia e-mail"
email_description_suffix: "lub poprzez linki w e-mailach, które wysyłamy, możesz zmienić swoje ustawienia i w prosty sposób wypisać się z subskrypcji w dowolnym momencie."
cost_title: "Koszty"
- cost_description: "W tym momencie CodeCombat jest w stu procentach darmowe! Jednym z naszych głównych celów jest, by utrzymac taki stan rzeczy, aby jak najwięcej ludzi miało dostęp do gry, bez względu na ich zasobnośc. Jeśli nadejdą gorsze dni, dopuszczamy możliwość wprowadzenia płatnych subskrypcji lub pobierania opłat za część zawartości, ale wolelibyśmy, by tak się nie stało. Przy odrobinie szczęścia, uda nam się podtrzymać obecną sytuację dzięki:"
+ cost_description: "W tym momencie CodeCombat jest w stu procentach darmowe! Jednym z naszych głównych celów jest, by utrzymać taki stan rzeczy, aby jak najwięcej ludzi miało dostęp do gry, bez względu na ich zasobność. Jeśli nadejdą gorsze dni, dopuszczamy możliwość wprowadzenia płatnych subskrypcji lub pobierania opłat za część zawartości, ale wolelibyśmy, by tak się nie stało. Przy odrobinie szczęścia, uda nam się podtrzymać obecną sytuację dzięki:"
recruitment_title: "Rekrutacji"
recruitment_description_prefix: "Dzięki CodeCombat, staniesz się potężnym czarodziejem - nie tylko w grze, ale również w prawdziwym życiu."
url_hire_programmers: "Firmy nie nadążają z zatrudnianiem programistów"
@@ -393,7 +393,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
rights_description: "Opisy"
rights_writings: "Teksty"
rights_media: "Multimedia (dźwięki, muzyka) i jakiekolwiek inne typy prac i zasobów stworzonych specjalnie dla danego poziomu, które nie zostały publicznie udostępnione do tworzenia poziomów."
- rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie."
+ rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów, podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie."
nutshell_title: "W skrócie"
nutshell_description: "Wszelkie zasoby, które dostarczamy w Edytorze Poziomów są darmowe w użyciu w jakikolwiek sposób w celu tworzenia poziomów. Jednocześnie, zastrzegamy sobie prawo do ograniczenia rozpowszechniania poziomów (stworzonych przez codecombat.com) jako takich, aby mogła być za nie w przyszłości pobierana opłata, jeśli dojdzie do takiej konieczności."
canonical: "Angielska wersja tego dokumentu jest ostateczna, kanoniczną wersją. Jeśli zachodzą jakieś rozbieżności pomiędzy tłumaczeniami, dokument anglojęzyczny ma pierwszeństwo."
@@ -540,16 +540,16 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
warmup: "Rozgrzewka"
# vs: "VS"
-# multiplayer_launch:
-# introducing_dungeon_arena: "Introducing Dungeon Arena"
-# new_way: "March 17, 2014: The new way to compete with code."
-# to_battle: "To Battle, Developers!"
-# 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."
-# arenas_are_here: "CodeCombat head-to-head multiplayer arenas are here."
-# 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 ladders–then challenge your friends in our glorious, asynchronous multiplayer coding arenas. If you're feeling creative, you can even"
-# fork_our_arenas: "fork our arenas"
-# create_worlds: "and create your own worlds."
-# javascript_rusty: "JavaScript a bit rusty? Don't worry; there's a"
-# tutorial: "tutorial"
-# new_to_programming: ". New to programming? Hit our beginner campaign to skill up."
-# so_ready: "I Am So Ready for This"
+ multiplayer_launch:
+ introducing_dungeon_arena: "Oto Dungeon Arena"
+ new_way: "17. marca 2014: Nowy sposób, by współzawodniczyć dzięki programowaniu."
+ to_battle: "Do broni, developerzy!"
+ modern_day_sorcerer: "Wiesz, jak programować? Super. Jesteś współczesnym czarodziejem. Czy nie najwyższy czas, aby użyć swoich mocy, by dowodzić jednostkami w epickiej batalii? I nie mamy tutaj na myśli robotów."
+ arenas_are_here: "Areny wieloosobowych potyczek CodeCombat właśnie nastały."
+ ladder_explanation: "Wybierz swoich herosów, ulepsz swą armię ludzi lub ogrów i wespnij się po pokonanych Czarodziejach, by osiągnąć szczyty rankingów - wówczas, wyzwij swoich przyjaciół w naszych wspaniałych, asynchronicznych arenach programowania multiplayer. Jeśli czujesz w sobie moc twórczą, możesz nawet"
+ fork_our_arenas: "forkować nasze areny"
+ create_worlds: "i tworzyć swoje własne światy."
+ javascript_rusty: "JavaScript wyleciała ci z głowy? Nie martw się, czeka na ciebie"
+ tutorial: "samouczek"
+ new_to_programming: ". Jesteś nowy w świecie programowania? Zagraj w naszą kampanię dla początkujących, aby zyskać nowe umiejętności."
+ so_ready: "Już nie mogę się doczekać"
diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee
index 63eb00b46..8c4b6fd56 100644
--- a/app/locale/sv.coffee
+++ b/app/locale/sv.coffee
@@ -2,15 +2,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
common:
loading: "Laddar..."
saving: "Sparar..."
-# sending: "Sending..."
+ sending: "Skickar..."
cancel: "Avbryt"
-# save: "Save"
+ save: "Spara"
delay_1_sec: "1 sekund"
delay_3_sec: "3 sekunder"
delay_5_sec: "5 sekunder"
manual: "Manuellt"
-# fork: "Fork"
-# play: "Play"
+ fork: "Förgrena"
+ play: "Spela"
modal:
close: "Stäng"
@@ -31,15 +31,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
about: "Om oss"
contact: "Kontakt"
twitter_follow: "Följ oss på Twitter"
-# employers: "Employers"
+ employers: "Arbetsgivare"
-# versions:
-# save_version_title: "Save New Version"
-# new_major_version: "New Major Version"
-# cla_prefix: "To save changes, first you must agree to our"
+ versions:
+ save_version_title: "Spara ny version"
+ new_major_version: "Ny betydande version"
+ cla_prefix: "För att spara ändringar måste du först godkänna vår"
# cla_url: "CLA"
# cla_suffix: "."
-# cla_agree: "I AGREE"
+ cla_agree: "JAG GODKÄNNER"
login:
sign_up: "Skapa Konto"
@@ -47,12 +47,12 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
log_out: "Logga Ut"
recover: "glömt lösenord"
-# recover:
-# recover_account_title: "Recover Account"
-# send_password: "Send Recovery Password"
+ recover:
+ recover_account_title: "Återskapa ditt konto"
+ send_password: "Skicka återskapningslösenord"
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:"
email_announcements: "Mottag nyheter via e-post"
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_mobile: "CodeCombat är inte designat för mobila enhter och kanske inte fungerar!"
play: "Spela"
-# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!"
-# old_browser_suffix: "You can try anyway, but it probably won't work."
-# campaign: "Campaign"
-# for_beginners: "For Beginners"
-# multiplayer: "Multiplayer"
-# for_developers: "For Developers"
+ old_browser: "Oj då, din webbläsare är för gammal för att köra CodeCombat. Förlåt!"
+ old_browser_suffix: "Du kan försöka ändå, men det kommer nog inte fungera."
+ campaign: "Kampanj"
+ for_beginners: "För nybörjare"
+ multiplayer: "Flera spelare"
+ for_developers: "För utvecklare"
play:
choose_your_level: "Välj din nivå"
@@ -79,16 +79,16 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
adventurer_forum: "Äventyrarforumet"
adventurer_suffix: "."
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_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_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_description: "... in which you battle against the creativity of your fellow Artisan Wizards."
+ campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra Hantverkartrollkarlar."
level_difficulty: "Svårighetsgrad: "
-# play_as: "Play As "
-# spectate: "Spectate"
+ play_as: "Spela som "
+ spectate: "Titta på"
contact:
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_page: "bidragarsida"
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_suffix: " istället."
send: "Skicka Feedback"
@@ -109,17 +109,17 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
learn_more: "Läs mer om att vara en Diplomat"
subscribe_as_diplomat: "Registrera dig som Diplomat"
-# wizard_settings:
-# title: "Wizard Settings"
-# customize_avatar: "Customize Your Avatar"
-# clothes: "Clothes"
-# trim: "Trim"
-# cloud: "Cloud"
-# spell: "Spell"
-# boots: "Boots"
-# hue: "Hue"
-# saturation: "Saturation"
-# lightness: "Lightness"
+ wizard_settings:
+ title: "Trollkarlsinställningar"
+ customize_avatar: "Skräddarsy din avatar"
+ clothes: "Kläder"
+ trim: "Dekorationer"
+ cloud: "Moln"
+ spell: "Trollformel"
+ boots: "Stövlar"
+ hue: "Nyans"
+ saturation: "Mättnad"
+ lightness: "Ljusstyrka"
account_settings:
title: "Kontoinställningar"
@@ -130,7 +130,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
wizard_tab: "Trollkarl"
password_tab: "Lösenord"
emails_tab: "E-postadresser"
-# admin: "Admin"
+ admin: "Administratör"
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_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"
email_subscriptions: "E-post Prenumerationer"
email_announcements: "Meddelanden"
-# email_notifications: "Notifications"
-# email_notifications_description: "Get periodic notifications for your account."
+ email_notifications: "Påminnelser"
+ 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."
-# 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_page: "bidragarsida"
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_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_rank_my_game: "Rank My Game"
-# victory_ranking_game: "Submitting..."
-# victory_return_to_ladder: "Return to Ladder"
+ victory_rank_my_game: "Ranka min match"
+ victory_ranking_game: "Skickar..."
+ victory_return_to_ladder: "Gå tillbaka till stegen"
victory_play_next_level: "Spela Nästa Nivå"
victory_go_home: "Gå Hem"
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_read_only_spells: "Skrivskyddade Förmågor"
tome_other_units: "Andra Enheter"
-# tome_cast_button_castable: "Cast Spell"
-# tome_cast_button_casting: "Casting"
-# tome_cast_button_cast: "Spell Cast"
-# tome_autocast_delay: "Autocast Delay"
+ tome_cast_button_castable: "Använd besvärjelse"
+ tome_cast_button_casting: "Besvärjer"
+ tome_cast_button_cast: "Besvärjelse använd"
+ tome_autocast_delay: "Autoanvändningsfördröjning"
tome_select_spell: "Välj en Förmåga"
tome_select_a_thang: "Välj Någon för "
tome_available_spells: "Tillgängliga Förmågor"
-# hud_continue: "Continue (shift+space)"
-# spell_saved: "Spell Saved"
-# skip_tutorial: "Skip (esc)"
-# editor_config: "Editor Config"
-# editor_config_title: "Editor Configuration"
-# editor_config_keybindings_label: "Key Bindings"
-# editor_config_keybindings_default: "Default (Ace)"
-# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors."
-# 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."
+ hud_continue: "Fortsätt (skift+mellanslag)"
+ spell_saved: "Besvärjelse sparad"
+ skip_tutorial: "Hoppa över (esc)"
+ editor_config: "Ställ in redigerare"
+ editor_config_title: "Redigerarinställningar"
+ editor_config_keybindings_label: "Kortkommandon"
+ editor_config_keybindings_default: "Standard (Ace)"
+ editor_config_keybindings_description: "Lägger till ytterligare kortkommandon kända från vanliga redigerare."
+ editor_config_invisibles_label: "Visa osynliga"
+ editor_config_invisibles_description: "Visar osynliga tecken såsom mellanrum och nyradstecken."
+ editor_config_indentguides_label: "Visa indenteringsguider"
+ editor_config_indentguides_description: "Visar vertikala linjer för att kunna se indentering bättre."
+ editor_config_behaviors_label: "Smart beteende"
+ editor_config_behaviors_description: "Avsluta automatiskt hakparenteser, parenteser, och citat."
-# admin:
-# av_title: "Admin Views"
-# av_entities_sub_title: "Entities"
-# av_entities_users_url: "Users"
-# av_entities_active_instances_url: "Active Instances"
-# av_other_sub_title: "Other"
-# av_other_debug_base_url: "Base (for debugging base.jade)"
-# u_title: "User List"
-# lg_title: "Latest Games"
+ admin:
+ av_title: "Administratörsvyer"
+ av_entities_sub_title: "Enheter"
+ av_entities_users_url: "Användare"
+ av_entities_active_instances_url: "Aktiva instanser"
+ av_other_sub_title: "Övrigt"
+ av_other_debug_base_url: "Base (för avlusning av base.jade)"
+ u_title: "Användarlista"
+ lg_title: "Senaste matcher"
-# editor:
-# main_title: "CodeCombat Editors"
-# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!"
-# article_title: "Article Editor"
-# article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns."
-# thang_title: "Thang Editor"
-# thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics."
-# level_title: "Level Editor"
-# level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!"
-# 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, "
-# contact_us: "contact us!"
-# hipchat_prefix: "You can also find us in our"
-# hipchat_url: "HipChat room."
-# revert: "Revert"
-# revert_models: "Revert Models"
-# 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_thangs_title: "Current Thangs"
-# level_tab_thangs_conditions: "Starting Conditions"
-# level_tab_thangs_add: "Add Thangs"
-# 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"
-# article_search_title: "Search Articles Here"
-# thang_search_title: "Search Thang Types Here"
-# level_search_title: "Search Levels Here"
+ editor:
+ main_title: "CodeCombatredigerar"
+ main_description: "Bygg dina egna banor, kampanjer, enheter och undervisningsinnehåll. Vi tillhandahåller alla verktyg du behöver!"
+ article_title: "Artikelredigerare"
+ 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: "Enhetsredigerare"
+ 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: "Nivåredigerare"
+ 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: "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: "kontakta oss!"
+ hipchat_prefix: "Du kan också hitta oss i vårt"
+ hipchat_url: "HipChat-rum."
+ revert: "Återställ"
+ revert_models: "Återställ modeller"
+ level_some_options: "Några inställningar?"
+ level_tab_thangs: "Enheter"
+ level_tab_scripts: "Skript"
+ level_tab_settings: "Inställningar"
+ level_tab_components: "Komponenter"
+ level_tab_systems: "System"
+ level_tab_thangs_title: "Nuvarande enheter"
+ level_tab_thangs_conditions: "Startvillkor"
+ level_tab_thangs_add: "Lägg till enheter"
+ level_settings_title: "Inställningar"
+ level_component_tab_title: "Nuvarande komponenter"
+ level_component_btn_new: "Skapa ny komponent"
+ level_systems_tab_title: "Nuvarande system"
+ level_systems_btn_new: "Skapa nytt system"
+ level_systems_btn_add: "Lägg till system"
+ level_components_title: "Tillbaka till alla enheter"
+ level_components_type: "Typ"
+ level_component_edit_title: "Redigera komponent"
+ level_component_config_schema: "Konfigurera schema"
+ level_component_settings: "Inställningar"
+ level_system_edit_title: "Redigera system"
+ create_system_title: "Skapa nytt system"
+ new_component_title: "Skapa ny komponent"
+ new_component_field_system: "System"
+ new_article_title: "Skapa ny artikel"
+ new_thang_title: "Skapa ny enhetstyp"
+ new_level_title: "Skapa ny nivå"
+ article_search_title: "Sök artiklar här"
+ thang_search_title: "Sök enhetstyper här"
+ level_search_title: "Sök nivåer här"
-# article:
-# edit_btn_preview: "Preview"
-# edit_article_title: "Edit Article"
+ article:
+ edit_btn_preview: "Förhandsgranska"
+ edit_article_title: "Redigera artikel"
-# general:
-# and: "and"
-# name: "Name"
-# body: "Body"
-# version: "Version"
-# commit_msg: "Commit Message"
-# history: "History"
-# version_history_for: "Version History for: "
-# result: "Result"
-# results: "Results"
-# description: "Description"
-# or: "or"
-# email: "Email"
-# password: "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"
+ general:
+ and: "och"
+ name: "Namn"
+ body: "Kropp"
+ version: "Version"
+ commit_msg: "Förbindelsemeddelande"
+ history: "Historik"
+ version_history_for: "Versionshistorik för: "
+ result: "Resultat"
+ results: "Resultat"
+ description: "Beskrivning"
+ or: "eller"
+ email: "Email"
+ password: "Lösenord"
+ message: "Meddelande"
+ code: "Kod"
+ ladder: "Stege"
+ when: "När"
+ opponent: "Fiende"
+ rank: "Rank"
+ score: "Poäng"
+ win: "Vinst"
+ loss: "Förlust"
+ tie: "Oavgjord"
+ easy: "Lätt"
+ medium: "Medium"
+ hard: "Svår"
-# about:
-# who_is_codecombat: "Who is CodeCombat?"
-# why_codecombat: "Why CodeCombat?"
-# who_description_prefix: "together started CodeCombat in 2013. We also created "
-# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters."
-# who_description_ending: "Now it's time to teach people to write code."
-# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that."
-# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it."
-# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like"
-# why_paragraph_3_italic: "yay a badge"
-# why_paragraph_3_center: "but fun like"
-# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!"
-# 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_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_ending: "And hey, it's free. "
-# why_ending_url: "Start wizarding now!"
-# george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere."
-# scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one."
-# nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat."
-# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy."
-# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online."
-# 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!"
+ about:
+ who_is_codecombat: "Vilka är CodeCombat?"
+ why_codecombat: "Varför CodeCombat?"
+ who_description_prefix: "startade tillsammans CodeCombat 2013. Vi skapade också "
+ 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: "Nu är det dags att lära folk skriva kod."
+ 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: "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: "Det är vad programmering handlar om. Det måste vara roligt. Inte roligt som i"
+ why_paragraph_3_italic: "hurra, en medalj"
+ why_paragraph_3_center: "utan roligt som i"
+ why_paragraph_3_italic_caps: "NEJ MAMMA JAG MÅSTE BLI KLAR MED DEN HÄR NIVÅN"
+ 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: "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: "Och du, det är gratis. "
+ why_ending_url: "Bli en trollkarl nu!"
+ george_description: "VD, affärskille, webbdesignare, speldesignare, och förkämpe för förstagångsprogrammerare överallt."
+ scott_description: "Extraordinär programmerare, mjukvaruarkitekt, kökstrollkarl och finansmästare. Scott är den den förståndiga."
+ 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: "Kundsupportsmagiker, användbarhetstestare och gemenskapsorganisatör; du har förmodligen redan pratat med Jeremy."
+ michael_description: "Programmerare, sys-admin, och studerande tekniskt underbarn, Michael är personen som håller våra servrar online."
+ 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:
-# page_title: "Legal"
-# opensource_intro: "CodeCombat is free to play and 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. 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."
-# 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: "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:"
-# recruitment_title: "Recruitment"
-# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizard–not just in the game, but also in real life."
-# url_hire_programmers: "No one can hire programmers fast enough"
-# 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_italic: "a lot"
-# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan."
-# 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 discrepencies between translations, the English document takes precedence."
+ legal:
+ page_title: "Juridik"
+ opensource_intro: "CodeCombat är gratis att spela och helt öppen programvara."
+ opensource_description_prefix: "Spana in "
+ github_url: "vår GitHub"
+ 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: "vår Huvudmagiker-wiki"
+ opensource_description_suffix: "för en lista över mjukvaran som gör detta spel möjligt."
+ practices_title: "Respektfulla \"best practices\""
+ practices_description: "Dessa är våra löften till dig, spelaren, på lite mindre juristspråk."
+ privacy_title: "Integritet"
+ 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: "Säkerhet"
+ 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_description_prefix: "Vi kommer inte att översvämma dig med spam. Genom "
+ email_settings_url: "dina email-inställningar"
+ 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: "Kostnad"
+ 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: "Rekrytering"
+ 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: "Ingen kan anställa programmerare tillräckligt snabbt"
+ 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: "mycket"
+ recruitment_description_ending: "sajten fortsätter vara gratis och alla är nöjda. Det är planen."
+ copyrights_title: "Upphovsrätt och licenser"
+ contributor_title: "Överenskommelse för bidragarlicens"
+ contributor_description_prefix: "Alla bidrag, både på sajten och på vårt GitHub-repo, faller under vår"
+ cla_url: "CLA"
+ contributor_description_suffix: ", som du borde godkänna innan du börjar bidra."
+ code_title: "Kod - MIT"
+ 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"
+ 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: "Konst/Musik - Creative Commons "
+ art_description_prefix: "Allt gemensamt innehåll är tillgängligt under"
+ cc_license_url: "Creative Commons Erkännande 4.0 Internationell-licensen"
+ 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: "Musik"
+ art_sound: "Ljud"
+ art_artwork: "Illustrationer"
+ art_sprites: "Sprites"
+ art_other: "Allt (icke-kod) kreativt arbete som görs tillgängliga när nivåer skapas."
+ 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: "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: "Om det används i en film eller ett annat spel, inkludera codecombat.com i eftertexterna."
+ 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: "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: "Rättigheter förbehålls"
+ rights_desc: "Alla rättigheter förbehålls för själva nivåerna. Detta inkluderar:"
+ rights_scripts: "Script"
+ rights_unit: "Enhetskonfiguration"
+ rights_description: "Beskrivning"
+ rights_writings: "Skifter"
+ 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: "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: "I ett nötskal"
+ 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: "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:
-# page_title: "Contributing"
-# character_classes_title: "Character Classes"
-# introduction_desc_intro: "We have high hopes for 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_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_ending: "We hope you'll join our party!"
-# introduction_desc_signature: "- Nick, George, Scott, Michael, and Jeremy"
-# alert_account_message_intro: "Hey there!"
-# alert_account_message_pref: "To subscribe for class emails, you'll need to "
-# alert_account_message_suf: "first."
-# alert_account_message_create_url: "create an account"
-# 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_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_hipchat: "public HipChat room"
-# more_about_archmage: "Learn More About Becoming an Archmage"
-# archmage_subscribe_desc: "Get emails on new coding opportunities and announcements."
-# 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_suf: "then this class is for you."
-# 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 HipChat room for help."
-# artisan_join_step4: "Post your levels on the forum for feedback."
-# more_about_artisan: "Learn More About Becoming an Artisan"
-# artisan_subscribe_desc: "Get emails on level editor updates and announcements."
-# 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_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!"
-# more_about_adventurer: "Learn More About Becoming an Adventurer"
-# adventurer_subscribe_desc: "Get emails when there are new levels to test."
-# 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_suf: " has built. If you enjoy explaining programming concepts, then this class is for you."
-# 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!"
-# more_about_scribe: "Learn More About Becoming a Scribe"
-# scribe_subscribe_desc: "Get emails about article writing announcements."
-# 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_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_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!"
-# more_about_diplomat: "Learn More About Becoming a Diplomat"
-# diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate."
-# ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you."
-# ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you."
-# ambassador_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!"
-# more_about_ambassador: "Learn More About Becoming an Ambassador"
-# ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments."
-# 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_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_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_attribute_1: "Experience, in any of the areas above or something you think might be helpful."
-# counselor_attribute_2: "A little bit of free time!"
-# counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)."
-# more_about_counselor: "Learn More About Becoming a Counselor"
-# 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:"
+ contribute:
+ page_title: "Bidragande"
+ character_classes_title: "Karaktärklasser"
+ introduction_desc_intro: "Vi har store förhoppningar för CodeCombat."
+ 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_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: "Vi hoppas att du vill vara med!"
+ introduction_desc_signature: "- Nick, George, Scott, Michael, och Jeremy"
+ alert_account_message_intro: "Hej där!"
+ alert_account_message_pref: "För att prenumerera på klassmail måste du"
+ alert_account_message_suf: "först."
+ alert_account_message_create_url: "skapa ett konto"
+ 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: "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: "Klassattribut"
+ archmage_attribute_1_pref: "Kunskap om "
+ 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: "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: "Hur man går med"
+ join_desc_1: "Alla kan hjälpa till! Kolla bara in vår "
+ 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: ", eller hitta oss i vår "
+ join_desc_4: "så tar vi det därifrån!"
+ join_url_email: "Maila oss"
+ join_url_hipchat: "offentliga HipChat-rum"
+ more_about_archmage: "Lär dig mer om att bli en huvudmagiker"
+ archmage_subscribe_desc: "Få mail om nya kodmöjligheter och tillkännagivanden."
+ 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: "är den här klassen för dig."
+ 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: "är den här klassen kanske något för dig."
+ 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: "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: "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: "Använd nivåredigeraren i dessa steg, mer eller mindre:"
+ artisan_join_step1: "Läs dokumentationen."
+ artisan_join_step2: "Skapa en ny nivå och utforska existerande nivåer."
+ artisan_join_step3: "Hitta oss i vårt offentliga HipChat-rum för hjälp."
+ artisan_join_step4: "Anslå dina nivåer på forumet för feedback."
+ more_about_artisan: "Lär dig mer om att bli en hantverkare"
+ artisan_subscribe_desc: "Få mail om nivåredigeraruppdateringar och tillkännagivanden"
+ 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: "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: "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: "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: "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: "vårt forum"
+ adventurer_join_suf: "så om du föredrar att bli notifierad på sådana sätt, bli medlem där!"
+ more_about_adventurer: "Lär dig mer om att bli en äventyrare"
+ adventurer_subscribe_desc: "Få mail när det finns nya nivåer att testa."
+ 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: " har byggt. Om du tycker om att förklara programmeringskoncept är det här klassen för dig."
+ 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_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: "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: "Kontakta oss"
+ 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: "Lär dig mer om att bli en skriftlärd"
+ scribe_subscribe_desc: "Få mail om tillkännagivanden om artiklar."
+ 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: "Om vi lärde oss någonting från "
+ diplomat_launch_url: "lanseringen i oktober"
+ 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: "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: "Hitta ditt språks locale-fil "
+ diplomat_github_url: "på GitHub"
+ 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: "Lär dig mer om att bli en diplomat"
+ diplomat_subscribe_desc: "Få mail om i18n-utvecklingar och nivåer att översätta."
+ 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: "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: "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: "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: "Notera"
+ 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: "Lär dig mer om att bli en ambassadör"
+ ambassador_subscribe_desc: "Få mail om supportuppdateringar och flerspelarutvecklingar"
+ 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: "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: "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: "Erfarenhet, i ett av områdena ovan eller någonting annat du tror kan vara hjälpsamt."
+ counselor_attribute_2: "Lite fritid!"
+ 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: "Lär dig mer om att bli en skritflärd"
+ changes_auto_save: "Förändringar sparas automatiskt när du ändrar kryssrutor."
+ diligent_scribes: "Våra flitiga skriftlärda:"
+ powerful_archmages: "Våra kraftfulla huvudmagiker:"
+ creative_artisans: "Våra kreativa hantverkare:"
+ brave_adventurers: "Våra modiga äventyrare:"
+ translating_diplomats: "Våra översättande diplomater:"
+ helpful_ambassadors: "Våra hjälpfulla ambassadörer:"
-# classes:
-# archmage_title: "Archmage"
-# archmage_title_description: "(Coder)"
-# artisan_title: "Artisan"
-# artisan_title_description: "(Level Builder)"
-# adventurer_title: "Adventurer"
-# adventurer_title_description: "(Level Playtester)"
-# scribe_title: "Scribe"
-# scribe_title_description: "(Article Editor)"
-# diplomat_title: "Diplomat"
-# diplomat_title_description: "(Translator)"
-# ambassador_title: "Ambassador"
-# ambassador_title_description: "(Support)"
-# counselor_title: "Counselor"
-# counselor_title_description: "(Expert/Teacher)"
+ classes:
+ archmage_title: "Huvudmagiker"
+ archmage_title_description: "(Kodare)"
+ artisan_title: "Hantverkare"
+ artisan_title_description: "(Nivåbyggare)"
+ adventurer_title: "Äventyrare"
+ adventurer_title_description: "(Nivåtestare)"
+ scribe_title: "Skriftlärd"
+ scribe_title_description: "(Artikelredigerare)"
+ diplomat_title: "Diplomat"
+ diplomat_title_description: "(Översättare)"
+ ambassador_title: "Ambassadör"
+ ambassador_title_description: "(Support)"
+ counselor_title: "Rådgivare"
+ counselor_title_description: "(Expert/Lärare)"
-# 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!"
-# simulate_games: "Simulate Games!"
-# simulate_all: "RESET AND SIMULATE GAMES"
-# 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"
-# 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"
-# 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 AI"
-# warmup: "Warmup"
-# vs: "VS"
+ ladder:
+ please_login: "Var vänlig logga in innan du spelar en stegmatch."
+ my_matches: "Mina matcher"
+ simulate: "Simulera"
+ simulation_explanation: "Genom att simulera matcher kan du få dina matcher rankade fortare."
+ simulate_games: "Simulera matcher!"
+ simulate_all: "ÅTERSTÄLL OCH SIMULERA MATCHER"
+ leaderboard: "Resultattavla"
+ battle_as: "Kämpa som "
+ summary_your: "Dina "
+ summary_matches: "Matcher - "
+ summary_wins: " Vinster, "
+ summary_losses: " Förlustar"
+ rank_no_code: "Ingen ny kod att ranka"
+ rank_my_game: "Ranka min match!"
+ rank_submitting: "Skickar..."
+ rank_submitted: "Inskickad för rankning"
+ rank_failed: "Kunde inte ranka"
+ rank_being_ranked: "Matchen blir rankad"
+ 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: "Inga rankade matcher för "
+ 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: "Välj en motståndare"
+ tutorial_play: "Spela tutorial"
+ tutorial_recommended: "Rekommenderas om du aldrig har spelat tidigare"
+ tutorial_skip: "Hoppa över tutorial"
+ tutorial_not_sure: "Inte säker på vad som händer?"
+ tutorial_play_first: "Spela tutorial först."
+ simple_ai: "Enkelt AI"
+ warmup: "Uppvärmning"
+ vs: "VS"
-# multiplayer_launch:
-# introducing_dungeon_arena: "Introducing Dungeon Arena"
-# new_way: "March 17, 2014: The new way to compete with code."
-# to_battle: "To Battle, Developers!"
-# 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."
-# arenas_are_here: "CodeCombat head-to-head multiplayer arenas are here."
-# 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 ladders–then challenge your friends in our glorious, asynchronous multiplayer coding arenas. If you're feeling creative, you can even"
-# fork_our_arenas: "fork our arenas"
-# create_worlds: "and create your own worlds."
-# javascript_rusty: "JavaScript a bit rusty? Don't worry; there's a"
-# tutorial: "tutorial"
-# new_to_programming: ". New to programming? Hit our beginner campaign to skill up."
-# so_ready: "I Am So Ready for This"
+ multiplayer_launch:
+ introducing_dungeon_arena: "Introducerar grottarenan"
+ new_way: "17 mars 2014: Det nya sättet att tävla i kod."
+ to_battle: "Till slagfältet, utvecklare!"
+ 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: "CodeCombats flerspelararenor är här."
+ 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: "förgrena våra arenor"
+ create_worlds: "och skapa dina egna världer."
+ javascript_rusty: "JavaScript lite rostigt? Oroa dig inte, det finns en"
+ tutorial: "tutorial"
+ new_to_programming: ". Ny till programmering? Gå till vår nybörjarkampanj för att öva upp dina färdigheter."
+ so_ready: "Jag är så redo för det här."
diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee
index 5fb4da5cd..13a2f129b 100644
--- a/app/locale/uk.coffee
+++ b/app/locale/uk.coffee
@@ -2,7 +2,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
common:
loading: "Завантаження..."
saving: "Збереження..."
- sending: "Відправлення..."
+ sending: "Надсилання..."
cancel: "Відміна"
save: "Зберегти"
delay_1_sec: "1 секунда"
@@ -31,15 +31,15 @@ module.exports = nativeDescription: "українська мова", englishDesc
about: "Про нас"
contact: "Контакти"
twitter_follow: "Фоловити"
- employers: "Зайняті"
+ employers: "Роботодавцям"
versions:
save_version_title: "Зберегти нову версію"
new_major_version: "Зберегти основну версію"
- cla_prefix: "Для збереження змін, спочатку треба погодитись з нашим"
+ cla_prefix: "Для збереження змін спочатку треба погодитись з нашим"
cla_url: "CLA"
cla_suffix: "."
- cla_agree: "Я Згоден"
+ cla_agree: "Я згоден"
login:
sign_up: "створити акаунт"
@@ -49,7 +49,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
recover:
recover_account_title: "Відновити акаунт"
- send_password: "Вислати пароль відновлення"
+ send_password: "Надіслати пароль відновлення"
signup:
create_account_title: "Створити акаунт, щоб зберегти прогрес"
@@ -63,20 +63,20 @@ module.exports = nativeDescription: "українська мова", englishDesc
home:
slogan: "Навчіться програмувати на JavaScript, граючи у гру"
- no_ie: "Нажаль, CodeCombat не працює в IE8 чи більш старих версіях!"
+ no_ie: "На жаль, CodeCombat не працює в IE8 чи більш старих версіях!"
no_mobile: "CodeCombat не призначений для мобільних приладів і може не працювати!"
play: "Грати"
old_browser: "Вибачте, але ваш браузер дуже старий для гри CodeCombat"
- old_browser_suffix: "Ви все одно можете спробувати, хоча наврядче вийде"
-# campaign: "Campaign"
+ old_browser_suffix: "Ви все одно можете спробувати, хоча навряд чи вийде"
+ campaign: "Кампанія"
for_beginners: "Для новачків"
multiplayer: "Командна гра"
for_developers: "Для розробників"
play:
choose_your_level: "Оберіть свій рівень"
- adventurer_prefix: "Ви можете грати будь-який рівень з наведених нижче або обговорювати рівні на "
- adventurer_forum: "форумі Шукачів Пригод"
+ adventurer_prefix: "Ви можете грати у будь-який рівень з наведених нижче або обговорювати рівні на "
+ adventurer_forum: "форумі Шукачів пригод"
adventurer_suffix: "."
campaign_beginner: "Кампанія для початківців"
campaign_beginner_description: "... у якій ви навчитеся магії програмування."
@@ -85,41 +85,41 @@ module.exports = nativeDescription: "українська мова", englishDesc
campaign_multiplayer: "Арени для мультиплеєра"
campaign_multiplayer_description: "... в яких ви програмуєте віч-на-віч із іншими гравцями."
campaign_player_created: "Рівні, створені гравцями"
- campaign_player_created_description: "... у яких ви сражаєтеся проти креативності ваших друзів-Архитекторів."
+ campaign_player_created_description: "... у яких ви змагаєтесь у креативності із вашими друзями-Архітекторами."
level_difficulty: "Складність: "
-# play_as: "Play As "
-# spectate: "Spectate"
+ play_as: "Грати як"
+ spectate: "Спостерігати"
contact:
contact_us: "Зв'язатися з CodeCombat"
- welcome: "Ми раді вашому повідомленню! Скористайтеся цією формою, щоб відправити email."
- contribute_prefix: "Якщо ви зацікавлені у співпраці, зайдіть на нашу "
+ welcome: "Ми раді вашому повідомленню! Скористайтеся цією формою, щоб надіслати email."
+ contribute_prefix: "Якщо ви зацікавлені у співпраці, завітайте на нашу "
contribute_page: "сторінку учасників"
contribute_suffix: "!"
forum_prefix: "Для будь-яких публичних обговорень, будь ласка, використовуйте "
forum_page: "наш форум"
forum_suffix: "."
- send: "Відправити фідбек"
+ send: "Надіслати фідбек"
diplomat_suggestion:
title: "Допоможіть перекласти CodeCombat!"
sub_heading: "Нам потрібні ваші мовні таланти."
- pitch_body: "Ми створюємо CodeCombat англійською, але в нас вже є гравці зі всього світу. Багато хто з них хоче грати українською, але не говорить англійською, тому, якщо ви знаєте обидві мови, обміркуйте можливість стати Дипломатом і допомогти перекласти сайт CodeCombat та всі рівні на українську."
- missing_translations: "Поки ми не переклали все на українську, ви будете бачити англійський текст там, де українська ще недоступна."
- learn_more: "Узнати, як стати Дипломатом"
- subscribe_as_diplomat: "Записатися у Дипломати"
+ pitch_body: "Ми створюємо CodeCombat англійською, але в нас вже є гравці по всьому світі. Багато хто з них хоче грати українською, але не говорить англійською, тому, якщо ви знаєте обидві мови, обміркуйте можливість стати Дипломатом і допомогти перекласти сайт CodeCombat та всі рівні українською."
+ missing_translations: "Поки ми не переклали все українською, ви будете бачити англійський текст там, де українська ще недоступна."
+ learn_more: "Дізнатися, як стати Дипломатом"
+ subscribe_as_diplomat: "Записатися в Дипломати"
wizard_settings:
title: "Налаштування"
customize_avatar: "Налаштувати аватар"
clothes: "Одяг"
-# trim: "Trim"
-# cloud: "Cloud"
- spell: "аклинанняЗ"
+ trim: "Оздоблення"
+ cloud: "Хмаринка"
+ spell: "Закляття"
boots: "Черевики"
-# hue: "Hue"
-# saturation: "Saturation"
-# lightness: "Lightness"
+ hue: "Відтінок"
+ saturation: "Насиченість"
+ # lightness: "Яскравість"
account_settings:
title: "Налаштування акаунта"
@@ -130,16 +130,16 @@ module.exports = nativeDescription: "українська мова", englishDesc
wizard_tab: "Персонаж"
password_tab: "Пароль"
emails_tab: "Email-адреси"
-# admin: "Admin"
+ admin: "Aдмін"
gravatar_select: "Оберіть, яке фото з Gravatar використовувати"
gravatar_add_photos: "Додайте фото та зменшені зображення до акаунта Gravatar, пов'язаного з вашою email-адресою, щоб обрати зображення"
gravatar_add_more_photos: "Додайти більше фото до вашого акаунта Gravatar, щоб вони були доступні тут."
- wizard_color: "Колір волосся персонажа"
+ wizard_color: "Колір одягу персонажа"
new_password: "Новий пароль"
new_password_verify: "Підтвердження паролю"
email_subscriptions: "Email-підписки"
email_announcements: "Оголошення"
-# email_notifications: "Notifications"
+ email_notifications: "Нотифікації"
email_notifications_description: "Отримувати періодичні нагадування для Вашого акаунта."
email_announcements_description: "Отримувати електронні листи про останні новини CodeCombat."
contributor_emails: "Підписки за класами учасників"
@@ -149,7 +149,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
email_toggle: "Обрати все"
error_saving: "Помилка при збереженні"
saved: "Зміни збережено"
- password_mismatch: "Паролі не співпадають."
+ password_mismatch: "Паролі не збігаються."
account_profile:
edit_settings: "Змінити налаштування"
@@ -185,10 +185,10 @@ module.exports = nativeDescription: "українська мова", englishDesc
victory_title_prefix: ""
victory_title_suffix: " закінчено"
victory_sign_up: "Підписатися на оновлення"
- victory_sign_up_poke: "Хочете отримувати останні новини на email? Створіть безкоштовний акаунт, і ми будемо тримати вас в курсі!"
+ victory_sign_up_poke: "Хочете отримувати останні новини на email? Створіть безкоштовний акаунт, і ми будемо тримати вас у курсі!"
victory_rate_the_level: "Оцінити рівень: "
-# victory_rank_my_game: "Rank My Game"
-# victory_ranking_game: "Submitting..."
+ victory_rank_my_game: "Оцінити мою гру"
+ victory_ranking_game: "Надсилання..."
# victory_return_to_ladder: "Return to Ladder"
victory_play_next_level: "Наступний рівень"
victory_go_home: "На головну"
@@ -198,7 +198,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
multiplayer_title: "Налаштування мультиплеєра"
multiplayer_link_description: "Поділіться цим посиланням з будь-ким, щоб вони приєдналися до вас."
multiplayer_hint_label: "Підказка:"
- multiplayer_hint: " Натисніть на посилання, щоб обрати всіх, та натисніть Apple-C або Ctrl-C, щоб скопіювати посилання."
+ multiplayer_hint: "Натисніть на посилання, щоб обрати всіх, та натисніть Apple-C або Ctrl-C, щоб скопіювати посилання."
multiplayer_coming_soon: "Скоро - більше можливостей у мультиплеєрі!"
guide_title: "Посібник"
tome_minion_spells: "Закляття ваших міньонів"
@@ -206,18 +206,18 @@ module.exports = nativeDescription: "українська мова", englishDesc
tome_other_units: "Інші юніти"
tome_cast_button_castable: "Читати закляття"
tome_cast_button_casting: "Закляття читається"
- tome_cast_button_cast: "Закляття прочитане"
+ tome_cast_button_cast: "Закляття прочитано"
tome_autocast_delay: "Затримка автоматичного читання"
tome_select_spell: "Оберіть закляття"
tome_select_a_thang: "Оберіть когось для "
tome_available_spells: "Доступні закляття"
hud_continue: "Продовжити (натисніть shift-space)"
- spell_saved: "Заклинання збережено"
+ spell_saved: "Закляття збережено"
skip_tutorial: "Пропустити (esc)"
# editor_config: "Editor Config"
# editor_config_title: "Editor Configuration"
# editor_config_keybindings_label: "Key Bindings"
-# editor_config_keybindings_default: "Default (Ace)"
+ editor_config_keybindings_default: "За замовчуванням (Ace)"
# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors."
# editor_config_invisibles_label: "Show Invisibles"
# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs."
@@ -231,36 +231,36 @@ module.exports = nativeDescription: "українська мова", englishDesc
# av_entities_sub_title: "Entities"
av_entities_users_url: "користувачі"
# av_entities_active_instances_url: "Active Instances"
- av_other_sub_title: "Ынше"
+ av_other_sub_title: "Інше"
# av_other_debug_base_url: "Base (for debugging base.jade)"
u_title: "Список користувачів"
lg_title: "Останні ігри"
editor:
-# main_title: "CodeCombat Editors"
-# main_description: "Build your own levels, campaigns, units and educational content. We provide all the tools you need!"
-# article_title: "Article Editor"
-# article_description: "Write articles that give players overviews of programming concepts which can be used across a variety of levels and campaigns."
-# thang_title: "Thang Editor"
-# thang_description: "Build units, defining their default logic, graphics and audio. Currently only supports importing Flash exported vector graphics."
-# level_title: "Level Editor"
-# level_description: "Includes the tools for scripting, uploading audio, and constructing custom logic to create all sorts of levels. Everything we use ourselves!"
-# 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, "
- contact_us: "Зв’язатися з нами!"
- hipchat_prefix: "Ви можете також знайти нас в нашому"
-# hipchat_url: "HipChat room."
+ main_title: "Редактори CodeCombat"
+ main_description: "Створюйте власні рівні, кампанії, юнітів та навчальний контекнт. Ми надаємо всіх необхидних інструментів! "
+ article_title: "Редактор статей"
+ article_description: "Пішіть статті, які будуть знайомити гравців із концепціями програмування, що можуть бути викорістани в різних рівнях та кампаніях."
+ thang_title: "Редактор об'єктів"
+ thang_description: "Створюйте юнітів, візначайте їхню логіку, графіку та аудіо. Наразі підтримується тільки імпорт векторної flash-графіки."
+ level_title: "Редактор рівнів"
+ level_description: "Включає інструменти для створення сценаріїв, аудіо й конструювання логіки задля створення усіх типів рівнив. Усе, що ми самі використовуємо! "
+ security_notice: "Багато базових можливостей у цих редакторах зараз не доступні за замовчуванням. Як тільки ми вдосконалимо безпеку цих систем, вони стануть загальнодоступними. Якщо ви хочете використовувати ці можливості раніше, "
+ contact_us: "зв’яжіться з нами!"
+ hipchat_prefix: "Ви можете також знайти нас в нашій"
+ hipchat_url: "кімнаті HipChat."
# revert: "Revert"
# revert_models: "Revert Models"
# 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_thangs_title: "Current Thangs"
-# level_tab_thangs_conditions: "Starting Conditions"
-# level_tab_thangs_add: "Add Thangs"
-# level_settings_title: "Settings"
+ level_tab_thangs: "Об'єкти"
+ level_tab_scripts: "Скрипти"
+ level_tab_settings: "Налаштування"
+ level_tab_components: "Компоненти"
+ level_tab_systems: "Системи"
+ level_tab_thangs_title: "Поточні об'єкти"
+ level_tab_thangs_conditions: "Початковий статус"
+ level_tab_thangs_add: "Додати об'єкти"
+ level_settings_title: "Налаштування"
# level_component_tab_title: "Current Components"
# level_component_btn_new: "Create New Component"
# level_systems_tab_title: "Current Systems"
diff --git a/app/styles/editor/level/thangs_tab.sass b/app/styles/editor/level/thangs_tab.sass
index e643303bd..9edfe6958 100644
--- a/app/styles/editor/level/thangs_tab.sass
+++ b/app/styles/editor/level/thangs_tab.sass
@@ -75,13 +75,14 @@
right: 0
top: 0
bottom: 0
-
+
#thangs-list
- position: absolute
+ position: relative
right: 0
- top: 40px
- bottom: 0
+ top: 10px
+ bottom: 10px
overflow: scroll
+ height: 100%
h3
margin: 0 -20px 0 0
diff --git a/app/styles/play/ladder.sass b/app/styles/play/ladder.sass
index 037a4a8c4..ba99c6948 100644
--- a/app/styles/play/ladder.sass
+++ b/app/styles/play/ladder.sass
@@ -5,8 +5,12 @@
.tab-pane
margin-top: 10px
+ .rank-cell, .fight-cell
+ text-align: center
+
.score-cell
width: 50px
+ text-align: center
.play-button
margin-bottom: 10px
@@ -22,6 +26,12 @@
white-space: nowrap
overflow: hidden
+ .ellipsis-row
+ text-align: center
+
+ td
+ padding: 1px 2px
+
tr.stale
opacity: 0.5
diff --git a/app/templates/editor/level/add_thangs.jade b/app/templates/editor/level/add_thangs.jade
new file mode 100644
index 000000000..09857d0ad
--- /dev/null
+++ b/app/templates/editor/level/add_thangs.jade
@@ -0,0 +1,10 @@
+h3(data-i18n="editor.level_tab_thangs_add") Add Thangs
+input(type="text", id="thang-search")
+#thangs-list
+ for group in groups
+ h4= group.name
+ for thangType in group.thangs
+ div.add-thang-palette-icon(data-thang-type=thangType.name)
+ - path = '/file/db/thang.type/'+thangType.original+'/portrait.png'
+ img(title="Add " + thangType.name, src=path, alt="")
+ div.clearfix
\ No newline at end of file
diff --git a/app/templates/editor/level/thangs_tab.jade b/app/templates/editor/level/thangs_tab.jade
index 3e0311b85..f70446bd6 100644
--- a/app/templates/editor/level/thangs_tab.jade
+++ b/app/templates/editor/level/thangs_tab.jade
@@ -21,14 +21,5 @@
#canvas-left-gradient.gradient
#canvas-top-gradient.gradient
-.add-thangs-palette.thangs-column
- h3(data-i18n="editor.level_tab_thangs_add") Add Thangs
- #thangs-list
- for group in groups
- h4= group.name
- for thangType in group.thangs
- div.add-thang-palette-icon(data-thang-type=thangType.name)
- - path = '/file/db/thang.type/'+thangType.original+'/portrait.png'
- img(title="Add " + thangType.name, src=path, alt="")
- div.clearfix
+.add-thangs-palette.thangs-column#add-thangs-column
#editor-level-thang-edit.secret
\ No newline at end of file
diff --git a/app/templates/home.jade b/app/templates/home.jade
index ba496db05..9e5d3be94 100644
--- a/app/templates/home.jade
+++ b/app/templates/home.jade
@@ -5,7 +5,7 @@ block content
h1#site-slogan(data-i18n="home.slogan") Learn to Code JavaScript by Playing a Game
#trailer-wrapper
-
+
img(src="/images/pages/home/video_border.png")
hr
diff --git a/app/templates/play/ladder.jade b/app/templates/play/ladder.jade
index 3d445da64..d9f8bd6c0 100644
--- a/app/templates/play/ladder.jade
+++ b/app/templates/play/ladder.jade
@@ -47,3 +47,13 @@ block content
if false && me.isAdmin()
p
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_for") Games simulated for you:
+ |
+ span#simulated-for-you= me.get('simulatedFor') || 0
\ No newline at end of file
diff --git a/app/templates/play/ladder/ladder_tab.jade b/app/templates/play/ladder/ladder_tab.jade
index 2cbf9510e..3d41c4ec5 100644
--- a/app/templates/play/ladder/ladder_tab.jade
+++ b/app/templates/play/ladder/ladder_tab.jade
@@ -3,23 +3,39 @@ div#columns.row
div.column.col-md-6
table.table.table-bordered.table-condensed.table-hover
tr
- th(colspan=4, style="color: #{team.primaryColor}")
+ th
+ th(colspan=3, style="color: #{team.primaryColor}")
span= team.name
span
span(data-i18n="ladder.leaderboard") Leaderboard
tr
- th(data-i18n="general.rank") Rank
+ th
th(data-i18n="general.score") Score
th(data-i18n="general.name").name-col-cell Name
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
tr(class=myRow ? "success" : "")
td.rank-cell= rank + 1
td.score-cell= Math.round(session.get('totalScore') * 100)
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}")
- span(data-i18n="ladder.battle_as") Battle as
- | #{team.otherTeam}!
\ No newline at end of file
+ span(data-i18n="ladder.fight") Fight!
+
+ if !inTheTop && ! me.get('anonymous')
+ 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!
\ No newline at end of file
diff --git a/app/templates/play/ladder/my_matches_tab.jade b/app/templates/play/ladder/my_matches_tab.jade
index 4fcfa159c..6b235148a 100644
--- a/app/templates/play/ladder/my_matches_tab.jade
+++ b/app/templates/play/ladder/my_matches_tab.jade
@@ -58,6 +58,7 @@ div#columns.row
span(data-i18n="ladder.watch_victory") Watch your victory
else
span(data-i18n="ladder.defeat_the") Defeat the
+ |
| #{team.otherTeam}
if !team.matches.length
diff --git a/app/views/editor/level/add_thangs_view.coffee b/app/views/editor/level/add_thangs_view.coffee
new file mode 100644
index 000000000..4a0d6f776
--- /dev/null
+++ b/app/views/editor/level/add_thangs_view.coffee
@@ -0,0 +1,81 @@
+View = require 'views/kinds/CocoView'
+add_thangs_template = require 'templates/editor/level/add_thangs'
+ThangType = require 'models/ThangType'
+CocoCollection = require 'models/CocoCollection'
+
+class ThangTypeSearchCollection extends CocoCollection
+ url: '/db/thang.type/search?project=true'
+ model: ThangType
+
+ addTerm: (term) ->
+ @url += "&term=#{term}" if term
+
+module.exports = class AddThangsView extends View
+ id: "add-thangs-column"
+ className: 'add-thangs-palette thangs-column'
+ template: add_thangs_template
+ startsLoading: false
+
+ events:
+ 'keyup input#thang-search': 'runSearch'
+
+ constructor: (options) ->
+ super options
+ @world = options.world
+ @thangTypes = @supermodel.getCollection new ThangTypeSearchCollection() # should load depended-on Components, too
+ @thangTypes.once 'sync', @onThangTypesLoaded
+ @thangTypes.fetch()
+
+ onThangTypesLoaded: =>
+ return if @destroyed
+ @render() # do it again but without the loading screen
+
+ getRenderData: (context={}) ->
+ context = super(context)
+ if @searchModels
+ models = @searchModels
+ else
+ models = @supermodel.getModels(ThangType)
+
+ thangTypes = (thangType.attributes for thangType in models)
+ thangTypes = _.uniq thangTypes, false, 'original'
+ thangTypes = _.reject thangTypes, kind: 'Mark'
+ groupMap = {}
+ for thangType in thangTypes
+ groupMap[thangType.kind] ?= []
+ groupMap[thangType.kind].push thangType
+
+ groups = []
+ for groupName in Object.keys(groupMap).sort()
+ someThangTypes = groupMap[groupName]
+ someThangTypes = _.sortBy someThangTypes, 'name'
+ group =
+ name: groupName
+ thangs: someThangTypes
+ groups.push group
+
+ context.thangTypes = thangTypes
+ context.groups = groups
+ context
+
+ afterRender: ->
+ return if @startsLoading
+ super()
+
+ runSearch: (e) =>
+ if e?.which is 27
+ @onEscapePressed()
+ term = @$el.find('input#thang-search').val()
+ return unless term isnt @lastSearch
+
+ @searchModels = @thangTypes.filter (model) ->
+ return true unless term
+ regExp = new RegExp term, 'i'
+ return model.get('name').match regExp
+ @render()
+ @$el.find('input#thang-search').focus().val(term)
+ @lastSearch = term
+
+ onEscapePressed: ->
+ @$el.find('input#thang-search').val("")
+ @runSearch
\ No newline at end of file
diff --git a/app/views/editor/level/thangs_tab_view.coffee b/app/views/editor/level/thangs_tab_view.coffee
index be020ff6f..2017ace32 100644
--- a/app/views/editor/level/thangs_tab_view.coffee
+++ b/app/views/editor/level/thangs_tab_view.coffee
@@ -1,4 +1,5 @@
View = require 'views/kinds/CocoView'
+AddThangsView = require './add_thangs_view'
thangs_template = require 'templates/editor/level/thangs_tab'
Level = require 'models/Level'
ThangType = require 'models/ThangType'
@@ -104,12 +105,20 @@ module.exports = class ThangsTabView extends View
context.groups = groups
context
+ onWindowResize: (e) ->
+ $('#thangs-list').height('100%')
+ thangsHeaderHeight = $('#thangs-header').height()
+ oldHeight = $('#thangs-list').height()
+ $('#thangs-list').height(oldHeight - thangsHeaderHeight - 80)
+
afterRender: ->
return if @startsLoading
super()
$('.tab-content').click @selectAddThang
$('#thangs-list').bind 'mousewheel', @preventBodyScrollingInThangList
@$el.find('#extant-thangs-filter button:first').button('toggle')
+ $(window).resize @onWindowResize
+ @addThangsView = @insertSubView new AddThangsView world: @world, supermodel: @supermodel
onFilterExtantThangs: (e) ->
@$el.find('#extant-thangs-filter button.active').button('toggle')
@@ -145,6 +154,9 @@ module.exports = class ThangsTabView extends View
@thangsTreema.open()
@onThangsChanged() # Initialize the World with Thangs
@initSurface()
+ thangsHeaderHeight = $('#thangs-header').height()
+ oldHeight = $('#thangs-list').height()
+ $('#thangs-list').height(oldHeight - thangsHeaderHeight)
initSurface: ->
surfaceCanvas = $('canvas#surface', @$el)
diff --git a/app/views/kinds/RootView.coffee b/app/views/kinds/RootView.coffee
index b27ebb92f..87752cebf 100644
--- a/app/views/kinds/RootView.coffee
+++ b/app/views/kinds/RootView.coffee
@@ -38,7 +38,8 @@ module.exports = class RootView extends CocoView
location.hash = ''
location.hash = hash
@buildLanguages()
-
+ #@$('.antiscroll-wrap').antiscroll() # not yet, buggy
+
afterRender: ->
super(arguments...)
@chooseTab(location.hash.replace('#','')) if location.hash
diff --git a/app/views/play/ladder/ladder_tab.coffee b/app/views/play/ladder/ladder_tab.coffee
index 466b0a402..226ab5f54 100644
--- a/app/views/play/ladder/ladder_tab.coffee
+++ b/app/views/play/ladder/ladder_tab.coffee
@@ -29,9 +29,7 @@ module.exports = class LadderTabView extends CocoView
refreshLadder: ->
for team in @teams
@leaderboards[team.id]?.off 'sync'
-# teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id
- teamSession = null
-# console.log "Team session: #{JSON.stringify teamSession}"
+ teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id
@leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession)
@leaderboards[team.id].once 'sync', @onLeaderboardLoaded, @
@@ -55,51 +53,43 @@ module.exports = class LadderTabView extends CocoView
class LeaderboardData
constructor: (@level, @team, @session) ->
_.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: limit})
- @topPlayers.fetch()
- @topPlayers.comparator = (model) ->
- return -model.get('totalScore')
- @topPlayers.sort()
+ @topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: 20})
+ promises = []
+ promises.push @topPlayers.fetch()
+ @topPlayers.once 'sync', @onceLeaderboardPartLoaded, @
- @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
-# 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.
+ onLoad: =>
@loaded = true
@trigger 'sync'
- return
- if @session
- if @topPlayers.loaded # and @playersAbove.loaded and @playersBelow.loaded
- @loaded = true
- @fetchNames()
- else
- @loaded = true
- @fetchNames()
-
- fetchNames: ->
- sessionCollections = [@topPlayers, @playersAbove, @playersBelow]
- sessionCollections = (s for s in sessionCollections when s)
- ids = []
- for collection in sessionCollections
- ids.push model.get('creator') for model in collection.models
-
- success = (nameMap) =>
- for collection in sessionCollections
- 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
- })
+ # TODO: cache user ids -> names mapping, and load them here as needed,
+ # and apply them to sessions. Fetching each and every time is too costly.
+
+ inTopSessions: ->
+ return me.id in (session.attributes.creator for session in @topPlayers.models)
+
+ nearbySessions: ->
+ return unless @session
+ l = []
+ above = @playersAbove.models
+ above.reverse()
+ l = l.concat(above)
+ l.push @session
+ l = l.concat(@playersBelow.models)
+ if @myRank
+ startRank = @myRank - 4
+ session.rank = startRank + i for session, i in l
+ l
\ No newline at end of file
diff --git a/app/views/play/ladder/my_matches_tab.coffee b/app/views/play/ladder/my_matches_tab.coffee
index 2772defa5..d8729051e 100644
--- a/app/views/play/ladder/my_matches_tab.coffee
+++ b/app/views/play/ladder/my_matches_tab.coffee
@@ -88,8 +88,8 @@ module.exports = class MyMatchesTabView extends CocoView
# Let's try being independent of time.
times = (i for s, i in scoreHistory)
scores = (s[1] for s in scoreHistory)
- lowest = _.min scores.concat([0])
- highest = _.max scores.concat(50)
+ lowest = _.min scores #.concat([0])
+ highest = _.max scores #.concat(50)
scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores)
team.chartData = times.join(',') + '|' + scores.join(',')
team.minScore = Math.round(100 * lowest)
diff --git a/app/views/play/ladder_view.coffee b/app/views/play/ladder_view.coffee
index 660c28485..653f1961d 100644
--- a/app/views/play/ladder_view.coffee
+++ b/app/views/play/ladder_view.coffee
@@ -72,23 +72,18 @@ module.exports = class LadderView extends RootView
@showPlayModal(hash) if @sessions.loaded
fetchSessionsAndRefreshViews: ->
+ return if @destroyed or application.userIsIdle or @$el.find('#simulate.active').length or (new Date() - 2000 < @lastRefreshTime) or @startsLoading
@sessions.fetch({"success": @refreshViews})
refreshViews: =>
return if @destroyed or application.userIsIdle
- if @$el.find("#ladder.active").length
- return if new Date() - 2000 < @lastLadderRefreshTime
- @lastLadderRefreshTime = new Date()
- @ladderTab.refreshLadder()
- console.log "Refreshing ladder."
- if @$el.find("#my-matches.active").length
- return if new Date() - 2000 < @lastMatchesRefreshTime
- @lastMatchesRefreshTime = new Date()
- @myMatchesTab.refreshMatches()
- console.log "Refreshing matches view."
+ @lastRefreshTime = new Date()
+ @ladderTab.refreshLadder()
+ @myMatchesTab.refreshMatches()
+ console.log "Refreshed sessions for ladder and matches."
onIdleChanged: (e) ->
- @refreshViews() unless e.idle
+ @fetchSessionsAndRefreshViews() unless e.idle
# Simulations
diff --git a/bower.json b/bower.json
index 231d6e1c7..b499ee391 100644
--- a/bower.json
+++ b/bower.json
@@ -32,7 +32,7 @@
"firepad": "~0.1.2",
"marked": "~0.3.0",
"moment": "~2.5.0",
- "aether": "~0.1.10",
+ "aether": "~0.1.14",
"underscore.string": "~2.3.3",
"firebase": "~1.0.2",
"catiline": "~2.9.3"
diff --git a/server/commons/logging.coffee b/server/commons/logging.coffee
index 1a8e4d7ed..37c6b5668 100644
--- a/server/commons/logging.coffee
+++ b/server/commons/logging.coffee
@@ -5,4 +5,4 @@ module.exports.setup = ->
winston.add(winston.transports.Console,
colorize: true,
timestamp: true
- )
\ No newline at end of file
+ )
diff --git a/server/commons/queue.coffee b/server/commons/queue.coffee
index 10710e340..64b71ae64 100644
--- a/server/commons/queue.coffee
+++ b/server/commons/queue.coffee
@@ -193,15 +193,15 @@ class MongoQueue extends events.EventEmitter
scheduledVisibilityTime:
$lte: new Date()
- options =
- sort: 'scheduledVisibilityTime'
+ #options =
+ # sort: 'scheduledVisibilityTime'
update =
$set:
receiptHandle: @_generateRandomReceiptHandle()
scheduledVisibilityTime: @_constructDefaultVisibilityTimeoutDate()
- @Message.findOneAndUpdate conditions, update, options, (err, data) =>
+ @Message.findOneAndUpdate conditions, update, (err, data) =>
return @emit 'error',err,data if err?
originalData = data
@@ -286,4 +286,4 @@ class MongoMessage
changeMessageVisibilityTimeout: (secondsFromFunctionCall, callback) ->
@parentQueue.changeMessageVisibilityTimeout secondsFromFunctionCall,@getReceiptHandle(), callback
- getReceiptHandle: -> @originalMessage.receiptHandle
\ No newline at end of file
+ getReceiptHandle: -> @originalMessage.receiptHandle
diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee
index 81a5e6166..21a0bcc42 100644
--- a/server/levels/level_handler.coffee
+++ b/server/levels/level_handler.coffee
@@ -1,5 +1,6 @@
Level = require('./Level')
Session = require('./sessions/LevelSession')
+User = require '../users/User'
SessionHandler = require('./sessions/level_session_handler')
Feedback = require('./feedbacks/LevelFeedback')
Handler = require('../commons/Handler')
@@ -29,9 +30,11 @@ LevelHandler = class LevelHandler extends Handler
getByRelationship: (req, res, args...) ->
return @getSession(req, res, args[0]) if args[1] is 'session'
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 @getFeedback(req, res, args[0]) if args[1] is 'feedback'
return @getRandomSessionPair(req,res,args[0]) if args[1] is 'random_session_pair'
+ return @getLeaderboardFriends(req, res, args[0]) if args[1] is 'leaderboard_friends'
return @sendNotFoundError(res)
@@ -116,28 +119,11 @@ LevelHandler = class LevelHandler extends Handler
if err then @sendDatabaseError(res, err) else @sendSuccess res, results
getLeaderboard: (req, res, id) ->
- @validateLeaderboardRequestParameters req
- [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
+ sessionsQueryParameters = @makeLeaderboardQueryParameters(req, id)
sortParameters =
"totalScore": req.query.order
-
- selectProperties = [
- 'totalScore'
- 'creatorName'
- 'creator'
- ]
+ selectProperties = ['totalScore', 'creatorName', 'creator']
query = Session
.find(sessionsQueryParameters)
@@ -149,7 +135,59 @@ LevelHandler = class LevelHandler extends Handler
return @sendDatabaseError(res, err) if err
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) ->
+ friendIDs = req.body.friendIDs or []
+ return res.send([]) unless friendIDs.length
+
+ query = User.find({facebookID:{$in:friendIDs}})
+ .select('facebookID name')
+ .lean()
+
+ query.exec (err, userResults) ->
+ return res.send([]) unless userResults.length
+ [id, version] = id.split('.')
+ userIDs = (r._id+'' for r in userResults)
+ q = {'level.original':id, 'level.majorVersion': parseInt(version), creator: {$in:userIDs}, totalScore:{$exists:true}}
+ query = Session.find(q)
+ .select('creator creatorName totalScore team')
+ .lean()
+
+ query.exec (err, sessionResults) ->
+ return res.send([]) unless sessionResults.length
+ userMap = {}
+ userMap[u._id] = u.facebookID for u in userResults
+ session.facebookID = userMap[session.creator] for session in sessionResults
+ res.send(sessionResults)
+
getRandomSessionPair: (req, res, slugOrID) ->
findParameters = {}
if Handler.isID slugOrID
@@ -194,15 +232,6 @@ LevelHandler = class LevelHandler extends Handler
@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) ->
return @sendNotFoundError(res) unless req.user
@fetchLevelByIDAndHandleErrors id, req, res, (err, level) =>
diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee
index b97ede18e..f4fc91a91 100644
--- a/server/queues/scoring.coffee
+++ b/server/queues/scoring.coffee
@@ -9,11 +9,12 @@ mongoose = require 'mongoose'
queues = require '../commons/queue'
LevelSession = require '../levels/sessions/LevelSession'
Level = require '../levels/Level'
+User = require '../users/User'
TaskLog = require './task/ScoringTask'
bayes = new (require 'bayesian-battle')()
scoringTaskQueue = undefined
-scoringTaskTimeoutInSeconds = 180
+scoringTaskTimeoutInSeconds = 240
module.exports.setup = (app) -> connectToScoringQueue()
@@ -24,7 +25,7 @@ connectToScoringQueue = ->
if error? then throw new Error "There was an error registering the scoring queue: #{error}"
scoringTaskQueue = data
log.info "Connected to scoring task queue!"
-
+
module.exports.messagesInQueueCount = (req, res) ->
scoringTaskQueue.totalMessagesInQueue (err, count) ->
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) ->
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
originalSessionTeam = clientResponseObject.originalSessionTeam
originalSessionRank = parseInt clientResponseObject.originalSessionRank
@@ -197,8 +201,8 @@ determineIfSessionShouldContinueAndUpdateLog = (sessionID, sessionRank, cb) ->
updatedSession = updatedSession.toObject()
totalNumberOfGamesPlayed = updatedSession.numberOfWinsAndTies + updatedSession.numberOfLosses
- if totalNumberOfGamesPlayed < 5
- console.log "Number of games played is less than 5, continuing..."
+ if totalNumberOfGamesPlayed < 10
+ console.log "Number of games played is less than 10, continuing..."
cb null, true
else
ratio = (updatedSession.numberOfLosses) / (totalNumberOfGamesPlayed)
@@ -225,9 +229,9 @@ findNearestBetterSessionID = (levelOriginalID, levelMajorVersion, sessionID, ses
submittedCode:
$exists: true
team: opposingTeam
-
+
if opponentSessionTotalScore < 30
- queryParameters["totalScore"]["$gt"] = opponentSessionTotalScore + 1
+ queryParameters["totalScore"]["$gt"] = opponentSessionTotalScore + 2
limitNumber = 1
@@ -265,6 +269,11 @@ calculateOpposingTeam = (sessionTeam) ->
opposingTeams = _.pull teams, sessionTeam
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) ->
if isUserAnonymous req then return callback null, false
@@ -364,7 +373,7 @@ generateTaskPairs = (submittedSessions, sessionToScore) ->
return taskPairs
sendTaskPairToQueue = (taskPair, callback) ->
- scoringTaskQueue.sendMessage {sessions: taskPair}, 0, (err,data) -> callback? err,data
+ scoringTaskQueue.sendMessage {sessions: taskPair}, 5, (err,data) -> callback? err,data
getUserIDFromRequest = (req) -> if req.user? then return req.user._id else return null
diff --git a/server/routes/mail.coffee b/server/routes/mail.coffee
index ae7d1efd7..9fb277698 100644
--- a/server/routes/mail.coffee
+++ b/server/routes/mail.coffee
@@ -156,8 +156,8 @@ getScoreHistoryGraphURL = (session, daysAgo) ->
times = (s[0] for s in scoreHistory)
times = ((100 * (t - times[0]) / (times[times.length - 1] - times[0])).toFixed(1) for t in times)
scores = (s[1] for s in scoreHistory)
- lowest = _.min scores.concat([0])
- highest = _.max scores.concat(50)
+ lowest = _.min scores #.concat([0])
+ highest = _.max scores #.concat(50)
scores = (Math.round(100 * (s - lowest) / (highest - lowest)) for s in scores)
currentScore = Math.round scoreHistory[scoreHistory.length - 1][1] * 100
minScore = Math.round(100 * lowest)
diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee
index 919588c0a..5d6e9be06 100644
--- a/server/users/user_handler.coffee
+++ b/server/users/user_handler.coffee
@@ -18,7 +18,7 @@ UserHandler = class UserHandler extends Handler
'name', 'photoURL', 'password', 'anonymous', 'wizardColor1', 'volume',
'firstName', 'lastName', 'gender', 'facebookID', 'emailSubscriptions',
'testGroupNumber', 'music', 'hourOfCode', 'hourOfCodeComplete', 'preferredLanguage',
- 'wizard', 'aceConfig'
+ 'wizard', 'aceConfig', 'simulatedBy', 'simulatedFor'
]
jsonSchema: schema
@@ -108,17 +108,17 @@ UserHandler = class UserHandler extends Handler
if req.user?._id.equals(id)
return @sendSuccess(res, @formatEntity(req, req.user))
super(req, res, id)
-
+
getNamesByIds: (req, res) ->
ids = req.query.ids or req.body.ids
ids = ids.split(',') if _.isString ids
ids = _.uniq ids
-
+
# 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.
returnWizard = req.query.wizard or req.body.wizard
query = if returnWizard then {name:1, wizard:1} else {name:1}
-
+
makeFunc = (id) ->
(callback) ->
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 {}})
else
callback(null, document?.get('name') or '')
-
+
funcs = {}
for id in ids
return errors.badInput(res, "Given an invalid id: #{id}") unless Handler.isID(id)
funcs[id] = makeFunc(id)
-
+
async.parallel funcs, (err, results) ->
return errors.serverError err if err
res.send results
diff --git a/server/users/user_schema.coffee b/server/users/user_schema.coffee
index 650d680d6..d56463d3e 100644
--- a/server/users/user_schema.coffee
+++ b/server/users/user_schema.coffee
@@ -51,6 +51,9 @@ UserSchema = c.object {},
indentGuides: {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'
module.exports = UserSchema
diff --git a/vendor/scripts/antiscroll.js b/vendor/scripts/antiscroll.js
new file mode 100644
index 000000000..2de1812d6
--- /dev/null
+++ b/vendor/scripts/antiscroll.js
@@ -0,0 +1,471 @@
+(function ($) {
+
+ /**
+ * Augment jQuery prototype.
+ */
+
+ $.fn.antiscroll = function (options) {
+ return this.each(function () {
+ if ($(this).data('antiscroll')) {
+ $(this).data('antiscroll').destroy();
+ }
+
+ $(this).data('antiscroll', new $.Antiscroll(this, options));
+ });
+ };
+
+ /**
+ * Expose constructor.
+ */
+
+ $.Antiscroll = Antiscroll;
+
+ /**
+ * Antiscroll pane constructor.
+ *
+ * @param {Element|jQuery} main pane
+ * @parma {Object} options
+ * @api public
+ */
+
+ function Antiscroll (el, opts) {
+ this.el = $(el);
+ this.options = opts || {};
+
+ this.x = (false !== this.options.x) || this.options.forceHorizontal;
+ this.y = (false !== this.options.y) || this.options.forceVertical;
+ this.autoHide = false !== this.options.autoHide;
+ this.padding = undefined == this.options.padding ? 2 : this.options.padding;
+
+ this.inner = this.el.find('.antiscroll-inner');
+ this.inner.css({
+ 'width': '+=' + (this.y ? scrollbarSize() : 0)
+ , 'height': '+=' + (this.x ? scrollbarSize() : 0)
+ });
+
+ this.refresh();
+ };
+
+ /**
+ * refresh scrollbars
+ *
+ * @api public
+ */
+
+ Antiscroll.prototype.refresh = function() {
+ var needHScroll = this.inner.get(0).scrollWidth > this.el.width() + (this.y ? scrollbarSize() : 0),
+ needVScroll = this.inner.get(0).scrollHeight > this.el.height() + (this.x ? scrollbarSize() : 0);
+
+ if (this.x) {
+ if (!this.horizontal && needHScroll) {
+ this.horizontal = new Scrollbar.Horizontal(this);
+ } else if (this.horizontal && !needHScroll) {
+ this.horizontal.destroy();
+ this.horizontal = null;
+ } else if (this.horizontal) {
+ this.horizontal.update();
+ }
+ }
+
+ if (this.y) {
+ if (!this.vertical && needVScroll) {
+ this.vertical = new Scrollbar.Vertical(this);
+ } else if (this.vertical && !needVScroll) {
+ this.vertical.destroy();
+ this.vertical = null;
+ } else if (this.vertical) {
+ this.vertical.update();
+ }
+ }
+ };
+
+ /**
+ * Cleans up.
+ *
+ * @return {Antiscroll} for chaining
+ * @api public
+ */
+
+ Antiscroll.prototype.destroy = function () {
+ if (this.horizontal) {
+ this.horizontal.destroy();
+ this.horizontal = null
+ }
+ if (this.vertical) {
+ this.vertical.destroy();
+ this.vertical = null
+ }
+ return this;
+ };
+
+ /**
+ * Rebuild Antiscroll.
+ *
+ * @return {Antiscroll} for chaining
+ * @api public
+ */
+
+ Antiscroll.prototype.rebuild = function () {
+ this.destroy();
+ this.inner.attr('style', '');
+ Antiscroll.call(this, this.el, this.options);
+ return this;
+ };
+
+ /**
+ * Scrollbar constructor.
+ *
+ * @param {Element|jQuery} element
+ * @api public
+ */
+
+ function Scrollbar (pane) {
+ this.pane = pane;
+ this.pane.el.append(this.el);
+ this.innerEl = this.pane.inner.get(0);
+
+ this.dragging = false;
+ this.enter = false;
+ this.shown = false;
+
+ // hovering
+ this.pane.el.mouseenter($.proxy(this, 'mouseenter'));
+ this.pane.el.mouseleave($.proxy(this, 'mouseleave'));
+
+ // dragging
+ this.el.mousedown($.proxy(this, 'mousedown'));
+
+ // scrolling
+ this.innerPaneScrollListener = $.proxy(this, 'scroll');
+ this.pane.inner.scroll(this.innerPaneScrollListener);
+
+ // wheel -optional-
+ this.innerPaneMouseWheelListener = $.proxy(this, 'mousewheel');
+ this.pane.inner.bind('mousewheel', this.innerPaneMouseWheelListener);
+
+ // show
+ var initialDisplay = this.pane.options.initialDisplay;
+
+ if (initialDisplay !== false) {
+ this.show();
+ if (this.pane.autoHide) {
+ this.hiding = setTimeout($.proxy(this, 'hide'), parseInt(initialDisplay, 10) || 3000);
+ }
+ }
+ };
+
+ /**
+ * Cleans up.
+ *
+ * @return {Scrollbar} for chaining
+ * @api public
+ */
+
+ Scrollbar.prototype.destroy = function () {
+ this.el.remove();
+ this.pane.inner.unbind('scroll', this.innerPaneScrollListener);
+ this.pane.inner.unbind('mousewheel', this.innerPaneMouseWheelListener);
+ return this;
+ };
+
+ /**
+ * Called upon mouseenter.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.mouseenter = function () {
+ this.enter = true;
+ this.show();
+ };
+
+ /**
+ * Called upon mouseleave.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.mouseleave = function () {
+ this.enter = false;
+
+ if (!this.dragging) {
+ if (this.pane.autoHide) {
+ this.hide();
+ }
+ }
+ };
+
+ /**
+ * Called upon wrap scroll.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.scroll = function () {
+ if (!this.shown) {
+ this.show();
+ if (!this.enter && !this.dragging) {
+ if (this.pane.autoHide) {
+ this.hiding = setTimeout($.proxy(this, 'hide'), 1500);
+ }
+ }
+ }
+
+ this.update();
+ };
+
+ /**
+ * Called upon scrollbar mousedown.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.mousedown = function (ev) {
+ ev.preventDefault();
+
+ this.dragging = true;
+
+ this.startPageY = ev.pageY - parseInt(this.el.css('top'), 10);
+ this.startPageX = ev.pageX - parseInt(this.el.css('left'), 10);
+
+ // prevent crazy selections on IE
+ this.el[0].ownerDocument.onselectstart = function () { return false; };
+
+ var pane = this.pane,
+ move = $.proxy(this, 'mousemove'),
+ self = this
+
+ $(this.el[0].ownerDocument)
+ .mousemove(move)
+ .mouseup(function () {
+ self.dragging = false;
+ this.onselectstart = null;
+
+ $(this).unbind('mousemove', move);
+
+ if (!self.enter) {
+ self.hide();
+ }
+ });
+ };
+
+ /**
+ * Show scrollbar.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.show = function (duration) {
+ if (!this.shown && this.update()) {
+ this.el.addClass('antiscroll-scrollbar-shown');
+ if (this.hiding) {
+ clearTimeout(this.hiding);
+ this.hiding = null;
+ }
+ this.shown = true;
+ }
+ };
+
+ /**
+ * Hide scrollbar.
+ *
+ * @api private
+ */
+
+ Scrollbar.prototype.hide = function () {
+ if (this.pane.autoHide !== false && this.shown) {
+ // check for dragging
+ this.el.removeClass('antiscroll-scrollbar-shown');
+ this.shown = false;
+ }
+ };
+
+ /**
+ * Horizontal scrollbar constructor
+ *
+ * @api private
+ */
+
+ Scrollbar.Horizontal = function (pane) {
+ this.el = $('', pane.el);
+ Scrollbar.call(this, pane);
+ };
+
+ /**
+ * Inherits from Scrollbar.
+ */
+
+ inherits(Scrollbar.Horizontal, Scrollbar);
+
+ /**
+ * Updates size/position of scrollbar.
+ *
+ * @api private
+ */
+
+ Scrollbar.Horizontal.prototype.update = function () {
+ var paneWidth = this.pane.el.width(),
+ trackWidth = paneWidth - this.pane.padding * 2,
+ innerEl = this.pane.inner.get(0)
+
+ this.el
+ .css('width', trackWidth * paneWidth / innerEl.scrollWidth)
+ .css('left', trackWidth * innerEl.scrollLeft / innerEl.scrollWidth);
+
+ return paneWidth < innerEl.scrollWidth;
+ };
+
+ /**
+ * Called upon drag.
+ *
+ * @api private
+ */
+
+ Scrollbar.Horizontal.prototype.mousemove = function (ev) {
+ var trackWidth = this.pane.el.width() - this.pane.padding * 2,
+ pos = ev.pageX - this.startPageX,
+ barWidth = this.el.width(),
+ innerEl = this.pane.inner.get(0)
+
+ // minimum top is 0, maximum is the track height
+ var y = Math.min(Math.max(pos, 0), trackWidth - barWidth);
+
+ innerEl.scrollLeft = (innerEl.scrollWidth - this.pane.el.width())
+ * y / (trackWidth - barWidth);
+ };
+
+ /**
+ * Called upon container mousewheel.
+ *
+ * @api private
+ */
+
+ Scrollbar.Horizontal.prototype.mousewheel = function (ev, delta, x, y) {
+ if ((x < 0 && 0 == this.pane.inner.get(0).scrollLeft) ||
+ (x > 0 && (this.innerEl.scrollLeft + Math.ceil(this.pane.el.width())
+ == this.innerEl.scrollWidth))) {
+ ev.preventDefault();
+ return false;
+ }
+ };
+
+ /**
+ * Vertical scrollbar constructor
+ *
+ * @api private
+ */
+
+ Scrollbar.Vertical = function (pane) {
+ this.el = $('', pane.el);
+ Scrollbar.call(this, pane);
+ };
+
+ /**
+ * Inherits from Scrollbar.
+ */
+
+ inherits(Scrollbar.Vertical, Scrollbar);
+
+ /**
+ * Updates size/position of scrollbar.
+ *
+ * @api private
+ */
+
+ Scrollbar.Vertical.prototype.update = function () {
+ var paneHeight = this.pane.el.height(),
+ trackHeight = paneHeight - this.pane.padding * 2,
+ innerEl = this.innerEl;
+
+ var scrollbarHeight = trackHeight * paneHeight / innerEl.scrollHeight;
+ scrollbarHeight = scrollbarHeight < 20 ? 20 : scrollbarHeight;
+
+ var topPos = trackHeight * innerEl.scrollTop / innerEl.scrollHeight;
+
+ if((topPos + scrollbarHeight) > trackHeight) {
+ var diff = (topPos + scrollbarHeight) - trackHeight;
+ topPos = topPos - diff - 3;
+ }
+
+ this.el
+ .css('height', scrollbarHeight)
+ .css('top', topPos);
+
+ return paneHeight < innerEl.scrollHeight;
+ };
+
+ /**
+ * Called upon drag.
+ *
+ * @api private
+ */
+
+ Scrollbar.Vertical.prototype.mousemove = function (ev) {
+ var paneHeight = this.pane.el.height(),
+ trackHeight = paneHeight - this.pane.padding * 2,
+ pos = ev.pageY - this.startPageY,
+ barHeight = this.el.height(),
+ innerEl = this.innerEl
+
+ // minimum top is 0, maximum is the track height
+ var y = Math.min(Math.max(pos, 0), trackHeight - barHeight);
+
+ innerEl.scrollTop = (innerEl.scrollHeight - paneHeight)
+ * y / (trackHeight - barHeight);
+ };
+
+ /**
+ * Called upon container mousewheel.
+ *
+ * @api private
+ */
+
+ Scrollbar.Vertical.prototype.mousewheel = function (ev, delta, x, y) {
+ if ((y > 0 && 0 == this.innerEl.scrollTop) ||
+ (y < 0 && (this.innerEl.scrollTop + Math.ceil(this.pane.el.height())
+ == this.innerEl.scrollHeight))) {
+ ev.preventDefault();
+ return false;
+ }
+ };
+
+ /**
+ * Cross-browser inheritance.
+ *
+ * @param {Function} constructor
+ * @param {Function} constructor we inherit from
+ * @api private
+ */
+
+ function inherits (ctorA, ctorB) {
+ function f() {};
+ f.prototype = ctorB.prototype;
+ ctorA.prototype = new f;
+ };
+
+ /**
+ * Scrollbar size detection.
+ */
+
+ var size;
+
+ function scrollbarSize () {
+ if (size === undefined) {
+ var div = $(
+ '
'
+ + '
'
+ );
+
+ $('body').append(div);
+ var w1 = $(div).innerWidth();
+ var w2 = $('div', div).innerWidth();
+ $(div).remove();
+
+ size = w1 - w2;
+ }
+
+ return size;
+ };
+
+})(jQuery);
diff --git a/vendor/styles/antiscroll.css b/vendor/styles/antiscroll.css
new file mode 100644
index 000000000..29626295a
--- /dev/null
+++ b/vendor/styles/antiscroll.css
@@ -0,0 +1,63 @@
+.antiscroll-wrap {
+ display: inline-block;
+ position: relative;
+ overflow: hidden;
+}
+
+.antiscroll-scrollbar {
+ background: gray;
+ background: rgba(0, 0, 0, 0.5);
+ -webkit-border-radius: 7px;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+ -webkit-box-shadow: 0 0 1px #fff;
+ -moz-box-shadow: 0 0 1px #fff;
+ box-shadow: 0 0 1px #fff;
+ position: absolute;
+ opacity: 0;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
+ -webkit-transition: linear 300ms opacity;
+ -moz-transition: linear 300ms opacity;
+ -o-transition: linear 300ms opacity;
+}
+
+.antiscroll-scrollbar-shown {
+ opacity: 1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+}
+
+.antiscroll-scrollbar-horizontal {
+ height: 7px;
+ margin-left: 2px;
+ bottom: 2px;
+ left: 0;
+}
+
+.antiscroll-scrollbar-vertical {
+ width: 7px;
+ margin-top: 2px;
+ right: 2px;
+ top: 0;
+}
+
+.antiscroll-inner {
+ overflow: scroll;
+}
+
+/** A bug in Chrome 25 on Lion requires each selector to have their own
+ blocks. E.g. the following:
+
+ .antiscroll-inner::-webkit-scrollbar, .antiscroll-inner::scrollbar {...}
+
+ causes the width and height rules to be ignored by the browser resulting
+ in both native and antiscroll scrollbars appearing at the same time.
+ */
+.antiscroll-inner::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+}
+
+.antiscroll-inner::scrollbar {
+ width: 0;
+ height: 0;
+}