mumuki-laboratory 7.7.6 → 7.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +83 -3
  3. data/Rakefile +7 -1
  4. data/app/assets/javascripts/mumuki_laboratory/application/alias-modes.js +1 -1
  5. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +66 -57
  6. data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +28 -25
  7. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +8 -10
  8. data/app/assets/javascripts/mumuki_laboratory/application/confirmation.js +2 -2
  9. data/app/assets/javascripts/mumuki_laboratory/application/console.js +41 -43
  10. data/app/assets/javascripts/mumuki_laboratory/application/csrf-token.js +9 -12
  11. data/app/assets/javascripts/mumuki_laboratory/application/custom-editor.js +11 -15
  12. data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +1 -3
  13. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +104 -0
  14. data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +5 -4
  15. data/app/assets/javascripts/mumuki_laboratory/application/events.js +51 -0
  16. data/app/assets/javascripts/mumuki_laboratory/application/exercise.js +68 -0
  17. data/app/assets/javascripts/mumuki_laboratory/application/inputs.js +4 -2
  18. data/app/assets/javascripts/mumuki_laboratory/application/interval.js +2 -4
  19. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +1 -1
  20. data/app/assets/javascripts/mumuki_laboratory/application/load-analytics.js +1 -1
  21. data/app/assets/javascripts/mumuki_laboratory/application/load-error-svg.js +1 -1
  22. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +2 -2
  23. data/app/assets/javascripts/mumuki_laboratory/application/multiple-choice.js +1 -1
  24. data/app/assets/javascripts/mumuki_laboratory/application/multiple-scenarios.js +3 -6
  25. data/app/assets/javascripts/mumuki_laboratory/application/pin.js +3 -5
  26. data/app/assets/javascripts/mumuki_laboratory/application/profile.js +71 -0
  27. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +24 -6
  28. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +20 -11
  29. data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +12 -5
  30. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +19 -101
  31. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +93 -0
  32. data/app/assets/javascripts/mumuki_laboratory/application/sync-mode.js +75 -0
  33. data/app/assets/javascripts/mumuki_laboratory/application/timer.js +5 -6
  34. data/app/assets/javascripts/mumuki_laboratory/application/tooltip.js +1 -1
  35. data/app/assets/javascripts/mumuki_laboratory/application/upload.js +1 -1
  36. data/app/assets/javascripts/mumuki_laboratory/application/user.js +1 -1
  37. data/app/assets/stylesheets/mumuki_laboratory/application.scss +1 -1
  38. data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +19 -17
  39. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss +41 -0
  40. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_gs-board.scss +3 -0
  41. data/app/assets/stylesheets/mumuki_laboratory/application/modules/{guide-corollary.scss → _guide_corollary.scss} +0 -0
  42. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kids.scss +1 -2
  43. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kindergarten.scss +2 -1
  44. data/app/assets/stylesheets/mumuki_laboratory/application/modules/{popover.scss → _popover.scss} +0 -0
  45. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +36 -0
  46. data/app/controllers/application_controller.rb +2 -1
  47. data/app/controllers/users_controller.rb +5 -1
  48. data/app/helpers/application_helper.rb +6 -4
  49. data/app/helpers/avatar_helper.rb +9 -0
  50. data/app/helpers/discussions_helper.rb +2 -2
  51. data/app/helpers/{locale_helper.rb → globals_helper.rb} +6 -2
  52. data/app/helpers/profile_helper.rb +5 -0
  53. data/app/mailers/user_mailer.rb +24 -11
  54. data/app/views/book/show.html.erb +1 -1
  55. data/app/views/exercises/show.html.erb +3 -0
  56. data/app/views/layouts/_main.html.erb +1 -2
  57. data/app/views/layouts/_progress.html.erb +1 -1
  58. data/app/views/layouts/_progress_bar.html.erb +7 -1
  59. data/app/views/layouts/_runner_assets.html.erb +1 -2
  60. data/app/views/layouts/application.html.erb +2 -2
  61. data/app/views/layouts/modals/_avatar_picker.html.erb +16 -0
  62. data/app/views/users/_avatar_list.html.erb +11 -0
  63. data/app/views/users/_edit_user_form.html.erb +22 -0
  64. data/app/views/users/_user_form.html.erb +21 -8
  65. data/app/views/users/edit.html.erb +5 -0
  66. data/app/views/users/show.html.erb +0 -4
  67. data/config/routes.rb +1 -1
  68. data/lib/mumuki/laboratory/controllers.rb +1 -0
  69. data/lib/mumuki/laboratory/controllers/incognito_mode.rb +28 -0
  70. data/lib/mumuki/laboratory/locales/datetime.es.yml +14 -14
  71. data/lib/mumuki/laboratory/locales/en.yml +12 -4
  72. data/lib/mumuki/laboratory/locales/es.yml +12 -4
  73. data/lib/mumuki/laboratory/locales/pt.yml +10 -2
  74. data/lib/mumuki/laboratory/version.rb +1 -1
  75. data/spec/dummy/db/schema.rb +13 -1
  76. data/spec/features/chapter_spec.rb +17 -0
  77. data/spec/features/exercise_flow_spec.rb +54 -6
  78. data/spec/features/home_public_flow_spec.rb +16 -0
  79. data/spec/helpers/avatar_helper_spec.rb +26 -0
  80. data/spec/javascripts/editors-spec.js +54 -0
  81. data/spec/javascripts/events-spec.js +33 -0
  82. data/spec/javascripts/exercise-spec.js +41 -0
  83. data/spec/javascripts/global-spec.js +6 -0
  84. data/spec/javascripts/spec-helper.js +4 -0
  85. data/spec/javascripts/submissions-store-spec.js +44 -0
  86. data/spec/javascripts/sync-mode-spec.js +15 -0
  87. data/spec/mailers/user_mailer_spec.rb +23 -3
  88. data/spec/teaspoon_env.rb +8 -2
  89. data/vendor/assets/javascripts/codemirror-modes/gobstones.js +3 -3
  90. metadata +38 -11
  91. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_follow_us.scss +0 -16
  92. data/app/helpers/version_helper.rb +0 -5
