decidim-comments 0.21.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/decidim/comments/bundle.js +32 -32
- data/app/assets/javascripts/decidim/comments/bundle.js.map +1 -1
- data/app/cells/decidim/comments/comment_activity_cell.rb +1 -1
- data/app/commands/decidim/comments/create_comment.rb +7 -7
- data/app/events/decidim/comments/comment_by_followed_user_group_event.rb +9 -0
- data/app/events/decidim/comments/comment_event.rb +15 -2
- data/app/events/decidim/comments/user_group_mentioned_event.rb +10 -0
- data/app/forms/decidim/comments/comment_form.rb +9 -0
- data/app/frontend/application/icon.component.tsx +16 -4
- data/app/frontend/comments/add_comment_form.component.test.tsx +1 -1
- data/app/frontend/comments/add_comment_form.component.tsx +2 -2
- data/app/frontend/comments/comment.component.test.tsx +1 -1
- data/app/frontend/comments/comment.component.tsx +194 -73
- data/app/frontend/comments/comment_order_selector.component.tsx +26 -7
- data/app/frontend/comments/down_vote_button.component.tsx +3 -0
- data/app/frontend/comments/up_vote_button.component.tsx +3 -0
- data/app/frontend/comments/vote_button.component.tsx +4 -0
- data/app/frontend/comments/vote_button_component.test.tsx +14 -8
- data/app/models/decidim/comments/comment.rb +2 -2
- data/app/queries/decidim/comments/metrics/comments_metric_manage.rb +1 -6
- data/app/services/decidim/comments/new_comment_notification_creator.rb +28 -3
- data/app/types/decidim/comments/commentable_mutation_type.rb +2 -2
- data/config/locales/ar.yml +4 -1
- data/config/locales/bg-BG.yml +6 -0
- data/config/locales/ca.yml +18 -2
- data/config/locales/cs.yml +29 -13
- data/config/locales/da-DK.yml +1 -0
- data/config/locales/de.yml +23 -1
- data/config/locales/el.yml +121 -0
- data/config/locales/en.yml +17 -1
- data/config/locales/es-MX.yml +17 -1
- data/config/locales/es-PY.yml +17 -1
- data/config/locales/es.yml +17 -1
- data/config/locales/et-EE.yml +1 -0
- data/config/locales/eu.yml +4 -1
- data/config/locales/fi-plain.yml +17 -1
- data/config/locales/fi.yml +23 -7
- data/config/locales/fr-CA.yml +122 -0
- data/config/locales/fr.yml +23 -1
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +4 -1
- data/config/locales/hr-HR.yml +1 -0
- data/config/locales/hu.yml +11 -1
- data/config/locales/id-ID.yml +4 -1
- data/config/locales/is-IS.yml +3 -1
- data/config/locales/it.yml +20 -1
- data/config/locales/ja-JP.yml +120 -0
- data/config/locales/lt-LT.yml +1 -0
- data/config/locales/lv-LV.yml +118 -0
- data/config/locales/mt-MT.yml +1 -0
- data/config/locales/nl.yml +19 -1
- data/config/locales/no.yml +18 -2
- data/config/locales/pl.yml +57 -35
- data/config/locales/pt-BR.yml +5 -2
- data/config/locales/pt.yml +47 -25
- data/config/locales/ro-RO.yml +124 -0
- data/config/locales/ru.yml +4 -1
- data/config/locales/sk-SK.yml +116 -0
- data/config/locales/sk.yml +120 -0
- data/config/locales/sl.yml +4 -0
- data/config/locales/sr-CS.yml +20 -0
- data/config/locales/sv.yml +25 -3
- data/config/locales/tr-TR.yml +4 -1
- data/config/locales/uk.yml +4 -1
- data/db/migrate/20200320105911_index_foreign_keys_in_decidim_comments_comments.rb +7 -0
- data/lib/decidim/comments/test/shared_examples/comment_event.rb +11 -1
- data/lib/decidim/comments/test/shared_examples/create_comment_context.rb +3 -2
- data/lib/decidim/comments/version.rb +1 -1
- metadata +26 -8
@@ -43,28 +43,47 @@ class CommentOrderSelector extends React.Component<CommentOrderSelectorProps, Co
|
|
43
43
|
<ul
|
44
44
|
className="dropdown menu"
|
45
45
|
data-dropdown-menu="data-dropdown-menu"
|
46
|
+
data-autoclose="false"
|
47
|
+
data-disable-hover="true"
|
48
|
+
data-click-open="true"
|
49
|
+
data-close-on-click="true"
|
50
|
+
tabIndex={-1}
|
46
51
|
ref={this.setDropdown}
|
47
52
|
>
|
48
|
-
<li>
|
49
|
-
<a
|
50
|
-
|
53
|
+
<li className="is-dropdown-submenu-parent" tabIndex={-1}>
|
54
|
+
<a
|
55
|
+
href="#"
|
56
|
+
id="comments-order-menu-control"
|
57
|
+
aria-label={I18n.t("components.comment_order_selector.title")}
|
58
|
+
aria-controls="comments-order-menu"
|
59
|
+
aria-haspopup="true"
|
60
|
+
>
|
61
|
+
{I18n.t(`components.comment_order_selector.order.${orderBy}`)}
|
62
|
+
</a>
|
63
|
+
<ul
|
64
|
+
className="menu is-dropdown-submenu"
|
65
|
+
id="language-chooser-menu"
|
66
|
+
role="menu"
|
67
|
+
aria-labelledby="comments-order-menu-control"
|
68
|
+
tabIndex={-1}
|
69
|
+
>
|
51
70
|
<li>
|
52
|
-
<a href="" className="test" onClick={this.updateOrder("best_rated")} >
|
71
|
+
<a href="#" className="test" onClick={this.updateOrder("best_rated")} tabIndex={-1}>
|
53
72
|
{I18n.t("components.comment_order_selector.order.best_rated")}
|
54
73
|
</a>
|
55
74
|
</li>
|
56
75
|
<li>
|
57
|
-
<a href="" onClick={this.updateOrder("recent")} >
|
76
|
+
<a href="#" onClick={this.updateOrder("recent")} tabIndex={-1}>
|
58
77
|
{I18n.t("components.comment_order_selector.order.recent")}
|
59
78
|
</a>
|
60
79
|
</li>
|
61
80
|
<li>
|
62
|
-
<a href="" onClick={this.updateOrder("older")} >
|
81
|
+
<a href="#" onClick={this.updateOrder("older")} tabIndex={-1}>
|
63
82
|
{I18n.t("components.comment_order_selector.order.older")}
|
64
83
|
</a>
|
65
84
|
</li>
|
66
85
|
<li>
|
67
|
-
<a href="" onClick={this.updateOrder("most_discussed")} >
|
86
|
+
<a href="" onClick={this.updateOrder("most_discussed")} tabIndex={-1}>
|
68
87
|
{I18n.t("components.comment_order_selector.order.most_discussed")}
|
69
88
|
</a>
|
70
89
|
</li>
|
@@ -12,6 +12,8 @@ import {
|
|
12
12
|
GetCommentsQuery
|
13
13
|
} from "../support/schema";
|
14
14
|
|
15
|
+
const { I18n } = require("react-i18nify");
|
16
|
+
|
15
17
|
interface DownVoteButtonProps {
|
16
18
|
session: AddCommentFormSessionFragment & {
|
17
19
|
user: any;
|
@@ -42,6 +44,7 @@ export const DownVoteButton: React.SFC<DownVoteButtonProps> = ({
|
|
42
44
|
<VoteButton
|
43
45
|
buttonClassName="comment__votes--down"
|
44
46
|
iconName="icon-chevron-bottom"
|
47
|
+
text={I18n.t("components.down_vote_button.text")}
|
45
48
|
votes={downVotes}
|
46
49
|
voteAction={downVote}
|
47
50
|
disabled={disabled}
|
@@ -3,6 +3,8 @@ import { graphql, MutationFunc } from "react-apollo";
|
|
3
3
|
|
4
4
|
import VoteButton from "./vote_button.component";
|
5
5
|
|
6
|
+
const { I18n } = require("react-i18nify");
|
7
|
+
|
6
8
|
import {
|
7
9
|
AddCommentFormCommentableFragment,
|
8
10
|
AddCommentFormSessionFragment,
|
@@ -42,6 +44,7 @@ export const UpVoteButton: React.SFC<UpVoteButtonProps> = ({
|
|
42
44
|
<VoteButton
|
43
45
|
buttonClassName="comment__votes--up"
|
44
46
|
iconName="icon-chevron-top"
|
47
|
+
text={I18n.t("components.up_vote_button.text")}
|
45
48
|
votes={upVotes}
|
46
49
|
voteAction={upVote}
|
47
50
|
disabled={disabled}
|
@@ -4,6 +4,7 @@ import Icon from "../application/icon.component";
|
|
4
4
|
interface VoteButtonProps {
|
5
5
|
buttonClassName: string;
|
6
6
|
iconName: string;
|
7
|
+
text: string;
|
7
8
|
votes: number;
|
8
9
|
voteAction?: () => void;
|
9
10
|
disabled?: boolean;
|
@@ -18,6 +19,7 @@ const preventDefault = (event: any) => {
|
|
18
19
|
const VoteButton: React.SFC<VoteButtonProps> = ({
|
19
20
|
buttonClassName,
|
20
21
|
iconName,
|
22
|
+
text,
|
21
23
|
votes,
|
22
24
|
voteAction,
|
23
25
|
disabled,
|
@@ -28,8 +30,10 @@ const VoteButton: React.SFC<VoteButtonProps> = ({
|
|
28
30
|
className={`${buttonClassName} ${selectedClass}`}
|
29
31
|
onClick={userLoggedIn ? voteAction : preventDefault}
|
30
32
|
disabled={disabled}
|
33
|
+
title={text}
|
31
34
|
data-open={userLoggedIn ? null : "loginModal"}
|
32
35
|
>
|
36
|
+
<span className="show-for-sr">{text}</span>
|
33
37
|
<Icon name={iconName} iconExtraClassName="icon--small" />
|
34
38
|
{` ${votes}`}
|
35
39
|
</button>
|
@@ -13,44 +13,50 @@ describe("<VoteButton />", () => {
|
|
13
13
|
});
|
14
14
|
|
15
15
|
it("should render the number of votes passed as a prop", () => {
|
16
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={true} />);
|
16
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={true} />);
|
17
17
|
expect(wrapper.find("button").text()).toMatch(/10/);
|
18
18
|
});
|
19
19
|
|
20
20
|
it("should render a button with the given buttonClassName", () => {
|
21
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={true} />);
|
21
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={true} />);
|
22
22
|
expect(wrapper.find("button.vote-button").exists()).toBeTruthy();
|
23
23
|
});
|
24
24
|
|
25
25
|
it("should render a Icon component with the correct name prop", () => {
|
26
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={true} />);
|
26
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={true} />);
|
27
27
|
expect(wrapper.find(Icon).prop("name")).toEqual("vote-icon");
|
28
28
|
});
|
29
29
|
|
30
|
+
it("should render a button with the text as title attribute and screen reader visible element", () => {
|
31
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={true} />);
|
32
|
+
expect(wrapper.find("button").prop("title")).toBe("Test");
|
33
|
+
expect(wrapper.find("button span.show-for-sr").text()).toEqual("Test");
|
34
|
+
});
|
35
|
+
|
30
36
|
it("should call the voteAction prop on click", () => {
|
31
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={true} />);
|
37
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={true} />);
|
32
38
|
wrapper.find("button").simulate("click");
|
33
39
|
expect(voteAction).toHaveBeenCalled();
|
34
40
|
});
|
35
41
|
|
36
42
|
it("should disable the button based on the disabled prop", () => {
|
37
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} disabled={true} userLoggedIn={true} />);
|
43
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} disabled={true} userLoggedIn={true} />);
|
38
44
|
expect(wrapper.find("button").props()).toHaveProperty("disabled");
|
39
45
|
});
|
40
46
|
|
41
47
|
it("should render a button with the given selectedClass", () => {
|
42
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} disabled={true} selectedClass="is-vote-selected" userLoggedIn={true} />);
|
48
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} disabled={true} selectedClass="is-vote-selected" userLoggedIn={true} />);
|
43
49
|
expect(wrapper.find(".is-vote-selected").exists()).toBeTruthy();
|
44
50
|
});
|
45
51
|
|
46
52
|
describe("when userLoggedIn prop is false", () => {
|
47
53
|
it("should add data-open prop as 'loginModal' to the button", () => {
|
48
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={false} />);
|
54
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={false} />);
|
49
55
|
expect(wrapper.find("button").prop("data-open")).toBe("loginModal");
|
50
56
|
});
|
51
57
|
|
52
58
|
it("should call the event preventDefault method", () => {
|
53
|
-
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} userLoggedIn={false} />);
|
59
|
+
const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" text="Test" voteAction={voteAction} userLoggedIn={false} />);
|
54
60
|
wrapper.find("button").simulate("click", { preventDefault });
|
55
61
|
expect(preventDefault).toHaveBeenCalled();
|
56
62
|
});
|
@@ -28,14 +28,14 @@ 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
|
-
|
38
|
+
before_validation :compute_depth
|
39
39
|
|
40
40
|
delegate :organization, to: :commentable
|
41
41
|
|
@@ -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
|
-
|
23
|
+
record.save!
|
27
24
|
end
|
28
|
-
@registry.each(&:save!)
|
29
|
-
@registry
|
30
25
|
end
|
31
26
|
|
32
27
|
private
|
@@ -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
|
-
|
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
|
-
}.
|
118
|
+
}.deep_merge(users)
|
94
119
|
|
95
120
|
Decidim::EventsManager.publish(data)
|
96
121
|
end
|
@@ -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]
|
21
|
+
Decidim::Comments::CreateComment.call(form, ctx[:current_user]) do
|
22
22
|
on(:ok) do |comment|
|
23
23
|
return comment
|
24
24
|
end
|
data/config/locales/ar.yml
CHANGED
@@ -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:
|
@@ -62,7 +63,6 @@ ar:
|
|
62
63
|
does_not_belong: يحتوي على نشاط غير قانوني أو تهديدات انتحارية أو معلومات شخصية أو أي شيء آخر تعتقد أنه لا ينتمي إلى %{organization_name}.
|
63
64
|
offensive: يحتوي على العنصرية والتمييز الجنسي والتشهير والهجمات الشخصية والتهديدات بالقتل أو طلبات الانتحار أو أي شكل من أشكال خطاب الكراهية.
|
64
65
|
spam: يحتوي على clickbait أو الإعلان أو الخدع أو روبوت البرامج النصية.
|
65
|
-
title: الإبلاغ عن مشكلة
|
66
66
|
show_replies: اظهر الردود الـ %{replies_count}
|
67
67
|
single_comment_link_title: الحصول على رابط نحو تعليق واحد
|
68
68
|
comment_order_selector:
|
@@ -89,6 +89,9 @@ ar:
|
|
89
89
|
email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{author_name}. يمكنك إلغاء تتبع هذا المستخدم من صفحة ملفه الشخصي.
|
90
90
|
email_subject: هناك تعليق جديد مِن %{author_name} على %{resource_title}
|
91
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>.
|
92
95
|
comment_created:
|
93
96
|
email_intro: "%{resource_title} تم التعليق. يمكنك قراءة التعليق في هذه الصفحة:"
|
94
97
|
email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{resource_title}" أو مؤلفه. يمكنك إلغاء تتبعه من الرابط السابق.
|
data/config/locales/ca.yml
CHANGED
@@ -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:
|
@@ -54,7 +56,7 @@ ca:
|
|
54
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}.
|
55
57
|
offensive: Conté racisme, sexisme, insults, atacs personals, amenaces de mort, peticions de suïcidi o qualsevol forma de discurs d'odi.
|
56
58
|
spam: Conté "clickbait", publicitat o estafes.
|
57
|
-
title:
|
59
|
+
title: Notificar contingut inapropiat
|
58
60
|
show_replies: Mostra %{replies_count} respostes
|
59
61
|
single_comment_link_title: Aconsegueix l'enllaç al comentari
|
60
62
|
comment_order_selector:
|
@@ -71,9 +73,13 @@ ca:
|
|
71
73
|
blocked_comments_warning: Els comentaris estan desactivats en aquest moment, però pots llegir els anteriors.
|
72
74
|
comment_details_title: Detalls del comentari
|
73
75
|
loading: Carregant els comentaris ...
|
74
|
-
single_comment_warning:
|
76
|
+
single_comment_warning: Pots revisar la resta de comentaris <a href="%{url}">aquí</a>.
|
75
77
|
single_comment_warning_title: Estàs veient un sol comentari
|
76
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
|
77
83
|
events:
|
78
84
|
comments:
|
79
85
|
comment_by_followed_user:
|
@@ -81,6 +87,11 @@ ca:
|
|
81
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.
|
82
88
|
email_subject: Hi ha un nou comentari de %{author_name} en %{resource_title}
|
83
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>.
|
84
95
|
comment_created:
|
85
96
|
email_intro: "S'ha comentat %{resource_title}. Pots llegir el comentari d'aquesta pàgina:"
|
86
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.
|
@@ -91,6 +102,11 @@ ca:
|
|
91
102
|
email_outro: Has rebut aquesta notificació perquè s'ha respost el teu comentari.
|
92
103
|
email_subject: "%{author_name} ha respost el teu comentari a %{resource_title}"
|
93
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>
|
94
110
|
user_mentioned:
|
95
111
|
email_intro: Has estat esmentada
|
96
112
|
email_outro: Has rebut aquesta notificació perquè has estat esmentada a %{resource_title}.
|
data/config/locales/cs.yml
CHANGED
@@ -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/
|
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,52 +14,53 @@ cs:
|
|
13
14
|
many: Komentáře
|
14
15
|
other: Komentáře
|
15
16
|
decidim/comments/comment_vote:
|
16
|
-
one:
|
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í
|
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
|
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:
|
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}
|
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ý
|
50
|
+
deleted_user: Vymazaný účastník
|
49
51
|
hide_replies: Skrýt odpovědi
|
50
52
|
reply: Odpověď
|
51
53
|
report:
|
52
54
|
action: Zpráva
|
53
|
-
already_reported: Tento obsah je již nahlášen a bude
|
55
|
+
already_reported: Tento obsah je již nahlášen a bude přezkoumán administrátorem.
|
54
56
|
close: Zavřít
|
55
57
|
description: Je tento obsah nevhodný?
|
56
58
|
details: Další komentáře
|
57
59
|
reasons:
|
58
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}.
|
59
61
|
offensive: Obsahuje rasismus, sexismus, podvody, osobní útoky, hrozby smrti, žádosti o sebevraždu nebo jakoukoli formu projevy nenávisti.
|
60
|
-
spam: Obsahuje clickbait,
|
61
|
-
title: Nahlásit
|
62
|
+
spam: Obsahuje clickbait, reklamu, podvody nebo škodlivé skripty.
|
63
|
+
title: Nahlásit nevhodný obsah
|
62
64
|
show_replies: Zobrazit %{replies_count} odpovědí
|
63
65
|
single_comment_link_title: Získat odkaz na jeden komentář
|
64
66
|
comment_order_selector:
|
@@ -66,18 +68,22 @@ cs:
|
|
66
68
|
best_rated: Nejlépe hodnocené
|
67
69
|
most_discussed: Nejdiskutovanější
|
68
70
|
older: Starší
|
69
|
-
recent:
|
71
|
+
recent: Nedávné
|
70
72
|
title: 'Seřadit podle:'
|
71
73
|
comment_thread:
|
72
74
|
title: Konverzace s číslem %{authorName}
|
73
75
|
comments:
|
74
|
-
blocked_comments_for_user_warning:
|
75
|
-
blocked_comments_warning: Komentáře jsou
|
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í.
|
76
78
|
comment_details_title: Podrobnosti komentáře
|
77
79
|
loading: Načítání komentářů ...
|
78
80
|
single_comment_warning: Můžete zkontrolovat zbytek komentářů <a href="%{url}">zde</a>.
|
79
81
|
single_comment_warning_title: Vidíte jeden komentář
|
80
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
|
81
87
|
events:
|
82
88
|
comments:
|
83
89
|
comment_by_followed_user:
|
@@ -85,6 +91,11 @@ cs:
|
|
85
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.
|
86
92
|
email_subject: K dispozici je nový komentář %{author_name} v %{resource_title}
|
87
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>.
|
88
99
|
comment_created:
|
89
100
|
email_intro: "%{resource_title} bylo komentováno. Můžete si přečíst komentář na této stránce:"
|
90
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.
|
@@ -95,6 +106,11 @@ cs:
|
|
95
106
|
email_outro: Toto oznámení jste obdrželi, protože váš komentář byl zodpovězen.
|
96
107
|
email_subject: "%{author_name} odpověděl váš komentář v %{resource_title}"
|
97
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>
|
98
114
|
user_mentioned:
|
99
115
|
email_intro: Byl jste zmíněn
|
100
116
|
email_outro: Toto oznámení jste obdrželi, protože jste byli uvedeni v %{resource_title}.
|