Merge branch 'master' into production

This commit is contained in:
Nick Winter 2014-03-21 08:09:30 -07:00
commit f96aa20d2c
18 changed files with 728 additions and 182 deletions

View file

@ -31,8 +31,7 @@
<link rel="shortcut icon" href="/images/favicon.ico">
<link rel="stylesheet" href="/stylesheets/app.css">
<script src="/lib/ace/ace.js"></script>
<script src="/lib/ace/ace.js"></script>
<!--[if IE 9]> <script src="/javascripts/vendor_with_box2d.js"></script> <![endif]-->
<!--[if !IE]><!--> <script src="/javascripts/vendor.js"></script> <!--<![endif]-->
<script src="/javascripts/app.js"></script> <!-- it's all Backbone! -->
@ -113,7 +112,14 @@
<header class="header-container" id="header-container"></header>
<div id="page-container"></div>
<!--
<div class="antiscroll-wrap">
<div class="antiscroll-inner">
<div id="page-container"></div>
</div>
</div>
-->
<div id="modal-wrapper"></div>
<!-- begin google api/plus code -->

View file

@ -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.'

View file

@ -87,7 +87,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
campaign_player_created: "Player-Created"
campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
level_difficulty: "Difficulty: "
play_as: "Play As "
play_as: "Play As"
spectate: "Spectate"
contact:

View file

@ -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

View file

