hobo 0.8.10 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/CHANGES.txt +126 -2
  2. data/Rakefile +4 -1
  3. data/bin/hobo +1 -1
  4. data/doctest/scopes.rdoctest +11 -4
  5. data/dryml_generators/rapid/cards.dryml.erb +8 -2
  6. data/dryml_generators/rapid/forms.dryml.erb +5 -4
  7. data/dryml_generators/rapid/pages.dryml.erb +150 -65
  8. data/lib/hobo.rb +1 -1
  9. data/lib/hobo/accessible_associations.rb +2 -0
  10. data/lib/hobo/authentication_support.rb +1 -1
  11. data/lib/hobo/controller.rb +11 -3
  12. data/lib/hobo/dryml/dryml_doc.rb +1 -1
  13. data/lib/hobo/fake_initializer.rb +14 -0
  14. data/lib/hobo/hobo_helper.rb +94 -6
  15. data/lib/hobo/lifecycles.rb +17 -2
  16. data/lib/hobo/lifecycles/lifecycle.rb +1 -1
  17. data/lib/hobo/lifecycles/transition.rb +12 -4
  18. data/lib/hobo/model.rb +25 -22
  19. data/lib/hobo/model_controller.rb +42 -37
  20. data/lib/hobo/model_router.rb +11 -7
  21. data/lib/hobo/permissions.rb +12 -10
  22. data/lib/hobo/permissions/associations.rb +1 -1
  23. data/lib/hobo/static_tags +21 -0
  24. data/lib/hobo/user.rb +7 -3
  25. data/lib/hobo/user_controller.rb +7 -7
  26. data/lib/hobo/view_hints.rb +10 -3
  27. data/rails_generators/hobo/USAGE +4 -0
  28. data/rails_generators/hobo_admin_site/USAGE +16 -0
  29. data/rails_generators/hobo_front_controller/hobo_front_controller_generator.rb +11 -2
  30. data/rails_generators/hobo_front_controller/templates/controller.rb +6 -0
  31. data/rails_generators/hobo_front_controller/templates/summary.dryml +103 -0
  32. data/rails_generators/hobo_model_resource/USAGE +38 -0
  33. data/rails_generators/hobo_rapid/USAGE +3 -0
  34. data/rails_generators/hobo_rapid/templates/hobo-rapid.js +7 -3
  35. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +4 -0
  36. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +5 -0
  37. data/rails_generators/hobo_subsite/USAGE +16 -0
  38. data/rails_generators/hobo_subsite/hobo_subsite_generator.rb +1 -1
  39. data/rails_generators/hobo_user_controller/templates/controller.rb +2 -2
  40. data/rails_generators/hobo_user_model/templates/model.rb +6 -1
  41. data/taglibs/rapid.dryml +1 -0
  42. data/taglibs/rapid_core.dryml +4 -4
  43. data/taglibs/rapid_forms.dryml +29 -21
  44. data/taglibs/rapid_generics.dryml +3 -1
  45. data/taglibs/rapid_lifecycles.dryml +14 -9
  46. data/taglibs/rapid_navigation.dryml +1 -1
  47. data/taglibs/rapid_plus.dryml +1 -0
  48. data/taglibs/rapid_summary.dryml +300 -0
  49. data/taglibs/rapid_support.dryml +1 -1
  50. data/taglibs/rapid_user_pages.dryml +21 -19
  51. data/test/permissions/test_permissions.rb +1 -1
  52. metadata +12 -4
