decidim-comments 0.19.0 → 0.22.0

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/comments/bundle.js +41 -41
  3. data/app/assets/javascripts/decidim/comments/bundle.js.map +1 -1
  4. data/app/cells/decidim/comments/comment_activity_cell.rb +1 -1
  5. data/app/commands/decidim/comments/create_comment.rb +7 -7
  6. data/app/events/decidim/comments/comment_by_followed_user_group_event.rb +9 -0
  7. data/app/events/decidim/comments/comment_event.rb +15 -2
  8. data/app/events/decidim/comments/user_group_mentioned_event.rb +10 -0
  9. data/app/forms/decidim/comments/comment_form.rb +9 -0
  10. data/app/frontend/application/icon.component.tsx +16 -4
  11. data/app/frontend/comments/add_comment_form.component.test.tsx +4 -1
  12. data/app/frontend/comments/add_comment_form.component.tsx +16 -3
  13. data/app/frontend/comments/comment.component.test.tsx +1 -1
  14. data/app/frontend/comments/comment.component.tsx +287 -74
  15. data/app/frontend/comments/comment_order_selector.component.tsx +26 -7
  16. data/app/frontend/comments/comments.component.tsx +65 -8
  17. data/app/frontend/comments/down_vote_button.component.tsx +3 -0
  18. data/app/frontend/comments/up_vote_button.component.tsx +3 -0
  19. data/app/frontend/comments/vote_button.component.tsx +4 -0
  20. data/app/frontend/comments/vote_button_component.test.tsx +14 -8
  21. data/app/frontend/entry.ts +19 -0
  22. data/app/frontend/entry_test.ts +2 -0
  23. data/app/frontend/queries/comments.query.graphql +2 -2
  24. data/app/frontend/support/schema.ts +745 -744
  25. data/app/models/decidim/comments/comment.rb +30 -5
  26. data/app/queries/decidim/comments/metrics/comments_metric_manage.rb +1 -6
  27. data/app/queries/decidim/comments/sorted_comments.rb +8 -2
  28. data/app/scrubbers/decidim/comments/user_input_scrubber.rb +20 -0
  29. data/app/services/decidim/comments/new_comment_notification_creator.rb +28 -3
  30. data/app/types/decidim/comments/commentable_interface.rb +2 -1
  31. data/app/types/decidim/comments/commentable_mutation_type.rb +2 -2
  32. data/config/locales/ar.yml +10 -1
  33. data/config/locales/bg-BG.yml +6 -0
  34. data/config/locales/ca.yml +23 -1
  35. data/config/locales/cs.yml +35 -13
  36. data/config/locales/da-DK.yml +1 -0
  37. data/config/locales/de.yml +23 -1
  38. data/config/locales/el-GR.yml +1 -0
  39. data/config/locales/el.yml +122 -0
  40. data/config/locales/en.yml +23 -1
  41. data/config/locales/es-MX.yml +23 -1
  42. data/config/locales/es-PY.yml +23 -1
  43. data/config/locales/es.yml +23 -1
  44. data/config/locales/et-EE.yml +1 -0
  45. data/config/locales/eu.yml +4 -1
  46. data/config/locales/fi-plain.yml +23 -1
  47. data/config/locales/fi.yml +29 -7
  48. data/config/locales/fr-CA.yml +122 -0
  49. data/config/locales/fr.yml +23 -1
  50. data/config/locales/ga-IE.yml +1 -0
  51. data/config/locales/gl.yml +4 -1
  52. data/config/locales/hr-HR.yml +1 -0
  53. data/config/locales/hu.yml +17 -1
  54. data/config/locales/id-ID.yml +4 -1
  55. data/config/locales/is-IS.yml +76 -0
  56. data/config/locales/it.yml +23 -1
  57. data/config/locales/ja-JP.yml +120 -0
  58. data/config/locales/lt-LT.yml +1 -0
  59. data/config/locales/lv-LV.yml +118 -0
  60. data/config/locales/mt-MT.yml +1 -0
  61. data/config/locales/nl.yml +35 -13
  62. data/config/locales/no.yml +118 -0
  63. data/config/locales/pl.yml +57 -35
  64. data/config/locales/pt-BR.yml +5 -2
  65. data/config/locales/pt.yml +47 -25
  66. data/config/locales/ro-RO.yml +124 -0
  67. data/config/locales/ru.yml +12 -1
  68. data/config/locales/sk-SK.yml +116 -0
  69. data/config/locales/sk.yml +120 -0
  70. data/config/locales/sl.yml +4 -0
  71. data/config/locales/sr-CS.yml +20 -0
  72. data/config/locales/sv.yml +25 -3
  73. data/config/locales/tr-TR.yml +4 -1
  74. data/config/locales/uk.yml +4 -1
  75. data/db/migrate/20200320105911_index_foreign_keys_in_decidim_comments_comments.rb +7 -0
  76. data/lib/decidim/comments.rb +1 -0
  77. data/lib/decidim/comments/markdown.rb +55 -0
  78. data/lib/decidim/comments/test/shared_examples/comment_event.rb +11 -1
  79. data/lib/decidim/comments/test/shared_examples/create_comment_context.rb +3 -2
  80. data/lib/decidim/comments/version.rb +1 -1
  81. metadata +46 -9