@ -1,16 +1,16 @@
module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa Malaysia", translation:
common:
# loading: "Loading..."
# saving: "Saving..."
# sending: "Sending..."
loading: "Pemuatan..."
saving: "Menyimpan data..."
sending: "Menghantar maklumat.."
cancel: "Batal"
# save: "Save"
save: "Simpan data"
# delay_1_sec: "1 second"
# delay_3_sec: "3 seconds"
# delay_5_sec: "5 seconds"
# manual: "Manual"
# fork: "Fork"
play: "bermain"
play: "Mula"
modal:
close: "Tutup"
@ -20,36 +20,36 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
page_not_found: "Halaman tidak ditemui"
nav:
play: "bermain"
play: "Mula"
# editor: "Editor"
# blog: "Blog"
# forum: "Forum"
# admin: "Admin"
home: "Halaman"
contribute: "Sumbangan"
legal: "Undang- undang"
legal: "Undang-undang"
about: "Tentang"
contact: "Hubungi"
# twitter_follow: "Follow"
# employers: "Employers"
twitter_follow: "Ikuti"
employers: "Majikan"
# 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: "Simpan versi baru"
new_major_version: "Versi utama yang baru"
cla_prefix: "Untuk menyimpan pengubahsuaian, anda perlu setuju dengan"
# cla_url: "CLA"
# cla_suffix: "."
# cla_agree: "I AGREE"
cla_agree: "SAYA SETUJU"
login:
sign_up: "Buat Akaun"
log_in: "Log Masuk"
log_out: "Log Keluar"
recover: "perbaharui akaun"
recover: "Perbaharui Akaun"
# recover:
# recover_account_title: "Recover Account"
# send_password: "Send Recovery Password"
recover:
recover_account_title: "Dapatkan Kembali Akaun"
send_password: "Hantar kembali kata laluan"
signup:
# create_account_title: "Create Account to Save Progress"
@ -57,17 +57,17 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
email_announcements: "Terima pengesahan melalui Emel"
coppa: "13+ atau bukan- USA"
coppa_why: "(Kenapa?)"
creating: "Membuat Akaun..."
creating: "Sedang membuat Akaun..."
sign_up: "Daftar"
log_in: "log masuk"
log_in: "Log Masuk"
# home:
# slogan: "Learn to Code JavaScript by Playing a Game"
# no_ie: "CodeCombat does not run in Internet Explorer 9 or older. Sorry!"
# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!"
# play: "Play"
# 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."
home:
slogan: "Belajar Kod JavaScript Dengan Permainan"
no_ie: "CodeCombat tidak berfungsi dalam Internet Explorer 9 dan terdahulu. Maaf!"
no_mobile: "CodeCombat tidak dibangunkan untuk telefon mudah-alih dan tablet dan tidak akan berfungsi!"
play: "Mula"
old_browser: "Uh oh, browser anda terlalu lama untuk CodeCombat berfungsi. Maaf!"
old_browser_suffix: "Anda boleh mencuba, tapi mungkin ia tidak akan berfungsi."
# campaign: "Campaign"
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer"
@ -90,23 +90,23 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# play_as: "Play As "
# spectate: "Spectate"
# contact:
# contact_us: "Contact CodeCombat"
# welcome: "Good to hear from you! Use this form to send us email. "
# contribute_prefix: "If you're interested in contributing, check out our "
# contribute_page: "contribute page"
contact:
contact_us: "Hubungi CodeCombat"
welcome: "Kami suka mendengar dari anda! Gunakan form ini dan hantar kami emel. "
contribute_prefix: "Jikalau anda berasa besar hati untuk menyumbang, sila lihat "
contribute_page: "laman kami untuk menyumbang"
# contribute_suffix: "!"
# forum_prefix: "For anything public, please try "
# forum_page: "our forum"
# forum_suffix: " instead."
# send: "Send Feedback"
forum_prefix: "Untuk perkara lain, sila cuba "
forum_page: "forum kami"
# forum_suffix: "."
send: "Hantar Maklumbalas"
diplomat_suggestion:
# title: "Help translate CodeCombat!"
# sub_heading: "We need your language skills."
pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Bahasa Melayu but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Bahasa Melayu."
missing_translations: "Until we can translate everything into Bahasa Melayu, you'll see English when Bahasa Melayu isn't available."
# learn_more: "Learn more about being a Diplomat"
title: "Kami perlu menterjemahkan CodeCombat!"
sub_heading: "Kami memerlukan kemahiran bahasa anda."
pitch_body: "Kami membina CodeCombat dalam Bahasa Inggeris, tetapi kami sudah ada pemain dari seluruh dunia. Kebanyakan mereka mahu bermain dalam Bahasa Melayu dan tidak memahami bahasa Inggeris, jikalau anda boleh tertutur dalam kedua-dua bahasa, harap anda boleh daftar untuk menjadi Diplomat dan menolong menterjemahkan laman CodeCombat dan kesemua level kepada Bahasa Melayu."
missing_translations: "Sehingga kami dalam menterjemahkan kesemua kepada Bahasa Melayu, anda akan melihat Inggeris apabila Bahasa Melayu tiada dalam penterjemahan."
learn_more: "Ketahui lebih lanjut untuk menjadi ahli Diplomat"
# subscribe_as_diplomat: "Subscribe as a Diplomat"
# wizard_settings:
@ -151,21 +151,21 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# saved: "Changes Saved"
# password_mismatch: "Password does not match."
# account_profile:
account_profile:
# edit_settings: "Edit Settings"
# profile_for_prefix: "Profile for "
profile_for_prefix: "Profil untuk "
# profile_for_suffix: ""
# profile: "Profile"
# user_not_found: "No user found. Check the URL?"
# gravatar_not_found_mine: "We couldn't find your profile associated with:"
profile: "Profil"
user_not_found: "Pengguna tiada. Semak kembali URL?"
gravatar_not_found_mine: "Kami tidak dapat mencari profil anda yang mengenai dengan:"
# gravatar_not_found_email_suffix: "."
# gravatar_signup_prefix: "Sign up at "
# gravatar_signup_suffix: " to get set up!"
gravatar_signup_prefix: "Daftar di "
gravatar_signup_suffix: " untuk mula!"
# gravatar_not_found_other: "Alas, there's no profile associated with this person's email address."
# gravatar_contact: "Contact"
# gravatar_websites: "Websites"
# gravatar_accounts: "As Seen On"
# gravatar_profile_link: "Full Gravatar Profile"
gravatar_contact: "Hubungi"
gravatar_websites: "Lelaman"
# gravatar_accounts: "Juga didapati di"
gravatar_profile_link: "Profil Penuh Gravatar"
# play_level:
# level_load_error: "Level could not be loaded: "
@ -287,49 +287,49 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# edit_article_title: "Edit Article"
general:
# and: "and"
and: "dan"
name: "Nama"
# body: "Body"
# version: "Version"
# commit_msg: "Commit Message"
version: "Versi"
commit_msg: "Mesej Commit"
# history: "History"
# version_history_for: "Version History for: "
# result: "Result"
# results: "Results"
# description: "Description"
result: "Keputusan"
results: "Keputusan-keputusan"
description: "Deskripsi"
or: "atau"
email: "Emel"
# password: "Password"
password: "Kata Laluan"
message: "Mesej"
# code: "Code"
# ladder: "Ladder"
# when: "When"
# opponent: "Opponent"
code: "Kod"
ladder: "Tangga"
when: "Bila"
opponent: "Penentang"
# rank: "Rank"
# score: "Score"
# win: "Win"
# loss: "Loss"
# tie: "Tie"
score: "Mata"
win: "Menang"
# loss: "Kalah"
tie: "Seri"
# easy: "Easy"
# medium: "Medium"
# hard: "Hard"
# 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."
about:
who_is_codecombat: "Siapa adalah CodeCombat?"
why_codecombat: "Kenapa CodeCombat?"
who_description_prefix: "bersama memulai CodeCombat in 2013. Kami juga membuat (mengaturcara) "
who_description_suffix: "dalam 2008, mengembangkan ia kepada applikasi iOS dan applikasi web #1 untuk belajar menaip dalam karakter Cina dan Jepun."
who_description_ending: "Sekarang, sudah tiba masanya untuk mengajar orang untuk menaip kod."
# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that."
# why_paragraph_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!"
why_paragraph_2: "Mahu belajar untuk membina kod? Anda tidak perlu membaca dan belajar. Anda perlu menaip kod yang banyak dan bersuka-suka dengan masa yang terluang."
why_paragraph_3_prefix: "Itulah semua tentang pengaturcaraan. Ia harus membuat anda gembira dan rasa berpuas hati. Tidak seperti"
why_paragraph_3_italic: "yay satu badge"
# why_paragraph_3_center: "tapi bersukaria seperti"
why_paragraph_3_italic_caps: "TIDAK MAK SAYA PERLU HABISKAN LEVEL!"
why_paragraph_3_suffix: "Itulah kenapa CodeCombat adalah permainan multiplayer, tapi bukan sebuah khursus dibuat sebagai permainan. Kami tidak akan berhenti sehingga kamu tidak akan--tetapi buat masa kini, itulah perkara yang baik."
# why_paragraph_4: "Jika kamu mahu berasa ketagih terhadap sesuatu permainan komputer, jadilah ketagih kepada permainan ini dan jadilah seorang pakar dalam zaman teknologi terkini."
why_ending: "Dan ia adalah percuma! "
why_ending_url: "Mulalah bermain sekarang!"
# 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."

