mumuki-laboratory 9.10.0 → 9.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +15 -9
  4. data/app/assets/javascripts/mumuki_laboratory/application/confirmation.js +10 -8
  5. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +5 -3
  6. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +4 -4
  7. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +12 -1
  8. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +8 -2
  9. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_dropdown.scss +11 -0
  10. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss +1 -1
  11. data/app/controllers/application_controller.rb +8 -4
  12. data/app/controllers/book_controller.rb +6 -0
  13. data/app/controllers/chapters_controller.rb +9 -0
  14. data/app/controllers/discussions_controller.rb +9 -0
  15. data/app/controllers/exercises_controller.rb +5 -0
  16. data/app/controllers/faqs_controller.rb +4 -0
  17. data/app/controllers/lessons_controller.rb +9 -0
  18. data/app/controllers/users_controller.rb +37 -0
  19. data/app/helpers/application_helper.rb +2 -2
  20. data/app/helpers/concerns/with_student_path_navigation.rb +1 -1
  21. data/app/helpers/content_view_helper.rb +8 -0
  22. data/app/helpers/discussions_helper.rb +1 -1
  23. data/app/helpers/icons_helper.rb +1 -1
  24. data/app/helpers/links_helper.rb +5 -1
  25. data/app/helpers/menu_bar_helper.rb +8 -5
  26. data/app/helpers/notifications_helper.rb +13 -0
  27. data/app/helpers/overlapped_buttons_helper.rb +2 -1
  28. data/app/helpers/time_zone_helper.rb +5 -0
  29. data/app/helpers/user_menu_helper.rb +4 -0
  30. data/app/mailers/user_mailer.rb +11 -1
  31. data/app/views/book/show.html.erb +16 -7
  32. data/app/views/chapters/show.html.erb +1 -0
  33. data/app/views/discussions/_new_message.html.erb +1 -1
  34. data/app/views/discussions/show.html.erb +5 -5
  35. data/app/views/exercise_solutions/_results.html.erb +1 -1
  36. data/app/views/guides/_guide.html.erb +2 -2
  37. data/app/views/layouts/_progress_bar.html.erb +1 -0
  38. data/app/views/layouts/_progress_listing.html.erb +1 -0
  39. data/app/views/layouts/_user_menu.html.erb +1 -0
  40. data/app/views/layouts/application.html.erb +4 -0
  41. data/app/views/layouts/exercise_inputs/forms/_kids_form.html.erb +1 -1
  42. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +6 -2
  43. data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +1 -1
  44. data/app/views/layouts/exercise_inputs/read_only_editors/_hidden.html.erb +0 -0
  45. data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_files.html.erb +4 -4
  46. data/app/views/layouts/exercise_inputs/read_only_editors/_upload.html.erb +0 -0
  47. data/app/views/layouts/mailer.html.erb +7 -1
  48. data/app/views/notifications/_custom.html.erb +1 -0
  49. data/app/views/notifications/_dropdown.html.erb +2 -2
  50. data/app/views/notifications/_exam_authorization_request_updated.html.erb +2 -0
  51. data/app/views/notifications/_exam_registration.html.erb +2 -1
  52. data/app/views/notifications/previews/_custom.html.erb +1 -0
  53. data/app/views/notifications/previews/_discussion.html.erb +2 -0
  54. data/app/views/notifications/previews/_exam_authorization_request_updated.html.erb +2 -0
  55. data/app/views/notifications/previews/_exam_registration.html.erb +2 -0
  56. data/app/views/notifications/previews/_message.html.erb +2 -0
  57. data/app/views/user_mailer/1st_reminder.html.erb +7 -349
  58. data/app/views/user_mailer/1st_reminder.text.erb +0 -4
  59. data/app/views/user_mailer/2nd_reminder.html.erb +7 -349
  60. data/app/views/user_mailer/2nd_reminder.text.erb +0 -4
  61. data/app/views/user_mailer/3rd_reminder.html.erb +7 -349
  62. data/app/views/user_mailer/3rd_reminder.text.erb +0 -4
  63. data/app/views/user_mailer/_mail_template.erb +336 -0
  64. data/app/views/user_mailer/certificate.html.erb +7 -335
  65. data/app/views/user_mailer/certificate.text.erb +0 -3
  66. data/app/views/user_mailer/no_submissions_reminder.html.erb +7 -349
  67. data/app/views/user_mailer/no_submissions_reminder.text.erb +0 -4
  68. data/app/views/user_mailer/notification.html.erb +1 -0
  69. data/app/views/user_mailer/notification.text.erb +6 -0
  70. data/app/views/user_mailer/notifications/_custom.html.erb +11 -0
  71. data/app/views/user_mailer/notifications/_exam_authorization_request_updated.html.erb +1 -0
  72. data/app/views/user_mailer/notifications/_exam_registration.html.erb +7 -0
  73. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_approved.html.erb +7 -0
  74. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_rejected.html.erb +7 -0
  75. data/app/views/users/manage_notifications.html.erb +26 -0
  76. data/app/views/users/notifications.html.erb +54 -0
  77. data/config/routes.rb +4 -0
  78. data/lib/mumuki/laboratory.rb +1 -0
  79. data/lib/mumuki/laboratory/controllers.rb +1 -0
  80. data/lib/mumuki/laboratory/controllers/authorization.rb +5 -1
  81. data/lib/mumuki/laboratory/controllers/notifications.rb +2 -2
  82. data/lib/mumuki/laboratory/controllers/validate_access_mode.rb +15 -0
  83. data/lib/mumuki/laboratory/locales/en.yml +35 -1
  84. data/lib/mumuki/laboratory/locales/es-CL.yml +35 -1
  85. data/lib/mumuki/laboratory/locales/es.yml +36 -2
  86. data/lib/mumuki/laboratory/locales/pt.yml +35 -1
  87. data/lib/mumuki/laboratory/mailers/message_delivery.rb +15 -0
  88. data/lib/mumuki/laboratory/version.rb +1 -1
  89. data/spec/controllers/users_controller_spec.rb +48 -0
  90. data/spec/dummy/db/schema.rb +7 -1
  91. data/spec/features/menu_bar_spec.rb +3 -2
  92. data/spec/features/not_found_private_flow_spec.rb +1 -1
  93. data/spec/features/notifications_flow_spec.rb +2 -1
  94. data/spec/features/read_only_flow_spec.rb +920 -0
  95. data/spec/javascripts/editors-spec.js +21 -3
  96. data/spec/javascripts/submissions-store-spec.js +11 -0
  97. data/spec/mailers/previews/user_mailer_preview.rb +87 -1
  98. metadata +35 -19
  99. data/app/views/notifications/_discussion.html.erb +0 -1
  100. data/app/views/notifications/_exam_authorization_request.html.erb +0 -1
  101. data/app/views/notifications/_message.html.erb +0 -1
