Merge branch 'master' into production

This commit is contained in:
Matt Lott 2015-04-28 10:32:50 -07:00
commit d016f7d791
15 changed files with 346 additions and 175 deletions

Binary file not shown.

Before

(image error) Size: 64 KiB

After

(image error) Size: 254 KiB

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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: "Youre 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 well 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"

View file

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

View file

@ -9,3 +9,9 @@
.popover
max-width: 100%
h3
background: transparent
border: 0
font-size: 30px
color: black

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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