radiant-globalize2-extension 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. data/Rakefile +136 -0
  2. data/app/views/admin/shared/_change_locale.html.haml +22 -0
  3. data/app/views/admin/shared/_change_locale_admin.html.haml +7 -0
  4. data/app/views/admin/shared/_globalize_td.html.haml +4 -0
  5. data/app/views/admin/shared/_globalize_th.html.haml +2 -0
  6. data/config/routes.rb +4 -0
  7. data/cucumber.yml +1 -0
  8. data/db/migrate/20090728084238_create_translation_tables.rb +23 -0
  9. data/db/migrate/20090728114627_populate_translations.rb +21 -0
  10. data/db/migrate/20090729085422_remove_translated_attributes.rb +16 -0
  11. data/features/globalize_layouts.feature +19 -0
  12. data/features/globalize_pages.feature +58 -0
  13. data/features/globalize_snippets.feature +19 -0
  14. data/features/step_definitions/admin_steps.rb +58 -0
  15. data/features/step_definitions/webrat_steps.rb +119 -0
  16. data/features/support/env.rb +30 -0
  17. data/features/support/paths.rb +26 -0
  18. data/globalize2_extension.rb +93 -0
  19. data/lib/globalize2/compatibility/archive/archive_page_extensions.rb +21 -0
  20. data/lib/globalize2/compatibility/copy_move/copy_move_model_extensions.rb +22 -0
  21. data/lib/globalize2/compatibility/paginate/globalize_tags.rb +19 -0
  22. data/lib/globalize2/compatibility/paginate/page_extensions.rb +9 -0
  23. data/lib/globalize2/compatibility/vhost/page_extensions.rb +9 -0
  24. data/lib/globalize2/form_builder_extensions.rb +21 -0
  25. data/lib/globalize2/globalize_tags.rb +203 -0
  26. data/lib/globalize2/globalized_fields_controller_extension.rb +22 -0
  27. data/lib/globalize2/page_extensions.rb +88 -0
  28. data/lib/globalize2/page_part_extensions.rb +21 -0
  29. data/lib/globalize2/pages_controller_extensions.rb +9 -0
  30. data/lib/globalize2/site_controller_extensions.rb +24 -0
  31. data/lib/tasks/globalize2_extension_tasks.rake +28 -0
  32. data/public/images/admin/ad.gif +0 -0
  33. data/public/images/admin/ae.gif +0 -0
  34. data/public/images/admin/af.gif +0 -0
  35. data/public/images/admin/ag.gif +0 -0
  36. data/public/images/admin/ai.gif +0 -0
  37. data/public/images/admin/al.gif +0 -0
  38. data/public/images/admin/am.gif +0 -0
  39. data/public/images/admin/an.gif +0 -0
  40. data/public/images/admin/ao.gif +0 -0
  41. data/public/images/admin/ar.gif +0 -0
  42. data/public/images/admin/as.gif +0 -0
  43. data/public/images/admin/at.gif +0 -0
  44. data/public/images/admin/au.gif +0 -0
  45. data/public/images/admin/aw.gif +0 -0
  46. data/public/images/admin/ax.gif +0 -0
  47. data/public/images/admin/az.gif +0 -0
  48. data/public/images/admin/ba.gif +0 -0
  49. data/public/images/admin/bb.gif +0 -0
  50. data/public/images/admin/bd.gif +0 -0
  51. data/public/images/admin/be.gif +0 -0
  52. data/public/images/admin/bf.gif +0 -0
  53. data/public/images/admin/bg.gif +0 -0
  54. data/public/images/admin/bh.gif +0 -0
  55. data/public/images/admin/bi.gif +0 -0
  56. data/public/images/admin/bj.gif +0 -0
  57. data/public/images/admin/bm.gif +0 -0
  58. data/public/images/admin/bn.gif +0 -0
  59. data/public/images/admin/bo.gif +0 -0
  60. data/public/images/admin/br.gif +0 -0
  61. data/public/images/admin/bs.gif +0 -0
  62. data/public/images/admin/bt.gif +0 -0
  63. data/public/images/admin/bv.gif +0 -0
  64. data/public/images/admin/bw.gif +0 -0
  65. data/public/images/admin/by.gif +0 -0
  66. data/public/images/admin/bz.gif +0 -0
  67. data/public/images/admin/ca.gif +0 -0
  68. data/public/images/admin/catalonia.gif +0 -0
  69. data/public/images/admin/cc.gif +0 -0
  70. data/public/images/admin/cd.gif +0 -0
  71. data/public/images/admin/cf.gif +0 -0
  72. data/public/images/admin/cg.gif +0 -0
  73. data/public/images/admin/ch.gif +0 -0
  74. data/public/images/admin/ci.gif +0 -0
  75. data/public/images/admin/ck.gif +0 -0
  76. data/public/images/admin/cl.gif +0 -0
  77. data/public/images/admin/cm.gif +0 -0
  78. data/public/images/admin/cn.gif +0 -0
  79. data/public/images/admin/co.gif +0 -0
  80. data/public/images/admin/cr.gif +0 -0
  81. data/public/images/admin/cs.gif +0 -0
  82. data/public/images/admin/cu.gif +0 -0
  83. data/public/images/admin/cv.gif +0 -0
  84. data/public/images/admin/cx.gif +0 -0
  85. data/public/images/admin/cy.gif +0 -0
  86. data/public/images/admin/cz.gif +0 -0
  87. data/public/images/admin/de.gif +0 -0
  88. data/public/images/admin/dj.gif +0 -0
  89. data/public/images/admin/dk.gif +0 -0
  90. data/public/images/admin/dm.gif +0 -0
  91. data/public/images/admin/do.gif +0 -0
  92. data/public/images/admin/dz.gif +0 -0
  93. data/public/images/admin/ec.gif +0 -0
  94. data/public/images/admin/ee.gif +0 -0
  95. data/public/images/admin/eg.gif +0 -0
  96. data/public/images/admin/eh.gif +0 -0
  97. data/public/images/admin/en.gif +0 -0
  98. data/public/images/admin/england.gif +0 -0
  99. data/public/images/admin/er.gif +0 -0
  100. data/public/images/admin/es.gif +0 -0
  101. data/public/images/admin/et.gif +0 -0
  102. data/public/images/admin/europeanunion.gif +0 -0
  103. data/public/images/admin/fam.gif +0 -0
  104. data/public/images/admin/fi.gif +0 -0
  105. data/public/images/admin/fj.gif +0 -0
  106. data/public/images/admin/fk.gif +0 -0
  107. data/public/images/admin/fm.gif +0 -0
  108. data/public/images/admin/fo.gif +0 -0
  109. data/public/images/admin/fr.gif +0 -0
  110. data/public/images/admin/ga.gif +0 -0
  111. data/public/images/admin/gb.gif +0 -0
  112. data/public/images/admin/gd.gif +0 -0
  113. data/public/images/admin/ge.gif +0 -0
  114. data/public/images/admin/gf.gif +0 -0
  115. data/public/images/admin/gh.gif +0 -0
  116. data/public/images/admin/gi.gif +0 -0
  117. data/public/images/admin/gl.gif +0 -0
  118. data/public/images/admin/gm.gif +0 -0
  119. data/public/images/admin/gn.gif +0 -0
  120. data/public/images/admin/gp.gif +0 -0
  121. data/public/images/admin/gq.gif +0 -0
  122. data/public/images/admin/gr.gif +0 -0
  123. data/public/images/admin/gs.gif +0 -0
  124. data/public/images/admin/gt.gif +0 -0
  125. data/public/images/admin/gu.gif +0 -0
  126. data/public/images/admin/gw.gif +0 -0
  127. data/public/images/admin/gy.gif +0 -0
  128. data/public/images/admin/hk.gif +0 -0
  129. data/public/images/admin/hm.gif +0 -0
  130. data/public/images/admin/hn.gif +0 -0
  131. data/public/images/admin/hr.gif +0 -0
  132. data/public/images/admin/ht.gif +0 -0
  133. data/public/images/admin/hu.gif +0 -0
  134. data/public/images/admin/id.gif +0 -0
  135. data/public/images/admin/ie.gif +0 -0
  136. data/public/images/admin/il.gif +0 -0
  137. data/public/images/admin/in.gif +0 -0
  138. data/public/images/admin/io.gif +0 -0
  139. data/public/images/admin/iq.gif +0 -0
  140. data/public/images/admin/ir.gif +0 -0
  141. data/public/images/admin/is.gif +0 -0
  142. data/public/images/admin/it.gif +0 -0
  143. data/public/images/admin/jm.gif +0 -0
  144. data/public/images/admin/jo.gif +0 -0
  145. data/public/images/admin/jp.gif +0 -0
  146. data/public/images/admin/ke.gif +0 -0
  147. data/public/images/admin/kg.gif +0 -0
  148. data/public/images/admin/kh.gif +0 -0
  149. data/public/images/admin/ki.gif +0 -0
  150. data/public/images/admin/km.gif +0 -0
  151. data/public/images/admin/kn.gif +0 -0
  152. data/public/images/admin/kp.gif +0 -0
  153. data/public/images/admin/kr.gif +0 -0
  154. data/public/images/admin/kw.gif +0 -0
  155. data/public/images/admin/ky.gif +0 -0
  156. data/public/images/admin/kz.gif +0 -0
  157. data/public/images/admin/la.gif +0 -0
  158. data/public/images/admin/lb.gif +0 -0
  159. data/public/images/admin/lc.gif +0 -0
  160. data/public/images/admin/li.gif +0 -0
  161. data/public/images/admin/lk.gif +0 -0
  162. data/public/images/admin/lr.gif +0 -0
  163. data/public/images/admin/ls.gif +0 -0
  164. data/public/images/admin/lt.gif +0 -0
  165. data/public/images/admin/lu.gif +0 -0
  166. data/public/images/admin/lv.gif +0 -0
  167. data/public/images/admin/ly.gif +0 -0
  168. data/public/images/admin/ma.gif +0 -0
  169. data/public/images/admin/mc.gif +0 -0
  170. data/public/images/admin/md.gif +0 -0
  171. data/public/images/admin/me.gif +0 -0
  172. data/public/images/admin/mg.gif +0 -0
  173. data/public/images/admin/mh.gif +0 -0
  174. data/public/images/admin/mk.gif +0 -0
  175. data/public/images/admin/ml.gif +0 -0
  176. data/public/images/admin/mm.gif +0 -0
  177. data/public/images/admin/mn.gif +0 -0
  178. data/public/images/admin/mo.gif +0 -0
  179. data/public/images/admin/mp.gif +0 -0
  180. data/public/images/admin/mq.gif +0 -0
  181. data/public/images/admin/mr.gif +0 -0
  182. data/public/images/admin/ms.gif +0 -0
  183. data/public/images/admin/mt.gif +0 -0
  184. data/public/images/admin/mu.gif +0 -0
  185. data/public/images/admin/mv.gif +0 -0
  186. data/public/images/admin/mw.gif +0 -0
  187. data/public/images/admin/mx.gif +0 -0
  188. data/public/images/admin/my.gif +0 -0
  189. data/public/images/admin/mz.gif +0 -0
  190. data/public/images/admin/na.gif +0 -0
  191. data/public/images/admin/nc.gif +0 -0
  192. data/public/images/admin/ne.gif +0 -0
  193. data/public/images/admin/nf.gif +0 -0
  194. data/public/images/admin/ng.gif +0 -0
  195. data/public/images/admin/ni.gif +0 -0
  196. data/public/images/admin/nl.gif +0 -0
  197. data/public/images/admin/no.gif +0 -0
  198. data/public/images/admin/np.gif +0 -0
  199. data/public/images/admin/nr.gif +0 -0
  200. data/public/images/admin/nu.gif +0 -0
  201. data/public/images/admin/nz.gif +0 -0
  202. data/public/images/admin/om.gif +0 -0
  203. data/public/images/admin/pa.gif +0 -0
  204. data/public/images/admin/pe.gif +0 -0
  205. data/public/images/admin/pf.gif +0 -0
  206. data/public/images/admin/pg.gif +0 -0
  207. data/public/images/admin/ph.gif +0 -0
  208. data/public/images/admin/pk.gif +0 -0
  209. data/public/images/admin/pl.gif +0 -0
  210. data/public/images/admin/pm.gif +0 -0
  211. data/public/images/admin/pn.gif +0 -0
  212. data/public/images/admin/pr.gif +0 -0
  213. data/public/images/admin/ps.gif +0 -0
  214. data/public/images/admin/pt.gif +0 -0
  215. data/public/images/admin/pw.gif +0 -0
  216. data/public/images/admin/py.gif +0 -0
  217. data/public/images/admin/qa.gif +0 -0
  218. data/public/images/admin/re.gif +0 -0
  219. data/public/images/admin/ro.gif +0 -0
  220. data/public/images/admin/rs.gif +0 -0
  221. data/public/images/admin/ru.gif +0 -0
  222. data/public/images/admin/rw.gif +0 -0
  223. data/public/images/admin/sa.gif +0 -0
  224. data/public/images/admin/sb.gif +0 -0
  225. data/public/images/admin/sc.gif +0 -0
  226. data/public/images/admin/scotland.gif +0 -0
  227. data/public/images/admin/sd.gif +0 -0
  228. data/public/images/admin/se.gif +0 -0
  229. data/public/images/admin/sg.gif +0 -0
  230. data/public/images/admin/sh.gif +0 -0
  231. data/public/images/admin/si.gif +0 -0
  232. data/public/images/admin/sj.gif +0 -0
  233. data/public/images/admin/sk.gif +0 -0
  234. data/public/images/admin/sl.gif +0 -0
  235. data/public/images/admin/sm.gif +0 -0
  236. data/public/images/admin/sn.gif +0 -0
  237. data/public/images/admin/so.gif +0 -0
  238. data/public/images/admin/sr.gif +0 -0
  239. data/public/images/admin/st.gif +0 -0
  240. data/public/images/admin/sv.gif +0 -0
  241. data/public/images/admin/sy.gif +0 -0
  242. data/public/images/admin/sz.gif +0 -0
  243. data/public/images/admin/tc.gif +0 -0
  244. data/public/images/admin/td.gif +0 -0
  245. data/public/images/admin/tf.gif +0 -0
  246. data/public/images/admin/tg.gif +0 -0
  247. data/public/images/admin/th.gif +0 -0
  248. data/public/images/admin/tj.gif +0 -0
  249. data/public/images/admin/tk.gif +0 -0
  250. data/public/images/admin/tl.gif +0 -0
  251. data/public/images/admin/tm.gif +0 -0
  252. data/public/images/admin/tn.gif +0 -0
  253. data/public/images/admin/to.gif +0 -0
  254. data/public/images/admin/tr.gif +0 -0
  255. data/public/images/admin/tt.gif +0 -0
  256. data/public/images/admin/tv.gif +0 -0
  257. data/public/images/admin/tw.gif +0 -0
  258. data/public/images/admin/tz.gif +0 -0
  259. data/public/images/admin/ua.gif +0 -0
  260. data/public/images/admin/ug.gif +0 -0
  261. data/public/images/admin/um.gif +0 -0
  262. data/public/images/admin/us.gif +0 -0
  263. data/public/images/admin/uy.gif +0 -0
  264. data/public/images/admin/uz.gif +0 -0
  265. data/public/images/admin/va.gif +0 -0
  266. data/public/images/admin/vc.gif +0 -0
  267. data/public/images/admin/ve.gif +0 -0
  268. data/public/images/admin/vg.gif +0 -0
  269. data/public/images/admin/vi.gif +0 -0
  270. data/public/images/admin/vn.gif +0 -0
  271. data/public/images/admin/vu.gif +0 -0
  272. data/public/images/admin/wales.gif +0 -0
  273. data/public/images/admin/wf.gif +0 -0
  274. data/public/images/admin/ws.gif +0 -0
  275. data/public/images/admin/ye.gif +0 -0
  276. data/public/images/admin/yt.gif +0 -0
  277. data/public/images/admin/za.gif +0 -0
  278. data/public/images/admin/zm.gif +0 -0
  279. data/public/images/admin/zw.gif +0 -0
  280. data/public/stylesheets/sass/admin/globalize2.sass +59 -0
  281. data/readme.md +159 -0
  282. data/spec/controllers/admin/pages_controller_spec.rb +22 -0
  283. data/spec/controllers/site_controller_spec.rb +40 -0
  284. data/spec/factories.rb +39 -0
  285. data/spec/models/globalize_tags_spec.rb +155 -0
  286. data/spec/models/page_spec.rb +91 -0
  287. data/spec/spec.opts +6 -0
  288. data/spec/spec_helper.rb +34 -0
  289. data/vendor/plugins/globalize2/.gitignore +5 -0
  290. data/vendor/plugins/globalize2/LICENSE +21 -0
  291. data/vendor/plugins/globalize2/README.textile +86 -0
  292. data/vendor/plugins/globalize2/Rakefile +39 -0
  293. data/vendor/plugins/globalize2/VERSION +1 -0
  294. data/vendor/plugins/globalize2/generators/db_backend.rb +0 -0
  295. data/vendor/plugins/globalize2/generators/templates/db_backend_migration.rb +25 -0
  296. data/vendor/plugins/globalize2/globalize2.gemspec +81 -0
  297. data/vendor/plugins/globalize2/init.rb +1 -0
  298. data/vendor/plugins/globalize2/lib/globalize.rb +15 -0
  299. data/vendor/plugins/globalize2/lib/globalize/active_record.rb +215 -0
  300. data/vendor/plugins/globalize2/lib/globalize/active_record/adapter.rb +80 -0
  301. data/vendor/plugins/globalize2/lib/globalize/active_record/attributes.rb +25 -0
  302. data/vendor/plugins/globalize2/lib/globalize/active_record/migration.rb +44 -0
  303. data/vendor/plugins/globalize2/lib/i18n/missing_translations_log_handler.rb +41 -0
  304. data/vendor/plugins/globalize2/lib/i18n/missing_translations_raise_handler.rb +25 -0
  305. data/vendor/plugins/globalize2/test/active_record/fallbacks_test.rb +102 -0
  306. data/vendor/plugins/globalize2/test/active_record/migration_test.rb +118 -0
  307. data/vendor/plugins/globalize2/test/active_record/sti_translated_test.rb +61 -0
  308. data/vendor/plugins/globalize2/test/active_record/translates_test.rb +96 -0
  309. data/vendor/plugins/globalize2/test/active_record/translation_class_test.rb +30 -0
  310. data/vendor/plugins/globalize2/test/active_record/validation_tests.rb +75 -0
  311. data/vendor/plugins/globalize2/test/active_record_test.rb +467 -0
  312. data/vendor/plugins/globalize2/test/all.rb +2 -0
  313. data/vendor/plugins/globalize2/test/data/models.rb +62 -0
  314. data/vendor/plugins/globalize2/test/data/no_globalize_schema.rb +11 -0
  315. data/vendor/plugins/globalize2/test/data/schema.rb +55 -0
  316. data/vendor/plugins/globalize2/test/i18n/missing_translations_test.rb +36 -0
  317. data/vendor/plugins/globalize2/test/test_helper.rb +76 -0
  318. metadata +409 -0
