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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/comments/bundle.js +32 -32
  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 +1 -1
  12. data/app/frontend/comments/add_comment_form.component.tsx +2 -2
  13. data/app/frontend/comments/comment.component.test.tsx +1 -1
  14. data/app/frontend/comments/comment.component.tsx +194 -73
  15. data/app/frontend/comments/comment_order_selector.component.tsx +26 -7
  16. data/app/frontend/comments/down_vote_button.component.tsx +3 -0
  17. data/app/frontend/comments/up_vote_button.component.tsx +3 -0
  18. data/app/frontend/comments/vote_button.component.tsx +4 -0
  19. data/app/frontend/comments/vote_button_component.test.tsx +14 -8
  20. data/app/models/decidim/comments/comment.rb +2 -2
  21. data/app/queries/decidim/comments/metrics/comments_metric_manage.rb +1 -6
  22. data/app/services/decidim/comments/new_comment_notification_creator.rb +28 -3
  23. data/app/types/decidim/comments/commentable_mutation_type.rb +2 -2
  24. data/config/locales/ar.yml +4 -1
  25. data/config/locales/bg-BG.yml +6 -0
  26. data/config/locales/ca.yml +18 -2
  27. data/config/locales/cs.yml +29 -13
  28. data/config/locales/da-DK.yml +1 -0
  29. data/config/locales/de.yml +23 -1
  30. data/config/locales/el.yml +121 -0
  31. data/config/locales/en.yml +17 -1
  32. data/config/locales/es-MX.yml +17 -1
  33. data/config/locales/es-PY.yml +17 -1
  34. data/config/locales/es.yml +17 -1
  35. data/config/locales/et-EE.yml +1 -0
  36. data/config/locales/eu.yml +4 -1
  37. data/config/locales/fi-plain.yml +17 -1
  38. data/config/locales/fi.yml +23 -7
  39. data/config/locales/fr-CA.yml +122 -0
  40. data/config/locales/fr.yml +23 -1
  41. data/config/locales/ga-IE.yml +1 -0
  42. data/config/locales/gl.yml +4 -1
  43. data/config/locales/hr-HR.yml +1 -0
  44. data/config/locales/hu.yml +11 -1
  45. data/config/locales/id-ID.yml +4 -1
  46. data/config/locales/is-IS.yml +3 -1
  47. data/config/locales/it.yml +20 -1
  48. data/config/locales/ja-JP.yml +120 -0
  49. data/config/locales/lt-LT.yml +1 -0
  50. data/config/locales/lv-LV.yml +118 -0
  51. data/config/locales/mt-MT.yml +1 -0
  52. data/config/locales/nl.yml +19 -1
  53. data/config/locales/no.yml +18 -2
  54. data/config/locales/pl.yml +57 -35
  55. data/config/locales/pt-BR.yml +5 -2
  56. data/config/locales/pt.yml +47 -25
  57. data/config/locales/ro-RO.yml +124 -0
  58. data/config/locales/ru.yml +4 -1
  59. data/config/locales/sk-SK.yml +116 -0
  60. data/config/locales/sk.yml +120 -0
  61. data/config/locales/sl.yml +4 -0
  62. data/config/locales/sr-CS.yml +20 -0
  63. data/config/locales/sv.yml +25 -3
  64. data/config/locales/tr-TR.yml +4 -1
  65. data/config/locales/uk.yml +4 -1
  66. data/db/migrate/20200320105911_index_foreign_keys_in_decidim_comments_comments.rb +7 -0
  67. data/lib/decidim/comments/test/shared_examples/comment_event.rb +11 -1
  68. data/lib/decidim/comments/test/shared_examples/create_comment_context.rb +3 -2
  69. data/lib/decidim/comments/version.rb +1 -1
  70. 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>{I18n.t(`components.comment_order_selector.order.${orderBy}`)}</a>
50
- <ul className="menu">
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
- before_save :compute_depth
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
- @registry << record
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
- 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
@@ -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:
@@ -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}" أو مؤلفه. يمكنك إلغاء تتبعه من الرابط السابق.
@@ -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:
@@ -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: Denúncia un problema
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: 'Pots revisar la resta de comentaris a: <a href="%{url}">here</a>.'
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}.
@@ -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,52 +14,53 @@ 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
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 kontrolován administrátorem.
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, reklama, podvody nebo skripty.
61
- title: Nahlásit problém
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: Nedávno
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: V tuto chvíli nemůžete komentovat, ale můžete si přečíst předchozí.
75
- 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í.
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}.