comfortable_mexican_sofa 1.6.23 → 1.6.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/VERSION +1 -1
  2. data/app/assets/javascripts/comfortable_mexican_sofa/application.js +17 -16
  3. data/app/assets/stylesheets/comfortable_mexican_sofa/form.css +48 -0
  4. data/app/controllers/cms_admin/files_controller.rb +1 -1
  5. data/app/models/cms/file.rb +2 -1
  6. data/app/models/cms/page.rb +26 -6
  7. data/app/views/cms_admin/categories/_show.html.erb +1 -1
  8. data/app/views/cms_admin/files/_file.html.erb +1 -1
  9. data/app/views/cms_admin/files/index.html.erb +1 -1
  10. data/app/views/cms_admin/layouts/_index_branch.html.erb +1 -1
  11. data/app/views/cms_admin/pages/_form.html.erb +1 -0
  12. data/app/views/cms_admin/pages/_form_blocks.html.erb +29 -5
  13. data/app/views/cms_admin/pages/_index_branch.html.erb +1 -1
  14. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -1
  15. data/app/views/cms_admin/sites/index.html.erb +1 -1
  16. data/app/views/cms_admin/snippets/index.html.erb +1 -1
  17. data/comfortable_mexican_sofa.gemspec +4 -3
  18. data/config/locales/ru.yml +235 -0
  19. data/lib/comfortable_mexican_sofa/configuration.rb +24 -23
  20. data/lib/comfortable_mexican_sofa/tag.rb +6 -1
  21. data/lib/comfortable_mexican_sofa/tags/asset.rb +1 -1
  22. data/lib/comfortable_mexican_sofa/tags/collection.rb +1 -1
  23. data/lib/comfortable_mexican_sofa/tags/field_datetime.rb +1 -1
  24. data/lib/comfortable_mexican_sofa/tags/field_integer.rb +1 -1
  25. data/lib/comfortable_mexican_sofa/tags/field_rich_text.rb +1 -1
  26. data/lib/comfortable_mexican_sofa/tags/field_string.rb +1 -1
  27. data/lib/comfortable_mexican_sofa/tags/field_text.rb +1 -1
  28. data/lib/comfortable_mexican_sofa/tags/file.rb +1 -1
  29. data/lib/comfortable_mexican_sofa/tags/page_datetime.rb +1 -1
  30. data/lib/comfortable_mexican_sofa/tags/page_file.rb +1 -1
  31. data/lib/comfortable_mexican_sofa/tags/page_files.rb +1 -1
  32. data/lib/comfortable_mexican_sofa/tags/page_integer.rb +1 -1
  33. data/lib/comfortable_mexican_sofa/tags/page_rich_text.rb +1 -1
  34. data/lib/comfortable_mexican_sofa/tags/page_string.rb +1 -1
  35. data/lib/comfortable_mexican_sofa/tags/page_text.rb +1 -1
  36. data/lib/comfortable_mexican_sofa/view_methods.rb +10 -1
  37. data/test/functional/cms_admin/pages_controller_test.rb +18 -18
  38. data/test/functional/cms_content_controller_test.rb +6 -6
  39. data/test/gemfiles/Gemfile.rails.3.0 +1 -1
  40. data/test/gemfiles/Gemfile.rails.3.1 +1 -1
  41. data/test/gemfiles/Gemfile.rails.3.2 +1 -1
  42. data/test/integration/fixtures_test.rb +1 -1
  43. data/test/integration/mirrors_test.rb +1 -1
  44. data/test/integration/render_cms_test.rb +7 -7
  45. data/test/integration/sites_test.rb +3 -3
  46. data/test/test_helper.rb +15 -0
  47. data/test/unit/fixtures_test.rb +10 -10
  48. data/test/unit/mirrors_test.rb +1 -1
  49. data/test/unit/models/block_test.rb +3 -3
  50. data/test/unit/models/categorization_test.rb +2 -2
  51. data/test/unit/models/file_test.rb +1 -1
  52. data/test/unit/models/layout_test.rb +3 -3
  53. data/test/unit/models/page_test.rb +21 -3
  54. data/test/unit/models/site_test.rb +1 -1
  55. data/test/unit/models/snippet_test.rb +1 -1
  56. data/test/unit/revisions_test.rb +5 -5
  57. data/test/unit/tag_test.rb +27 -1
  58. data/test/unit/tags/collection_test.rb +7 -0
  59. data/test/unit/tags/field_datetime_test.rb +6 -0
  60. data/test/unit/tags/field_integer_test.rb +6 -0
  61. data/test/unit/tags/field_rich_text_test.rb +6 -0
  62. data/test/unit/tags/field_string_test.rb +6 -0
  63. data/test/unit/tags/field_text_test.rb +6 -0
  64. data/test/unit/tags/page_datetime_test.rb +6 -0
  65. data/test/unit/tags/page_file_test.rb +10 -2
  66. data/test/unit/tags/page_files_test.rb +9 -1
  67. data/test/unit/tags/page_integer_test.rb +6 -0
  68. data/test/unit/tags/page_rich_text_test.rb +6 -0
  69. data/test/unit/tags/page_string_test.rb +6 -0
  70. data/test/unit/tags/page_text_test.rb +6 -0
  71. data/test/unit/view_methods_test.rb +21 -3
  72. metadata +5 -4
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6.23
1
+ 1.6.24
@@ -9,7 +9,7 @@
9
9
  //= require comfortable_mexican_sofa/elrte/elrte.sofa_image.js
