refinerycms-blog 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/app/controllers/admin/blog/posts_controller.rb +7 -0
  2. data/app/controllers/blog/categories_controller.rb +4 -0
  3. data/app/models/blog_category.rb +4 -1
  4. data/app/models/blog_post.rb +10 -1
  5. data/app/views/admin/blog/_submenu.html.erb +2 -9
  6. data/app/views/admin/blog/comments/show.html.erb +2 -5
  7. data/app/views/admin/blog/posts/_form.html.erb +39 -11
  8. data/app/views/admin/blog/posts/_form.js.erb +3 -11
  9. data/app/views/admin/blog/posts/_form_part.html.erb +3 -0
  10. data/app/views/blog/categories/show.html.erb +5 -4
  11. data/app/views/blog/posts/_post.html.erb +4 -4
  12. data/app/views/blog/posts/show.html.erb +8 -21
  13. data/app/views/blog/posts/tagged.html.erb +1 -1
  14. data/app/views/blog/shared/_post.html.erb +4 -4
  15. data/app/views/blog/shared/_tags.html.erb +1 -1
  16. data/app/views/shared/admin/_autocomplete.html.erb +55 -0
  17. data/changelog.md +9 -0
  18. data/config/locales/de.yml +2 -0
  19. data/config/locales/en.yml +23 -1
  20. data/config/locales/fr.yml +31 -2
  21. data/config/locales/nl.yml +3 -3
  22. data/config/locales/pt-BR.yml +10 -0
  23. data/config/locales/ru.yml +3 -0
  24. data/config/routes.rb +4 -1
  25. data/db/migrate/5_add_cached_slugs.rb +11 -0
  26. data/db/migrate/6_add_custom_url_field_to_blog_posts.rb +9 -0
  27. data/features/authors.feature +1 -1
  28. data/features/category.feature +23 -0
  29. data/features/support/step_definitions/category_steps.rb +11 -0
  30. data/features/tags.feature +1 -1
  31. data/lib/refinery/blog/tabs.rb +28 -0
  32. data/lib/refinery/blog/version.rb +2 -2
  33. data/lib/refinerycms-blog.rb +6 -1
  34. data/public/stylesheets/refinerycms-blog.css +3 -2
  35. data/public/stylesheets/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  36. data/public/stylesheets/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  37. data/public/stylesheets/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  38. data/public/stylesheets/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  39. data/public/stylesheets/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  40. data/public/stylesheets/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  41. data/public/stylesheets/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  42. data/public/stylesheets/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  43. data/public/stylesheets/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  44. data/public/stylesheets/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  45. data/public/stylesheets/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  46. data/public/stylesheets/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  47. data/public/stylesheets/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  48. data/public/stylesheets/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  49. data/public/stylesheets/ui-lightness/jquery-ui-1.8.13.custom.css +337 -0
  50. metadata +77 -62
@@ -11,6 +11,13 @@ class Admin::Blog::PostsController < Admin::BaseController
11
11
  })
12
12
  end
13
13
 
14
+ def tags
15
+ @tags = BlogPost.tag_counts_on(:tags).where(
16
+ ["tags.name LIKE ?", "%#{params[:term].to_s.downcase}%"]
17
+ ).map { |tag| {:id => tag.id, :value => tag.name}}
18
+ render :json => @tags.flatten
19
+ end
20
+
14
21
  def create
15
22
  # if the position field exists, set this object as last object, given the conditions of this class.
16
23
  if BlogPost.column_names.include?("position")
@@ -2,6 +2,10 @@ class Blog::CategoriesController < BlogController
2
2
 
3
3
  def show
4
4
  @category = BlogCategory.find(params[:id])
5
+ @blog_posts = @category.posts.live.includes(:comments, :categories).paginate({
6
+ :page => params[:page],
7
+ :per_page => RefinerySetting.find_or_set(:blog_posts_per_page, 10)
8
+ })
5
9
  end
6
10
 
7
11
  end
@@ -7,7 +7,10 @@ class BlogCategory < ActiveRecord::Base
7
7
 
8
8
  validates :title, :presence => true, :uniqueness => true
9
9
 
