decidim-blogs 0.19.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/decidim/blogs/icon.svg +1 -3
  3. data/app/cells/decidim/blogs/post_m/footer.erb +1 -1
  4. data/app/cells/decidim/blogs/post_m_cell.rb +6 -0
  5. data/app/helpers/decidim/blogs/application_helper.rb +2 -0
  6. data/app/models/decidim/blogs/post.rb +14 -0
  7. data/app/types/decidim/blogs/blogs_type.rb +30 -0
  8. data/app/types/decidim/blogs/post_input_filter.rb +29 -0
  9. data/app/types/decidim/blogs/post_input_sort.rb +15 -0
  10. data/app/types/decidim/blogs/post_type.rb +24 -0
  11. data/app/views/decidim/blogs/posts/_posts.html.erb +4 -4
  12. data/app/views/decidim/blogs/posts/_sidebar_blog.html.erb +1 -1
  13. data/app/views/decidim/blogs/posts/show.html.erb +34 -9
  14. data/config/locales/bg-BG.yml +13 -0
  15. data/config/locales/ca.yml +4 -0
  16. data/config/locales/cs.yml +16 -12
  17. data/config/locales/da-DK.yml +1 -0
  18. data/config/locales/de.yml +4 -0
  19. data/config/locales/el-GR.yml +1 -0
  20. data/config/locales/el.yml +83 -0
  21. data/config/locales/en.yml +4 -0
  22. data/config/locales/es-MX.yml +4 -0
  23. data/config/locales/es-PY.yml +4 -0
  24. data/config/locales/es.yml +4 -0
  25. data/config/locales/et-EE.yml +1 -0
  26. data/config/locales/fi-plain.yml +4 -0
  27. data/config/locales/fi.yml +8 -4
  28. data/config/locales/fr-CA.yml +83 -0
  29. data/config/locales/fr.yml +4 -0
  30. data/config/locales/ga-IE.yml +1 -0
  31. data/config/locales/hr-HR.yml +1 -0
  32. data/config/locales/hu.yml +4 -0
  33. data/config/locales/is-IS.yml +56 -0
  34. data/config/locales/it.yml +4 -0
  35. data/config/locales/ja-JP.yml +82 -0
  36. data/config/locales/lt-LT.yml +1 -0
  37. data/config/locales/lv-LV.yml +84 -0
  38. data/config/locales/mt-MT.yml +1 -0
  39. data/config/locales/nl.yml +4 -0
  40. data/config/locales/no.yml +78 -0
  41. data/config/locales/pl.yml +32 -28
  42. data/config/locales/pt-BR.yml +1 -1
  43. data/config/locales/pt.yml +28 -24
  44. data/config/locales/ro-RO.yml +84 -0
  45. data/config/locales/ru.yml +2 -0
  46. data/config/locales/sk-SK.yml +85 -0
  47. data/config/locales/sk.yml +85 -0
  48. data/config/locales/sl.yml +5 -0
  49. data/config/locales/sr-CS.yml +13 -0
  50. data/config/locales/sv.yml +4 -0
  51. data/db/migrate/20191212162606_add_user_group_author_to_blogs.rb +7 -0
  52. data/db/migrate/20200128094730_add_endorsements_counter_cache_to_blogs.rb +7 -0
  53. data/db/migrate/20200320105910_index_foreign_keys_in_decidim_blogs_posts.rb +7 -0
  54. data/lib/decidim/blogs/component.rb +8 -0
  55. data/lib/decidim/blogs/test/factories.rb +8 -0
  56. data/lib/decidim/blogs/version.rb +1 -1
  57. metadata +50 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6872f74a75dfeb8c6b6a709741835eed29bcc5055c9202cbf93badab8affd478
4
- data.tar.gz: 8d0b7bba23c4f7ede841d99de633ff072b2641e8a5783d1d37a0f915a2e308b7
3
+ metadata.gz: 8cb8f64bfea127fa2fde23cbf25c4729458115557822aaede26bc61a823b1d65
4
+ data.tar.gz: '0878193e5097a3bd752acf469c757d524b8cb36406188c95a9fcac65847d03d7'
5
5
  SHA512:
6
- metadata.gz: d0f41d58ecc7775c3673c227ad3d6897d40af48afc78ea33b3309c7490fab706ae00f9a8e72f94c5558285b5a0da5f89a0bd0797229be474583d539c36af46e9
7
- data.tar.gz: 7e932103dd291c1930df7e6df4c82e309e794f0584c6afcec345c81670af59a4362af9321b76088f5a96d93e19a333176498119ff275b7e516f8588805d3015b
6
+ metadata.gz: ba1c230788c9de43e8a24fd3c0c43c2eba1184ea759cdb6753174f96400e21056228203f97814b5dcf78649151d0477b478fc4eeae333ca961257273db78aba7
7
+ data.tar.gz: 500d550159483b842488c88d1766496c653ce2e04caaab0263af3856ec70c68a71e5d9ce4c3c6bc7b5dd485ea1b09f8f27bda512907c2c7065cead0f8c7e6cfb
@@ -1,3 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36">
2
- <path d="M18 0C8.07 0 0 8.07 0 18s8.07 18 18 18 18-8.071 18-18S27.93 0 18 0zm0 2c8.85 0 16 7.152 16 16 0 8.848-7.15 16-16 16-8.848 0-16-7.152-16-16C2 9.152 9.152 2 18 2zm-7 9a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11z"/>
3
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path d="M18 0C8.07 0 0 8.07 0 18s8.07 18 18 18 18-8.071 18-18S27.93 0 18 0zm0 2c8.85 0 16 7.152 16 16 0 8.848-7.15 16-16 16-8.848 0-16-7.152-16-16C2 9.152 9.152 2 18 2zm-7 9a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11z"/></svg>
@@ -1,5 +1,5 @@
1
1
  <div class="card__footer card__footer--spaces">
2
2
  <div class="card__support">
3
- <%= link_to t("decidim.blogs.posts.show.view"), resource_path, class: "card__button button--sc light button small secondary" %>
3
+ <%= link_to t("decidim.blogs.posts.show.view"), resource_path, class: "card__button button--sc light button small" %>
4
4
  </div>
5
5
  </div>
@@ -10,6 +10,12 @@ module Decidim
10
10
  def has_actions?
11
11
  false
12
12
  end
13
+
14
+ def endorsements_count
15
+ with_tooltip t("decidim.endorsable.endorsements") do
16
+ icon("bullhorn", class: "icon--small") + " " + model.endorsements_count.to_s
17
+ end
18
+ end
13
19
  end
14
20
  end
15
21
  end
@@ -8,6 +8,8 @@ module Decidim
8
8
  include PaginateHelper
9
9
  include SanitizeHelper
10
10
  include Decidim::Blogs::PostsHelper
11
+ include ::Decidim::EndorsableHelper
12
+ include ::Decidim::FollowableHelper
11
13
  include Decidim::Comments::CommentsHelper
12
14
  end
13
15
  end
@@ -11,6 +11,9 @@ module Decidim
11
11
  include Decidim::HasComponent
12
12
  include Decidim::Authorable
13
13
  include Decidim::Comments::Commentable
14
+ include Decidim::Searchable
15
+ include Decidim::Endorsable
16
+ include Decidim::Followable
14
17
  include Traceable
15
18
  include Loggable
16
19
 
@@ -20,6 +23,13 @@ module Decidim
20
23
 
21
24
  scope :created_at_desc, -> { order(arel_table[:created_at].desc) }
22
25
 
26
+ searchable_fields(
27
+ participatory_space: { component: :participatory_space },
28
+ A: :title,
29
+ D: :body,
30
+ datetime: :created_at
31
+ )
32
+
23
33
  # Public: Overrides the `commentable?` Commentable concern method.
24
34
  def commentable?
25
35
  component.settings.comments_enabled?
@@ -48,6 +58,10 @@ module Decidim
48
58
  def user_allowed_to_comment?(user)
