zen 0.2.8 → 0.3b

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 (422) hide show
  1. data/.gems +20 -0
  2. data/.mailmap +3 -2
  3. data/.rvmrc +1 -1
  4. data/.travis.yml +13 -2
  5. data/.yardopts +13 -0
  6. data/AUTHORS +1 -1
  7. data/README.md +115 -77
  8. data/Rakefile +6 -7
  9. data/bin/zen +12 -5
  10. data/guide/_static/categories/categories.png +0 -0
  11. data/guide/_static/categories/category_groups.png +0 -0
  12. data/guide/_static/categories/new_category.png +0 -0
  13. data/guide/_static/categories/new_category_group.png +0 -0
  14. data/guide/_static/comments/comments.png +0 -0
  15. data/guide/_static/comments/edit_comment.png +0 -0
  16. data/guide/_static/custom_fields/custom_field_groups.png +0 -0
  17. data/guide/_static/custom_fields/custom_field_types.png +0 -0
  18. data/guide/_static/custom_fields/custom_fields.png +0 -0
  19. data/guide/_static/custom_fields/edit_custom_field_general.png +0 -0
  20. data/guide/_static/custom_fields/edit_custom_field_group.png +0 -0
  21. data/guide/_static/custom_fields/edit_custom_field_settings.png +0 -0
  22. data/guide/_static/custom_fields/edit_custom_field_type.png +0 -0
  23. data/guide/_static/menus/edit_menu.png +0 -0
  24. data/guide/_static/menus/edit_menu_item.png +0 -0
  25. data/guide/_static/menus/menu_items.png +0 -0
  26. data/guide/_static/menus/menus.png +0 -0
  27. data/guide/_static/sections/edit_entry.png +0 -0
  28. data/guide/_static/sections/edit_entry_categories.png +0 -0
  29. data/guide/_static/sections/edit_entry_general.png +0 -0
  30. data/guide/_static/sections/edit_entry_meta.png +0 -0
  31. data/guide/_static/sections/edit_section_comments.png +0 -0
  32. data/guide/_static/sections/edit_section_general.png +0 -0
  33. data/guide/_static/sections/edit_section_groups.png +0 -0
  34. data/guide/_static/sections/entries.png +0 -0
  35. data/guide/_static/sections/sections.png +0 -0
  36. data/guide/_static/settings/overview_general.png +0 -0
  37. data/guide/_static/settings/overview_security.png +0 -0
  38. data/guide/_static/settings/overview_user.png +0 -0
  39. data/guide/_static/users/edit_user.png +0 -0
  40. data/guide/_static/users/edit_user_group.png +0 -0
  41. data/guide/_static/users/edit_user_group_permissions.png +0 -0
  42. data/guide/_static/users/edit_user_permissions.png +0 -0
  43. data/guide/_static/users/overview.png +0 -0
  44. data/guide/_static/users/user_groups_overview.png +0 -0
  45. data/guide/asset_management.md +117 -0
  46. data/{CHANGELOG.md → guide/changelog.md} +42 -0
  47. data/guide/css/common.css +20 -0
  48. data/guide/getting_started.md +61 -0
  49. data/guide/hacking.md +52 -0
  50. data/guide/installation.md +44 -0
  51. data/guide/javascript.md +352 -0
  52. data/lib/vendor/sequel_sluggable.rb +137 -0
  53. data/lib/yard/tags.rb +13 -0
  54. data/lib/zen.rb +148 -78
  55. data/lib/zen/asset_groups.rb +85 -0
  56. data/lib/zen/bin/create.rb +267 -56
  57. data/lib/zen/bin/default.rb +84 -0
  58. data/lib/zen/controller/admin_controller.rb +1 -82
  59. data/lib/zen/controller/base_controller.rb +9 -5
  60. data/lib/zen/controller/frontend_controller.rb +0 -1
  61. data/lib/zen/controller/main_controller.rb +30 -42
  62. data/lib/zen/controller/preview.rb +9 -8
  63. data/lib/zen/controller/translations.rb +49 -0
  64. data/lib/zen/error.rb +17 -0
  65. data/lib/zen/event.rb +118 -0
  66. data/lib/zen/helper/asset.rb +63 -0
  67. data/lib/zen/helper/breadcrumb.rb +1 -4
  68. data/lib/zen/helper/controller.rb +73 -0
  69. data/lib/zen/helper/locale.rb +42 -0
  70. data/lib/zen/helper/message.rb +0 -3
  71. data/lib/zen/helper/search.rb +54 -0
  72. data/lib/zen/helper/stacked_aspect.rb +249 -0
  73. data/lib/zen/helper/theme.rb +3 -10
  74. data/lib/zen/language.rb +356 -181
  75. data/lib/zen/language/en/zen_general.rb +52 -0
  76. data/lib/zen/language/en/zen_models.rb +19 -0
  77. data/lib/zen/language/nl/zen_general.rb +57 -0
  78. data/lib/zen/language/nl/zen_models.rb +22 -0
  79. data/lib/zen/language/translation.rb +132 -0
  80. data/lib/zen/languages.rb +9 -0
  81. data/lib/zen/layout/admin.xhtml +3 -3
  82. data/lib/zen/layout/login.xhtml +1 -1
  83. data/lib/zen/markup.rb +189 -0
  84. data/lib/zen/model/helper.rb +65 -0
  85. data/lib/zen/model/init.rb +62 -0
  86. data/lib/zen/model/methods.rb +6 -7
  87. data/lib/zen/package.rb +312 -201
  88. data/lib/zen/package/all.rb +4 -3
  89. data/lib/zen/package/categories/lib/categories.rb +29 -41
  90. data/lib/zen/package/categories/lib/categories/controller/categories.rb +185 -130
  91. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +172 -102
  92. data/lib/zen/package/categories/lib/categories/helper/category.rb +4 -9
  93. data/lib/zen/package/categories/lib/categories/helper/category_frontend.rb +86 -0
  94. data/lib/zen/package/categories/lib/categories/language/en/categories.rb +40 -0
  95. data/lib/zen/package/categories/lib/categories/language/en/category_groups.rb +39 -0
  96. data/lib/zen/package/categories/lib/categories/language/nl/categories.rb +42 -0
  97. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.rb +42 -0
  98. data/lib/zen/package/categories/lib/categories/model/category.rb +21 -25
  99. data/lib/zen/package/categories/lib/categories/model/category_group.rb +21 -15
  100. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +25 -26
  101. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +24 -24
  102. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +18 -20
  103. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +21 -18
  104. data/lib/zen/package/comments/lib/comments.rb +30 -50
  105. data/lib/zen/package/comments/lib/comments/anti_spam.rb +138 -0
  106. data/lib/zen/package/comments/lib/comments/controller/comments.rb +159 -92
  107. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +122 -34
  108. data/lib/zen/package/comments/lib/comments/helper/comment.rb +0 -3
  109. data/lib/zen/package/comments/lib/comments/helper/comment_frontend.rb +90 -0
  110. data/lib/zen/package/comments/lib/comments/language/en/comments.rb +57 -0
  111. data/lib/zen/package/comments/lib/comments/language/nl/comments.rb +61 -0
  112. data/lib/zen/package/comments/lib/comments/model/comment.rb +147 -49
  113. data/lib/zen/package/comments/lib/comments/model/comment_status.rb +0 -2
  114. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +37 -40
  115. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +23 -42
  116. data/lib/zen/package/comments/migrations/1308774099_comment_status.rb +12 -4
  117. data/lib/zen/package/comments/migrations/1313851786_remove_defensio_signature.rb +11 -0
  118. data/lib/zen/package/custom_fields/lib/custom_fields.rb +40 -43
  119. data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +72 -17
  120. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +154 -118
  121. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +147 -90
  122. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +161 -131
  123. data/lib/zen/package/custom_fields/lib/custom_fields/helper/custom_field.rb +4 -9
  124. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +42 -0
  125. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.rb +51 -0
  126. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.rb +60 -0
  127. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.rb +41 -0
  128. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.rb +49 -0
  129. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.rb +61 -0
  130. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +18 -23
  131. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +20 -19
  132. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_method.rb +1 -3
  133. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +19 -9
  134. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +18 -15
  135. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +18 -18
  136. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +30 -24
  137. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/form.xhtml +15 -10
  138. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/index.xhtml +24 -19
  139. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +18 -13
  140. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +30 -20
  141. data/lib/zen/package/extensions/lib/extensions.rb +20 -0
  142. data/lib/zen/package/extensions/lib/extensions/controller/extensions.rb +41 -0
  143. data/lib/zen/package/extensions/lib/extensions/language/en/extensions.rb +23 -0
  144. data/lib/zen/package/extensions/lib/extensions/language/nl/extensions.rb +25 -0
  145. data/lib/zen/package/extensions/lib/extensions/view/admin/extensions/index.xhtml +86 -0
  146. data/lib/zen/package/menu.rb +109 -0
  147. data/lib/zen/package/menus/lib/menus.rb +25 -34
  148. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +143 -107
  149. data/lib/zen/package/menus/lib/menus/controller/menus.rb +166 -115
  150. data/lib/zen/package/menus/lib/menus/helper/menu.rb +2 -8
  151. data/lib/zen/package/menus/lib/menus/helper/menu_frontend.rb +114 -0
  152. data/lib/zen/package/menus/lib/menus/language/en/menu_items.rb +48 -0
  153. data/lib/zen/package/menus/lib/menus/language/en/menus.rb +48 -0
  154. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.rb +48 -0
  155. data/lib/zen/package/menus/lib/menus/language/nl/menus.rb +50 -0
  156. data/lib/zen/package/menus/lib/menus/model/menu.rb +24 -17
  157. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +37 -13
  158. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +32 -25
  159. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +23 -17
  160. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +31 -26
  161. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +20 -22
  162. data/lib/zen/package/sections/lib/sections.rb +25 -68
  163. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +178 -138
  164. data/lib/zen/package/sections/lib/sections/controller/sections.rb +173 -140
  165. data/lib/zen/package/sections/lib/sections/helper/section.rb +3 -6
  166. data/lib/zen/package/sections/lib/sections/helper/section_frontend.rb +146 -0
  167. data/lib/zen/package/sections/lib/sections/language/en/section_entries.rb +50 -0
  168. data/lib/zen/package/sections/lib/sections/language/en/sections.rb +55 -0
  169. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.rb +50 -0
  170. data/lib/zen/package/sections/lib/sections/language/nl/sections.rb +55 -0
  171. data/lib/zen/package/sections/lib/sections/model/section.rb +36 -36
  172. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +52 -59
  173. data/lib/zen/package/sections/lib/sections/model/section_entry_status.rb +2 -2
  174. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +24 -21
  175. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +24 -26
  176. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +33 -31
  177. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +24 -25
  178. data/lib/zen/package/sections/migrations/1308672298_use_id_for_default_section.rb +14 -10
  179. data/lib/zen/package/sections/migrations/1308813320_section_entry_statuses.rb +12 -6
  180. data/lib/zen/package/settings/lib/settings.rb +25 -120
  181. data/lib/zen/package/settings/lib/settings/blue_form_parameters.rb +157 -0
  182. data/lib/zen/package/settings/lib/settings/controller/settings.rb +94 -69
  183. data/lib/zen/package/settings/lib/settings/language/en/settings.rb +41 -0
  184. data/lib/zen/package/settings/lib/settings/language/nl/settings.rb +41 -0
  185. data/lib/zen/package/settings/lib/settings/model/setting.rb +0 -2
  186. data/lib/zen/package/settings/lib/settings/setting.rb +379 -0
  187. data/lib/zen/package/settings/lib/settings/setting_groups.rb +11 -0
  188. data/lib/zen/package/settings/lib/settings/settings.rb +83 -0
  189. data/lib/zen/package/settings/lib/settings/settings_group.rb +84 -0
  190. data/lib/zen/package/settings/lib/settings/singleton_methods.rb +35 -0
  191. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +15 -57
  192. data/lib/zen/package/settings/migrations/1321197919_remove_unused_columns.rb +17 -0
  193. data/lib/zen/package/users/lib/users.rb +51 -36
  194. data/lib/zen/package/users/lib/users/controller/user_groups.rb +133 -98
  195. data/lib/zen/package/users/lib/users/controller/users.rb +253 -136
  196. data/lib/zen/package/users/lib/users/helper/access.rb +102 -0
  197. data/lib/zen/package/users/lib/users/helper/acl.rb +113 -0
  198. data/lib/zen/package/users/lib/users/helper/users.rb +41 -24
  199. data/lib/zen/package/users/lib/users/language/en/permissions.rb +16 -0
  200. data/lib/zen/package/users/lib/users/language/en/user_groups.rb +39 -0
  201. data/lib/zen/package/users/lib/users/language/en/users.rb +73 -0
  202. data/lib/zen/package/users/lib/users/language/nl/permissions.rb +16 -0
  203. data/lib/zen/package/users/lib/users/language/nl/user_groups.rb +41 -0
  204. data/lib/zen/package/users/lib/users/language/nl/users.rb +74 -0
  205. data/lib/zen/package/users/lib/users/model/permission.rb +28 -0
  206. data/lib/zen/package/users/lib/users/model/user.rb +104 -65
  207. data/lib/zen/package/users/lib/users/model/user_group.rb +28 -24
  208. data/lib/zen/package/users/lib/users/model/user_status.rb +27 -0
  209. data/lib/zen/package/users/lib/users/public/admin/css/users/permissions.css +22 -0
  210. data/lib/zen/package/users/lib/users/public/admin/js/users/permissions.js +33 -0
  211. data/lib/zen/package/users/lib/users/settings.rb +19 -0
  212. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +58 -28
  213. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +19 -15
  214. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +93 -62
  215. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +23 -36
  216. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +13 -6
  217. data/lib/zen/package/users/lib/users/view/admin/users/permissions.xhtml +33 -0
  218. data/lib/zen/package/users/lib/users/view/admin/users/register.xhtml +52 -0
  219. data/lib/zen/package/users/migrations/1313786058_update_default_date.rb +41 -0
  220. data/lib/zen/package/users/migrations/1316432327_permissions.rb +36 -0
  221. data/lib/zen/package/users/migrations/1320272365_status_ids.rb +67 -0
  222. data/lib/zen/public/admin/css/zen/buttons.css +3 -11
  223. data/lib/zen/public/admin/css/zen/datepicker.css +23 -13
  224. data/lib/zen/public/admin/css/zen/editor.css +6 -14
  225. data/lib/zen/public/admin/css/zen/forms.css +19 -12
  226. data/lib/zen/public/admin/css/zen/general.css +22 -18
  227. data/lib/zen/public/admin/css/zen/grid.css +1 -20
  228. data/lib/zen/public/admin/css/zen/layout.css +26 -11
  229. data/lib/zen/public/admin/css/zen/messages.css +3 -10
  230. data/lib/zen/public/admin/css/zen/reset.css +13 -15
  231. data/lib/zen/public/admin/css/zen/tables.css +8 -10
  232. data/lib/zen/public/admin/css/zen/tabs.css +2 -10
  233. data/lib/zen/public/admin/css/zen/window.css +2 -8
  234. data/lib/zen/public/admin/js/vendor/datepicker.js +540 -240
  235. data/lib/zen/public/admin/js/vendor/mootools/core.js +273 -283
  236. data/lib/zen/public/admin/js/vendor/mootools/more.js +131 -136
  237. data/lib/zen/public/admin/js/zen/index.js +8 -14
  238. data/lib/zen/public/admin/js/zen/lib/editor.js +36 -33
  239. data/lib/zen/public/admin/js/zen/lib/editor/markdown.js +0 -6
  240. data/lib/zen/public/admin/js/zen/lib/editor/textile.js +0 -6
  241. data/lib/zen/public/admin/js/zen/lib/html_table.js +0 -5
  242. data/lib/zen/public/admin/js/zen/lib/tabs.js +22 -79
  243. data/lib/zen/public/admin/js/zen/lib/window.js +12 -22
  244. data/lib/zen/spec/bacon/color_output.rb +1 -1
  245. data/lib/zen/spec/helper.rb +6 -11
  246. data/lib/zen/spec/simplecov.rb +3 -3
  247. data/lib/zen/task.rb +0 -1
  248. data/lib/zen/task/build.rake +46 -26
  249. data/lib/zen/task/clean.rake +14 -7
  250. data/lib/zen/task/db.rake +31 -29
  251. data/lib/zen/task/package.rake +19 -23
  252. data/lib/zen/task/proto.rake +3 -5
  253. data/lib/zen/task/setup.rake +4 -0
  254. data/lib/zen/task/test.rake +31 -6
  255. data/lib/zen/task/theme.rake +13 -19
  256. data/lib/zen/theme.rb +377 -52
  257. data/lib/zen/validation.rb +22 -30
  258. data/lib/zen/version.rb +1 -2
  259. data/lib/zen/view/bottom.xhtml +9 -1
  260. data/lib/zen/view/head.xhtml +1 -1
  261. data/lib/zen/view/main.xhtml +1 -1
  262. data/lib/zen/view/search.xhtml +9 -0
  263. data/proto/app/Rakefile +0 -1
  264. data/proto/app/app.rb +21 -16
  265. data/proto/app/config/config.rb.erb +41 -0
  266. data/proto/app/config/{database.rb → database.rb.erb} +17 -14
  267. data/proto/app/config/middlewares.rb +1 -1
  268. data/proto/app/theme/default/index.xhtml +25 -0
  269. data/proto/app/theme/theme.rb +19 -0
  270. data/proto/app/{log/database/dev → tmp}/.gitkeep +0 -0
  271. data/proto/migration.rb +3 -5
  272. data/proto/rack/thin.yml +41 -0
  273. data/proto/rack/unicorn.rb +38 -0
  274. data/spec/Rakefile +15 -11
  275. data/spec/fixtures/zen/helper/controller.rb +13 -0
  276. data/spec/fixtures/zen/helper/locale.rb +7 -0
  277. data/spec/fixtures/zen/helper/message.rb +0 -4
  278. data/spec/fixtures/zen/language.rb +31 -0
  279. data/spec/fixtures/zen/language/en/spec.rb +11 -0
  280. data/spec/fixtures/zen/language/nl/spec.rb +11 -0
  281. data/spec/fixtures/zen/package.rb +0 -10
  282. data/spec/fixtures/zen/package/categories/helper/category_frontend.rb +16 -0
  283. data/spec/fixtures/zen/package/comments/helper/comment_frontend.rb +16 -0
  284. data/spec/fixtures/zen/package/sections/helper/section_frontend.rb +16 -0
  285. data/spec/fixtures/zen/package/settings/controller/settings.rb +17 -0
  286. data/spec/fixtures/zen/package/users/helper/access.rb +18 -0
  287. data/spec/fixtures/zen/package/users/helper/acl.rb +23 -0
  288. data/spec/fixtures/zen/theme/{default-section → default}/index.xhtml +0 -0
  289. data/spec/helper.rb +12 -27
  290. data/{proto/app/log/database/live → spec/public}/.gitkeep +0 -0
  291. data/spec/zen/controller/admin_controller.rb +5 -6
  292. data/spec/zen/controller/main_controller.rb +29 -35
  293. data/spec/zen/controller/preview.rb +9 -10
  294. data/spec/zen/event.rb +44 -0
  295. data/spec/zen/helper/breadcrumb.rb +4 -5
  296. data/spec/zen/helper/controller.rb +21 -0
  297. data/spec/zen/helper/locale.rb +25 -0
  298. data/spec/zen/helper/message.rb +4 -11
  299. data/spec/zen/helper/theme.rb +11 -14
  300. data/spec/zen/language.rb +48 -22
  301. data/spec/zen/markup.rb +39 -0
  302. data/spec/zen/package.rb +48 -11
  303. data/spec/zen/package/categories/controller/categories.rb +99 -45
  304. data/spec/zen/package/categories/controller/category_groups.rb +109 -33
  305. data/spec/zen/package/categories/helper/category.rb +19 -32
  306. data/spec/zen/package/categories/helper/category_frontend.rb +61 -0
  307. data/spec/zen/package/comments/anti_spam.rb +50 -0
  308. data/spec/zen/package/comments/controller/comments.rb +121 -61
  309. data/spec/zen/package/comments/controller/comments_form.rb +120 -94
  310. data/spec/zen/package/comments/helper/comment.rb +13 -13
  311. data/spec/zen/package/comments/helper/comment_frontend.rb +92 -0
  312. data/spec/zen/package/custom_fields/blue_form_parameters.rb +50 -50
  313. data/spec/zen/package/custom_fields/controller/custom_field_groups.rb +135 -43
  314. data/spec/zen/package/custom_fields/controller/custom_field_types.rb +153 -48
  315. data/spec/zen/package/custom_fields/controller/custom_fields.rb +130 -51
  316. data/spec/zen/package/custom_fields/helper/custom_field.rb +8 -8
  317. data/spec/zen/package/extensions/controller/extensions.rb +38 -0
  318. data/spec/zen/package/menus/controller/menu_items.rb +121 -42
  319. data/spec/zen/package/menus/controller/menus.rb +125 -38
  320. data/spec/zen/package/menus/helper/menu.rb +26 -26
  321. data/spec/zen/package/menus/helper/menu_frontend.rb +104 -0
  322. data/spec/zen/package/sections/controller/section_entries.rb +145 -89
  323. data/spec/zen/package/sections/controller/sections.rb +130 -35
  324. data/spec/zen/package/sections/helper/section.rb +27 -38
  325. data/spec/zen/package/sections/helper/section_frontend.rb +160 -0
  326. data/spec/zen/package/settings/controller/settings.rb +73 -8
  327. data/spec/zen/package/settings/settings.rb +119 -0
  328. data/spec/zen/package/users/controller/user_groups.rb +134 -34
  329. data/spec/zen/package/users/controller/users.rb +189 -44
  330. data/spec/zen/package/users/helper/access.rb +29 -0
  331. data/spec/zen/package/users/helper/acl.rb +46 -0
  332. data/spec/zen/package/users/helper/users.rb +20 -64
  333. data/spec/zen/theme.rb +7 -9
  334. data/spec/zen/validation.rb +1 -2
  335. data/zen.gemspec +25 -22
  336. metadata +303 -222
  337. data/lib/zen/asset.rb +0 -292
  338. data/lib/zen/bin/runner.rb +0 -118
  339. data/lib/zen/error/language_error.rb +0 -10
  340. data/lib/zen/error/package_error.rb +0 -10
  341. data/lib/zen/error/plugin_error.rb +0 -10
  342. data/lib/zen/error/theme_error.rb +0 -10
  343. data/lib/zen/error/validation_error.rb +0 -10
  344. data/lib/zen/helper/acl.rb +0 -182
  345. data/lib/zen/helper/blue_form_vendor.rb +0 -689
  346. data/lib/zen/language/en/zen_general.yml +0 -25
  347. data/lib/zen/language/en/zen_models.yml +0 -13
  348. data/lib/zen/language/nl/zen_general.yml +0 -25
  349. data/lib/zen/language/nl/zen_models.yml +0 -13
  350. data/lib/zen/model/settings.rb +0 -78
  351. data/lib/zen/package/base.rb +0 -62
  352. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +0 -36
  353. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +0 -34
  354. data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +0 -40
  355. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +0 -34
  356. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +0 -141
  357. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +0 -48
  358. data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +0 -50
  359. data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +0 -156
  360. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +0 -115
  361. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.yml +0 -33
  362. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.yml +0 -40
  363. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +0 -54
  364. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +0 -33
  365. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.yml +0 -40
  366. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +0 -54
  367. data/lib/zen/package/menus/lib/menus/language/en/menu_items.yml +0 -41
  368. data/lib/zen/package/menus/lib/menus/language/en/menus.yml +0 -40
  369. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +0 -41
  370. data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +0 -40
  371. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +0 -152
  372. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +0 -44
  373. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -48
  374. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +0 -44
  375. data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +0 -48
  376. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +0 -244
  377. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +0 -87
  378. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +0 -36
  379. data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +0 -37
  380. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +0 -39
  381. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +0 -133
  382. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +0 -251
  383. data/lib/zen/package/users/lib/users/controller/access_rules.rb +0 -284
  384. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +0 -38
  385. data/lib/zen/package/users/lib/users/language/en/user_groups.yml +0 -32
  386. data/lib/zen/package/users/lib/users/language/en/users.yml +0 -57
  387. data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +0 -38
  388. data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +0 -32
  389. data/lib/zen/package/users/lib/users/language/nl/users.yml +0 -57
  390. data/lib/zen/package/users/lib/users/model/access_rule.rb +0 -42
  391. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +0 -65
  392. data/lib/zen/package/users/lib/users/public/admin/js/users/lib/access_rules.js +0 -49
  393. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +0 -120
  394. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +0 -102
  395. data/lib/zen/plugin.rb +0 -182
  396. data/lib/zen/plugin/base.rb +0 -46
  397. data/lib/zen/plugin/helper.rb +0 -47
  398. data/lib/zen/plugin/markup/lib/markup.rb +0 -14
  399. data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +0 -6
  400. data/lib/zen/plugin/markup/lib/markup/markup.rb +0 -165
  401. data/lib/zen/public/admin/js/zen/lib/asset.js +0 -111
  402. data/lib/zen/task/plugin.rake +0 -18
  403. data/lib/zen/theme/base.rb +0 -65
  404. data/proto/app/config/config.rb +0 -18
  405. data/spec/fixtures/zen/language/en/spec.yml +0 -10
  406. data/spec/fixtures/zen/language/nl/spec.yml +0 -7
  407. data/spec/fixtures/zen/package/settings/plugin/settings.rb +0 -20
  408. data/spec/zen/asset.rb +0 -97
  409. data/spec/zen/bin/create.rb +0 -89
  410. data/spec/zen/bin/runner.rb +0 -47
  411. data/spec/zen/helper/acl.rb +0 -149
  412. data/spec/zen/package/categories/plugin/categories.rb +0 -92
  413. data/spec/zen/package/comments/plugin/anti_spam.rb +0 -59
  414. data/spec/zen/package/comments/plugin/comments.rb +0 -107
  415. data/spec/zen/package/menus/plugin/menus.rb +0 -120
  416. data/spec/zen/package/sections/plugin/section_entries.rb +0 -161
  417. data/spec/zen/package/sections/plugin/sections.rb +0 -75
  418. data/spec/zen/package/settings/plugin/settings.rb +0 -33
  419. data/spec/zen/package/users/controller/access_rules.rb +0 -90
  420. data/spec/zen/plugin.rb +0 -64
  421. data/spec/zen/plugin/helper.rb +0 -11
  422. data/spec/zen/plugin/markup.rb +0 -44
