mumuki-laboratory 9.8.2 → 9.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +15 -9
  3. data/app/assets/javascripts/mumuki_laboratory/application/confirmation.js +10 -8
  4. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +5 -3
  5. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +1 -30
  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/_discussion.scss +32 -34
  10. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_dropdown.scss +11 -0
  11. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_editor.scss +3 -0
  12. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss +1 -1
  13. data/app/controllers/application_controller.rb +1 -1
  14. data/app/controllers/messages_controller.rb +2 -5
  15. data/app/controllers/users_controller.rb +38 -1
  16. data/app/helpers/application_helper.rb +6 -2
  17. data/app/helpers/discussions_helper.rb +11 -4
  18. data/app/helpers/exam_registration_helper.rb +0 -4
  19. data/app/helpers/icons_helper.rb +1 -1
  20. data/app/helpers/menu_bar_helper.rb +7 -3
  21. data/app/helpers/messages_helper.rb +4 -8
  22. data/app/helpers/notifications_helper.rb +13 -0
  23. data/app/helpers/profile_helper.rb +4 -0
  24. data/app/helpers/time_zone_helper.rb +5 -0
  25. data/app/helpers/user_discussions_helper.rb +38 -0
  26. data/app/helpers/user_menu_helper.rb +4 -0
  27. data/app/mailers/user_mailer.rb +11 -1
  28. data/app/views/discussions/new.html.erb +1 -1
  29. data/app/views/layouts/_copyright.html.erb +1 -1
  30. data/app/views/layouts/_discussions.html.erb +1 -37
  31. data/app/views/layouts/_discussions_list.html.erb +38 -0
  32. data/app/views/layouts/_messages.html.erb +1 -7
  33. data/app/views/layouts/_user_menu.html.erb +1 -0
  34. data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +1 -1
  35. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
  36. data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +1 -1
  37. data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_files.html.erb +4 -4
  38. data/app/views/layouts/mailer.html.erb +7 -1
  39. data/app/views/notifications/_custom.html.erb +1 -0
  40. data/app/views/notifications/_dropdown.html.erb +2 -2
  41. data/app/views/notifications/_exam_authorization_request_updated.html.erb +2 -0
  42. data/app/views/notifications/_exam_registration.html.erb +2 -1
  43. data/app/views/notifications/previews/_custom.html.erb +1 -0
  44. data/app/views/notifications/previews/_discussion.html.erb +2 -0
  45. data/app/views/notifications/previews/_exam_authorization_request_updated.html.erb +2 -0
  46. data/app/views/notifications/previews/_exam_registration.html.erb +2 -0
  47. data/app/views/notifications/previews/_message.html.erb +2 -0
  48. data/app/views/user_mailer/1st_reminder.html.erb +7 -349
  49. data/app/views/user_mailer/1st_reminder.text.erb +1 -5
  50. data/app/views/user_mailer/2nd_reminder.html.erb +7 -349
  51. data/app/views/user_mailer/2nd_reminder.text.erb +1 -5
  52. data/app/views/user_mailer/3rd_reminder.html.erb +7 -349
  53. data/app/views/user_mailer/3rd_reminder.text.erb +1 -5
  54. data/app/views/user_mailer/_mail_template.erb +336 -0
  55. data/app/views/user_mailer/certificate.html.erb +7 -335
  56. data/app/views/user_mailer/certificate.text.erb +1 -4
  57. data/app/views/user_mailer/no_submissions_reminder.html.erb +7 -349
  58. data/app/views/user_mailer/no_submissions_reminder.text.erb +1 -5
  59. data/app/views/user_mailer/notification.html.erb +1 -0
  60. data/app/views/user_mailer/notification.text.erb +6 -0
  61. data/app/views/user_mailer/notifications/_custom.html.erb +11 -0
  62. data/app/views/user_mailer/notifications/_exam_authorization_request_updated.html.erb +1 -0
  63. data/app/views/user_mailer/notifications/_exam_registration.html.erb +7 -0
  64. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_approved.html.erb +7 -0
  65. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_rejected.html.erb +7 -0
  66. data/app/views/users/_basic_profile_fields.html.erb +30 -0
  67. data/app/views/users/_profile_fields.html.erb +1 -20
  68. data/app/views/users/discussions.html.erb +19 -11
  69. data/app/views/users/manage_notifications.html.erb +26 -0
  70. data/app/views/users/messages.html.erb +1 -1
  71. data/app/views/users/notifications.html.erb +54 -0
  72. data/config/routes.rb +4 -1
  73. data/lib/mumuki/laboratory.rb +1 -0
  74. data/lib/mumuki/laboratory/controllers/notifications.rb +2 -2
  75. data/lib/mumuki/laboratory/locales/en.yml +47 -7
  76. data/lib/mumuki/laboratory/locales/es-CL.yml +48 -7
  77. data/lib/mumuki/laboratory/locales/es.yml +49 -9
  78. data/lib/mumuki/laboratory/locales/pt.yml +46 -6
  79. data/lib/mumuki/laboratory/mailers/message_delivery.rb +15 -0
  80. data/lib/mumuki/laboratory/version.rb +1 -1
  81. data/spec/controllers/organizations_api_controller_spec.rb +6 -1
  82. data/spec/controllers/students_api_controller_spec.rb +1 -1
  83. data/spec/controllers/users_controller_spec.rb +48 -0
  84. data/spec/dummy/db/schema.rb +9 -1
  85. data/spec/features/not_found_public_flow_spec.rb +1 -1
  86. data/spec/features/notifications_flow_spec.rb +2 -1
  87. data/spec/features/profile_flow_spec.rb +1 -1
  88. data/spec/javascripts/editors-spec.js +21 -3
  89. data/spec/javascripts/submissions-store-spec.js +11 -0
  90. data/spec/mailers/previews/user_mailer_preview.rb +87 -1
  91. metadata +134 -115
  92. data/app/views/messages/errors.html.erb +0 -1
  93. data/app/views/notifications/_discussion.html.erb +0 -1
  94. data/app/views/notifications/_exam_authorization_request.html.erb +0 -1
  95. 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
