decidim-comments 0.28.0 → 0.28.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/comments/comment/actions.erb +4 -5
  3. data/app/cells/decidim/comments/comment/show.erb +7 -5
  4. data/app/cells/decidim/comments/comment_cell.rb +24 -4
  5. data/app/cells/decidim/comments/comment_thread/show.erb +1 -1
  6. data/app/cells/decidim/comments/comments/order_control.erb +2 -1
  7. data/app/cells/decidim/comments/comments/show.erb +1 -1
  8. data/app/cells/decidim/comments/comments/user_comments_blocked_warning.erb +2 -2
  9. data/app/cells/decidim/comments/comments_cell.rb +5 -1
  10. data/app/events/decidim/comments/comment_event.rb +4 -0
  11. data/app/models/decidim/comments/comment.rb +2 -2
  12. data/app/models/decidim/comments/comment_vote.rb +10 -0
  13. data/app/packs/src/decidim/comments/comments.component.test.js +4 -4
  14. data/app/packs/src/decidim/comments/comments.component_for_testing.js +1 -0
  15. data/config/locales/ar.yml +0 -1
  16. data/config/locales/bg.yml +169 -0
  17. data/config/locales/ca.yml +13 -8
  18. data/config/locales/cs.yml +3 -1
  19. data/config/locales/de.yml +6 -1
  20. data/config/locales/el.yml +0 -1
  21. data/config/locales/en.yml +6 -1
  22. data/config/locales/es-MX.yml +6 -1
  23. data/config/locales/es-PY.yml +6 -1
  24. data/config/locales/es.yml +14 -9
  25. data/config/locales/eu.yml +3 -1
  26. data/config/locales/fi-plain.yml +6 -1
  27. data/config/locales/fi.yml +6 -1
  28. data/config/locales/fr-CA.yml +6 -1
  29. data/config/locales/fr.yml +6 -1
  30. data/config/locales/gl.yml +0 -1
  31. data/config/locales/he-IL.yml +1 -0
  32. data/config/locales/hu.yml +5 -1
  33. data/config/locales/it.yml +0 -1
  34. data/config/locales/ja.yml +5 -1
  35. data/config/locales/lb.yml +0 -1
  36. data/config/locales/lt.yml +0 -1
  37. data/config/locales/lv.yml +0 -1
  38. data/config/locales/nl.yml +0 -1
  39. data/config/locales/no.yml +0 -1
  40. data/config/locales/pl.yml +5 -1
  41. data/config/locales/pt-BR.yml +0 -1
  42. data/config/locales/pt.yml +0 -1
  43. data/config/locales/ro-RO.yml +7 -4
  44. data/config/locales/sk.yml +0 -1
  45. data/config/locales/sq-AL.yml +41 -0
  46. data/config/locales/sr-CS.yml +0 -2
  47. data/config/locales/sv.yml +0 -1
  48. data/config/locales/tr-TR.yml +3 -1
  49. data/config/locales/zh-CN.yml +0 -1
  50. data/config/locales/zh-TW.yml +0 -1
  51. data/db/migrate/20240304092558_add_comment_vote_counter_cache_to_comments.rb +21 -0
  52. data/decidim-comments.gemspec +40 -0
  53. data/lib/decidim/api/comment_type.rb +2 -2
  54. data/lib/decidim/comments/test/factories.rb +20 -7
  55. data/lib/decidim/comments/test/shared_examples/comment_event.rb +34 -1
  56. data/lib/decidim/comments/test/shared_examples/comment_voted_event.rb +1 -1
  57. data/lib/decidim/comments/version.rb +1 -1
  58. metadata +14 -12
  59. data/config/environment.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b3b1d43c2cc461e99009bcc30c168382b996b92811ce6309aa5b42f56caaff7
4
- data.tar.gz: aabe481592164317440bb4d865c7bc50b9d24baaf244386aa2fda2802cd481b1
3
+ metadata.gz: 24cf379816e56d8d02c96af8dfd596b8946c7098f2c672f305a97fb563861248
4
+ data.tar.gz: 361246cb66e6171732029b68e1a51edabf47bd1d605d26f698144fb148006eb3
5
5
  SHA512:
6
- metadata.gz: e174a71860cbd31fea5cee3dc7b93d59463396f46147d530f81e5b69569c6d3990b41055eb069405260ae952ed88d852b45c39e4f9fea7e6635d580e9fabcc50
7
- data.tar.gz: 7181c8c9c711e14d7edf86ad680dc002c75e33fda2c160dbd30c3d15bb49f13216d921b431ab6c7957d8feb69e7b27c3d92c875367e630ae58b283b9ad7f38ff
6
+ metadata.gz: b649d92b1c7cff28097d16eaee1ab6e3d08b5600c72a180e9e83cf4556730f0a5b62223a23051d61fa160fea8b2925d9161da05e7b600e4439c973ea1fcb9a58
7
+ data.tar.gz: fef878987f09ba7d4156bc86b573d59db4c030d67f69cabca6f271ea66b1fe44288bef6e615cbf1cd423fb2e363dfa7d87a273b98fee46d7990209235b5d6467
@@ -1,14 +1,13 @@
1
1
  <div class="comment__actions">
2
2
  <% if depth.zero? && has_replies_in_children? %>
3
- <button class="button button__sm button__text-secondary comment__hide" data-controls="comment-<%= model.id %>-replies">
3
+ <button class="button button__sm button__text-secondary comment__hide" data-controls="comment-<%= model.id %>-replies" data-open="true" id="comment-<%= model.id %>-replies-trigger">
4
+ <span class="show-comment-replies font-normal"><%= t("decidim.components.comment.show_replies", count: replies.size) %></span>
4
5
  <%= icon "arrow-up-s-line" %>
5
- <span class="hide-comment-replies font-normal"><%= t("decidim.components.comment.hide_replies") %></span>
6
- <%= icon "arrow-down-s-line" %>
7
- <span class="show-comment-replies font-normal"><%= t("decidim.components.comment.show_replies", count: replies.size, replies_count: replies.size ) %></span>
6
+ <span class="hide-comment-replies font-normal"><%= t("decidim.components.comment.hide_replies", count: replies.size) %></span>
8
7
  </button>
9
8
  <% end %>
10
9
  <% if can_reply? %>
11
- <button class="button button__sm button__text-secondary" data-controls="panel-<%= reply_id %>">
10
+ <button class="button button__sm button__text-secondary" data-controls="panel-<%= reply_id %>" id="panel-<%= reply_id %>-trigger">
12
11
  <%= icon "chat-1-line" %>
13
12
  <span class="font-normal"><%= t("decidim.components.comment.reply") %></span>
14
13
  <%= icon "close-circle-line" %>
@@ -1,10 +1,12 @@
1
- <%= content_tag :div, id: "comment_#{model.id}", class: "comment relative", data: { comment_id: model.id } do %>
1
+ <%= content_tag :div, id: "comment_#{model.id}", class: "comment relative", role: "comment", data: { comment_id: model.id, parent: parent_element_id } do %>
2
2
  <% if model.hidden? %>
3
3
  <%= render :moderation_data %>
4
4
  <% elsif model.deleted? %>
5
5
  <%= render :deletion_data %>
6
6
  <% else %>
7
7
  <div class="comment__header">
8
+ <div class="sr-only"><%= comment_label %></div>
9
+
8
10
  <span class="font-bold">
9
11
  <%== cell("decidim/author", author_presenter) %>
10
12
  </span>
@@ -18,7 +20,7 @@
18
20
  <% end %>
19
21
 
20
22
  <div class="relative ml-auto">
21
- <button id="dropdown-trigger-<%= context_menu_id %>" data-component="dropdown" data-target="dropdown-menu-<%= context_menu_id %>">
23
+ <button id="dropdown-trigger-<%= context_menu_id %>" data-component="dropdown" data-target="dropdown-menu-<%= context_menu_id %>" aria-label="<%= t("decidim.components.comment.controls_label") %>">
22
24
  &#8230;
23
25
  </button>
24
26
 
@@ -30,20 +32,20 @@
30
32
  </li>
31
33
  <% end %>
32
34
  <li>
33
- <%= link_to "#{commentable_path("commentId" => model.id)}#comment_#{model.id}", target: "_blank", data: { "external-link": "false" }, class: "dropdown__item", title: t("decidim.components.comment.single_comment_link_title") do %>
35
+ <%= link_to "#{commentable_path("commentId" => model.id)}#comment_#{model.id}", target: "_blank", data: { "external-link": "text-only" }, class: "dropdown__item", title: t("decidim.components.comment.single_comment_link_title") do %>
34
36
  <%= icon "share-line" %>
35
37
  <span><%= t("decidim.components.comment.single_comment_link_title") %></span>
36
38
  <% end %>
37
39
  </li>
38
40
  <% if model.authored_by?(current_user) %>
39
41
  <li>
40
- <button type="button" class="dropdown__item" data-dialog-open="<%= "editCommentModal#{model.id}" %>" title="<%= t("decidim.components.comment.edit") %>" aria-controls="<%= "editCommentModal#{model.id}" %>" aria-haspopup="dialog" tabindex="2">
42
+ <button type="button" class="dropdown__item" data-dialog-open="<%= "editCommentModal#{model.id}" %>" title="<%= t("decidim.components.comment.edit") %>" aria-controls="<%= "editCommentModal#{model.id}" %>" aria-haspopup="dialog">
41
43
  <%= icon "edit-line" %>
42
44
  <span><%= t("decidim.components.comment.edit") %></span>
43
45
  </button>
44
46
  </li>
45
47
  <li>