@@ -0,0 +1,9 @@
1
+ module AvatarHelper
2
+ def avatars_for(user)
3
+ (Avatar.with_current_audience_for(user) + [user.avatar]).compact.uniq
4
+ end
5
+
6
+ def show_avatar_item(item)
7
+ avatar_image(item.image_url, alt: item.description, 'mu-avatar-id': item.id, class: 'mu-avatar-item')
8
+ end
9
+ end
@@ -48,8 +48,8 @@ module DiscussionsHelper
48
48
  {status: :solved, sort: :upvotes_count_desc}
49
49
  end
50
50
 
51
- def user_avatar(user, image_class = '')
52
- image_tag user.profile_picture, height: 40, class: "img-circle #{image_class}"
51
+ def user_avatar(user, image_class='')
52
+ profile_picture_for(user, class: image_class)
53
53
  end
54
54
 
55
55
  def discussions_link_with_teaser(item)
@@ -1,10 +1,14 @@
1
- module LocaleHelper
2
- def locale_tags
1
+ module GlobalsHelper
2
+ def globals_tags
3
3
  %Q{
4
4
  <script type="text/javascript">
5
5
  window.mumukiLocale = #{raw Organization.current.locale_json};
6
6
  mumuki.locale = '#{Organization.current.locale}';
7
7
  moment.locale('#{Organization.current.locale}');
8
+
9
+ mumuki.incognitoUser = #{current_incognito_user?};
10
+
11
+ mumuki.version = '#{Mumuki::Laboratory::VERSION}';
8
12
  </script>
9
13
  }.html_safe
10
14
  end
@@ -0,0 +1,5 @@
1
+ module ProfileHelper
2
+ def edit_profile_button
3
+ link_to t(:edit_profile), edit_user_path, class: 'btn btn-success'
4
+ end
5
+ end
@@ -1,24 +1,37 @@
1
1
  class UserMailer < ApplicationMailer
2
+ def welcome_email(user, organization)
3
+ with_locale(user, organization) do
4
+ organization_name = organization.display_name || t(:your_new_organization)
5
+ build_email t(:welcome, name: organization_name), { inline: organization.welcome_email_template }, from: organization.welcome_email_sender
6
+ end
7
+ end
2
8
 
3
9
  def we_miss_you_reminder(user, cycles)