- © Copyright 2015-<%= DateTime.now.year %> Mumuki.
11
-
12
- <%= t :stop_emails? %>
13
- <%= t :cancel_subscription %>
9
+ © Copyright 2015-<%= Time.current.year %> Mumuki.
@@ -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,30 @@
1
+ <fieldset>
2
+ <div><%= form.label(t :first_name) %></div>
3
+ <div><%= form.text_field :first_name, required: true, class: 'form-control' %></div>
4
+ </fieldset>
5
+ <fieldset>
6
+ <div><%= form.label(t :last_name) %></div>
7
+ <div><%= form.text_field :last_name, required: true, class: 'form-control' %></div>
8
+ </fieldset>
9
+ <fieldset>
10
+ <div><%= form.label(t :gender) %></div>
11
+ <div><%= form.select :gender, options_for_select(User.genders.map { |gender, _| [t(gender), gender] }, @user.gender), {}, required: true, class: 'form-control form-select' %></div>
12
+ </fieldset>
13
+ <fieldset>
14
+ <div><%= form.label(t :birthdate) %></div>
15
+ <div><%= form.date_field :birthdate, min: Date.new(1900), max: 3.years.ago.end_of_year, required: true, class: 'form-control' %></div>
16
+ </fieldset>
17
+ <fieldset>
18
+ <div><%= form.label(t :email) %></div>
19
+ <div><%= form.text_field :email, readonly: true, class: 'form-control' %></div>
20
+ </fieldset>
21
+
22
+ <% if show_verified_full_name_notice?(@user, Organization.current) %>
23
+ <label><%= (t :verified_full_name) %></label>
24
+ <input class="form-control" readonly="readonly" value="<%= @user.verified_full_name %>">
25
+ <p class="fs-7">
26
+ <%= fa_icon("question-circle", text: (t :verified_full_name_notice,
27
+ organization: Organization.current.display_name,
28
+ contact: Organization.current.contact_email)) %>
29
+ </p>
30
+ <% end %>
@@ -1,20 +1 @@
1
- <fieldset>
2
- <div><%= form.label(t :first_name) %></div>
3
- <div><%= form.text_field :first_name, required: true, class: 'form-control' %></div>
4
- </fieldset>
5
- <fieldset>
6
- <div><%= form.label(t :last_name) %></div>
7
- <div><%= form.text_field :last_name, required: true, class: 'form-control' %></div>
8
- </fieldset>
9
- <fieldset>
10
- <div><%= form.label(t :gender) %></div>
11
- <div><%= form.select :gender, options_for_select(User.genders.map { |gender, _| [t(gender), gender] }, @user.gender), {}, required: true, class: 'form-control form-select' %></div>
12
- </fieldset>
13
- <fieldset>
14
- <div><%= form.label(t :birthdate) %></div>
15
- <div><%= form.date_field :birthdate, min: Date.new(1900), max: 3.years.ago.end_of_year, required: true, class: 'form-control' %></div>
16
- </fieldset>
17
- <fieldset>
18
- <div><%= form.label(t :email) %></div>
19
- <div><%= form.text_field :email, readonly: true, class: 'form-control' %></div>
20
- </fieldset>
1
+ <%= render partial: 'users/basic_profile_fields', locals: {form: form} %>
@@ -14,17 +14,25 @@
14
14
  <%= t :discussions_will_be_here %>
15
15
  </div>
16
16
  <% else %>