@@ -4,10 +4,6 @@
4
4
  <%= t :you_never_submitted_solutions %>
5
5
 
6
6
  <%= t :dont_leave_us %>
7
- <%= t :keep_learning %>
8
7
 
9
8
 
10
9
  © Copyright 2015-<%= Time.current.year %> Mumuki.
11
-
12
- <%= t :stop_emails? %>
13
- <%= t :cancel_subscription %>
@@ -0,0 +1 @@
1
+ <%= render partial: "user_mailer/notifications/#{@notification.subject}" %>
@@ -0,0 +1,6 @@
1
+ <%= t :you_have_a_new_notification %>
2
+
3
+ <%= render(partial: "notifications/#{@notification.subject}", locals: { notification: @notification }) %>
4
+
5
+
6
+ © Copyright 2015-<%= Time.current.year %> Mumuki.
@@ -0,0 +1,11 @@
1
+ <% if @notification.custom_content_html.present? %>
2
+ <%= render inline: @notification.custom_content_html %>
3
+ <% else %>
4
+ <%= render partial: 'user_mailer/mail_template', locals: {
5
+ title: t("mailer.title.custom"),
6
+ subtitle: '',
7
+ text: @notification.custom_content_plain_text,
8
+ button: t("mailer.button.custom"),
9
+ url: @organization.url_for('/user/notifications')
10
+ } %>
11
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= render partial: "user_mailer/notifications/exam_authorization_request_updated/#{@notification.target.status}" %>
@@ -0,0 +1,7 @@
1
+ <%= render partial: 'user_mailer/mail_template', locals: {
2
+ title: t("mailer.title.exam_registration"),
3
+ subtitle: t("mailer.subtitle.exam_registration"),
4
+ text: t("mailer.text.exam_registration", exam_registration_deadline: local_time(@notification.target.end_time, @organization.time_zone)),
5
+ button: t("mailer.button.exam_registration"),
6
+ url: exam_registration_url(@organization, @notification.target)
7
+ } %>
@@ -0,0 +1,7 @@
1
+ <%= render partial: 'user_mailer/mail_template', locals: {
2
+ title: t(:congratulations),
3
+ subtitle: t('mailer.subtitle.exam_authorization_request_approved'),
4
+ text: t('mailer.text.exam_authorization_request_approved', exam_start_date: local_time(@notification.target.exam.start_time, @organization.time_zone)),
5
+ button: t('mailer.button.exam_authorization_request_approved'),
6
+ url: @organization.url
7
+ } %>
@@ -0,0 +1,7 @@
1
+ <%= render partial: 'user_mailer/mail_template', locals: {
2
+ title: t("mailer.title.exam_authorization_request_rejected"),
3
+ subtitle: t("mailer.subtitle.exam_authorization_request_rejected"),
4
+ text: t("mailer.text.exam_authorization_request_rejected"),
5
+ button: t("mailer.button.exam_authorization_request_rejected"),
6
+ url: @organization.url_for('/user/exam_authorizations')
7
+ } %>
@@ -0,0 +1,26 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs_for_my_account %>
3
+ <% end %>
4
+
5
+ <div class="row">
6
+ <%= form_for :notifications, html: {class: 'mu-form'} do |f| %>
7
+ <div class="mu-tab-body">
8
+ <div class="mu-user-header">
9
+ <h1><%= t(:manage_notifications) %></h1>
10
+ <div class="mu-profile-actions d-none d-md-block">
11
+ <a class="btn btn-secondary" href="<%= notifications_user_path %>">Cancelar</a>
12
+ <button type="submit" class="btn btn-complementary"><%= t :save %></button>
13
+ </div>
14
+ </div>
15
+
16
+ <p><%= t(:i_want_emails_of) %>:</p>
17
+ <% Notification.subjects.keys.each do |subject| %>
18
+ <div class="form-check">
19
+ <%= label_tag subject, t("notification_subject.#{subject}"), class: 'form-check-label' %>
20
+ <%= f.check_box subject, checked: !@user.ignored_notifications.include?(subject), class: 'form-check-input' %>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+
@@ -0,0 +1,54 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs_for_my_account %>
3
+ <% end %>
4
+
5
+ <div class="row">
6
+ <%= render partial: 'layouts/user_menu' %>
7
+
8
+ <div class="col-md-9 mu-tab-body">
9
+ <div class="mu-user-header d-flex justify-content-between">
10
+ <span>
11
+ <h1><%= t(:notifications) %></h1>
12
+ </span>
13
+ <span>
14
+ <a href="notifications/manage" class="btn btn-complementary"><%= t(:manage_notifications) %></a>
15
+ </span>
16
+ </div>
17
+ <% if @notifications.empty? %>
18
+ <div class="mu-tab-body">
19
+ <%= t :notifications_will_be_here %>
20
+ </div>
21
+ <% else %>
22
+
23
+
24
+ <div class="table-responsive mb-3">
25
+ <table class="table">
26
+ <tr class="fw-bold">
27
+ <td></td>
28
+ <td><%= t(:content) %></td>
29
+ <td><%= t(:created_at) %></td>
30
+ </tr>
31
+
32
+ <% @notifications.each do |notification| %>
33
+ <tr class="<%= background_for_notification notification %>" >
34
+ <td class="col-md-1">
35
+ <%= link_to icon_for_read(notification.read?), "notifications/#{notification.id}/toggle_read", tooltip_options(:toggle_read).merge(method: :post, role: :button) %>
36
+ </td>
37
+ <td class="col-md-8 text-break">
38
+ <%= render partial: "notifications/#{notification.subject}", locals: { notification: notification } %>
39
+ </td>
40
+ <td class="col-md-3">
41
+ <%= t(:time_since, time: time_ago_in_words(notification.created_at)) %>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+ </table>
46
+ </div>
47
+
48
+ <div class="notification-pagination">
49
+ <%= paginate @notifications, nav_class: 'pagination' %>
50
+ </div>
51
+ <% end %>
52
+ </div>
53
+ </div>
54
+
data/config/routes.rb CHANGED
@@ -72,6 +72,10 @@ Rails.application.routes.draw do
72
72
  get :certificates
73
73
  get :exam_authorizations
74
74
 
75
+ get :notifications
76
+ post 'notifications/:id/toggle_read', action: :toggle_read
77
+ get 'notifications/manage', action: :show_manage_notifications
78
+ post 'notifications/manage', action: :manage_notifications
75
79
  end
76
80
 
77
81
  resources :faqs, only: [:index]
@@ -59,3 +59,4 @@ require_relative './laboratory/version'
59
59
  require_relative './laboratory/extensions'
60
60
  require_relative './laboratory/controllers'
61
61
  require_relative './laboratory/engine'
62
+ require_relative './laboratory/mailers/message_delivery'
@@ -14,3 +14,4 @@ require_relative './controllers/nested_in_exercise'
14
14
  require_relative './controllers/results_rendering'
15
15
  require_relative './controllers/exercise_seed'
16
16
  require_relative './controllers/content'
17
+ require_relative './controllers/validate_access_mode'
@@ -1,10 +1,14 @@
1
1
  module Mumuki::Laboratory::Controllers::Authorization
2
2
  def authorize_if_private!
3
3
  return if Organization.current.public? || from_sessions?
4
- authorize! :student
4
+ authorize! authorization_minimum_role
5
5
  end
6
6
 
7
7
  def authorization_slug
8
8
  Organization.current.slug
9
9
  end
10
+
11
+ def authorization_minimum_role
12
+ :student
13
+ end
10
14
  end
@@ -4,10 +4,10 @@ module Mumuki::Laboratory::Controllers::Notifications
4
4
  end
5
5
 
6
6
  def notifications_count
7
- notifications.size
7
+ user_notifications.size
8
8
  end
9
9
 
10
- def notifications
10
+ def user_notifications
11
11
  current_user.try(:unread_notifications) || []
12
12
  end
13
13
  end
@@ -0,0 +1,15 @@
1
+ module Mumuki::Laboratory::Controllers::ValidateAccessMode
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ before_action :validate_accessible!, only: :show
6
+ end
7
+
8
+ def validate_accessible!
9
+ current_access_mode.validate_content_here! subject_container
10
+ end
11
+
12
+ def subject_container
13
+ subject
14
+ end
15
+ end
@@ -37,6 +37,8 @@ en:
37
37
  cancel: Cancel
38
38
  cancel_subscription: Cancel your subscription.
39
39
  certificate: Certificate
40
+ certificate_available: Your certificate is available!
41
+ certificate_download: You can find it attached to this email or in your Mumuki profile
40
42
  certificates: Certificates
41
43
  certificates_will_be_here: Your certificates in the organization will appear here.
42
44
  certificate_verified_legend: "<strong>%{full_name}</strong>'s account is verified. Mumuki certifies their successful completion of <strong>%{description}</strong>."
@@ -56,6 +58,7 @@ en:
56
58
  confirm: Confirm
57
59
  confirm_reset: You are about to restart your exercise. Do you want to proceed?
58
60
  confirm_restart: You are about to delete your progress for this guide. Do you want to proceed?
61
+ congratulations: Congratulations!
59
62
  console: Console
60
63
  contact_administrator: 'If you think this is not supposed to happen, please contact %{link}'
61
64
  content: Content
@@ -86,7 +89,7 @@ en:
86
89
  disabled_organization_explanation: This path has already finished.
87
90
  discussion_created_by: Created by
88
91
  discussion_description_placeholder: You can add more information regarding your doubt.
89
- new_discussion_message: New message on %{title}
92
+ new_discussion_message: New reply on %{title}
90
93
  discussion_updated: Discussion updated
91
94
  discussions: Discussions
92
95
  discussions_read: Read
@@ -162,6 +165,7 @@ en:
162
165
  hidden_done: 'Good!'
163
166
  history: History
164
167
  home: Home
168
+ i_want_emails_of: I want to receive emails of
165
169
  important_info: Important information
166
170
  initial_state: Initial board
167
171
  insert_file_name: Insert a file name
@@ -189,7 +193,28 @@ en:
189
193
  loading: Loading
190
194
  load_solution_into_console: Load your solution into the console
191
195
  locked_content: 'This content will be unlocked when you finish previous chapters'
196
+ mailer:
197
+ title:
198
+ exam_authorization_request_updated: There are updates in your exam registration
199
+ exam_authorization_request_rejected: Exam registration rejected
200
+ exam_registration: Exam registrations open
201
+ custom: You have a new notification!
202
+ subtitle:
203
+ exam_authorization_request_approved: Your registration request to the exam has been approved.
204
+ exam_authorization_request_rejected: Your registration request to the exam has been rejected because the requirements weren't met.
205
+ exam_registration: ¡You can register for the exam!
206
+ text:
207
+ exam_authorization_request_approved: You can sit for the exam on %{exam_start_date} by going into the platform. ¡Good luck!
208
+ exam_authorization_request_rejected: ¡Don't be upset! You did a great job and we hope you'll keep learning programming.
209
+ exam_registration: You have until %{exam_registration_deadline} to sign up. In order to be approved, you must meet the requirements.
210
+ button:
211
+ exam_registration: Sign up for the exam
212
+ exam_authorization_request_approved: Go to the platform
213
+ exam_authorization_request_rejected: My exams
214
+ custom: My notifications
192
215
  male: Male
216
+ manage_notification_subscriptions: Manage your notification subscriptions
217
+ manage_notifications: Manage notifications
193
218
  manual_evaluation_pending: Thanks for submitting your solution! It will be revised by the course teachers soon
194
219
  medal: Medal
195
220
  message: Message
@@ -211,6 +236,7 @@ en:
211
236
  you_wont_confirmation: You won't take care of this discussion.
212
237
  my_account: My account
213
238
  my_doubts: My doubts
239
+ my_notifications: My notifications
214
240
  my_profile: My profile
215
241
  my_submissions: My Submissions
216
242
  name: Name
@@ -238,7 +264,12 @@ en:
238
264
  no_useful_result: Didn't find what you were looking for?
239
265
  not_found_explanation: 'You may have mistyped the address or the page may have moved.'
240
266
  not_in_any_organizations: It seems you aren't in any organizations yet!
267
+ notification_subject:
268
+ custom: General announcements
269
+ exam_authorization_request_updated: Exam registrations updated
270
+ exam_registration: Exam registrations enabled
241
271
  notifications: Notifications
272
+ notifications_will_be_here: Notifications will be here
242
273
  notify_problem_with_exercise: Report a bug
243
274
  office: Office
244
275
  only_landscape_support: Please, rotate your tablet or cellphone to continue practicing
@@ -258,6 +289,7 @@ en:
258
289
  permissions: Permissions
259
290
  please_fill_profile_data: Please complete your profile data to continue!
260
291
  please_validate: 'Please validate your data before continue:'
292
+ preferences_updated_successfully: Preferences updated successfully
261
293
  preview: Preview
262
294
  preview_error: The preview cannot be shown. Check your internet connection or try with a shorter message.
263
295
  previous_exercise: Previous
@@ -334,6 +366,7 @@ en:
334
366
  to_opened: Reopen
335
367
  to_pending_review: Mark as solved
336
368
  to_solved: Mark as solved
369
+ toggle_read: "Toggle read/unread"
337
370
  unauthorized_explanation: You have no permissions for this content. Maybe you logged in with another account.
338
371
  total: Total
339
372
  undo_upvote: Undo upvote
@@ -361,6 +394,7 @@ en:
361
394
  wrong_answer: The answer is wrong
362
395
  years: years old
363
396
  you_earned: You earned
397
+ you_have_a_new_notification: You have a new notification!
364
398
  you_must_sign_in_before_submitting: You must sign in before submitting your solutions
365
399
  you_never_submitted_solutions: It seems that you've never submitted solutions since you created your account.
366
400
  your_new_organization: your new organization
@@ -35,6 +35,8 @@ es-CL:
35
35
  blocked_forum_explanation: ¿Puede que estés en medio de un examen?
36
36
  cancel_subscription: Cancela tu subscripción.
37
37
  certificate: Certificado
38
+ certificate_available: Ya está disponible tu certificado
39
+ certificate_download: Descargalo desde el adjunto de este mail o visualizalo en tu perfil de Mumuki
38
40
  certificates: Certificados