10
10
 
11
11
  $.CMS = function(){
12
-
12
+
13
13
  var current_path = window.location.pathname;
14
14
  var admin_path_prefix = $('meta[name="cms-admin-path"]').attr('content');
15
15
 
@@ -21,15 +21,15 @@ $.CMS = function(){
21
21
  $.CMS.enable_codemirror();
22
22
  $.CMS.enable_date_picker();
23
23
  $.CMS.enable_sortable_list();
24
- if($('form#page_edit, form#page_new').get(0)) $.CMS.enable_page_save_form();
25
- if($('#mirrors').get(0)) $.CMS.enable_mirrors_widget();
26
- if($('#page_save').get(0)) $.CMS.enable_page_save_widget();
27
- if($('#uploader_button').get(0)) $.CMS.enable_uploader();
28
- if($('.categories_widget').get(0)) $.CMS.enable_categories_widget();
24
+ if($('#page_new, #page_edit, #new_page, #edit_page').length) $.CMS.enable_page_form();
25
+ if($('#mirrors').length) $.CMS.enable_mirrors_widget();
26
+ if($('#page_save').length) $.CMS.enable_page_save_widget();
27
+ if($('#uploader_button').length) $.CMS.enable_uploader();
28
+ if($('.categories_widget').length) $.CMS.enable_categories_widget();
29
29
  });
30
30
 
31
31
  return {
32
-
32
+
33
33
  // Configuration that can be overriden from the outside. For example:
34
34
  // $.CMS.config.elRTE.toolbar = ['undoredo']
35
35
  config: {
@@ -86,16 +86,16 @@ $.CMS = function(){
86
86
  })
87
87
  });
88
88
  },
89
-
89
+
90
90
  enable_rich_text: function(){
91
91
  elRTE.prototype.options.panels.sofa_style = ['bold', 'italic', 'underline'];
92
92
  elRTE.prototype.options.panels.sofa_alignment = ['justifyleft', 'justifycenter', 'justifyright'];
93
93
  elRTE.prototype.options.panels.sofa_format = ['formatblock'];
94
94
  elRTE.prototype.options.panels.sofa_copypaste = ['pastetext'];
95
95
  elRTE.prototype.options.panels.sofa_links = ['sofa_link', 'unlink'];
96
-
96
+
97
97
  elRTE.prototype.options.toolbars.sofa = $.CMS.config.elRTE.toolbar;
98
-
98
+
99
99
  // BUG: Need to set content to an empty <p> for IE
100
100
  if ($.browser.msie){
101
101
  $('textarea.rich_text').each(function(){
@@ -104,14 +104,14 @@ $.CMS = function(){
104
104
  }
105
105
  })
106
106
  }
107
-
107
+
108
108
  $('textarea.rich_text').elrte({
109
109
  height: 300,
110
110
  toolbar: 'sofa',
111
111
  styleWithCSS: false
112
112
  });
113
113
  },
114
-
114
+
115
115
  enable_codemirror: function(){
116
116
  $('textarea.code').each(function(i, element){
117
117
  var mode = 'htmlmixed';
@@ -149,7 +149,7 @@ $.CMS = function(){
149
149
  })
150
150
  });
151
151
  },
152
-
152
+
153
153
  enable_mirrors_widget: function(){
154
154
  $('#mirrors select').change(function(){
155
155
  window.location = $(this).val();
@@ -171,7 +171,8 @@ $.CMS = function(){
171
171
  })
172
172
  },
173
173
 
174
- enable_page_save_form : function(){
174
+ enable_page_form : function(){
175
+ $('#tag_namespaces').tabs();
175
176
  $('input[name=commit]').click(function() {
176
177
  $(this).parents('form').attr('target', '');
177
178
  });
@@ -191,7 +192,7 @@ $.CMS = function(){
191
192
  eval(xhr.responseText);
192
193
  }
193
194
  }
194
-
195
+
195
196
  xhr.open('POST', action, true);
196
197
  xhr.setRequestHeader('Accept', 'application/javascript');
197
198
  xhr.setRequestHeader('X-CSRF-Token', $('meta[name=csrf-token]').attr('content'));
@@ -202,7 +203,7 @@ $.CMS = function(){
202
203
  });
203
204
  });
204
205
  },
205
-
206
+
206
207
  enable_categories_widget : function(){
207
208
  $('.categories_widget a.action_link').click(function(){
208
209
  if($(this).data('state') == 'edit'){
@@ -47,6 +47,17 @@
47
47
  #cms_body .form_element.check_box_element input {
48
48
  width: auto;
49
49
  }
50
+
51
+ #cms_body .form_element .value input[disabled]{
52
+ background-color: #F1F1F1;
53
+ -webkit-touch-callout: none;
54
+ -webkit-user-select: none;
55
+ -khtml-user-select: none;
56
+ -moz-user-select: none;
57
+ -ms-user-select: none;
58
+ user-select: none;
59
+ }
60
+
50
61
  #cms_body .page_form_extras {
51
62
  margin-bottom: 10px;
52
63
  }
@@ -179,4 +190,41 @@
179
190
  }
180
191
  #cms_body .form_element.simple_field .value input {
181
192
  margin-bottom: 3px;
193
+ }
194
+ /* -- Tabs --------------------------------------------------------------- */
195
+ #cms_body #tag_namespaces {
196
+ padding: 0px;
197
+ border: 0px;
198
+ background: transparent;
199
+ }
200
+ #cms_body #tag_namespaces ul.ui-tabs-nav {
201
+ margin: 0px 0px 5px 150px;
202
+ padding: 5px 5px 0px 5px;
203
+ background: #484848;
204
+ border: 0px;
205
+ border-radius: 0px;
206
+ }
207
+ #cms_body #tag_namespaces ul.ui-tabs-nav li {
208
+ background: transparent;
209
+ border: 0px;
210
+ margin: 0px;
211
+ padding: 0px;
212
+ top: 0px;
213
+ }
214
+ #cms_body #tag_namespaces ul.ui-tabs-nav a {
215
+ margin-right: 2px;
216
+ font: 13px/19px 'Lucida Grande','Tahoma', sans-serif;
217
+ background-color: #252525;
218
+ color: #8a8a8a;
219
+ border-radius: 3px 3px 0px 0px;
220
+ }
221
+ #cms_body #tag_namespaces ul.ui-tabs-nav a:hover {
222
+ color: #fff;
223
+ }
224
+ #cms_body #tag_namespaces ul.ui-tabs-nav li.ui-tabs-selected a {
225
+ background-color: #fff;
226
+ color: #000;
227
+ }
228
+ #cms_body #tag_namespaces .ui-tabs-panel {
229
+ padding: 0px;
182
230
  }
@@ -96,7 +96,7 @@ class CmsAdmin::FilesController < CmsAdmin::BaseController
96
96
  def reorder