46
- <%= link_to comment_path, remote: true, method: :delete, class: "dropdown__item", data: { confirm: t("decidim.components.comment.confirm_destroy") }, tabindex: 3 do %>
48
+ <%= link_to comment_path, remote: true, method: :delete, class: "dropdown__item", data: { confirm: t("decidim.components.comment.confirm_destroy") } do %>
47
49
  <%= icon "delete-bin-line" %>
48
50
  <span><%= t("decidim.components.comment.delete") %></span>
49
51
  <% end %>
@@ -39,6 +39,24 @@ module Decidim
39
39
 
40
40
  private
41
41
 
42
+ def parent_element_id
43
+ return unless reply?
44
+
45
+ "comment_#{model.decidim_commentable_id}"
46
+ end
47
+
48
+ def comment_label
49
+ if reply?
50
+ t("decidim.components.comment.comment_label_reply", comment_id: model.id, parent_comment_id: model.decidim_commentable_id)
51
+ else
52
+ t("decidim.components.comment.comment_label", comment_id: model.id)
53
+ end
54
+ end
55
+
56
+ def reply?
57
+ model.decidim_commentable_type == model.class.name
58
+ end
59
+
42
60
  def cache_hash
43
61
  return @hash if defined?(@hash)
44
62
 
@@ -47,6 +65,8 @@ module Decidim
47
65
  hash.push(model.must_render_translation?(current_organization) ? 1 : 0)
48
66
  hash.push(model.authored_by?(current_user) ? 1 : 0)
49
67
  hash.push(model.reported_by?(current_user) ? 1 : 0)
68
+ hash.push(model.up_votes_count)
69
+ hash.push(model.down_votes_count)
50
70
  hash.push(model.cache_key_with_version)
51
71
  hash.push(model.author.cache_key_with_version)
52
72
  @hash = hash.join(Decidim.cache_key_separator)
@@ -137,11 +157,11 @@ module Decidim
137
157
  end
138
158
 
139
159
  def up_votes_count
140
- model.up_votes.count
160
+ model.up_votes_count
141
161
  end
142
162
 
143
163
  def down_votes_count
144
- model.down_votes.count
164
+ model.down_votes_count
145
165
  end
146
166
 
147
167
  def root_depth
@@ -157,11 +177,11 @@ module Decidim
157
177
  end
158
178
 
159
179
  def voted_up?
160
- model.up_voted_by?(current_user)
180
+ @up_voted ||= model.up_voted_by?(current_user)
161
181
  end
162
182
 
163
183
  def voted_down?
164
- model.down_voted_by?(current_user)
184
+ @down_voted ||= model.down_voted_by?(current_user)
165
185
  end
166
186
 
167
187
  def nested?
@@ -1,3 +1,3 @@
1
- <div class="comment-thread">
1
+ <div class="comment-thread" role="region">
2
2
  <%= cell("decidim/comments/comment", model, root_depth: model.depth, order:) %>
3
3
  </div>
@@ -5,7 +5,8 @@
5
5
  t("decidim.components.comment_order_selector.order.#{order_value}"),
6
6
  decidim_comments.comments_path(commentable_gid: model.to_signed_global_id.to_s, order: order_value, reload: 1),
7
7
  class: "button button__sm button__text-secondary only:m-auto comment-order-by__item inline-block #{order_value == order ? "underline font-bold" : ""}",
8
- remote: true
8
+ remote: true,
9
+ aria: { controls: threads_node_id }
9
10
  ) %>
10
11
  </div>
11
12
  <% end %>
@@ -16,7 +16,7 @@
16
16
  </div>
17
17
  <%= single_comment_warning %>
18
18
  <%= blocked_comments_warning %>
19
- <div class="comment-threads">
19
+ <div class="comment-threads" id="<%= threads_node_id %>" aria-live="polite">
20
20
  <%= comments_loading %>
21
21
  <% comments.each do |comment| %>
22
22
  <%= cell("decidim/comments/comment_thread", comment, order:) %>
@@ -1,10 +1,10 @@
1
1
  <%# We cannot use the AnnouncementCell directly here as the link is escaped and it would not work %>
2
2
  <div class="flash warning" data-announcement="">
3
- <span class="flash__message">
3
+ <div class="flash__message">
4
4
  <% if comment_permissions? %>
5
5
  <p><%= blocked_comments_for_unauthorized_user_warning_link %></p>
6
6
  <% else %>
7
7
  <p><%= t("decidim.components.comments.blocked_comments_for_user_warning") %></p>
8
8
  <% end %>
9
- </span>
9
+ </div>
10
10
  </div>
@@ -30,7 +30,7 @@ module Decidim
30
30
 
31
31
  def blocked_comments_warning
32
32
  return unless comments_blocked?
33
- return unless user_comments_blocked?
33
+ return if user_comments_blocked?
34
34
 
35
35
  render :blocked_comments_warning
36
36
  end
@@ -88,6 +88,10 @@ module Decidim
88
88
  "comments-for-#{commentable_type.demodulize}-#{model.id}"
89
89
  end