39
41
  certificates_will_be_here: Tus certificados en esta organización aparecerán aquí
40
42
  certificate_verified_legend: "La cuenta de <strong>%{full_name}</strong> ha sido verificada. Mumuki certifica que completó el curso de <strong>%{description}.</strong>"
@@ -55,6 +57,7 @@ es-CL:
55
57
  confirm: Confirmar
56
58
  confirm_reset: Estás por reiniciar tu ejercicio. ¿Quieres continuar?
57
59
  confirm_restart: Estás por borrar tu progreso en esta guía. ¿Quieres continuar?
60
+ congratulations: ¡Felicitaciones!
58
61
  console: Consola
59
62
  contact_administrator: 'Si piensas que es un error, comunícate con %{link}'
60
63
  content: Contenido
@@ -87,7 +90,7 @@ es-CL:
87
90
  details: Detalles
88
91
  disabled_explanation: Estás intentando acceder a un recurso que fue deshabilitado o eliminado de forma permanente
89
92
  disabled_organization_explanation: ¡Este recorrido ha finalizado!
90
- new_discussion_message: Mensaje nuevo en %{title}
93
+ new_discussion_message: Respuesta nueva en %{title}
91
94
  discussion_created_by: Creada por
92
95
  discussion_updated: Consulta actualizada
93
96
  discussions: Consultas
@@ -163,6 +166,7 @@ es-CL:
163
166
  home: Inicio
164
167
  hour: hora
165
168
  hours: horas
169
+ i_want_emails_of: Quiero recibir emails de
166
170
  important_info: Información importante
167
171
  initial_state: Tablero inicial
168
172
  insert_file_name: Ingresa un nombre de archivo
@@ -191,7 +195,28 @@ es-CL:
191
195
  loading: Cargando
192
196
  load_solution_into_console: Cargar la solución en la consola
193
197
  locked_content: 'Éste contenido se desbloqueará cuando termines los capítulos anteriores'
198
+ mailer:
199
+ title:
200
+ exam_authorization_request_updated: Tenés cambios en tu inscripción al examen
201
+ exam_authorization_request_rejected: Inscripción rechazada
202
+ exam_registration: Apertura de inscripciones
203
+ custom: ¡Tenés una nueva notificación!
204
+ subtitle:
205
+ exam_authorization_request_approved: Tu solicitud de inscripción al examen fue aprobada.
206
+ exam_authorization_request_rejected: Tu solicitud de inscripción al examen fue rechazada ya que no se cumplieron los requisitos.
207
+ exam_registration: ¡Ya podés inscribirte al examen!
208
+ text:
209
+ exam_authorization_request_approved: Podrás rendir el examen el día %{exam_start_date} ingresando a la plataforma. ¡Éxitos!
210
+ exam_authorization_request_rejected: ¡No te desanimes! Hiciste un gran esfuerzo y esperamos que continúes aprendiendo programación.
211
+ exam_registration: Tenés tiempo de inscribirte hasta el %{exam_registration_deadline}. Para que tu inscripción sea aceptada debés cumplir con los requisitos.
212
+ button:
213
+ exam_registration: Inscribirme al Examen
214
+ exam_authorization_request_approved: Ir a la plataforma
215
+ exam_authorization_request_rejected: Mis exámenes
216
+ custom: Mis notificaciones
194
217
  male: Hombre
218
+ manage_notification_subscriptions: Administrá tus notificaciones
219
+ manage_notifications: Administrar notificaciones
195
220
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
196
221
  medal: Medalla
197
222
  message: Mensaje
@@ -215,6 +240,7 @@ es-CL:
215
240
  you_wont_confirmation: No te vas a ocupar de esta consulta.
216
241
  my_account: Mi cuenta
217
242
  my_doubts: Mis consultas
243
+ my_notifications: Mis notificaciones
218
244
  my_profile: Mi perfil
219
245
  name: Nombre
220
246
  navigation_continue: 'Siguiente %{kind}: %{sibling}'
@@ -244,7 +270,12 @@ es-CL:
244
270
  not_found: ¡La página que buscaste no existe!
245
271
  not_found_explanation: Fíjate si escribiste bien la dirección.
246
272
  not_in_any_organizations: ¡Parece que no estás en ninguna organización todavía!
