mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-26 12:50:31 -04:00
Merge branch 'master' into production
This commit is contained in:
commit
d016f7d791
15 changed files with 346 additions and 175 deletions
app
assets/images/pages/clans
lib/world
locale
styles/clans
templates/clans
views/clans
server
Binary file not shown.
Before ![]() (image error) Size: 64 KiB After ![]() (image error) Size: 254 KiB ![]() ![]() |
|
@ -842,6 +842,7 @@ module.exports.thangNames = thangNames =
|
|||
'Altair'
|
||||
'Arthur'
|
||||
'Bertrand'
|
||||
'Bronn'
|
||||
'Bruce'
|
||||
'Drake'
|
||||
'Duran'
|
||||
|
@ -850,6 +851,7 @@ module.exports.thangNames = thangNames =
|
|||
'Hank'
|
||||
'Hunfray'
|
||||
'Jeph'
|
||||
'Jorah'
|
||||
'Lancelot'
|
||||
'Mace'
|
||||
'Neville'
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: "German (Germany)", translation:
|
||||
home:
|
||||
slogan: "Lerne spielend Programmieren"
|
||||
no_ie: "CodeCombat läuft nicht im IE 8 oder älteren Browsern. Tut uns Leid!" # Warning that only shows up in IE8 and older
|
||||
no_ie: "CodeCombat läuft nicht im IE 8 oder älteren Browsern. Tut uns leid!" # Warning that only shows up in IE8 and older
|
||||
no_mobile: "CodeCombat ist nicht für Mobilgeräte optimiert und funktioniert möglicherweise nicht." # Warning that shows up on mobile devices
|
||||
play: "Spielen" # The big play button that opens up the campaign view.
|
||||
old_browser: "Oh! Dein Browser ist zu alt für CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari
|
||||
|
@ -90,7 +90,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
|
|||
campaign_multiplayer_description: "... in der Du Kopf-an-Kopf gegen andere Spieler programmierst."
|
||||
campaign_player_created: "Von Spielern erstellt"
|
||||
campaign_player_created_description: "... in welchem Du gegen die Kreativität eines <a href=\"/contribute#artisan\">Artisan Zauberers</a> kämpfst."
|
||||
campaign_classic_algorithms: "Klassiche Algorithmen"
|
||||
campaign_classic_algorithms: "Klassische Algorithmen"
|
||||
campaign_classic_algorithms_description: "... in welchem du die populärsten Algorithmen der Informatik lernst."
|
||||
|
||||
share_progress_modal:
|
||||
|
@ -337,7 +337,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
|
|||
tip_google: "Hast du ein Problem, das du nicht lösen kannst? Google es!"
|
||||
# tip_adding_evil: "Adding a pinch of evil."
|
||||
# tip_hate_computers: "That's the thing about people who think they hate computers. What they really hate is lousy programmers. - Larry Niven"
|
||||
tip_open_source_contribute: "Du kannst Dabei helfen, CodeCombat zu verbessern."
|
||||
tip_open_source_contribute: "Du kannst dabei helfen, CodeCombat zu verbessern."
|
||||
# tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch"
|
||||
|
||||
game_menu:
|
||||
|
@ -736,7 +736,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
|
|||
adventurer_summary: "Bekomme unsere neuen Level (sogar unseren Abonnement Inhalt) kostenlos eine Woche früher und hilf uns, Fehler vor der Veröffentlichung zu finden."
|
||||
scribe_title: "Schreiber"
|
||||
scribe_title_description: "(Artikel Editor)"
|
||||
scribe_summary: "Guter Code braucht gute Dokumentation. Schreibe, bearbeite and verbessere die, von weltweit Millionen von Spielern, gelesenen Dokumentationen."
|
||||
scribe_summary: "Guter Code braucht gute Dokumentation. Schreibe, bearbeite und verbessere die, von weltweit Millionen von Spielern, gelesenen Dokumentationen."
|
||||
diplomat_title: "Diplomat"
|
||||
diplomat_title_description: "(Übersetzer)"
|
||||
diplomat_summary: "CodeCombat wird in 45+ Sprachen von unseren Diplomaten übersetzt. Hilf uns und steuere Übersetzungen bei."
|
||||
|
@ -836,7 +836,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
|
|||
|
||||
contribute:
|
||||
page_title: "Mitwirken"
|
||||
intro_blurb: "CodeCombat ist zu 100% Open Source! Hunderte hingebungsvolle Spieler haben uns geholfen das Spiel zu dem zu machen was es heute ist. Trete uns bei und schreibe das nächste Kapitel in CodeCombat' Aufgabe, der Welt das Programmieren zu lehren!"
|
||||
intro_blurb: "CodeCombat ist zu 100% Open Source! Hunderte hingebungsvolle Spieler haben uns geholfen das Spiel zu dem zu machen was es heute ist. Tritt uns bei und schreibe das nächste Kapitel in CodeCombat' Aufgabe, der Welt das Programmieren zu lehren!"
|
||||
alert_account_message_intro: "Hey du!"
|
||||
alert_account_message: "Um Klassen-Emails abonnieren zu können, musst du dich zuerst anmelden."
|
||||
archmage_introduction: "Einer der größten Vorteile daran ein Spiel aufzubauen, ist es, dass so viele verschiedene Aspekte eine Rolle spielen. Grafiken, Sound, Echtzeit Networking, Social Networking und natürlich viele der gewöhnlichen Aspekte des Programmierens, von low-level Datenbankmanagement und Server Administration bis hin zum Aufbau von Design und Interface. Es gibt viel zu tun und wenn du ein erfahrener Programmierer bist, mit einer Veranlagung dazu, wirklich knallhart bei CodeCombat einzutauchen, dann könnte diese Klasse etwas für dich sein. Wir würden uns wahnsinnig über deine Hilfe dabei freuen, das beste Programmierspiel der Welt aufzubauen."
|
||||
|
|
|
@ -274,7 +274,7 @@
|
|||
tome_submit_button: "Submit"
|
||||
tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
||||
tome_select_method: "Select a Method"
|
||||
tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
|
||||
tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methods).
|
||||
tome_select_a_thang: "Select Someone for "
|
||||
tome_available_spells: "Available Spells"
|
||||
tome_your_skills: "Your Skills"
|
||||
|
@ -602,10 +602,10 @@
|
|||
sub_includes_1: "In addition to the 80+ basic levels, students with a monthly subscription get access to these additional features:"
|
||||
sub_includes_2: "60+ practice levels"
|
||||
sub_includes_3: "Video tutorials"
|
||||
sub_includes_7: "Private Clans"
|
||||
sub_includes_4: "Premium email support"
|
||||
sub_includes_5: "7 new heroes with unique skills to master"
|
||||
sub_includes_6: "3500 bonus gems every month"
|
||||
sub_includes_7: "Private Clans"
|
||||
who_for_title: "Who is CodeCombat for?"
|
||||
who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
|
||||
who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
|
||||
|
@ -1168,7 +1168,7 @@
|
|||
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."
|
||||
canonical: "The English version of this document is the definitive, canonical version. If there are any discrepancies between translations, the English document takes precedence."
|
||||
|
||||
ladder_prizes:
|
||||
title: "Tournament Prizes" # This section was for an old tournament and doesn't need new translations now.
|
||||
|
|
|
@ -261,9 +261,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
victory_hour_of_code_done_yes: "Oui, j'ai fini mon heure de code !"
|
||||
victory_experience_gained: "XP gagnée"
|
||||
victory_gems_gained: "Gemmes gagnées"
|
||||
# victory_new_item: "New Item"
|
||||
victory_new_item: "Nouvel item"
|
||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
||||
# victory_become_a_viking: "Become a Viking"
|
||||
victory_become_a_viking: "Devenez un viking"
|
||||
guide_title: "Guide"
|
||||
tome_minion_spells: "Les sorts de vos soldats" # Only in old-style levels.
|
||||
tome_read_only_spells: "Sorts en lecture-seule" # Only in old-style levels.
|
||||
|
@ -325,19 +325,19 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
tip_brute_force: "En cas de doute, utiliser la force brute. - Ken Thompson"
|
||||
tip_extrapolation: "Il y a seulement deux types de personnes : celles qui peuvent extrapoler à partir de données incomplètes..."
|
||||
tip_superpower: "Le développement est la chose la plus proche d'un super pouvoir."
|
||||
# tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds"
|
||||
tip_control_destiny: "Dans le vrai open source, vous avez le controle sur votre propre destinée. - Linus Torvalds"
|
||||
tip_no_code: "Aucun code n'est plus rapide qu'aucun code."
|
||||
tip_code_never_lies: "Le code ne ment jamais, les commentaires... parfois — Ron Jeffries"
|
||||
# tip_reusable_software: "Before software can be reusable it first has to be usable."
|
||||
# tip_optimization_operator: "Every language has an optimization operator. In most languages that operator is ‘//’"
|
||||
# tip_lines_of_code: "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates"
|
||||
# tip_source_code: "I want to change the world but they would not give me the source code."
|
||||
# tip_javascript_java: "Java is to JavaScript what Car is to Carpet. - Chris Heilmann"
|
||||
tip_reusable_software: "Avant qu'un logiciel soit réutilisable, il doit être utilisable"
|
||||
tip_optimization_operator: "Tout les langages ont un opérateur d'optimisation. Dans la plupart des langages, cet opérateur est ‘//’"
|
||||
tip_lines_of_code: "Mesurer l'avancé d'un programme par le nombre de lignes de code, c'est comme mesurer l'avancé d'un avion par son poid. - Bill Gates"
|
||||
tip_source_code: "Je voudrais changer le monde, mais ils ne veulent pas me donner le code source."
|
||||
tip_javascript_java: "le Java est au Javascript ce que le tapis est à la tapisserie"
|
||||
tip_move_forward: "Quoi que vous fassiez, continuez d'avancer. - Martin Luther King Jr."
|
||||
# tip_google: "Have a problem you can't solve? Google it!"
|
||||
tip_google: "*Vous avez un problème que vous n'arrivez pas à résoudre ? Googlez le !"
|
||||
tip_adding_evil: "Ajout d'une pincée de méchanceté"
|
||||
# tip_hate_computers: "That's the thing about people who think they hate computers. What they really hate is lousy programmers. - Larry Niven"
|
||||
# tip_open_source_contribute: "You can help CodeCombat improve!"
|
||||
tip_open_source_contribute: "Vous pouvez aider CodeCombat à s'améliorer !"
|
||||
# tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch"
|
||||
|
||||
game_menu:
|
||||
|
@ -395,7 +395,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
prompt_body: "En voulez-vous plus ?"
|
||||
prompt_button: "Entrer dans la boutique"
|
||||
recovered: "Gemmes précédemment achetées récupérées. Merci de rafraîchir la page."
|
||||
# price: "x3500 / mo"
|
||||
price: "x3500 / mo"
|
||||
|
||||
subscribe:
|
||||
comparison_blurb: "Aiguisez vos compétences avec un abonnement CodeCombat !"
|
||||
|
@ -405,13 +405,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
feature4: "<strong>3500 gemmes bonus</strong> tous les mois !"
|
||||
feature5: "Tutoriels vidéo"
|
||||
feature6: "Assitance par e-mail dédiée"
|
||||
# feature7: "Private <strong>Clans</strong>"
|
||||
feature7: "<strong>Clans</strong> privés"
|
||||
free: "Gratuit"
|
||||
month: "mois"
|
||||
subscribe_title: "Abonnement"
|
||||
unsubscribe: "Désinscription"
|
||||
confirm_unsubscribe: "Confirmer la désinscription"
|
||||
# never_mind: "Never Mind, I Still Love You"
|
||||
never_mind: "Ça ne fait rien, je t'aime toujours"
|
||||
thank_you_months_prefix: "Merci de nous avoir supporté pendant"
|
||||
thank_you_months_suffix: "mois."
|
||||
thank_you: "Merci de supporter CodeCombat."
|
||||
|
@ -428,18 +428,18 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
parents: "Pour les parents"
|
||||
parents_title: "Votre enfant va apprendre à programmer." # {change}
|
||||
parents_blurb1: "Avec CodeCombat, votre enfant apprend en écrivant de vrais programmes. Il commence en apprenant des instructions simples, puis progresse sur des thèmes plus complexes."
|
||||
# parents_blurb1a: "Computer programming is an essential skill that your child will undoubtedly use as an adult. By 2020, basic software skills will be needed by 77% of jobs, and software engineers are in high demand across the world. Did you know that Computer Science is the highest-paid university degree?"
|
||||
parents_blurb1a: "La programmation informatique est une compétence essentielle que votre fils va indubitablement utiliser comme un adulte. En 2020, les compétences basiques en informatique seront obligatoires pour 77% des travails, et les ingénieurs logiciels seront fortement demandés partout dans le monde. Saviez-vous que l'informatique est la compétence universitaire la mieux payée ?"
|
||||
parents_blurb2: "Pour $9.99 USD/mois, il obtient de nouveaux défis chaque semaine et le support par e-mail de programmeurs professionnels." # {change}
|
||||
parents_blurb3: "Pas de risque : garantie 100% remboursé, désinscription facile en 1 clic."
|
||||
# payment_methods: "Payment Methods"
|
||||
# payment_methods_title: "Accepted Payment Methods"
|
||||
# payment_methods_blurb1: "We currently accept credit cards and Alipay."
|
||||
# payment_methods_blurb2: "If you require an alternate form of payment, please contact"
|
||||
payment_methods: "Moyens de paiement"
|
||||
payment_methods_title: "Moyens de paiement acceptés"
|
||||
payment_methods_blurb1: "Nous acceptons pour le moment les cartes de crédit et les paiment par Alipay."
|
||||
payment_methods_blurb2: "Si vous avez besoins d'un autre moyen de paiement, merci de nous contacter"
|
||||
stripe_description: "Inscription mensuelle"
|
||||
subscription_required_to_play: "Vous avez besoin d'un abonnement pour jouer à ce niveau."
|
||||
unlock_help_videos: "Abonnez vous pour débloquer tous les tutoriels vidéo."
|
||||
# personal_sub: "Personal Subscription" # Accounts Subscription View below
|
||||
# loading_info: "Loading subscription information..."
|
||||
personal_sub: "Abonnement individuelle" # Accounts Subscription View below
|
||||
loading_info: "Chargement des informations sur votre abonnement..."
|
||||
# managed_by: "Managed by"
|
||||
# will_be_cancelled: "Will be cancelled on"
|
||||
# currently_free: "You currently have a free subscription"
|
||||
|
@ -478,7 +478,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
lua_blurb: "Langage de script de jeu."
|
||||
io_blurb: "Simple mais obscur."
|
||||
status: "Statut"
|
||||
# hero_type: "Type"
|
||||
hero_type: "Type"
|
||||
weapons: "Arme"
|
||||
weapons_warrior: "Epées - Courte portée, pas de magie"
|
||||
weapons_ranger: "Arbalètes, pistolets - Longue portée, pas de magie"
|
||||
|
@ -649,17 +649,17 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
autosave: "Enregistrer automatiquement les modifications"
|
||||
me_tab: "Moi"
|
||||
picture_tab: "Photos"
|
||||
# delete_account_tab: "Delete Your Account"
|
||||
# wrong_email: "Wrong Email"
|
||||
upload_picture: "Héberger une image"
|
||||
# delete_this_account: "Delete this account permanently"
|
||||
delete_account_tab: "Supprimer votre compte"
|
||||
wrong_email: "Mauvaise adresse e-mail"
|
||||
upload_picture: "Télécharger une image"
|
||||
delete_this_account: "Supprimer votre compte définitivement"
|
||||
god_mode: "Puissance Divine"
|
||||
password_tab: "Mot de passe"
|
||||
emails_tab: "E-mails"
|
||||
admin: "Admin"
|
||||
new_password: "Nouveau mot de passe"
|
||||
new_password_verify: "Vérifier"
|
||||
# type_in_email: "Type in your email to confirm the deletion"
|
||||
type_in_email: "Entrez votre adresse e-mail pour confirmer la supression de votre compte"
|
||||
email_subscriptions: "Abonnements"
|
||||
email_subscriptions_none: "Aucun e-mail d'abonnement."
|
||||
email_announcements: "Annonces"
|
||||
|
@ -825,7 +825,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
level_completion: "Niveau d'achèvement"
|
||||
pop_i18n: "Renseigner I18N"
|
||||
tasks: "Tâches"
|
||||
# clear_storage: "Clear your local changes"
|
||||
clear_storage: "Vider vos changements locaux"
|
||||
|
||||
article:
|
||||
edit_btn_preview: "Prévisualiser"
|
||||
|
@ -947,7 +947,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
fight: "Combattez !"
|
||||
watch_victory: "Regardez votre victoire"
|
||||
defeat_the: "Vaincre le"
|
||||
# tournament_started: ", started"
|
||||
tournament_started: ", a démarré"
|
||||
tournament_ends: "Fin du tournoi"
|
||||
tournament_ended: "Tournoi terminé"
|
||||
tournament_rules: "Règles du tournoi"
|
||||
|
@ -997,7 +997,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
payments: "Paiements"
|
||||
purchased: "Acheté"
|
||||
subscription: "Souscrit"
|
||||
# invoices: "Invoices"
|
||||
invoices: "Factures"
|
||||
service_apple: "Apple"
|
||||
service_web: "Web"
|
||||
paid_on: "Payé"
|
||||
|
@ -1014,15 +1014,15 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
|||
status_unsubscribed_active: "Vous n'êtes pas inscrit et ne serez pas facturé, mais votre compte est toujours actif."
|
||||
status_unsubscribed: "Obtenez l'accès à de nouveaux niveaux, héros, objets et gemmes en bonus avec une inscription à CodeCombat !"
|
||||
|
||||
# account_invoices:
|
||||
# amount: "Amount in US dollars"
|
||||
# declined: "Your card was declined"
|
||||
# invalid_amount: "Please enter a US dollar amount."
|
||||
# not_logged_in: "Log in or create an account to access invoices."
|
||||
# pay: "Pay Invoice"
|
||||
# purchasing: "Purchasing..."
|
||||
# retrying: "Server error, retrying."
|
||||
# success: "Successfully paid. Thanks!"
|
||||
account_invoices:
|
||||
amount: "Montant (Dollars US)"
|
||||
declined: "Votre carte a été refusée"
|
||||
invalid_amount: "Entrez un montant en dollars US."
|
||||
not_logged_in: "Connectez vous ou créez un compte pour accéder aux factures."
|
||||
pay: "Paiement de facture"
|
||||
purchasing: "Achat..."
|
||||
retrying: "Erreur interne, réessayez"
|
||||
success: "Paiement accepté, Merci !"
|
||||
|
||||
loading_error:
|
||||
could_not_load: "Erreur de chargement du serveur"
|
||||
|
|
|
@ -74,7 +74,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
anonymous: "Jogador Anónimo"
|
||||
level_difficulty: "Dificuldade: "
|
||||
campaign_beginner: "Campanha para Iniciantes"
|
||||
awaiting_levels_adventurer_prefix: "Nós adicionamos cinco níveis por semana." # {change}
|
||||
awaiting_levels_adventurer_prefix: "Nós lançamos novos níveis todas as semanas."
|
||||
awaiting_levels_adventurer: "Regista-te como Aventureiro"
|
||||
awaiting_levels_adventurer_suffix: "para seres o primeiro a jogar níveis novos."
|
||||
adjust_volume: "Ajustar volume"
|
||||
|
@ -261,7 +261,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
victory_hour_of_code_done_yes: "Sim, terminei a minha Hora do Código™!"
|
||||
victory_experience_gained: "XP Ganho"
|
||||
victory_gems_gained: "Gemas Ganhas"
|
||||
# victory_new_item: "New Item"
|
||||
victory_new_item: "Novo Item"
|
||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
||||
victory_become_a_viking: "Torna-te um Viking"
|
||||
guide_title: "Guia"
|
||||
|
@ -316,7 +316,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
tip_no_try: "Fazer. Ou não fazer. Não há nenhum tentar. - Yoda"
|
||||
tip_patience: "Paciência tu deves ter, jovem Padawan. - Yoda"
|
||||
tip_documented_bug: "Um erro documentado não é um erro; é uma funcionalidade."
|
||||
tip_impossible: "Parece sempre impossível até ser feito. - Nelson Mandela"
|
||||
tip_impossible: "Tudo parece sempre impossível até ser feito. - Nelson Mandela"
|
||||
tip_talk_is_cheap: "Falar é fácil. Mostra-me o código. - Linus Torvalds"
|
||||
tip_first_language: "A coisa mais desastrosa que podes aprender é a tua primeira linguagem de programação. - Alan Kay"
|
||||
tip_hardware_problem: "P: Quantos programadores são necessários para mudar uma lâmpada? R: Nenhum, é um problema de hardware."
|
||||
|
@ -325,7 +325,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
tip_brute_force: "Quando em dúvida, usa a força bruta. - Ken Thompson"
|
||||
tip_extrapolation: "Há apenas dois tipos de pessoas: aquelas que conseguem tirar uma conclusão a partir de dados reduzidos..."
|
||||
tip_superpower: "A programação é a coisa mais próxima de um superpoder que temos."
|
||||
tip_control_destiny: "Em open source a sério, tens o direito de controlares o teu próprio destino. - Linus Torvalds"
|
||||
tip_control_destiny: "Em 'open source' a sério, tens o direito de controlares o teu próprio destino. - Linus Torvalds"
|
||||
tip_no_code: "Nenhum código é mais rápido que código não existente."
|
||||
tip_code_never_lies: "O código nunca mente, mas os comentários às vezes sim. — Ron Jeffries"
|
||||
tip_reusable_software: "Antes de um software poder ser reutilizável, primeiro tem de ser utilizável."
|
||||
|
@ -401,11 +401,11 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
comparison_blurb: "Aperfeiçoa as tuas habilidades com uma subscrição do CodeCombat!"
|
||||
feature1: "80+ níveis básicos dispersos por 4 mundos"
|
||||
feature2: "7 <strong>heróis novos</strong> e poderosos com habilidades únicas!"
|
||||
feature3: "50+ níveis de bónus" # {change}
|
||||
feature3: "60+ níveis de bónus"
|
||||
feature4: "<strong>3500 gemas de bónus</strong> por mês!"
|
||||
feature5: "Tutoriais em vídeo"
|
||||
feature6: "Apoio por e-mail superior"
|
||||
# feature7: "Private <strong>Clans</strong>"
|
||||
feature7: "<strong>Clãs</strong> Privados"
|
||||
free: "Grátis"
|
||||
month: "mês"
|
||||
subscribe_title: "Subscrever"
|
||||
|
@ -570,7 +570,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
|||
nick_blurb: "Guru da Motivação"
|
||||
michael_title: "Programador"
|
||||
michael_blurb: "Administrador do Sistema"
|
||||
matt_title: "Programador" # {change}
|
||||
matt_title: "Co-fundador"
|
||||
matt_blurb: "Ciclista"
|
||||
cat_title: "Artesã Chefe"
|
||||
cat_blurb: "Mágica"
|
||||
|
|
|
@ -11,7 +11,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
for_beginners: "För nybörjare"
|
||||
multiplayer: "Flera spelare" # Not currently shown on home page
|
||||
for_developers: "För utvecklare" # Not currently shown on home page.
|
||||
# or_ipad: "Or download for iPad"
|
||||
or_ipad: "Eller ladda ner till iPad"
|
||||
|
||||
nav:
|
||||
play: "Spela" # The top nav bar entry where players choose which levels to play
|
||||
|
@ -30,7 +30,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
about: "Om oss"
|
||||
contact: "Kontakt"
|
||||
twitter_follow: "Följ oss på Twitter"
|
||||
# teachers: "Teachers"
|
||||
teachers: "Lärare"
|
||||
|
||||
modal:
|
||||
close: "Stäng"
|
||||
|
@ -42,7 +42,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
diplomat_suggestion:
|
||||
title: "Hjälp till att översätta CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
|
||||
sub_heading: "Vi behöver dina språkliga kunskaper."
|
||||
pitch_body: "Vi utvecklar CodeCombat på engelska, men vi har redan spelare världen över. Många av dem vill spela på svenska, men talar inte engelska, så om du talar båda språken, fundera på att registrera dig som Diplomat och hjälp till med översättningen av både hemsidan och alla nivår till svenska."
|
||||
pitch_body: "Vi utvecklar CodeCombat på engelska, men vi har redan spelare världen över. Många av dem vill spela på svenska, men talar inte engelska, så om du talar båda språken, fundera på att registrera dig som Diplomat och hjälp till med översättningen av både hemsidan och alla nivåer till svenska."
|
||||
missing_translations: "Tills vi har översatt allting till svenska, så kommer du se engelska när det inte finns någon svensk översättning tillgänglig."
|
||||
learn_more: "Läs mer om att vara en Diplomat"
|
||||
subscribe_as_diplomat: "Registrera dig som Diplomat"
|
||||
|
@ -75,9 +75,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
level_difficulty: "Svårighetsgrad: "
|
||||
campaign_beginner: "Nybörjarkampanj"
|
||||
awaiting_levels_adventurer_prefix: "Vi släpper fem nya nivåer varje vecka." # {change}
|
||||
# awaiting_levels_adventurer: "Sign up as an Adventurer"
|
||||
awaiting_levels_adventurer: "Registrera dig som äventyrare"
|
||||
# awaiting_levels_adventurer_suffix: "to be the first to play new levels."
|
||||
# adjust_volume: "Adjust volume"
|
||||
adjust_volume: "justera volymen"
|
||||
choose_your_level: "Välj din nivå" # The rest of this section is the old play view at /play-old and isn't very important.
|
||||
adventurer_prefix: "Du kan hoppa till vilken nivå som helst här under, eller diskutera nivåer på "
|
||||
adventurer_forum: "Äventyrarforumet"
|
||||
|
@ -93,12 +93,12 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# campaign_classic_algorithms: "Classic Algorithms"
|
||||
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
|
||||
|
||||
# share_progress_modal:
|
||||
share_progress_modal:
|
||||
# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat."
|
||||
# email_invalid: "Email address invalid."
|
||||
# form_blurb: "Enter your parent's email below and we’ll show them!"
|
||||
# form_label: "Email Address"
|
||||
# placeholder: "email address"
|
||||
email_invalid: "ogiltig e-postadress."
|
||||
form_blurb: "Ange en förälders e-postadress så visar vi dem!"
|
||||
form_label: "E-postaddress"
|
||||
placeholder: "e-postaddress"
|
||||
# title: "Excellent Work, Apprentice"
|
||||
|
||||
login:
|
||||
|
@ -106,13 +106,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
log_in: "Logga in"
|
||||
logging_in: "Loggar In"
|
||||
log_out: "Logga ut"
|
||||
# forgot_password: "Forgot your password?"
|
||||
forgot_password: "Glömt ditt lössenord?"
|
||||
# authenticate_gplus: "Authenticate G+"
|
||||
# load_profile: "Load G+ Profile"
|
||||
# finishing: "Finishing"
|
||||
# sign_in_with_facebook: "Sign in with Facebook"
|
||||
# sign_in_with_gplus: "Sign in with G+"
|
||||
# signup_switch: "Want to create an account?"
|
||||
sign_in_with_facebook: "Logga in med Facebook"
|
||||
sign_in_with_gplus: "Logga in med G+"
|
||||
signup_switch: "Vill du skapa ett konto?"
|
||||
|
||||
signup:
|
||||
email_announcements: "Mottag nyheter via e-post"
|
||||
|
@ -120,25 +120,25 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
sign_up: "Skapa konto"
|
||||
log_in: "logga in med lösenord"
|
||||
social_signup: "Eller så kan du logga in genom facebook eller g+:"
|
||||
# required: "You need to log in before you can go that way."
|
||||
# login_switch: "Already have an account?"
|
||||
required: "Du måste logga in innan du kan gå dit"
|
||||
login_switch: "Har du redan ett konto?"
|
||||
|
||||
recover:
|
||||
recover_account_title: "Återskapa ditt konto"
|
||||
send_password: "Skicka återskapningslösenord"
|
||||
recovery_sent: "Återskapningslösenord skickat."
|
||||
|
||||
# items:
|
||||
# primary: "Primary"
|
||||
# secondary: "Secondary"
|
||||
items:
|
||||
primary: "Primär"
|
||||
secondary: "Sekundär"
|
||||
# armor: "Armor"
|
||||
# accessories: "Accessories"
|
||||
accessories: "Tillbehör"
|
||||
# misc: "Misc"
|
||||
# books: "Books"
|
||||
books: "Böcker"
|
||||
|
||||
common:
|
||||
# back: "Back" # When used as an action verb, like "Navigate backward"
|
||||
# continue: "Continue" # When used as an action verb, like "Continue forward"
|
||||
back: "Tillbaka" # When used as an action verb, like "Navigate backward"
|
||||
continue: "Fortsätt" # When used as an action verb, like "Continue forward"
|
||||
loading: "Laddar..."
|
||||
saving: "Sparar..."
|
||||
sending: "Skickar..."
|
||||
|
@ -153,11 +153,11 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
retry: "Försök igen"
|
||||
# actions: "Actions"
|
||||
# info: "Info"
|
||||
# help: "Help"
|
||||
help: "Hjälp"
|
||||
# watch: "Watch"
|
||||
# unwatch: "Unwatch"
|
||||
# submit_patch: "Submit Patch"
|
||||
# submit_changes: "Submit Changes"
|
||||
submit_changes: "Spara Ändringar"
|
||||
|
||||
general:
|
||||
and: "och"
|
||||
|
@ -173,13 +173,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# submitted: "Submitted"
|
||||
commit_msg: "Förbindelsemeddelande"
|
||||
# review: "Review"
|
||||
# version_history: "Version History"
|
||||
version_history_for: "Versionshistorik för: "
|
||||
# select_changes: "Select two changes below to see the difference."
|
||||
# undo_prefix: "Undo"
|
||||
# undo_shortcut: "(Ctrl+Z)"
|
||||
# redo_prefix: "Redo"
|
||||
# redo_shortcut: "(Ctrl+Shift+Z)"
|
||||
version_history: "Ändringshistorik"
|
||||
version_history_for: "Ändringshistorik för: "
|
||||
select_changes: "Välj två ändringar nedan för att se skillnaden."
|
||||
undo_prefix: "Ångra"
|
||||
undo_shortcut: "(Ctrl+Z)"
|
||||
redo_prefix: "gör om"
|
||||
redo_shortcut: "(Ctrl+Shift+Z)"
|
||||
# play_preview: "Play preview of current level"
|
||||
result: "Resultat"
|
||||
results: "Resultat"
|
||||
|
@ -203,9 +203,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
hard: "Svår"
|
||||
player: "Spelare"
|
||||
# player_level: "Level" # Like player level 5, not like level: Dungeons of Kithgard
|
||||
# warrior: "Warrior"
|
||||
warrior: "Krigare"
|
||||
# ranger: "Ranger"
|
||||
# wizard: "Wizard"
|
||||
wizard: "Trollkarl"
|
||||
|
||||
units:
|
||||
second: "sekund"
|
||||
|
@ -262,13 +262,13 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# victory_experience_gained: "XP Gained"
|
||||
# victory_gems_gained: "Gems Gained"
|
||||
# victory_new_item: "New Item"
|
||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
||||
# victory_become_a_viking: "Become a Viking"
|
||||
victory_viking_code_school: "Jösses vilken svår nivå du just klarade! Om du inte redan är en mjukvaruutvecklare så borde du vara det. Du bev precis fast-tracked för antagning vid Viking Code School, där du kan ta dina kunskaper till en ny nivå och bli en professionell webbutvecklare på 14 veckor."
|
||||
victory_become_a_viking: "Bli en Viking"
|
||||
guide_title: "Guide"
|
||||
tome_minion_spells: "Dina soldaters förmågor" # Only in old-style levels.
|
||||
tome_read_only_spells: "Skrivskyddade förmågor" # Only in old-style levels.
|
||||
tome_other_units: "Andra enheter" # Only in old-style levels.
|
||||
# tome_cast_button_run: "Run"
|
||||
tome_cast_button_run: "Kör"
|
||||
# tome_cast_button_running: "Running"
|
||||
# tome_cast_button_ran: "Ran"
|
||||
# tome_submit_button: "Submit"
|
||||
|
@ -280,19 +280,19 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# tome_your_skills: "Your Skills"
|
||||
# tome_help: "Help"
|
||||
# tome_current_method: "Current Method"
|
||||
# hud_continue_short: "Continue"
|
||||
# code_saved: "Code Saved"
|
||||
hud_continue_short: "Fortsätt"
|
||||
code_saved: "Kod sparad"
|
||||
skip_tutorial: "Hoppa över (esc)"
|
||||
# keyboard_shortcuts: "Key Shortcuts"
|
||||
# loading_ready: "Ready!"
|
||||
# loading_start: "Start Level"
|
||||
# problem_alert_title: "Fix Your Code"
|
||||
# problem_alert_help: "Help"
|
||||
# time_current: "Now:"
|
||||
loading_ready: "Redo!"
|
||||
loading_start: "Starta Nivå"
|
||||
problem_alert_title: "Fixa din kod"
|
||||
problem_alert_help: "Hjälp"
|
||||
time_current: "Nu:"
|
||||
# time_total: "Max:"
|
||||
# time_goto: "Go to:"
|
||||
# infinite_loop_try_again: "Try Again"
|
||||
# infinite_loop_reset_level: "Reset Level"
|
||||
infinite_loop_try_again: "Försök igen"
|
||||
infinite_loop_reset_level: "Återställ Nivå"
|
||||
# infinite_loop_comment_out: "Comment Out My Code"
|
||||
# tip_toggle_play: "Toggle play/paused with Ctrl+P."
|
||||
# tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward."
|
||||
|
@ -300,8 +300,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# tip_open_source: "CodeCombat is 100% open source!"
|
||||
# tip_beta_launch: "CodeCombat launched its beta in October, 2013."
|
||||
# tip_think_solution: "Think of the solution, not the problem."
|
||||
# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra"
|
||||
# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis"
|
||||
tip_theory_practice: "Teoretiskt sett så är det ingen skillnad mellan teori och praktik. Men i praktiken så är det. - Yogi Berra"
|
||||
tip_error_free: "Det finns två sätt att skriva fel-fria program; endast det tredje fungerar. - Alan Perlis"
|
||||
# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra"
|
||||
# tip_forums: "Head over to the forums and tell us what you think!"
|
||||
# tip_baby_coders: "In the future, even babies will be Archmages."
|
||||
|
@ -311,7 +311,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
|
|||
# tip_harry: "Yer a Wizard, "
|
||||
# tip_great_responsibility: "With great coding skill comes great debug responsibility."
|
||||
# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep."
|
||||
# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
|
||||
tip_binary: "Det finns 10 sorters människor på jorden, de som försår binära tal och de som inte gör det."
|
||||
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
|
||||
# tip_no_try: "Do. Or do not. There is no try. - Yoda"
|
||||
# tip_patience: "Patience you must have, young Padawan. - Yoda"
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
#clan-details-view
|
||||
|
||||
th
|
||||
font-size: 16px
|
||||
|
||||
.join-clan-link
|
||||
width: 390px
|
||||
|
||||
|
@ -25,12 +28,15 @@
|
|||
|
||||
$spriteSheetSize: 30px
|
||||
|
||||
|
||||
.remove-hero-cell
|
||||
width: 100px
|
||||
|
||||
.hero-icon-cell
|
||||
display: inline-block
|
||||
width: 30px
|
||||
height: 50px
|
||||
margin: 0px 2px
|
||||
vertical-align: middle
|
||||
|
||||
.level-cell
|
||||
width: 50px
|
||||
|
@ -48,11 +54,37 @@
|
|||
.latest-achievement-cell
|
||||
vertical-align: middle
|
||||
|
||||
.level-progression-cell
|
||||
background-color: lightblue
|
||||
|
||||
.progress-header
|
||||
margin-right: 14px
|
||||
|
||||
.progress-key
|
||||
cursor: default
|
||||
display: inline-block
|
||||
white-space: nowrap
|
||||
font-size: 9pt
|
||||
font-weight: normal
|
||||
border: 1px solid gray
|
||||
cursor: pointer
|
||||
padding: 4px
|
||||
border-radius: 5px
|
||||
margin: 0px
|
||||
padding: 2px
|
||||
|
||||
.progress-key-started
|
||||
background-color: lightgreen
|
||||
|
||||
.progress-key-complete
|
||||
background-color: lightgray
|
||||
|
||||
.expand-progress-checkbox
|
||||
margin-left: 14px
|
||||
|
||||
.expand-progress-label
|
||||
font-weight: normal
|
||||
font-size: 14px
|
||||
|
||||
.progress-cell
|
||||
padding: 2px
|
||||
padding-bottom: 10px
|
||||
|
||||
.level-popup-container
|
||||
display: none
|
||||
|
@ -63,8 +95,27 @@
|
|||
background-color: blanchedalmond
|
||||
font-size: 10pt
|
||||
|
||||
.level-progression-cell-name
|
||||
vertical-align: middle
|
||||
.level-progression-campaign
|
||||
font-size: 12pt
|
||||
font-weight: bold
|
||||
margin-top: 4px
|
||||
|
||||
.progress-level-cell
|
||||
display: inline-block
|
||||
white-space: nowrap
|
||||
font-size: 9pt
|
||||
border: 1px solid gray
|
||||
border-radius: 5px
|
||||
margin: 0px
|
||||
padding: 2px
|
||||
|
||||
.progress-level-cell-started
|
||||
cursor: pointer
|
||||
background-color: lightgreen
|
||||
|
||||
.progress-level-cell-complete
|
||||
cursor: pointer
|
||||
background-color: lightgray
|
||||
|
||||
.player-hero-icon
|
||||
background: transparent url(/images/pages/play/play-spritesheet.png)
|
||||
|
|
|
@ -9,3 +9,9 @@
|
|||
|
||||
.popover
|
||||
max-width: 100%
|
||||
|
||||
h3
|
||||
background: transparent
|
||||
border: 0
|
||||
font-size: 30px
|
||||
color: black
|
||||
|
|
|
@ -74,46 +74,84 @@ block content
|
|||
.small *Invite players to this Clan by sending them this link.
|
||||
|
||||
if members
|
||||
h3 Heroes (#{members.length})
|
||||
h3 Members (#{members.length})
|
||||
|
||||
//- Premium dashboard
|
||||
if clan.get('dashboardType') === 'premium'
|
||||
table.table.table-condensed
|
||||
thead
|
||||
tr
|
||||
if isOwner
|
||||
th
|
||||
th
|
||||
th
|
||||
th.level-cell Level
|
||||
th.name-cell Name
|
||||
th(colspan="#{memberMaxLevelCount + 1}") Last Level Completed
|
||||
th Hero
|
||||
th
|
||||
span.progress-header Progress
|
||||
span.progress-key not started
|
||||
span.progress-key.progress-key-started started
|
||||
span.progress-key.progress-key-complete complete
|
||||
input.expand-progress-checkbox(type='checkbox')
|
||||
span.spl.expand-progress-label Expand levels
|
||||
tbody
|
||||
each member in members
|
||||
tr
|
||||
if isOwner
|
||||
td.remove-hero-cell
|
||||
if member.id !== clan.get('ownerID')
|
||||
button.btn.btn-xs.btn-warning.remove-member-btn(data-id="#{member.id}") Remove Hero
|
||||
td.hero-icon-cell
|
||||
span.spr.player-hero-icon(data-memberid="#{member.id}")
|
||||
td.code-language-cell
|
||||
if memberLanguageMap && memberLanguageMap[member.id]
|
||||
span.code-language-cell(style="background-image: url(/images/common/code_languages/#{memberLanguageMap[member.id]}_small.png)", title=memberLanguageMap[member.id])
|
||||
td.level-cell= member.level()
|
||||
td.name-cell
|
||||
td
|
||||
div
|
||||
span.hero-icon-cell
|
||||
span.spr.player-hero-icon(data-memberid="#{member.id}")
|
||||
span.code-language-cell
|
||||
if memberLanguageMap && memberLanguageMap[member.id]
|
||||
span.code-language-cell(style="background-image: url(/images/common/code_languages/#{memberLanguageMap[member.id]}_small.png)", title=memberLanguageMap[member.id])
|
||||
div
|
||||
a(href="/user/#{member.id}")= member.get('name') || 'Anoner'
|
||||
if memberLevelProgression && memberLevelProgression[member.id]
|
||||
each levelInfo in memberLevelProgression[member.id]
|
||||
td.level-progression-cell(data-level-info=levelInfo)
|
||||
.level-popup-container
|
||||
h3 #{levelInfo.level}
|
||||
p
|
||||
div Playtime: #{levelInfo.playtime}s
|
||||
div Last played: #{levelInfo.changed}
|
||||
if isOwner || me.isAdmin()
|
||||
strong Click to view solution.
|
||||
td.level-progression-cell-name(colspan="#{memberMaxLevelCount - memberLevelProgression[member.id].length + 1}")= memberLevelProgression[member.id][memberLevelProgression[member.id].length - 1].level
|
||||
else
|
||||
td(colspan="#{memberMaxLevelCount + 1}")
|
||||
div Level #{member.level()}
|
||||
if isOwner && member.id !== clan.get('ownerID')
|
||||
button.btn.btn-xs.btn-warning.remove-member-btn(data-id="#{member.id}") Remove Hero
|
||||
td.progress-cell
|
||||
|
||||
each campaign in campaignLevelProgressions
|
||||
if lastUserCampaignLevelMap[member.id] && lastUserCampaignLevelMap[member.id][campaign.ID]
|
||||
div.level-progression-campaign= campaign.name
|
||||
- var i = 0
|
||||
|
||||
each level in campaign.levels
|
||||
- i++
|
||||
- var state = null, levelInfo = null
|
||||
if memberLevelStateMap[member.id][level.slug]
|
||||
- levelInfo = memberLevelStateMap[member.id][level.slug].levelInfo
|
||||
- state = memberLevelStateMap[member.id][level.slug].state
|
||||
if state === 'complete'
|
||||
span.progress-level-cell.progress-level-cell-complete(data-level-info=levelInfo) #{i}
|
||||
if showExpandedProgress || i === 1 || i === lastUserCampaignLevelMap[member.id][campaign.ID].index + 1
|
||||
span.spl #{level.name}
|
||||
.level-popup-container
|
||||
h3 #{i}. #{levelInfo.level}
|
||||
p
|
||||
div Status: Complete
|
||||
div Playtime: #{levelInfo.playtime}s
|
||||
div Last played: #{levelInfo.changed}
|
||||
if isOwner || me.isAdmin()
|
||||
strong Click to view solution.
|
||||
else if state === 'started'
|
||||
span.progress-level-cell.progress-level-cell-started(data-level-info=levelInfo) #{i}
|
||||
if showExpandedProgress || i === 1 || i === lastUserCampaignLevelMap[member.id][campaign.ID].index + 1
|
||||
span.spl #{level.name}
|
||||
.level-popup-container
|
||||
h3 #{i}. #{level.name}
|
||||
p
|
||||
div Status: Started
|
||||
div Playtime: #{levelInfo.playtime}s
|
||||
div Last played: #{levelInfo.changed}
|
||||
if isOwner || me.isAdmin()
|
||||
strong Click to view solution.
|
||||
else
|
||||
span.progress-level-cell.level-progression-level-not-started #{i}
|
||||
if showExpandedProgress || i === 1 || i === lastUserCampaignLevelMap[member.id][campaign.ID].index + 1
|
||||
span.spl #{level.name}
|
||||
.level-popup-container
|
||||
h3 #{i}. #{level.name}
|
||||
div Status: Not Started
|
||||
if lastUserCampaignLevelMap[member.id][campaign.ID].levelSlug === level.slug
|
||||
- break
|
||||
|
||||
//- Basic dashboard
|
||||
else
|
||||
table.table.table-striped.table-condensed
|
||||
thead
|
||||
|
|
|
@ -8,9 +8,9 @@ block content
|
|||
textarea.create-clan-description(rows=2, placeholder='New clan description')
|
||||
p
|
||||
input(type='checkbox').private-clan-checkbox
|
||||
span.spl Private
|
||||
span.spl Make clan private
|
||||
span.spl (
|
||||
a.private-more-info more info
|
||||
a.private-more-info subscribers only
|
||||
span )
|
||||
p
|
||||
button.btn.btn-success.create-clan-btn Create New Clan
|
||||
|
|
|
@ -3,6 +3,7 @@ template = require 'templates/clans/clan-details'
|
|||
app = require 'core/application'
|
||||
AuthModal = require 'views/core/AuthModal'
|
||||
CocoCollection = require 'collections/CocoCollection'
|
||||
Campaign = require 'models/Campaign'
|
||||
Clan = require 'models/Clan'
|
||||
EarnedAchievement = require 'models/EarnedAchievement'
|
||||
LevelSession = require 'models/LevelSession'
|
||||
|
@ -11,22 +12,25 @@ ThangType = require 'models/ThangType'
|
|||
User = require 'models/User'
|
||||
|
||||
# TODO: Add message for clan not found
|
||||
# TODO: join/leave mostly duped from clans view
|
||||
# TODO: Progress visual for premium levels?
|
||||
# TODO: Add expanded level names toggle
|
||||
# TODO: Only need campaign data if clan is private
|
||||
|
||||
module.exports = class ClanDetailsView extends RootView
|
||||
id: 'clan-details-view'
|
||||
template: template
|
||||
|
||||
events:
|
||||
'change .expand-progress-checkbox': 'onExpandedProgressCheckbox'
|
||||
'click .delete-clan-btn': 'onDeleteClan'
|
||||
'click .edit-description-save-btn': 'onEditDescriptionSave'
|
||||
'click .edit-name-save-btn': 'onEditNameSave'
|
||||
'click .join-clan-btn': 'onJoinClan'
|
||||
'click .leave-clan-btn': 'onLeaveClan'
|
||||
'click .level-progression-cell': 'onClickLevel'
|
||||
'click .progress-level-cell': 'onClickLevel'
|
||||
'click .remove-member-btn': 'onRemoveMember'
|
||||
'mouseenter .level-progression-cell': 'onMouseEnterPoint'
|
||||
'mouseleave .level-progression-cell': 'onMouseLeavePoint'
|
||||
'mouseenter .progress-level-cell': 'onMouseEnterPoint'
|
||||
'mouseleave .progress-level-cell': 'onMouseLeavePoint'
|
||||
|
||||
constructor: (options, @clanID) ->
|
||||
super options
|
||||
|
@ -36,8 +40,10 @@ module.exports = class ClanDetailsView extends RootView
|
|||
@stopListening?()
|
||||
|
||||
initData: ->
|
||||
@showExpandedProgress = false
|
||||
@stats = {}
|
||||
|
||||
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign, comparator:'_id' })
|
||||
@clan = new Clan _id: @clanID
|
||||
@members = new CocoCollection([], { url: "/db/clan/#{@clanID}/members", model: User, comparator: 'nameLower' })
|
||||
@memberAchievements = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_achievements", model: EarnedAchievement, comparator:'_id' })
|
||||
|
@ -45,11 +51,13 @@ module.exports = class ClanDetailsView extends RootView
|
|||
@memberSessions = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_sessions", model: LevelSession, comparator:'_id' })
|
||||
|
||||
@listenTo me, 'sync', => @render?()
|
||||
@listenTo @campaigns, 'sync', @onCampaignSync
|
||||
@listenTo @clan, 'sync', @onClanSync
|
||||
@listenTo @members, 'sync', @onMembersSync
|
||||
@listenTo @memberAchievements, 'sync', @onMemberAchievementsSync
|
||||
@listenTo @memberSessions, 'sync', @onMemberSessionsSync
|
||||
|
||||
@supermodel.loadModel @campaigns, 'clan', cache: false
|
||||
@supermodel.loadModel @clan, 'clan', cache: false
|
||||
@supermodel.loadCollection(@members, 'members', {cache: false})
|
||||
@supermodel.loadCollection(@memberAchievements, 'member_achievements', {cache: false})
|
||||
|
@ -57,6 +65,7 @@ module.exports = class ClanDetailsView extends RootView
|
|||
|
||||
getRenderData: ->
|
||||
context = super()
|
||||
context.campaignLevelProgressions = @campaignLevelProgressions ? []
|
||||
context.clan = @clan
|
||||
if application.isProduction()
|
||||
context.joinClanLink = "https://codecombat.com/clans/#{@clanID}"
|
||||
|
@ -65,12 +74,34 @@ module.exports = class ClanDetailsView extends RootView
|
|||
context.owner = @owner
|
||||
context.memberAchievementsMap = @memberAchievementsMap
|
||||
context.memberLanguageMap = @memberLanguageMap
|
||||
context.memberLevelProgression = @memberLevelProgression
|
||||
context.memberLevelStateMap = @memberLevelMap ? {}
|
||||
context.memberMaxLevelCount = @memberMaxLevelCount
|
||||
context.members = @members?.models
|
||||
context.isOwner = @clan.get('ownerID') is me.id
|
||||
context.isMember = @clanID in (me.get('clans') ? [])
|
||||
context.stats = @stats
|
||||
|
||||
# Find last campaign level for each user
|
||||
lastUserCampaignLevelMap = {}
|
||||
maxLastUserCampaignLevel = 0
|
||||
if @campaigns.loaded
|
||||
for campaign in @campaigns.models
|
||||
campaignID = campaign.id
|
||||
lastLevelIndex = 0
|
||||
for levelID, level of campaign.get('levels')
|
||||
levelSlug = level.slug
|
||||
for member in context.members
|
||||
if context.memberLevelStateMap[member.id]?[levelSlug]
|
||||
lastUserCampaignLevelMap[member.id] ?= {}
|
||||
lastUserCampaignLevelMap[member.id][campaignID] ?= {}
|
||||
lastUserCampaignLevelMap[member.id][campaignID] =
|
||||
levelSlug: levelSlug
|
||||
index: lastLevelIndex
|
||||
maxLastUserCampaignLevel = lastLevelIndex if lastLevelIndex > maxLastUserCampaignLevel
|
||||
lastLevelIndex++
|
||||
|
||||
context.lastUserCampaignLevelMap = lastUserCampaignLevelMap
|
||||
context.showExpandedProgress = maxLastUserCampaignLevel <= 30 or @showExpandedProgress
|
||||
context
|
||||
|
||||
afterRender: ->
|
||||
|
@ -90,6 +121,31 @@ module.exports = class ClanDetailsView extends RootView
|
|||
for slug, original of ThangType.heroes when original is hero
|
||||
@$el.find(".player-hero-icon[data-memberID=#{member.id}]").removeClass('.player-hero-icon').addClass('player-hero-icon ' + slug)
|
||||
|
||||
onCampaignSync: ->
|
||||
return unless @campaigns.loaded
|
||||
@campaignLevelProgressions = []
|
||||
for campaign in @campaigns.models
|
||||
continue if campaign.get('slug') is 'auditions'
|
||||
campaignLevelProgression =
|
||||
ID: campaign.id
|
||||
slug: campaign.get('slug')
|
||||
name: campaign.get('name')
|
||||
levels: []
|
||||
# TODO: Where do these proper names come from?
|
||||
campaignLevelProgression.name = switch
|
||||
when campaignLevelProgression.slug is 'dungeon' then 'Kithgard Dungeon'
|
||||
when campaignLevelProgression.slug is 'forest' then 'Backwoods Forest'
|
||||
when campaignLevelProgression.slug is 'desert' then 'Sarven Desert'
|
||||
when campaignLevelProgression.slug is 'mountain' then 'Cloudrip Mountain'
|
||||
else campaignLevelProgression.name
|
||||
for levelID, level of campaign.get('levels')
|
||||
campaignLevelProgression.levels.push
|
||||
ID: levelID
|
||||
slug: level.slug
|
||||
name: level.name
|
||||
@campaignLevelProgressions.push campaignLevelProgression
|
||||
@render?()
|
||||
|
||||
onClanSync: ->
|
||||
unless @owner?
|
||||
@owner = new User _id: @clan.get('ownerID')
|
||||
|
@ -113,21 +169,27 @@ module.exports = class ClanDetailsView extends RootView
|
|||
@render?()
|
||||
|
||||
onMemberSessionsSync: ->
|
||||
@memberLevelProgression = {}
|
||||
@memberLevelMap = {}
|
||||
memberSessions = {}
|
||||
for levelSession in @memberSessions.models
|
||||
continue if levelSession.isMultiplayer()
|
||||
user = levelSession.get('creator')
|
||||
if not levelSession.isMultiplayer() and levelSession.get('state')?.complete is true
|
||||
levelSlug = levelSession.get('levelID')
|
||||
@memberLevelMap[user] ?= {}
|
||||
@memberLevelMap[user][levelSlug] ?= {}
|
||||
levelInfo =
|
||||
level: levelSession.get('levelName')
|
||||
levelID: levelSession.get('levelID')
|
||||
changed: new Date(levelSession.get('changed')).toLocaleString()
|
||||
playtime: levelSession.get('playtime')
|
||||
sessionID: levelSession.id
|
||||
@memberLevelMap[user][levelSlug].levelInfo = levelInfo
|
||||
if levelSession.get('state')?.complete is true
|
||||
@memberLevelMap[user][levelSlug].state = 'complete'
|
||||
memberSessions[user] ?= []
|
||||
memberSessions[user].push levelSession
|
||||
@memberLevelProgression[user] ?= []
|
||||
levelInfo =
|
||||
level: levelSession.get('levelName')
|
||||
levelID: levelSession.get('levelID')
|
||||
changed: new Date(levelSession.get('changed')).toLocaleString()
|
||||
playtime: levelSession.get('playtime')
|
||||
sessionID: levelSession.id
|
||||
@memberLevelProgression[user].push levelInfo
|
||||
else
|
||||
@memberLevelMap[user][levelSlug].state = 'started'
|
||||
@memberMaxLevelCount = 0
|
||||
@memberLanguageMap = {}
|
||||
for user of memberSessions
|
||||
|
@ -144,6 +206,7 @@ module.exports = class ClanDetailsView extends RootView
|
|||
@render?()
|
||||
|
||||
onMouseEnterPoint: (e) ->
|
||||
$('.level-popup-container').hide()
|
||||
container = $(e.target).find('.level-popup-container').show()
|
||||
margin = 20
|
||||
offset = $(e.target).offset()
|
||||
|
@ -186,6 +249,12 @@ module.exports = class ClanDetailsView extends RootView
|
|||
@clan.patch()
|
||||
$('#editNameModal').modal('hide')
|
||||
|
||||
onExpandedProgressCheckbox: (e) ->
|
||||
@showExpandedProgress = $('.expand-progress-checkbox').prop('checked')
|
||||
# TODO: why does render reset the checkbox to be unchecked?
|
||||
@render?()
|
||||
$('.expand-progress-checkbox').attr('checked', @showExpandedProgress)
|
||||
|
||||
onJoinClan: (e) ->
|
||||
return @openModalView(new AuthModal()) if me.isAnonymous()
|
||||
return unless @clan.loaded
|
||||
|
|
|
@ -18,6 +18,7 @@ module.exports = class MainAdminView extends RootView
|
|||
'click .create-clan-btn': 'onClickCreateClan'
|
||||
'click .join-clan-btn': 'onJoinClan'
|
||||
'click .leave-clan-btn': 'onLeaveClan'
|
||||
'click .private-clan-checkbox': 'onClickPrivateCheckbox'
|
||||
|
||||
constructor: (options) ->
|
||||
super options
|
||||
|
@ -71,15 +72,10 @@ module.exports = class MainAdminView extends RootView
|
|||
@supermodel.addRequestResource('user_names', options, 0).load()
|
||||
|
||||
setupPrivateInfoPopover: ->
|
||||
popoverTitle = 'Private Clans'
|
||||
popoverContent = "<p>Additional features:"
|
||||
popoverContent += "<ul>"
|
||||
popoverContent += "<li>Not visible in Public Clans list"
|
||||
popoverContent += "<li>Invite link required to join"
|
||||
popoverContent += "<li>Premium dashboard:"
|
||||
popoverContent += "</ul>"
|
||||
popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png'></p>"
|
||||
popoverContent += "<p>*A CodeCombat subscription is required to create or join private Clans.</p>"
|
||||
popoverTitle = "<h3>Private Clans</h3>"
|
||||
popoverContent = "<p>Invite only</p>"
|
||||
popoverContent += "<p>Detailed dashboard:</p>"
|
||||
popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png' width='700'></p>"
|
||||
@$el.find('.private-more-info').popover(
|
||||
animation: true
|
||||
html: true
|
||||
|
@ -140,3 +136,10 @@ module.exports = class MainAdminView extends RootView
|
|||
@supermodel.addRequestResource( 'leave_clan', options).load()
|
||||
else
|
||||
console.error "No clan ID attached to leave button."
|
||||
|
||||
onClickPrivateCheckbox: (e) ->
|
||||
return @openModalView new AuthModal() if me.isAnonymous()
|
||||
if $('.private-clan-checkbox').prop('checked') and not me.isPremium()
|
||||
$('.private-clan-checkbox').attr('checked', false)
|
||||
@openModalView new SubscribeModal()
|
||||
window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'check private clan'
|
||||
|
|
|
@ -542,7 +542,8 @@ handleLadderUpdate = (req, res) ->
|
|||
res.send('Great work, Captain Cron! I can take it from here.')
|
||||
res.end()
|
||||
# TODO: somehow fetch the histograms
|
||||
emailDays = [1, 2, 4, 7, 14, 30]
|
||||
#emailDays = [1, 2, 4, 7, 14, 30]
|
||||
emailDays = [1, 3, 7] # Reduced to keep smaller monthly recipient footprint
|
||||
now = new Date()
|
||||
for daysAgo in emailDays
|
||||
# Get every session that was submitted in a 5-minute window after the time.
|
||||
|
|
|
@ -209,13 +209,14 @@ UserSchema.methods.register = (done) ->
|
|||
@set 'name', uniqueName
|
||||
done()
|
||||
else done()
|
||||
data =
|
||||
email_id: sendwithus.templates.welcome_email
|
||||
recipient:
|
||||
address: @get 'email'
|
||||
sendwithus.api.send data, (err, result) ->
|
||||
log.error "sendwithus post-save error: #{err}, result: #{result}" if err
|
||||
delighted.addDelightedUser @
|
||||
if @isEmailSubscriptionEnabled 'generalNews'
|
||||
data =
|
||||
email_id: sendwithus.templates.welcome_email
|
||||
recipient:
|
||||
address: @get 'email'
|
||||
sendwithus.api.send data, (err, result) ->
|
||||
log.error "sendwithus post-save error: #{err}, result: #{result}" if err
|
||||
delighted.addDelightedUser @
|
||||
@saveActiveUser 'register'
|
||||
|
||||
UserSchema.methods.isPremium = ->
|
||||
|
|
Loading…
Add table
Reference in a new issue