17
- <table class="table table-striped">
18
- <% @watched_discussions.each do |discussion| %>
19
- <tr>
20
- <td>
21
- <%= icon_for_read(discussion.read_by?(@user)) %>
22
- </td>
23
- <td><%= link_to discussion.item.name, item_discussion_path(discussion) %></td>
24
- <td><%= time_ago_in_words discussion.last_message_date %></td>
25
- </tr>
26
- <% end %>
27
- </table>
17
+ <div class="table-responsive mb-3">
18
+ <table class="table">
19
+ <% @watched_discussions.each do |discussion| %>
20
+ <% if discussion.read_by?(@user) != @last_read %>
21
+ <%= user_discussions_table_title(discussion, @user, @last_read) %>
22
+ <% @last_read = discussion.read_by?(@user) %>
23
+
24
+ <%= user_discussions_table_header %>
25
+ <% end %>
26
+
27
+ <%= user_discussions_table_item(discussion, @user) %>
28
+ <% end %>
29
+ </table>
30
+ </div>
31
+
32
+ <div class="discussion-pagination">
33
+ <%= paginate @watched_discussions, nav_class: 'pagination' %>
34
+ </div>
35
+
28
36
  <% end %>
29
37
  </div>
30
38
  </div>
@@ -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
+
@@ -16,7 +16,7 @@
16
16
  <% else %>
17
17
  <table class="table table-striped">
18
18
  <% @messages.each do |message| %>
19
- <tr>
19
+ <tr class="<%= staleness_class(message) %>" >
20
20
  <td><%= icon_for_read(message.read?) %></td>
21
21
  <td><%= link_to message.exercise.name, exercise_path(message.exercise.id) %></td>
22
22
  <td><%= mail_to message.sender %></td>
@@ -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,12 +72,15 @@ 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]
78
82
 
79
83
  resources :messages, only: [:index, :create]
80
- get '/messages/errors' => 'messages#errors'
81
84
 
82
85
  get 'certificates/verify/:code', to: 'certificates#verify', as: :verify_certificate
83
86
  get 'certificates/download/:code', to: 'certificates#download', as: :download_certificate
@@ -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'
@@ -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
@@ -21,6 +21,7 @@ en:
21
21
  ask_community: Ask community for help
22
22
  ask_redirect: Do you want to go there?
23
23
  ask_the_first_question: Be the first one to ask!
24
+ asked_time_since: asked %{time} ago
24
25
  attempts_left:
25
26
  zero: "You've run out of attempts"
26
27
  one: "1 attempt remaining"
@@ -36,6 +37,8 @@ en:
36
37
  cancel: Cancel
37
38
  cancel_subscription: Cancel your subscription.
38
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
39
42
  certificates: Certificates
40
43
  certificates_will_be_here: Your certificates in the organization will appear here.
41
44
  certificate_verified_legend: "<strong>%{full_name}</strong>'s account is verified. Mumuki certifies their successful completion of <strong>%{description}</strong>."
@@ -55,6 +58,7 @@ en:
55
58
  confirm: Confirm
56
59
  confirm_reset: You are about to restart your exercise. Do you want to proceed?
57
60
  confirm_restart: You are about to delete your progress for this guide. Do you want to proceed?
61
+ congratulations: Congratulations!
58
62
  console: Console
59
63
  contact_administrator: 'If you think this is not supposed to happen, please contact %{link}'
60
64
  content: Content
@@ -83,10 +87,13 @@ en:
83
87
  destroy_message: delete the message
84
88
  disabled_explanation: You are trying to visit a permamently disabled or deleted resource
85
89
  disabled_organization_explanation: This path has already finished.
90
+ discussion_created_by: Created by
86
91
  discussion_description_placeholder: You can add more information regarding your doubt.
87
- new_discussion_message: New message on %{title}
92
+ new_discussion_message: New reply on %{title}
88
93
  discussion_updated: Discussion updated
89
94
  discussions: Discussions
95
+ discussions_read: Read
96
+ discussions_unread: Unread
90
97
  discussions_will_be_here: Your posts in the forum will appear here.
91
98
  dont_leave_us: Don't leave us! Learning is fun. You just have to keep at it.
92
99
  download: Download your solution
@@ -133,7 +140,8 @@ en:
133
140
  expected_state: Expected board
134
141
  explain_redirect: You have registered in another organization
135
142
  failed: Oops, something went wrong
136
- faqs: FAQs
143
+ faqs: Frequently Asked Questions
144
+ faqs_abbreviated: FAQs
137
145
  feedback: Feedback
138
146
  female: Female
139
147
  file_exceeds_max_size: "File size should not exceed %{size_kb}kb. Please select another file."
@@ -157,6 +165,7 @@ en:
157
165
  hidden_done: 'Good!'
158
166
  history: History