4
- send_reminder! user, :we_miss_you, "#{cycles.ordinalize}_reminder"
10
+ with_locale(user) do
11
+ build_email t(:we_miss_you), "#{cycles.ordinalize}_reminder"
12
+ end
5
13
  end
6
14
 
7
15
  def no_submissions_reminder(user)
8
- send_reminder! user, :start_using_mumuki, "no_submissions_reminder"
16
+ with_locale(user) do
17
+ build_email t(:start_using_mumuki), 'no_submissions_reminder'
18
+ end
9
19
  end
10
20
 
11
- private
12
-
13
- def send_reminder!(user, subject, template_name)
21
+ def with_locale(user, organization = nil, &block)
14
22
  @user = user
15
23
  @unsubscribe_code = User.unsubscription_verifier.generate(user.id)
16
- @organization = user.last_organization
24
+ @organization = organization || user.last_organization
17
25
 
18
- I18n.with_locale(@organization.locale) do
19
- mail to: user.email,
20
- subject: t(subject),
21
- template_name: template_name
22
- end
26
+ I18n.with_locale(@organization.locale, &block)
27
+ end
28
+
29
+ private
30
+
31
+ def build_email(subject, template, **options)
32
+ mail options.compact.merge(to: @user.email,
33
+ subject: subject,
34
+ content_type: 'text/html',
35
+ body: render(template))
23
36
  end
24
37
  end
@@ -36,7 +36,7 @@
36
36
  <div class="chapter-container">
37
37
  <div class="chapter <%= enabled ? '' : 'mu-locked' %>">
38
38
  <h3><%= it.number %>. <%= link_to_path_element it, mode: :plain %></h3>
39
- <div class="text-box" <%= 'aria-label=""' unless enabled %>%>
39
+ <div class="text-box" <%= 'aria-label=""' unless enabled %>>
40
40
  <%= it.description_teaser_html %>
41
41
  </div>
42
42
  </div>
@@ -45,6 +45,9 @@
45
45
  <%= render_exercise_input_layout(@exercise) %>
46
46
 
47
47
  <%= hidden_field_tag default_content_tag_id(@exercise), @default_content %>
48
+ <%= hidden_field_tag "mu-exercise-id", @exercise.id %>
49
+ <%= hidden_field_tag "mu-exercise-layout", @exercise.layout %>
50
+ <%= hidden_field_tag "mu-exercise-settings", @exercise.settings.to_json %>
48
51
 
49
52
  <div style="display: none" id="processing-template">
50
53
  <div class="bs-callout bs-callout-info">
@@ -11,8 +11,7 @@
11
11
  <%= open_graph_tags subject %>
12
12
  <%= assets_include_tags %>
13
13
  <%= csrf_meta_tags %>
14
- <%= locale_tags %>
15
- <%= version_tags %>
14
+ <%= globals_tags %>
16
15
 
17
16
  <%= login_form.header_html %>
18
17
  </head>
@@ -1 +1 @@
1
- <% content.completion_percentage_for(current_user) %>
1
+ <% content.completion_percentage_for(current_user) if current_user? %>
@@ -1,6 +1,12 @@
1
1
  <div class="progress-list-flex">
2
2
  <% guide.exercises.each do |e| %>
3
- <a <%= turbolinks_enable_for e %> href="<%= exercise_path(e)%>" aria-label="<%= e.navigable_name %>" title="<%= e.navigable_name %>" class="<%= class_for_progress_list_item(e, e == actual)%>">
3
+ <a
4
+ <%= turbolinks_enable_for e %>
5
+ href="<%= exercise_path(e)%>"
6
+ aria-label="<%= e.navigable_name %>"
7
+ title="<%= e.navigable_name %>"
8
+ data-mu-exercise-id="<%= e.id %>"
9
+ class="<%= class_for_progress_list_item(e, e == actual)%>">
4
10
  </a>
5
11
  <% end %>
6
12
  </div>
@@ -12,8 +12,7 @@
12
12
 
13
13
  <% if !loads_more_assets && show_loading_for?(language, assets_kind) %>
14
14
  <script id="<%= assets_kind %>-loading-script">