View file

@ -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 <a href=\"/contribute#artisan\">Czarodziejów Rękodzielnictwa</a>"
level_difficulty: "Poziom trudności: "
play_as: "Graj jako "
# spectate: "Spectate"
spectate: "Oglądaj"
contact:
contact_us: "Kontakt z CodeCombat"
@ -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 laddersthen 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ć"

View file

@ -315,26 +315,26 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
hard: "Сложно"
about:
who_is_codecombat: "Кто есть CodeCombat?"
who_is_codecombat: "Кто стоит за CodeCombat?"
why_codecombat: "Почему CodeCombat?"
who_description_prefix: "вместе начали CodeCombat in 2013. Также мы создали "
who_description_suffix: "в 2008, вывели его на первую строчку среди web и iOS приложений для обучения письму китайскими и японскими иероглифами."
who_description_prefix: "вместе начали CodeCombat в 2013 году. Также мы создали "
who_description_suffix: "в 2008 году, вывели его на первую строчку среди web и iOS приложений для обучения письму китайскими и японскими иероглифами."
who_description_ending: "Теперь пришло время научить людей написанию кода."
why_paragraph_1: "При создании Skritter, Джордж не знал, как программировать и постоянно расстраивался из-за того, что не мог реализовать свои идеи. После этого он пытался учиться, но уроки были слишком медленными. Его сосед по дому, желая переквалифицироваться и прекратить преподавать, пробовал Codecademy, но \"наскучивало.\" Каждую неделю другой друг начинал Codecademy, затем бросал. Мы поняли, что это была та же проблема, которую мы решали со Skritter: люди получают навык через медленные, интенсивные уроки, когда то, что им нужно - быстрая, обширная практика. Мы знаем, как это исправить."
why_paragraph_1: "При создании Skritter, Джордж не знал, как программировать и постоянно расстраивался из-за того, что не мог реализовать свои идеи. После этого он пытался учиться, но уроки были слишком медленными. Его сосед, желая переквалифицироваться и прекратить преподавать, пробовал Codecademy, но \"потерял интерес.\" Каждую неделю очередной товарищ начинал Codecademy, затем бросал. Мы поняли, что это была та же проблема, которую мы решили со Skritter: люди получают навык через медленные, интенсивные уроки, в то время как то, что им нужно - быстрая, обширная практика. Мы знаем, как это исправить."
why_paragraph_2: "Нужно научиться программировать? Вам не нужны уроки. Вам нужно написать много кода и прекрасно провести время, делая это."
why_paragraph_3_prefix: "Вот, о чём программирование. Это должно быть весело. Не вроде"
why_paragraph_3_prefix: "Вот где программирование. Это должно быть весело. Не забавно, вроде"
why_paragraph_3_italic: "вау, значок,"
why_paragraph_3_center: "а"
why_paragraph_3_italic_caps: "НЕТ, МАМ, Я ДОЛЖЕН ПРОЙТИ УРОВЕНЬ!"
why_paragraph_3_suffix: "Вот, почему CodeCombat - мультиплеерная игра, а не курс уроков в игровой форме. Мы не остановимся, пока вы не сможете остановиться--в данном случае, это хорошо."
why_paragraph_3_suffix: "Вот, почему CodeCombat - мультиплеерная игра, а не курс уроков в игровой форме. Мы не остановимся, пока вы не потеряете голову - в данном случае, это хорошо."
why_paragraph_4: "Если вы собираетесь увлечься какой-нибудь игрой, увлекитесь этой и станьте одним из волшебников века информационных технологий."
why_ending: "Эй, это бесплатно. "
why_ending: "И да, это бесплатно. "
why_ending_url: "Начни волшебство сейчас!"
george_description: "Генеральный директор, бизнес-парень, веб-дизайнер, геймдизайнер, и чемпион начинающих программистов во всём мире."
scott_description: "Экстраординарный программист, архитектор программного обеспечения, кухонный волшебник, и мастер финансов. Скотт является разумным."
nick_description: "Маг программирования, эксцентрично мотивированный волшебник, и экспериментатор вверх ногами. Ник может делать всё и хочет построить CodeCombat."
george_description: "Генеральный директор, бизнес-парень, веб-дизайнер, геймдизайнер и чемпион начинающих программистов во всём мире."
scott_description: "Экстраординарный программист, архитектор программного обеспечения, кухонный волшебник и мастер финансов. Скотт рассудителен."
nick_description: "Маг программирования, мудрец эксцентричного мотивирования и чудаковатый экспериментатор. Ник может всё и хочет построить CodeCombat."
jeremy_description: "Маг клиентской поддержки, юзабилити-тестер, и организатор сообщества; вы наверняка уже говорили с Джереми."
michael_description: "Программист, сисадмин и непризнанный технический гений, Михаэль является лицом, поддерживающим наши серверы онлайн."
michael_description: "Программист, сисадмин и непризнанный технический гений, Михаэль является лицом, поддерживающим наши серверы в доступности."
glen_description: "Программист и страстный разработчик игр, с мотивацией сделать этот мир лучше путём разработки действительно значащих вещей. Слова \"невозможно\" нет в его словаре. Освоение новых навыков его развлечение!"
legal:
@ -343,26 +343,26 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
opensource_description_prefix: "Посмотрите "
github_url: "наш GitHub"
opensource_description_center: "и посодействуйте, если вам понравилось! CodeCombat построен на десятках проектов с открытым кодом, и мы любим их. Загляните в "
archmage_wiki_url: "нашу вики Архимагов"
archmage_wiki_url: "наш вики-портал для Архимагов"
opensource_description_suffix: ", чтобы увидеть список программного обеспечения, делающего игру возможной."
practices_title: "Лучшие уважаемые практики"
practices_description: "Это наши обещания тебе, игрок, менее юридическим языком."
practices_title: "Почтительные лучшие практики"
practices_description: "Это наши обещания тебе, игроку, менее юридическим языком."
privacy_title: "Конфиденциальность"
privacy_description: "Мы не будем продавать какой-либо личной информации. Мы намерены заработать деньги с помощью рекрутинга в конечном счёте, но будьте уверены, мы не будем распространять вашу личную информацию заинтересованным компаниям без вашего явного согласия."
security_title: "Безопасность"
security_description: "Мы стремимся сохранить вашу личную информацию в безопасности. Как проект с открытым исходным кодом, наш сайт в свободном доступе для всех для пересмотра и совершенствования систем безопасности."
security_description: "Мы стремимся сохранить вашу личную информацию в безопасности. Как проект с открытым исходным кодом, наш сайт открыт для всех в вопросах пересмотра и совершенствования систем безопасности."
email_title: "Email"
email_description_prefix: "Мы не наводним вас спамом. Через"
email_settings_url: "ваши email настройки"
email_description_suffix: "или через ссылки в email-ах, которые мы отправляем, вы можете изменить предпочтения и легко отписаться в любой момент."
cost_title: "Стоимость"
cost_description: "В настоящее время, CodeCombat 100% бесплатен! Одной из наших главных целей является сохранить его таким, так, чтобы как можно больше людей могли играть, независимо от места в жизни. Если небо потемнеет, мы, возможно, введём подписки, возможно, только на некоторый контент, но нам не хотелось бы. Если повезёт, мы сможем поддерживать компанию, используя"
cost_description: "В настоящее время, CodeCombat 100% бесплатен! Одной из наших главных целей является сохранить его таким, чтобы как можно больше людей могли играть, независимо от места в жизни. Если небо потемнеет, мы, возможно, введём подписки, возможно, только на некоторый контент, но нам не хотелось бы. Если повезёт, мы сможем поддерживать компанию, используя"
recruitment_title: "Рекрутинг"
recruitment_description_prefix: "Здесь, в CodeCombat, вы собираетесь стать могущественным волшебником не только в игре, но и в реальной жизни."
url_hire_programmers: "Никто не может нанять программистов достаточно быстро"
recruitment_description_suffix: "поэтому, как только вы улучшите свои навыки и будете согласны, мы начнём демонстрировать ваши лучшие программистские достижения тысячам работодателей, пускающих слюни на возможность нанять вас. Они платят нам немного, они платят вам"
recruitment_description_italic: "много"
recruitment_description_ending: ", сайт остаётся бесплатным и все счастливы. Таков план."
recruitment_description_ending: "сайт остаётся бесплатным и все счастливы. Таков план."
copyrights_title: "Авторские права и лицензии"
contributor_title: "Лицензионное соглашение соавторов"
contributor_description_prefix: "Все вклады, как на сайте, так и на нашем репозитории GitHub, подпадают под наше"
@ -395,7 +395,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
rights_media: "Медиа (звуки, музыка) и любой другой творческий контент, созданный специально для этого уровня и не являющийся общедоступным при создании уровней."
rights_clarification: "Чтобы уточнить, всё, что становится доступным в Редакторе уровней для целей создания уровней под CC, в то время как контент, созданный с помощью Редактора уровней или загруженный в ходе создания уровней - нет."
nutshell_title: "В двух словах"
nutshell_description: "Любые ресурсы, которые мы предоставляем в Редакторе уровней можно свободно использовать как вам нравится для создания уровней. Но мы оставляем за собой право ограничивать распространение уровней самих по себе (которые создаются на codecombat.com), чтобы за них могла взиматься плата в будущем, если это то, что в конечном итоге происходит."
nutshell_description: "Любые ресурсы, которые мы предоставляем в Редакторе уровней можно свободно использовать как вам нравится для создания уровней. Но мы оставляем за собой право ограничивать распространение уровней самих по себе (которые создаются на codecombat.com), чтобы за них могла взиматься плата в будущем, если до этого дойдёт."
canonical: "Английская версия этого документа является определяющей и канонической. Если есть какие-либо расхождения между переводами, документ на английском имеет приоритет."
contribute:

