decidim-comments 0.22.0 → 0.23.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/comments/bundle.js +53 -53
  3. data/app/assets/javascripts/decidim/comments/bundle.js.map +1 -1
  4. data/app/cells/decidim/comments/comment_activity_cell.rb +2 -22
  5. data/app/cells/decidim/comments/comment_cell.rb +22 -0
  6. data/app/cells/decidim/comments/comment_m/footer.erb +5 -0
  7. data/app/cells/decidim/comments/comment_m/top.erb +7 -0
  8. data/app/cells/decidim/comments/comment_m_cell.rb +29 -0
  9. data/app/commands/decidim/comments/create_comment.rb +1 -1
  10. data/app/events/decidim/comments/comment_event.rb +1 -9
  11. data/app/forms/decidim/comments/comment_form.rb +8 -1
  12. data/app/frontend/comments/add_comment_form.component.test.tsx +30 -28
  13. data/app/frontend/comments/add_comment_form.component.tsx +32 -16
  14. data/app/frontend/comments/comment.component.test.tsx +35 -4
  15. data/app/frontend/comments/comment.component.tsx +24 -15
  16. data/app/frontend/comments/comment_thread.component.test.tsx +9 -8
  17. data/app/frontend/comments/comment_thread.component.tsx +3 -1
  18. data/app/frontend/comments/comments.component.test.tsx +17 -14
  19. data/app/frontend/comments/comments.component.tsx +28 -4
  20. data/app/frontend/comments/down_vote_button.component.tsx +24 -9
  21. data/app/frontend/comments/up_vote_button.component.tsx +24 -9
  22. data/app/frontend/mutations/add_comment.mutation.graphql +2 -2
  23. data/app/frontend/mutations/down_vote.mutation.graphql +2 -2
  24. data/app/frontend/mutations/up_vote.mutation.graphql +2 -2
  25. data/app/frontend/queries/comments.query.graphql +2 -2
  26. data/app/frontend/support/schema.ts +1060 -735
  27. data/app/helpers/decidim/comments/comment_cells_helper.rb +33 -0
  28. data/app/models/decidim/comments/comment.rb +80 -21
  29. data/app/models/decidim/comments/seed.rb +1 -1
  30. data/app/types/decidim/comments/commentable_interface.rb +1 -1
  31. data/app/types/decidim/comments/commentable_mutation_type.rb +4 -1
  32. data/config/locales/am-ET.yml +1 -0
  33. data/config/locales/bg.yml +6 -0
  34. data/config/locales/ca.yml +1 -0
  35. data/config/locales/cs.yml +2 -1
  36. data/config/locales/da.yml +1 -0
  37. data/config/locales/de.yml +29 -28
  38. data/config/locales/en.yml +1 -0
  39. data/config/locales/eo.yml +1 -0
  40. data/config/locales/es-MX.yml +1 -0
  41. data/config/locales/es-PY.yml +1 -0
  42. data/config/locales/es.yml +3 -2
  43. data/config/locales/et.yml +1 -0
  44. data/config/locales/fi-plain.yml +1 -0
  45. data/config/locales/fi.yml +2 -1
  46. data/config/locales/fr-CA.yml +2 -1
  47. data/config/locales/fr.yml +2 -1
  48. data/config/locales/gl.yml +13 -0
  49. data/config/locales/hr.yml +1 -0
  50. data/config/locales/hu.yml +1 -1
  51. data/config/locales/is-IS.yml +0 -2
  52. data/config/locales/is.yml +76 -0
  53. data/config/locales/it.yml +1 -0
  54. data/config/locales/ja-JP.yml +2 -2
  55. data/config/locales/ja.yml +121 -0
  56. data/config/locales/ko-KR.yml +1 -0
  57. data/config/locales/ko.yml +1 -0
  58. data/config/locales/lt.yml +1 -0
  59. data/config/locales/{lv-LV.yml → lv.yml} +0 -0
  60. data/config/locales/mt.yml +1 -0
  61. data/config/locales/nl.yml +11 -10
  62. data/config/locales/om-ET.yml +1 -0
  63. data/config/locales/pl.yml +6 -5
  64. data/config/locales/si-LK.yml +1 -0
  65. data/config/locales/so-SO.yml +1 -0
  66. data/config/locales/sv.yml +1 -0
  67. data/config/locales/sw-KE.yml +1 -0
  68. data/config/locales/ti-ER.yml +1 -0
  69. data/config/locales/tr-TR.yml +53 -33
  70. data/config/locales/uk.yml +0 -1
  71. data/config/locales/vi-VN.yml +1 -0
  72. data/config/locales/vi.yml +1 -0
  73. data/config/locales/zh-CN.yml +121 -0
  74. data/config/locales/zh-TW.yml +1 -0
  75. data/db/migrate/20200706123136_make_comments_handle_i18n.rb +41 -0
  76. data/db/migrate/20200828101910_add_commentable_counter_cache_to_comments.rb +9 -0
  77. data/lib/decidim/comments/api/comment_type.rb +5 -1
  78. data/lib/decidim/comments/comment_serializer.rb +7 -2
  79. data/lib/decidim/comments/comment_vote_serializer.rb +5 -1
  80. data/lib/decidim/comments/commentable.rb +11 -0
  81. data/lib/decidim/comments/comments_helper.rb +28 -4
  82. data/lib/decidim/comments/engine.rb +13 -0
  83. data/lib/decidim/comments/mutation_extensions.rb +8 -0
  84. data/lib/decidim/comments/query_extensions.rb +4 -0
  85. data/lib/decidim/comments/test/factories.rb +10 -1
  86. data/lib/decidim/comments/test/shared_examples/comment_event.rb +1 -1
  87. data/lib/decidim/comments/version.rb +1 -1
  88. metadata +42 -14
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Comments
5
+ # Custom helpers for comments cells.
6
+ #
7
+ module CommentCellsHelper
8
+ def renderable?
9
+ comment.present? && root_commentable.present?
10
+ end
11
+
12
+ def resource_link_text
13
+ comment.formatted_body
14
+ end
15
+
16
+ def resource_link_path
17
+ return root_commentable.polymorphic_resource_path(url_params) if root_commentable&.respond_to?(:polymorphic_resource_path)
18
+
19
+ resource_locator(root_commentable).path(url_params)
20
+ end
21
+
22
+ delegate :root_commentable, to: :comment
23
+
24
+ def root_commentable_title
25
+ decidim_html_escape(translated_attribute(root_commentable.title))
26
+ end
27
+
28
+ def url_params
29
+ { commentId: comment.id }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -13,6 +13,9 @@ module Decidim
13
13
  include Decidim::DataPortability