data/lib/zen/language.rb CHANGED
@@ -1,258 +1,433 @@
1
- require __DIR__('error/language_error')
1
+ require 'zen/language/translation'
2
2
 
3
- #:nodoc:
4
3
  module Zen
5
4
  ##
6
- # The language module is used for writing and using text translations.
7
- # Translations are stored in a simple YAML file inside a directory called
8
- # "language" followed by a directory who's name matches the language code for
9
- # which it's translations should be used. Say we wanted to translate "Login"
10
- # and "Register" into different languages our YAML file would look like the
5
+ # ``Zen::Language`` is the heart of the multi language system that comes with
6
+ # Zen. It makes it easy to display localized bits of text as well as adding
7
+ # new collections of translated strings.
8
+ #
9
+ # ## Adding Languages
10
+ #
11
+ # Adding a new language can be done by using {Zen::Language.add}. This method
12
+ # works similar to the ones used by {Zen::Package} and {Zen::Theme}. An
13
+ # example of adding a language (English in this case) looks like the
11
14
  # following:
12
15
  #
13
- # ---
14
- # login: "Login"
15
- # register: "Register"
16
+ # Zen::Language.add do |lang|
17
+ # lang.name = 'en'
18
+ # lang.title = 'English'
19
+ # end
20
+ #
21
+ # When adding a language you **must** set the following items:
22
+ #
23
+ # * **name**: the language code as defined in [ISO 639][iso 639]. Examples of
24
+ # these codes are "en-GB", "nl", etc. At the moment Zen does not have
25
+ # different language files for British English and American English.
26
+ # * **title**: the name of the language in a human friendly form. This name
27
+ # should be set in the specific language. For example, for Dutch the title
28
+ # would be "Nederlands".
29
+ #
30
+ # Optionally you can also set the following attributes:
31
+ #
32
+ # * **rtl**: indicates that the language reads from right to left. When set to
33
+ # true the ``<html>`` tag will have an extra ``dir`` attribute so that
34
+ # browsers can properly display the text from right to left.
35
+ #
36
+ # ## Adding Translations
37
+ #
38
+ # Translations for a certain language are added using
39
+ # {Zen::Language::Translation}. Similar to languages these are added by
40
+ # calling ``.add()``. A simple example of adding a set of translations is the
41
+ # following:
42
+ #
43
+ # Zen::Language::Translation.add do |trans|
44
+ # trans.language = 'en'
45
+ # trans.name = 'foobar'
46
+ #
47
+ # trans.translate do |t|
48
+ #
49
+ # end
50
+ # end
51
+ #
52
+ # This adds a language collection called "foobar" for the English language.
53
+ # Translation strings are added inside the block of the ``translate()``
54
+ # method. Setting these strings works just like setting the keys and values of
55
+ # a hash:
56
+ #
57
+ # trans.translate do |t|
58
+ # t['hello'] = 'Hello World'
59
+ # end
60
+ #
61
+ # It is a good idea to group certain language strings together. For example,
62
+ # you might have a few strings related to page titles. The way of doing this
63
+ # is by simply separating groups with a dot in the keys:
64
+ #
65
+ # trans.translate do |t|
66
+ # t['titles.index'] = 'Example'
67
+ # t['titles.edit'] = 'Edit Example'
68
+ # end
69
+ #
70
+ # The keys specified in ``[]=`` should match the regular expression as defined
71
+ # in {Zen::Language::Translation::KEY_REGEX}. In plain English, they can only
72
+ # contain lower case letters, underscores and dots.
16
73
  #