159
167
  home: Home
168
+ i_want_emails_of: I want to receive emails of
160
169
  important_info: Important information
161
170
  initial_state: Initial board
162
171
  insert_file_name: Insert a file name
@@ -168,6 +177,7 @@ en:
168
177
  keep_learning: Keep learning!
169
178
  kids_default_success: You did it great!
170
179
  language: Language
180
+ last_message: Last message
171
181
  last_name: Last Name
172
182
  last_submission_date: Last submission
173
183
  latest_exercises: Latest exercises
@@ -183,13 +193,33 @@ en:
183
193
  loading: Loading
184
194
  load_solution_into_console: Load your solution into the console
185
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
186
215
  male: Male
216
+ manage_notification_subscriptions: Manage your notification subscriptions
217
+ manage_notifications: Manage notifications
187
218
  manual_evaluation_pending: Thanks for submitting your solution! It will be revised by the course teachers soon
188
219
  medal: Medal
189
220
  message: Message
190
221
  message_deleted: This message was deleted because it %{motive}, which violates the %{forum_terms}.
191
222
  messages: Messages
192
- messages_error: Previous messages are unavailable. Please try again later.
193
223
  messages_pluralized:
194
224
  one: Message
195
225
  other: Messages
@@ -204,9 +234,9 @@ en:
204
234
  you_are: You're taking care of it
205
235
  you_will_confirmation: You'll take care of this discussion. If you change your mind, click the button again.
206
236
  you_wont_confirmation: You won't take care of this discussion.
207
- more_messages: More
208
237
  my_account: My account
209
238
  my_doubts: My doubts
239
+ my_notifications: My notifications
210
240
  my_profile: My profile
211
241
  my_submissions: My Submissions
212
242
  name: Name
@@ -234,7 +264,12 @@ en:
234
264
  no_useful_result: Didn't find what you were looking for?
235
265
  not_found_explanation: 'You may have mistyped the address or the page may have moved.'
236
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
237
271
  notifications: Notifications
272
+ notifications_will_be_here: Notifications will be here
238
273
  notify_problem_with_exercise: Report a bug
239
274
  office: Office
240
275
  only_landscape_support: Please, rotate your tablet or cellphone to continue practicing
@@ -254,6 +289,7 @@ en:
254
289
  permissions: Permissions
255
290
  please_fill_profile_data: Please complete your profile data to continue!
256
291
  please_validate: 'Please validate your data before continue:'
292
+ preferences_updated_successfully: Preferences updated successfully
257
293
  preview: Preview
258
294
  preview_error: The preview cannot be shown. Check your internet connection or try with a shorter message.
259
295
  previous_exercise: Previous
@@ -261,8 +297,8 @@ en:
261
297
  processing_your_solution: We are processing you solution
262
298
  profile_of: Profile of %{username}
263
299
  programming_since: Started programming
264
- progress: Progresss
265
- read: Read
300
+ progress: Progress
301
+ publish_discussion: Publish discussion
266
302
  refresh_or_wait: Please press F5 if results are not displayed after a few seconds
267
303
  reply_count:
268
304
  one: 1 reply
@@ -323,13 +359,14 @@ en:
323
359
  terms_and_conditions_continue_disclaimer: By continuing you agree to %{terms_link}
324
360
  terms_and_conditions_must_be_accepted: You must accept the terms and conditions
325
361
  test_results: Test results
326
- time_ago: "%{time} ago"
362
+ time_since: "%{time} ago"
327
363
  time_left: You have
328
364
  title: Title
329
365
  to_closed: Close
330
366
  to_opened: Reopen
331
367
  to_pending_review: Mark as solved
332
368
  to_solved: Mark as solved
369
+ toggle_read: "Toggle read/unread"
333
370
  unauthorized_explanation: You have no permissions for this content. Maybe you logged in with another account.
334
371
  total: Total
335
372
  undo_upvote: Undo upvote
@@ -346,6 +383,8 @@ en:
346
383
  user: User
347
384
  user_data_updated: Your data was updated successfully
348
385
  username: Username
386
+ verified_full_name: Verified name
387
+ verified_full_name_notice: Your verified name was provided by %{organization}. If there's a mistake, please send an email to %{contact}.
349
388
  view_details: View details
350
389
  want_permissions: The following user requires permissions for the organization
351
390
  we_miss_you: We miss you!
@@ -355,6 +394,7 @@ en:
355
394
  wrong_answer: The answer is wrong
356
395
  years: years old
357
396
  you_earned: You earned
397
+ you_have_a_new_notification: You have a new notification!
358
398
  you_must_sign_in_before_submitting: You must sign in before submitting your solutions
359
399
  you_never_submitted_solutions: It seems that you've never submitted solutions since you created your account.
360
400
  your_new_organization: your new organization