14
14
  include Decidim::Traceable
15
15
  include Decidim::Loggable
16
+ include Decidim::Searchable
17
+ include Decidim::TranslatableResource
18
+ include Decidim::TranslatableAttributes
16
19
 
17
20
  # Limit the max depth of a comment tree. If C is a comment and R is a reply:
18
21
  # C (depth 0)
@@ -22,23 +25,42 @@ module Decidim
22
25
  # |--R (depth 3)
23
26
  MAX_DEPTH = 3
24
27
 
28
+ translatable_fields :body
29
+
25
30
  belongs_to :commentable, foreign_key: "decidim_commentable_id", foreign_type: "decidim_commentable_type", polymorphic: true
26
- belongs_to :root_commentable, foreign_key: "decidim_root_commentable_id", foreign_type: "decidim_root_commentable_type", polymorphic: true
31
+ belongs_to :root_commentable, foreign_key: "decidim_root_commentable_id", foreign_type: "decidim_root_commentable_type", polymorphic: true, touch: true
27
32
  has_many :up_votes, -> { where(weight: 1) }, foreign_key: "decidim_comment_id", class_name: "CommentVote", dependent: :destroy
28
33
  has_many :down_votes, -> { where(weight: -1) }, foreign_key: "decidim_comment_id", class_name: "CommentVote", dependent: :destroy
29
34
 