View file

@ -42,9 +42,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
cla_agree: "JAG GODKÄNNER"
login:
sign_up: "Skapa Konto"
log_in: "Logga In"
log_out: "Logga Ut"
sign_up: "Skapa konto"
log_in: "Logga in"
log_out: "Logga ut"
recover: "glömt lösenord"
recover:
@ -56,15 +56,15 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
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"
coppa_why: "(Varför?)"
creating: "Skapar Konto..."
sign_up: "Skapa Konto"
coppa_why: " (Varför?)"
creating: "Skapar konto..."
sign_up: "Skapa konto"
log_in: "logga in med lösenord"
home:
slogan: "Lär dig att koda Javascript genom att spela ett spel."
no_ie: "CodeCombat fungerar tyvärr inte i IE8 eller äldre."
no_mobile: "CodeCombat är inte designat för mobila enhter och kanske inte fungerar!"
no_mobile: "CodeCombat är inte designat för mobila enhter och fungerar kanske inte!"
play: "Spela"
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."
@ -80,23 +80,23 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
adventurer_suffix: "."
campaign_beginner: "Nybörjarkampanj"
campaign_beginner_description: "... i vilken du lär dig programmerandets magi."
campaign_dev: "Slumpmässig Svårare Nivå"
campaign_dev: "Slumpad 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: "... i vilken du tävlar i kodande mot andra spelare"
campaign_player_created: "Spelarskapade"
campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra <a href=\"/contribute#artisan\">Hantverkartrollkarlar</a>."
campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra <a href=\"/contribute#artisan\">Hantverkare</a>."
level_difficulty: "Svårighetsgrad: "
play_as: "Spela som "
spectate: "Titta på"
contact:
contact_us: "Kontakta CodeCombat"
welcome: "Kul att höra från dig! Använd formuläret för att skicka e-post till oss."
welcome: "Kul att höra från dig! Använd formuläret för att skicka e-post till oss. "
contribute_prefix: "Om du är intresserad av att bidra, koll in vår "
contribute_page: "bidragarsida"
contribute_suffix: "!"
forum_prefix: "För någonting offentlig, var vänlig testa "
forum_prefix: "För någonting offentligt, var vänlig testa "
forum_page: "vårt forum"
forum_suffix: " istället."
send: "Skicka Feedback"
@ -124,40 +124,40 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
account_settings:
title: "Kontoinställningar"
not_logged_in: "Logga in eller skapa ett konto för att ändra dina inställningar."
autosave: "Ändringar Sparas Automatiskt"
autosave: "Ändringar sparas automatiskt"
me_tab: "Jag"
picture_tab: "Profilbild"
wizard_tab: "Trollkarl"
password_tab: "Lösenord"
emails_tab: "E-postadresser"
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."
wizard_color: "Trollkarlens Klädfärg"
new_password: "Nytt Lösenord"
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 e-postadress 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."
wizard_color: "Trollkarlens klädfärg"
new_password: "Nytt lösenord"
new_password_verify: "Verifiera"
email_subscriptions: "E-post Prenumerationer"
email_subscriptions: "E-postsprenumerationer"
email_announcements: "Meddelanden"
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: "Bidragarmail"
contributor_emails: "E-post för bidragare"
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."
email_toggle: "Växla Alla"
error_saving: "Ett Fel Uppstod Vid Sparningen"
saved: "Ändringar Sparade"
contribute_page: " bidragarsidan "
contribute_suffix: " för att få veta mer."
email_toggle: "Växla alla"
error_saving: "Ett fel uppstod när ändringarna skulle sparas"
saved: "Ändringar sparade"
password_mismatch: "De angivna lösenorden stämmer inte överens."
account_profile:
edit_settings: "Ändra Inställningar"
edit_settings: "Ändra inställningar"
profile_for_prefix: "Profil för "
# profile_for_suffix: ""
profile: "Profil"
user_not_found: "Användaren du söker verkar inte finnas. Kolla adressen?"
gravatar_not_found_mine: "Vi kunde inte hitta en profil associerad med:"
user_not_found: "Användaren du söker verkar inte finnas. Stämmer adressen?"
gravatar_not_found_mine: "Vi kunde inte hitta en profil associerad med: "
# gravatar_not_found_email_suffix: "."
gravatar_signup_prefix: "Registrera dig på "
gravatar_signup_suffix: " för att komma igång!"
@ -165,13 +165,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
gravatar_contact: "Kontakt"
gravatar_websites: "Hemsidor"
# gravatar_accounts: "As Seen On"
gravatar_profile_link: "Hela Gravatar profilen"
gravatar_profile_link: "Hela Gravatar-profilen"
play_level:
level_load_error: "Nivån kunde inte laddas: "
done: "Klar"
grid: "Rutnät"
customize_wizard: "Finjustera Trollkarl"
customize_wizard: "Skräddarsy trollkarl"
home: "Hem"
guide: "Guide"
multiplayer: "Flerspelareläge"
@ -185,32 +185,32 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# victory_title_prefix: ""
victory_title_suffix: " Genomförd"
victory_sign_up: "Registrera dig för att få uppdateringar"
victory_sign_up_poke: "Vill du ha de senaste nyheterna vi e-post? Skapa ett gratiskonto så håller vi dig informerad!"
victory_sign_up_poke: "Vill du ha de senaste nyheterna via e-post? Skapa ett gratiskonto så håller vi dig informerad!"
victory_rate_the_level: "Betygsätt nivån: "
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: "Hem"
victory_play_next_level: "Spela nästa nivå"
victory_go_home: "hem"
victory_review: "Berätta mer!"
victory_hour_of_code_done: "Är Du Klar?"
victory_hour_of_code_done: "Är du klar?"
victory_hour_of_code_done_yes: "Ja, jag är klar med min Hour of Code!"
multiplayer_title: "Flerspelarinställningar"
multiplayer_link_description: "Dela den här länken med alla som du vill spela med."
multiplayer_hint_label: "Tips:"
multiplayer_hint: " Klicka på länken för att välja allt, tryck sedan på Cmd-C eller Ctrl-C för att kopiera länken."
multiplayer_coming_soon: "Mer flerspelarlägen kommer!"
multiplayer_coming_soon: "Fler flerspelarlägen kommer!"
guide_title: "Guide"
tome_minion_spells: "Dina Soldaters Förmågor"
tome_read_only_spells: "Skrivskyddade Förmågor"
tome_other_units: "Andra Enheter"
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: "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"
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: "Fortsätt (skift+mellanslag)"
spell_saved: "Besvärjelse sparad"
skip_tutorial: "Hoppa över (esc)"
@ -237,7 +237,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
lg_title: "Senaste matcher"
editor:
main_title: "CodeCombatredigerar"
main_title: "CodeCombatredigerare"
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."
@ -298,7 +298,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
results: "Resultat"
description: "Beskrivning"
or: "eller"
email: "Email"
email: "E-post"
password: "Lösenord"
message: "Meddelande"
code: "Kod"
@ -549,7 +549,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
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"
javascript_rusty: "Är din 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."
new_to_programming: ". Ny 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."