15
- let assetsKind = '<%= assets_kind %>';
16
- mumuki.load(() => mumuki.assetsLoaderFor(assetsKind));
15
+ mumuki.load(() => mumuki.assetsLoaderFor('<%= assets_kind %>'));
17
16
  </script>
18
17
  <% end %>
19
18
 
@@ -17,7 +17,7 @@
17
17
  <% end %>
18
18
  </div>
19
19
  <div class="mu-navbar-avatar">
20
- <% if current_user? %>
20
+ <% if current_logged_user? %>
21
21
  <div class="dropdown">
22
22
  <span>
23
23
  <a class="notifications-box <%= has_notifications? ? '' : 'notifications-box-empty' %>" href=<%= "#{user_notifications_path}" %>>
@@ -28,7 +28,7 @@
28
28
  </div>
29
29
  <div class="dropdown">
30
30
  <span id="profileDropdown" data-toggle="dropdown" aria-label="<%= t(:user) %>" role="menu" tabindex="0">
31
- <%= profile_picture %>
31
+ <%= profile_picture_for current_user %>
32
32
  </span>
33
33
  <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="profileDropdown">
34
34
  <%= menu_bar_list_items %>
@@ -0,0 +1,16 @@
1
+ <div class="modal fade" id="mu-avatar-picker" tabindex="-1" role="dialog" aria-hidden="true">
2
+ <div class="modal-dialog">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
6
+ <span aria-hidden="true">&times;</span></button>
7
+ <div class="modal-title">
8
+ <h3 class="text-left" id="gridSystemModalLabel"><%= t :choose_your_avatar %> </h3>
9
+ </div>
10
+ </div>
11
+ <div class="modal-body">
12
+ <%= render partial: 'avatar_list' %>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1,11 @@
1
+ <div class="row">
2
+ <div class="mu-avatar-list">
3
+ <% avatars_for(@user).sort_by(&:id).each do |avatar| %>
4
+ <%= show_avatar_item(avatar) %>
5
+ <% end %>
6
+
7
+ <% if @user.image_url %>
8
+ <%= avatar_image @user.image_url, class: 'mu-avatar-item', id: 'mu-user-image' %>
9
+ <% end %>
10
+ </div>
11
+ </div>
@@ -0,0 +1,22 @@
1
+ <%= form_for :user, url: update_user_path, :html => { id: 'mu-user-form' }, method: :put do |f| %>
2
+ <div class="mu-user-header">
3
+ <h1><%= t(:edit_profile) %></h1>
4
+ <div class="mu-profile-actions">
5
+ <%= link_to t(:cancel), :back, class: 'btn btn-default' if @user.profile_completed? %>
6
+ <%= f.submit t(:save), disabled: true, class: 'btn btn-success', id: 'mu-edit-profile-btn' %>
7
+ </div>
8
+ </div>
9
+ <div class="row mu-tab-body">
10
+ <div class="col-md-4 text-center">
11
+ <%= profile_picture_for(@user, id: 'mu-user-avatar', class: 'mu-user-avatar') %>
12
+ <i class="fa fa-pencil fa-2x pointer mu-edit-avatar" id="mu-edit-avatar-icon"></i>
13
+ </div>
14
+ <div class="col-md-8">
15
+ <%= render partial: 'profile_fields', locals: {form: f} %>
16
+ </div>
17
+ </div>
18
+ <% end %>
19
+
20
+ <%= content_for :no_container do %>
21
+ <%= render partial: 'layouts/modals/avatar_picker' %>
22
+ <% end %>
@@ -1,11 +1,24 @@
1
- <%= form_for :user, url: update_user_path, method: :put do |f| %>
2
- <div class="row mu-tab-body">
3
- <div class="col-md-4 text-center">
4
- <%= image_tag @user.profile_picture, size: '250x250', class: 'img-circle' %>
1
+ <div class="mu-user-header">
2
+ <h1><%= @user.name %></h1>
3
+ <div class="mu-profile-actions">
4
+ <%= edit_profile_button %>
5
+ </div>
6
+ </div>
7
+ <div class="row mu-tab-body">
8
+ <div class="col-md-4 text-center">
9
+ <%= profile_picture_for(@user, id: 'mu-user-avatar', class: 'mu-user-avatar') %>
10
+ </div>
11
+ <div class="col-md-8 mu-profile-info">
12
+ <% if @user.age.present? %>
13
+ <div>
14
+ <span> <strong><%= t :age %>:</strong> <%= "#{@user.age} #{t :years}" %> </span>
15
+ </div>
16
+ <% end %>
17
+ <div>
18
+ <span> <strong><%= t :email %>:</strong> <%= @user.email %> </span>
5
19
  </div>
6
- <div class="col-md-8">
7
- <%= render partial: 'profile_fields', locals: {form: f} %>
8
- <div><%= f.submit t(:save), class: 'btn btn-success btn-block' %></div>
20
+ <div>
21
+ <span> <strong><%= t :programming_since %>:</strong> <%= t(:time_since, time: time_ago_in_words(@user.created_at)) %> </span>
9
22
  </div>
10
23
  </div>
11
- <% end %>
24
+ </div>
@@ -0,0 +1,5 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs @user %>
3
+ <% end %>
4
+
5
+ <%= render partial: 'edit_user_form' %>
@@ -2,10 +2,6 @@
2
2
  <%= breadcrumbs @user %>
3
3
  <% end %>
4
4
 
5
- <div>
6
- <h1><%= @user.name %></h1>
7
- </div>
8
-
9
5
  <ul class="nav nav-tabs" role="tablist">
10
6
  <li role="presentation" class="active">
11
7
  <a data-target="#info" aria-controls="info" role="tab" data-toggle="tab"><%= t :profile %></a>
@@ -52,7 +52,7 @@ Rails.application.routes.draw do
52
52
  resources :exams, only: :show
53
53
 
54
54
  # All users
55
- resource :user, only: :show
55
+ resource :user, only: [:show, :edit]
56
56
 
57
57
  # Current user
58
58
  resources :messages, only: [:index, :create]
@@ -7,6 +7,7 @@ require_relative './controllers/current_organization'
7
7
  require_relative './controllers/dynamic_errors'
8
8
  require_relative './controllers/notifications'
9
9
  require_relative './controllers/embedded_mode'
10
+ require_relative './controllers/incognito_mode'
10
11
  require_relative './controllers/nested_in_exercise'
11
12
  require_relative './controllers/results_rendering'
12
13
  require_relative './controllers/exercise_seed'
@@ -0,0 +1,28 @@
1
+ module Mumuki::Laboratory::Controllers::IncognitoMode
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ helper_method :current_incognito_user?,
6
+ :current_logged_user?
7
+ end
8
+
9
+ def current_user?
10
+ super || incognito_mode_enabled?
11
+ end
12
+
13
+ def current_user
14
+ @current_user ||= incognito_mode_enabled? ? (super rescue Mumuki::Domain::Incognito) : super
15
+ end
16
+
17
+ def current_incognito_user?
18
+ current_user? && current_user.incognito?
19
+ end
20
+
21
+ def current_logged_user?
22
+ current_user? && !current_user.incognito?
23
+ end
24
+
25
+ def incognito_mode_enabled?
26
+ !from_sessions? && Organization.current.incognito_mode_enabled?
27
+ end
28
+ end
@@ -3,23 +3,23 @@ es:
3
3
  datetime:
4
4
  distance_in_words:
5
5
  about_x_hours:
6
- one: Alrededor de 1 hora
7
- other: Alrededor de %{count} horas
6
+ one: aproximadamente una hora
7
+ other: aproximadamente %{count} horas
8
8
  about_x_months:
9
- one: Alrededor de 1 mes
10
- other: Alrededor de %{count} meses
9
+ one: aproximadamente un mes
10
+ other: aproximadamente %{count} meses
11
11
  less_than_x_minutes:
12
- one: Hace menos de 1 minuto
13
- other: Hace menos de %{count} minutos
12
+ one: menos de un minuto
13
+ other: menos de %{count} minutos
14
14
  x_days:
15
- one: Hace 1 dia
16
- other: Hace %{count} dias
15
+ one: un día
16
+ other: '%{count} días'
17
17
  x_minutes:
18
- one: Hace 1 minuto
19
- other: Hace %{count} minutos
18
+ one: un minuto
19
+ other: '%{count} minutos'
20
20
  x_months:
21
- one: Hace 1 mes
22
- other: Hace %{count} meses
21
+ one: un mes
22
+ other: '%{count} meses'
23
23
  x_seconds:
24
- one: Hace 1 segundo
25
- other: Hace %{count} segundos
24
+ one: un segundo
25
+ other: '%{count} segundos'
@@ -7,6 +7,7 @@ en:
7
7
  actions: Actions
8
8
  activity: Activity
9
9
  actual_state: Obtained board
10
+ age: Age
10
11
  all: All
11
12
  appendix: "Appendix"
12
13
  appendix_teaser: Do you want to learn more? <a href="%{link}">Check this chapter's appendix</a>"
@@ -28,11 +29,13 @@ en:
28
29
  bibliotheca_ui: Bibliotheca
29
30
  birthdate: Birthdate
30
31
  blocked_forum_explanation: You are not allowed to see this content. <br> Are you in the middle of an exam right now?
32
+ cancel: Cancel
31
33
  cancel_subscription: Cancel your subscription.
32
34
  chapter: Chapter
33
35
  chapters: Chapters
34
36
  chapter_finished_html: You have finished %{chapter}!
35
37
  chapter_number: Chapter %{number}
38
+ choose_your_avatar: Choose your avatar
36
39
  classroom_ui: Classroom
37
40
  clear_console: Clear console
38
41
  closed: Closed
@@ -65,6 +68,7 @@ en:
65
68
  dont_leave_us: Don't leave us! Learning is fun. You just have to keep at it.
66
69
  download: Download your solution
67
70
  edit: Edit
71
+ edit_profile: Edit profile
68
72
  editor_placeholder: "write your solution here..."
69
73
  email: Email
70
74
  error_description: This is known as a <span class="error-link">%{error}</span>.
@@ -93,7 +97,9 @@ en:
93
97
  first_name: First Name
94
98
  forbidden_explanation: You are not allowed to see this content.
95
99
  format: Format
100
+ fullscreen: "Fullscreen"
96
101
  gender: Gender
102
+ get_messages: "View messages"
97
103
  go_to: 'Go to %{organization}'
98
104
  gone_explanation: This content is no longer available.
99
105
  guide: Guide
@@ -162,6 +168,7 @@ en:
162
168
  not_in_any_organizations: It seems you aren't in any organizations yet!
163
169
  notify_problem_with_exercise: Report a bug
164
170
  office: Office
171
+ only_landscape_support: Please, rotate your tablet or cellphone to continue practicing
165
172
  opened: Open
166
173
  opened_count: '%{count} opened'
167
174
  other: Other
@@ -184,6 +191,7 @@ en:
184
191
  processing_your_solution: We are processing you solution
185
192
  profile: Profile
186
193
  profile_of: Profile of %{username}
194
+ programming_since: Started programming
187
195
  progress: Progresss
188
196
  read: Read
189
197
  refresh_or_wait: Please press F5 if results are not displayed after a few seconds
@@ -230,6 +238,7 @@ en:
230
238
  submissions_for: Submissions for %{exercise}
231
239
  subscribe: Subscribe
232
240
  tag: Tags
241
+ task: Task
233
242
  teacher_info: Information for teachers
234
243
  tell_us_how: Please tell us how this happened!
235
244
  tell_us_if_our_error: If you think this is our fault, %{issues}
@@ -260,11 +269,10 @@ en:
260
269
  view_details: View details
261
270
  want_permissions: The next user requires permissions
262
271
  we_miss_you: We miss you!
272
+ welcome: Welcome to %{name}!
263
273
  working: "Working"
264
274
  wrong_answer: The answer is wrong
275
+ years: years old
265
276
  you_must_sign_in_before_submitting: You must sign in before submitting your solutions
266
277
  you_never_submitted_solutions: It seems that you've never submitted solutions since you created your account.
267
- fullscreen: "Fullscreen"
268
- get_messages: "View messages"
269
- task: Task
270
- only_landscape_support: Please, rotate your tablet or cellphone to continue practicing
278
+ your_new_organization: your new organization
@@ -7,6 +7,7 @@ es:
7
7
  actions: Acciones
8
8
  activity: Actividad
9
9
  actual_state: Tablero obtenido
10
+ age: Edad
10
11
  all: Todos