30
- validates :body, presence: true
31
- validates :depth, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: MAX_DEPTH }
32
- validates :alignment, inclusion: { in: [0, 1, -1] }
35
+ # Updates the counter caches for the root_commentable when a comment is
36
+ # created or updated.
37
+ after_save :update_counter
33
38
 
34
- validates :body, length: { maximum: 1000 }
39
+ # Updates the counter caches for the root_commentable when a comment is
40
+ # deleted.
41
+ after_destroy :update_counter
35
42
 
36
- validate :commentable_can_have_comments
43
+ # Updates the counter caches for the root_commentable when a comment is
44
+ # touched, which happens when a comment was reported and its moderation
45
+ # is accepted and sets the comment as hidden.
46
+ after_touch :update_counter
37
47
 
38
48
  before_validation :compute_depth
49
+ validates :body, presence: true
50
+ validates :depth, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: MAX_DEPTH }
51
+ validates :alignment, inclusion: { in: [0, 1, -1] }
52
+ validate :body_length
53
+ validate :commentable_can_have_comments
39
54
 
40
55
  delegate :organization, to: :commentable
41
56
 
57
+ translatable_fields :body
58
+ searchable_fields(
59
+ participatory_space: :itself,
60
+ A: :body,
61
+ datetime: :created_at
62
+ )
63
+
42
64
  def self.positive
43
65
  where(alignment: 1)
44
66
  end
@@ -99,23 +121,30 @@ module Decidim
99
121
 
100
122
  # Public: Overrides the `reported_content_url` Reportable concern method.
101
123
  def reported_content_url
102
- ResourceLocatorPresenter.new(root_commentable).url(anchor: "comment_#{id}")
103
- end
124
+ url_params = { anchor: "comment_#{id}" }
104
125
 
105
- # Public: Returns the comment message ready to display (it is expected to include HTML)
106
- def formatted_body
107
- @formatted_body ||= Decidim::ContentProcessor.render(sanitized_body, "div")
126
+ if root_commentable&.respond_to?(:polymorphic_resource_url)
127
+ root_commentable.polymorphic_resource_url(url_params)
128
+ else
129
+ ResourceLocatorPresenter.new(root_commentable).url(url_params)
130
+ end
108
131
  end
109
132
 
110
133
  def self.export_serializer
111
134
  Decidim::Comments::CommentSerializer
112
135
  end
113
136
 
114
- def self.newsletter_participant_ids(space)
115
- Decidim::Comments::Comment.includes(:root_commentable).not_hidden
116
- .where("decidim_comments_comments.decidim_author_id IN (?)", Decidim::User.where(organization: space.organization).pluck(:id))
117
- .where("decidim_comments_comments.decidim_author_type IN (?)", "Decidim::UserBaseEntity")
118
- .map(&:author).pluck(:id).flatten.compact.uniq
137
+ # Public: Returns the list of author IDs of type `UserBaseEntity` that commented in one of the +resources+.
138
+ # Expects all +resources+ to be of the same "commentable_type".
139
+ # If the result is not `Decidim::Comments::Commentable` returns `nil`.
140
+ def self.user_commentators_ids_in(resources)
141
+ if resources.first&.kind_of?(Decidim::Comments::Commentable)
142
+ commentable_type = resources.first.class.name
143
+ Decidim::Comments::Comment.select("DISTINCT decidim_author_id").not_hidden
144
+ .where(decidim_commentable_id: resources.pluck(:id))
145
+ .where(decidim_commentable_type: commentable_type)
146
+ .where("decidim_author_type" => "Decidim::UserBaseEntity").pluck(:decidim_author_id)
147
+ end
119
148
  end
120
149
 
121
150
  def can_participate?(user)
@@ -124,8 +153,35 @@ module Decidim
124
153
  root_commentable.can_participate?(user)
125
154
  end
126
155
 
156
+ def formatted_body
157
+ Decidim::ContentProcessor.render(sanitize_content(render_markdown(translated_body)), "div")
158
+ end
159
+
160
+ def translated_body
161
+ @translated_body ||= translated_attribute(body, organization)
162
+ end
163
+
127
164
  private