View file

@ -7,7 +7,7 @@
.column
position: absolute
top: 0
top: 0
bottom: 0
padding: 5px
box-sizing: border-box
@ -20,7 +20,7 @@
.treema
position: absolute
top: 70px
top: 80px
left: 0
right: 10px
bottom: 0
@ -32,7 +32,7 @@
.treema
position: absolute
top: 70px
top: 75px
left: 10px
right: 0px
bottom: 0

View file

@ -59,7 +59,7 @@
#thang-components-edit-view
position: absolute
top: 130px
top: 200px
bottom: 0
.treema-root

View file

@ -13,7 +13,7 @@ block content
img#portrait.img-thumbnail
button.btn.btn-secondary#history-button(data-i18n="general.history") History
button.btn.btn-primary#save-button(data-toggle="coco-modal", data-target="modal/save_version", disabled=authorized === true ? undefined : "true") Save
button.btn.btn-primary#save-button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save", disabled=authorized === true ? undefined : "true") Save
button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true") Revert
h3 Edit Thang Type: "#{thangType.attributes.name}"

View file

@ -13,6 +13,7 @@ block content
div.column.col-md-4
a(style="background-color: #{team.primaryColor}", data-team=team.id).play-button.btn.btn-danger.btn-block.btn-lg
span(data-i18n="play.play_as") Play As
|
span= team.name
div.column.col-md-2
@ -54,6 +55,6 @@ block content
span#simulated-by-you= me.get('simulatedBy') || 0
p.simulation-count
span(data-i18n="ladder.games_simulated_by") Games simulated for you:
span(data-i18n="ladder.games_simulated_for") Games simulated for you:
|
span#simulated-for-you= me.get('simulatedFor') || 0