17
- # If we save this file under parent_directory/language/en/tutorial.yml we
18
- # could then load that file as following:
74
+ # A full example:
19
75
  #
20
- # Zen::Language.load('tutorial')
76
+ # Zen::Language::Translation.add do |trans|
77
+ # trans.language = 'en'
78
+ # trans.name = 'foobar'
79
+ #
80
+ # trans.translate do |t|
81
+ # t['titles.index'] = 'Example'
82
+ # t['titles.edit'] = 'Edit Example'
83
+ # end
84
+ # end
85
+ #
86
+ # ## Organizing Languages
87
+ #
88
+ # In order for language files to be loaded by Zen you need to place them in
89
+ # certain directories using a certain file name. Language files should be
90
+ # named after the ``name`` setter/getter defined when calling
91
+ # {Zen::Language::Translation.add} (including casing) and should have ``.rb``
92
+ # as extension. These files should be placed in sub directories that match the
93
+ # language name they belong to. These directories in turn should be placed
94
+ # inside a "language" directory.
95
+ #
96
+ # In other words, our "foobar" example would be stored as following:
97
+ #
98
+ # language/
99
+ # |
100
+ # |__ en/
101
+ # |
102
+ # |__ foobar.rb
103
+ #
104
+ # Before you can load files from the language directory you'll need to add it
105
+ # to the list of directories to search each time a language file is loaded.
106
+ # Similar to how you can add view folders or helper folders in Ramaze you can
107
+ # add language folders:
108
+ #
109
+ # Zen::Language.options.paths << 'path/to/language'
21
110
  #