128
165
 
166
+ def body_length
167
+ language = (body.keys - ["machine_translations"]).first
168
+ errors.add(:body, :too_long, count: comment_maximum_length) unless body[language].length <= comment_maximum_length
169
+ end
170
+
171
+ def comment_maximum_length
172
+ return unless commentable.commentable?
173
+ return component.settings.comments_max_length if component_settings_comments_max_length?
174
+ return organization.comments_max_length if organization.comments_max_length.positive?
175
+
176
+ 1000
177
+ end
178
+
179
+ def component_settings_comments_max_length?
180
+ return unless component&.settings.respond_to?(:comments_max_length)
181
+
182
+ component.settings.comments_max_length.positive?
183
+ end
184
+
129
185
  # Private: Check if commentable can have comments and if not adds
130
186
  # a validation error to the model
131
187
  def commentable_can_have_comments
@@ -138,11 +194,8 @@ module Decidim
138
194
  end
139
195
 
140
196
  # Private: Returns the comment body sanitized, sanitizing HTML tags
141
- def sanitized_body
142
- Rails::Html::WhiteListSanitizer.new.sanitize(
143
- render_markdown(body),
144
- scrubber: Decidim::Comments::UserInputScrubber.new
145
- ).try(:html_safe)
197
+ def sanitize_content(content)
198
+ Decidim::ContentProcessor.sanitize(content)
146
199
  end
147
200
 
148
201
  # Private: Initializes the Markdown parser
@@ -154,6 +207,12 @@ module Decidim
154
207
  def render_markdown(string)
155
208
  markdown.render(string)
156
209
  end
210
+
211
+ def update_counter
212
+ return unless root_commentable
213
+
214
+ root_commentable.update_comments_count
215
+ end
157
216
  end
158
217
  end
159
218
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  params = {
26
26
  commentable: resource,
27
27
  root_commentable: resource,
28
- body: ::Faker::Lorem.sentence(50),
28
+ body: { en: ::Faker::Lorem.sentence(50) },
29
29
  author: author,
30
30
  user_group: user_group
31
31
  }
@@ -41,7 +41,7 @@ module Decidim
41
41
  description "The number of comments in all levels this resource holds"
42
42
 
43
43
  resolve lambda { |obj, _args, _ctx|
44
- obj.comments.count
44
+ obj.comments_count
45
45
  }
46
46
  end
47
47
 
@@ -17,7 +17,10 @@ module Decidim
17
17
 