@@ -1,4 +1,128 @@
1
- === Hobo 0.8.10 ==
1
+ === Upgrading to a new version of Hobo ===
2
+
3
+ Once you have installed a new version of Hobo, you may wish to run
4
+
5
+ rake hobo:run_standard_generators
6
+
7
+ This will run all of the standard generators, and pull in any bug
8
+ fixes or enhancements to generated code. Note that this is quite
9
+ likely to cause conflicts, so it is highly recommended that you have
10
+ your code backed up and in a change control system such as git or
11
+ subversion.
12
+
13
+ === Hobo 0.9.0 ===
14
+
15
+ Major enhancements:
16
+
17
+ - Internationalization! Through the hard work of soey and Spiralis,
18
+ we now have internationalization support in Hobo. The manual
19
+ page is on the
20
+ [cookbook](http://cookbook.hobocentral.net/manual/i18n). Locales
21
+ are available on
22
+ [github](http://github.com/Spiralis/hobo-i18n-locales).
23
+
24
+ - Index generation: Matt Jones' automatic index generation code has
25
+ been merged. The default Rails index names are very long, so this
26
+ is unlikely to work well on Oracle, which has a 30 character
27
+ limit. Testing against Postgres, Oracle, SQL Server and JDBC has
28
+ been extremely limited. To generate indices run script/generate
29
+ hobo_migration.
30
+
31
+ - New projects now have a summary page on /front/summary that
32
+ provides application information to the administrator. Current
33
+ projects may add this action by running the
34
+ `hobo_front_controller` generator.
35
+
36
+ - STI derived classes can add additional fields to their parent
37
+ class with the fields block. Note that the "can't generate a
38
+ migration for STI base and derived classes all at once" issue
39
+ still applies. In general, STI handling should now work much
40
+ better.
41
+
42
+ - [Bug 464](https://hobo.lighthouseapp.com/projects/8324/tickets/464-transition-buttons-should-have-a-option-to-link-to-forms-instead-for-transitions-that-take-parameters)
43
+ The transition-buttons tag now generates buttons that link to the
44
+ transition page for transitions that require parameters.
45
+
46
+ - [Bug 532](https://hobo.lighthouseapp.com/projects/8324/tickets/532)
47
+ In previous versions, you had to add the new HTML5 tags to
48
+ RAILS_ROOT/config/dryml_static_tags.txt. This version whitelists
49
+ all HTML5 tags except for aside, section, header and footer, which
50
+ conflict with existing Rapid tags.
51
+
52
+ Major bug fixes:
53
+
54
+ - [Bug 530](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/530)
55
+ is a critical bug for invite-only projects. To incorporate the
56
+ fix, you must rerun your generators or follow the instructions in
57
+ the [commit](http://github.com/tablatom/hobo/commit/17247eac8a78f8b36dcc3b9684a3e4ec8da32a23)
58
+
59
+ - [Bug
60
+ 480](https://hobo.lighthouseapp.com/projects/8324/tickets/480-find_owner_and_association-method-for-has_many-associations)
61
+ Owner actions now work with has_many associations
62
+
63
+ - [Bug 516](https://hobo.lighthouseapp.com/projects/8324/tickets/516-association-name-as-parameter-in-lifecycle-step-almost-works)
64
+ Specifying a belongs_to association as a lifecycle param works; it appears as a select-one on the generated page.
65
+
66
+ - [Bug 515](https://hobo.lighthouseapp.com/projects/8324/tickets/515-virtual-boolean-field-uninitialized-constant-hobobooleancolumn_type)
67
+ Virtual :boolean fields declared with attr_accessor now work
68
+
69
+ - [Bug 484](https://hobo.lighthouseapp.com/projects/8324/tickets/484-transition-actions-with-key-fail-if-model-isnt-visible-to-guests)
70
+ Transition actions that require a key no longer check if the model is visible to Guest
71
+
72
+ - [Bug 485](https://hobo.lighthouseapp.com/projects/8324/tickets/485-make-lifecycles-on-sti-subclasses-behave)
73
+ Lifecycle support on STI models works now. Note that derived classes DO NOT inherit any of the parent lifecycle implementation.
74
+
75
+ - [Bug 387](https://hobo.lighthouseapp.com/projects/8324/tickets/387-inheritance-sti-models-name-not-propagating)
76
+ STI derived classes now inherit settings like name_attribute correctly.
77
+
78
+ - [Bug 533](https://hobo.lighthouseapp.com/projects/8324/tickets/533-remove-id-from-hidden-field-for-check-box)
79
+ The hidden field generated with a checkbox input shouldn't have an ID.
80
+
81
+ - [Bug 526](https://hobo.lighthouseapp.com/projects/8324/tickets/526-routing-error-does-not-render-not-found-page)
82
+ Routing errors now render not-found-page, rather than the default Rails routing error message.
83
+
84
+ Minor Enhancements:
85
+
86
+ - Aside collections now have a new-link at the bottom (inside the
87
+ preview-with-more)
88
+ [#421](https://hobo.lighthouseapp.com/projects/8324/tickets/421-auto_actions_for-doesnt-create-add-button-in-sidebar)
89
+
90
+ - the manual now includes a Generators section, and a subsite
91
+ tutorial has been added.
92
+
93
+ - [Bug
94
+ 386](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/386)
95
+ and [Bug
96
+ 501](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/501)
97
+ have been fixed, reducing the number of extraneous migrations that
98
+ the hobo_migration generator creates. These are actually Rails
99
+ and/or database bugs we're working around. For instance, MySQL
100
+ does not allow default values for text columns, so Rails silently
101
+ ignores them. SQLite does not allow scale or precision settings on
102
+ decimal fields. These types of bugs are good reasons why you
103
+ should use the same type of database for development, testing and
104
+ production.
105
+
106
+ - A new view_hint, 'inline_booleans', controls whether boolean attributes are displayed in the header (default behavior
107
+ of Rapid show pages) or inline with the rest of the field-list. You can either pass a list of field names, or 'true'
108
+ (without quotes) to make all booleans inline.
109
+
110
+ - hobo_show now accepts a model instance as a first parameter. This restores symmetry with the other hobo_* actions.
111
+
112
+ - on Rails 2.3 and above, routes will be generated with the optional .:format suffix, and the formatted_* routes are skipped.
113
+
114
+ - non-required fields that are marked :unique will now allow nil
115
+ values.
116
+
117
+ Minor Bug Fixes
118
+
119
+ - [Bug 540](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/540)
120
+ Hobo::Permissions::Associations::HasManyThroughAssociations#create!
121
+ did not save as the "!" implied.
122
+
123
+ See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.9.0)
124
+
125
+ === Hobo 0.8.10 ===
2
126
 
3
127
  This is a brown paper bag release. The fix for Bug 473 was not
4
128
  properly tested. Thanks Iain Beeston for quickly sending us a patch.
@@ -35,7 +159,7 @@ Major bug fixes:
35
159
 
36
160
  Minor bug fixes and enhancements:
37
161
 
38
- See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.8.5)
162
+ See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.8.9)
39
163
 
40
164
  === Hobo 0.8.8 ===
41
165
 
data/Rakefile CHANGED
@@ -9,6 +9,9 @@ $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), '/../hobofields/l
9
9
  $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), '/../hobosupport/lib')
10
10
  require 'hobo'
11
11
 
12
+ RUBY = ENV['RUBY'] || (defined?(JRUBY_VERSION) ? 'jruby' : 'ruby')
13
+ RUBYDOCTEST = ENV['RUBYDOCTEST'] || "#{RUBY} `which rubydoctest`"
14
+
12
15
  desc "Default Task"
13
16
  task :default => [ :test ]
14
17
 
@@ -26,7 +29,7 @@ namespace "test" do
26
29
  desc "Run the doctests"
27
30
  task :doctest do |t|
28
31
  # note, tests in doctest/hobo/ are out of date
29
- exit(1) if !system("rubydoctest doctest/*.rdoctest")
32
+ exit(1) if !system("#{RUBYDOCTEST} doctest/*.rdoctest")
30
33
  end
31
34
  end
32
35
 
data/bin/hobo CHANGED
@@ -17,7 +17,7 @@ Options:
17
17
  -d | --database <database> # e.g. mysql, sqlite
18
18
  -r | --rails <version> # rails version to use
19
19
  -n | --no-rails # don't run 'rails'. Assumes app-path=='.'
20
- --invite-only # add features for an invite-ony website (admin site, no signup)
20
+ --invite-only # add features for an invite-only website (admin site, no signup)
21
21
  "
22
22
 
23
23
 
@@ -50,12 +50,17 @@ First off we need to configure ActiveSupport for auto-loading
50
50
  We also need to get ActiveRecord set up with a database connection
51
51
  {.hidden}
52
52
 
53
+ >> mysql_adapter = defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql'
54
+ >> mysql_user = 'root'; mysql_password = ''
55
+ >> mysql_login = "-u #{mysql_user} --password='#{mysql_password}'"
53
56
  >> mysql_database = "hobofields_doctest"
54
- >> system "mysqladmin --force drop #{mysql_database} 2> /dev/null"
55
- >> system("mysqladmin create #{mysql_database}") or raise "could not create database"
56
- >> ActiveRecord::Base.establish_connection(:adapter => "mysql",
57
+ >> system "mysqladmin #{mysql_login} --force drop #{mysql_database} 2> /dev/null"
58
+ >> system("mysqladmin #{mysql_login} create #{mysql_database}") or raise "could not create database"
59
+ >> ActiveRecord::Base.establish_connection(:adapter => mysql_adapter,
57
60
  :database => mysql_database,
58
- :host => "localhost")
61
+ :host => "localhost",
62
+ :username => mysql_user,
63
+ :password => mysql_password)
59
64
  {.hidden}
60
65
 
61
66
  Some load path manipulation:
@@ -69,6 +74,8 @@ Some load path manipulation:
69
74
  And we'll require hobo:
70
75
  {.hidden}
71
76
 
77
+ >> require 'will_paginate'
78
+ >> require 'will_paginate/finder'
72
79
  >> require 'hobosupport'
73
80
  >> require 'hobofields'
74
81
  >> require 'hobo'
@@ -18,6 +18,8 @@ has_actions = edit_link || delete_button
18
18
  has_body = (!show_link && description_attribute) || creator_link || creator_attribute || primary_collection
19
19
 
20
20
  show_title = !show_link && (name_attribute || !has_body)
21
+
22
+ model_key = model.name.pluralize.underscore
21
23
  -%>
22
24
  <def tag="card" for="<%= model.name %>">
23
25
  <card class="<%= model_name :dashed %>" param="default" merge>
@@ -29,7 +31,9 @@ show_title = !show_link && (name_attribute || !has_body)
29
31
  <% if has_actions -%>
30
32
  <div param="actions">
31
33
  <% if edit_link -%>
32
- <a action="edit" if="&can_edit?" param="edit-link">Edit</a>
34
+ <a action="edit" if="&can_edit?" param="edit-link">
35
+ <ht key="<%= model_key %>.actions.edit">Edit</ht>
36
+ </a>
33
37
  <% end -%>
34
38
  <% if delete_button -%>
35
39
  <delete-button label="X" param/>
@@ -49,7 +53,9 @@ show_title = !show_link && (name_attribute || !has_body)
49
53
  <view:<%= creator_attribute %> param="creator"/>
50
54
  <% end -%>
51
55
  <% if primary_collection -%>
52
- <count:<%= primary_collection%> param/>
56
+ <ht key="<%= primary_collection.to_s.pluralize.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
57
+ <count:<%= primary_collection%> param/>
58
+ </ht>
53
59
  <% end -%>
54
60
  </body:>
55
61
  <% end -%>
@@ -4,13 +4,14 @@ form_fields = standard_fields :belongs_to, :has_many
4
4
 
5
5
  cancel_to_show_page = linkable?(:show)
6
6
  cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
7
+ model_key = model_name.pluralize.underscore
7
8
  -%>
8
9
  <def tag="form" for="<%= model.name %>">
9
10
  <form merge param="default">
10
11
  <error-messages param/>
11
12
  <field-list fields="<%= form_fields * ', ' %>" param/>
12
13
  <div param="actions">
13
- <submit label="Save" param/><or-cancel param="cancel"/>
14
+ <submit label="#{ht '<%= model_key %>.actions.save', :default=>['Save']}" param/><or-cancel param="cancel"/>
14
15
  </div>
15
16
  </form>
16
17
  </def>
@@ -22,7 +23,7 @@ cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
22
23
  <error-messages param/>
23
24
  <field-list fields="<%= creator.parameters * ', ' %>" param/>
24
25
  <div param="actions">
25
- <submit label="<%= creator.name.to_s.titleize %>" param/><or-cancel param="cancel"/>
26
+ <submit label="#{ht '<%= model_key %>.actions.<%= creator.name.to_s %>', :default=>['<%= creator.name.to_s.titleize %>']}" param/><or-cancel param="cancel"/>
26
27
  </div>
27
28
  </form>
28
29
  </def>
@@ -36,10 +37,10 @@ cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
36
37
  <input type="hidden" name="key" value="&this.lifecycle.provided_key" if="&this.lifecycle.provided_key"/>
37
38
  <field-list fields="<%= transition.parameters * ', ' %>" param/>
38
39
  <div param="actions">
39
- <submit label="<%= transition.name.to_s.titleize %>" param/><or-cancel param="cancel"/>
40
+ <submit label="#{ht '<%= model_key %>.actions.<%= transition.name.to_s %>', :default=>['<%= transition.name.to_s.titleize %>']}" param/><or-cancel param="cancel"/>
40
41
  </div>
41
42
  </form>
42
43
  </def>
43
44
  <% end -%>
44
45
 
45
- <% end # of each_model do -%>
46
+ <% end # of each_model do -%>
@@ -12,29 +12,38 @@
12
12
 
13
13
 
14
14
  <% each_controller do -%>
15
-
15
+
16
16
  <!-- ====== <%= model.name %> Pages ====== -->
17
17
  <%
18
18
  new_link = linkable?(:new)
19
19
  new_form = !new_link && linkable?(model, :create, :method => :post)
20
+ model_key = model_name.pluralize.underscore
20
21
  -%>
21
22
 
22
-
23
23
  <def tag="index-page" for="<%= model.name %>">
24
- <page merge title="<%= model_name :title, :plural %>">
24
+ <page merge title="#{ht '<%= model_key %>.index.title', :default=>['<%= model_name :title, :plural %>'] }">
25
25
  <body: class="index-page <%= model_class %>" param/>
26
-
26
+
27
27
  <content: param>
28
28
  <header param="content-header">
29
- <h2 param="heading"><%= model_name :title, :plural %></h2>
30
-
31
- <p param="count" if>There <count prefix="are"/></p>
29
+ <h2 param="heading">
30
+ <ht key="<%= model_key %>.index.heading">
31
+ <%= model_name :title, :plural %>
32
+ </ht>
33
+ </h2>
34
+
35
+ <p param="count" if>
36
+ <ht key="<%= model_key %>.collection.count" count="&this.size">
37
+ There <count prefix="are"/>
38
+ </ht>
39
+ </p>
32
40
  </header>
33
-
41
+
34
42
  <section param="content-body">
35
43
  <% if new_link -%>
36
-
37
- <a action="new" to="&model" param="new-link"/>
44
+ <a action="new" to="&model" param="new-link">
45
+ <ht key="<%= model_key %>.actions.new">New <%=model_name :title %></ht>
46
+ </a>
38
47
  <% end -%>
39
48
 
40
49
  <% if view_hints.paginate? -%>
@@ -54,7 +63,9 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
54
63
 
55
64
  <% if new_form -%>
56
65
  <div param="new-form">
57
- <h3 param="new-form-heading">New <%= model_name :title %></h3>
66
+ <h3 param="new-form-heading">
67
+ <ht key="<%= model_key %>.form.new.heading">New <%= model_name :title %></ht>
68
+ </h3>
58
69
  <form with="&@invalid_record || new_for_current_user(<%= model %>)" param/>
59
70
  </div>
60
71
 
@@ -66,17 +77,21 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
66
77
 
67
78
 
68
79
  <def tag="new-page" for="<%= model.name %>">
69
- <page merge title="New <%= model_name :title %>">
80
+ <page merge title="#{ht '<%= model_key %>.new.title', :default=>['New <%=model_name :title %>'] }">
70
81
  <body: class="new-page <%= model_class %>" param/>
71
-
82
+
72
83
  <content: param>
73
84
  <section param="content-header">
74
- <h2 param="heading">New <%= model_name :title %></h2>
85
+ <h2 param="heading">
86
+ <ht key="<%= model_key %>.new.heading">
87
+ New <%= model_name :title %>
88
+ </ht>
89
+ </h2>
75
90
  </section>
76
-
91
+
77
92
  <section param="content-body">
78
93
  <form param>
79
- <submit: label="Create <%= model_name :title %>"/>
94
+ <submit: label="#{ht '<%= model_key %>.actions.create', :default=>['Create <%= model_name :title %>']}"/>
80
95
  </form>
81
96
  </section>
82
97
  </content:>
@@ -86,7 +101,7 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
86
101
 
87
102
  <%
88
103
  back_link = model.dependent_on.detect { |x| !(model.reflections[x].klass < Hobo::User) }
89
- boolean_fields = model.columns.select { |c| c.type == :boolean }.*.name
104
+ boolean_fields = model.columns.select { |c| c.type == :boolean }.*.name - model.view_hints.inline_booleans
90
105
  creator = model.creator_attribute
91
106
  creator_link = creator && model.reflections[creator] && linkable?(model.reflections[creator].klass, :show)
92
107
  edit_link = linkable?(:edit)
@@ -111,7 +126,7 @@ unless model.view_hints.secondary_children.empty?
111
126
  end
112
127
  -%>
113
128
  <def tag="show-page" for="<%= model.name %>">
114
- <page merge title="<%= model_name :title %>">
129
+ <page merge title="#{ht '<%=model_key %>.show.title', :default=>['<%=model_name :title %>'] }">
115
130
 
116
131
  <body: class="show-page <%= model_class %>" param/>
117
132
 
@@ -121,10 +136,14 @@ end
121
136
  <section param="main-content">
122
137
  <% end -%>
123
138
  <header param="content-header">
124
- <% if back_link -%>
125
- <a:<%= back_link %> param="parent-link">&laquo; <name/></a:<%= back_link %>>
139
+ <% if back_link -%>
140
+ <a:<%= back_link %> param="parent-link">&laquo; <ht key="<%= model_key %>.actions.back" to="<%= back_link %>"><name/></ht></a:<%= back_link %>>
126
141
  <% end -%>
127
- <h2 param="heading"><name/></h2>
142
+ <h2 param="heading">
143
+ <ht key="<%= model_key %>.show.heading" name="&this.respond_to?(:name) ? this.name : ''">
144
+ <name/>
145
+ </ht>
146
+ </h2>
128
147
  <% if boolean_fields -%>
129
148
 
130
149
  <record-flags fields="<%= boolean_fields * ', ' %>" param/>
@@ -132,16 +151,20 @@ end
132
151
  <% if creator_link -%>
133
152
 
134
153
  <a:<%= model.creator_attribute %> param="creator-link"/>
135
- <% elsif creator -%>
154
+ <% elsif creator -%>
136
155
 
137
156
  <view:get-creator param="creator-name"/>
138
157
  <% end -%>
139
158
  <% if edit_link -%>
140
159
 
141
- <a action="edit" if="&can_edit?" param="edit-link">Edit <%= model_name :title %></a>
160
+ <a action="edit" if="&can_edit?" param="edit-link">
161
+ <ht key="<%= model_key %>.actions.edit" name="&this.respond_to?(:name) ? this.name : ''">
162
+ Edit <%= model_name :title %>
163
+ </ht>
164
+ </a>
142
165
  <% end -%>
143
166
  </header>
144
-
167
+
145
168
  <section param="content-body"<%= ' with-flash-messages' if aside_collections %>>
146
169
  <% if main_content -%>
147
170
  <view:<%= main_content %> param="description"/>
@@ -151,8 +174,12 @@ end
151
174
  <% end -%>
152
175
  <% if collection -%>
153
176
  <section param="collection-section">
154
- <h3 param="collection-heading"><%= '<Your/>' if is_user_model %><%= collection.to_s.titleize %></h3>
155
-
177
+ <h3 param="collection-heading">
178
+ <ht key="<%= model_key %>.collection.heading.<%= (is_user_model ? 'your':'other') %>" >
179
+ <%= '<Your/>' if is_user_model %><%= collection.to_s.titleize %>
180
+ </ht>
181
+ </h3>
182
+
156
183
  <% if sortable_collection?(collection) -%>
157
184
  <sortable-collection:<%= collection %> param="collection"/>
158
185
  <% else -%>
@@ -160,14 +187,22 @@ end
160
187
  <% end -%>
161
188
  <% if add_link -%>
162
189
 
163
- <a:<%= collection %> action="new" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)" param="new-link">New <%= collection.to_s.singularize.titleize %></a:<%= collection %>>
190
+ <a:<%= collection %> action="new" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)" param="new-link">
191
+ <ht key="<%= collection.to_s.pluralize %>.actions.new">
192
+ New <%= collection.to_s.singularize.titleize %>
193
+ </ht>
194
+ </a:<%= collection %>>
164
195
  <% elsif add_form -%>
165
196
 
166
197
  <section param="add-to-collection" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)">
167
- <h3 param="add-form-heading">Add <%= a_or_an collection.to_s.singularize.titleize %></h3>
198
+ <h3 param="add-form-heading">
199
+ <ht key="<%= collection.to_s.pluralize %>.collection.add_form_heading">
200
+ Add <%= a_or_an collection.to_s.singularize.titleize %>
201
+ </ht>
202
+ </h3>
168
203
  <form with="&@<%= collection_class.name.underscore %> || new_for_current_user(@<%= model_name.underscore %>.<%= collection %>)" owner="<%= owner %>" without-cancel param>
169
204
  <field-list: skip="<%= owner %>"/>
170
- <submit: label="Add"/>
205
+ <submit: label="#{ht '<%= collection.to_s.pluralize %>.actions.add', :default=>['Add'] }"/>
171
206
  </form>
172
207
  </section>
173
208
  <% end -%>
@@ -176,19 +211,29 @@ end
176
211
  </section>
177
212
  <% if aside_collections -%>
178
213
  </section>
179
-
214
+
180
215
  <aside param>
181
216
  <% for refl, reverse_refl in aside_collections -%>
182
217
  <% if linkable?(refl.klass, :"index_for_#{reverse_refl.name}") -%>
183
218
  <preview-with-more:<%= refl.name %>.recent param="<%= refl.name %>-preview">
184
219
  <% if is_user_model -%>
185
- <heading:><Your with="&@<%= model_name.underscore %>"/> <%= refl.name.to_s.titleize %></heading:>
220
+ <heading:>
221
+ <ht key="hobo.undefined">
222
+ <Your with="&@<%= model_name.underscore %>"/> <%= refl.name.to_s.titleize %>
223
+ </ht>
224
+ </heading:>
186
225
  <% end -%>
187
- <more:>more</more:>
226
+ <more:>
227
+ <ht key="hobo.actions.more">more</ht>
228
+ </more:>
188
229
  </preview-with-more:<%= refl.name %>.recent>
189
230
  <% else -%>
190
231
  <section param="<%= refl.name %>-collection-section">
191
- <h3 param="<%= refl.name %>-collection-heading"><%= refl.name.to_s.titleize %></h3>
232
+ <h3 param="<%= refl.name %>-collection-heading">
233
+ <ht key="<%= refl.name.to_s.pluralize %>.collection.heading.other" >
234
+ <%= refl.name.to_s.titleize %>
235
+ </ht>
236
+ </h3>
192
237
  <collection:<%= refl.name %> param="<%= refl.name %>-collection"/>
193
238
  </section>
194
239
  <% end -%>
@@ -197,7 +242,7 @@ end
197
242
  </section-group>
198
243
  <% end -%>
199
244
  </content:>
200
-
245
+
201
246
  </page>
202
247
  </def>
203
248
 
@@ -206,21 +251,25 @@ end
206
251
  name_attribute = model.name_attribute
207
252
  -%>
208
253
  <def tag="edit-page" for="<%= model.name %>">
209
- <page merge title="Edit <%= model_name :title %>">
254
+ <page merge title="#{ht '<%= model_key %>.edit.title', :default=>['Edit <%=model_name :title %>'] }">
210
255
 
211
256
  <body: class="edit-page <%= model_class %>" param/>
212
257
 
213
258
  <content:>
214
259
  <section param="content-header">
215
- <h2 param="heading">Edit <type-name/></h2>
216
- <delete-button label="Remove This <%= model_name :title %>" param/>
260
+ <h2 param="heading">
261
+ <ht key="<%= model_key %>.edit.heading" name="&this.respond_to?(:name) ? this.name : ''">
262
+ Edit <type-name/>
263
+ </ht>
264
+ </h2>
265
+ <delete-button label="#{ht '<%= model_key %>.actions.delete', :default=>['Remove This <%= model_name :title %>']}" param/>
217
266
  </section>
218
267
 
219
268
  <section param="content-body">
220
269
  <form param/>
221
270
  </section>
222
271
  </content:>
223
-
272
+
224
273
  </page>
225
274
  </def>
226
275
 
@@ -241,33 +290,53 @@ new_link = :new.in?(actions)
241
290
  -%>
242
291
  <def tag="index-for-<%= owner.dasherize %>-page" polymorphic/>
243
292
  <def tag="index-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
244
- <page merge title="<%= model_name :title, :plural %> for #{name :with => @<%= owner %>, :no_wrapper => true}">
293
+ <page merge title="#{ht '<%= model_key %>.index_for_owner.title', :default=>['<%=model_name :title, :plural %> for']} #{name :with => @<%= owner %>, :no_wrapper => true}">
245
294
  <body: class="index-for-owner-page <%= owner.dasherize %> <%= model_class %>" param/>
246
-
247
295
  <content: param>
248
296
  <header param="content-header">
249
297
  <% if linkable_owner -%>
250
- <div param="back-to">Back to <a with="&@<%= owner %>"/></div>
298
+ <div param="back-to">
299
+ <ht key="hobo.actions.back">Back to</ht> <a with="&@<%= owner %>"/>
300
+ </div>
251
301
  <% end -%>
252
302
  <% if owner_is_user %>
253
- <h2 param="heading"><Your with="&@<%= owner %>"/> <%= model_name :title, :plural %></h2>
303
+ <h2 param="heading">
304
+ <ht key="<%= model_key %>.index_for_owner.heading.your">
305
+ <Your with="&@<%= owner %>"/> <%= model_name :title, :plural %>
306
+ </ht>
307
+ </h2>
254
308
  <% else -%>
255
- <h2 param="heading"><%= model_name :title, :plural %></h2>
256
- <h3 param="subheading">For: <<%= owner_tag %> with="&@<%= owner %>"/></h3>
309
+ <h2 param="heading">
310
+ <ht key="<%= model_key %>.index_for_owner.heading.other">
311
+ <%= model_name :title, :plural %>
312
+ </ht>
313
+ </h2>
314
+ <h3 param="subheading">
315
+ <ht key="<%= model_key %>.index_for_owner.subheading">
316
+ For:
317
+ </ht>
318
+ <<%= owner_tag %> with="&@<%= owner %>"/>
319
+ </h3>
257
320
  <% end -%>
258
- <p param="count" if>There <count prefix="are"/></p>
321
+ <p param="count" if>
322
+ <ht key="<%= model_key %>.collection.count" count="&this.size">
323
+ There <count prefix="are"/>
324
+ </ht>
325
+ </p>
259
326
  </header>
260
-
327
+
261
328
  <section param="content-body">
262
329
  <% if new_link -%>
330
+ <a action="new" to="&model" param="new-link">
331
+ <ht key="<%= model_key %>.actions.new" >New <%=model_name :title %></ht>
332
+ </a>
263
333
 
264
- <a action="new" to="&model" param="new-link"/>
265
334
  <% end -%>
266
335
 
267
336
  <page-nav param="top-page-nav"/>
268
-
337
+
269
338
  <collection param/>
270
-
339
+
271
340
  <page-nav param="bottom-page-nav"/>
272
341
  </section>
273
342
  </content:>
@@ -279,20 +348,28 @@ new_link = :new.in?(actions)
279
348
  <% if :new.in? actions -%>
280
349
  <def tag="new-for-<%= owner.dasherize %>-page" polymorphic/>
281
350
  <def tag="new-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
282
- <page merge title="New <%= model_name :title %> for #{name :with => @<%= owner %>}">
283
-
351
+ <page merge title="#{ht '<%=model_key %>.new_for_owner.title', :default=>['New <%=model_name :title %> for']} #{name :with => @<%= owner %>}">
284
352
  <body: class="new-for-owner-page <% owner.dasherize %> <%= model_class %>" param/>
285
-
353
+
286
354
  <content: param>
287
355
  <header param="content-header">
288
- <h2 param="heading">New <%= collection_name.singularize.titleize %></h2>
289
- <h3 param="subheading">For: <<%= owner_tag %> with="&@<%= owner %>"/></h3>
356
+ <h2 param="heading">
357
+ <ht key="<%= model_key %>.new_for_owner.heading">
358
+ New <%= collection_name.singularize.titleize %>
359
+ </ht>
360
+ </h2>
361
+ <h3 param="subheading">
362
+ <ht key="<%= model_key %>.new_for_owner.subheading">
363
+ For:
364
+ </ht>
365
+ <<%= owner_tag %> with="&@<%= owner %>"/>
366
+ </h3>
290
367
  </header>
291
-
368
+
292
369
  <section param="content-body">
293
370
  <form owner="<%= owner %>" method="post" param>
294
371
  <field-list: skip="<%= owner %>"/>
295
- <submit: label="Create <%= model_name :title %>"/>
372
+ <submit: label="#{ht '<%=model_key %>.actions.create', :default=>['Create <%= model_name :title %>']}"/>
296
373
  </form>
297
374
  </section>
298
375
  </content:>
@@ -305,14 +382,18 @@ new_link = :new.in?(actions)
305
382
  <% creator_names.each do |creator| -%>
306
383
  <def tag="<%= creator.dasherize %>-page" polymorphic/>
307
384
  <def tag="<%= creator.dasherize %>-page" for="<%= model.name %>">
308
-
309
- <page title="<%= creator.titleize %>" merge>
385
+
386
+ <page title="#{ht '<%=model_key %>.<%= creator.underscore %>.title', :default=>['<%= creator.titleize %>']}" merge>
310
387
 
311
388
  <body: class="lifecycle-start-page <%= creator.dasherize %>-page" param/>
312
389
 
313
390
  <content: param>
314
391
  <header param="content-header">
315
- <h2 param="heading"><%= creator.titleize %></h2>
392
+ <h2 param="heading">
393
+ <ht key="<%= model_key %>.<%= creator.underscore %>.heading">
394
+ <%= creator.titleize %>
395
+ </ht>
396
+ </h2>
316
397
  </header>
317
398
 
318
399
  <section param="content-body">
@@ -327,20 +408,24 @@ new_link = :new.in?(actions)
327
408
  <% transition_names.each do |transition| -%>
328
409
  <def tag="<%= transition.dasherize %>-page" polymorphic/>
329
410
  <def tag="<%= transition.dasherize %>-page" for="<%= model.name %>">
330
- <page title="<%= transition.titleize %>" merge>
331
-
411
+ <page title="#{ht '<%=model_key %>.<%= transition.underscore %>.title', :default=>['<%= transition.titleize %>']}" merge>
412
+
332
413
  <body: class="lifecycle-transition-page <%= transition.dasherize -%>-page" param/>
333
-
414
+
334
415
  <content:>
335
416
  <header param="content-header">
336
- <h2 param="heading"><%= transition.titleize %></h2>
417
+ <h2 param="heading">
418
+ <ht key="<%= model_key %>.<%= transition.underscore %>.heading">
419
+ <%= transition.titleize %>
420
+ </ht>
421
+ </h2>
337
422
  </header>
338
-
423
+
339
424
  <section param="content-body">
340
425
  <<%= transition.dasherize %>-form param="form"/>
341
426
  </section>
342
427
  </content:>
343
-
428
+
344
429
  </page>
345
430
  </def>
346
431