View file

@ -27,7 +27,7 @@ div#columns.row
a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}")
span(data-i18n="ladder.fight") Fight!
if !inTheTop
if !inTheTop && team.leaderboard.nearbySessions().length
tr(class="active")
td(colspan=4).ellipsis-row ...
for session in team.leaderboard.nearbySessions()

View file

@ -230,7 +230,9 @@ module.exports = class ThangsTabView extends View
@selectedExtantThangClickTime = new Date()
treemaThang = _.find @thangsTreema.childrenTreemas, (treema) => treema.data.id is @selectedExtantThang.id
if treemaThang
treemaThang.select() unless treemaThang.isSelected()
if not treemaThang.isSelected()
treemaThang.select()
@thangsTreema.$el.scrollTop(@thangsTreema.$el.find('.treema-children .treema-selected')[0].offsetTop)
else if @addThangSprite
# We clicked on the background when we had an add Thang selected, so add it
@addThang @addThangType, @addThangSprite.thang.pos

View file

@ -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

View file

@ -69,7 +69,7 @@ class LeaderboardData
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
onLoad: =>
@ -77,12 +77,12 @@ class LeaderboardData
@trigger 'sync'
# 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
return [] unless @session
l = []
above = @playersAbove.models
above.reverse()
@ -92,4 +92,4 @@ class LeaderboardData
if @myRank
startRank = @myRank - 4
session.rank = startRank + i for session, i in l
l
l

471
vendor/scripts/antiscroll.js vendored Normal file
View file

@ -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 = $('<div class="antiscroll-scrollbar antiscroll-scrollbar-horizontal"/>', 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 = $('<div class="antiscroll-scrollbar antiscroll-scrollbar-vertical"/>', 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 = $(
'<div class="antiscroll-inner" style="width:50px;height:50px;overflow-y:scroll;'
+ 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;width:100%"/>'
+ '</div>'
);
$('body').append(div);
var w1 = $(div).innerWidth();
var w2 = $('div', div).innerWidth();
$(div).remove();
size = w1 - w2;
}
return size;
};
})(jQuery);

63
vendor/styles/antiscroll.css vendored Normal file
View file

@ -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;
}