273
+ notification_subject:
274
+ custom: Anuncios generales
275
+ exam_authorization_request_updated: Cambios sobre inscripciones a exámenes
276
+ exam_registration: Inscripciones a exámenes habilitadas
247
277
  notifications: Notificaciones
278
+ notifications_will_be_here: Tus notificaciones aparecerán aquí
248
279
  notify_problem_with_exercise: Reporta un bug
249
280
  office: Secretaría
250
281
  only_landscape_support: Por favor, rota tu tablet o celular para realizar ejercicios
@@ -267,6 +298,7 @@ es-CL:
267
298
  permissions: Permisos
268
299
  please_fill_profile_data: ¡Completa tus datos personales para continuar!
269
300
  please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor valida que tus datos a continuación sean reales y correctos.'
301
+ preferences_updated_successfully: Tus preferencias se actualizaron correctamente
270
302
  preview: Vista previa
271
303
  preview_error: No se puede mostrar la vista previa. Revisa tu conexión a internet o prueba con un mensaje más corto.
272
304
  previous_exercise: Anterior
@@ -346,6 +378,7 @@ es-CL:
346
378
  to_opened: Reabrir
347
379
  to_pending_review: Resolver
348
380
  to_solved: Resolver
381
+ toggle_read: "Marcar como leído/no leído"
349
382
  unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
350
383
  total: Total
351
384
  uncategorized: No categorizado
@@ -376,5 +409,6 @@ es-CL:
376
409
  working: "Procesando"
377
410
  wrong_answer: La respuesta no es correcta
378
411
  you_earned: Ganaste
412
+ you_have_a_new_notification: ¡Tenés una nueva notificación!
379
413
  you_must_sign_in_before_submitting: Tienes que iniciar sesión antes de empezar a enviar tus soluciones
380
414
  you_never_submitted_solutions: Parece que nunca enviaste soluciones desde que creaste tu cuenta.
@@ -39,9 +39,11 @@ es:
39
39
  cancel: Cancelar
40
40
  cancel_subscription: Cancelá tu subscripción.
41
41
  certificate: Certificado
42
+ certificate_available: Ya está disponible tu certificado
43
+ certificate_download: Descargalo desde el adjunto de este mail o visualizalo en tu perfil de Mumuki
44
+ certificate_verified_legend: "La cuenta de <strong>%{full_name}</strong> está verificada. Mumuki certifica que completó el curso de <strong>%{description}.</strong>"
42
45
  certificates: Certificados
43
46
  certificates_will_be_here: Tus certificados en esta organización aparecerán acá
44
- certificate_verified_legend: "La cuenta de <strong>%{full_name}</strong> está verificada. Mumuki certifica que completó el curso de <strong>%{description}.</strong>"
45
47
  chapter: Capítulo
46
48
  chapters: Capítulos
47
49
  chapter_finished_html: ¡Terminaste %{chapter}! ¡Felicitaciones!
@@ -58,6 +60,7 @@ es:
58
60
  confirm: Confirmar
59
61
  confirm_reset: Estás por reiniciar tu ejercicio. ¿Querés continuar?
60
62
  confirm_restart: Estás por borrar tu progreso en esta guía. ¿Querés continuar?
63
+ congratulations: ¡Felicitaciones!
61
64
  console: Consola
62
65
  contact_administrator: 'Si pensás que es un error, comunicate con %{link}'
63
66
  content: Contenido
@@ -95,7 +98,7 @@ es:
95
98
  discussion_created_by: Creada por
96
99
  discussion_description_placeholder: Podés agregar información para detallar más tu consulta
97
100
  discussion_updated: Consulta actualizada
98
- new_discussion_message: Mensaje nuevo en %{title}
101
+ new_discussion_message: Respuesta nueva en %{title}
99
102
  discussions: Consultas
100
103
  discussions_read: Leídas
101
104
  discussions_unread: No leídas
@@ -172,6 +175,7 @@ es:
172
175
  home: Inicio
173
176
  hour: hora
174
177
  hours: horas
178
+ i_want_emails_of: Quiero recibir emails de
175
179
  important_info: Información importante
176
180
  initial_state: Tablero inicial
177
181
  insert_file_name: Ingresa un nombre de archivo
@@ -200,7 +204,28 @@ es:
200
204
  loading: Cargando
201
205
  load_solution_into_console: Cargar la solución en la consola
202
206
  locked_content: 'Este contenido se desbloqueará cuando termines los capítulos anteriores'
207
+ mailer:
208
+ title:
209
+ exam_authorization_request_updated: Tenés cambios en tu inscripción al examen
210
+ exam_authorization_request_rejected: Inscripción rechazada
211
+ exam_registration: Apertura de inscripciones
212
+ custom: ¡Tenés una nueva notificación!
213
+ subtitle:
214
+ exam_authorization_request_approved: Tu solicitud de inscripción al examen fue aprobada.
215
+ exam_authorization_request_rejected: Tu solicitud de inscripción al examen fue rechazada ya que no se cumplieron los requisitos.
216
+ exam_registration: ¡Ya podés inscribirte al examen!
217
+ text:
218
+ exam_authorization_request_approved: Podrás rendir el examen el día %{exam_start_date} ingresando a la plataforma. ¡Éxitos!
219
+ exam_authorization_request_rejected: ¡No te desanimes! Hiciste un gran esfuerzo y esperamos que continúes aprendiendo programación.
220
+ exam_registration: Tenés tiempo de inscribirte hasta el %{exam_registration_deadline}. Para que tu inscripción sea aceptada debés cumplir con los requisitos.
221
+ button:
222
+ exam_registration: Inscribirme al Examen
223
+ exam_authorization_request_approved: Ir a la plataforma
224
+ exam_authorization_request_rejected: Mis exámenes
225
+ custom: Mis notificaciones
203
226
  male: Hombre
227
+ manage_notification_subscriptions: Administrá tus notificaciones
228
+ manage_notifications: Administrar notificaciones
204
229
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
205
230
  medal: Medalla
206
231
  message: Mensaje
@@ -224,6 +249,7 @@ es:
224
249
  you_wont_confirmation: No te vas a ocupar de esta consulta.
225
250
  my_account: Mi cuenta
226
251
  my_doubts: Mis consultas
252
+ my_notifications: Mis notificaciones
227
253
  my_profile: Mi perfil
228
254
  name: Nombre
229
255
  navigation_continue: 'Siguiente %{kind}: %{sibling}'
@@ -253,7 +279,12 @@ es:
253
279
  not_found: ¡La página que buscaste no existe!
254
280
  not_found_explanation: Fijate si escribiste bien la dirección.
255
281
  not_in_any_organizations: ¡Parece que no estás en ninguna organización todavía!
282
+ notification_subject:
283
+ custom: Anuncios generales
284
+ exam_authorization_request_updated: Cambios sobre inscripciones a exámenes
285
+ exam_registration: Inscripciones a exámenes habilitadas
256
286
  notifications: Notificaciones
287
+ notifications_will_be_here: Tus notificaciones aparecerán aquí
257
288
  notify_problem_with_exercise: Reportá un bug
258
289
  office: Secretaría
259
290
  only_landscape_support: Por favor, rotá tu tablet o celular para realizar ejercicios
@@ -276,6 +307,7 @@ es:
276
307
  permissions: Permisos
277
308
  please_fill_profile_data: ¡Completá tus datos personales para continuar!
278
309
  please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor validá que tus datos a continuación sean reales y correctos.'
310
+ preferences_updated_successfully: Tus preferencias se actualizaron correctamente
279
311
  preview: Vista previa
280
312
  preview_error: No se puede mostrar la vista previa. Revisá tu conexión a internet o probá con un mensaje más corto.
281
313
  previous_exercise: Anterior
@@ -360,6 +392,7 @@ es:
360
392
  to_opened: Reabrir
361
393
  to_pending_review: Resolver
362
394
  to_solved: Resolver
395
+ toggle_read: "Marcar como leído/no leído"
363
396
  unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
364
397
  total: Total
365
398
  uncategorized: No categorizado
@@ -392,6 +425,7 @@ es:
392
425
  wrong_answer: La respuesta no es correcta
393
426
  years: años
394
427
  you_earned: Ganaste
428
+ you_have_a_new_notification: ¡Tenés una nueva notificación!
395
429
  you_must_sign_in_before_submitting: Tenés que iniciar sesión antes de empezar a enviar tus soluciones
396
430
  you_never_submitted_solutions: Parece que nunca enviaste soluciones desde que creaste tu cuenta.
397
431
  your_new_organization: tu nueva organización