decidim-comments 0.22.0 → 0.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/decidim/comments/bundle.js +53 -53
- data/app/assets/javascripts/decidim/comments/bundle.js.map +1 -1
- data/app/cells/decidim/comments/comment_activity_cell.rb +2 -22
- data/app/cells/decidim/comments/comment_cell.rb +22 -0
- data/app/cells/decidim/comments/comment_m/footer.erb +5 -0
- data/app/cells/decidim/comments/comment_m/top.erb +7 -0
- data/app/cells/decidim/comments/comment_m_cell.rb +29 -0
- data/app/commands/decidim/comments/create_comment.rb +1 -1
- data/app/forms/decidim/comments/comment_form.rb +8 -1
- data/app/frontend/comments/add_comment_form.component.test.tsx +30 -28
- data/app/frontend/comments/add_comment_form.component.tsx +32 -16
- data/app/frontend/comments/comment.component.test.tsx +35 -4
- data/app/frontend/comments/comment.component.tsx +24 -15
- data/app/frontend/comments/comment_thread.component.test.tsx +9 -8
- data/app/frontend/comments/comment_thread.component.tsx +3 -1
- data/app/frontend/comments/comments.component.test.tsx +17 -14
- data/app/frontend/comments/comments.component.tsx +28 -4
- data/app/frontend/comments/down_vote_button.component.tsx +24 -9
- data/app/frontend/comments/up_vote_button.component.tsx +24 -9
- data/app/frontend/mutations/add_comment.mutation.graphql +2 -2
- data/app/frontend/mutations/down_vote.mutation.graphql +2 -2
- data/app/frontend/mutations/up_vote.mutation.graphql +2 -2
- data/app/frontend/queries/comments.query.graphql +2 -2
- data/app/frontend/support/schema.ts +1060 -735
- data/app/helpers/decidim/comments/comment_cells_helper.rb +33 -0
- data/app/models/decidim/comments/comment.rb +73 -20
- data/app/models/decidim/comments/seed.rb +1 -1
- data/app/types/decidim/comments/commentable_interface.rb +1 -1
- data/app/types/decidim/comments/commentable_mutation_type.rb +4 -1
- data/config/locales/am-ET.yml +1 -0
- data/config/locales/bg.yml +6 -0
- data/config/locales/ca.yml +1 -0
- data/config/locales/cs.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +1 -0
- data/config/locales/es-PY.yml +1 -0
- data/config/locales/es.yml +3 -2
- data/config/locales/et.yml +1 -0
- data/config/locales/fi-plain.yml +1 -0
- data/config/locales/fi.yml +2 -1
- data/config/locales/fr-CA.yml +2 -1
- data/config/locales/fr.yml +2 -1
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +1 -1
- data/config/locales/is-IS.yml +0 -2
- data/config/locales/is.yml +76 -0
- data/config/locales/ja-JP.yml +2 -2
- data/config/locales/ja.yml +121 -0
- data/config/locales/ko-KR.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt.yml +1 -0
- data/config/locales/{lv-LV.yml → lv.yml} +0 -0
- data/config/locales/mt.yml +1 -0
- data/config/locales/nl.yml +3 -2
- data/config/locales/om-ET.yml +1 -0
- data/config/locales/pl.yml +5 -5
- data/config/locales/so-SO.yml +1 -0
- data/config/locales/sv.yml +1 -0
- data/config/locales/ti-ER.yml +1 -0
- data/config/locales/uk.yml +0 -1
- data/config/locales/vi-VN.yml +1 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +121 -0
- data/config/locales/zh-TW.yml +1 -0
- data/db/migrate/20200706123136_make_comments_handle_i18n.rb +41 -0
- data/db/migrate/20200828101910_add_commentable_counter_cache_to_comments.rb +9 -0
- data/lib/decidim/comments/api/comment_type.rb +5 -1
- data/lib/decidim/comments/comment_serializer.rb +7 -2
- data/lib/decidim/comments/comment_vote_serializer.rb +5 -1
- data/lib/decidim/comments/commentable.rb +11 -0
- data/lib/decidim/comments/comments_helper.rb +28 -4
- data/lib/decidim/comments/engine.rb +13 -0
- data/lib/decidim/comments/mutation_extensions.rb +8 -0
- data/lib/decidim/comments/query_extensions.rb +4 -0
- data/lib/decidim/comments/test/factories.rb +10 -1
- data/lib/decidim/comments/test/shared_examples/comment_event.rb +1 -1
- data/lib/decidim/comments/version.rb +1 -1
- metadata +37 -11
@@ -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
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
39
|
+
# Updates the counter caches for the root_commentable when a comment is
|
40
|
+
# deleted.
|
41
|
+
after_destroy :update_counter
|
35
42
|
|
36
|
-
|
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,12 +121,13 @@ module Decidim
|
|
99
121
|
|
100
122
|
# Public: Overrides the `reported_content_url` Reportable concern method.
|
101
123
|
def reported_content_url
|
102
|
-
|
103
|
-
end
|
124
|
+
url_params = { anchor: "comment_#{id}" }
|
104
125
|
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
@@ -112,10 +135,10 @@ module Decidim
|
|
112
135
|
end
|
113
136
|
|
114
137
|
def self.newsletter_participant_ids(space)
|
115
|
-
Decidim::Comments::Comment.
|
116
|
-
|
117
|
-
|
118
|
-
|
138
|
+
authors_sql = Decidim::Comments::Comment.select("DISTINCT decidim_comments_comments.decidim_author_id").not_hidden
|
139
|
+
.where("decidim_comments_comments.decidim_author_type" => "Decidim::UserBaseEntity").to_sql
|
140
|
+
|
141
|
+
Decidim::User.where(organization: space.organization).where("id IN (#{authors_sql})").pluck(:id)
|
119
142
|
end
|
120
143
|
|
121
144
|
def can_participate?(user)
|
@@ -124,8 +147,35 @@ module Decidim
|
|
124
147
|
root_commentable.can_participate?(user)
|
125
148
|
end
|
126
149
|
|
150
|
+
def formatted_body
|
151
|
+
Decidim::ContentProcessor.render(sanitize_content(render_markdown(translated_body)), "div")
|
152
|
+
end
|
153
|
+
|
154
|
+
def translated_body
|
155
|
+
@translated_body ||= translated_attribute(body, organization)
|
156
|
+
end
|
157
|
+
|
127
158
|
private
|
128
159
|
|
160
|
+
def body_length
|
161
|
+
language = (body.keys - ["machine_translations"]).first
|
162
|
+
errors.add(:body, :too_long, count: comment_maximum_length) unless body[language].length <= comment_maximum_length
|
163
|
+
end
|
164
|
+
|
165
|
+
def comment_maximum_length
|
166
|
+
return unless commentable.commentable?
|
167
|
+
return component.settings.comments_max_length if component_settings_comments_max_length?
|
168
|
+
return organization.comments_max_length if organization.comments_max_length.positive?
|
169
|
+
|
170
|
+
1000
|
171
|
+
end
|
172
|
+
|
173
|
+
def component_settings_comments_max_length?
|
174
|
+
return unless component&.settings.respond_to?(:comments_max_length)
|
175
|
+
|
176
|
+
component.settings.comments_max_length.positive?
|
177
|
+
end
|
178
|
+
|
129
179
|
# Private: Check if commentable can have comments and if not adds
|
130
180
|
# a validation error to the model
|
131
181
|
def commentable_can_have_comments
|
@@ -138,11 +188,8 @@ module Decidim
|
|
138
188
|
end
|
139
189
|
|
140
190
|
# Private: Returns the comment body sanitized, sanitizing HTML tags
|
141
|
-
def
|
142
|
-
|
143
|
-
render_markdown(body),
|
144
|
-
scrubber: Decidim::Comments::UserInputScrubber.new
|
145
|
-
).try(:html_safe)
|
191
|
+
def sanitize_content(content)
|
192
|
+
Decidim::ContentProcessor.sanitize(content)
|
146
193
|
end
|
147
194
|
|
148
195
|
# Private: Initializes the Markdown parser
|
@@ -154,6 +201,12 @@ module Decidim
|
|
154
201
|
def render_markdown(string)
|
155
202
|
markdown.render(string)
|
156
203
|
end
|
204
|
+
|
205
|
+
def update_counter
|
206
|
+
return unless root_commentable
|
207
|
+
|
208
|
+
root_commentable.update_comments_count
|
209
|
+
end
|
157
210
|
end
|
158
211
|
end
|
159
212
|
end
|
@@ -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(
|
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:
|
data/config/locales/ca.yml
CHANGED
data/config/locales/cs.yml
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
da:
|
data/config/locales/en.yml
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
eo:
|
data/config/locales/es-MX.yml
CHANGED
data/config/locales/es-PY.yml
CHANGED
data/config/locales/es.yml
CHANGED
@@ -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}.
|
92
|
-
email_outro: Recibes esta notificación porque sigues a %{author_name}. Puedes dejar de seguir a este grupo
|
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:
|
data/config/locales/fi-plain.yml
CHANGED
data/config/locales/fi.yml
CHANGED
@@ -20,6 +20,7 @@ fi:
|
|
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: Kommentin äänestys epäonnistui.
|
@@ -109,7 +110,7 @@ fi:
|
|
109
110
|
notification_title: Käyttäjä <a href="%{author_path}">%{author_name}%{author_nickname}</a> on maininnut sinut kohteessa <a href="%{resource_path}">%{resource_title}</a> ryhmän <a href="%{group_path}">%{group_name} %{group_nickname}</a> jäsenenä
|
110
111
|
user_mentioned:
|
111
112
|
email_intro: Sinut on mainittu
|
112
|
-
email_outro: Tämä ilmoitus on lähetetty sinulle, koska sinut on mainittu
|
113
|
+
email_outro: Tämä ilmoitus on lähetetty sinulle, koska sinut on mainittu kohteessa %{resource_title}.
|
113
114
|
email_subject: Sinut on mainittu kohdassa %{resource_title}
|
114
115
|
notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> on maininnut sinut kohdassa <a href="%{resource_path}">%{resource_title}</a>
|
115
116
|
metrics:
|
data/config/locales/fr-CA.yml
CHANGED
@@ -16,10 +16,11 @@ fr-CA:
|
|
16
16
|
other: Votes
|
17
17
|
decidim:
|
18
18
|
comments:
|
19
|
-
comments:
|
19
|
+
comments: commentaires
|
20
20
|
comments_count: Nombre de commentaires
|
21
21
|
last_activity:
|
22
22
|
new_comment_at_html: "<span>Nouveau commentaire à %{link}</span>"
|
23
|
+
view: Voir
|
23
24
|
votes:
|
24
25
|
create:
|
25
26
|
error: Une erreur s'est produite lors du vote sur le commentaire.
|
data/config/locales/fr.yml
CHANGED
@@ -16,10 +16,11 @@ fr:
|
|
16
16
|
other: Votes
|
17
17
|
decidim:
|
18
18
|
comments:
|
19
|
-
comments:
|
19
|
+
comments: commentaires
|
20
20
|
comments_count: Nombre de commentaires
|
21
21
|
last_activity:
|
22
22
|
new_comment_at_html: "<span>Nouveau commentaire à %{link}</span>"
|
23
|
+
view: Voir
|
23
24
|
votes:
|
24
25
|
create:
|
25
26
|
error: Une erreur s'est produite lors du vote sur le commentaire.
|
@@ -0,0 +1 @@
|
|
1
|
+
hr:
|
data/config/locales/hu.yml
CHANGED
data/config/locales/is-IS.yml
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
is:
|
2
|
+
decidim:
|
3
|
+
comments:
|
4
|
+
comments: Athugasemdir
|
5
|
+
components:
|
6
|
+
add_comment_form:
|
7
|
+
account_message: <a href="%{sign_in_url}">Skráðu þig inn með reikningnum þínum</a> eða <a href="%{sign_up_url}">skráðu þig</a> til að bæta við ummælum þínum.
|
8
|
+
form:
|
9
|
+
body:
|
10
|
+
label: Athugasemd
|
11
|
+
placeholder: Hvað finnst þér um þetta?
|
12
|
+
form_error: Textinn er krafist og það má ekki vera lengri en %{length} stafir.
|
13
|
+
submit: Senda
|
14
|
+
user_group_id:
|
15
|
+
label: Athugasemd sem
|
16
|
+
opinion:
|
17
|
+
neutral: Hlutlaus
|
18
|
+
remaining_characters: "%{count} stafir eftir"
|
19
|
+
remaining_characters_1: "%{count} stafur eftir"
|
20
|
+
title: Bæta við athugasemd þinni
|
21
|
+
comment:
|
22
|
+
alignment:
|
23
|
+
against: Gegn
|
24
|
+
in_favor: Í hag
|
25
|
+
reply: Svara
|
26
|
+
report:
|
27
|
+
action: Skýrsla
|
28
|
+
already_reported: Þetta efni er þegar tilkynnt og það verður endurskoðað af stjórnanda.
|
29
|
+
close: Loka
|
30
|
+
description: Er þetta efni óviðeigandi?
|
31
|
+
details: Önnur athugasemdir
|
32
|
+
reasons:
|
33
|
+
does_not_belong: Inniheldur ólöglega starfsemi, sjálfsvígshugmyndir, persónulegar upplýsingar eða eitthvað sem þér finnst ekki tilheyra %{organization_name}.
|
34
|
+
offensive: Inniheldur kynþáttafordóma, kynhneigð, slurðir, persónulegar árásir, dauðarefsárásir, sjálfsvígstilraunir eða hvers konar hatursmál.
|
35
|
+
spam: Inniheldur clickbait, auglýsingar, óþekktarangi eða handritabots.
|
36
|
+
comment_order_selector:
|
37
|
+
order:
|
38
|
+
best_rated: Bestu einkunnir
|
39
|
+
most_discussed: Mest rætt
|
40
|
+
older: Eldri
|
41
|
+
recent: Nýleg
|
42
|
+
title: 'Raða eftir:'
|
43
|
+
comment_thread:
|
44
|
+
title: Samtal við %{authorName}
|
45
|
+
comments:
|
46
|
+
blocked_comments_warning: Athugasemdir eru gerðar óvirkar á þessum tíma, en þú getur lesið þau fyrri.
|
47
|
+
loading: Hleð inn athugasemdir ...
|
48
|
+
title: "%{count} athugasemdir"
|
49
|
+
events:
|
50
|
+
comments:
|
51
|
+
comment_by_followed_user:
|
52
|
+
email_intro: "%{author_name} hefur skilið eftir athugasemd í %{resource_title}. Þú getur lesið það á þessari síðu:"
|
53
|
+
email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með %{author_name}. Þú getur sleppt þessari notanda frá prófílssíðunni sinni.
|
54
|
+
email_subject: Það er nýtt ummæli um %{author_name} í %{resource_title}
|
55
|
+
notification_title: Það er nýtt ummæli við <a href="%{author_path}">%{author_name} %{author_nickname}</a> í <a href="%{resource_path}">%{resource_title}</a>.
|
56
|
+
comment_by_followed_user_group:
|
57
|
+
email_subject: Það er nýtt ummæli um %{author_name} í %{resource_title}
|
58
|
+
notification_title: Það er nýtt ummæli við <a href="%{author_path}">%{author_name} %{author_nickname}</a> í <a href="%{resource_path}">%{resource_title}</a>.
|
59
|
+
comment_created:
|
60
|
+
email_intro: "%{resource_title} hefur verið skrifað ummæli. Þú getur lesið athugasemdina á þessari síðu:"
|
61
|
+
email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með "%{resource_title}" eða höfundinum. Þú getur sleppt því frá fyrri tengilinn.
|
62
|
+
email_subject: Það er nýtt ummæli frá %{author_name} í %{resource_title}
|
63
|
+
notification_title: Það er nýtt ummæli frá <a href="%{author_path}">%{author_name} %{author_nickname}</a> í <a href="%{resource_path}">%{resource_title}</a>
|
64
|
+
reply_created:
|
65
|
+
email_intro: "%{author_name} hefur svarað ummæli þín í %{resource_title}. Þú getur lesið það á þessari síðu:"
|
66
|
+
email_outro: Þú hefur fengið þessa tilkynningu vegna þess að ummæli þín voru svarað.
|
67
|
+
email_subject: "%{author_name} hefur svarað ummæli þín í %{resource_title}"
|
68
|
+
notification_title: <a href="%{author_path}">%{author_name} %{author_nickname}</a> hefur svarað athugasemd þinni í <a href="%{resource_path}">%{resource_title}</a>
|
69
|
+
user_mentioned:
|
70
|
+
email_intro: Þú hefur verið nefndur
|
71
|
+
email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú hefur verið nefndur í %{resource_title}.
|
72
|
+
email_subject: Þú hefur verið nefndur í %{resource_title}
|
73
|
+
notification_title: Þú hefur verið nefndur í <a href="%{resource_path}">%{resource_title}</a> af <a href="%{author_path}">%{author_name} %{author_nickname}</a>
|
74
|
+
errors:
|
75
|
+
messages:
|
76
|
+
cannot_have_comments: getur ekki haft athugasemdir
|