49
59
  can_participate_in_space?(user)
50
60
  end
61
+
62
+ def users_to_notify_on_comment_created
63
+ followers
64
+ end
51
65
  end
52
66
  end
53
67
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ BlogsType = GraphQL::ObjectType.define do
6
+ interfaces [-> { Decidim::Core::ComponentInterface }]
7
+
8
+ name "Blogs"
9
+ description "A blogs component of a participatory space."
10
+
11
+ connection :posts,
12
+ type: PostType.connection_type,
13
+ description: "List all posts",
14
+ function: PostListHelper.new(model_class: Post)
15
+ field :post,
16
+ type: PostType,
17
+ description: "Finds one post",
18
+ function: PostFinderHelper.new(model_class: Post)
19
+ end
20
+
21
+ class PostListHelper < Decidim::Core::ComponentListBase
22
+ argument :order, PostInputSort, "Provides several methods to order the results"
23
+ argument :filter, PostInputFilter, "Provides several methods to filter the results"
24
+ end
25
+
26
+ class PostFinderHelper < Decidim::Core::ComponentFinderBase
27
+ argument :id, !types.ID, "The ID of the post"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ class PostInputFilter < Decidim::Core::BaseInputFilter
6
+ include Decidim::Core::HasTimestampInputFilter
7
+
8
+ graphql_name "PostFilter"
9
+ description "A type used for filtering posts inside a participatory space.
10
+
11
+ A typical query would look like:
12
+
13
+ ```
14
+ {
15
+ participatoryProcesses {
16
+ components {
17
+ ...on Blogs {
18
+ posts(filter:{ createdBefore: \"2020-01-01\" }) {
19
+ id
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
25
+ ```
26
+ "
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ class PostInputSort < Decidim::Core::BaseInputSort
6
+ include Decidim::Core::HasTimestampInputSort
7
+ include Decidim::Core::HasEndorsableInputSort
8
+
9
+ graphql_name "PostSort"
10
+ description "A type used for sorting blog posts"
11
+
12
+ argument :id, String, "Sort by ID, valid values are ASC or DESC", required: false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ # This type represents a Post.
6
+ PostType = GraphQL::ObjectType.define do
7
+ interfaces [
8
+ -> { Decidim::Comments::CommentableInterface },
9
+ -> { Decidim::Core::AttachableInterface },
10
+ -> { Decidim::Core::AuthorableInterface },
11
+ -> { Decidim::Core::TraceableInterface },
12
+ -> { Decidim::Core::EndorsableInterface },
13
+ -> { Decidim::Core::TimestampsInterface }
14
+ ]
15
+
16
+ name "Post"
17
+ description "A post"
18
+
19
+ field :id, !types.ID, "The internal ID of this post"
20
+ field :title, Decidim::Core::TranslatedFieldType, "The title for this post"
21
+ field :body, Decidim::Core::TranslatedFieldType, "The body of this post"
22
+ end
23
+ end
24
+ end
@@ -1,12 +1,12 @@
1
1
  <div class="row small-12">
2
2
  <% paginate_posts.each do |post| %>
3
- <article class="card card--post">
3
+ <div class="card card--post">
4
4
  <div class="card__content">
5
5
  <div class="card__header">
6
6
  <%= link_to post, class: "card__link" do %>
7
- <h5 class="card__title">
7
+ <h3 class="card__title">
8
8
  <%= translated_attribute post.title %>
9
- </h5>
9
+ </h3>
10
10
  <% end %>
11
11
  <div class="card__author">
12
12
  <%= cell "decidim/author", present(post.author), from: post %>
@@ -14,7 +14,7 @@
14
14
  </div>
15
15
  <%= decidim_sanitize post_description(post) %>
16
16
  </div>
17
- </article>
17
+ </div>
18
18
  <% end %>
19
19
  </div>
20
20
  <%= decidim_paginate paginate_posts %>
@@ -9,7 +9,7 @@
9
9
  <div class="author-data author-data--nopadding">
10
10
  <%= render partial: "datetime", locals: { post: post } %>&nbsp;&nbsp;·&nbsp;&nbsp;
11
11
  <%= link_to "#{post_path(post)}#comments", title: t(".comments") do %>
12
- <%= icon "comment-square", class: "icon--small", aria_label: "#{t(".comments")}", role: "img" %>
12
+ <%= icon "comment-square", class: "icon--small", aria_label: t(".comments"), role: "img" %>
13
13
  <%= post.comments.count %>
14
14
  <%= t(".comments") %>
15
15
  <% end %>
@@ -14,18 +14,43 @@
14
14
  blogpost: post
15
15
  )
16
16
  %>
17
+
18
+ <div class="row column view-header">
19
+ <%= link_to :posts, class: "small hollow" do %>
20
+ <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %>
21
+ <%= t(".back") %>
22
+ <% end %>
23
+ <h2 class="heading2"><%= translated_attribute post.title %></h2>
24
+ <%= cell "decidim/author", present(post.author), from: post %>
25
+ </div>
17
26
  <div class="row">
18
- <div class="columns medium-7 mediumlarge-8">
19
- <div class="row column view-header">
20
- <h2 class="heading2"><%= translated_attribute post.title %></h2>
21
- <%= cell "decidim/author", present(post.author), from: post %>
22
- </div>
27
+ <% if show_endorsements_card? %>
28
+ <div class="columns section view-side mediumlarge-4 mediumlarge-push-8 large-3 large-push-9">
29
+ <div class="card">
30
+ <div class="card__content">
31
+ <div class="row collapse buttons__row">
32
+ <% if endorsements_enabled? %>
33
+ <div class="column small-9 collapse">
34
+ <%= endorsement_buttons_cell(post) %>
35
+ </div>
36
+ <% end %>
37
+ <div class="column collapse <%= endorsements_enabled? ? "small-3" : "" %>">
38
+ <%= link_to "#comments", class: "button small compact hollow button--nomargin expanded" do %>
39
+ <%= icon "comment-square", class: "icon--small", aria_label: t(".comments"), role: "img" %> <%= post.comments.count %>
40
+ <% end %>
41
+ </div>
42
+ </div>
43
+ <br>
44
+ <%= follow_button_for(post) %>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ <% end %>
49
+ <div class="columns mediumlarge-8 mediumlarge-pull-4">
23
50
  <div class="section">
24
- <p><%= decidim_sanitize translated_attribute post.body %></p>
51
+ <%= decidim_sanitize translated_attribute post.body %>
25
52
  </div>
26
- </div>
27
- <div id="most-commented" class="columns medium-5 mediumlarge-4 large-4">
28
- <%= render partial: "sidebar_blog", locals: { posts: posts_most_commented } %>
53
+ <%= cell "decidim/endorsers_list", post %>
29
54
  </div>
30
55
  </div>
31
56
  <%= attachments_for post %>
@@ -0,0 +1,13 @@
1
+ bg:
2
+ activemodel:
3
+ models:
4
+ decidim/blogs/create_post_event: Нова блог публикация
5
+ activerecord:
6
+ models:
7
+ decidim/blogs/post:
8
+ one: Публикация
9
+ other: Публикации
10
+ decidim:
11
+ blogs:
12
+ actions:
13
+ confirm_destroy: Сигурни ли сте, че желаете да изтриете тази публикация?
@@ -48,6 +48,8 @@ ca:
48
48
  title: títol
49
49
  posts:
50
50
  show:
51
+ back: Tornar al llistat
52
+ comments: Comentaris
51
53
  view: Veure
52
54
  sidebar_blog:
53
55
  comments: comentaris
@@ -63,6 +65,8 @@ ca:
63
65
  step:
64
66
  announcement: Avís
65
67
  comments_blocked: Comentaris bloquejats
68
+ endorsements_blocked: Adhesions bloquejades
69
+ endorsements_enabled: Adhesions habilitades
66
70
  events:
67
71
  blogs:
68
72
  post_created:
@@ -13,7 +13,7 @@ cs:
13
13
  blogs:
14
14
  actions:
15
15
  confirm_destroy: Opravdu chcete tento příspěvek smazat?
16
- destroy: Odstranit
16
+ destroy: Smazat
17
17
  edit: Upravit
18
18
  new: Nový příspěvek
19
19
  title: Akce
@@ -22,23 +22,23 @@ cs:
22
22
  components:
23
23
  body: Tělo
24
24
  post:
25
- name: Pošta
25
+ name: Příspěvek
26
26
  posts:
27
27
  create:
28
28
  invalid: Při vytváření tohoto příspěvku došlo k potížím
29
- success: Pošta byla úspěšně vytvořena
29
+ success: Příspěvek byl úspěšně vytvořen
30
30
  destroy:
31
- success: Pošta byla úspěšně smazána
31
+ success: Příspěvek byl úspěšně odstraněn
32
32
  edit:
33
- save: Aktualizace
33
+ save: Aktualizovat
34
34
  index:
35
35
  title: Příspěvky
36
36
  new:
37
37
  create: Vytvořit
38
- title: Vytvořte příspěvek
38
+ title: Vytvořit příspěvek
39
39
  update:
40
40
  invalid: Při ukládání příspěvku došlo k chybám.
41
- success: Úspěšně uložen příspěvek
41
+ success: Příspěvek byl úspěšně uložen
42
42
  last_activity:
43
43
  new_post_at_html: "<span>Nový příspěvek v %{link}</span>"
44
44
  models:
@@ -46,11 +46,13 @@ cs:
46
46
  fields:
47
47
  author: Autor
48
48
  body: Tělo
49
- created_at: Vytvořeno u
50
- title: titul
49
+ created_at: Vytvořeno v
50
+ title: titulek
51
51
  posts:
52
52
  show:
53
- view: Pohled
53
+ back: Zpět na seznam
54
+ comments: Komentáře
55
+ view: Zobrazit
54
56
  sidebar_blog:
55
57
  comments: komentáře
56
58
  most_commented_posts: Nejvíce komentované příspěvky
@@ -65,11 +67,13 @@ cs:
65
67
  step:
66
68
  announcement: Oznámení
67
69
  comments_blocked: Komentáře byly blokovány
70
+ endorsements_blocked: Schvalování blokováno
71
+ endorsements_enabled: Schvalování povoleno
68
72
  events:
69
73
  blogs:
70
74
  post_created:
71
- email_intro: Písmeno "%{resource_title}" bylo zveřejněno v "%{participatory_space_title}", které sledujete.
72
- email_outro: Toto oznámení jste obdrželi, protože jste sledovali "%{participatory_space_title}". Můžete jej odhlásit od předchozího odkazu.
75
+ email_intro: Příspěvek "%{resource_title}" byl zveřejněn v "%{participatory_space_title}", který sledujete.
76
+ email_outro: Obdrželi jste toto oznámení, protože sledujete "%{participatory_space_title}". Můžete ho zrušit z předchozího odkazu.
73
77
  email_subject: Nový příspěvek publikován v %{participatory_space_title}
74
78
  notification_title: Příspěvek <a href="%{resource_path}">%{resource_title}</a> byl zveřejněn ve %{participatory_space_title}
75
79
  pages:
@@ -0,0 +1 @@
1
+ da:
@@ -48,6 +48,8 @@ de:
48
48
  title: Titel
49
49
  posts:
50
50
  show:
51
+ back: Zurück zur Liste
52
+ comments: Kommentare
51
53
  view: Aussicht
52
54
  sidebar_blog:
53
55
  comments: Bemerkungen
@@ -63,6 +65,8 @@ de:
63
65
  step:
64
66
  announcement: Ankündigung
65
67
  comments_blocked: Kommentare blockiert
68
+ endorsements_blocked: Unterstützung deaktiviert
69
+ endorsements_enabled: Unterstützung aktiviert
66
70
  events:
67
71
  blogs:
68
72
  post_created:
@@ -0,0 +1 @@
1
+ el:
@@ -0,0 +1,83 @@
1
+ el:
2
+ activemodel:
3
+ models:
4
+ decidim/blogs/create_post_event: Νέα δημοσίευση ιστολογίου
5
+ activerecord:
6
+ models:
7
+ decidim/blogs/post:
8
+ one: Δημοσίευση
9
+ other: Δημοσιεύσεις
10
+ decidim:
11
+ blogs:
12
+ actions:
13
+ confirm_destroy: Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη δημοσίευση;
14
+ destroy: Διαγραφή
15
+ edit: Επεξεργασία
16
+ new: Νέα δημοσίευση
17
+ title: Ενέργειες
18
+ admin:
19
+ models:
20
+ components:
21
+ body: Σώμα
22
+ post:
23
+ name: Δημοσίευση
24
+ posts:
25
+ create:
26
+ invalid: Υπήρξε ένα πρόβλημα κατά τη δημιουργία αυτής της δημοσίευσης
27
+ success: Η δημοσίευση δημιουργήθηκε με επιτυχία
28
+ destroy:
29
+ success: Η δημοσίευση διαγράφηκε με επιτυχία
30
+ edit:
31
+ save: Ενημέρωση
32
+ index:
33
+ title: Δημοσιεύσεις
34
+ new:
35
+ create: Δημιουργία
36
+ title: Δημιουργία δημοσίευσης
37
+ update:
38
+ invalid: Υπήρξε ένα πρόβλημα κατά την αποθήκευση της δημοσίευσης.
39
+ success: Η δημοσίευση αποθηκεύτηκε με επιτυχία
40
+ last_activity:
41
+ new_post_at_html: "<span>Νέα δημοσίευση στις %{link}</span>"
42
+ models:
43
+ post:
44
+ fields:
45
+ author: Συντάκτης
46
+ body: Σώμα
47
+ created_at: Δημιουργήθηκε στις
48
+ title: τίτλος
49
+ posts:
50
+ show:
51
+ back: Επιστροφή στη λίστα
52
+ comments: Σχόλια
53
+ view: Προβολή
54
+ sidebar_blog:
55
+ comments: σχόλια
56
+ most_commented_posts: Δημοσιεύσεις με τα περισσότερα σχόλια
57
+ read_more: Διαβάστε περισσότερα
58
+ components:
59
+ blogs:
60
+ name: Ιστολόγιο
61
+ settings:
62
+ global:
63
+ announcement: Ανακοίνωση
64
+ comments_enabled: Τα σχόλια ενεργοποιήθηκαν
65
+ step:
66
+ announcement: Ανακοίνωση
67
+ comments_blocked: Τα σχόλια αποκλείστηκαν
68
+ endorsements_blocked: Επιδοκιμασίες αποκλεισμένες
69
+ endorsements_enabled: Επιδοκιμασίες ενεργοποιημένες
70
+ events:
71
+ blogs:
72
+ post_created:
73
+ email_intro: Η δημοσίευση «%{resource_title}» έχει δημοσιευτεί στον χώρο συμμετοχής «%{participatory_space_title}» που ακολουθείτε.
74
+ email_outro: Λάβατε αυτήν την ειδοποίηση επειδή ακολουθείτε τον χώρο συμμετοχής «%{participatory_space_title}». Μπορείτε να σταματήσετε να τον ακολουθείτε από τον προηγούμενο σύνδεσμο.
75
+ email_subject: Νέα δημοσίευση δημοσιεύτηκε στον χώρο συμμετοχής %{participatory_space_title}
76
+ notification_title: Η δημοσίευση <a href="%{resource_path}">%{resource_title}</a> δημοσιεύτηκε στον χώρο συμμετοχής %{participatory_space_title}
77
+ pages:
78
+ home:
79
+ statistics:
80
+ posts_count: Δημοσιεύσεις
81
+ participatory_processes:
82
+ statistics:
83
+ posts_count: Δημοσιεύσεις