18
18
  resolve lambda { |obj, args, ctx|
19
19
  params = { "comment" => { "body" => args[:body], "alignment" => args[:alignment], "user_group_id" => args[:userGroupId], "commentable" => obj } }
20
- form = Decidim::Comments::CommentForm.from_params(params).with_context(current_organization: ctx[:current_organization])
20
+ form = Decidim::Comments::CommentForm.from_params(params).with_context(
21
+ current_organization: ctx[:current_organization],
22
+ current_component: obj.component
23
+ )
21
24
  Decidim::Comments::CreateComment.call(form, ctx[:current_user]) do
22
25
  on(:ok) do |comment|
23
26
  return comment
@@ -0,0 +1 @@
1
+ am:
@@ -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: Отговор на коментар
@@ -20,6 +20,7 @@ ca:
20
20
  comments_count: Número de comentaris
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Nou comentari a %{link}</span>"
23
+ view: Mostrar
23
24
  votes:
24
25
  create:
25
26
  error: S'ha produït un error en votar el comentari.
@@ -24,6 +24,7 @@ cs:
24
24
  comments_count: Počet komentářů
25
25
  last_activity:
26
26
  new_comment_at_html: "<span>Nový komentář v %{link}</span>"
27
+ view: Zobrazit
27
28
  votes:
28
29
  create:
29
30
  error: Při hlasování o komentáři došlo k chybě.
@@ -66,7 +67,7 @@ cs:
66
67
  comment_order_selector:
67
68
  order:
68
69
  best_rated: Nejlépe hodnocené
69
- most_discussed: Nejdiskutovanější
70
+ most_discussed: Nejvíce diskutované
70
71
  older: Starší
71
72
  recent: Nedávné
72
73
  title: 'Seřadit podle:'
@@ -0,0 +1 @@
1
+ da:
@@ -20,41 +20,42 @@ de:
20
20
  comments_count: Kommentaranzahl
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Neuer Kommentar unter %{link}</span>"
23
+ view: Ansicht
23
24
  votes:
24
25
  create:
25
26
  error: Beim Abstimmen des Kommentars sind Fehler aufgetreten.
26
27
  components:
27
28
  add_comment_form:
28
- account_message: <a href="%{sign_in_url}">Melden Sie sich mit Ihrem Konto an</a> oder <a href="%{sign_up_url}">Melden Sie sich</a> an, um Ihren Kommentar hinzuzufügen.
29
+ account_message: <a href="%{sign_in_url}">Melden Sie sich mit Ihrem Konto an</a> oder <a href="%{sign_up_url}">registrieren Sie sich</a>, um Ihren Kommentar hinzuzufügen.
29
30
  form:
30
31
  body:
31
32
  label: Kommentar
32
- placeholder: Was denkst du darüber?
33
+ placeholder: Was denken Sie darüber?
33
34
  form_error: Der Text ist erforderlich und darf nicht länger als %{length} Zeichen sein.
34
35
  submit: Senden
35
36
  user_group_id:
36
- label: Kommentar als
37
+ label: Kommentieren als
37
38
  opinion:
38
39
  neutral: Neutral
39
40
  remaining_characters: "%{count} Zeichen übrig"
40
41
  remaining_characters_1: "%{count} Zeichen übrig"
41
- title: Füge deinen Kommentar hinzu
42
+ title: Kommentar hinzufügen
42
43
  comment:
43
44
  alignment:
44
45
  against: Gegen
45
46
  in_favor: Zugunsten
46
47
  deleted_user: Gelöschter Benutzer
47
- hide_replies: Antworten ausblenden
48
+ hide_replies: Antworten verbergen
48
49
  reply: Antworten
49
50
  report:
50
- action: Bericht
51
+ action: Melden
51
52
  already_reported: Dieser Inhalt wurde bereits gemeldet und wird von einem Administrator überprüft.
52
53
  close: Schließen
53
54
  description: Ist dieser Inhalt unangemessen?
54
55
  details: Zusätzliche Kommentare
55
56
  reasons:
56
- does_not_belong: Enthält illegale Aktivitäten, Selbstmorddrohungen, persönliche Informationen oder etwas anderes, von dem Sie denken, dass es nicht auf %{organization_name}.
57
- offensive: Enthält Rassismus, Sexismus, Verunglimpfungen, persönliche Angriffe, Morddrohungen, Selbstmordanträge oder jede Form von Hassreden.
57
+ does_not_belong: Enthält illegale Aktivitäten, Selbstmorddrohungen, persönliche Informationen oder etwas anderes, von dem Sie denken, dass es nicht auf %{organization_name} gehört.
58
+ offensive: Enthält Rassismus, Sexismus, Verleumdungen, persönliche Angriffe, Morddrohungen, Selbstmordanträge oder jegliche Form von Hassreden.
58
59
  spam: Enthält Clickbait, Werbung, Scams oder Script Bots.
59
60
  title: Ungeeigneten Inhalt melden
60
61
  show_replies: '%{replies_count} Antworten anzeigen'
@@ -63,8 +64,8 @@ de:
63
64
  order:
64
65
  best_rated: Am besten bewertet
65
66
  most_discussed: Meist diskutiert
66
- older: Älter
67
- recent: Kürzlich
67
+ older: Chronologisch
68
+ recent: Kürzlich hinzugefügt
68
69
  title: 'Sortieren nach:'
69
70
  comment_thread:
70
71
  title: Konversation mit %{authorName}
@@ -83,35 +84,35 @@ de:
83
84
  events:
84
85
  comments:
85
86
  comment_by_followed_user:
86
- email_intro: "%{author_name} hat einen Kommentar in %{resource_title}hinterlassen. Sie können es auf dieser Seite lesen:"
87
- email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie %{author_name}. Sie können diesen Benutzer von seiner Profilseite aus nicht mehr anzeigen.
88
- email_subject: Es gibt einen neuen Kommentar von %{author_name} in %{resource_title}
89
- notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> in <a href="%{resource_path}">%{resource_title}</a>.
87
+ email_intro: "%{author_name} hat einen Kommentar zu %{resource_title} hinterlassen. Sie können diesen auf dieser Seite lesen:"
88
+ email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie %{author_name} folgen. Falls Sie keine solchen Benachrichtigungen mehr erhalten möchten, besuchen Sie die Profil-Seite dieses Benutzers.
89
+ email_subject: Neuer Kommentar von %{author_name} zu %{resource_title}
90
+ notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> zu <a href="%{resource_path}">%{resource_title}</a>.
90
91
  comment_by_followed_user_group:
91
- email_intro: 'Die Gruppe %{author_name} hat einen Kommentar in %{resource_title} hinterlassen. Sie können es auf dieser Seite lesen:'
92
- email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie %{author_name} folgen. Sie können diese Gruppe von ihrer Profilseite aus deabonnieren.
93
- email_subject: Es gibt einen neuen Kommentar von %{author_name} in %{resource_title}
94
- notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> in <a href="%{resource_path}">%{resource_title}</a>.
92
+ email_intro: 'Die Gruppe %{author_name} hat einen Kommentar in %{resource_title} hinterlassen. Sie können diesen auf dieser Seite lesen:'
93
+ email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie %{author_name} folgen. Falls Sie keine solchen Benachrichtigungen mehr erhalten möchten, besuchen Sie die Profil-Seite dieser Gruppe.
94
+ email_subject: Neuer Kommentar von %{author_name} zu %{resource_title}
95
+ notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> zu <a href="%{resource_path}">%{resource_title}</a>.
95
96
  comment_created:
96
97
  email_intro: "%{resource_title} wurde kommentiert. Sie können den Kommentar auf dieser Seite lesen:"
97
- email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie "%{resource_title}" oder seinem Autor folgen. Sie können es aus dem vorherigen Link entfernen.
98
- email_subject: Es gibt einen neuen Kommentar von %{author_name} in %{resource_title}
99
- notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> in <a href="%{resource_path}">%{resource_title}</a>
98
+ email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie "%{resource_title}" oder seinem Autor folgen. Falls Sie keine solchen Benachrichtigungen mehr erhalten möchten, besuchen Sie den obigen Link.
99
+ email_subject: Neuer Kommentar von %{author_name} zu %{resource_title}
100
+ notification_title: Es gibt einen neuen Kommentar von <a href="%{author_path}">%{author_name} %{author_nickname}</a> zu <a href="%{resource_path}">%{resource_title}</a>
100
101
  reply_created:
101
- email_intro: "%{author_name} hat Ihren Kommentar in %{resource_title}geantwortet. Sie können es auf dieser Seite lesen:"
102
+ email_intro: "%{author_name} hat auf Ihren Kommentar zu %{resource_title} geantwortet. Sie können das auf dieser Seite lesen:"
102
103
  email_outro: Sie haben diese Benachrichtigung erhalten, weil Ihr Kommentar beantwortet wurde.
103
- email_subject: "%{author_name} hat Ihren Kommentar in %{resource_title}geantwortet"
104
- notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> hat Ihren Kommentar in <a href="%{resource_path}">%{resource_title}</a>geantwortet
104
+ email_subject: "%{author_name} hat auf Ihren Kommentar zu %{resource_title} geantwortet"
105
+ notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> hat auf Ihren Kommentar in <a href="%{resource_path}">%{resource_title}</a> geantwortet
105
106
  user_group_mentioned:
106
107
  email_intro: Eine Ihrer Gruppen wurde erwähnt
107
108
  email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie ein Mitglied der Gruppe %{group_name} sind, die in %{resource_title} erwähnt wurde.
108
109
  email_subject: Sie wurden in %{resource_title} als Mitglied von %{group_name} erwähnt
109
110
  notification_title: Sie wurden in <a href="%{resource_path}">%{resource_title}</a> von <a href="%{author_path}">%{author_name} %{author_nickname}</a> als ein Mitglied von <a href="%{group_path}">%{group_name} %{group_nickname}</a> erwähnt
110
111
  user_mentioned:
111
- email_intro: Du wurdest erwähnt
112
- email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie in %{resource_title}.
113
- email_subject: Du wurdest in %{resource_title}
114
- notification_title: Sie wurden in <a href="%{resource_path}">%{resource_title}</a> von <a href="%{author_path}">%{author_name} %{author_nickname}</a>
112
+ email_intro: Sie wurden erwähnt
113
+ email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie in %{resource_title} erwähnt wurden.
114
+ email_subject: Sie wurden in %{resource_title} erwähnt
115
+ notification_title: Sie wurden in <a href="%{resource_path}">%{resource_title}</a> von <a href="%{author_path}">%{author_name} %{author_nickname}</a> erwähnt
115
116
  metrics:
116
117
  comments:
117
118
  description: Anzahl der von Benutzern generierten Kommentare
@@ -21,6 +21,7 @@ en:
21
21
  comments_count: Comments count
22
22
  last_activity:
23
23
  new_comment_at_html: "<span>New comment at %{link}</span>"
24
+ view: View
24
25
  votes:
25
26
  create:
26
27
  error: There was a problem voting the comment.
@@ -0,0 +1 @@
1
+ eo:
@@ -20,6 +20,7 @@ es-MX:
20
20
  comments_count: Número de comentarios
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Nuevo comentario en %{link}</span>"
23
+ view: Ver
23
24
  votes:
24
25
  create:
25
26
  error: Ha habido errores al votar el comentario.
@@ -20,6 +20,7 @@ es-PY:
20
20
  comments_count: Número de comentarios
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Nuevo comentario en %{link}</span>"
23
+ view: Ver
23
24
  votes:
24
25
  create:
25
26
  error: Ha habido errores al votar el comentario.
@@ -20,6 +20,7 @@ es:
20
20
  comments_count: Número de comentarios
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Nuevo comentario en %{link}</span>"
23
+ view: Ver
23
24
  votes:
24
25
  create:
25
26
  error: Se ha producido un error al votar el comentario.
@@ -88,8 +89,8 @@ es:
88
89
  email_subject: Hay un nuevo comentario de %{author_name} en %{resource_title}
89
90
  notification_title: Hay un nuevo comentario de <a href="%{author_path}">%{author_name} %{author_nickname}</a> en <a href="%{resource_path}">%{resource_title}</a>.
90
91
  comment_by_followed_user_group:
91
- email_intro: '%{author_name} ha dejado un comentario en %{resource_title}. Puede leerlo en esta página:'
92
- email_outro: Recibes esta notificación porque sigues a %{author_name}. Puedes dejar de seguir a este grupo des de su página de perfil.
92
+ email_intro: '%{author_name} ha dejado un comentario en %{resource_title}. Puedes leerlo en esta página:'
93
+ email_outro: Recibes esta notificación porque sigues a %{author_name}. Puedes dejar de seguir a este grupo desde su página de perfil.
93
94
  email_subject: Hay un nuevo comentario de %{author_name} en %{resource_title}
94
95
  notification_title: Hay un nuevo comentario de <a href="%{author_path}">%{author_name} %{author_nickname}</a> en <a href="%{resource_path}">%{resource_title}</a>.
95
96
  comment_created:
@@ -0,0 +1 @@
1
+ et:
@@ -20,6 +20,7 @@ fi-pl:
20
20
  comments_count: Kommenttien määrä
21
21
  last_activity:
22
22
  new_comment_at_html: "<span>Uusi kommentti osoitteessa %{link}</span>"
23
+ view: Näytä
23
24
  votes:
24
25
  create:
25
26
  error: Äänestettäessä kommenttia tapahtui virhe.