10
- has_friendly_id :title, :use_slug => true
10
+ has_friendly_id :title, :use_slug => true,
11
+ :default_locale => (::Refinery::I18n.default_frontend_locale rescue :en),
12
+ :approximate_ascii => RefinerySetting.find_or_set(:approximate_ascii, false, :scoping => 'blog'),
13
+ :strip_non_ascii => RefinerySetting.find_or_set(:strip_non_ascii, false, :scoping => 'blog')
11
14
 
12
15
  def post_count
13
16
  posts.select(&:live?).count
@@ -21,7 +21,12 @@ class BlogPost < ActiveRecord::Base
21
21
  validates :title, :presence => true, :uniqueness => true
22
22
  validates :body, :presence => true
23
23
 
24
- has_friendly_id :title, :use_slug => true
24
+ has_friendly_id :friendly_id_source, :use_slug => true,
25
+ :default_locale => (::Refinery::I18n.default_frontend_locale rescue :en),
26
+ :approximate_ascii => RefinerySetting.find_or_set(:approximate_ascii, false, :scoping => 'blog'),
27
+ :strip_non_ascii => RefinerySetting.find_or_set(:strip_non_ascii, false, :scoping => 'blog')
28
+
29
+ attr_accessible :title, :body, :tag_list, :draft, :published_at, :browser_title, :meta_keywords, :meta_description, :user_id, :category_ids, :custom_url
25
30
 
26
31
  scope :by_archive, lambda { |archive_date|
27
32
  where(['published_at between ? and ?', archive_date.beginning_of_month, archive_date.end_of_month])
@@ -56,6 +61,10 @@ class BlogPost < ActiveRecord::Base
56
61
  }.compact
57
62
  end
58
63
 
64
+ def friendly_id_source
65
+ custom_url.present? ? custom_url : title
66
+ end
67
+
59
68
  class << self
60
69
  def next current_record
61
70
  self.send(:with_exclusive_scope) do
@@ -88,12 +88,5 @@
88
88
  </ul>
89
89
 
90
90
  </nav>
91
- <% if Refinery.version < '0.9.9' %>
92
- <% content_for :head do %>
93
- <%= stylesheet_link_tag('refinery/refinerycms-blog') %>
94
- <%# this javascript is not even required in >= 0.9.9 because we made this sort of menu core. %>
95
- <%= javascript_include_tag('refinery/refinerycms-blog') %>
96
- <% end %>
97
- <% else %>
98
- <% content_for :stylesheets, stylesheet_link_tag('refinery/refinerycms-blog')%>
99
- <% end %>
91
+
92
+ <% content_for :stylesheets, stylesheet_link_tag('refinery/refinerycms-blog')%>
@@ -59,8 +59,5 @@
59
59
  </tr>
60
60
  </table>
61
61
  </div>
62
- <% if Refinery.version < '0.9.9' %>
63
- <% content_for :head, stylesheet_link_tag('refinery/refinerycms-blog') %>
64
- <% else %>
65
- <% content_for :stylesheets, stylesheet_link_tag('refinery/refinerycms-blog') %>
66
- <% end %>
62
+
63
+ <% content_for :stylesheets, stylesheet_link_tag('refinery/refinerycms-blog') %>
@@ -11,8 +11,33 @@
11
11
  </div>
12
12
 
13
13
  <div class='field'>
14
- <%= f.label :body -%>
15
- <%= f.text_area :body, :rows => 20, :class => 'wymeditor widest' -%>
14
+ <div id='page-tabs' class='clearfix ui-tabs ui-widget ui-widget-content ui-corner-all'>
15
+ <ul id='page_parts'>
16
+ <li class='ui-state-default'>
17
+ <%= link_to "Body", "#page_part_body" %>
18
+ </li>
19
+ <% Refinery::Blog.tabs.each_with_index do |tab, tab_index| %>
20
+ <li class='ui-state-default' id="custom_<%= tab.name %>_tab">
21
+ <%= link_to tab.name.titleize, "#custom_tab_#{tab_index}" %>
22
+ </li>
23
+ <% end %>
24
+ </ul>
25
+
26
+ <div id='page_part_editors'>
27
+
28
+ <% part_index = -1 %>
29
+ <%= render :partial => 'form_part',
30
+ :locals => {
31
+ :f => f,
32
+ :part_index => (part_index += 1),
33
+ } -%>
34
+ <% Refinery::Blog.tabs.each_with_index do |tab, tab_index| %>
35
+ <div class='page_part' id='<%= "custom_tab_#{tab_index}" %>'>
36
+ <%= render :partial => tab.partial, :locals => {:f => f} %>
37
+ </div>
38
+ <% end %>
39
+ </div>
40
+ </div>
16
41
  </div>
17
42
 
18
43
  <div class='field'>
@@ -48,6 +73,15 @@
48
73
  </ul>
49
74
  <h3><%= t('.published_at') %></h3>
50
75
  <%= f.datetime_select :published_at %>
76
+
77
+ <div class='field'>
78
+ <span class='label_with_help'>
79
+ <%= f.label :custom_url, t('.custom_url') %>
80
+ <%= refinery_help_tag t('.custom_url_help') %>
81
+ </span>
82
+ <%= f.text_field :custom_url, :class => "widest" %>
83
+ </div>
84
+
51
85
  </div>
52
86
  <div class='hemisquare right_side'>
53
87
  <%= render :partial => '/seo_meta/form', :locals => {:form => f} %>
@@ -61,12 +95,6 @@
61
95
  } %>
62
96
  <% end -%>
63
97
 
64
- <% if Refinery.version < '0.9.9' %>
65
- <% content_for :head do %>
66
- <%= render :partial => 'form.css' %>
67
- <%= render :partial => 'form.js' %>
68
- <% end %>
69
- <% else %>
70
- <% content_for :stylesheets, render(:partial => 'form.css') -%>
71
- <% content_for :javascripts, render(:partial => 'form.js') -%>
72
- <% end %>
98
+ <% content_for :stylesheets, render(:partial => 'form.css') -%>
99
+ <% content_for :javascripts, render(:partial => 'form.js') -%>
100
+ <%= render 'shared/admin/autocomplete', :dom_id => '#blog_post_tag_list', :url => tags_admin_blog_posts_url %>
@@ -1,13 +1,5 @@
1
1
  <script>
2
- $(document).ready(function(){
3
- $('#toggle_advanced_options').click(function(e){
4
- e.preventDefault();
5
-
6
- $('#more_options').animate({opacity: 'toggle', height: 'toggle'}, 250);
7
-
8
- $('html,body').animate({
9
- scrollTop: $('#toggle_advanced_options').parent().offset().top
10
- }, 250);
11
- });
12
- });
2
+ (function($) {
3
+ $('#page-tabs').tabs();
4
+ })(jQuery);
13
5
  </script>
@@ -0,0 +1,3 @@
1
+ <div class='page_part' id='page_part_body'>
2
+ <%= f.text_area :body, :rows => 20, :class => 'wymeditor widest' -%>
3
+ </div>
@@ -1,10 +1,11 @@
1
1
  <% content_for :body_content_title, @category.title %>
2
2
 
3
3
  <% content_for :body_content_left do %>
4
- <% if @category.posts.any? %>
5
- <article id="blog_posts">
6
- <%= render :partial => "/blog/shared/post", :collection => @category.posts %>
7
- </article>
4
+ <% if @blog_posts.any? %>
5
+ <section id="blog_posts">
6
+ <%= render :partial => "/blog/shared/post", :collection => @blog_posts %>
7
+ <%= will_paginate @blog_posts %>
8
+ </section>
8
9
  <% else %>
9
10
  <p>
10
11
  <%= t('.no_posts') %>
@@ -6,10 +6,10 @@
6
6
  <article id="blog_post">
7
7
  <header>
8
8
  <h1><%= @blog_post.title %></h1>
9
- <details>
9
+ <section class='details'>
10
10
  <time datetime="<%=l @blog_post.published_at.to_date, :format => :default %>" class='posted_at'>
11
- <%= t('blog.shared.posts.created_at', :when => l(@blog_post.published_at.to_date, :format => :short)) %>.
12
- </time><%= " by #{@blog_post.author.username}" if @blog_post.author.present? %>
11
+ <%= t('blog.shared.posts.created_at', :when => l(@blog_post.published_at.to_date, :format => :short)) %>
12
+ </time><%= "#{t('blog.posts.show.by')} #{@blog_post.author.username}" if @blog_post.author.present? %>.
13
13
  <% if (categories = @blog_post.categories).any? %>
14
14
  <aside class='filed_in'>
15
15
  <%= t('blog.posts.show.filed_in') %>
@@ -18,7 +18,7 @@
18
18
  <% end %>
19
19
  </aside>
20
20
  <% end %>
21
- </details>
21
+ </section>
22
22
  </header>
23
23
  <%= @blog_post.body.html_safe %>
24
24
 
@@ -57,24 +57,11 @@
57
57
 
58
58
  <%= render :partial => "/shared/content_page", :locals => { :remove_automatic_sections => true } %>
59
59
 
60
- <% if Refinery.version < '0.9.9' %>
61
- <% content_for :head_libraries, jquery_include_tags(:jquery_ui => false) %>
62
- <% content_for :head do %>
63
- <%= stylesheet_link_tag 'refinerycms-blog' %>
64
- <%# enable AJAX'd post nav at your own risk until html5 history API implemented. %>
65
- <%#= javascript_include_tag('refinerycms-blog') %>
66
- <% if BlogPost::ShareThis.enabled? %>
67
- <script src="http://w.sharethis.com/button/buttons.js"></script>
68
- <script>stLight.options({publisher:'<%= BlogPost::ShareThis.key %>'});</script>
69
- <% end %>
70
- <% end %>
71
- <% else %>
72
- <% content_for :stylesheets, stylesheet_link_tag('refinerycms-blog') %>
73
- <% content_for :before_javascript_libraries, jquery_include_tags(:jquery_ui => false) %>
74
- <% content_for :javascripts do %>
75
- <%# enable AJAX'd post nav at your own risk until html5 history API implemented. %>
76
- <%#= javascript_include_tag('refinerycms-blog') %>
77
- <script src="http://w.sharethis.com/button/buttons.js"></script>
78
- <script>stLight.options({publisher:'<%= BlogPost::ShareThis.key %>'});</script>
79
- <% end if BlogPost::ShareThis.enabled? %>
80
- <% end %>
60
+ <% content_for :stylesheets, stylesheet_link_tag('refinerycms-blog') %>
61
+ <% content_for :before_javascript_libraries, jquery_include_tags(:jquery_ui => false) %>
62
+ <% content_for :javascripts do %>
63
+ <%# enable AJAX'd post nav at your own risk until html5 history API implemented. %>
64
+ <%#= javascript_include_tag('refinerycms-blog') %>
65
+ <script src="http://w.sharethis.com/button/buttons.js"></script>
66
+ <script>stLight.options({publisher:'<%= BlogPost::ShareThis.key %>'});</script>
67
+ <% end if BlogPost::ShareThis.enabled? %>
@@ -1,4 +1,4 @@
1
- <% content_for :body_content_title, "Posts tagged &#8220;#{@tag_name.titleize}&#8221;".html_safe -%>
1
+ <% content_for :body_content_title, "#{t('.posts_tagged')} &#8220;#{@tag_name.titleize}&#8221;".html_safe -%>
2
2
 
3
3
  <% content_for :body_content_left do %>
4
4
  <% if @blog_posts.any? %>
@@ -2,10 +2,10 @@
2
2
  <article class="blog_post" id="<%= dom_id(post) %>">
3
3
  <header>
4
4
  <h1><%= link_to post.title, blog_post_url(post) %></h1>
5
- <details>
5
+ <section class='details'>
6
6
  <time datetime="<%=l post.published_at.to_date, :format => :default %>" class='posted_at'>
7
- <%= t('blog.shared.posts.created_at', :when => l(post.published_at.to_date, :format => :short)) %>.
8
- </time><%= " by #{post.author.username}" if post.author.present? %>
7
+ <%= t('blog.shared.posts.created_at', :when => l(post.published_at.to_date, :format => :short)) %>
8
+ </time><%= "#{t('blog.posts.show.by')} #{post.author.username}" if post.author.present? %>.
9
9
  <% if (categories = post.categories).any? %>
10
10
  <aside class='filed_in'>
11
11
  <%= t('filed_in', :scope => 'blog.posts.show') %>
@@ -18,7 +18,7 @@
18
18
  <%=raw tags.collect { |tag| link_to tag, tagged_posts_path(tag.parameterize) }.to_sentence %>
19
19
  </aside>
20
20
  <% end %>
21
- </details>
21
+ </section>
22
22
  </header>
23
23
  <section class='clearfix'>
24
24
  <%= truncate(post.body,
@@ -1,4 +1,4 @@
1
- <% unless @tags.nil? %>
1
+ <% if @tags.any? %>
2
2
  <h2><%= t('.title') %></h2>
3
3
  <nav id='tags'>
4
4
  <% tag_cloud(@tags, %w(tag1 tag2 tag3 tag4)) do |tag, css_class| %>
@@ -0,0 +1,55 @@
1
+ <% content_for :stylesheets, stylesheet_link_tag("ui-lightness/jquery-ui-1.8.13.custom.css") -%>
2
+
3
+ <% content_for :javascripts do %>
4
+ <%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js" %>
5
+ <script>
6
+ function split( val ) {
7
+ return val.split( /,\s*/ );
8
+ }
9
+ function extractLast( term ) {
10
+ return split( term ).pop();
11
+ }
12
+
13
+
14
+ $(document).ready(function(){
15
+ page_options.init(false, '', '')
16
+
17
+ $('<%= dom_id %>')
18
+ .bind( "keydown", function( event ) {
19
+ if ( event.keyCode === $.ui.keyCode.TAB &&
20
+ $( this ).data( "autocomplete" ).menu.active ) {
21
+ event.preventDefault()
22
+ }
23
+ })
24
+ .autocomplete({
25
+ source: function( request, response ) {
26
+ $.getJSON( "<%= url %>", {
27
+ term: extractLast( request.term )
28
+ }, response );
29
+ },
30
+ search: function() {
31
+ // custom minLength
32
+ var term = extractLast( this.value );
33
+ if ( term.length < 2 ) {
34
+ return false;
35
+ }
36
+ },
37
+ focus: function() {
38
+ // prevent value inserted on focus
39
+ return false;
40
+ },
41
+ select: function( event, ui ) {
42
+ var terms = split( this.value );
43
+ // remove the current input
44
+ terms.pop();
45
+ // add the selected item
46
+ terms.push( ui.item.value );
47
+ // add placeholder to get the comma-and-space at the end
48
+ terms.push( "" );
49
+ this.value = terms.join( ", " );
50
+ return false;
51
+ }
52
+ })
53
+ });
54
+ </script>
55
+ <% end %>
data/changelog.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 1.6 [20 June 2011]
2
+ * Category bug fixes and cleanup [wikyd](https://github.com/wikyd)
3
+ * Cleaned up deprecated code [ugisozols](https://github.com/ugisozols)
4
+ * Performance boosts (cached slugs) [joemsak](https://github.com/joemsak)
5
+ * More translations [cerebroso](https://github.com/cerebroso), [peresleguine](https://github.com/peresleguine)
6
+ * More testing [wakeless](https://github.com/wakeless)
7
+ * Tag list autocomplete baked in [joemsak](https://github.com/joemsak)
8
+ * Customize the URL of your blog post [wikyd](https://github.com/wikyd)
9
+
1
10
  ## 1.5 [28 May 2011]
2
11
 
3
12
  * Added Gravatar support. [parndt](https://github.com/parndt)
@@ -101,6 +101,8 @@ de:
101
101
  singular: Kommentar
102
102
  none: Keine Kommentare
103
103
  archives: Archiv
104
+ tags:
105
+ title: Kategorien
104
106
  categories:
105
107
  show:
106
108
  no_posts: Es sind noch keine Artikel vorhanden.
@@ -38,6 +38,8 @@ en:
38
38
  toggle_advanced_options: Click to access meta tag settings and menu options
39
39
  save_as_draft: Save as Draft
40
40
  published_at: Publish Date
41
+ custom_url: Custom Url
42
+ custom_url_help: Generate the url for the blog post from this text instead of the title.
41
43
  index:
42
44
  no_items_yet: 'There are no Blog Posts yet. Click "%{create}" to add your first blog post.'
43
45
  uncategorized:
@@ -126,8 +128,28 @@ en:
126
128
  filed_in: Filed in
127
129
  tagged: Tagged
128
130
  submit: Send comment
131
+ name: Name
132
+ email: Email
133
+ message: Message
134
+ by: by
129
135
  tagged:
130
136
  no_blog_articles_yet: There are no blog articles posted yet. Stay tuned.
137
+ posts_tagged: Posts tagged
131
138
  archive:
132
139
  blog_archive_for: 'Blog Archive for %{date}'
133
- no_blog_articles_posted: 'There are no blog articles posted for %{date}. Stay tuned.'
140
+ no_blog_articles_posted: 'There are no blog articles posted for %{date}. Stay tuned.'
141
+ activerecord:
142
+ models:
143
+ blog_category: Category
144
+ blog_comment: Comment
145
+ blog_post: Blog post
146
+ attributes:
147
+ blog_category:
148
+ title: Title
149
+ blog_comment:
150
+ name: Name
151
+ email: Email
152
+ message: Message
153
+ blog_post:
154
+ title: Title
155
+ body: Body
@@ -40,6 +40,8 @@ fr:
40
40
  published_at: Date de publication
41
41
  index:
42
42
  no_items_yet: 'Il n''y a aucun article pour l''instant. Cliquez sur "%{create}" pour ajouter votre premier article.'
43
+ uncategorized:
44
+ no_items_yet: 'Il n''y a aucun article non catégorisé.'
43
45
  post:
44
46
  view_live_html: 'Voir cet article sur le site<br/><em>(Ouvre une nouvelle fenêtre)</em>'
45
47
  edit: Modifier cet article
@@ -67,6 +69,7 @@ fr:
67
69
  title: Articles
68
70
  manage: Gérer les articles
69
71
  new: Créer un nouvel article
72
+ uncategorized: Aricles non catégorisés
70
73
  settings:
71
74
  title: Paramêtres
72
75
  moderation: Modération
@@ -88,16 +91,19 @@ fr:
88
91
  categories:
89
92
  title: Catégories
90
93
  rss_feed:
91
- title: RSS Feed
94
+ title: Flux RSS
92
95
  subscribe: Souscrire
93
96
  posts:
94
97
  other: Autres articles
95
98
  created_at: 'Écrit le %{when}'
96
99
  read_more: Lire la suite
100
+ by: 'par'
97
101
  comments:
98
102
  singular: commentaire
99
103
  none: aucun commentaire
100
104
  archives: Archives
105
+ tags:
106
+ title: "Mots clés"
101
107
  categories:
102
108
  show:
103
109
  no_posts: 'Il n''y a aucun article pour cette catégorie.'
@@ -119,7 +125,30 @@ fr:
119
125
  add: Ajouter un commentaire
120
126
  other: Autres articles
121
127
  filed_in: Classé dans
128
+ tagged: Taggé
122
129
  submit: Envoyer le commentaire
130
+ name: Nom
131
+ email: Email
132
+ message: Message
133
+ by: par
134
+ tagged:
135
+ no_blog_articles_yet: "Il n'y a aucun article pour l'instant. Restez en alerte."
136
+ posts_tagged: Articles taggés
123
137
  archive:
124
138
  blog_archive_for: 'Archive du blog pour le %{date}'
125
- no_blog_articles_posted: "Il n'y a aucun article pour la date du %{date}. Restez à l'écoute."
139
+ no_blog_articles_posted: "Il n'y a aucun article pour la date du %{date}. Restez en alerte."
140
+ activerecord:
141
+ models:
142
+ blog_category: Categorie
143
+ blog_comment: Commentaire
144
+ blog_post: Article
145
+ attributes:
146
+ blog_category:
147
+ title: Titre
148
+ blog_comment:
149
+ name: Nom
150
+ email: Email
151
+ message: Message
152
+ blog_post:
153
+ title: Titre
154
+ body: Corps