22
111
  # ## Loading Translations
23
112
  #
24
- # The load() method will look for a YAML file of which the name matches the
25
- # given string and can be found in the directory for the current language.
26
- # This means that if we were to switch our language without creating a
27
- # translation file for that language we wouldn't be able to use it
28
- # (makes sense right?).
113
+ # Once a language file has been added it must be loaded before it can be used.
114
+ # Loading a language file can be done in two ways:
115
+ #
116
+ # 1. Manually loading it by calling {Zen::Language.load}.
117
+ # 2. Calling {Zen::Language.lang} or ``lang()`` (injected into the global
118
+ # namespace).
29
119
  #
30
- # Once your translation file is in place and it's loaded it can be used using
31
- # the lang() method. Example:
120
+ # In the last case missing language files will be loaded if possible. However,
121
+ # it is recommended that you pre-load your language files before starting the
122
+ # application. By doing this these translations don't have to be loaded during
123
+ # an HTTP request which could potentially slow down the application.
32
124
  #
33
- # lang('tutorial.login') # => "Login"
125
+ # If we wanted to load the "foobar" language file mentioned earlier you can do
126
+ # this as following:
34
127
  #
35
- # ## Directory Structure
128
+ # Zen::Language.load('foobar')
36
129
  #
37
- # As mentioned earlier language files are saved in a certain directory. The
38
- # structure of this directory looks like the following:
130
+ # ## Using Translations
39
131
  #
40
- # parent directory
41
- # |
42
- # |__ language
43
- # |
44
- # |__ language key (e.g. "en")
45
- # |
46
- # |__ filename.yml
132
+ # Once the entire process of adding and loading a language file has been
133
+ # completed you can use the language strings defined in that file. This can be
134
+ # done by calling the global method ``lang()`` which is available in all
135
+ # scopes. If you happen to need it in a scope where it's overwritten you can
136
+ # call {Zen::Language.lang} instead.
47
137
  #
48
- # When loading a language file this module will loop through a certain number
49
- # of paths. The array containing all base directories to loop through can be
50
- # updated as following:
138
+ # A simple example of loading a few language strings of the file defined
139
+ # earlier in this guide looks like this:
51
140
  #
52
- # Zen::Language.options.paths.push('/path/to/directory')
141
+ # lang('foobar.titles.index')
53
142
  #
54
- # It's important that you _don't_ add a /language segment to the path, this
55
- # will be done automatically.
143
+ # Language keys should **always** be in the format of ``A.B`` where A is the
144
+ # name of the language file ("foobar" in this case) and B a dot separated
145
+ # string that points to the language string to load. This means that the
146
+ # following examples are not valid:
56
147
  #
57
- # ## Options
148
+ # lang('foobar')
149
+ # lang('foo bar')
58
150
  #