11
12
  and: y
12
13
  appendix: "Apéndice"
@@ -29,11 +30,13 @@ es:
29
30
  bibliotheca_ui: Biblioteca
30
31
  birthdate: Fecha de nacimiento
31
32
  blocked_forum_explanation: Es decir que no tenés autorización para ver este contenido. <br> ¿Puede que estés en medio de un examen?
33
+ cancel: Cancelar
32
34
  cancel_subscription: Cancelá tu subscripción.
33
35
  chapter: Capítulo
34
36
  chapters: Capítulos
35
37
  chapter_finished_html: ¡Terminaste %{chapter}! ¡Felicitaciones!
36
38
  chapter_number: 'Capítulo %{number}'
39
+ choose_your_avatar: Elegí tu avatar
37
40
  classroom_ui: Aula
38
41
  clear_console: Reiniciar consola
39
42
  closed: Cerrada
@@ -72,6 +75,7 @@ es:
72
75
  dont_leave_us: ¡No nos abandones! Aprender a programar es divertido. Sólo tenés que seguir practicando.
73
76
  download: "Descargá lo que hiciste"
74
77
  edit: Editar
78
+ edit_profile: Editar perfil
75
79
  editor_placeholder: "...escribí tu solución acá..."
76
80
  email: Email
77
81
  error_description: ¡Ups! <br> Esto es lo que se conoce como <span class="error-link">%{error}</span>.
@@ -99,7 +103,9 @@ es:
99
103
  first_name: Nombre
100
104
  forbidden_explanation: Es decir que no tenés autorización para ver este contenido. <br> ¿Puede que hayas ingresado con una cuenta incorrecta?
101
105
  format: Dar formato
106
+ fullscreen: "Pantalla completa"
102
107
  gender: Género
108
+ get_messages: "Ver mensajes"
103
109
  go_to: 'Ir a %{organization}'
104
110
  gone_explanation: Este contenido ya no está disponible.
105
111
  guide: Lección
@@ -176,6 +182,7 @@ es:
176
182
  not_in_any_organizations: ¡Parece que no estás en ninguna organización todavía!
177
183
  notify_problem_with_exercise: Reportá un bug
178
184
  office: Secretaría
185
+ only_landscape_support: Por favor, rotá tu tablet o celular para realizar ejercicios
179
186
  opened: Abierta
180
187
  opened_count:
181
188
  one: '1 abierta'
@@ -201,6 +208,7 @@ es:
201
208
  processing_your_solution: Estamos procesando tu solución
202
209
  profile: Perfil
203
210
  profile_of: Perfil de %{username}
211
+ programming_since: Programando desde
204
212
  progress: Progreso
205
213
  read: Leido
206
214
  read_messages: Ver mensajes
@@ -253,6 +261,7 @@ es:
253
261
  submissions_count: Soluciones
254
262
  submissions_for: Soluciones para %{exercise}
255
263
  tag: Etiquetas
264
+ task: Consigna
256
265
  teacher_info: Información para docentes
257
266
  tell_us_how: ¡Contanos cómo te pasó esto!
258
267
  tell_us_if_our_error: Si pensás que es un error nuestro, %{issues}
@@ -284,15 +293,14 @@ es:
284
293
  view_details: Ver detalles
285
294
  want_permissions: El siguiente usuario requiere permisos
286
295
  we_miss_you: ¡Te extrañamos!
296
+ welcome: Te damos la bienvenida a %{name}!
287
297
  will_paginate:
288
298
  previous_label: "&#8592; Anterior"
289
299
  next_label: "Siguiente &#8594;"
290
300
  page_gap: "&hellip;"
291
301
  working: "Procesando"
292
302
  wrong_answer: La respuesta no es correcta
303
+ years: años
293
304
  you_must_sign_in_before_submitting: Tenés que iniciar sesión antes de empezar a enviar tus soluciones
294
305
  you_never_submitted_solutions: Parece que nunca enviaste soluciones desde que creaste tu cuenta.
295
- fullscreen: "Pantalla completa"
296
- get_messages: "Ver mensajes"
297
- task: Consigna
298
- only_landscape_support: Por favor, rotá tu tablet o celular para realizar ejercicios
306
+ your_new_organization: tu nueva organización