data/Rakefile ADDED
@@ -0,0 +1,136 @@
1
+ # I think this is the one that should be moved to the extension Rakefile template
2
+
3
+ # In rails 1.2, plugins aren't available in the path until they're loaded.
4
+ # Check to see if the rspec plugin is installed first and require
5
+ # it if it is. If not, use the gem version.
6
+
7
+ # Determine where the RSpec plugin is by loading the boot
8
+ unless defined? RADIANT_ROOT
9
+ ENV["RAILS_ENV"] = "test"
10
+ case
11
+ when ENV["RADIANT_ENV_FILE"]
12
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
13
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
14
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
15
+ else
16
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
17
+ end
18
+ end
19
+
20
+ require 'rake'
21
+ require 'rake/rdoctask'
22
+ require 'rake/testtask'
23
+
24
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
25
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
26
+ require 'spec/rake/spectask'
27
+ # require 'spec/translator'
28
+
29
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
30
+ Object.send(:remove_const, :RADIANT_ROOT)
31
+
32
+ extension_root = File.expand_path(File.dirname(__FILE__))
33
+
34
+ task :default => :spec
35
+ task :stats => "spec:statsetup"
36
+
37
+ desc "Run all specs in spec directory"
38
+ Spec::Rake::SpecTask.new(:spec) do |t|
39
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
40
+ t.spec_files = FileList['spec/**/*_spec.rb']
41
+ end
42
+
43
+ namespace :spec do
44
+ desc "Run all specs in spec directory with RCov"
45
+ Spec::Rake::SpecTask.new(:rcov) do |t|
46
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
47
+ t.spec_files = FileList['spec/**/*_spec.rb']
48
+ t.rcov = true
49
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
50
+ end
51
+
52
+ desc "Print Specdoc for all specs"
53
+ Spec::Rake::SpecTask.new(:doc) do |t|
54
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
55
+ t.spec_files = FileList['spec/**/*_spec.rb']
56
+ end
57
+
58
+ [:models, :controllers, :views, :helpers].each do |sub|
59
+ desc "Run the specs under spec/#{sub}"
60
+ Spec::Rake::SpecTask.new(sub) do |t|
61
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
62
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
63
+ end
64
+ end
65
+
66
+ # Hopefully no one has written their extensions in pre-0.9 style
67
+ # desc "Translate specs from pre-0.9 to 0.9 style"
68
+ # task :translate do
69
+ # translator = ::Spec::Translator.new
70
+ # dir = RAILS_ROOT + '/spec'
71
+ # translator.translate(dir, dir)
72
+ # end
73
+
74
+ # Setup specs for stats
75
+ task :statsetup do
76
+ require 'code_statistics'
77
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
78
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
79
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
80
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
81
+ ::CodeStatistics::TEST_TYPES << "Model specs"
82
+ ::CodeStatistics::TEST_TYPES << "View specs"
83
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
84
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
85
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
86
+ end
87
+
88
+ namespace :db do
89
+ namespace :fixtures do
90
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
91
+ task :load => :environment do
92
+ require 'active_record/fixtures'
93
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
94
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
95
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ desc 'Generate documentation for the globalize2 extension.'
103
+ Rake::RDocTask.new(:rdoc) do |rdoc|
104
+ rdoc.rdoc_dir = 'rdoc'
105
+ rdoc.title = 'Globalize2Extension'
106
+ rdoc.options << '--line-numbers' << '--inline-source'
107
+ rdoc.rdoc_files.include('README')
108
+ rdoc.rdoc_files.include('lib/**/*.rb')
109
+ end
110
+
111
+ # For extensions that are in transition
112
+ desc 'Test the globalize2 extension.'
113
+ Rake::TestTask.new(:test) do |t|
114
+ t.libs << 'lib'
115
+ t.pattern = 'test/**/*_test.rb'
116
+ t.verbose = true
117
+ end
118
+
119
+ # Load any custom rakefiles for extension
120
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
121
+
122
+ begin
123
+ require 'jeweler'
124
+ Jeweler::Tasks.new do |gem|
125
+ gem.name = "radiant-globalize2-extension"
126
+ gem.summary = %Q{Globalize2 extension for Radiant CMS}
127
+ gem.description = %Q{This extension allows you to translate your Radiant content}
128
+ gem.email = "benny@gorilla-webdesign.be"
129
+ gem.homepage = "https://github.com/jomz/radiant-globalize2-extension"
130
+ gem.authors = ["Cristi Duma", "Istvan Hoka", "Edmund Haselwanter", "Benny Degezelle", "Jerrod Blavos", "Simo Niemelä", "Jan De Poorter"]
131
+ gem.add_dependency 'radiant', ">=0.9.1"
132
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
133
+ end
134
+ rescue LoadError
135
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package copy_move as a gem."
136
+ end
@@ -0,0 +1,22 @@
1
+ - @stylesheets << 'admin/globalize2'
2
+
3
+ #globalize
4
+ %input{:type => "hidden", :name => "locale", :value => I18n.locale.to_s }
5
+ .edit
6
+ %span
7
+ - Globalize2Extension.locales.map do |locale|
8
+
9
+ = link_to_unless(Globalize2Extension.content_locale == locale, "<img src='/images/admin/#{locale.downcase}.gif' alt='#{locale.upcase}' />", params.merge(:content_locale => locale))
10
+ - if !@page.nil? && Globalize2Extension.content_locale == locale
11
+ - if Globalize2Extension.content_locale != Globalize2Extension.default_language
12
+ - if @page.translated_locales.include?(locale.to_sym)
13
+ %span.translated
14
+ %label{:for => "reset_translations"}
15
+ %input{:type => "checkbox", :value => "true", :name => "page[reset_translations]", :id => "reset_translations"}
16
+ Delete
17
+ =Globalize2Extension.content_locale.to_s.upcase
18
+ translation
19
+ - else
20
+ %span.not-translated (not translated)
21
+ - else
22
+ %span (default)
@@ -0,0 +1,7 @@
1
+ - @stylesheets << 'admin/globalize2'
2
+
3
+ #globalize.clearfix
4
+ .index
5
+ %span
6
+ - Globalize2Extension.locales.map do |locale|
7
+ = link_to_unless(Globalize2Extension.content_locale == locale, "<img src='/images/admin/#{locale.downcase}.gif' alt='#{locale.upcase}' />", params.merge(:content_locale => locale))
@@ -0,0 +1,4 @@
1
+ %td.globalize
2
+ - Globalize2Extension.locales.map do |locale|
3
+ - if page.translated_locales.include?(locale.to_sym)
4
+ %img{:src => "/images/admin/#{locale}.gif", :alt => locale }
@@ -0,0 +1,2 @@
1
+ %th.globalize
2
+ Translated
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.connect '/:locale/*url', :controller => 'site', :action => 'show_page',
3
+ :locale => Regexp.compile(Globalize2Extension.locales.join("|"))
4
+ end
data/cucumber.yml ADDED
@@ -0,0 +1 @@
1
+ default: -r ./features features
@@ -0,0 +1,23 @@
1
+ class CreateTranslationTables < ActiveRecord::Migration
2
+
3
+ def self.globalizable_content
4
+ Globalize2Extension::GLOBALIZABLE_CONTENT
5
+ end
6
+
7
+ def self.up
8
+ globalizable_content.each do |model, columns|
9
+ globalize_columns = {}
10
+ columns.each do |column|
11
+ base_column = model.columns.detect { |col| col.name == column.to_s }
12
+ globalize_columns[column] = base_column.type
13
+ end
14
+ model.create_translation_table! globalize_columns
15
+ end
16
+ end
17
+
18
+ def self.down
19
+ globalizable_content.each do |model, columns|
20
+ model.drop_translation_table!
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ class PopulateTranslations < ActiveRecord::Migration
2
+
3
+ def self.globalizable_content
4
+ Globalize2Extension::GLOBALIZABLE_CONTENT
5
+ end
6
+
7
+ def self.up
8
+ globalizable_content.each do |model, columns|
9
+ model.send(:all).each do |item|
10
+ translation = item.translations.find_or_initialize_by_locale(Globalize2Extension.default_language.to_s)
11
+ columns.each do |column|
12
+ translation[column] = item[column]
13
+ end
14
+ translation.save
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.down
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ class RemoveTranslatedAttributes < ActiveRecord::Migration
2
+ def self.globalizable_content
3
+ Globalize2Extension::GLOBALIZABLE_CONTENT
4
+ end
5
+
6
+ def self.up
7
+ globalizable_content.each do |model, columns|
8
+ columns.each do |column|
9
+ remove_column model.table_name, column
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.down
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Globalize 2
2
+ In order to take advantage of the many languages I speak
3
+ As an admin
4
+ I want to be able to globalize my layouts
5
+
6
+ Background:
7
+ Given I am logged in as an admin
8
+
9
+ Scenario: Translating a layout
10
+ Given a layout "Cool Layout" exists
11
+ And I am on the layouts index page
12
+ And I follow "Cool Layout"
13
+ And I follow "RO"
14
+ And I fill in "layout_content" with "continut romanesc"
15
+ And I press "Save Changes"
16
+ Then the "Cool Layout" layout should be saved for "ro" locale
17
+ And the "Cool Layout" layout should contain "continut romanesc" for "ro" locale
18
+ And the "Cool Layout" layout should be saved for "en" locale
19
+ And the "Cool Layout" layout should contain "english content" for "en" locale
@@ -0,0 +1,58 @@
1
+ Feature: Globalize 2
2
+ In order to take advantage of the many languages I speak
3
+ As an admin
4
+ I want to be able to globalize my pages
5
+
6
+ Background:
7
+ Given I am logged in as an admin
8
+
9
+ Scenario: Changing locale
10
+ Given a page "Cool Page" exists translated to "Pagina cool"
11
+ And I am on the pages index page
12
+ When I follow "RO"
13
+ Then I should see "Pagina cool"
14
+ When I follow "EN"
15
+ Then I should see "Cool Page"
16
+
17
+ Scenario: Translating a page
18
+ Given a page "Cool Page" exists
19
+ And I am on the pages index page
20
+ When I follow "Cool Page"
21
+ And I follow "RO"
22
+ And I fill in "Page Title" with "Pagina cool"
23
+ And I press "Save Changes"
24
+ Then I should be on the pages index page
25
+ And I should see "Pagina cool"
26
+ When I follow "EN"
27
+ Then I should see "Cool Page"
28
+
29
+ Scenario: Translating content for a page
30
+ Given a page "Cool Page" exists with a "body" page part
31
+ And I am on the pages index page
32
+ When I follow "Cool Page"
33
+ And I follow "RO"
34
+ And I fill in "part_body_content" with "continut romanesc"
35
+ And I press "Save Changes"
36
+ Then the "Cool Page" page should contain "continut romanesc" for "ro" locale
37
+ And the "Cool Page" page should contain "english content" for "en" locale
38
+
39
+ Scenario: Deleting a translation
40
+ Given a page "Cool Page" exists translated to "Pagina cool"
41
+ And I am on the pages index page
42
+ When I follow "Cool Page"
43
+ And I follow "RO"
44
+ And I check "Delete RO translation"
45
+ And I press "Save Changes"
46
+ Then I should be on the pages index page
47
+ And I should not see "Pagina cool"
48
+ When I follow "EN"
49
+ Then I should see "Cool Page"
50
+
51
+ Scenario: The locale is changed to default when creating a new page
52
+ Given a page "HomePage" exists
53
+ And I am on the pages index page
54
+ And I follow "RO"
55
+ When I follow "add child"
56
+ Then I should see "The locale has been changed to default."
57
+ And I should see "(default)"
58
+
@@ -0,0 +1,19 @@
1
+ Feature: Globalize 2
2
+ In order to take advantage of the many languages I speak
3
+ As an admin
4
+ I want to be able to globalize my snippet
5
+
6
+ Background:
7
+ Given I am logged in as an admin
8
+
9
+ Scenario: Translating a layout
10
+ Given a snippet "Cool_Snippet" exists
11
+ And I am on the snippets index page
12
+ And I follow "Cool_Snippet"
13
+ And I follow "RO"
14
+ And I fill in "snippet_content" with "continut romanesc"
15
+ And I press "Save Changes"
16
+ Then the "Cool_Snippet" snippet should be saved for "ro" locale
17
+ And the "Cool_Snippet" snippet should contain "continut romanesc" for "ro" locale
18
+ And the "Cool_Snippet" snippet should be saved for "en" locale
19
+ And the "Cool_Snippet" snippet should contain "english content" for "en" locale
@@ -0,0 +1,58 @@
1
+ Given /^I am logged in as an admin$/ do
2
+ User.create!(:login => 'admin',
3
+ :password => 'secret',
4
+ :password_confirmation => 'secret',
5
+ :name => 'Administrator',
6
+ :admin => true)
7
+ Given "I go to to \"the welcome page\""
8
+ When "I fill in \"Username\" with \"admin\""
9
+ When "I fill in \"Password\" with \"secret\""
10
+ When "I press \"Login\""
11
+ end
12
+
13
+ Given /^a page "([^\"]*)" exists$/ do |title|
14
+ Factory.create(:page, :title => title)
15
+ end
16
+
17
+ Given /^a page "([^\"]*)" exists with a "([^\"]*)" page part$/ do |title, part|
18
+ page = Factory.create(:page, :title => title)
19
+ Factory.create(:page_part, :name => part, :page => page)
20
+ end
21
+
22
+ Given /^a page "([^\"]*)" exists translated to "([^\"]*)"$/ do |title, translated_title|
23
+ page = Factory.create(:page, :title => title)
24
+ Factory.create(:romanian_page_translation, :page => page, :title => translated_title)
25
+ end
26
+
27
+ Then /^the "([^\"]*)" page should contain "([^\"]*)" for "([^\"]*)" locale$/ do |title, content, locale|
28
+ page = Page.find_by_title(title)
29
+ page.parts.first.translations.find_by_locale(locale).content.should == content
30
+ end
31
+
32
+ Given /^a layout "([^\"]*)" exists$/ do |name|
33
+ Factory.create(:layout, :name => name)
34
+ end
35
+
36
+ Then /^the "([^\"]*)" layout should be saved for "([^\"]*)" locale$/ do |name, locale|
37
+ layout = Layout.find_by_name(name)
38
+ layout.translated_locales.should include(locale.to_sym)
39
+ end
40
+
41
+ Then /^the "([^\"]*)" layout should contain "([^\"]*)" for "([^\"]*)" locale$/ do |name, content, locale|
42
+ layout = Layout.find_by_name(name)
43
+ layout.translations.find_by_locale(locale).content.should == content
44
+ end
45
+
46
+ Given /^a snippet "([^\"]*)" exists$/ do |name|
47
+ Factory.create(:snippet, :name => name)
48
+ end
49
+
50
+ Then /^the "([^\"]*)" snippet should be saved for "([^\"]*)" locale$/ do |name, locale|
51
+ snippet = Snippet.find_by_name(name)
52
+ snippet.translated_locales.should include(locale.to_sym)
53
+ end
54
+
55
+ Then /^the "([^\"]*)" snippet should contain "([^\"]*)" for "([^\"]*)" locale$/ do |name, content, locale|
56
+ snippet = Snippet.find_by_name(name)
57
+ snippet.translations.find_by_locale(locale).content.should == content
58
+ end
@@ -0,0 +1,119 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
2
+
3
+ # Commonly used webrat steps
4
+ # http://github.com/brynary/webrat
5
+
6
+ Given /^I am on (.+)$/ do |page_name|
7
+ visit path_to(page_name)
8
+ end
9
+
10
+ When /^I go to (.+)$/ do |page_name|
11
+ visit path_to(page_name)
12
+ end
13
+
14
+ When /^I press "([^\"]*)"$/ do |button|
15
+ click_button(button)
16
+ end
17
+
18
+ When /^I follow "([^\"]*)"$/ do |link|
19
+ click_link(link)
20
+ end
21
+
22
+ When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
23
+ fill_in(field, :with => value)
24
+ end
25
+
26
+ When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
27
+ select(value, :from => field)
28
+ end
29
+
30
+ # Use this step in conjunction with Rail's datetime_select helper. For example:
31
+ # When I select "December 25, 2008 10:00" as the date and time
32
+ When /^I select "([^\"]*)" as the date and time$/ do |time|
33
+ select_datetime(time)
34
+ end
35
+
36
+ # Use this step when using multiple datetime_select helpers on a page or
37
+ # you want to specify which datetime to select. Given the following view:
38
+ # <%= f.label :preferred %><br />
39
+ # <%= f.datetime_select :preferred %>
40
+ # <%= f.label :alternative %><br />
41
+ # <%= f.datetime_select :alternative %>
42
+ # The following steps would fill out the form:
43
+ # When I select "November 23, 2004 11:20" as the "Preferred" date and time
44
+ # And I select "November 25, 2004 10:30" as the "Alternative" date and time
45
+ When /^I select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
46
+ select_datetime(datetime, :from => datetime_label)
47
+ end
48
+
49
+ # Use this step in conjunction with Rail's time_select helper. For example:
50
+ # When I select "2:20PM" as the time
51
+ # Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
52
+ # will convert the 2:20PM to 14:20 and then select it.
53
+ When /^I select "([^\"]*)" as the time$/ do |time|
54
+ select_time(time)
55
+ end
56
+
57
+ # Use this step when using multiple time_select helpers on a page or you want to
58
+ # specify the name of the time on the form. For example:
59
+ # When I select "7:30AM" as the "Gym" time
60
+ When /^I select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
61
+ select_time(time, :from => time_label)
62
+ end
63
+
64
+ # Use this step in conjunction with Rail's date_select helper. For example:
65
+ # When I select "February 20, 1981" as the date
66
+ When /^I select "([^\"]*)" as the date$/ do |date|
67
+ select_date(date)
68
+ end
69
+
70
+ # Use this step when using multiple date_select helpers on one page or
71
+ # you want to specify the name of the date on the form. For example:
72
+ # When I select "April 26, 1982" as the "Date of Birth" date
73
+ When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
74
+ select_date(date, :from => date_label)
75
+ end
76
+
77
+ When /^I check "([^\"]*)"$/ do |field|
78
+ check(field)
79
+ end
80
+
81
+ When /^I uncheck "([^\"]*)"$/ do |field|
82
+ uncheck(field)
83
+ end
84
+
85
+ When /^I choose "([^\"]*)"$/ do |field|
86
+ choose(field)
87
+ end
88
+
89
+ When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
90
+ attach_file(field, path)
91
+ end
92
+
93
+ Then /^I should see "([^\"]*)"$/ do |text|
94
+ response.should contain(text)
95
+ end
96
+
97
+ Then /^I should not see "([^\"]*)"$/ do |text|
98
+ response.should_not contain(text)
99
+ end
100
+
101
+ Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
102
+ field_labeled(field).value.should =~ /#{value}/
103
+ end
104
+
105
+ Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
106
+ field_labeled(field).value.should_not =~ /#{value}/
107
+ end
108
+
109
+ Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
110
+ field_labeled(label).should be_checked
111
+ end
112
+
113
+ Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
114
+ field_labeled(label).should_not be_checked
115
+ end
116
+
117
+ Then /^I should be on (.+)$/ do |page_name|
118
+ URI.parse(current_url).path.should == path_to(page_name)
119
+ end