localized_scaffold 0.9

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 (46) hide show
  1. data/Gemfile +6 -0
  2. data/README.rdoc +273 -0
  3. data/generators/locales/standard.de-FO.yml +106 -0
  4. data/generators/locales/standard.de.yml +106 -0
  5. data/generators/locales/standard.en.yml +106 -0
  6. data/generators/localized_devise_views_generator.rb +100 -0
  7. data/generators/localized_scaffold_generator.rb +624 -0
  8. data/generators/templates/devise/locales/devise.de-FO.yml +45 -0
  9. data/generators/templates/devise/locales/devise.de.yml +60 -0
  10. data/generators/templates/devise/locales/devise_views.de.yml +78 -0
  11. data/generators/templates/devise/locales/devise_views.en.yml +79 -0
  12. data/generators/templates/devise/views/confirmations/new.html.erb +23 -0
  13. data/generators/templates/devise/views/mailer/confirmation_instructions.html.erb +6 -0
  14. data/generators/templates/devise/views/mailer/reset_password_instructions.html.erb +8 -0
  15. data/generators/templates/devise/views/mailer/unlock_instructions.html.erb +6 -0
  16. data/generators/templates/devise/views/passwords/edit.html.erb +30 -0
  17. data/generators/templates/devise/views/passwords/new.html.erb +23 -0
  18. data/generators/templates/devise/views/registrations/edit.html.erb +54 -0
  19. data/generators/templates/devise/views/registrations/new.html.erb +34 -0
  20. data/generators/templates/devise/views/sessions/new.html.erb +32 -0
  21. data/generators/templates/devise/views/shared/_links.erb +25 -0
  22. data/generators/templates/devise/views/unlocks/new.html.erb +23 -0
  23. data/generators/templates/erb/scaffold/_form.html.erb +11 -0
  24. data/generators/templates/erb/scaffold/_index.html.erb +54 -0
  25. data/generators/templates/erb/scaffold/edit.html.erb +20 -0
  26. data/generators/templates/erb/scaffold/index.html.erb +73 -0
  27. data/generators/templates/erb/scaffold/layout.html.erb +51 -0
  28. data/generators/templates/erb/scaffold/new.html.erb +18 -0
  29. data/generators/templates/erb/scaffold/scaffold_generator.rb +57 -0
  30. data/generators/templates/erb/scaffold/show.html.erb +22 -0
  31. data/generators/templates/locales/de.yml +61 -0
  32. data/generators/templates/locales/en.yml +61 -0
  33. data/generators/templates/rails/helper/helper.rb +118 -0
  34. data/generators/templates/rails/helper/scaffold_helper.rb +53 -0
  35. data/generators/templates/rails/scaffold_controller/controller.rb +338 -0
  36. data/generators/templates/rails/stylesheets/templates/scaffold.css +203 -0
  37. data/generators/templates/test_unit/scaffold/templates/functional_test.rb +117 -0
  38. data/init.rb +3 -0
  39. data/install.rb +1 -0
  40. data/lib/tasks/localized_scaffold.rake +39 -0
  41. data/localized_scaffold.rb +7 -0
  42. data/rails/init.rb +3 -0
  43. data/test/localized_scaffold_test.rb +8 -0
  44. data/test/test_helper.rb +3 -0
  45. data/uninstall.rb +1 -0
  46. metadata +120 -0
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # Localized Rails scaffolding with style...
2
+
3
+ source 'http://rubygems.org'
4
+
5
+ gem 'rails', '>= 3.0.0.beta3'
6
+ gem 'devise', '>= 1.1.rc1'
data/README.rdoc ADDED
@@ -0,0 +1,273 @@
1
+ = Localized Scaffold
2
+
3
+ == About
4
+
5
+ The "localized_scaffold" gem provides a Rails 3 generator for scaffolding
6
+ with the same parameters as the orginal scaffold generator (it actually
7
+ overwrites the original code) but producing localized views and localized
8
+ controller flashes. It also generates a nicer user interface (for example with
9
+ a title helper instead of generating h2) and produces a controller with some
10
+ comments which also supports JSON. Localized Rails scaffolding with style...
11
+
12
+ Just give it a try and toss it away if you don't like it -- it's pretty easy
13
+ to have a test drive (see sample below).
14
+
15
+ Rails 2: There is a Rails 2 compatible version which has to be installed as
16
+ a Rails plugin instead of a gem. The latest Rails 2 version can be installed
17
+ from branch "rails2".
18
+
19
+ == Installation and usage
20
+
21
+ Here are the steps to get a first impression about the generator:
22
+
23
+ rails foo
24
+ cd foo
25
+
26
+ Edit the Gemfile to include "localized_scaffold" and optionally install the
27
+ "will_paginate" gem to automatically add pagination using this library and to
28
+ have everything around for authentication (see more on devise localization
29
+ below):
30
+
31
+ vi Gemfile
32
+ gem 'localized_scaffold'
33
+ gem 'will_paginate', '>= 3.0.pre'
34
+
35
+ bundle install
36
+
37
+ The generated code uses "form.error_messages" which was moved to a separate
38
+ plugin in Rails 3 for some reason. Install the plugin or implement the method
39
+ with your own code t osee error messages:
40
+
41
+ rails plugin install git://github.com/rails/dynamic_form.git
42
+
43
+ A standard set of localization files will be installed in "config/locales" and
44
+ a set of locale files is generated per scaffold. This setup has to be
45
+ configured in the i18n configuration:
46
+
47
+ rake localized_scaffold:configure
48
+
49
+ If you don't like a rake task to mess around with your application file, edit
50
+ "config/application.rb") manually and add the following lines to the Rails
51
+ initializer (only the two config lines...):
52
+
53
+ Rails::Initializer.run do |config|
54
+ config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}')]
55
+ config.i18n.default_locale = :en
56
+ end
57
+
58
+ Add more locale files by downloading them from a repository set up
59
+ by Sven Fuchs at github (git://github.com/svenfuchs/rails-i18n.git) to
60
+ "config/locales":
61
+
62
+ rake localized_scaffold:download_locales
63
+
64
+ Have a look at the options supported by the generator:
65
+
66
+ rails generate localized_scaffold
67
+
68
+ As a first test, just add a sample scaffold:
69
+
70
+ rails generate localized_scaffold bar name:string seats:integer
71
+ rake db:migrate
72
+
73
+ rails server
74
+
75
+ Now open your browser and visit "http://localhost:3000/bars" to test the
76
+ application and finally have a look at the localization files generated in
77
+ "config/locales".
78
+
79
+ And please contribute by sending in your localized versions of the default
80
+ and standard locale files. :-)
81
+
82
+ == One more thing...
83
+
84
+ I couldn't resist to add a few small but powerful additions I need so often:
85
+ Feel free to use or ignore them.
86
+
87
+ === Method to_s()
88
+
89
+ Models should return something meaningful when to_s is called on their
90
+ objects and optional option <code>--str</code> is used to do so. The to_s
91
+ method of the model is generated to return the provided field (therefor the
92
+ name of the option) and its fallback is the value of the searchbar option
93
+ (see below) or the first attribute if that is missing as well. You can
94
+ always modify the implementation of the method afterwards.
95
+
96
+ Sample using "about" instead of default first attribute "name":
97
+
98
+ rails generate localized_scaffold company name:string about:text --str about
99
+
100
+ === Belongs to something
101
+
102
+ There is an <code>--belongsto</code> option which can be used to generate
103
+ model, controller and views for a "parent" belongs_to relationship like
104
+ companies having many addresses or phone numbers.
105
+
106
+ Here is a sample for exactly that:
107
+
108
+ rails generate localized_scaffold company name:string about:text
109
+
110
+ rails generate localized_scaffold address company_id:integer what:string \
111
+ street:string zip:string town:string state:string country:string \
112
+ --belongsto company --str town
113
+
114
+ rails generate localized_scaffold email company_id:integer kind:string \
115
+ address:string --belongsto company --str address
116
+
117
+ There is only little linking between the interfaces and you should double
118
+ check your routes, but after creating a new company at "/companies/new", you
119
+ will be able to see all its addresses and add new ones at
120
+ "/companies/1/addresses". Same for e-mail-addresses at "/companies/1/emails".
121
+
122
+ === Searchbar
123
+
124
+ When there are lots of records, it makes sense to have an A B C picker and it
125
+ would be nice to offer a simple search form for fast access to known objects.
126
+ That's what the new <code>--searchbar</code> option does. It supports the
127
+ <code>--belongsto</code> option but is also useful without.
128
+
129
+ Here again a sample:
130
+
131
+ rails generate localized_scaffold company name:string about:text \
132
+ --searchbar name
133
+
134
+ === No show...
135
+
136
+ Often the show view is not needed as the index view already displays all of
137
+ its data. Just add this option to suppress its generation. The show action is
138
+ still generated to support the XML and JSON format but for HTML the user will
139
+ be redirected to the index page.
140
+
141
+ Here is a sample:
142
+
143
+ rails generate localized_scaffold company name:string about:text --noshow
144
+
145
+ === Embedding in parent
146
+
147
+ When having a belongs_to relationship, it might be nicer to not only link to
148
+ that data from the show view of the "parent" but to actually embed a couple
149
+ of items and use the index view only if more than a certain amount of items
150
+ is available. That's what the <code>--embed</code> option is for:
151
+
152
+ rails generate localized_scaffold email company_id:integer what:string \
153
+ address:string --belongsto company --str address --embed 4
154
+
155
+ === Listify field values
156
+
157
+ Some fields only allow a certain set of values and these values have to be
158
+ localized as well. The listify option implements such a mechanism by creating
159
+ a set of methods in the model and preparing the localization files. Sample:
160
+ "salutation:mr,mrs,none kind:office,private,mobile,other"
161
+
162
+ And a sample:
163
+
164
+ rails generate localized_scaffold email company_id:integer kind:string \
165
+ address:string --belongsto company --str address \
166
+ --listify "kind:office,private,other"
167
+
168
+ There is still enough to do till you have a nice app and this is still
169
+ scaffolding and nothing more, but these additional options should save some
170
+ annoying work...
171
+
172
+ == Demo
173
+
174
+ As a wrap up, here is a complete sample of a simple phone book only using
175
+ scaffolding:
176
+
177
+ rails phonebook
178
+ cd phonebook
179
+
180
+ vi Gemfile
181
+ gem 'localized_scaffold'
182
+ gem 'will_paginate', '>= 3.0.pre'
183
+
184
+ bundle install
185
+
186
+ rake localized_scaffold:download_locales
187
+ rake localized_scaffold:configure
188
+
189
+ rails plugin install git://github.com/rails/dynamic_form.git
190
+
191
+ vi config/application.rb
192
+ config.i18n.default_locale = :de # For example
193
+
194
+ rails generate localized_scaffold person salutation:string firstname:string \
195
+ lastname:string --searchbar lastname --listify "salutation:mr,mrs,none"
196
+
197
+ rails generate localized_scaffold phone person_id:integer kind:string \
198
+ number:string --belongsto person \
199
+ --listify "kind:office,private,mobile,fax,other" \
200
+ --str number --embed 5 --noshow
201
+
202
+ rails generate localized_scaffold email person_id:integer kind:string \
203
+ address:string --belongsto person --listify "kind:office,private,other" \
204
+ --str address --embed 5 --noshow
205
+
206
+ rake db:migrate
207
+
208
+ vi config/routes.rb
209
+ root :to => 'people#index'
210
+
211
+ rm public/index.html
212
+
213
+ rails server
214
+
215
+ Now open http://localhost:3000/people to test the application and finally have
216
+ a look at the localization files generated in "app/locale".
217
+
218
+ == Devise
219
+
220
+ There is an additional generator named "localized_devise_views" which does
221
+ just would you would expect: It adds its own "devise_views.en.yml" etc. files
222
+ and uses these files for localization of devise. The generated code also uses
223
+ the title helper for title and headline which integrates better with the
224
+ remaining application.
225
+
226
+ Here are the additional steps to run a localized version of devise in the
227
+ application above:
228
+
229
+ vi Gemfile
230
+ gem 'devise', '>= 1.1.rc1'
231
+
232
+ bundle install
233
+
234
+ rails generate devise_install
235
+
236
+ rails generate devise user
237
+
238
+ rails generate localized_devise_views user
239
+
240
+ rake db:migrate
241
+
242
+ vi app/controllers/application_controller.rb
243
+ before_filter :authenticate_user!, :except => [ :show, :index]
244
+
245
+ rails server
246
+
247
+ Now open http://localhost:3000/people to test the application and check that
248
+ you have to register to create a new person or edit an existing one.
249
+
250
+ == Copyright & License
251
+
252
+ Copyright (c) 2009, 2010 Jan Ulbrich
253
+
254
+ Permission is hereby granted, free of charge, to any person
255
+ obtaining a copy of this software and associated documentation
256
+ files (the "Software"), to deal in the Software without
257
+ restriction, including without limitation the rights to use,
258
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
259
+ copies of the Software, and to permit persons to whom the
260
+ Software is furnished to do so, subject to the following
261
+ conditions:
262
+
263
+ The above copyright notice and this permission notice shall be
264
+ included in all copies or substantial portions of the Software.
265
+
266
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
267
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
268
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
269
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
270
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
271
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
272
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
273
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,106 @@
1
+ # Do not edit this file: "It will be overwritten by the localized_scaffold"
2
+ # generator!"
3
+
4
+ de-FO:
5
+ standard:
6
+ language: "Deutsch"
7
+
8
+ cmds:
9
+ account: "Einstellungen"
10
+ add: "Hinzufügen"
11
+ add_above: "Oberhalb hinzufügen"
12
+ add_below: "Unterhalb hinzufügen"
13
+ add_left: "Links hinzufügen"
14
+ add_right: "Rechts hinzufügen"
15
+ all: "Alle anzeigen"
16
+ answer: "Beantworten"
17
+ back: "Zurück"
18
+ browse_back: "Zurückblättern"
19
+ browse_forward: "Vorblättern"
20
+ cancel: "Abbrechen"
21
+ change: "Ändern"
22
+ close: "Schliessen"
23
+ copy: "Kopieren"
24
+ create: "Speichern"
25
+ create_and_continue: "Speichern und weiterbearbeiten"
26
+ delete: "Löschen"
27
+ destroy: "Löschen"
28
+ display: "Anzeigen"
29
+ done: "Fertig"
30
+ download: "Laden"
31
+ edit: "Bearbeiten"
32
+ find: "Finden"
33
+ generate: "Generieren"
34
+ help: "Hilfe"
35
+ hide: "Ausblenden"
36
+ home: "Startseite"
37
+ import: "Importieren"
38
+ invite: "Einladen"
39
+ larger: "Grösser"
40
+ login: "Anmelden"
41
+ logout: "Abmelden"
42
+ modify: "Ändern"
43
+ more: "Mehr"
44
+ more_information: "Mehr Information"
45
+ new: "Neu"
46
+ next: "Weiter"
47
+ next_page: "Weiter"
48
+ ok: "OK"
49
+ open: "Öffnen"
50
+ overview: "Übersicht"
51
+ owner: "Besitzer"
52
+ preview: "Vorschau"
53
+ previous_page: "Zurück"
54
+ print: "Druckansicht"
55
+ refresh: "Aktualisieren"
56
+ register: "Registrieren"
57
+ register_continue: "Registrierung fortsetzen"
58
+ remove: "Entfernen"
59
+ reply: "Antworten"
60
+ reset: "Zurücksetzen"
61
+ save: "Speichern"
62
+ save_and_continue: "Speichern und Weiterbearbeiten"
63
+ search: "Suchen"
64
+ select: "Auswählen"
65
+ send: "Senden"
66
+ settings: "Einstellungen"
67
+ show: "Anzeigen"
68
+ smaller: "Kleiner"
69
+ style: "Darstellung"
70
+ update: "Speichern"
71
+ upload: "Hochladen"
72
+ users: "Benutzer"
73
+
74
+ errors:
75
+ cant_close_window: "Konnte dieses Fenster nicht automatisch geschlossen werden?"
76
+ login_required: "Für diese Aktion müssen Sie sich autorisieren."
77
+ no_data: "Keine passenden Daten gefunden..."
78
+ no_javascript: "Javascript benötigt"
79
+ access_denied: "Auf die angeforderte Seite haben Sie keinen Zugriff!"
80
+
81
+ in_place_edit:
82
+ cancel: "Abbrechen"
83
+ click_to_edit: "Anklicken zum Bearbeiten..."
84
+ click_tools_to_edit: "Icons anklicken um zu bearbeiten..."
85
+ loading: "Laden..."
86
+ ok: "OK"
87
+ saving: "Speichern..."
88
+
89
+ labels:
90
+ and: "und"
91
+ and_or: "und/oder"
92
+ are_you_sure: "Sind Sie sicher?"
93
+ confirmed: "bestätigt"
94
+ hits: "%s Treffer"
95
+ hours: "Stunden"
96
+ loading: "Lade Daten..."
97
+ no: "Nein"
98
+ or: "oder"
99
+ page: "Seite"
100
+ searchterm: "Suchbegriff"
101
+ unconfirmed: "unbestätigt"
102
+ yes: "Ja"
103
+
104
+ googlemap:
105
+ incompatible_browser: "Dieser Browser kann Google Maps leider nicht darstellen."
106
+ loading: "Lade Google Map..."
@@ -0,0 +1,106 @@
1
+ # Do not edit this file: "It will be overwritten by the localized_scaffold"
2
+ # generator!"
3
+
4
+ de:
5
+ standard:
6
+ language: "Deutsch"
7
+
8
+ cmds:
9
+ account: "Einstellungen"
10
+ add: "Hinzufügen"
11
+ add_above: "Oberhalb hinzufügen"
12
+ add_below: "Unterhalb hinzufügen"
13
+ add_left: "Links hinzufügen"
14
+ add_right: "Rechts hinzufügen"
15
+ all: "Alle anzeigen"
16
+ answer: "Beantworten"
17
+ back: "Zurück"
18
+ browse_back: "Zurückblättern"
19
+ browse_forward: "Vorblättern"
20
+ cancel: "Abbrechen"
21
+ change: "Ändern"
22
+ close: "Schliessen"
23
+ copy: "Kopieren"
24
+ create: "Speichern"
25
+ create_and_continue: "Speichern und weiterbearbeiten"
26
+ delete: "Löschen"
27
+ destroy: "Löschen"
28
+ display: "Anzeigen"
29
+ done: "Fertig"
30
+ download: "Laden"
31
+ edit: "Bearbeiten"
32
+ find: "Finden"
33
+ generate: "Generieren"
34
+ help: "Hilfe"
35
+ hide: "Ausblenden"
36
+ home: "Startseite"
37
+ import: "Importieren"
38
+ invite: "Einladen"
39
+ larger: "Grösser"
40
+ login: "Anmelden"
41
+ logout: "Abmelden"
42
+ modify: "Ändern"
43
+ more: "Mehr"
44
+ more_information: "Mehr Information"
45
+ new: "Neu"
46
+ next: "Weiter"
47
+ next_page: "Weiter"
48
+ ok: "OK"
49
+ open: "Öffnen"
50
+ overview: "Übersicht"
51
+ owner: "Besitzer"
52
+ preview: "Vorschau"
53
+ previous_page: "Zurück"
54
+ print: "Druckansicht"
55
+ refresh: "Aktualisieren"
56
+ register: "Registrieren"
57
+ register_continue: "Registrierung fortsetzen"
58
+ remove: "Entfernen"
59
+ reply: "Antworten"
60
+ reset: "Zurücksetzen"
61
+ save: "Speichern"
62
+ save_and_continue: "Speichern und Weiterbearbeiten"
63
+ search: "Suchen"
64
+ select: "Auswählen"
65
+ send: "Senden"
66
+ settings: "Einstellungen"
67
+ show: "Anzeigen"
68
+ smaller: "Kleiner"
69
+ style: "Darstellung"
70
+ update: "Speichern"
71
+ upload: "Hochladen"
72
+ users: "Benutzer"
73
+
74
+ errors:
75
+ cant_close_window: "Konnte dieses Fenster nicht automatisch geschlossen werden?"
76
+ login_required: "Für diese Aktion musst Du Dich autorisieren."
77
+ no_data: "Keine passenden Daten gefunden..."
78
+ no_javascript: "Javascript benötigt"
79
+ access_denied: "Auf die angeforderte Seite hast Du keinen Zugriff!"
80
+
81
+ in_place_edit:
82
+ cancel: "Abbrechen"
83
+ click_to_edit: "Anklicken zum Bearbeiten..."
84
+ click_tools_to_edit: "Icons anklicken um zu bearbeiten..."
85
+ loading: "Laden..."
86
+ ok: "OK"
87
+ saving: "Speichern..."
88
+
89
+ labels:
90
+ and: "und"
91
+ and_or: "und/oder"
92
+ are_you_sure: "Bist Du sicher?"
93
+ confirmed: "bestätigt"
94
+ hits: "%s Treffer"
95
+ hours: "Stunden"
96
+ loading: "Lade Daten..."
97
+ no: "Nein"
98
+ or: "oder"
99
+ page: "Seite"
100
+ searchterm: "Suchbegriff"
101
+ unconfirmed: "unbestätigt"
102
+ yes: "Ja"
103
+
104
+ googlemap:
105
+ incompatible_browser: "Dieser Browser kann Google Maps leider nicht darstellen."
106
+ loading: "Lade Google Map..."
@@ -0,0 +1,106 @@
1
+ # Do not edit this file: "It will be overwritten by the localized_scaffold"
2
+ # generator!"
3
+
4
+ en:
5
+ standard:
6
+ language: "English"
7
+
8
+ cmds:
9
+ account: "Account settings"
10
+ add: "Add"
11
+ add_above: "Add above"
12
+ add_below: "Add below"
13
+ add_left: "Add left"
14
+ add_right: "Add right"
15
+ all: "Show all"
16
+ answer: "Answer"
17
+ back: "Back"
18
+ browse_back: "Previous"
19
+ browse_forward: "Next"
20
+ cancel: "Cancel"
21
+ change: "Change"
22
+ close: "Close"
23
+ copy: "Copy"
24
+ create: "Create"
25
+ create_and_continue: "Create and continue editing"
26
+ delete: "Delete"
27
+ destroy: "Delete"
28
+ display: "Show"
29
+ done: "Done"
30
+ download: "Download"
31
+ edit: "Edit"
32
+ find: "Find"
33
+ generate: "Generate"
34
+ help: "Help"
35
+ hide: "Hide"
36
+ home: "Homepage"
37
+ import: "Import"
38
+ invite: "Invite"
39
+ larger: "Larger"
40
+ login: "Login"
41
+ logout: "Logout"
42
+ modify: "Modify"
43
+ more: "More"
44
+ more_information: "More information"
45
+ new: "New"
46
+ next: "Next"
47
+ next_page: "Next"
48
+ ok: "OK"
49
+ open: "Open"
50
+ overview: "Overview"
51
+ owner: "Owner"
52
+ preview: "Preview"
53
+ previous_page: "Previous"
54
+ print: "Print"
55
+ refresh: "Refresh"
56
+ register: "Register"
57
+ register_continue: "Continue registration"
58
+ remove: "Remove"
59
+ reply: "Reply"
60
+ reset: "Reset"
61
+ save: "Save"
62
+ save_and_continue: "Save and continue editing"
63
+ search: "Search"
64
+ select: "Select"
65
+ send: "Send"
66
+ settings: "Settings"
67
+ show: "Show"
68
+ smaller: "Smaller"
69
+ style: "Style"
70
+ update: "Update"
71
+ upload: "Upload"
72
+ users: "Users"
73
+
74
+ errors:
75
+ cant_close_window: "Couldn't the window be closed automatically?"
76
+ login_required: "You have to authenticate for this action."
77
+ no_data: "No matching data found..."
78
+ no_javascript: "Javascript needed"
79
+ access_denied: "You are not allowed to open the page you requested!"
80
+
81
+ in_place_edit:
82
+ cancel: "Cancel"
83
+ click_to_edit: "Click to edit..."
84
+ click_tools_to_edit: "Click tool icons to modify..."
85
+ loading: "Loading..."
86
+ ok: "OK"
87
+ saving: "Saving..."
88
+
89
+ labels:
90
+ and: "and"
91
+ and_or: "and/or"
92
+ are_you_sure: "Are you sure?"
93
+ confirmed: "confirmed"
94
+ hits: "%s hits"
95
+ hours: "hours"
96
+ loading: "Loading data..."
97
+ no: "No"
98
+ or: "or"
99
+ page: "Page"
100
+ searchterm: "Search term"
101
+ unconfirmed: "unconfirmed"
102
+ yes: "Yes"
103
+
104
+ googlemap:
105
+ incompatible_browser: "This web browser can't display Google Maps."
106
+ loading: "Loading Google Map..."
@@ -0,0 +1,100 @@
1
+ # Localized Rails scaffolding with style...
2
+
3
+ require 'rails/generators/erb'
4
+ require 'rails/generators/resource_helpers'
5
+ require 'rails/generators/erb/scaffold/scaffold_generator'
6
+
7
+ require File.join(File.dirname(__FILE__), 'localized_scaffold_generator')
8
+
9
+ require 'find'
10
+
11
+ # LocalizedDeviseViewsGenerator implements a generator doing the same as the
12
+ # devise_views generator shipped with devise but adding localization the same
13
+ # way as supported by the LocalizedScaffoldGenerator.
14
+ #
15
+ # Devise supports some localization but only for flashes and not for views.
16
+ # This generator adds its own "devise_views.en.yml" etc. files and uses these
17
+ # files for further localization. It also uses the title helper for title and
18
+ # headline which integrated better with the remaining application.
19
+ #
20
+ # The generator was not written from scratch but hijacks basic functionality
21
+ # from the scaffolding generator overwriting lookup rules to use the right
22
+ # templates.
23
+
24
+ class LocalizedDeviseViewsGenerator < Erb::Generators::Base
25
+ desc "Creates a set of localized views for Devise using the provided model name
26
+ to access the user.
27
+
28
+ The required NAME parameter is the name of the model devise was installed to
29
+ run with (same you called \"rails generate devise\" with e.g. \"user\")."
30
+
31
+ include Rails::Generators::ResourceHelpers
32
+
33
+ # Returns a path relative to the generators directory optionally appending
34
+ # the provided filename.
35
+ #
36
+ # Parameters:
37
+ #
38
+ # [filename] Filename or array of filenames to add (defaults to none)
39
+
40
+ def self.generator_path(filename = '')
41
+ return File.join(File.expand_path(File.dirname(__FILE__)),
42
+ 'templates', 'devise', filename)
43
+ end
44
+
45
+ # Creates the views directory.
46
+
47
+ def create_root_folder
48
+ empty_directory File.join('app', 'views', 'devise')
49
+ end
50
+
51
+ # Generates all views in the views directory.
52
+
53
+ def copy_view_files
54
+ views = available_views
55
+
56
+ views.each do |filename|
57
+ template LocalizedDeviseViewsGenerator.generator_path(['views', filename]),
58
+ File.join('app', 'views', 'devise', filename)
59
+ end
60
+ end
61
+
62
+ # Copy locale files.
63
+
64
+ def copy_standard_locales
65
+ locales = LocalizedDeviseViewsGenerator.generator_path('locales')
66
+
67
+ Dir.entries(locales).delete_if { |f| not f.match(/.*\.yml$/) }.each do |l|
68
+ template File.join(locales, l), File.join('config', 'locales', l)
69
+ end
70
+ end
71
+
72
+ # Copy of the scaffold layout and css file.
73
+
74
+ def copy_layout_and_stylesheet_files
75
+ template File.join(File.dirname(LocalizedDeviseViewsGenerator.generator_path),
76
+ 'erb', 'scaffold', filename_with_extensions(:layout)),
77
+ File.join('app', 'views', 'layouts', filename_with_extensions('scaffold'))
78
+
79
+ template File.join(File.dirname(LocalizedDeviseViewsGenerator.generator_path),
80
+ 'rails', 'stylesheets', 'templates', 'scaffold.css'),
81
+ File.join('public', 'stylesheets', 'scaffold.css')
82
+ end
83
+
84
+ def name
85
+ return @name.downcase
86
+ end
87
+
88
+ protected
89
+
90
+ # Returns the views to generate.
91
+
92
+ def available_views
93
+ genpath = LocalizedDeviseViewsGenerator.generator_path('views')
94
+ views = []
95
+
96
+ Find.find(genpath) { |f| views << f.sub(genpath, '') if File.stat(f).file? }
97
+
98
+ return views
99
+ end
100
+ end