59
- # * language: Small string that defines the current language (e.g. "en").
60
- # * paths: Array of paths to look for a language directory. Note that this
61
- # should be the parent directory of the directory called "language", not the
62
- # actual directory itself.
151
+ # [iso 639]: https://en.wikipedia.org/wiki/ISO_639
63
152
  #
64
- # @author Yorick Peterse
65
153
  # @since 0.2
66
154
  #
67
- module Language
155
+ class Language
156
+ include Zen::Validation
68
157
  include Ramaze::Optioned
69
158
 
70
- class << self
71
- include Innate::Trinity
159
+ # Hash containing all the available languages.
160
+ REGISTERED = {}
161
+
162
+ options.dsl do
163
+ o 'Fallback language to use when it can not be retrieved from the user',
164
+ :language, 'en'
165
+
166
+ o 'Array of paths to look for the language files',
167
+ :paths, []
72
168
  end
73
169
 
74
- # Hash containing all the translations.
75
- Translations = {}
170
+ # The name of the language
171
+ attr_reader :name
76
172
 
77
- # Hash containing all the loaded language files for a language.
78
- Loaded = {}
173
+ # Whether or not the language reads from right to left.
174
+ attr_writer :rtl
79
175
 
80
- # Hash containing all the available languages.
81
- Languages = {
82
- 'en' => 'English',
83
- 'nl' => 'Nederlands'
84
- }
176
+ # The title of the language (in that specific language).
177
+ attr_accessor :title
85
178
 
86
- options.dsl do
87
- o 'Small string that defines the current language (e.g. "en").', :language, 'en'
88
- o 'Array of paths to look for the language files' , :paths , []
89
- end
179
+ # A hash of all the language files that have been loaded for a language. The
180
+ # values are the names of these collections and the values the instances of
181
+ # {Zen::Language::Translation}.
182
+ attr_accessor :collections
90
183
 
91
- ##
92
- # Tries to load a language file for the given name. If no language files
93
- # were found based on the name and the current language an exception will
94
- # be raised.
95
- #
96
- # Note that this method will load the language pack for *all* languages.
97
- #
98
- # @example
99
- # Zen::Language.load('user')
100
- #
101
- # @author Yorick Peterse
102
- # @since 0.1
103
- # @param [String] lang_name The name of the language file to load.
104
- #
105
- def self.load(lang_name)
106
- lang_name = lang_name.to_s
107
- file_found = false
108
-
109
- Languages.each do |language, label|
110
- Loaded[language] ||= []
111
- Translations[language] ||= {}
112
-
113
- # Abort of the file has already been loaded
114
- if Loaded.key?(language) and Loaded[language].include?(lang_name)
115
- file_found = true
116
- break
117
- end
184
+ class << self
185
+ ##
186
+ # Adds a new language.
187
+ #
188
+ # @example
189
+ # Zen::Language.add do |lang|
190
+ # lang.name = 'nl'
191
+ # lang.title = 'Nederlands'
192
+ # end
193
+ #
194
+ # @example Adding an RTL language (such as Japanese)
195
+ # Zen::Language.add do |lang|
196
+ # lang.name = '...'
197
+ # lang.title = '...'
198
+ # lang.rtl = true
199
+ # end
200
+ #
201
+ # @since 14-11-2011
202
+ # @yield Zen::Language
203
+ #
204
+ def add
205
+ lang = new
118
206
 
119
- self.options.paths.each do |path|
120
- path += "/language/#{language}/#{lang_name}.yml"
207
+ yield(lang)
121
208
 
122
- # Load the file and save it
123
- if File.exist?(path)
124
- file_found = true
125
- translation = YAML.load_file(path)
209
+ lang.validate
210
+
211
+ REGISTERED[lang.name] = lang
212
+ end
126
213
 
127
- Loaded[language].push(lang_name)
214
+ ##
215
+ # Loads the given language file for the currently used language. If the
216
+ # file has already been loaded this method will not load it again.
217
+ #
218
+ # @example
219
+ # Zen::Language.load('user')
220
+ #
221
+ # @since 0.1
222
+ # @param [String] lang_name The name of the language file to load.
223
+ # @param [String] lang The name of the language for which to load the
224
+ # collection. Set to the current language by default.
225
+ #
226
+ def load(lang_name, lang = nil)
227
+ lang_name = lang_name.to_s unless lang_name.is_a?(String)
228
+ language = REGISTERED[lang.to_s] || current
229
+
230
+ return if language.collections.keys.include?(lang_name)
128
231
 
129
- # Conver the hash to a dot based hash. This means that
130
- # {:person => {:age => 18}} would result in {'person.age' => 18}.
131
- translation = self.to_dotted_hash({lang_name.to_s => translation})
232
+ options.paths.each do |path|
233
+ path = File.join(path, language.name, "#{lang_name}.rb")
234
+
235
+ # Load the language
236
+ if File.exist?(path)
237
+ require(path)
238
+ language.collections[lang_name].load
132
239
 
133
- Translations[language].merge!(translation)
240
+ return
134
241
  end
135
242
  end
136
- end
137
243
 
138
- if file_found === false
139
244
  raise(
140
245
  Zen::LanguageError,
141
246
  "No language file could be found for \"#{lang_name}\""
142
247
  )
143
248
  end
144
- end
145
249
 
146
- private
250
+ ##
251
+ # Returns an instance of {Zen::Language} for the current language.
252
+ #
253
+ # @since 0.3
254
+ # @return [String]
255
+ #
256
+ def current
257
+ if !Ramaze::Current.actions.nil? and !Ramaze::Current.action.nil?
258
+ # The backend
259
+ if Ramaze::Current.action.node.request.env['SCRIPT_NAME'] \
260
+ =~ /^\/admin.*/
261
+ method = :language
262
+ # Probably the frontend
263
+ else
264
+ method = :frontend_language
265
+ end
266
+
267
+ # Extract the language from the current User object.
268
+ if Ramaze::Helper.const_defined?(:UserHelper)
269
+ model = Ramaze::Current.action.node.request \
270
+ .env[::Ramaze::Helper::UserHelper::RAMAZE_HELPER_USER]
271
+
272
+ if model.respond_to?(method)
273
+ lang = model.send(method)
274
+ end
275
+ end
276
+ end
277
+
278
+ # Make sure there always is a language set
279
+ if !lang
280
+ begin
281
+ if method
282
+ lang = get_setting(method).value
283
+ else
284
+ lang = get_setting(:language).value
285
+ end
286
+ rescue
287
+ lang = Zen::Language.options.language
288
+ end
289
+ end
290
+
291
+ return REGISTERED[lang]
292
+ end
293
+
294
+ ##
295
+ # Returns a hash where the keys are the language codes and the values the
296
+ # titles.
297
+ #
298
+ # @since 14-11-2011
299
+ # @return [Hash]
300
+ #
301
+ def to_hash
302
+ hash = {}
303
+
304
+ REGISTERED.each { |lang, obj| hash[lang] = obj.title }
305
+
306
+ return hash
307
+ end
308
+
309
+ ##
310
+ # Builds an HTML opening tag with the lang and rtl attributes set for the
311
+ # currently used language.
312
+ #
313
+ # @since 14-11-2011
314
+ # @return [String]
315
+ #
316
+ def html_head
317
+ curr = Zen::Language.current
318
+ head = "<html lang=\"#{curr.name}\""
319
+
320
+ if curr.rtl == true
321
+ header += ' dir="rtl"'
322
+ end
323
+
324
+ return head + '>'
325
+ end
326
+ end # class << self
147
327
 
148
328
  ##
149
- # Method that takes a hash or an array and converts it to a dot-based hash.
150
- # For example, the following hash:
329
+ # Creates a new instance of the class.
151
330
  #
152
- # {:name => 'Name', :location => {:street => 'Street', :address => 'Address'}}
331
+ # @since 14-11-2011
153
332
  #
154
- # would result in the following:
155
- #
156
- # {'name' => 'Name', 'location.street' => 'Street', 'location.address' => 'Address'}
157
- #
158
- # Using arrays would result in the following:
159
- #
160
- # to_dotted_hash(["Hello", "World"]) # => {'1' => 'Hello', '2' => 'World'}
333
+ def initialize
334
+ @loaded = []
335
+ @collections = {}
336
+ end
337
+
338
+ ##
339
+ # Sets the name of the language and converts it to a string.
161
340
  #
162
- # While it looks a bit goofy this allows you to do the following:
341
+ # @since 14-11-2011
342
+ # @param [#to_s] name The name of the language.
163
343
  #
164
- # lang('1') # => 'Hello'
344
+ def name=(name)
345
+ @name = name.is_a?(String) ? name : name.to_s
346
+ end
347
+
348
+ ##
349
+ # Returns a boolean that indicates whether or not the language reads from
350
+ # right to left.
165
351
  #
166
- # @example
167
- # self.to_dotted_hash({:name => "Yorick"}) # => {'name' => 'Yorick'}
352
+ # @since 14-11-2011
353
+ # @return [TrueClass|FalseClass]
168
354
  #
169
- # The code for this method was mostly taken from a comment on Stack Overflow.
170
- # This comment can be found here: <http://bit.ly/dHTjVR>
355
+ def rtl
356
+ return @rtl.nil? ? false : @rtl
357
+ end
358
+
359
+ ##
360
+ # Validates the current instance using {Zen::Validation}.
171
361
  #
172
- # @author Yorick Peterse
173
- # @since 0.2
174
- # @param [Hash/Array] source The hash or array to conver to a dot-based hash.
175
- # @param [Hash] target The hash to store the new key/values in.
176
- # @param [String] namespace The namespace for the key (e.g. "user.location").
177
- # @return [Hash] The converted hash where the keys are dot-based strings
178
- # instead of regular strings/symbols with sub hashes.
362
+ # @since 14-11-2011
179
363
  #
180
- def self.to_dotted_hash(source, target = {}, namespace = nil)
181
- if namespace and !namespace.nil?
182
- prefix = "#{namespace}."
183
- else
184
- prefix = ""
185
- end
364
+ def validate
365
+ validates_presence([:name, :title])
186
366
 
187
- if source.class == Hash
188
- source.each do |k, v|
189
- self.to_dotted_hash(v, target, "#{prefix}#{k}")
190
- end
191
- elsif source.class == Array
192
- source.each_with_index do |v, i|
193
- self.to_dotted_hash(v, target, "#{prefix}#{i}")
194
- end
195
- else
196
- if !namespace.nil?
197
- target[namespace] = source
198
- else
199
- target = source
200
- end
367
+ if REGISTERED.key?(name)
368
+ raise(Zen::ValidationError, "The language #{name} already exists.")
201
369
  end
202
-
203
- return target
204
370
  end
205
371
 
206
372
  #:nodoc:
207
373
  module SingletonMethods
208
374
  ##
209
- # Method for retrieving the correct language item based on the given
210
- # string. If you want to retrieve sub-items you can separate each level
211
- # with a dot:
212
- #
213
- # lang('tutorial.main.sub')
214
- #
215
- # This would require our YAML file to look something like the following:
216
- #
217
- # ---
218
- # main:
219
- # sub: "Something!"
220
- #
221
- # It's important to remember that your key should always include the name
222
- # of the language file since once a file is loaded it will be kept in
223
- # memory to reduce disk usage.
375
+ # Retrieves a single language string.
224
376
  #
225
377
  # @example
226
- # lang('username')
378
+ # lang('users.titles.index')
227
379
  #
228
- # @author Yorick Peterse
229
380
  # @since 0.2
230
- # @param [String] key The language key to select.
381
+ # @param [String] key The language key to retrieve.
231
382
  # @param [String] lang The language for which to retrieve the key,
232
- # overwrites the language set in the session.
383
+ # overwrites the language set in the session.
233
384
  # @return [Mixed]
234
385
  #
235
386
  def lang(key, lang = nil)
236
- if lang.nil?
237
- begin
238
- lang = action.node.session[:user].language
239
- rescue
240
- lang = ::Zen::Language.options.language
241
- end
242
- end
243
-
244
- groups = []
245
- translations = ::Zen::Language::Translations
246
-
247
- if !translations or !translations.key?(lang)
387
+ unless key =~ Zen::Language::Translation::KEY_REGEX
248
388
  raise(
249
389
  Zen::LanguageError,
250
- "No translation files have been added for the language code \"#{lang}\""
390
+ "The format of the language key \"#{key}\" is invalid"
251
391
  )
252
392
  end
253
393
 
254
- if translations[lang][key]
255
- return translations[lang][key]
394
+ lang = Zen::Language.current.name if lang.nil?
395
+ key = key.to_s unless key.is_a?(String)
396
+ lang = lang.to_s unless lang.is_a?(String)
397
+
398
+ unless Zen::Language::REGISTERED.key?(lang)
399
+ raise(Zen::LanguageError, "The language \"#{lang}\" doesn't exist")
400
+ end
401
+
402
+ group = key.split('.')[0]
403
+ cache_key = [lang, key].join('.')
404
+ got = Ramaze::Cache.translations.fetch(cache_key)
405
+
406
+ return got unless got.nil?
407
+
408
+ # It seems the language item couldn't be fetched. This can happen when
409
+ # the user change the language but hasn't loaded a specific language set
410
+ # yet. Lets load it and try again.
411
+ Zen::Language.load(group, lang)
412
+
413
+ got = Ramaze::Cache.translations.fetch(cache_key)
414
+
415
+ return got unless got.nil?
416
+
417
+ # Last step: check if the cache has been cleared. If this is the case
418
+ # the language pack should be reloaded, otherwise an error will be
419
+ # raised.
420
+ REGISTERED[lang].collections[group].load
421
+
422
+ got = Ramaze::Cache.translations.fetch(cache_key)
423
+
424
+ unless got.nil?
425
+ Ramaze::Log.warn(
426
+ "The language item \"#{key}\" has been added to the cache as it " \
427
+ 'appeared to be missing'
428
+ )
429
+
430
+ return got
256
431
  end
257
432
 
258
433
  raise(
@@ -260,6 +435,6 @@ module Zen
260
435
  "The specified language item \"#{key}\" does not exist"
261
436
  )
262
437
  end
263
- end
438
+ end # SingletonMethods
264
439
  end # Language
265
440
  end # Zen