@@ -28,17 +28,29 @@ module Decidim
28
28
  has_many :down_votes, -> { where(weight: -1) }, foreign_key: "decidim_comment_id", class_name: "CommentVote", dependent: :destroy
29
29
 
30
30
  validates :body, presence: true
31
- validates :depth, numericality: { greater_than_or_equal_to: 0 }
31
+ validates :depth, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: MAX_DEPTH }
32
32
  validates :alignment, inclusion: { in: [0, 1, -1] }
33
33
 
34
34
  validates :body, length: { maximum: 1000 }
35
35
 
36
36
  validate :commentable_can_have_comments
37
37
 
38
- before_save :compute_depth
38
+ before_validation :compute_depth
39
39
 
40
40
  delegate :organization, to: :commentable
41
41
 
42
+ def self.positive
43
+ where(alignment: 1)
44
+ end
45
+
46
+ def self.neutral
47
+ where(alignment: 0)
48
+ end
49
+
50
+ def self.negative
51
+ where(alignment: -1)
52
+ end
53
+
42
54
  def participatory_space
43
55
  return root_commentable if root_commentable.is_a?(Decidim::Participable)
44
56
 
@@ -92,7 +104,7 @@ module Decidim
92
104
 
93
105
  # Public: Returns the comment message ready to display (it is expected to include HTML)
94
106
  def formatted_body
95
- @formatted_body ||= Decidim::ContentProcessor.render(sanitized_body)
107
+ @formatted_body ||= Decidim::ContentProcessor.render(sanitized_body, "div")
96
108
  end
97
109
 
98
110
  def self.export_serializer
@@ -125,9 +137,22 @@ module Decidim
125
137
  self.depth = commentable.depth + 1 if commentable.respond_to?(:depth)
126
138
  end
127
139
 
128
- # Private: Returns the comment body sanitized, stripping HTML tags
140
+ # Private: Returns the comment body sanitized, sanitizing HTML tags
129
141
  def sanitized_body
130
- Rails::Html::Sanitizer.full_sanitizer.new.sanitize(body)
142
+ Rails::Html::WhiteListSanitizer.new.sanitize(
143
+ render_markdown(body),
144
+ scrubber: Decidim::Comments::UserInputScrubber.new
145
+ ).try(:html_safe)
146
+ end
147
+
148
+ # Private: Initializes the Markdown parser
149
+ def markdown
150
+ @markdown ||= Decidim::Comments::Markdown.new
151
+ end
152
+
153
+ # Private: converts the string from markdown to html
154
+ def render_markdown(string)
155
+ markdown.render(string)
131
156
  end
132
157
  end
133
158
  end
@@ -9,9 +9,6 @@ module Decidim
9
9
  end
10
10
 
11
11
  def save
12
- return @registry if @registry
13
-
14
- @registry = []
15
12
  query.each do |key, results|
16
13
  cumulative_value = results[:cumulative]
17
14
  next if cumulative_value.zero?
@@ -23,10 +20,8 @@ module Decidim
23
20
  organization: @organization, decidim_category_id: category_id,
24
21
  related_object_type: related_object_type, related_object_id: related_object_id)
25
22
  record.assign_attributes(cumulative: cumulative_value, quantity: quantity_value)
26
- @registry << record
23
+ record.save!
27
24
  end
28
- @registry.each(&:save!)
29
- @registry
30
25
  end
31
26
 
32
27
  private
