decidim-comments 0.28.0 → 0.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: