refinerycms-blog 1.5.2 → 1.6.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 (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