@@ -30,8 +30,7 @@ module Decidim
30
30
  # loads comments replies. It uses Comment's MAX_DEPTH to load a maximum
31
31
  # level of nested replies.
32
32
  def query
33
- scope = Comment
34
- .where(commentable: commentable)
33
+ scope = base_scope
35
34
  .not_hidden
36
35
  .includes(:author, :user_group, :up_votes, :down_votes)
37
36
 
@@ -53,6 +52,13 @@ module Decidim
53
52
 
54
53
  private
55
54
 
55
+ def base_scope
56
+ id = @options[:id]
57
+ return Comment.where(root_commentable: commentable, id: id) if id.present?
58
+
59
+ Comment.where(commentable: commentable)
60
+ end
61
+
56
62
  def order_by_older(scope)
57
63
  scope.order(created_at: :asc)
58
64
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Comments
5
+ # Use this class as a scrubber to sanitize user input.
6
+ # https://stackoverflow.com/a/35073814/2110884.
7
+ class UserInputScrubber < Rails::Html::PermitScrubber
8
+ def initialize
9
+ super
10
+ self.tags = custom_allowed_tags
11
+ end
12
+
13
+ private
14
+
15
+ def custom_allowed_tags
16
+ %w(p blockquote)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -17,9 +17,12 @@ module Decidim
17
17
  # comment - the Comment from which to generate notifications.
18
18
  # mentioned_users - An ActiveRecord::Relation of the users that have been
19
19
  # mentioned
20
- def initialize(comment, mentioned_users)
20
+ # mentioned_groups - And ActiveRecord::Relation of the user_groups that have
21
+ # been mentioned
22
+ def initialize(comment, mentioned_users, mentioned_groups = nil)
21
23
  @comment = comment
22
24
  @mentioned_users = mentioned_users
25
+ @mentioned_groups = mentioned_groups
23
26
  @already_notified_users = [comment.author]
24
27
  end
25
28
 
@@ -28,14 +31,16 @@ module Decidim
28
31
  # Returns nothing.
29
32
  def create
30
33
  notify_mentioned_users
34
+ notify_mentioned_groups
31
35
  notify_parent_comment_author
32
36
  notify_author_followers
37
+ notify_user_group_followers
33
38
  notify_commentable_recipients
34
39
  end
35
40
 
36
41
  private
37
42
 
38
- attr_reader :comment, :mentioned_users, :already_notified_users
43
+ attr_reader :comment, :mentioned_users, :mentioned_groups, :already_notified_users
39
44
 
40
45
  def notify_mentioned_users
41
46
  affected_users = mentioned_users - already_notified_users
@@ -44,6 +49,17 @@ module Decidim
44
49
  notify(:user_mentioned, affected_users: affected_users)
45
50
  end
46
51
 
52
+ def notify_mentioned_groups
53
+ return unless mentioned_groups
54
+
55
+ mentioned_groups.each do |group|
56
+ affected_users = group.accepted_users - already_notified_users
57
+ @already_notified_users += affected_users
58
+
59
+ notify(:user_group_mentioned, affected_users: affected_users, extra: { group: group })
60
+ end
61
+ end
62
+
47
63
  # Notifies the author of a comment that their comment has been replied.
48
64
  # Only applies if the comment is a reply.
49
65
  def notify_parent_comment_author
@@ -62,6 +78,15 @@ module Decidim
62
78
  notify(:comment_by_followed_user, followers: followers)
63
79
  end
64
80
 
81
+ def notify_user_group_followers
82
+ return if comment.user_group.blank?
83
+
84
+ followers = comment.user_group.followers - already_notified_users
85
+ @already_notified_users += followers
86
+
87
+ notify(:comment_by_followed_user_group, followers: followers)
88
+ end
89
+
65
90
  # Notifies the users the `comment.commentable` resource implements as necessary.
66
91
  def notify_commentable_recipients
67
92
  followers = comment.commentable.users_to_notify_on_comment_created - already_notified_users
@@ -90,7 +115,7 @@ module Decidim
90
115
  extra: {
91
116
  comment_id: comment.id
92
117
  }
93
- }.merge(users)
118
+ }.deep_merge(users)
94
119
 
95
120
  Decidim::EventsManager.publish(data)
96
121
  end
@@ -29,9 +29,10 @@ module Decidim
29
29
  type !types[!CommentType]
30
30
 
31
31
  argument :orderBy, types.String, "Order the comments"
32
+ argument :singleCommentId, types.String, "ID of the single comment to look at"
32
33
 
33
34
  resolve lambda { |obj, args, _ctx|
34
- SortedComments.for(obj, order_by: args[:orderBy])
35
+ SortedComments.for(obj, order_by: args[:orderBy], id: args[:singleCommentId])
35
36
  }
36
37
  end
37
38
 
@@ -16,9 +16,9 @@ module Decidim
16
16
  argument :userGroupId, types.ID, "The comment's user group id. Replaces the author."
17
17
 
18
18
  resolve lambda { |obj, args, ctx|
19
- params = { "comment" => { "body" => args[:body], "alignment" => args[:alignment], "user_group_id" => args[:userGroupId] } }
19
+ params = { "comment" => { "body" => args[:body], "alignment" => args[:alignment], "user_group_id" => args[:userGroupId], "commentable" => obj } }
20
20
  form = Decidim::Comments::CommentForm.from_params(params).with_context(current_organization: ctx[:current_organization])
21
- Decidim::Comments::CreateComment.call(form, ctx[:current_user], obj) do
21
+ Decidim::Comments::CreateComment.call(form, ctx[:current_user]) do
22
22
  on(:ok) do |comment|
23
23
  return comment
24
24
  end
@@ -4,6 +4,7 @@ ar:
4
4
  decidim/comments/comment_by_followed_user_event: تعليق
5
5
  decidim/comments/comment_created_event: تعليق
6
6
  decidim/comments/reply_created_event: تعليق الرد
7
+ decidim/comments/user_group_mentioned_event: أشير
7
8
  decidim/comments/user_mentioned_event: أشير
8
9
  activerecord:
9
10
  models:
@@ -50,6 +51,7 @@ ar:
50
51
  against: ضد
51
52
  in_favor: لصالح
52
53
  deleted_user: مشارك محذوف
54
+ hide_replies: إخفاء الردود
53
55
  reply: الرد
54
56
  report:
55
57
  action: أبلغ عن
@@ -61,7 +63,8 @@ ar:
61
63
  does_not_belong: يحتوي على نشاط غير قانوني أو تهديدات انتحارية أو معلومات شخصية أو أي شيء آخر تعتقد أنه لا ينتمي إلى %{organization_name}.
62
64
  offensive: يحتوي على العنصرية والتمييز الجنسي والتشهير والهجمات الشخصية والتهديدات بالقتل أو طلبات الانتحار أو أي شكل من أشكال خطاب الكراهية.
63
65
  spam: يحتوي على clickbait أو الإعلان أو الخدع أو روبوت البرامج النصية.
64
- title: الإبلاغ عن مشكلة
66
+ show_replies: اظهر الردود الـ %{replies_count}
67
+ single_comment_link_title: الحصول على رابط نحو تعليق واحد
65
68
  comment_order_selector:
66
69
  order:
67
70
  best_rated: أفضل تصنيف
@@ -74,7 +77,10 @@ ar:
74
77
  comments:
75
78
  blocked_comments_for_user_warning: لا يمكنك التعليق في هذه اللحظة ، ولكن يمكنك قراءة التعليقات السابقة.
76
79
  blocked_comments_warning: التعليقات معطلة في هذا الوقت ، لكن يمكنك قراءة التعليقات السابقة.
80
+ comment_details_title: تفاصيل التعليق
77
81
  loading: جارٍ تحميل التعليقات ...
82
+ single_comment_warning: يمكنك الإطلاع على التعليقات المتبقية الأخرى <a href="%{url}">هنا</a>.
83
+ single_comment_warning_title: إنك ترى تعليقا واحدا
78
84
  title: "%{count} تعليقات"
79
85
  events:
80
86
  comments:
@@ -83,6 +89,9 @@ ar:
83
89
  email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{author_name}. يمكنك إلغاء تتبع هذا المستخدم من صفحة ملفه الشخصي.
84
90
  email_subject: هناك تعليق جديد مِن %{author_name} على %{resource_title}
85
91
  notification_title: هناك تعليق جديد مِن <a href="%{author_path}">%{author_name} %{author_nickname}</a> على <a href="%{resource_path}">%{resource_title}</a>.
92
+ comment_by_followed_user_group:
93
+ email_subject: هناك تعليق جديد مِن %{author_name} على %{resource_title}
94
+ notification_title: هناك تعليق جديد مِن <a href="%{author_path}">%{author_name} %{author_nickname}</a> على <a href="%{resource_path}">%{resource_title}</a>.
86
95
  comment_created:
87
96
  email_intro: "%{resource_title} تم التعليق. يمكنك قراءة التعليق في هذه الصفحة:"
88
97
  email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{resource_title}" أو مؤلفه. يمكنك إلغاء تتبعه من الرابط السابق.
@@ -0,0 +1,6 @@
1
+ bg:
2
+ activemodel:
3
+ models:
4
+ decidim/comments/comment_by_followed_user_event: Коментар
5
+ decidim/comments/comment_created_event: Коментар
6
+ decidim/comments/reply_created_event: Отговор на коментар
@@ -4,6 +4,7 @@ ca:
4
4
  decidim/comments/comment_by_followed_user_event: Comentari
5
5
  decidim/comments/comment_created_event: Comentari
6
6
  decidim/comments/reply_created_event: Resposta al comentari
7
+ decidim/comments/user_group_mentioned_event: Mencionar
7
8
  decidim/comments/user_mentioned_event: Mencionar
8
9
  activerecord:
9
10
  models:
@@ -16,6 +17,7 @@ ca:
16
17
  decidim:
17
18
  comments:
18
19
  comments: Comentaris
20
+ comments_count: Número de comentaris
19
21
  last_activity:
20
22
  new_comment_at_html: "<span>Nou comentari a %{link}</span>"
21
23
  votes:
@@ -42,6 +44,7 @@ ca:
42
44
  against: En contra
43
45
  in_favor: A favor
44
46
  deleted_user: Participant eliminada
47
+ hide_replies: Oculta les respostes
45
48
  reply: Respondre
46
49
  report:
47
50
  action: Denúncia
@@ -53,7 +56,9 @@ ca:
53
56
  does_not_belong: Conté activitat il·legal, amenaces de suïcidi, informació personal, o qualsevol altra cosa que creguis que no pertany a %{organization_name}.
54
57
  offensive: Conté racisme, sexisme, insults, atacs personals, amenaces de mort, peticions de suïcidi o qualsevol forma de discurs d'odi.
55
58
  spam: Conté "clickbait", publicitat o estafes.
56
- title: Denúncia un problema
59
+ title: Notificar contingut inapropiat
60
+ show_replies: Mostra %{replies_count} respostes
61
+ single_comment_link_title: Aconsegueix l'enllaç al comentari
57
62
  comment_order_selector:
58
63
  order:
59
64
  best_rated: Més ben valorats
@@ -66,8 +71,15 @@ ca:
66
71
  comments:
67
72
  blocked_comments_for_user_warning: No pots fer comentaris en aquest moment, però pots llegir els anteriors.
68
73
  blocked_comments_warning: Els comentaris estan desactivats en aquest moment, però pots llegir els anteriors.
74
+ comment_details_title: Detalls del comentari
69
75
  loading: Carregant els comentaris ...
76
+ single_comment_warning: Pots revisar la resta de comentaris <a href="%{url}">aquí</a>.
77
+ single_comment_warning_title: Estàs veient un sol comentari
70
78
  title: "%{count} comentaris"
79
+ down_vote_button:
80
+ text: No estic d'acord amb aquest comentari
81
+ up_vote_button:
82
+ text: Estic d'acord amb aquest comentari
71
83
  events:
72
84
  comments:
73
85
  comment_by_followed_user:
@@ -75,6 +87,11 @@ ca:
75
87
  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.
76
88
  email_subject: Hi ha un nou comentari de %{author_name} en %{resource_title}
77
89
  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>.
90
+ comment_by_followed_user_group:
91
+ email_intro: '%{author_name} ha deixat un comentari a%{resource_title}. Pots llegir-lo en aquesta pàgina:'
92
+ email_outro: Reps aquesta notificació perquè segueixes a %{author_name}. Pots deixar de seguir aquest grup des de la seva pàgina de perfil.
93
+ email_subject: Hi ha un nou comentari de %{author_name} en %{resource_title}
94
+ 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>.
78
95
  comment_created:
79
96
  email_intro: "S'ha comentat %{resource_title}. Pots llegir el comentari d'aquesta pàgina:"
80
97
  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.
@@ -85,6 +102,11 @@ ca:
85
102
  email_outro: Has rebut aquesta notificació perquè s'ha respost el teu comentari.
86
103
  email_subject: "%{author_name} ha respost el teu comentari a %{resource_title}"
87
104
  notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> ha respost el teu comentari a <a href="%{resource_path}">%{resource_title}</a>
105
+ user_group_mentioned:
106
+ email_intro: Un grup al qual pertanys ha estat esmentat
107
+ email_outro: Has rebut aquesta notificació perquè formes part del grup %{group_name} que ha estat esmentat a %{resource_title}.
108
+ email_subject: T'han esmentat a %{resource_title} com a membre de %{group_name}
109
+ 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>
88
110
  user_mentioned:
89
111
  email_intro: Has estat esmentada
90
112
  email_outro: Has rebut aquesta notificació perquè has estat esmentada a %{resource_title}.
@@ -4,7 +4,8 @@ cs:
4
4
  decidim/comments/comment_by_followed_user_event: Komentář
5
5
  decidim/comments/comment_created_event: Komentář
6
6
  decidim/comments/reply_created_event: Odpověď na komentář
7
- decidim/comments/user_mentioned_event: Zmínit se
7
+ decidim/comments/user_group_mentioned_event: Zmínka
8
+ decidim/comments/user_mentioned_event: Zmínka
8
9
  activerecord:
9
10
  models:
10
11
  decidim/comments/comment:
@@ -13,65 +14,76 @@ cs:
13
14
  many: Komentáře
14
15
  other: Komentáře
15
16
  decidim/comments/comment_vote:
16
- one: Hlasování
17
+ one: Hlasovat
17
18
  few: Hlasy
18
19
  many: Hlasy
19
20
  other: Hlasy
20
21
  decidim:
21
22
  comments:
22
23
  comments: Komentáře
24
+ comments_count: Počet komentářů
23
25
  last_activity:
24
26
  new_comment_at_html: "<span>Nový komentář v %{link}</span>"
25
27
  votes:
26
28
  create:
27
- error: Při hlasování se vyskytly chyby.
29
+ error: Při hlasování o komentáři došlo k chybě.
28
30
  components:
29
31
  add_comment_form:
30
- account_message: <a href="%{sign_in_url}">Přihlaste se svým účtem</a> nebo <a href="%{sign_up_url}">přihlaste se</a> a přidejte svůj komentář.
32
+ account_message: <a href="%{sign_in_url}">Přihlaste se pomocí svého účtu</a> nebo se <a href="%{sign_up_url}">zaregistrujte</a> a přidejte svůj komentář.
31
33
  form:
32
34
  body:
33
35
  label: Komentář
34
36
  placeholder: Co si o tom myslíš?
35
37
  form_error: Text je povinný a nesmí být delší než %{length} znaků.
36
- submit: Poslat
38
+ submit: Odeslat
37
39
  user_group_id:
38
40
  label: Komentovat jako
39
41
  opinion:
40
42
  neutral: Neutrální
41
43
  remaining_characters: "Zbývá %{count} znaků"
42
- remaining_characters_1: "Zbývá %{count} znaků"
44
+ remaining_characters_1: "Zbývá %{count} znak"
43
45
  title: Přidejte svůj komentář
44
46
  comment:
45
47
  alignment:
46
48
  against: Proti
47
49
  in_favor: Ve prospěch
48
- deleted_user: Vymazaný uživatel
50
+ deleted_user: Vymazaný účastník
51
+ hide_replies: Skrýt odpovědi
49
52
  reply: Odpověď
50
53
  report:
51
54
  action: Zpráva
52
- already_reported: Tento obsah je již nahlášen a bude kontrolován administrátorem.
55
+ already_reported: Tento obsah je již nahlášen a bude přezkoumán administrátorem.
53
56
  close: Zavřít
54
57
  description: Je tento obsah nevhodný?
55
58
  details: Další komentáře
56
59
  reasons:
57
60
  does_not_belong: Obsahuje nezákonnou činnost, sebevražedné hrozby, osobní informace nebo něco jiného, o kterém si myslíte, že nepatří na %{organization_name}.
58
61
  offensive: Obsahuje rasismus, sexismus, podvody, osobní útoky, hrozby smrti, žádosti o sebevraždu nebo jakoukoli formu projevy nenávisti.
59
- spam: Obsahuje clickbait, reklama, podvody nebo skripty.
60
- title: Nahlásit problém
62
+ spam: Obsahuje clickbait, reklamu, podvody nebo škodlivé skripty.
63
+ title: Nahlásit nevhodný obsah
64
+ show_replies: Zobrazit %{replies_count} odpovědí
65
+ single_comment_link_title: Získat odkaz na jeden komentář
61
66
  comment_order_selector:
62
67
  order:
63
68
  best_rated: Nejlépe hodnocené
64
69
  most_discussed: Nejdiskutovanější
65
70
  older: Starší
66
- recent: Nedávno
71
+ recent: Nedávné
67
72
  title: 'Seřadit podle:'
68
73
  comment_thread:
69
74
  title: Konverzace s číslem %{authorName}
70
75
  comments:
71
- blocked_comments_for_user_warning: V tuto chvíli nemůžete komentovat, ale můžete si přečíst předchozí.
72
- blocked_comments_warning: Komentáře jsou v tuto chvíli zakázány, ale můžete si přečíst předchozí.
76
+ blocked_comments_for_user_warning: Momentálně nemůžete komentovat, ale můžete si přečíst ty předchozí.
77
+ blocked_comments_warning: Komentáře jsou momentálně zakázány, ale můžete si přečíst ty předchozí.
78
+ comment_details_title: Podrobnosti komentáře
73
79
  loading: Načítání komentářů ...
80
+ single_comment_warning: Můžete zkontrolovat zbytek komentářů <a href="%{url}">zde</a>.
81
+ single_comment_warning_title: Vidíte jeden komentář
74
82
  title: "%{count} komentářů"
83
+ down_vote_button:
84
+ text: Nesouhlasím s tímto komentářem
85
+ up_vote_button:
86
+ text: Souhlasím s tímto komentářem
75
87
  events:
76
88
  comments:
77
89
  comment_by_followed_user:
@@ -79,6 +91,11 @@ cs:
79
91
  email_outro: Toto oznámení jste obdrželi, protože jste sledovali %{author_name}. Tento uživatel můžete zrušit ze své profilové stránky.
80
92
  email_subject: K dispozici je nový komentář %{author_name} v %{resource_title}
81
93
  notification_title: K dispozici je nový komentář <a href="%{author_path}">%{author_name} %{author_nickname}</a> v <a href="%{resource_path}">%{resource_title}</a>.
94
+ comment_by_followed_user_group:
95
+ email_intro: 'Skupina %{author_name} zanechala komentář v %{resource_title}. Můžete si jej přečíst na této stránce:'
96
+ email_outro: Obdrželi jste toto oznámení, protože sledujete %{author_name}. Můžete zrušit sledování této skupiny na její profilové stránce.
97
+ email_subject: K dispozici je nový komentář %{author_name} v %{resource_title}
98
+ notification_title: K dispozici je nový komentář <a href="%{author_path}">%{author_name} %{author_nickname}</a> v <a href="%{resource_path}">%{resource_title}</a>.
82
99
  comment_created:
83
100
  email_intro: "%{resource_title} bylo komentováno. Můžete si přečíst komentář na této stránce:"
84
101
  email_outro: Toto oznámení jste obdrželi, protože jste sledovali "%{resource_title}" nebo jeho autora. Můžete jej odhlásit od předchozího odkazu.
@@ -89,6 +106,11 @@ cs:
89
106
  email_outro: Toto oznámení jste obdrželi, protože váš komentář byl zodpovězen.
90
107
  email_subject: "%{author_name} odpověděl váš komentář v %{resource_title}"
91
108
  notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> odpověděl / a svůj komentář v <a href="%{resource_path}">%{resource_title}</a>
109
+ user_group_mentioned:
110
+ email_intro: Byla zmíněna skupina, do které patříte
111
+ email_outro: Obdrželi jste toto oznámení, protože jste členem skupiny %{group_name}, která byla zmíněna v %{resource_title}.
112
+ email_subject: Byl jste zmíněn v %{resource_title} jako člen %{group_name}
113
+ notification_title: Byli jste zmíněni v <a href="%{resource_path}">%{resource_title}</a> od <a href="%{author_path}">%{author_name} %{author_nickname}</a> jako člen <a href="%{group_path}">%{group_name} %{group_nickname}</a>
92
114
  user_mentioned:
93
115
  email_intro: Byl jste zmíněn
94
116
  email_outro: Toto oznámení jste obdrželi, protože jste byli uvedeni v %{resource_title}.