90
90
 
91
+ def threads_node_id
92
+ "#{node_id}-threads"
93
+ end
94
+
91
95
  def commentable_type
92
96
  model.commentable_type
93
97
  end
@@ -14,6 +14,10 @@ module Decidim
14
14
  comment.formatted_body(override_translation)
15
15
  end
16
16
 
17
+ def hidden_resource?
18
+ super || (comment.respond_to?(:hidden?) && comment.hidden?)
19
+ end
20
+
17
21
  def author
18
22
  comment.normalized_author
19
23
  end
@@ -122,14 +122,14 @@ module Decidim
122
122
  #
123
123
  # Returns a bool value to indicate if the condition is truthy or not
124
124
  def up_voted_by?(user)
125
- up_votes.any? { |vote| vote.author == user }
125
+ up_votes.exists?(author: user)
126
126
  end
127
127
 
128
128
  # Public: Check if the user has downvoted the comment
129
129
  #
130
130
  # Returns a bool value to indicate if the condition is truthy or not
131
131
  def down_voted_by?(user)
132
- down_votes.any? { |vote| vote.author == user }
132
+ down_votes.exists?(author: user)
133
133
  end
134
134
 
135
135
  # Public: Overrides the `reported_content_url` Reportable concern method.
@@ -14,12 +14,22 @@ module Decidim
14
14
  validates :weight, inclusion: { in: [-1, 1] }
15
15
  validate :author_and_comment_same_organization
16
16
 
17
+ after_create :update_comment_votes_count
18
+ after_destroy :update_comment_votes_count
19
+
17
20
  def self.export_serializer
18
21
  Decidim::Comments::CommentVoteSerializer
19
22
  end
20
23
 
21
24
  private
22
25
 
26
+ def update_comment_votes_count
27
+ up_votes_count = self.class.where(decidim_comment_id: comment.id, weight: 1).count
28
+ down_votes_count = self.class.where(decidim_comment_id: comment.id, weight: -1).count
29
+
30
+ comment.update(up_votes_count:, down_votes_count:)
31
+ end
32
+
23
33
  # Private: check if the comment and the author have the same organization
24
34
  def author_and_comment_same_organization
25
35
  return unless author.present? && comment.present?
@@ -18,8 +18,8 @@ window.Rails = Rails;
18
18
  // Fake timers for testing polling
19
19
  jest.useFakeTimers();
20
20
 
21
- import { createCharacterCounter } from "../../../../../../decidim-core/app/packs/src/decidim/input_character_counter";
22
- import Configuration from "../../../../../../decidim-core/app/packs/src/decidim/configuration";
21
+ import { createCharacterCounter } from "src/decidim/input_character_counter";
22
+ import Configuration from "src/decidim/configuration";
23
23
  // Component is loaded with require because using import loads it before $ has been mocked
24
24
  // so tests are not able to check the spied behaviours
25
25
  const CommentsComponent = require("./comments.component_for_testing.js");
@@ -344,9 +344,9 @@ describe("CommentsComponent", () => {
344
344
  ${generateCommentForm("Dummy", 123)}
345
345
  </div>
346
346
  <div class="flash primary loading-comments hidden">
347
- <span class="flash__message">
347
+ <div class="flash__message">
348
348
  Loading comments ...
349
- </span>
349
+ </div>
350
350
  </div>
351
351
  </div>
352
352
  </div>
@@ -1,4 +1,5 @@
1
1
  /* eslint no-undef: 0 */
2
+ /* eslint-disable no-relative-import-paths/no-relative-import-paths */
2
3
 
3
4
  import CommentsComponent from "./comments.component"
4
5
 
@@ -69,7 +69,6 @@ ar:
69
69
  deleted_user: مشارك محذوف
70
70
  edit: تعديل
71
71
  edited: تم التعديل
72
- hide_replies: إخفاء الردود
73
72
  moderated_at: تمت مراجعة التعليق على %{date}
74
73
  reply: الرد
75
74
  report:
@@ -4,4 +4,173 @@ bg:
4
4
  models:
5
5
  decidim/comments/comment_by_followed_user_event: Коментар
6
6
  decidim/comments/comment_created_event: Коментар
7
+ decidim/comments/comment_upvoted_event: Коментарът е одобрен
7
8
  decidim/comments/reply_created_event: Отговор на коментар
9
+ decidim/comments/user_group_mentioned_event: Споменаване
10
+ decidim/comments/user_mentioned_event: Споменаване
11
+ activerecord:
12
+ models:
13
+ decidim/comments/comment:
14
+ one: Коментар
15
+ other: Коментари
16
+ decidim/comments/comment_vote:
17
+ one: Глас
18
+ other: Гласове
19
+ decidim:
20
+ comments:
21
+ admin:
22
+ shared:
23
+ availability_fields:
24
+ enabled: Коментарите са активирани
25
+ end_time: Коментарите са активирани до
26
+ start_time: Коментарите са активирани от
27
+ comments:
28
+ create:
29
+ error: Възникна проблем при създаването на коментара.
30
+ delete:
31
+ error: Коментарът не може да бъде изтрит.
32
+ update:
33
+ error: Възникна проблем при актуализирането на коментара.
34
+ comments_title: Коментар
35
+ last_activity:
36
+ new_comment: 'Нов коментар:'
37
+ votes:
38
+ create:
39
+ error: Възникна проблем с гласуването за коментара.
40
+ components:
41
+ add_comment_form:
42
+ account_message: <a href="%{sign_in_url}">Влезте в профила си</a> или <a href="%{sign_up_url}">се регистрирайте</a>, за да добавите Вашия коментар.
43
+ form:
44
+ body:
45
+ label: Коментар
46
+ placeholder: Какво мислите за това?
47
+ form_error: Текстът е задължителен и не може да е по-дълъг от %{length} символа.
48
+ submit_reply: Публикуване на отговор
49
+ submit_root_comment: Публикуване на коментар
50
+ user_group_id:
51
+ label: Коментирайте като
52
+ opinion:
53
+ label: Вашето мнение по тази тема
54
+ negative: Негативно
55
+ negative_selected: Вашето мнение по тази тема е негативно
56
+ neutral: Неутрално
57
+ neutral_selected: Вашето мнение по тази тема е неутрално
58
+ positive: Позитивно
59
+ positive_selected: Вашето мнение по тази тема е позитивно
60
+ remaining_characters: "Оставащи символи: %{count}"
61
+ remaining_characters_1: "%{count} оставащ символ"
62
+ title: Добавете Вашия коментар
63
+ comment:
64
+ alignment:
65
+ against: Против
66
+ in_favor: Подкрепям
67
+ cancel_reply: Отказ от отговор
68
+ comment_label: Коментар %{comment_id}
69
+ comment_label_reply: Коментар %{comment_id} (отговор на коментар %{parent_comment_id})
70
+ confirm_destroy: Сигурни ли сте, че искате да изтриете този коментар?
71
+ controls_label: Контроли за коментари
72
+ delete: Изтрий
73
+ deleted_at: Коментарът е изтрит на %{date}
74
+ deleted_user: Изтрит участник
75
+ edit: Редактирай
76
+ edited: Редактирано
77
+ hide_replies:
78
+ one: Скриване на отговора
79
+ other: Скриване на %{count} отговора
80
+ moderated_at: Коментарът е модериран на %{date}
81
+ reply: Отговори
82
+ report:
83
+ action: Доклад
84
+ already_reported: Това съдържание вече е докладвано и ще бъде прегледано от администратор.
85
+ close: Затвори
86
+ description: Това съдържание неподходящо ли е?
87
+ details: Допълнителни коментари
88
+ reasons:
89
+ does_not_belong: Съдържа незаконна дейност, заплахи за самоубийство, лична информация или нещо друго, което смятате, че не принадлежи на %{organization_name}.
90
+ offensive: Съдържа расизъм, сексизъм, злословия, лични атаки, заплахи за смърт, заявки за самоубийство или всякаква форма на омраза.
91
+ spam: Съдържа примамка за кликване, реклама, измами или скриптове.
92
+ title: Докладване за неподходящо съдържание
93
+ show_replies:
94
+ one: Показване на отговора
95
+ other: Показване на %{count} отговора
96
+ single_comment_link_title: Вземете линка
97
+ comment_order_selector:
98
+ order:
99
+ best_rated: С най-висока оценка
100
+ most_discussed: Най-обсъждани
101
+ older: По-старо
102
+ recent: Скорошни
103
+ title: 'Подреди по:'
104
+ comments:
105
+ blocked_comments_for_unauthorized_user_warning: Трябва да сте верифицирани, за да коментирате в този момент, но можете да прочетете предишните.
106
+ blocked_comments_for_user_warning: Понастоящем не можете да коментирате, но можете да прочетете предходните коментари.
107
+ blocked_comments_warning: Коментарите в момента са деактивирани, но можете да прочетете предишните.
108
+ comment_details_title: Детайли за коментара
109
+ loading: Коментарите се зареждат...
110
+ single_comment_warning: <a href="%{url}">Вижте всички коментари</a>
111
+ single_comment_warning_title: Виждате единичен коментар
112
+ title:
113
+ one: "%{count} коментар"
114
+ other: "%{count} коментари"
115
+ down_vote_button:
116
+ text: Не съм съгласен с този коментар
117
+ edit_comment_modal_form:
118
+ close: Затвори
119
+ form:
120
+ body:
121
+ label: Коментар
122
+ placeholder: Какво мислите за това?
123
+ submit: Изпрати
124
+ title: Редактирайте Вашия коментар
125
+ up_vote_button:
126
+ text: Съгласен съм с този коментар
127
+ events:
128
+ comments:
129
+ comment_by_followed_user:
130
+ email_intro: "%{author_name} остави коментар в %{resource_title}. Можете да го прочетете на тази страница:"
131
+ email_outro: Получихте това известие, защото следвате %{author_name}. Можете да спрете да следвате този потребител от страницата на неговия профил.
132
+ email_subject: Има нов коментар от %{author_name} в(ъв) %{resource_title}
133
+ notification_title: Има нов коментар от <a href="%{author_path}">%{author_name} %{author_nickname}</a> в(ъв) <a href="%{resource_path}">%{resource_title}</a>.
134
+ comment_by_followed_user_group:
135
+ email_intro: 'Групата %{author_name} остави коментар в(ъв) %{resource_title}. Можете да го прочетете на следната страница:'
136
+ email_outro: Получавате това известие, защото следвате %{author_name}. Можете да спрете да следвате тази група от страницата на профила ѝ.
137
+ email_subject: Има нов коментар от %{author_name} в(ъв) %{resource_title}
138
+ notification_title: Има нов коментар от <a href="%{author_path}">%{author_name} %{author_nickname}</a> в(ъв) <a href="%{resource_path}">%{resource_title}</a>.
139
+ comment_created:
140
+ email_intro: "%{resource_title} получи коментар. Можете да прочетете коментара на тази страница:"
141
+ email_outro: Получавате това известие, защото следвате „%{resource_title}“ или неговия автор. Можете да прекратите следването от предходната връзка.
142
+ email_subject: Има нов коментар от %{author_name} по %{resource_title}
143
+ notification_title: Има нов коментар от <a href="%{author_path}">%{author_name} %{author_nickname}</a> по <a href="%{resource_path}">%{resource_title}</a>
144
+ comment_downvoted:
145
+ email_intro: Вашият коментар в „%{resource_title}“ беше гласуван против. Вече има общо %{upvotes} гласа за и %{downvotes} гласа против.
146
+ email_outro: Получихте това известие, защото вие сте авторът на този коментар.
147
+ email_subject: Вашият коментар в „%{resource_title}“ беше гласуван против.
148
+ notification_title: Вашият <a href="%{resource_path}">коментар</a> в „%{resource_title}“ беше гласуван против. Вече има общо %{upvotes} гласа за и %{downvotes} гласа против.
149
+ comment_upvoted:
150
+ email_intro: Коментарът ви в „%{resource_title}“ беше гласуван в подкрепа. Вече има общо %{upvotes} гласа за и %{downvotes} гласа против.
151
+ email_outro: Получихте това известие, защото вие сте авторът на този коментар.
152
+ email_subject: Коментарът ви в „%{resource_title}“ беше гласуван в подкрепа.
153
+ notification_title: Вашият <a href="%{resource_path}">коментар</a> в „%{resource_title}“ получи положителен глас. Вече има общо %{upvotes} гласа за и %{downvotes} гласа против.
154
+ reply_created:
155
+ email_intro: "%{author_name} отговори на вашия коментар в %{resource_title}. Можете да го прочетете на тази страница:"
156
+ email_outro: Получавате това известие, защото някой отговори на коментара Ви.
157
+ email_subject: "%{author_name} отговори на коментара Ви по %{resource_title}"
158
+ notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> отговори на коментара Ви по <a href="%{resource_path}">%{resource_title}</a>
159
+ user_group_mentioned:
160
+ email_intro: Група, към която принадлежите, беше спомената
161
+ email_outro: Получавате това известие, защото сте член на групата %{group_name}, която беше спомената в(ъв) %{resource_title}.
162
+ email_subject: Бяхте споменати в(ъв) %{resource_title} като член на %{group_name}
163
+ notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> Ви спомена в(ъв) <a href="%{resource_path}">%{resource_title}</a> като член на <a href="%{group_path}">%{group_name} %{group_nickname}</a>
164
+ user_mentioned:
165
+ email_intro: Бяхте споменати
166
+ email_outro: Получавате това известие, защото бяхте споменати в(ъв) %{resource_title}.
167
+ email_subject: Бяхте споменати в(ъв) %{resource_title}
168
+ notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> Ви спомена в(ъв) <a href="%{resource_path}">%{resource_title}</a>
169
+ metrics:
170
+ comments:
171
+ description: Брой коментари генерирани от участници
172
+ object: коментари
173
+ title: Коментари
174
+ errors:
175
+ messages:
176
+ cannot_have_comments: не може да има коментари
@@ -65,13 +65,18 @@ ca:
65
65
  against: En contra
66
66
  in_favor: A favor
67
67
  cancel_reply: Cancel·lar resposta
68
+ comment_label: Comentari %{comment_id}
69
+ comment_label_reply: Comentari %{comment_id} (respon al comentari %{parent_comment_id})
68
70
  confirm_destroy: Segur que vols esborrar aquest comentari?
71
+ controls_label: Controls de comentaris
69
72
  delete: Esborrar
70
73
  deleted_at: Comentari esborrat el %{date}
71
74
  deleted_user: Participant eliminada
72
75
  edit: Editar
73
76
  edited: Editat
74
- hide_replies: Oculta les respostes
77
+ hide_replies:
78
+ one: Amagar resposta
79
+ other: Amagar %{count} respostes
75
80
  moderated_at: Comentari moderat el %{date}
76
81
  reply: Respondre
77
82
  report:
@@ -123,27 +128,27 @@ ca:
123
128
  comments:
124
129
  comment_by_followed_user:
125
130
  email_intro: "%{author_name} ha deixat un comentari a %{resource_title}. Podeu llegir-lo en aquesta pàgina:"
126
- email_outro: Has rebut aquesta notificació perquè estàs seguint %{author_name}. Pots deixar de seguir a aquesta participant des de la seva pàgina de perfil.
131
+ email_outro: Has rebut aquesta notificació perquè estàs seguint el comentari "%{author_name}". Pots deixar de seguir a aquesta participant des de la seva pàgina de perfil.
127
132
  email_subject: Hi ha un nou comentari de %{author_name} en %{resource_title}
128
133
  notification_title: Hi ha un nou comentari per <a href="%{author_path}">%{author_name} %{author_nickname}</a> a <a href="%{resource_path}">%{resource_title}</a>.
129
134
  comment_by_followed_user_group:
130
135
  email_intro: '%{author_name} ha deixat un comentari a%{resource_title}. Pots llegir-lo en aquesta pàgina:'
131
- email_outro: Reps aquesta notificació perquè segueixes a %{author_name}. Pots deixar de seguir aquest grup des de la seva pàgina de perfil.
136
+ email_outro: Reps aquesta notificació perquè segueixes a "%{author_name}". Pots deixar de seguir aquest grup des de la seva pàgina de perfil.
132
137
  email_subject: Hi ha un nou comentari de %{author_name} en %{resource_title}
133
138
  notification_title: Hi ha un nou comentari per <a href="%{author_path}">%{author_name} %{author_nickname}</a> a <a href="%{resource_path}">%{resource_title}</a>.
134
139
  comment_created:
135
140
  email_intro: "S'ha comentat %{resource_title}. Pots llegir el comentari d'aquesta pàgina:"
136
- email_outro: Has rebut aquesta notificació perquè estàs seguint "%{resource_title}" o la seva autora. Pots deixar de seguir-la des de l'enllaç anterior.
141
+ email_outro: Has rebut aquesta notificació perquè estàs seguint el comentari "%{resource_title}" o la seva autora. Pots deixar de seguir-la des de l'enllaç anterior.
137
142
  email_subject: Hi ha un nou comentari de %{author_name} a %{resource_title}
138
143
  notification_title: Hi ha un nou comentari de <a href="%{author_path}">%{author_name} %{author_nickname}</a> en <a href="%{resource_path}">%{resource_title}</a>
139
144
  comment_downvoted:
140
145
  email_intro: El teu comentari a "%{resource_title}" ha rebut un vot negatiu. Ara té un total de %{upvotes} vots positius i %{downvotes} vots negatius.
141
- email_outro: Has rebut aquesta notificació perquè ets autora d'aquest comentari.
146
+ email_outro: Has rebut aquesta notificació perquè vas fer aquest comentari.
142
147
  email_subject: El teu comentari a "%{resource_title}" ha rebut un vot negatiu.
143
148
  notification_title: El teu <a href="%{resource_path}">comentari</a> a "%{resource_title}" ha rebut un vot negatiu. Ara té un total de %{upvotes} vots positius i %{downvotes} vots negatius.
144
149
  comment_upvoted:
145
150
  email_intro: El teu comentari a "%{resource_title}" ha rebut un vot positiu. Ara té un total de %{upvotes} vots positius i %{downvotes} vots negatius.
146
- email_outro: Has rebut aquesta notificació perquè ets autora d'aquest comentari.
151
+ email_outro: Has rebut aquesta notificació perquè vas fer aquest comentari.
147
152
  email_subject: El teu comentari a "%{resource_title}" ha rebut un vot positiu.
148
153
  notification_title: El teu <a href="%{resource_path}">comentari</a> a "%{resource_title}" ha rebut un vot positiu. Ara té un total de %{upvotes} vots positius i %{downvotes} vots negatius.
149
154
  reply_created:
@@ -153,12 +158,12 @@ ca:
153
158
  notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> ha respost el teu comentari a <a href="%{resource_path}">%{resource_title}</a>
154
159
  user_group_mentioned:
155
160
  email_intro: Un grup al qual pertanys ha estat esmentat
156
- email_outro: Has rebut aquesta notificació perquè formes part del grup %{group_name} que ha estat esmentat a %{resource_title}.
161
+ email_outro: Has rebut aquesta notificació perquè formes part del grup "%{group_name}" que ha estat esmentat a %{resource_title}.
157
162
  email_subject: T'han esmentat a %{resource_title} com a membre de %{group_name}
158
163
  notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> t'ha esmentat com a membre de <a href="%{group_path}">%{group_name} %{group_nickname}</a> a <a href="%{resource_path}">%{resource_title}</a>
159
164
  user_mentioned:
160
165
  email_intro: Has estat esmentada
161
- email_outro: Has rebut aquesta notificació perquè has estat esmentada a %{resource_title}.
166
+ email_outro: Has rebut aquesta notificació perquè t'han esmentat al comentari "%{resource_title}".
162
167
  email_subject: Has estat esmentada a %{resource_title}
163
168
  notification_title: Has estat esmentada a <a href="%{resource_path}">%{resource_title}</a> per <a href="%{author_path}">%{author_name} %{author_nickname}</a>
164
169
  metrics:
@@ -69,13 +69,15 @@ cs:
69
69
  against: Proti
70
70
  in_favor: Ve prospěch
71
71
  cancel_reply: Zrušit odpověď
72
+ comment_label: Komentář %{comment_id}
73
+ comment_label_reply: Komentář %{comment_id} (odpověď na komentář %{parent_comment_id})
72
74
  confirm_destroy: Opravdu chcete odstranit tento komentář?
75
+ controls_label: Ovládání komentářů
73
76
  delete: Smazat
74
77
  deleted_at: Komentář byl smazán dne %{date}
75
78
  deleted_user: Vymazaný účastník
76
79
  edit: Upravit
77
80
  edited: Upraveno
78
- hide_replies: Skrýt odpovědi
79
81
  moderated_at: Komentář moderován dne %{date}
80
82
  reply: Odpověď
81
83
  report:
@@ -65,13 +65,18 @@ de:
65
65
  against: Gegen
66
66
  in_favor: Zugunsten
67
67
  cancel_reply: Antwort abbrechen
68
+ comment_label: Kommentar %{comment_id}
69
+ comment_label_reply: Kommentar %{comment_id} (Antwort auf Kommentar %{parent_comment_id})
68
70
  confirm_destroy: Sind Sie sich sicher, dass Sie diesen Kommentar löschen möchten?
71
+ controls_label: Kommentarsteuerung
69
72
  delete: Löschen
70
73
  deleted_at: Kommentar gelöscht am %{date}
71
74
  deleted_user: Gelöschter Benutzer
72
75
  edit: Bearbeiten
73
76
  edited: Bearbeitet
74
- hide_replies: Antworten verbergen
77
+ hide_replies:
78
+ one: Antwort verbergen
79
+ other: '%{count} Antworten verbergen'
75
80
  moderated_at: Kommentar moderiert am %{date}
76
81
  reply: Antworten
77
82
  report:
@@ -65,7 +65,6 @@ el:
65
65
  deleted_user: Διαγραμμένος συμμετέχων
66
66
  edit: Επεξεργασία
67
67
  edited: Επεξεργασμένο
68
- hide_replies: Απόκρυψη απαντήσεων
69
68
  moderated_at: Σχόλιο διαχειρίστηκε στις %{date}
70
69
  reply: Απάντηση
71
70
  report:
@@ -65,13 +65,18 @@ en:
65
65
  against: Against
66
66
  in_favor: In favor
67
67
  cancel_reply: Cancel reply
68
+ comment_label: Comment %{comment_id}
69
+ comment_label_reply: Comment %{comment_id} (reply to comment %{parent_comment_id})
68
70
  confirm_destroy: Are you sure you want to delete this comment?
71
+ controls_label: Comment controls
69
72
  delete: Delete
70
73
  deleted_at: Comment deleted on %{date}
71
74
  deleted_user: Deleted participant
72
75
  edit: Edit
73
76
  edited: Edited
74
- hide_replies: Hide replies
77
+ hide_replies:
78
+ one: Hide reply
79
+ other: Hide %{count} replies
75
80
  moderated_at: Comment moderated on %{date}
76
81
  reply: Reply
77
82
  report:
@@ -65,13 +65,18 @@ es-MX:
65
65
  against: En contra
66
66
  in_favor: A favor
67
67
  cancel_reply: Cancelar respuesta
68
+ comment_label: Comentario %{comment_id}
69
+ comment_label_reply: Comentario %{comment_id} (responder al comentario %{parent_comment_id})
68
70
  confirm_destroy: '¿Seguro que quieres eliminar este comentario?'
71
+ controls_label: Controles de comentarios
69
72
  delete: Eliminar
70
73
  deleted_at: Comentario eliminado el %{date}
71
74
  deleted_user: Usuario eliminado
72
75
  edit: Editar
73
76
  edited: Editado
74
- hide_replies: Ocultar respuestas
77
+ hide_replies:
78
+ one: Ocultar respuesta
79
+ other: Ocultar %{count} respuestas
75
80
  moderated_at: Comentario moderado el %{date}
76
81
  reply: Respuesta
77
82
  report: