decidim-blogs 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 (53) 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 +6 -0
  7. data/app/types/decidim/blogs/blogs_type.rb +14 -16
  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 +4 -3
  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.yml +82 -0
  20. data/config/locales/en.yml +4 -0
  21. data/config/locales/es-MX.yml +4 -0
  22. data/config/locales/es-PY.yml +4 -0
  23. data/config/locales/es.yml +4 -0
  24. data/config/locales/et-EE.yml +1 -0
  25. data/config/locales/fi-plain.yml +4 -0
  26. data/config/locales/fi.yml +8 -4
  27. data/config/locales/fr-CA.yml +83 -0
  28. data/config/locales/fr.yml +4 -0
  29. data/config/locales/ga-IE.yml +1 -0
  30. data/config/locales/hr-HR.yml +1 -0
  31. data/config/locales/hu.yml +4 -0
  32. data/config/locales/it.yml +4 -0
  33. data/config/locales/ja-JP.yml +82 -0
  34. data/config/locales/lt-LT.yml +1 -0
  35. data/config/locales/lv-LV.yml +84 -0
  36. data/config/locales/mt-MT.yml +1 -0
  37. data/config/locales/nl.yml +4 -0
  38. data/config/locales/no.yml +4 -0
  39. data/config/locales/pl.yml +32 -28
  40. data/config/locales/pt-BR.yml +1 -1
  41. data/config/locales/pt.yml +28 -24
  42. data/config/locales/ro-RO.yml +84 -0
  43. data/config/locales/sk-SK.yml +85 -0
  44. data/config/locales/sk.yml +85 -0
  45. data/config/locales/sl.yml +5 -0
  46. data/config/locales/sr-CS.yml +13 -0
  47. data/config/locales/sv.yml +4 -0
  48. data/db/migrate/20200128094730_add_endorsements_counter_cache_to_blogs.rb +7 -0
  49. data/db/migrate/20200320105910_index_foreign_keys_in_decidim_blogs_posts.rb +7 -0
  50. data/lib/decidim/blogs/component.rb +5 -0
  51. data/lib/decidim/blogs/test/factories.rb +8 -0
  52. data/lib/decidim/blogs/version.rb +1 -1
  53. metadata +43 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ffb146f8393d89cf23c01f44b51d8e5caec159b6ba0147179a105b1a81f1a3c
4
- data.tar.gz: c2ca7c30f1c2af6405abd47df267138634f87f4537405b6a07e4a49b6e6cb7e1
3
+ metadata.gz: 8cb8f64bfea127fa2fde23cbf25c4729458115557822aaede26bc61a823b1d65
4
+ data.tar.gz: '0878193e5097a3bd752acf469c757d524b8cb36406188c95a9fcac65847d03d7'
5
5
  SHA512:
6
- metadata.gz: fd6f92894919716ded583a58d7e177c4e64edc2a0c2692e6d3712b300e4286ebef99af5ea74db64b3d8c35505829aa126d3849bd581126a8e2a1b94893edeacc
7
- data.tar.gz: abd58ef1553ed0f47e541fd8301d963687f868da57ea029cf1b691e78ccc5dc96ca0a0acd2c67f1b15391b58f9878009780f5d0377a195394e8f3718958cf1fb
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
@@ -12,6 +12,8 @@ module Decidim
12
12
  include Decidim::Authorable
13
13
  include Decidim::Comments::Commentable
14
14
  include Decidim::Searchable
15
+ include Decidim::Endorsable
16
+ include Decidim::Followable
15
17
  include Traceable
16
18
  include Loggable
17
19
 
@@ -56,6 +58,10 @@ module Decidim
56
58
  def user_allowed_to_comment?(user)
57
59
  can_participate_in_space?(user)
58
60
  end
61
+
62
+ def users_to_notify_on_comment_created
63
+ followers
64
+ end
59
65
  end
60
66
  end
61
67
  end
@@ -8,25 +8,23 @@ module Decidim
8
8
  name "Blogs"
9
9
  description "A blogs component of a participatory space."
10
10
 
11
- connection :posts, PostType.connection_type do
12
- resolve ->(component, _args, _ctx) {
13
- PostsTypeHelper.base_scope(component).includes(:component)
14
- }
15
- end
16
-
17
- field(:post, PostType) do
18
- argument :id, !types.ID
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
19
20
 
20
- resolve ->(component, args, _ctx) {
21
- PostsTypeHelper.base_scope(component).find_by(id: args[:id])
22
- }
23
- end
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
24
  end
25
25
 
26
- module PostsTypeHelper
27
- def self.base_scope(component)
28
- Post.where(component: component)
29
- end
26
+ class PostFinderHelper < Decidim::Core::ComponentFinderBase
27
+ argument :id, !types.ID, "The ID of the post"
30
28
  end
31
29
  end
32
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
@@ -7,7 +7,10 @@ module Decidim
7
7
  interfaces [
8
8
  -> { Decidim::Comments::CommentableInterface },
9
9
  -> { Decidim::Core::AttachableInterface },
10
- -> { Decidim::Core::AuthorableInterface }
10
+ -> { Decidim::Core::AuthorableInterface },
11
+ -> { Decidim::Core::TraceableInterface },
12
+ -> { Decidim::Core::EndorsableInterface },
13
+ -> { Decidim::Core::TimestampsInterface }
11
14
  ]
12
15
 
13
16
  name "Post"
@@ -16,8 +19,6 @@ module Decidim
16
19
  field :id, !types.ID, "The internal ID of this post"
17
20
  field :title, Decidim::Core::TranslatedFieldType, "The title for this post"
18
21
  field :body, Decidim::Core::TranslatedFieldType, "The body of this post"
19
- field :createdAt, Decidim::Core::DateTimeType, "The time this post was created", property: :created_at
20
- field :updatedAt, Decidim::Core::DateTimeType, "The time this post was updated", property: :updated_at
21
22
  end
22
23
  end
23
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:
@@ -1 +1,83 @@
1
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: Δημοσιεύσεις