alchemy_cms 2.1.4 → 2.1.5

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 (143) hide show
  1. data/Gemfile +1 -1
  2. data/README.md +11 -31
  3. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +3 -1
  4. data/app/assets/javascripts/alchemy/alchemy.windows.js +1 -1
  5. data/app/assets/stylesheets/alchemy/base.css.scss +0 -4
  6. data/app/assets/stylesheets/alchemy/buttons.css.scss +7 -4
  7. data/app/assets/stylesheets/alchemy/icons.css.scss +7 -1
  8. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +11 -15
  9. data/app/assets/{javascripts → stylesheets}/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +51 -18
  10. data/app/controllers/alchemy/admin/contents_controller.rb +5 -5
  11. data/app/controllers/alchemy/base_controller.rb +1 -1
  12. data/app/helpers/alchemy/admin/base_helper.rb +4 -7
  13. data/app/helpers/alchemy/admin/elements_helper.rb +2 -2
  14. data/app/models/alchemy/attachment.rb +1 -1
  15. data/app/models/alchemy/cell.rb +3 -3
  16. data/app/models/alchemy/content.rb +4 -4
  17. data/app/models/alchemy/element.rb +8 -8
  18. data/app/models/alchemy/essence_html.rb +1 -1
  19. data/app/models/alchemy/essence_richtext.rb +4 -4
  20. data/app/models/alchemy/essence_text.rb +1 -1
  21. data/app/models/alchemy/language.rb +10 -7
  22. data/app/models/alchemy/language/code.rb +19 -0
  23. data/app/models/alchemy/message.rb +6 -6
  24. data/app/models/alchemy/page.rb +26 -26
  25. data/app/models/alchemy/picture.rb +11 -13
  26. data/app/models/alchemy/user.rb +5 -5
  27. data/app/models/alchemy/user_session.rb +1 -1
  28. data/app/views/alchemy/admin/contents/destroy.js.erb +1 -1
  29. data/app/views/alchemy/admin/elements/create.js.erb +1 -0
  30. data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
  31. data/app/views/alchemy/admin/elements/index.html.erb +1 -1
  32. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +6 -6
  33. data/app/views/alchemy/admin/languages/_form.html.erb +47 -0
  34. data/app/views/alchemy/admin/languages/_language.html.erb +47 -0
  35. data/app/views/alchemy/admin/languages/_table.html.erb +33 -0
  36. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +4 -1
  37. data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -3
  38. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  39. data/config/locales/alchemy.de.yml +26 -22
  40. data/config/locales/alchemy.en.yml +2 -0
  41. data/config/routes.rb +2 -2
  42. data/db/migrate/20120216135355_add_country_code_to_languages.rb +9 -0
  43. data/lib/alchemy/i18n.rb +21 -14
  44. data/lib/alchemy/seeder.rb +2 -2
  45. data/lib/alchemy/version.rb +1 -1
  46. data/spec/dummy/db/schema.rb +5 -3
  47. data/spec/factories.rb +2 -2
  48. data/spec/models/language_spec.rb +22 -4
  49. data/vendor/assets/javascripts/tiny_mce/langs/de.js +0 -0
  50. data/vendor/assets/javascripts/tiny_mce/langs/en.js +0 -0
  51. data/vendor/assets/javascripts/tiny_mce/license.txt +0 -0
  52. data/vendor/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -137
  53. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -0
  54. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -0
  55. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -0
  56. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +0 -0
  57. data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +0 -0
  58. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +0 -0
  59. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +0 -0
  60. data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +0 -0
  61. data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +0 -0
  62. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +0 -0
  63. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +0 -0
  64. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +0 -0
  65. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +0 -0
  66. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +0 -0
  67. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +0 -0
  68. data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +0 -0
  69. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +0 -0
  70. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +0 -0
  71. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +0 -0
  72. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +5 -1
  73. data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +0 -0
  74. data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +0 -0
  75. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +0 -0
  76. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +0 -0
  77. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +0 -0
  78. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +0 -0
  79. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +0 -0
  80. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +0 -0
  81. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +0 -0
  82. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -1
  83. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +0 -0
  84. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  85. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
  86. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  87. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  88. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  89. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  90. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  91. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  92. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
  93. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
  94. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  95. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +0 -0
  96. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +0 -0
  97. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +0 -0
  98. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +0 -0
  99. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +0 -0
  100. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +0 -0
  101. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +0 -0
  102. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +0 -0
  103. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +0 -0
  104. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +0 -0
  105. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +0 -0
  106. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +0 -0
  107. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +0 -0
  108. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +0 -0
  109. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +0 -0
  110. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  111. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  112. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  113. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  114. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  115. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  116. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +0 -0
  117. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +0 -0
  118. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +0 -0
  119. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +0 -0
  120. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +0 -0
  121. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +0 -0
  122. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  123. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  124. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  125. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +0 -0
  126. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +0 -0
  127. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +0 -0
  128. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +0 -0
  129. data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
  130. data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +0 -0
  131. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +0 -0
  132. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +0 -0
  133. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +0 -0
  134. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +0 -0
  135. metadata +39 -42
  136. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  137. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  138. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  139. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  140. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  141. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  142. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  143. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +0 -90
@@ -1,6 +1,6 @@
1
1
  module Alchemy
2
2
  class UserSession < Authlogic::Session::Base
3
- logout_on_timeout(Rails.env != 'development')
3
+ logout_on_timeout(::Rails.env != 'development')
4
4
 
5
5
  before_destroy :unlock_pages
6
6
 
@@ -1,6 +1,6 @@
1
1
  (function($) {
2
2
 
3
- $('<%= @content_dom_id %>').remove();
3
+ $('#<%= content_dom_id(@content_dup) %>').remove();
4
4
  Alchemy.growl('<%= escape_javascript(@notice) %>');
5
5
  Alchemy.reloadPreview();
6
6
 
@@ -23,6 +23,7 @@
23
23
  Alchemy.ElementDirtyObserver('#element_<%= @element.id -%>');
24
24
  Alchemy.SelectBox('#element_<%= @element.id -%> select');
25
25
  Alchemy.ButtonObserver('#element_<%= @element.id -%> button.button');
26
+ Alchemy.Datepicker('#element_<%= @element.id -%> input[type="date"]');
26
27
 
27
28
  <%- if @clipboard.blank? -%>
28
29
  $('#clipboard_button .icon.clipboard').removeClass('full');
@@ -10,8 +10,6 @@
10
10
  $('#element_area .sortable_cell').sortable('refresh');
11
11
  Alchemy.ElementEditorSelector.reinit('.element_editor[data-element-id="<%= @element.id -%>"]');
12
12
 
13
- Alchemy.ButtonObserver('.element_editor[data-element-id="<%= @element.id -%>"] button.button');
14
-
15
13
  <%- if @element.folded -%>
16
14
 
17
15
  <%- @element.rtf_contents.each do |content| -%>
@@ -32,6 +30,8 @@
32
30
  <%- end -%>
33
31
 
34
32
  Alchemy.ElementDirtyObserver('#element_<%= @element.id -%>');
33
+ Alchemy.Datepicker('#element_<%= @element.id -%> input[type="date"]');
34
+ Alchemy.ButtonObserver('.element_editor[data-element-id="<%= @element.id -%>"] button.button');
35
35
  <%- end -%>
36
36
 
37
37
  <%- end -%>
@@ -5,7 +5,7 @@
5
5
  <%- @elements.each do |cell, elements| -%>
6
6
  <li>
7
7
  <a href="#cell_<%= cell.name -%>">
8
- <%= cell.name == 'for_other_elements' ? t('other Elements') : t("alchemy.cell_names.#{cell.name}", :default => cell.name.camelcase) -%>
8
+ <%= cell.name == 'for_other_elements' ? t('other Elements') : t(cell.name, :scope => :cell_names) -%>
9
9
  </a>
10
10
  </li>
11
11
  <%- end -%>
@@ -10,23 +10,23 @@
10
10
  <%- if @options[:caption_as_textarea] -%>
11
11
  <%= f.text_area "caption", :class => 'thin_border' %>
12
12
  <%- else -%>
13
- <%= f.text_field "caption", :class => 'thin_border long' %>
13
+ <%= f.text_field "caption", :class => 'thin_border' %>
14
14
  <%- end -%>
15
15
  </td>
16
16
  </tr>
17
17
  <tr>
18
18
  <td class="label"><%= f.label "title" %></td>
19
- <td class="input"><%= f.text_field "title", :class => 'thin_border long' %></td>
19
+ <td class="input"><%= f.text_field "title", :class => 'thin_border' %></td>
20
20
  </tr>
21
21
  <tr>
22
22
  <td class="label"><%= f.label "alt_tag" %></td>
23
- <td class="input"><%= f.text_field "alt_tag", :class => 'thin_border long' %></td>
23
+ <td class="input"><%= f.text_field "alt_tag", :class => 'thin_border' %></td>
24
24
  </tr>
25
25
  <%# Have to use a Hash here, because Rails has a Hash.to_params bug with nested Arrays!!!! %>
26
26
  <%- if @options[:sizes].is_a?(HashWithIndifferentAccess) -%>
27
27
  <tr>
28
28
  <td class="label"><%= f.label "render_size" %></td>
29
- <td class="input">
29
+ <td class="select">
30
30
  <%= f.select(
31
31
  "render_size",
32
32
  options_for_select(
@@ -46,7 +46,7 @@
46
46
  <%- if @options[:image_float_selector] -%>
47
47
  <tr>
48
48
  <td class="label"><%= f.label "css_class" %></td>
49
- <td class="input">
49
+ <td class="select">
50
50
  <%= f.select "css_class", [[t("Layout default"), ""], [t("above"), "no_float"], [t("left"), "left"], [t("right"), "right"]] %>
51
51
  </td>
52
52
  </tr>
@@ -54,7 +54,7 @@
54
54
  <%- elsif @options[:css_classes].is_a?(HashWithIndifferentAccess) -%>
55
55
  <tr>
56
56
  <td class="label"><%= f.label "css_class" %></td>
57
- <td class="input">
57
+ <td class="select">
58
58
  <%= f.select("css_class", options_for_select([[t('None'), '']] + @options[:css_classes].sort, @essence_picture.css_class)) %>
59
59
  </td>
60
60
  </tr>
@@ -0,0 +1,47 @@
1
+ <%= form_for [resource_url_scope, :admin, resource_instance_variable], :remote => true, :html => {:style => 'width: 403px'} do |f| %>
2
+ <div id="errors" style="display: none"></div>
3
+ <table>
4
+ <tr>
5
+ <td class="label"><%= f.label :name %></td>
6
+ <td class="input"><%= f.text_field :name, :class => 'thin_border long' -%></td>
7
+ </tr>
8
+ <tr>
9
+ <td class="label"><%= f.label :language_code %></td>
10
+ <td class="input"><%= f.text_field :language_code, :class => 'thin_border long', :placeholder => t(:language_code_placeholder) -%></td>
11
+ </tr>
12
+ <tr>
13
+ <td class="label"><%= f.label :country_code %>*</td>
14
+ <td class="input">
15
+ <%= f.text_field :country_code, :class => 'thin_border long', :placeholder => t(:country_code_placeholder) -%>
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td class="label"><%= f.label :frontpage_name %></td>
20
+ <td class="input"><%= f.text_field :frontpage_name, :class => 'thin_border long' -%></td>
21
+ </tr>
22
+ <tr>
23
+ <td class="label"><%= f.label :page_layout %></td>
24
+ <td class="input"><%= f.text_field :page_layout, :class => 'thin_border long' -%></td>
25
+ </tr>
26
+ <tr>
27
+ <td class="label"><%= f.label :public %></td>
28
+ <td class="checkbox"><%= f.check_box :public -%></td>
29
+ </tr>
30
+ <tr>
31
+ <td class="label"><%= f.label :default -%></td>
32
+ <td class="checkbox"><%= f.check_box :default -%></td>
33
+ </tr>
34
+ <tr>
35
+ <td colspan="2">
36
+ <p class="foot_note">
37
+ * Der Ländercode ist nur notwendig, wenn Sie mehrere Länder mit unterschiedlichen Sprachen versehen wollen.
38
+ </p>
39
+ </td>
40
+ </tr>
41
+ <tr>
42
+ <td class="submit" colspan="2">
43
+ <%= f.button t('save'), :class => 'button' %>
44
+ </td>
45
+ </tr>
46
+ </table>
47
+ <% end %>
@@ -0,0 +1,47 @@
1
+ <tr class="<%= cycle('even', 'odd') %>">
2
+ <td>
3
+ <%= language.name %>
4
+ </td>
5
+ <td>
6
+ <%= language.language_code %>
7
+ </td>
8
+ <td>
9
+ <%= language.country_code %>
10
+ </td>
11
+ <td>
12
+ <%= language.frontpage_name %>
13
+ </td>
14
+ <td>
15
+ <%= language.page_layout %>
16
+ </td>
17
+ <td class="center">
18
+ <%= language.public? ? render_icon('true') : '' %>
19
+ </td>
20
+ <td class="center">
21
+ <%= language.default? ? render_icon('true') : '' %>
22
+ </td>
23
+ <td class="tools">
24
+ <%- permitted_to?(:destroy, :alchemy_admin_languages) do -%>
25
+ <%= link_to_confirmation_window(
26
+ '',
27
+ t("Are you sure?"),
28
+ alchemy.admin_language_path(language),
29
+ :title => t("Delete"),
30
+ :class => "icon destroy"
31
+ ) -%>
32
+ <%- end -%>
33
+ <%- permitted_to?(:edit, :alchemy_admin_languages) do -%>
34
+ <%= link_to_overlay_window(
35
+ '',
36
+ alchemy.edit_admin_language_path(language),
37
+ {
38
+ :title => t("Edit")
39
+ },
40
+ {
41
+ :class => "icon edit",
42
+ :title => t("Edit")
43
+ }
44
+ ) -%>
45
+ <%- end -%>
46
+ </td>
47
+ </tr>
@@ -0,0 +1,33 @@
1
+ <%- if @languages.any? -%>
2
+ <table class="list" id="languages_list">
3
+ <tr>
4
+ <th>
5
+ <%= Alchemy::Language.human_attribute_name(:name) %>
6
+ </th>
7
+ <th>
8
+ <%= Alchemy::Language.human_attribute_name(:language_code) %>
9
+ </th>
10
+ <th>
11
+ <%= Alchemy::Language.human_attribute_name(:country_code) %>
12
+ </th>
13
+ <th>
14
+ <%= Alchemy::Language.human_attribute_name(:frontpage_name) %>
15
+ </th>
16
+ <th>
17
+ <%= Alchemy::Language.human_attribute_name(:page_layout) %>
18
+ </th>
19
+ <th class="center">
20
+ <%= Alchemy::Language.human_attribute_name(:public) %>
21
+ </th>
22
+ <th class="center">
23
+ <%= Alchemy::Language.human_attribute_name(:default) %>
24
+ </th>
25
+ <th class="tools"></th>
26
+ </tr>
27
+ <%= render_resources %>
28
+ </table>
29
+ <%- elsif params[:query] -%>
30
+ <p><%= t('Nothing found') %></p>
31
+ <%- end -%>
32
+
33
+ <%= render 'alchemy/admin/partials/pagination_links', :items => @languages, :scope => alchemy %>
@@ -1,3 +1,4 @@
1
+ <% if options[:crop].to_s == 'true' && content.ingredient %>
1
2
  <%= link_to_overlay_window(
2
3
  render_icon('crop'),
3
4
  alchemy.crop_admin_essence_picture_path(content.essence, :options => options),
@@ -6,10 +7,12 @@
6
7
  :title => t('Edit Picturemask')
7
8
  },
8
9
  {
9
- :class => necessary_options_for_cropping_provided?(options) && content.ingredient ? nil : 'disabled',
10
10
  :title => t('Edit Picturemask')
11
11
  }
12
12
  ) %>
13
+ <%- else -%>
14
+ <a href="#" class="disabled"><%= render_icon('crop') %></a>
15
+ <%- end -%>
13
16
 
14
17
  <%= link_to_overlay_window(
15
18
  render_icon('swap_picture'),
@@ -14,9 +14,7 @@
14
14
  ),
15
15
  {
16
16
  :alt => (content.essence.alt_tag.blank? ? nil : content.essence.alt_tag),
17
- :title => (content.essence.title.blank? ? nil : content.essence.title),
18
- :id => dom_id(content.essence.picture),
19
- :style => (options[:crop] && !options[:image_size].blank?) || (!options[:crop] && options[:image_size].blank?) ? "width: #{options[:image_size].blank? ? content.essence.picture.image_width : options[:image_size].split('x')[0]}px; height: #{options[:image_size].blank? ? content.essence.picture.image_height : options[:image_size].split('x')[1]}px" : nil
17
+ :title => (content.essence.title.blank? ? nil : content.essence.title)
20
18
  }.merge(html_options)
21
19
  ) -%>
22
20
 
@@ -49,7 +49,7 @@
49
49
  <%= link_to_confirmation_window(
50
50
  render_icon('delete-small'),
51
51
  t('Do you really want to delete this content?'),
52
- alchemy.content_path(content),
52
+ alchemy.admin_content_path(content),
53
53
  :class => 'icon_button small',
54
54
  :title => t('Remove this content')
55
55
  ) if content.settings[:deletable] %>
@@ -341,6 +341,7 @@ de:
341
341
  copy_element: "Element kopieren"
342
342
  copy_page: "Seite kopieren"
343
343
  copy_language_tree_heading: "Einen Sprachbaum kopieren"
344
+ country_code_placeholder: 'z.B. at (optional)'
344
345
  create: "erstellen"
345
346
  "Create language": "Eine neue Sprache erstellen"
346
347
  create_language_tree_heading: "Einen leeren Sprachbaum erstellen"
@@ -397,6 +398,7 @@ de:
397
398
  "item removed from clipboard": "%{name} wurde aus der Zwischenablage entfernt."
398
399
  javascript_disabled_headline: "Javascript ist deaktiviert!"
399
400
  javascript_disabled_text: "Alchemy funktioniert nur einwandfrei mit aktiviertem Javascript. Bitte aktivieren Sie es in Ihrem Browser."
401
+ language_code_placeholder: 'z.B. de'
400
402
  language_does_not_exist: "Dieser Sprachbaum existiert noch nicht"
401
403
  language_pages_copied: "Der Sprachbaum wurde kopiert"
402
404
  left: "links"
@@ -711,7 +713,8 @@ de:
711
713
  picture_id: Bild
712
714
 
713
715
  alchemy/language:
714
- code: "Sprachkürzel"
716
+ country_code: "Länderkürzel"
717
+ language_code: "Sprachkürzel"
715
718
  default: "Standardsprache"
716
719
  frontpage_name: "Name der Startseite"
717
720
  name: "Name"
@@ -762,26 +765,26 @@ de:
762
765
  body: ""
763
766
 
764
767
  messages:
765
- inclusion: "%{attribute} ist kein gültiger Wert"
766
- exclusion: "%{attribute} ist nicht verfügbar"
767
- invalid: "%{attribute} ist nicht gültig"
768
+ inclusion: "ist kein gültiger Wert"
769
+ exclusion: "ist nicht verfügbar"
770
+ invalid: "ist nicht gültig"
768
771
  record_invalid: 'Validierung von %{errors} ist fehlgeschlagen'
769
- confirmation: "%{attribute} stimmt nicht mit der Bestätigung überein"
770
- accepted: "%{attribute} muss akzeptiert werden"
771
- empty: "%{attribute} muss ausgefüllt werden"
772
- blank: "%{attribute} muss ausgefüllt werden"
773
- too_long: "%{attribute} ist zu lang (nicht mehr als %{count} Zeichen)"
774
- too_short: "%{attribute} ist zu kurz (nicht weniger als %{count} Zeichen)"
775
- wrong_length: "%{attribute} hat die falsche Länge (muss genau %{count} Zeichen haben)"
776
- taken: "%{attribute} ist bereits vergeben"
777
- not_a_number: "%{attribute} ist keine Zahl"
778
- greater_than: "%{attribute} muss größer als %{count} sein"
779
- greater_than_or_equal_to: "%{attribute} muss größer oder gleich %{count} sein"
780
- equal_to: "%{attribute} muss genau %{count} sein"
781
- less_than: "%{attribute} muss kleiner als %{count} sein"
782
- less_than_or_equal_to: "%{attribute} muss kleiner oder gleich %{count} sein"
783
- odd: "%{attribute} muss ungerade sein"
784
- even: "%{attribute} muss gerade sein"
772
+ confirmation: "stimmt nicht mit der Bestätigung überein"
773
+ accepted: "muss akzeptiert werden"
774
+ empty: "muss ausgefüllt werden"
775
+ blank: "muss ausgefüllt werden"
776
+ too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
777
+ too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
778
+ wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
779
+ taken: "ist bereits vergeben"
780
+ not_a_number: "ist keine Zahl"
781
+ greater_than: "muss größer als %{count} sein"
782
+ greater_than_or_equal_to: "muss größer oder gleich %{count} sein"
783
+ equal_to: "muss genau %{count} sein"
784
+ less_than: "muss kleiner als %{count} sein"
785
+ less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
786
+ odd: "muss ungerade sein"
787
+ even: "muss gerade sein"
785
788
 
786
789
  models:
787
790
  alchemy/content:
@@ -790,8 +793,9 @@ de:
790
793
  validation_failed: 'Validierung fehlgeschlagen.'
791
794
  alchemy/language:
792
795
  attributes:
793
- code:
794
- invalid: '^Sprachkürzel ist nicht korrekt. Bitte exakt zwei Kleinbuchstaben verwenden.'
796
+ language_code:
797
+ invalid: 'ist nicht korrekt. Bitte exakt zwei Kleinbuchstaben verwenden.'
798
+ taken: 'ist für dieses Länderkürzel bereits vergeben.'
795
799
 
796
800
  # Translations for the authentication system used in alchemy.
797
801
  authlogic:
@@ -199,6 +199,7 @@ en:
199
199
  copy_element: "Copy this element"
200
200
  copy_language_tree_heading: "Copy page tree"
201
201
  copy_page: "Copy page"
202
+ country_code_placeholder: 'i.e. us (optional)'
202
203
  "Create language": "Create a new language"
203
204
  create_language_tree_heading: "Create empty language tree"
204
205
  create_page: "Create a new subpage"
@@ -255,6 +256,7 @@ en:
255
256
  "item removed from clipboard": "Removed %{name} from clipboard"
256
257
  javascript_disabled_headline: "Javascript is disabled!"
257
258
  javascript_disabled_text: "Alchemy needs Javascript to run smoothly. Please enable it in your browser settings."
259
+ language_code_placeholder: 'i.e. en'
258
260
  language_does_not_exist: "This language tree does not exist"
259
261
  language_pages_copied: "Language tree succesfully copied."
260
262
  link_image: "Link this image."
data/config/routes.rb CHANGED
@@ -139,12 +139,12 @@ Alchemy::Engine.routes.draw do
139
139
  end
140
140
 
141
141
  match '/:lang' => 'pages#show',
142
- :constraints => {:lang => /[a-z]{2}/},
142
+ :constraints => {:lang => /[a-z]{2}(-[a-z]{2})?/},
143
143
  :as => :show_language_root
144
144
 
145
145
  # The page show action has to be last route
146
146
  match '(/:lang)(/:level1(/:level2(/:level3)))/:urlname(.:format)' => 'pages#show',
147
- :constraints => {:lang => /[a-z]{2}/},
147
+ :constraints => {:lang => /[a-z]{2}(-[a-z]{2})?/},
148
148
  :as => :show_page
149
149
 
150
150
  end
@@ -0,0 +1,9 @@
1
+ class AddCountryCodeToLanguages < ActiveRecord::Migration
2
+ def change
3
+ add_column :alchemy_languages, :country_code, :string
4
+ rename_column :alchemy_languages, :code, :language_code
5
+ remove_index :alchemy_languages, :name => :index_languages_on_code
6
+ add_index :alchemy_languages, :language_code
7
+ add_index :alchemy_languages, [:language_code, :country_code]
8
+ end
9
+ end
data/lib/alchemy/i18n.rb CHANGED
@@ -1,28 +1,35 @@
1
1
  module Alchemy
2
2
  class I18n
3
3
 
4
- ## Thanks Typus for this I18n hack!
4
+ # A I18n Proxy for Alchemy translations
5
5
  #
6
6
  # Instead of having to translate strings and defining a default value:
7
- #
8
- # AlchemyAlchemy::I18n.t("Hello World!", :default => 'Hello World!')
9
- #
7
+ #
8
+ # Alchemy::I18n.t("Hello World!", :default => 'Hello World!')
9
+ #
10
10
  # We define this method to define the value only once:
11
- #
12
- # AlchemyAlchemy::I18n.t("Hello World!")
13
- #
11
+ #
12
+ # Alchemy::I18n.t("Hello World!")
13
+ #
14
14
  # Note that interpolation still works:
15
- #
16
- # AlchemyAlchemy::I18n.t("Hello %{world}!", :world => @world)
17
- #
18
- # Notes:
19
- # -----
20
15
  #
21
- # Already scoped to alchemy namespace!
16
+ # Alchemy::I18n.t("Hello %{world}!", :world => @world)
17
+ #
18
+ # === Notes
19
+ #
20
+ # All translations are scoped into the +alchemy+ namespace.
21
+ # Even scopes are scoped into the +alchemy+ namespace.
22
+ #
23
+ # So a call for t('hello', :scope => :world) has to be translated like this:
24
+ #
25
+ # de:
26
+ # alchemy:
27
+ # world:
28
+ # hello: Hallo
22
29
  #
23
30
  def self.t(msg, *args)
24
31
  options = args.extract_options!
25
- options[:default] = options[:default] ? options[:default] : msg
32
+ options[:default] = options[:default] ? options[:default] : msg.to_s.humanize
26
33
  scope = ['alchemy']
27
34
  case options[:scope].class.name
28
35
  when "Array"