97
97
  (params[:cms_file] || []).each_with_index do |id, index|
98
98
  if (cms_file = Cms::File.find_by_id(id))
99
- cms_file.update_attribute(:position, index)
99
+ cms_file.update_attributes(:position => index)
100
100
  end
101
101
  end
102
102
  render :nothing => true
@@ -15,7 +15,8 @@ class Cms::File < ActiveRecord::Base
15
15
  :dimensions,
16
16
  :label,
17
17
  :description,
18
- :category_ids
18
+ :category_ids,
19
+ :position
19
20
 
20
21
  # -- AR Extensions --------------------------------------------------------
21
22
  has_attached_file :file, ComfortableMexicanSofa.config.upload_file_options.merge(
@@ -1,4 +1,16 @@
1
1
  # encoding: utf-8
2
+
3
+ class ColumnLimitValidator < ActiveModel::EachValidator
4
+ # Ensuring that slug and full path are not longer than what database
5
+ # can store. We want to avoid magical invisible truncation
6
+ def validate_each(record, attribute, value)
7
+ column_limit = record.class.columns_hash[attribute.to_s].limit
8
+ if value.to_s.length > column_limit
9
+ record.errors.add(attribute, :too_long, :count => column_limit)
10
+ end
11
+ end
12
+ end
13
+
2
14
  class Cms::Page < ActiveRecord::Base
3
15
 
4
16
  ComfortableMexicanSofa.establish_connection(self)
@@ -33,11 +45,11 @@ class Cms::Page < ActiveRecord::Base
33
45
 
34
46
  # -- Callbacks ------------------------------------------------------------
35
47
  before_validation :assigns_label,
36
- :assign_parent
37
- after_validation :escape_slug
48
+ :assign_parent,
49
+ :escape_slug,
50
+ :assign_full_path
38
51
  before_create :assign_position
39
- before_save :assign_full_path,
40
- :set_cached_content
52
+ before_save :set_cached_content
41
53
  after_save :sync_child_pages
42
54
  after_find :unescape_slug_and_path
43
55
 
@@ -48,13 +60,15 @@ class Cms::Page < ActiveRecord::Base
48
60
  :presence => true
49
61
  validates :slug,
50
62
  :presence => true,
51
- :format => /^\p{Alnum}[\.\p{Alnum}\p{Mark}_-]*$/i,
52
63
  :uniqueness => { :scope => :parent_id },
53
64
  :unless => lambda{ |p| p.site && (p.site.pages.count == 0 || p.site.pages.root == self) }
54
65
  validates :layout,
55
66
  :presence => true
56
67
  validate :validate_target_page
57
-
68
+ validate :validate_format_of_unescaped_slug
69
+ validates :slug, :full_path,
70
+ :column_limit => true
71
+
58
72
  # -- Scopes ---------------------------------------------------------------
59
73
  default_scope order('cms_pages.position')
60
74
  scope :published, where(:is_published => true)
@@ -170,6 +184,12 @@ protected
170
184
  end
171
185
  end
172
186
 
187
+ def validate_format_of_unescaped_slug
188
+ return unless slug.present?
189
+ unescaped_slug = CGI::unescape(self.slug)
190
+ errors.add(:slug, :invalid) unless unescaped_slug =~ /^\p{Alnum}[\.\p{Alnum}\p{Mark}_-]*$/i
191
+ end
192
+
173
193
  # NOTE: This can create 'phantom' page blocks as they are defined in the layout. This is normal.
174
194
  def set_cached_content
175
195
  write_attribute(:content, self.content(true))
@@ -11,6 +11,6 @@
11
11
  <%= link_to category.label, "?#{{:category => categories}.to_param}" %>
12
12
  <% else %>
13
13
  <%= link_to category.label, edit_cms_admin_site_category_path(@site, category), :remote => true %>
14
- <%= link_to 'x', cms_admin_site_category_path(@site, category), :method => :delete, :remote => true, :confirm => t('.are_you_sure'), :class => 'delete' %>
14
+ <%= link_to 'x', cms_admin_site_category_path(@site, category), :method => :delete, :remote => true, :data => {:confirm => t('.are_you_sure')}, :class => 'delete' %>
15
15
  <% end %>
16
16
  </div>
@@ -2,7 +2,7 @@
2
2
 
3
3
  <div class='file_name'>
4
4
  <%= link_to file.file_file_name, file.file.url, :target => '_blank', :class => 'filename' %>
5
- <%= link_to span_tag('x'), cms_admin_site_file_path(@site, file), :method => :delete, :remote => true, :confirm => t('.are_you_sure'), :class => 'delete' %>
5
+ <%= link_to span_tag('x'), cms_admin_site_file_path(@site, file), :method => :delete, :remote => true, :data => {:confirm => t('.are_you_sure')}, :class => 'delete' %>
6
6
  </div>
7
7
 
8
8
  <div class='file_info' data-url='<%= file.file.url %>'>
@@ -14,7 +14,7 @@
14
14
  </div>
15
15
  <div class='action_links'>
16
16
  <%= link_to t('.edit'), edit_cms_admin_site_file_path(@site, file) %>
17
- <%= link_to t('.delete'), cms_admin_site_file_path(@site, file), :method => :delete, :confirm => t('.are_you_sure') %>
17
+ <%= link_to t('.delete'), cms_admin_site_file_path(@site, file), :method => :delete, :data => {:confirm => t('.are_you_sure')} %>
18
18
  </div>
19
19
  <div class='label'>
20
20
  <%= link_to file.label, edit_cms_admin_site_file_path(@site, file) %>
@@ -10,7 +10,7 @@
10
10
  <div class='action_links'>
11
11
  <%= link_to t('.add_child_layout'), new_cms_admin_site_layout_path(@site, :parent_id => layout.id) %>
12
12
  <%= link_to t('.edit'), edit_cms_admin_site_layout_path(@site, layout) %>
13
- <%= link_to t('.delete'), cms_admin_site_layout_path(@site, layout), :method => :delete, :confirm => t('.are_you_sure') %>
13
+ <%= link_to t('.delete'), cms_admin_site_layout_path(@site, layout), :method => :delete, :data => {:confirm => t('.are_you_sure')} %>
14
14
  </div>
15
15
  <div class='label'>
16
16
  <%= link_to layout.label, edit_cms_admin_site_layout_path(@site, layout) %>
@@ -14,6 +14,7 @@
14
14
  <div class='page_form_extras'>
15
15
  <% unless @site.pages.count == 0 || @site.pages.root == @page%>
16
16
  <%= form.text_field :slug, :id => 'slug' %>
17
+ <%= form.text_field :full_path, :id => 'full-path', :disabled => true %>
17
18
  <% end %>
18
19
  <% if (options = Cms::Layout.options_for_select(@site)).present? %>
19
20
  <%= form.select :layout_id, options, {}, 'data-url' => form_blocks_cms_admin_site_page_path(@site, @page.id.to_i) %>
@@ -1,16 +1,40 @@
1
- <% block_tags = @page.tags(true).select{ |t| t.is_cms_block? }.uniq_by{|t| t.identifier} %>
1
+ <%
2
+ namespace = { }
3
+ tags = @page.tags(true).select{ |t| t.is_cms_block? }.uniq_by{|t| t.identifier}
4
+ tags.each do |tag|
5
+ namespace[tag.namespace || 'default'] ||= []
6
+ namespace[tag.namespace || 'default'] << tag
7
+ end
8
+ %>
2
9
 
3
10
  <div id='form_blocks'>
4
- <% if block_tags.empty? %>
11
+ <% if tags.empty? %>
5
12
  <div class='no_tags'>
6
13
  <%= link_to @page.layout.label, edit_cms_admin_site_layout_path(@site, @page.layout) %>
7
14
  <%= t('.no_tags').html_safe %>
8
15
  </div>
16
+
9
17
  <% else %>
10
18
  <%= fields_for :blocks, nil, :builder => ComfortableMexicanSofa::FormBuilder do |cms_blocks| %>
11
- <% block_tags.each_with_index do |tag, index| %>
12
- <%= cms_blocks.send(tag.class.to_s.demodulize.underscore, tag, index) rescue nil %>
13
- <% end %>
19
+ <div id='tag_namespaces'>
20
+ <% if namespace.size > 1 %>
21
+ <ul>
22
+ <% namespace.each do |name, tags| %>
23
+ <li><%= link_to name.humanize, "#ns-#{name}" %></li>
24
+ <% end %>
25
+ </ul>
26
+ <% end %>
27
+
28
+ <% index = 0 %>
29
+ <% namespace.each do |name, tags| %>
30
+ <div id="ns-<%= name %>">
31
+ <% tags.each do |tag| %>
32
+ <%= cms_blocks.send(tag.class.to_s.demodulize.underscore, tag, index) rescue nil %>
33
+ <% index += 1 %>
34
+ <% end %>
35
+ </div>
36
+ <% end %>
37
+ </div>
14
38
  <% end %>
15
39
  <% end %>
16
40
  </div>
@@ -23,7 +23,7 @@
23
23
  <div class='action_links'>
24
24
  <%= link_to t('.add_child_page'), new_cms_admin_site_page_path(@site, :parent_id => page.id) %>
25
25
  <%= link_to t('.edit'), edit_cms_admin_site_page_path(@site, page) %>
26
- <%= link_to t('.delete'), cms_admin_site_page_path(@site, page), :method => :delete, :confirm => t('.are_you_sure') %>
26
+ <%= link_to t('.delete'), cms_admin_site_page_path(@site, page), :method => :delete, :data => {:confirm => t('.are_you_sure')} %>
27
27
  </div>
28
28
  <div class='label'>
29
29
  <%= link_to page.label, edit_cms_admin_site_page_path(@site, page) %>
@@ -1,2 +1,3 @@
1
1
  $('#form_blocks').replaceWith('<%= escape_javascript(render(:partial => "form_blocks")) %>');
2
- $.CMS.enable_codemirror();
2
+ $.CMS.enable_codemirror();
3
+ $('#tag_namespaces').tabs();
@@ -9,7 +9,7 @@
9
9
  <div class='action_links'>
10
10
  <%= link_to t('.select'), cms_admin_site_pages_path(site) %>
11
11
  <%= link_to t('.edit'), edit_cms_admin_site_path(site) %>
12
- <%= link_to t('.delete'), cms_admin_site_path(site), :method => :delete, :confirm => t('.are_you_sure') %>
12
+ <%= link_to t('.delete'), cms_admin_site_path(site), :method => :delete, :data => {:confirm => t('.are_you_sure')} %>
13
13
  </div>
14
14
  <div class='label'>
15
15
  <%= link_to site.label, cms_admin_site_pages_path(site) %>
@@ -18,7 +18,7 @@
18
18
  </div>
19
19
  <div class='action_links'>
20
20
  <%= link_to t('.edit'), edit_cms_admin_site_snippet_path(@site, snippet) %>
21
- <%= link_to t('.delete'), cms_admin_site_snippet_path(@site, snippet), :method => :delete, :confirm => t('.are_you_sure') %>
21
+ <%= link_to t('.delete'), cms_admin_site_snippet_path(@site, snippet), :method => :delete, :data => {:confirm => t('.are_you_sure')} %>
22
22
  </div>
23
23
  <div class='label'>
24
24
  <%= link_to snippet.label, edit_cms_admin_site_snippet_path(@site, snippet) %>
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "comfortable_mexican_sofa"
8
- s.version = "1.6.23"
8
+ s.version = "1.6.24"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Oleg Khabarov", "The Working Group Inc"]
12
- s.date = "2012-07-12"
12
+ s.date = "2012-08-09"
13
13
  s.description = ""
14
14
  s.email = "oleg@theworkinggroup.ca"
15
15
  s.extra_rdoc_files = [
@@ -178,6 +178,7 @@ Gem::Specification.new do |s|
178
178
  "config/locales/es.yml",
179
179
  "config/locales/ja.yml",
180
180
  "config/locales/pt-BR.yml",
181
+ "config/locales/ru.yml",
181
182
  "config/locales/sv.yml",
182
183
  "config/locales/zh-CN.yml",
183
184
  "config/routes.rb",
@@ -323,7 +324,7 @@ Gem::Specification.new do |s|
323
324
  ]
324
325
  s.homepage = "http://github.com/comfy/comfortable-mexican-sofa"
325
326
  s.require_paths = ["lib"]
326
- s.rubygems_version = "1.8.21"
327
+ s.rubygems_version = "1.8.23"
327
328
  s.summary = "ComfortableMexicanSofa is a powerful CMS Engine for Ruby on Rails 3 applications"
328
329
 
329
330
  if s.respond_to? :specification_version then
@@ -0,0 +1,235 @@
1
+ # encoding: utf-8
2
+ ru:
3
+ # -- Models ---------------------------------------------------------------
4
+ attributes:
5
+ label: Название
6
+ slug: Ссылка
7
+ parent_id: Родитель
8
+ content: Контент
9
+ identifier: Идентификатор
10
+ activerecord:
11
+ models:
12
+ cms/site: Сайт
13
+ cms/layout: Шаблон
14
+ cms/page: Страница
15
+ cms/snippet: Сниппет
16
+ cms/file: Файл
17
+ attributes:
18
+ cms/site:
19
+ identifier: Идентификатор
20
+ hostname: Имя хоста
21
+ path: Путь
22
+ locale: Язык
23
+ is_mirrored: Синхронизирован с другими сайтами
24
+ cms/layout:
25
+ identifier: Идентификатор
26
+ label: Название шаблона
27
+ app_layout: Шаблон приложения
28
+ parent_id: Родительский шаблон
29
+ css: CSS
30
+ js: Javascript
31
+ cms/page:
32
+ label: Название
33
+ layout_id: Шаблон
34
+ slug: Ссылка
35
+ target_page_id: Редирект на страницу
36
+ is_published: Опубликована
37
+ cms/file:
38
+ file: Файл
39
+ description: Описание
40
+ cms/snippet:
41
+ identifier: Идентификатор
42
+
43
+ # -- Controllers ----------------------------------------------------------
44
+ cms:
45
+ base:
46
+ site_not_found: Сайт не найден
47
+ fixtures_enabled: CMS Fixtures включены. Все изменения, сделанные здесь, будут отменены.
48
+
49
+ sites:
50
+ created: Сайт создан
51
+ creation_failure: Не удалось создать сайт
52
+ updated: Сайт обновлен
53
+ update_failure: Не удалось обновить сайт
54
+ deleted: Сайт удален
55
+ not_found: Сайт не найден
56
+
57
+ layouts:
58
+ created: Шаблон создан
59
+ creation_failure: Не удалось создать шаблон
60
+ updated: Шаблон обновлен
61
+ update_failure: Не удалось обновить шаблон
62
+ deleted: Шаблон удален
63
+ not_found: Шаблон не найден
64
+
65
+ pages:
66
+ created: Страница создана
67
+ creation_failure: Не удалось создать страницу
68
+ updated: Страница обновлена
69
+ update_failure: Не удалось обновить страницу
70
+ deleted: Страница удалена
71
+ not_found: Страница не найдена
72
+ layout_not_found: Шаблоны не найдены. Пожалуйста, создайте хотя бы один шаблон.
73
+
74
+ snippets:
75
+ created: Сниппет создан
76
+ creation_failure: Не удалось создать сниппет
77
+ updated: Сниппет обновлен
78
+ update_failure: Не удалось обновить сниппет
79
+ deleted: Сниппет удален
80
+ not_found: Сниппет не найден
81
+
82
+ revisions:
83
+ reverted: Контент возвращен в прежнее состояние
84
+ record_not_found: Запись не найдена
85
+ not_found: Ревизия не найдена
86
+
87
+ files:
88
+ created: Файлы загружены
89
+ creation_failure: Не удалось загрузить файлы
90
+ updated: Файл обновлен
91
+ update_failure: Не удалось обновить файл
92
+ deleted: Файл удален
93
+ not_found: Файл не найден
94
+
95
+ content:
96
+ site_not_found: Сайт не найден
97
+ layout_not_found: Шаблон не найден
98
+ page_not_found: Страница не найдена
99
+
100
+ # -- Views ----------------------------------------------------------------
101
+ cms_admin:
102
+ base:
103
+ sites: Сайты
104
+ layouts: Шаблоны
105
+ pages: Страницы
106
+ snippets: Сниппеты
107
+ files: Файлы
108
+
109
+ sites:
110
+ index:
111
+ title: Сайты
112
+ new_link: Создать новый сайт
113
+ select: Выбрать сайт
114
+ edit: Редактировать
115
+ delete: Удалить
116
+ are_you_sure: Вы уверены, что хотите удалить этот сайт?
117
+ new:
118
+ title: Новый сайт
119
+ edit:
120
+ title: Редактирование сайта
121
+ form:
122
+ create: Создать сайт
123
+ update: Обновить сайт
124
+
125
+ layouts:
126
+ index:
127
+ title: Шаблоны
128
+ new_link: Создать новый шаблон
129
+ index_branch:
130
+ add_child_layout: Добавить дочерний шаблон
131
+ edit: Редактировать
132
+ delete: Удалить
133
+ are_you_sure: Вы уверены?
134
+ new:
135
+ title: Новый шаблон
136
+ edit:
137
+ title: Редактирование шаблона
138
+ revision: Ревизия
139
+ form:
140
+ select_parent_layout: Выбрать родительский шаблон
141
+ select_app_layout: Выбрать шаблон приложения
142
+ create: Создать шаблон
143
+ update: Обновить шаблон
144
+
145
+ pages:
146
+ index:
147
+ title: Страницы
148
+ new_link: Создать новую страницу
149
+ index_branch:
150
+ toggle: Toggle
151
+ add_child_page: Добавить дочернюю страницу
152
+ edit: Редактировать
153
+ delete: Удалить
154
+ are_you_sure: Вы уверены?
155
+ new:
156
+ title: Новая страница
157
+ edit:
158
+ title: Редактирование страницы
159
+ revision: Ревизия
160
+ form:
161
+ select_target_page: Без редиректа
162
+ preview: Предпросмотр
163
+ create: Создать страницу
164
+ update: Обновить страницу
165
+ form_blocks:
166
+ no_tags: |-
167
+ Шаблон не содержит ни одного контент-тега.<br/>
168
+ Отредактируйте контент, вставив тег страницы или поля. Например: <code>{{cms:page:content}}</code>
169
+
170
+ snippets:
171
+ index:
172
+ title: Сниппеты
173
+ new_link: Создать новый сниппет
174
+ edit: Редактировать
175
+ delete: Удалить
176
+ are_you_sure: Вы уверены?
177
+ new:
178
+ title: Новый сниппет
179
+ edit:
180
+ title: Редактирование сниппета
181
+ revision: Ревизия
182
+ form:
183
+ create: Создать сниппет
184
+ update: Обновить сниппет
185
+
186
+ revisions:
187
+ show:
188
+ title: Ревизии для
189
+ revision: Ревизия
190
+ full_path: Полный путь
191
+ slug: Ссылка
192
+ update: Обновить до этой ревизии
193
+ current: Текущая
194
+
195
+ files:
196
+ index:
197
+ title: Файлы
198
+ new_link: Загрузить новый файл
199
+ edit: Редактировать
200
+ delete: Удалить
201
+ are_you_sure: Вы уверены?
202
+ button: Загрузить файлы
203
+ new:
204
+ title: Новый файл
205
+ edit:
206
+ title: Редактирование файла
207
+ form:
208
+ current_file: Текущий файл
209
+ create: Загрузить файл
210
+ update: Обновить файл
211
+ page_form:
212
+ are_you_sure: Вы уверены?
213
+ file:
214
+ are_you_sure: Вы уверены?
215
+
216
+ categories:
217
+ index:
218
+ label: Категории
219
+ edit: Редактировать
220
+ done: Применить
221
+ all: Все
222
+ add: Добавить
223
+ show:
224
+ are_you_sure: Вы уверены?
225
+ edit:
226
+ save: Сохранить
227
+ form:
228
+ label: Категории
229
+
230
+ dialogs:
231
+ image:
232
+ insert: Вставить изображение
233
+ link:
234
+ create: Создать ссылку
235
+