diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-25 14:24:03 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-25 14:24:03 +0200 |
| commit | de9a3a5591d4b17c0e0f17abc0ee8ffe85de50e6 (patch) | |
| tree | a66f5f798399a72a1a351c72ff1f4c864d2d5514 | |
| parent | baace1fa5df46694ddd515dc3bbca59b22df8692 (diff) | |
Extract admin strings to i18n: assets and events clusters
| -rw-r--r-- | app/models/concerns/rrule_humanizer.rb | 3 | ||||
| -rw-r--r-- | app/views/assets/edit.html.erb | 32 | ||||
| -rw-r--r-- | app/views/assets/index.html.erb | 18 | ||||
| -rw-r--r-- | app/views/assets/new.html.erb | 28 | ||||
| -rw-r--r-- | app/views/assets/show.html.erb | 30 | ||||
| -rw-r--r-- | app/views/events/_rrule_builder.html.erb | 22 | ||||
| -rw-r--r-- | app/views/events/edit.html.erb | 38 | ||||
| -rw-r--r-- | app/views/events/index.html.erb | 24 | ||||
| -rw-r--r-- | app/views/events/new.html.erb | 30 | ||||
| -rw-r--r-- | app/views/events/show.html.erb | 32 | ||||
| -rw-r--r-- | app/views/events/without_node.html.erb | 20 | ||||
| -rw-r--r-- | config/locales/de.yml | 99 | ||||
| -rw-r--r-- | config/locales/en.yml | 99 |
13 files changed, 337 insertions, 138 deletions
diff --git a/app/models/concerns/rrule_humanizer.rb b/app/models/concerns/rrule_humanizer.rb index 07141c16..6d6a4195 100644 --- a/app/models/concerns/rrule_humanizer.rb +++ b/app/models/concerns/rrule_humanizer.rb | |||
| @@ -11,7 +11,8 @@ module RruleHumanizer | |||
| 11 | }.freeze | 11 | }.freeze |
| 12 | 12 | ||
| 13 | WEEKDAY_NAMES_ABBR = { | 13 | WEEKDAY_NAMES_ABBR = { |
| 14 | de: { "MO"=>"Mo","TU"=>"Di","WE"=>"Mi","TH"=>"Do","FR"=>"Fr","SA"=>"Sa","SU"=>"So" } | 14 | de: { "MO"=>"Mo","TU"=>"Di","WE"=>"Mi","TH"=>"Do","FR"=>"Fr","SA"=>"Sa","SU"=>"So" }, |
| 15 | :en => { "MO" => "Mon", "TU" => "Tue", "WE" => "Wed", "TH" => "Thu", "FR" => "Fri", "SA" => "Sat", "SU" => "Sun" }, | ||
| 15 | }.freeze | 16 | }.freeze |
| 16 | 17 | ||
| 17 | ORDINAL_NAMES = { | 18 | ORDINAL_NAMES = { |
diff --git a/app/views/assets/edit.html.erb b/app/views/assets/edit.html.erb index 46f8ed9f..5214e082 100644 --- a/app/views/assets/edit.html.erb +++ b/app/views/assets/edit.html.erb | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | <div id="admin_layout"> | 1 | <div id="admin_layout"> |
| 2 | <h1>Editing asset</h1> | 2 | <h1><%= t(".title") %></h1> |
| 3 | 3 | ||
| 4 | <%= form_for(@asset, html: { multipart: true }) do |f| %> | 4 | <%= form_for(@asset, html: { multipart: true }) do |f| %> |
| 5 | <%= form_error_messages(f) %> | 5 | <%= form_error_messages(f) %> |
| @@ -9,56 +9,56 @@ | |||
| 9 | <div class="layout_row_content"><%= f.text_field :name %></div> | 9 | <div class="layout_row_content"><%= f.text_field :name %></div> |
| 10 | 10 | ||
| 11 | <% if @asset.upload.present? %> | 11 | <% if @asset.upload.present? %> |
| 12 | <div class="layout_row_label">Current File</div> | 12 | <div class="layout_row_label"><%= t(".current_file") %></div> |
| 13 | <div class="layout_row_content"><%= @asset.upload.url %> (<%= number_to_human_size(@asset.upload.size) %>)</div> | 13 | <div class="layout_row_content"><%= @asset.upload.url %> (<%= number_to_human_size(@asset.upload.size) %>)</div> |
| 14 | <% end %> | 14 | <% end %> |
| 15 | 15 | ||
| 16 | <div class="layout_row_label"><%= f.label :upload, "Replace file" %></div> | 16 | <div class="layout_row_label"><%= f.label :upload, t(".replace_file") %></div> |
| 17 | <div class="layout_row_content"> | 17 | <div class="layout_row_content"> |
| 18 | <div id="asset_dropzone"> | 18 | <div id="asset_dropzone"> |
| 19 | <%= f.file_field :upload %> | 19 | <%= f.file_field :upload %> |
| 20 | <p class="field_hint">…or drop a file here.</p> | 20 | <p class="field_hint"><%= t("assets.form.drop_hint") %></p> |
| 21 | </div> | 21 | </div> |
| 22 | </div> | 22 | </div> |
| 23 | 23 | ||
| 24 | <div class="layout_row_label"><%= f.label :creator %></div> | 24 | <div class="layout_row_label"><%= f.label :creator %></div> |
| 25 | <div class="layout_row_content"><%= f.text_field :creator %></div> | 25 | <div class="layout_row_content"><%= f.text_field :creator %></div> |
| 26 | 26 | ||
| 27 | <div class="layout_row_label"><%= f.label :source_url, "Source URL" %></div> | 27 | <div class="layout_row_label"><%= f.label :source_url %></div> |
| 28 | <div class="layout_row_content"><%= f.text_field :source_url %></div> | 28 | <div class="layout_row_content"><%= f.text_field :source_url %></div> |
| 29 | 29 | ||
| 30 | <div class="layout_row_label"><%= f.label :license_key, "License" %></div> | 30 | <div class="layout_row_label"><%= f.label :license_key %></div> |
| 31 | <div class="layout_row_content"> | 31 | <div class="layout_row_content"> |
| 32 | <%= f.select :license_key, | 32 | <%= f.select :license_key, |
| 33 | options_for_select( | 33 | options_for_select( |
| 34 | [["— none —", ""]] + AssetLicense.keys.map { |key| [t("asset_licenses.#{key}"), key] }, | 34 | [[t("assets.form.none_option"), ""]] + AssetLicense.keys.map { |key| [t("asset_licenses.#{key}"), key] }, |
| 35 | @asset.license_key | 35 | @asset.license_key |
| 36 | ) %> | 36 | ) %> |
| 37 | </div> | 37 | </div> |
| 38 | 38 | ||
| 39 | <div class="layout_row_label">attach to page</div> | 39 | <div class="layout_row_label"><%= t("assets.form.attach_to_page") %></div> |
| 40 | <div class="layout_row_content"> | 40 | <div class="layout_row_content"> |
| 41 | <div class="restore_picker"> | 41 | <div class="restore_picker"> |
| 42 | <%= text_field_tag :asset_node_search_term, @attach_node&.title, | 42 | <%= text_field_tag :asset_node_search_term, @attach_node&.title, |
| 43 | :placeholder => "Search for a page…", :autocomplete => "off" %> | 43 | :placeholder => t("assets.form.attach_search_placeholder"), :autocomplete => "off" %> |
| 44 | <div id="asset_node_search_results" class="search_results" style="display: none"></div> | 44 | <div id="asset_node_search_results" class="search_results" style="display: none"></div> |
| 45 | </div> | 45 | </div> |
| 46 | <%= hidden_field_tag :node_id, @attach_node&.id %> | 46 | <%= hidden_field_tag :node_id, @attach_node&.id %> |
| 47 | <span class="field_hint">Optional — attaches this asset to that page, all pending versions included.</span> | 47 | <span class="field_hint"><%= t("assets.form.attach_hint") %></span> |
| 48 | </div> | 48 | </div> |
| 49 | 49 | ||
| 50 | <div class="layout_row_label"></div> | 50 | <div class="layout_row_label"></div> |
| 51 | <div class="layout_row_content"> | 51 | <div class="layout_row_content"> |
| 52 | <label><%= check_box_tag :headline, "1" %> attach as the page's headline</label> | 52 | <label><%= check_box_tag :headline, "1" %> <%= t("assets.form.as_headline") %></label> |
| 53 | <span class="field_hint">Applies only if the page has no headline yet.</span> | 53 | <span class="field_hint"><%= t("assets.form.headline_hint") %></span> |
| 54 | </div> | 54 | </div> |
| 55 | 55 | ||
| 56 | <div class="layout_row_label">Actions</div> | 56 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> |
| 57 | <div class="layout_row_content info_group"> | 57 | <div class="layout_row_content info_group"> |
| 58 | <div class="info_group_items"> | 58 | <div class="info_group_items"> |
| 59 | <div class="info_item"><%= f.submit 'Update' %></div> | 59 | <div class="info_item"><%= f.submit t("admin.common.update") %></div> |
| 60 | <div class="info_item"><%= link_to 'Show', @asset %></div> | 60 | <div class="info_item"><%= link_to t("admin.common.show"), @asset %></div> |
| 61 | <div class="info_item"><%= link_to 'Back', assets_path %></div> | 61 | <div class="info_item"><%= link_to t("admin.common.back"), assets_path %></div> |
| 62 | </div> | 62 | </div> |
| 63 | </div> | 63 | </div> |
| 64 | </div> | 64 | </div> |
diff --git a/app/views/assets/index.html.erb b/app/views/assets/index.html.erb index ff1300a2..81d2686a 100644 --- a/app/views/assets/index.html.erb +++ b/app/views/assets/index.html.erb | |||
| @@ -1,16 +1,16 @@ | |||
| 1 | <h1>Assets</h1> | 1 | <h1><%= t(".title") %></h1> |
| 2 | 2 | ||
| 3 | <%= link_to new_asset_path, class: 'action_button' do %> | 3 | <%= link_to new_asset_path, class: 'action_button' do %> |
| 4 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create asset | 4 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> <%= t(".create_asset") %> |
| 5 | <% end %> | 5 | <% end %> |
| 6 | 6 | ||
| 7 | <%= will_paginate @assets %> | 7 | <%= will_paginate @assets %> |
| 8 | 8 | ||
| 9 | <table class="assets_table"> | 9 | <table class="assets_table"> |
| 10 | <tr class="header"> | 10 | <tr class="header"> |
| 11 | <th>Preview</th> | 11 | <th><%= t("admin.columns.preview") %></th> |
| 12 | <th>Name</th> | 12 | <th><%= t("admin.columns.name") %></th> |
| 13 | <th>Type</th> | 13 | <th><%= t("admin.columns.type") %></th> |
| 14 | <th></th> | 14 | <th></th> |
| 15 | <th></th> | 15 | <th></th> |
| 16 | <th></th> | 16 | <th></th> |
| @@ -20,10 +20,10 @@ | |||
| 20 | <td><% if asset.has_variant?(:thumb) %><%= image_tag asset.upload.url(:thumb), style: "max-width: 100px; max-height: 100px;" %><% end %></td> | 20 | <td><% if asset.has_variant?(:thumb) %><%= image_tag asset.upload.url(:thumb), style: "max-width: 100px; max-height: 100px;" %><% end %></td> |
| 21 | <td><%= link_to asset.name, asset.upload.url %></td> | 21 | <td><%= link_to asset.name, asset.upload.url %></td> |
| 22 | <td><%= asset.upload.content_type %></td> | 22 | <td><%= asset.upload.content_type %></td> |
| 23 | <td><%= link_to 'Show', asset %></td> | 23 | <td><%= link_to t("admin.common.show"), asset %></td> |
| 24 | <td><%= link_to 'Edit', edit_asset_path(asset) %></td> | 24 | <td><%= link_to t("admin.common.edit"), edit_asset_path(asset) %></td> |
| 25 | <td><%= button_to asset, method: :delete, form: { data: { confirm: 'Are you sure?' }, class: 'button_to destructive' } do %> | 25 | <td><%= button_to asset, method: :delete, form: { data: { confirm: t("admin.common.confirm_sure") }, class: 'button_to destructive' } do %> |
| 26 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy | 26 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.destroy") %> |
| 27 | <% end %></td> | 27 | <% end %></td> |
| 28 | </tr> | 28 | </tr> |
| 29 | <% end %> | 29 | <% end %> |
diff --git a/app/views/assets/new.html.erb b/app/views/assets/new.html.erb index 7bb8a9ce..51e66cd2 100644 --- a/app/views/assets/new.html.erb +++ b/app/views/assets/new.html.erb | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | <div id="admin_layout"> | 1 | <div id="admin_layout"> |
| 2 | <h1>New asset</h1> | 2 | <h1><%= t(".title") %></h1> |
| 3 | 3 | ||
| 4 | <%= form_for(@asset, :html => { :multipart => true }) do |f| %> | 4 | <%= form_for(@asset, :html => { :multipart => true }) do |f| %> |
| 5 | <%= form_error_messages(f) %> | 5 | <%= form_error_messages(f) %> |
| @@ -8,51 +8,51 @@ | |||
| 8 | <div class="layout_row_label"><%= f.label :name %></div> | 8 | <div class="layout_row_label"><%= f.label :name %></div> |
| 9 | <div class="layout_row_content"><%= f.text_field :name %></div> | 9 | <div class="layout_row_content"><%= f.text_field :name %></div> |
| 10 | 10 | ||
| 11 | <div class="layout_row_label"><%= f.label :upload, "File" %></div> | 11 | <div class="layout_row_label"><%= f.label :upload %></div> |
| 12 | <div class="layout_row_content"> | 12 | <div class="layout_row_content"> |
| 13 | <div id="asset_dropzone"> | 13 | <div id="asset_dropzone"> |
| 14 | <%= f.file_field :upload %> | 14 | <%= f.file_field :upload %> |
| 15 | <p class="field_hint">…or drop a file here.</p> | 15 | <p class="field_hint"><%= t("assets.form.drop_hint") %></p> |
| 16 | </div> | 16 | </div> |
| 17 | </div> | 17 | </div> |
| 18 | 18 | ||
| 19 | <div class="layout_row_label"><%= f.label :creator %></div> | 19 | <div class="layout_row_label"><%= f.label :creator %></div> |
| 20 | <div class="layout_row_content"><%= f.text_field :creator %></div> | 20 | <div class="layout_row_content"><%= f.text_field :creator %></div> |
| 21 | 21 | ||
| 22 | <div class="layout_row_label"><%= f.label :source_url, "Source URL" %></div> | 22 | <div class="layout_row_label"><%= f.label :source_url %></div> |
| 23 | <div class="layout_row_content"><%= f.text_field :source_url %></div> | 23 | <div class="layout_row_content"><%= f.text_field :source_url %></div> |
| 24 | 24 | ||
| 25 | <div class="layout_row_label"><%= f.label :license_key, "License" %></div> | 25 | <div class="layout_row_label"><%= f.label :license_key %></div> |
| 26 | <div class="layout_row_content"> | 26 | <div class="layout_row_content"> |
| 27 | <%= f.select :license_key, | 27 | <%= f.select :license_key, |
| 28 | options_for_select( | 28 | options_for_select( |
| 29 | [["— none —", ""]] + AssetLicense.keys.map { |key| [t("asset_licenses.#{key}"), key] }, | 29 | [[t("assets.form.none_option"), ""]] + AssetLicense.keys.map { |key| [t("asset_licenses.#{key}"), key] }, |
| 30 | @asset.license_key | 30 | @asset.license_key |
| 31 | ) %> | 31 | ) %> |
| 32 | </div> | 32 | </div> |
| 33 | 33 | ||
| 34 | <div class="layout_row_label">attach to page</div> | 34 | <div class="layout_row_label"><%= t("assets.form.attach_to_page") %></div> |
| 35 | <div class="layout_row_content"> | 35 | <div class="layout_row_content"> |
| 36 | <div class="restore_picker"> | 36 | <div class="restore_picker"> |
| 37 | <%= text_field_tag :asset_node_search_term, @attach_node&.title, | 37 | <%= text_field_tag :asset_node_search_term, @attach_node&.title, |
| 38 | :placeholder => "Search for a page…", :autocomplete => "off" %> | 38 | :placeholder => t("assets.form.attach_search_placeholder"), :autocomplete => "off" %> |
| 39 | <div id="asset_node_search_results" class="search_results" style="display: none"></div> | 39 | <div id="asset_node_search_results" class="search_results" style="display: none"></div> |
| 40 | </div> | 40 | </div> |
| 41 | <%= hidden_field_tag :node_id, @attach_node&.id %> | 41 | <%= hidden_field_tag :node_id, @attach_node&.id %> |
| 42 | <span class="field_hint">Optional — attaches this asset to that page, all pending versions included.</span> | 42 | <span class="field_hint"><%= t("assets.form.attach_hint") %></span> |
| 43 | </div> | 43 | </div> |
| 44 | 44 | ||
| 45 | <div class="layout_row_label"></div> | 45 | <div class="layout_row_label"></div> |
| 46 | <div class="layout_row_content"> | 46 | <div class="layout_row_content"> |
| 47 | <label><%= check_box_tag :headline, "1" %> attach as the page's headline</label> | 47 | <label><%= check_box_tag :headline, "1" %> <%= t("assets.form.as_headline") %></label> |
| 48 | <span class="field_hint">Applies only if the page has no headline yet.</span> | 48 | <span class="field_hint"><%= t("assets.form.headline_hint") %></span> |
| 49 | </div> | 49 | </div> |
| 50 | 50 | ||
| 51 | <div class="layout_row_label">Actions</div> | 51 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> |
| 52 | <div class="layout_row_content info_group"> | 52 | <div class="layout_row_content info_group"> |
| 53 | <div class="info_group_items"> | 53 | <div class="info_group_items"> |
| 54 | <div class="info_item"><%= f.submit 'Create' %></div> | 54 | <div class="info_item"><%= f.submit f.submit t("admin.common.create") %></div> |
| 55 | <div class="info_item"><%= link_to 'Back', assets_path %></div> | 55 | <div class="info_item"><%= link_to link_to t("admin.common.back"), assets_path %></div> |
| 56 | </div> | 56 | </div> |
| 57 | </div> | 57 | </div> |
| 58 | </div> | 58 | </div> |
diff --git a/app/views/assets/show.html.erb b/app/views/assets/show.html.erb index 4ec77dff..f5a7e055 100644 --- a/app/views/assets/show.html.erb +++ b/app/views/assets/show.html.erb | |||
| @@ -2,16 +2,16 @@ | |||
| 2 | <h1><%= @asset.name %></h1> | 2 | <h1><%= @asset.name %></h1> |
| 3 | 3 | ||
| 4 | <div id="content"> | 4 | <div id="content"> |
| 5 | <div class="layout_row_label">Actions</div> | 5 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> |
| 6 | <div class="layout_row_content info_group"> | 6 | <div class="layout_row_content info_group"> |
| 7 | <div class="info_group_items"> | 7 | <div class="info_group_items"> |
| 8 | <div class="info_item"> | 8 | <div class="info_item"> |
| 9 | <%= link_to edit_asset_path(@asset), class: 'action_button' do %> | 9 | <%= link_to edit_asset_path(@asset), class: 'action_button' do %> |
| 10 | <%= icon("edit", library: "tabler", "aria-hidden": true) %> Edit | 10 | <%= icon("edit", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.edit") %> |
| 11 | <% end %> | 11 | <% end %> |
| 12 | </div> | 12 | </div> |
| 13 | <div class="info_item"> | 13 | <div class="info_item"> |
| 14 | <%= link_to 'Back', assets_path %> | 14 | <%= link_to link_to t("admin.common.back"), assets_path %> |
| 15 | </div> | 15 | </div> |
| 16 | <%= link_to admin_log_path(:asset_id => @asset.id), :class => "action_button" do %> | 16 | <%= link_to admin_log_path(:asset_id => @asset.id), :class => "action_button" do %> |
| 17 | <%= icon("history", library: "tabler", "aria-hidden": true) %> <%= t("node_actions.asset_history") %> | 17 | <%= icon("history", library: "tabler", "aria-hidden": true) %> <%= t("node_actions.asset_history") %> |
| @@ -20,11 +20,11 @@ | |||
| 20 | </div> | 20 | </div> |
| 21 | 21 | ||
| 22 | <% if @asset.has_variant?(:medium) %> | 22 | <% if @asset.has_variant?(:medium) %> |
| 23 | <div class="layout_row_label">Thumbnail</div> | 23 | <div class="layout_row_label"><%= t(".thumbnail") %></div> |
| 24 | <div class="layout_row_content"><%= image_tag @asset.upload.url(:medium), style: "max-width: 300px; max-height: 300px;" %></div> | 24 | <div class="layout_row_content"><%= image_tag @asset.upload.url(:medium), style: "max-width: 300px; max-height: 300px;" %></div> |
| 25 | <% end %> | 25 | <% end %> |
| 26 | 26 | ||
| 27 | <div class="layout_row_label">Attached to</div> | 27 | <div class="layout_row_label"><%= t(".attached_to") %></div> |
| 28 | <div class="layout_row_content"> | 28 | <div class="layout_row_content"> |
| 29 | <% nodes = @asset.attached_nodes %> | 29 | <% nodes = @asset.attached_nodes %> |
| 30 | <% if nodes.any? %> | 30 | <% if nodes.any? %> |
| @@ -36,34 +36,34 @@ | |||
| 36 | <%= icon("star", library: "tabler", "aria-hidden": true) %> | 36 | <%= icon("star", library: "tabler", "aria-hidden": true) %> |
| 37 | <% end %> | 37 | <% end %> |
| 38 | <% unless node.head && node.head.related_assets.exists?(:asset_id => @asset.id) %> | 38 | <% unless node.head && node.head.related_assets.exists?(:asset_id => @asset.id) %> |
| 39 | <span class="field_hint">pending versions only</span> | 39 | <span class="field_hint"><%= t(".pending_only") %></span> |
| 40 | <% end %> | 40 | <% end %> |
| 41 | </li> | 41 | </li> |
| 42 | <% end %> | 42 | <% end %> |
| 43 | </ul> | 43 | </ul> |
| 44 | <% else %> | 44 | <% else %> |
| 45 | — not attached to any page — | 45 | <%= t(".not_attached") %> |
| 46 | <% end %> | 46 | <% end %> |
| 47 | <%= link_to new_node_path(:asset_id => @asset.id), :class => "action_button" do %> | 47 | <%= link_to new_node_path(:asset_id => @asset.id), :class => "action_button" do %> |
| 48 | <%= icon("file-plus", library: "tabler", "aria-hidden": true) %> New page with this attachment | 48 | <%= icon("file-plus", library: "tabler", "aria-hidden": true) %> <%= t(".new_page_with_attachment") %> |
| 49 | <% end %> | 49 | <% end %> |
| 50 | </div> | 50 | </div> |
| 51 | 51 | ||
| 52 | <div class="layout_row_label">Public Path</div> | 52 | <div class="layout_row_label"><%= t(".public_path") %></div> |
| 53 | <div class="layout_row_content"> | 53 | <div class="layout_row_content"> |
| 54 | <% public_path = @asset.upload.url.sub(/\?\d+$/, "") %> | 54 | <% public_path = @asset.upload.url.sub(/\?\d+$/, "") %> |
| 55 | <%= link_to public_path, public_path, target: "_blank", rel: "noopener" %> | 55 | <%= link_to public_path, public_path, target: "_blank", rel: "noopener" %> |
| 56 | <button type="button" class="action_button copy_button" | 56 | <button type="button" class="action_button copy_button" |
| 57 | data-copy-url="<%= request.base_url + public_path %>"> | 57 | data-copy-url="<%= request.base_url + public_path %>"> |
| 58 | <%= icon("copy", library: "tabler", "aria-hidden": true) %> | 58 | <%= icon("copy", library: "tabler", "aria-hidden": true) %> |
| 59 | <span class="copy_button_label">Copy URL</span> | 59 | <span class="copy_button_label"><%= t(".copy_url") %></span> |
| 60 | </button> | 60 | </button> |
| 61 | </div> | 61 | </div> |
| 62 | 62 | ||
| 63 | <div class="layout_row_label">Creator</div> | 63 | <div class="layout_row_label"><%= t(".creator") %></div> |
| 64 | <div class="layout_row_content"><%= @asset.creator.presence || "—" %></div> | 64 | <div class="layout_row_content"><%= @asset.creator.presence || "—" %></div> |
| 65 | 65 | ||
| 66 | <div class="layout_row_label">Source</div> | 66 | <div class="layout_row_label"><%= t(".source") %></div> |
| 67 | <div class="layout_row_content"> | 67 | <div class="layout_row_content"> |
| 68 | <% if @asset.source_url.present? %> | 68 | <% if @asset.source_url.present? %> |
| 69 | <%= link_to @asset.source_url, @asset.source_url %> | 69 | <%= link_to @asset.source_url, @asset.source_url %> |
| @@ -72,7 +72,7 @@ | |||
| 72 | <% end %> | 72 | <% end %> |
| 73 | </div> | 73 | </div> |
| 74 | 74 | ||
| 75 | <div class="layout_row_label">License</div> | 75 | <div class="layout_row_label"><%= t(".license") %></div> |
| 76 | <div class="layout_row_content"> | 76 | <div class="layout_row_content"> |
| 77 | <% if (license = AssetLicense.find(@asset.license_key)) %> | 77 | <% if (license = AssetLicense.find(@asset.license_key)) %> |
| 78 | <%= t("asset_licenses.#{license.key}") %> | 78 | <%= t("asset_licenses.#{license.key}") %> |
| @@ -81,10 +81,10 @@ | |||
| 81 | <% end %> | 81 | <% end %> |
| 82 | </div> | 82 | </div> |
| 83 | 83 | ||
| 84 | <div class="layout_row_label">Content Type</div> | 84 | <div class="layout_row_label"><%= t(".content_type") %></div> |
| 85 | <div class="layout_row_content"><%= @asset.upload.content_type %></div> | 85 | <div class="layout_row_content"><%= @asset.upload.content_type %></div> |
| 86 | 86 | ||
| 87 | <div class="layout_row_label">Size</div> | 87 | <div class="layout_row_label"><%= t(".size") %></div> |
| 88 | <div class="layout_row_content"><%= "#{@asset.upload.size/1024} KB" %></div> | 88 | <div class="layout_row_content"><%= "#{@asset.upload.size/1024} KB" %></div> |
| 89 | </div> | 89 | </div> |
| 90 | </div> | 90 | </div> |
diff --git a/app/views/events/_rrule_builder.html.erb b/app/views/events/_rrule_builder.html.erb index 1ffec0a2..3cffb782 100644 --- a/app/views/events/_rrule_builder.html.erb +++ b/app/views/events/_rrule_builder.html.erb | |||
| @@ -1,33 +1,33 @@ | |||
| 1 | <div id="rrule_builder"> | 1 | <div id="rrule_builder"> |
| 2 | <p> | 2 | <p> |
| 3 | <label><%= radio_button_tag "rrule_freq", "weekly", true %> Weekly</label> | 3 | <label><%= radio_button_tag "rrule_freq", "weekly", true %> <%= t(".weekly") %></label> |
| 4 | <label><%= radio_button_tag "rrule_freq", "monthly" %> Monthly</label> | 4 | <label><%= radio_button_tag "rrule_freq", "monthly" %> <%= t(".monthly") %></label> |
| 5 | </p> | 5 | </p> |
| 6 | <div id="rrule_weekly_options"> | 6 | <div id="rrule_weekly_options"> |
| 7 | <p><label><%= check_box_tag "rrule_biweekly" %> Every 2 weeks</label></p> | 7 | <p><label><%= check_box_tag "rrule_biweekly" %> <%= t(".biweekly") %></label></p> |
| 8 | <p> | 8 | <p> |
| 9 | <% %w[MO TU WE TH FR SA SU].each do |code| %> | 9 | <% %w[MO TU WE TH FR SA SU].each do |code| %> |
| 10 | <label><%= check_box_tag "rrule_byday_#{code}" %> <%= RruleHumanizer::WEEKDAY_NAMES_ABBR[:de][code] %></label> | 10 | <label><%= check_box_tag "rrule_byday_#{code}" %> <%= RruleHumanizer::WEEKDAY_NAMES_ABBR[I18n.locale][code] %></label> |
| 11 | <% end %> | 11 | <% end %> |
| 12 | </p> | 12 | </p> |
| 13 | </div> | 13 | </div> |
| 14 | <div id="rrule_monthly_options" style="display: none;"> | 14 | <div id="rrule_monthly_options" style="display: none;"> |
| 15 | <p><label><%= check_box_tag "rrule_monthly_ordinal" %> On a specific weekday each month</label></p> | 15 | <p><label><%= check_box_tag "rrule_monthly_ordinal" %> <%= t(".monthly_ordinal") %></label></p> |
| 16 | <p id="rrule_ordinal_fields" style="display: none;"> | 16 | <p id="rrule_ordinal_fields" style="display: none;"> |
| 17 | <%= select_tag "rrule_ordinal", options_for_select([["1.", 1], ["2.", 2], ["3.", 3], ["4.", 4], ["letzter", -1], ["vorletzter", -2], ["Selected weeks", "custom"]]) %> | 17 | <%= select_tag "rrule_ordinal", options_for_select([[t(".ordinal_1"), 1], [t(".ordinal_2"), 2], [t(".ordinal_3"), 3], [t(".ordinal_4"), 4], [t(".ordinal_last"), -1], [t(".ordinal_second_last"), -2], [t(".ordinal_custom"), "custom"]]) %> |
| 18 | <%= select_tag "rrule_ordinal_day", options_for_select(%w[MO TU WE TH FR SA SU].map { |c| [RruleHumanizer::WEEKDAY_NAMES[:de][c], c] }) %> | 18 | <%= select_tag "rrule_ordinal_day", options_for_select(%w[MO TU WE TH FR SA SU].map { |c| [RruleHumanizer::WEEKDAY_NAMES[I18n.locale][c], c] }) %> |
| 19 | </p> | 19 | </p> |
| 20 | <p id="rrule_custom_ordinal_fields" style="display: none;"> | 20 | <p id="rrule_custom_ordinal_fields" style="display: none;"> |
| 21 | Weeks of the month: | 21 | <%= t(".weeks_of_month") %> |
| 22 | <% (1..5).each do |ordinal| %> | 22 | <% (1..5).each do |ordinal| %> |
| 23 | <label><%= check_box_tag "rrule_custom_ordinal_#{ordinal}" %> <%= ordinal %>.</label> | 23 | <label><%= check_box_tag "rrule_custom_ordinal_#{ordinal}" %> <%= ordinal %>.</label> |
| 24 | <% end %> | 24 | <% end %> |
| 25 | </p> | 25 | </p> |
| 26 | </div> | 26 | </div> |
| 27 | <p> | 27 | <p> |
| 28 | <label><%= check_box_tag "rrule_exclude_month" %> Except in one month</label> | 28 | <label><%= check_box_tag "rrule_exclude_month" %> <%= t(".exclude_month") %></label> |
| 29 | <%= select_tag "rrule_excluded_month", options_for_select((1..12).map { |m| [RruleHumanizer::MONTH_NAMES[:de][m-1], m] }), style: "display: none;" %> | 29 | <%= select_tag "rrule_excluded_month", options_for_select((1..12).map { |m| [RruleHumanizer::MONTH_NAMES[I18n.locale][m-1], m] }), style: "display: none;" %> |
| 30 | </p> | 30 | </p> |
| 31 | <span class="field_hint">Builds the field below automatically. If your pattern is more complex than this covers, just edit it directly below - these controls won't touch it unless you use them.</span> | 31 | <span class="field_hint"><%= t(".hint") %></span> |
| 32 | </div> | 32 | </div> |
| 33 | <%= f.text_field :rrule, id: "event_rrule" %> | 33 | <%= f.text_field :rrule, id: "event_rrule" %> |
diff --git a/app/views/events/edit.html.erb b/app/views/events/edit.html.erb index 5d7f613e..f3bf5339 100644 --- a/app/views/events/edit.html.erb +++ b/app/views/events/edit.html.erb | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | <h1>Editing event</h1> | 1 | <h1><%= t(".title") %></h1> |
| 2 | 2 | ||
| 3 | <div class="node_action_bar standalone_action_bar"> | 3 | <div class="node_action_bar standalone_action_bar"> |
| 4 | <%= link_to 'Back', safe_return_to(params[:return_to] || events_path) %> | 4 | <%= link_to t("admin.common.back"), safe_return_to(params[:return_to] || events_path) %> |
| 5 | <%= button_to event_path(@event), method: :delete, | 5 | <%= button_to event_path(@event), method: :delete, |
| 6 | form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } do %> | 6 | form: { data: { confirm: t("events.confirm_delete") }, class: 'button_to destructive' } do %> |
| 7 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy | 7 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.destroy") %> |
| 8 | <% end %> | 8 | <% end %> |
| 9 | </div> | 9 | </div> |
| 10 | 10 | ||
| @@ -14,58 +14,58 @@ | |||
| 14 | 14 | ||
| 15 | <div id="admin_layout"> | 15 | <div id="admin_layout"> |
| 16 | <div id="content"> | 16 | <div id="content"> |
| 17 | <div class="layout_row_label">Node</div> | 17 | <div class="layout_row_label"><%= Event.human_attribute_name(:node) %> </div> |
| 18 | <div class="layout_row_content"> | 18 | <div class="layout_row_content"> |
| 19 | <% if @event.node %> | 19 | <% if @event.node %> |
| 20 | <%= link_to @event.node.title, node_path(@event.node) %> | 20 | <%= link_to @event.node.title, node_path(@event.node) %> |
| 21 | <details> | 21 | <details> |
| 22 | <summary>Change node</summary> | 22 | <summary><%= t(".change_node") %></summary> |
| 23 | <%= text_field_tag :event_node_search_term %> | 23 | <%= text_field_tag :event_node_search_term %> |
| 24 | <div id="event_search_results" class="search_results"></div> | 24 | <div id="event_search_results" class="search_results"></div> |
| 25 | <span class="field_hint">This will re-link the event to a different node — rarely needed.</span> | 25 | <span class="field_hint"><%= t(".change_node_hint") %></span> |
| 26 | </details> | 26 | </details> |
| 27 | <% else %> | 27 | <% else %> |
| 28 | <%= text_field_tag :event_node_search_term %> | 28 | <%= text_field_tag :event_node_search_term %> |
| 29 | <div id="event_search_results" class="search_results"></div> | 29 | <div id="event_search_results" class="search_results"></div> |
| 30 | <span class="field_hint">Optional — search and pick a node to associate this event with a page.</span> | 30 | <span class="field_hint"><%= t("events.form.node_hint") %></span> |
| 31 | <% end %> | 31 | <% end %> |
| 32 | <%= f.hidden_field :node_id %> | 32 | <%= f.hidden_field :node_id %> |
| 33 | </div> | 33 | </div> |
| 34 | 34 | ||
| 35 | <div class="layout_row_label">Start time</div> | 35 | <div class="layout_row_label"><%= Event.human_attribute_name(:start_time) %></div> |
| 36 | <div class="layout_row_content"><%= f.datetime_select :start_time %></div> | 36 | <div class="layout_row_content"><%= f.datetime_select :start_time %></div> |
| 37 | 37 | ||
| 38 | <div class="layout_row_label">End time</div> | 38 | <div class="layout_row_label"><%= Event.human_attribute_name(:end_time) %></div> |
| 39 | <div class="layout_row_content"><%= f.datetime_select :end_time %></div> | 39 | <div class="layout_row_content"><%= f.datetime_select :end_time %></div> |
| 40 | 40 | ||
| 41 | <div class="layout_row_label">Recurrence</div> | 41 | <div class="layout_row_label"><%= t("events.form.recurrence") %></div> |
| 42 | <div class="layout_row_content"> | 42 | <div class="layout_row_content"> |
| 43 | <%= render "rrule_builder", f: f %> | 43 | <%= render "rrule_builder", f: f %> |
| 44 | </div> | 44 | </div> |
| 45 | 45 | ||
| 46 | <div class="layout_row_label">Title</div> | 46 | <div class="layout_row_label"><%= Event.human_attribute_name(:title) %></div> |
| 47 | <div class="layout_row_content"> | 47 | <div class="layout_row_content"> |
| 48 | <%= f.text_field :title %> | 48 | <%= f.text_field :title %> |
| 49 | <span id="event_title_hint" class="field_hint">Optional — if left blank, the associated node's title is used.</span> | 49 | <span id="event_title_hint" class="field_hint"><%= t("events.form.title_hint") %></span> |
| 50 | </div> | 50 | </div> |
| 51 | 51 | ||
| 52 | <div class="layout_row_label">Tags</div> | 52 | <div class="layout_row_label"><%= Event.human_attribute_name(:tags) %></div> |
| 53 | <div class="layout_row_content"><%= f.text_field :tag_list %></div> | 53 | <div class="layout_row_content"><%= f.text_field :tag_list %></div> |
| 54 | 54 | ||
| 55 | <div class="layout_row_label">Allday</div> | 55 | <div class="layout_row_label"><%= Event.human_attribute_name(:allday) %></div> |
| 56 | <div class="layout_row_content"><%= f.check_box :allday %></div> | 56 | <div class="layout_row_content"><%= f.check_box :allday %></div> |
| 57 | 57 | ||
| 58 | <div class="layout_row_label">Url</div> | 58 | <div class="layout_row_label"><%= Event.human_attribute_name(:url) %></div> |
| 59 | <div class="layout_row_content"><%= f.text_field :url %></div> | 59 | <div class="layout_row_content"><%= f.text_field :url %></div> |
| 60 | 60 | ||
| 61 | <div class="layout_row_label">Latitude</div> | 61 | <div class="layout_row_label"><%= Event.human_attribute_name(:latitude) %></div> |
| 62 | <div class="layout_row_content"><%= f.text_field :latitude %></div> | 62 | <div class="layout_row_content"><%= f.text_field :latitude %></div> |
| 63 | 63 | ||
| 64 | <div class="layout_row_label">Longitude</div> | 64 | <div class="layout_row_label"><%= Event.human_attribute_name(:longitude) %></div> |
| 65 | <div class="layout_row_content"><%= f.text_field :longitude %></div> | 65 | <div class="layout_row_content"><%= f.text_field :longitude %></div> |
| 66 | 66 | ||
| 67 | <div class="layout_row_label"></div> | 67 | <div class="layout_row_label"></div> |
| 68 | <div class="layout_row_content"><%= f.submit 'Update' %></div> | 68 | <div class="layout_row_content"><%= f.submit t("admin.common.update") %></div> |
| 69 | </div> | 69 | </div> |
| 70 | </div> | 70 | </div> |
| 71 | <% end %> | 71 | <% end %> |
diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb index dde897ee..138a02ec 100644 --- a/app/views/events/index.html.erb +++ b/app/views/events/index.html.erb | |||
| @@ -1,23 +1,23 @@ | |||
| 1 | <h1>Events</h1> | 1 | <h1><%= t(".title") %></h1> |
| 2 | 2 | ||
| 3 | <div class="button_row"> | 3 | <div class="button_row"> |
| 4 | <%= link_to new_event_path, class: 'action_button' do %> | 4 | <%= link_to new_event_path, class: 'action_button' do %> |
| 5 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create event | 5 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> <%= t(".create_event") %> |
| 6 | <% end %> | 6 | <% end %> |
| 7 | <%= link_to 'View events without a page →', without_node_events_path %> | 7 | <%= link_to t(".without_page_link"), without_node_events_path %> |
| 8 | </div> | 8 | </div> |
| 9 | 9 | ||
| 10 | <%= will_paginate @events %> | 10 | <%= will_paginate @events %> |
| 11 | 11 | ||
| 12 | <table class="events_table"> | 12 | <table class="events_table"> |
| 13 | <tr class="header"> | 13 | <tr class="header"> |
| 14 | <th>Title</th> | 14 | <th><%= t("admin.columns.title") %></th> |
| 15 | <th>Start time</th> | 15 | <th><%= Event.human_attribute_name(:start_time) %></th> |
| 16 | <th>End time</th> | 16 | <th><%= Event.human_attribute_name(:end_time) %></th> |
| 17 | <th>Rrule</th> | 17 | <th><%= Event.human_attribute_name(:rrule) %></th> |
| 18 | <th>Allday</th> | 18 | <th><%= Event.human_attribute_name(:allday) %></th> |
| 19 | <th>Url</th> | 19 | <th><%= Event.human_attribute_name(:url) %></th> |
| 20 | <th>Node</th> | 20 | <th><%= Event.human_attribute_name(:start_node) %></th> |
| 21 | <th></th> | 21 | <th></th> |
| 22 | </tr> | 22 | </tr> |
| 23 | 23 | ||
| @@ -27,14 +27,14 @@ | |||
| 27 | <td><%=h event.start_time %></td> | 27 | <td><%=h event.start_time %></td> |
| 28 | <td><%=h event.end_time %></td> | 28 | <td><%=h event.end_time %></td> |
| 29 | <td class="rrule_cell"><span class="rrule_text"><%= rrule_with_break_opportunities(event.rrule) %></span></td> | 29 | <td class="rrule_cell"><span class="rrule_text"><%= rrule_with_break_opportunities(event.rrule) %></span></td> |
| 30 | <td><%=h event.allday %></td> | 30 | <td><%=h event.allday %> → <%= event.allday ? t("admin.common.yes") : t("admin.common.no") %></td> |
| 31 | <td class="url_cell"> | 31 | <td class="url_cell"> |
| 32 | <% if event.url.present? %> | 32 | <% if event.url.present? %> |
| 33 | <span class="truncate"><%= link_to event.url, event.url %></span> | 33 | <span class="truncate"><%= link_to event.url, event.url %></span> |
| 34 | <% end %> | 34 | <% end %> |
| 35 | </td> | 35 | </td> |
| 36 | <td><%= event.node ? link_to(event.node_id, node_path(event.node)) : '' %></td> | 36 | <td><%= event.node ? link_to(event.node_id, node_path(event.node)) : '' %></td> |
| 37 | <td><%= link_to 'edit', edit_event_path(event) %></td> | 37 | <td><%= link_to t(".edit_link"), edit_event_path(event) %></td> |
| 38 | </tr> | 38 | </tr> |
| 39 | <% end %> | 39 | <% end %> |
| 40 | </table> | 40 | </table> |
diff --git a/app/views/events/new.html.erb b/app/views/events/new.html.erb index 6472f207..3eaf7e7d 100644 --- a/app/views/events/new.html.erb +++ b/app/views/events/new.html.erb | |||
| @@ -1,55 +1,55 @@ | |||
| 1 | <h1>New event</h1> | 1 | <h1><%= t(".title") %></h1> |
| 2 | 2 | ||
| 3 | <%= link_to 'Back', safe_return_to(params[:return_to] || events_path) %> | 3 | <%= link_to t("admin.common.back"), safe_return_to(params[:return_to] || events_path) %> |
| 4 | 4 | ||
| 5 | <%= form_for(@event) do |f| %> | 5 | <%= form_for(@event) do |f| %> |
| 6 | <%= form_error_messages(f) %> | 6 | <%= form_error_messages(f) %> |
| 7 | 7 | ||
| 8 | <div id="admin_layout"> | 8 | <div id="admin_layout"> |
| 9 | <div id="content"> | 9 | <div id="content"> |
| 10 | <div class="layout_row_label">Node</div> | 10 | <div class="layout_row_label"><%= Event.human_attribute_name(:node) %></div> |
| 11 | <div class="layout_row_content"> | 11 | <div class="layout_row_content"> |
| 12 | <%= text_field_tag :event_node_search_term %> | 12 | <%= text_field_tag :event_node_search_term %> |
| 13 | <div id="event_search_results" class="search_results"></div> | 13 | <div id="event_search_results" class="search_results"></div> |
| 14 | <%= f.hidden_field :node_id %> | 14 | <%= f.hidden_field :node_id %> |
| 15 | <span class="field_hint">Optional — search and pick a node to associate this event with a page.</span> | 15 | <span class="field_hint"><%= t("events.form.node_hint") %></span> |
| 16 | </div> | 16 | </div> |
| 17 | 17 | ||
| 18 | <div class="layout_row_label">Start time</div> | 18 | <div class="layout_row_label"><%= Event.human_attribute_name(:start_time) %></div> |
| 19 | <div class="layout_row_content"><%= f.datetime_select :start_time %></div> | 19 | <div class="layout_row_content"><%= f.datetime_select :start_time %></div> |
| 20 | 20 | ||
| 21 | <div class="layout_row_label">End time</div> | 21 | <div class="layout_row_label"><%= Event.human_attribute_name(:end_time) %></div> |
| 22 | <div class="layout_row_content"><%= f.datetime_select :end_time %></div> | 22 | <div class="layout_row_content"><%= f.datetime_select :end_time %></div> |
| 23 | 23 | ||
| 24 | <div class="layout_row_label">Recurrence</div> | 24 | <div class="layout_row_label"><%= t("events.form.recurrence") %></div> |
| 25 | <div class="layout_row_content"><%= render "rrule_builder", f: f %></div> | 25 | <div class="layout_row_content"><%= render "rrule_builder", f: f %></div> |
| 26 | 26 | ||
| 27 | <div class="layout_row_label">Title</div> | 27 | <div class="layout_row_label"><%= Event.human_attribute_name(:title) %></div> |
| 28 | <div class="layout_row_content"> | 28 | <div class="layout_row_content"> |
| 29 | <%= f.text_field :title %> | 29 | <%= f.text_field :title %> |
| 30 | <span id="event_title_hint" class="field_hint">Optional — if left blank, the associated node's title is used.</span> | 30 | <span id="event_title_hint" class="field_hint"><%= t("events.form.title_hint") %></span> |
| 31 | </div> | 31 | </div> |
| 32 | 32 | ||
| 33 | <div class="layout_row_label">Tags</div> | 33 | <div class="layout_row_label"><%= Event.human_attribute_name(:tag_list) %></div> |
| 34 | <div class="layout_row_content"><%= f.text_field :tag_list %></div> | 34 | <div class="layout_row_content"><%= f.text_field :tag_list %></div> |
| 35 | 35 | ||
| 36 | <div class="layout_row_label">Allday</div> | 36 | <div class="layout_row_label"><%= Event.human_attribute_name(:allday) %></div> |
| 37 | <div class="layout_row_content"><%= f.check_box :allday %></div> | 37 | <div class="layout_row_content"><%= f.check_box :allday %></div> |
| 38 | 38 | ||
| 39 | <div class="layout_row_label">Url</div> | 39 | <div class="layout_row_label"><%= Event.human_attribute_name(:url) %></div> |
| 40 | <div class="layout_row_content"><%= f.text_field :url %></div> | 40 | <div class="layout_row_content"><%= f.text_field :url %></div> |
| 41 | 41 | ||
| 42 | <div class="layout_row_label">Latitude</div> | 42 | <div class="layout_row_label"><%= Event.human_attribute_name(:latitude) %></div> |
| 43 | <div class="layout_row_content"><%= f.text_field :latitude %></div> | 43 | <div class="layout_row_content"><%= f.text_field :latitude %></div> |
| 44 | 44 | ||
| 45 | <div class="layout_row_label">Longitude</div> | 45 | <div class="layout_row_label"><%= Event.human_attribute_name(:longitude) %></div> |
| 46 | <div class="layout_row_content"><%= f.text_field :longitude %></div> | 46 | <div class="layout_row_content"><%= f.text_field :longitude %></div> |
| 47 | 47 | ||
| 48 | <div class="layout_row_label"></div> | 48 | <div class="layout_row_label"></div> |
| 49 | <div class="layout_row_content"><%= hidden_field_tag :return_to, params[:return_to] %></div> | 49 | <div class="layout_row_content"><%= hidden_field_tag :return_to, params[:return_to] %></div> |
| 50 | 50 | ||
| 51 | <div class="layout_row_label"></div> | 51 | <div class="layout_row_label"></div> |
| 52 | <div class="layout_row_content"><%= f.submit 'Create' %></div> | 52 | <div class="layout_row_content"><%= f.submit t("admin.common.create") %></div> |
| 53 | </div> | 53 | </div> |
| 54 | </div> | 54 | </div> |
| 55 | <% end %> | 55 | <% end %> |
diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index 0bf14e8b..98e972c6 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb | |||
| @@ -1,55 +1,55 @@ | |||
| 1 | <div id="admin_layout" class="show_node"> | 1 | <div id="admin_layout" class="show_node"> |
| 2 | <h1><%= @event.node ? "Event for node #{@event.node.unique_name}" : "Event" %></h1> | 2 | <h1><%= @event.node ? t(".title_for_node", :path => @event.node.unique_name) : t(".title") %></h1> |
| 3 | 3 | ||
| 4 | <div id="content"> | 4 | <div id="content"> |
| 5 | <div class="layout_row_label">Actions</div> | 5 | <div class="layout_row_label"><%= t("admin.columns.actions") %></div> |
| 6 | <div class="layout_row_content info_group"> | 6 | <div class="layout_row_content info_group"> |
| 7 | <div class="info_group_items"> | 7 | <div class="info_group_items"> |
| 8 | <% if @event.node %> | 8 | <% if @event.node %> |
| 9 | <div class="info_item"> | 9 | <div class="info_item"> |
| 10 | <%= link_to 'Node', node_path(@event.node) %> | 10 | <%= link_to t(".node_link"), node_path(@event.node) %> |
| 11 | </div> | 11 | </div> |
| 12 | <% end %> | 12 | <% end %> |
| 13 | <div class="info_item"> | 13 | <div class="info_item"> |
| 14 | <%= link_to edit_event_path(@event, return_to: request.path), class: 'action_button' do %> | 14 | <%= link_to edit_event_path(@event, return_to: request.path), class: 'action_button' do %> |
| 15 | <%= icon("edit", library: "tabler", "aria-hidden": true) %> Edit | 15 | <%= icon("edit", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.edit") %> |
| 16 | <% end %> | 16 | <% end %> |
| 17 | </div> | 17 | </div> |
| 18 | <div class="info_item"> | 18 | <div class="info_item"> |
| 19 | <%= button_to event_path(@event), method: :delete, form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } do %> | 19 | <%= button_to event_path(@event), method: :delete, form: { data: { confirm: t("events.confirm_delete") }, class: 'button_to destructive' } do %> |
| 20 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy | 20 | <%= icon("trash", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.destroy") %> |
| 21 | <% end %> | 21 | <% end %> |
| 22 | </div> | 22 | </div> |
| 23 | </div> | 23 | </div> |
| 24 | </div> | 24 | </div> |
| 25 | 25 | ||
| 26 | <div class="layout_row_label">Start time</div> | 26 | <div class="layout_row_label"><%= Event.human_attribute_name(:start_time) %></div> |
| 27 | <div class="layout_row_content"><%=h @event.start_time %></div> | 27 | <div class="layout_row_content"><%=h @event.start_time %></div> |
| 28 | 28 | ||
| 29 | <div class="layout_row_label">End time</div> | 29 | <div class="layout_row_label"><%= Event.human_attribute_name(:end_time) %></div> |
| 30 | <div class="layout_row_content"><%=h @event.end_time %></div> | 30 | <div class="layout_row_content"><%=h @event.end_time %></div> |
| 31 | 31 | ||
| 32 | <div class="layout_row_label">Rrule</div> | 32 | <div class="layout_row_label"><%= Event.human_attribute_name(:rrule) %></div> |
| 33 | <div class="layout_row_content"><%=h @event.rrule %></div> | 33 | <div class="layout_row_content"><%=h @event.rrule %></div> |
| 34 | 34 | ||
| 35 | <% if (human = @event.humanize_rrule(I18n.locale)) %> | 35 | <% if (human = @event.humanize_rrule(I18n.locale)) %> |
| 36 | <div class="layout_row_label">Recurrence</div> | 36 | <div class="layout_row_label"><%= t(".recurrence") %></div> |
| 37 | <div class="layout_row_content"><em><%= human %></em></div> | 37 | <div class="layout_row_content"><em><%= human %></em></div> |
| 38 | <% end %> | 38 | <% end %> |
| 39 | 39 | ||
| 40 | <div class="layout_row_label">Tags</div> | 40 | <div class="layout_row_label"><%= Event.human_attribute_name(:tag_list) %></div> |
| 41 | <div class="layout_row_content"><%=h @event.tag_list %></div> | 41 | <div class="layout_row_content"><%=h @event.tag_list %></div> |
| 42 | 42 | ||
| 43 | <div class="layout_row_label">Allday</div> | 43 | <div class="layout_row_label"><%= Event.human_attribute_name(:allday) %></div> |
| 44 | <div class="layout_row_content"><%=h @event.allday %></div> | 44 | <div class="layout_row_content"><%= @event.allday ? t("admin.common.yes") : t("admin.common.no") %></div> |
| 45 | 45 | ||
| 46 | <div class="layout_row_label">Url</div> | 46 | <div class="layout_row_label"><%= Event.human_attribute_name(:url) %></div> |
| 47 | <div class="layout_row_content"><%=h @event.url %></div> | 47 | <div class="layout_row_content"><%=h @event.url %></div> |
| 48 | 48 | ||
| 49 | <div class="layout_row_label">Latitude</div> | 49 | <div class="layout_row_label"><%= Event.human_attribute_name(:latitude) %></div> |
| 50 | <div class="layout_row_content"><%=h @event.latitude %></div> | 50 | <div class="layout_row_content"><%=h @event.latitude %></div> |
| 51 | 51 | ||
| 52 | <div class="layout_row_label">Longitude</div> | 52 | <div class="layout_row_label"><%= Event.human_attribute_name(:longitude) %></div> |
| 53 | <div class="layout_row_content"><%=h @event.longitude %></div> | 53 | <div class="layout_row_content"><%=h @event.longitude %></div> |
| 54 | </div> | 54 | </div> |
| 55 | </div> | 55 | </div> |
diff --git a/app/views/events/without_node.html.erb b/app/views/events/without_node.html.erb index bb27173b..c610b560 100644 --- a/app/views/events/without_node.html.erb +++ b/app/views/events/without_node.html.erb | |||
| @@ -1,19 +1,19 @@ | |||
| 1 | <h1>Events without a node</h1> | 1 | <h1><%= t(".title") %></h1> |
| 2 | 2 | ||
| 3 | <%= link_to '← All events', events_path %> | 3 | <%= link_to t(".all_events_link"), events_path %> |
| 4 | <%= link_to new_event_path, class: 'action_button' do %> | 4 | <%= link_to new_event_path, class: 'action_button' do %> |
| 5 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create event | 5 | <%= icon("plus", library: "tabler", "aria-hidden": true) %> <%= t("events.index.create_event") %> |
| 6 | <% end %> | 6 | <% end %> |
| 7 | 7 | ||
| 8 | <%= will_paginate @events %> | 8 | <%= will_paginate @events %> |
| 9 | 9 | ||
| 10 | <table class="events_table"> | 10 | <table class="events_table"> |
| 11 | <tr class="header"> | 11 | <tr class="header"> |
| 12 | <th>Title</th> | 12 | <th><%= t("admin.columns.title") %></th> |
| 13 | <th>Start time</th> | 13 | <th><%= Event.human_attribute_name(:start_time) %></th> |
| 14 | <th>End time</th> | 14 | <th><%= Event.human_attribute_name(:end_time) %></th> |
| 15 | <th>Allday</th> | 15 | <th><%= Event.human_attribute_name(:allday) %></th> |
| 16 | <th>Url</th> | 16 | <th><%= Event.human_attribute_name(:url) %></th> |
| 17 | <th></th> | 17 | <th></th> |
| 18 | </tr> | 18 | </tr> |
| 19 | 19 | ||
| @@ -22,9 +22,9 @@ | |||
| 22 | <td><%= link_to event.display_title, event %></td> | 22 | <td><%= link_to event.display_title, event %></td> |
| 23 | <td><%=h event.start_time %></td> | 23 | <td><%=h event.start_time %></td> |
| 24 | <td><%=h event.end_time %></td> | 24 | <td><%=h event.end_time %></td> |
| 25 | <td><%=h event.allday %></td> | 25 | <td><%=h event.allday %> → <%= event.allday ? t("admin.common.yes") : t("admin.common.no") %></td> |
| 26 | <td><%=h event.url %></td> | 26 | <td><%=h event.url %></td> |
| 27 | <td><%= link_to 'edit', edit_event_path(event) %></td> | 27 | <td><%= link_to t("events.index.edit_link"), edit_event_path(event) %></td> |
| 28 | </tr> | 28 | </tr> |
| 29 | <% end %> | 29 | <% end %> |
| 30 | </table> | 30 | </table> |
diff --git a/config/locales/de.yml b/config/locales/de.yml index 3e0dfdd7..e2b393ee 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml | |||
| @@ -84,6 +84,26 @@ de: | |||
| 84 | container_aria_label: "Seitennavigation" | 84 | container_aria_label: "Seitennavigation" |
| 85 | page_aria_label: "Seite %{page}" | 85 | page_aria_label: "Seite %{page}" |
| 86 | 86 | ||
| 87 | activerecord: | ||
| 88 | attributes: | ||
| 89 | asset: | ||
| 90 | name: "Name" | ||
| 91 | upload: "Datei" | ||
| 92 | creator: "Urheber" | ||
| 93 | source_url: "Quell-URL" | ||
| 94 | license_key: "Lizenz" | ||
| 95 | event: | ||
| 96 | title: "Titel" | ||
| 97 | start_time: "Beginn" | ||
| 98 | end_time: "Ende" | ||
| 99 | rrule: "RRULE" | ||
| 100 | allday: "Ganztägig" | ||
| 101 | url: "URL" | ||
| 102 | node: "Node" | ||
| 103 | tag_list: "Tags" | ||
| 104 | latitude: "Breitengrad" | ||
| 105 | longitude: "Längengrad" | ||
| 106 | |||
| 87 | tags: | 107 | tags: |
| 88 | index: | 108 | index: |
| 89 | title: "Tags" | 109 | title: "Tags" |
| @@ -209,6 +229,10 @@ de: | |||
| 209 | destroy: "Löschen" | 229 | destroy: "Löschen" |
| 210 | search: "Suchen" | 230 | search: "Suchen" |
| 211 | reset: "Zurücksetzen" | 231 | reset: "Zurücksetzen" |
| 232 | show: "Anzeigen" | ||
| 233 | back: "Zurück" | ||
| 234 | update: "Aktualisieren" | ||
| 235 | confirm_sure: "Wirklich?" | ||
| 212 | confirm_irreversible: "Das kann nicht rückgängig gemacht werden. Fortfahren?" | 236 | confirm_irreversible: "Das kann nicht rückgängig gemacht werden. Fortfahren?" |
| 213 | toggle_preview: "Live-Vorschau umschalten" | 237 | toggle_preview: "Live-Vorschau umschalten" |
| 214 | force_render: "Vorschau neu rendern" | 238 | force_render: "Vorschau neu rendern" |
| @@ -221,6 +245,9 @@ de: | |||
| 221 | locked_by: "Gesperrt von" | 245 | locked_by: "Gesperrt von" |
| 222 | rev: "Rev." | 246 | rev: "Rev." |
| 223 | path: "Pfad" | 247 | path: "Pfad" |
| 248 | preview: "Vorschau" | ||
| 249 | name: "Name" | ||
| 250 | type: "Typ" | ||
| 224 | nodes: | 251 | nodes: |
| 225 | index: | 252 | index: |
| 226 | title: "Nodes" | 253 | title: "Nodes" |
| @@ -375,6 +402,47 @@ de: | |||
| 375 | delete_permanently: "Endgültig löschen" | 402 | delete_permanently: "Endgültig löschen" |
| 376 | restore_hint: "Zum Wiederherstellen eine Seite öffnen und in ihrem Papierkorb-Abschnitt einen neuen Eltern-Node wählen." | 403 | restore_hint: "Zum Wiederherstellen eine Seite öffnen und in ihrem Papierkorb-Abschnitt einen neuen Eltern-Node wählen." |
| 377 | 404 | ||
| 405 | events: | ||
| 406 | confirm_delete: "Diesen Termin löschen?" | ||
| 407 | index: | ||
| 408 | title: "Termine" | ||
| 409 | create_event: "Termin anlegen" | ||
| 410 | without_page_link: "Termine ohne Seite anzeigen →" | ||
| 411 | edit_link: "bearbeiten" | ||
| 412 | show: | ||
| 413 | title: "Termin" | ||
| 414 | title_for_node: "Termin für Node %{path}" | ||
| 415 | node_link: "Node" | ||
| 416 | recurrence: "Wiederholung" | ||
| 417 | edit: | ||
| 418 | title: "Termin bearbeiten" | ||
| 419 | change_node: "Node ändern" | ||
| 420 | change_node_hint: "Verknüpft den Termin mit einem anderen Node — selten nötig." | ||
| 421 | without_node: | ||
| 422 | title: "Termine ohne Node" | ||
| 423 | all_events_link: "← Alle Termine" | ||
| 424 | form: | ||
| 425 | node_hint: "Optional — Node suchen und auswählen, um diesen Termin mit einer Seite zu verknüpfen." | ||
| 426 | recurrence: "Wiederholung" | ||
| 427 | title_hint: "Optional — bleibt das Feld leer, wird der Titel des verknüpften Nodes verwendet." | ||
| 428 | rrule_builder: | ||
| 429 | weekly: "Wöchentlich" | ||
| 430 | monthly: "Monatlich" | ||
| 431 | biweekly: "Alle 2 Wochen" | ||
| 432 | monthly_ordinal: "An einem bestimmten Wochentag im Monat" | ||
| 433 | ordinal_1: "1." | ||
| 434 | ordinal_2: "2." | ||
| 435 | ordinal_3: "3." | ||
| 436 | ordinal_4: "4." | ||
| 437 | ordinal_last: "letzter" | ||
| 438 | ordinal_second_last: "vorletzter" | ||
| 439 | ordinal_custom: "Ausgewählte Wochen" | ||
| 440 | weeks_of_month: "Wochen im Monat:" | ||
| 441 | exclude_month: "Außer in einem Monat" | ||
| 442 | hint: "Füllt das Feld darunter automatisch. Für kompliziertere Muster das Feld einfach direkt bearbeiten — diese Bedienelemente ändern es nur, wenn sie benutzt werden." | ||
| 443 | new: | ||
| 444 | title: "Neuer Termin" | ||
| 445 | |||
| 378 | flash: | 446 | flash: |
| 379 | common: | 447 | common: |
| 380 | logged_in: "Erfolgreich angemeldet" | 448 | logged_in: "Erfolgreich angemeldet" |
| @@ -436,3 +504,34 @@ de: | |||
| 436 | none_to_remove: "Es existiert keine %{lang}-Übersetzung zum Entfernen." | 504 | none_to_remove: "Es existiert keine %{lang}-Übersetzung zum Entfernen." |
| 437 | last_translation: "Die einzige verbliebene Übersetzung kann nicht entfernt werden." | 505 | last_translation: "Die einzige verbliebene Übersetzung kann nicht entfernt werden." |
| 438 | removed: "%{lang}-Übersetzung aus dem Entwurf entfernt. Veröffentlichen, um das dauerhaft zu machen." | 506 | removed: "%{lang}-Übersetzung aus dem Entwurf entfernt. Veröffentlichen, um das dauerhaft zu machen." |
| 507 | assets: | ||
| 508 | index: | ||
| 509 | title: "Assets" | ||
| 510 | create_asset: "Asset anlegen" | ||
| 511 | show: | ||
| 512 | thumbnail: "Vorschaubild" | ||
| 513 | attached_to: "Angehängt an" | ||
| 514 | pending_only: "nur in ausstehenden Versionen" | ||
| 515 | not_attached: "— an keine Seite angehängt —" | ||
| 516 | new_page_with_attachment: "Neue Seite mit diesem Anhang" | ||
| 517 | public_path: "Öffentlicher Pfad" | ||
| 518 | copy_url: "URL kopieren" | ||
| 519 | creator: "Urheber" | ||
| 520 | source: "Quelle" | ||
| 521 | license: "Lizenz" | ||
| 522 | content_type: "Content-Type" | ||
| 523 | size: "Größe" | ||
| 524 | new: | ||
| 525 | title: "Neues Asset" | ||
| 526 | edit: | ||
| 527 | title: "Asset bearbeiten" | ||
| 528 | current_file: "Aktuelle Datei" | ||
| 529 | replace_file: "Datei ersetzen" | ||
| 530 | form: | ||
| 531 | drop_hint: "…oder Datei hier ablegen." | ||
| 532 | none_option: "— keine —" | ||
| 533 | attach_to_page: "an Seite anhängen" | ||
| 534 | attach_search_placeholder: "Seite suchen…" | ||
| 535 | attach_hint: "Optional — hängt dieses Asset an die Seite an, alle ausstehenden Versionen eingeschlossen." | ||
| 536 | as_headline: "als Aufmacher der Seite anhängen" | ||
| 537 | headline_hint: "Gilt nur, wenn die Seite noch keinen Aufmacher hat." | ||
diff --git a/config/locales/en.yml b/config/locales/en.yml index 616a1d8f..83ceadda 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml | |||
| @@ -36,6 +36,26 @@ en: | |||
| 36 | container_aria_label: "Pagination" | 36 | container_aria_label: "Pagination" |
| 37 | page_aria_label: "Page %{page}" | 37 | page_aria_label: "Page %{page}" |
| 38 | 38 | ||
| 39 | activerecord: | ||
| 40 | attributes: | ||
| 41 | asset: | ||
| 42 | name: "Name" | ||
| 43 | upload: "File" | ||
| 44 | creator: "Creator" | ||
| 45 | source_url: "Source URL" | ||
| 46 | license_key: "License" | ||
| 47 | event: | ||
| 48 | title: "Title" | ||
| 49 | start_time: "Start time" | ||
| 50 | end_time: "End time" | ||
| 51 | rrule: "Rrule" | ||
| 52 | allday: "Allday" | ||
| 53 | url: "Url" | ||
| 54 | node: "Node" | ||
| 55 | tag_list: "Tags" | ||
| 56 | latitude: "Latitude" | ||
| 57 | longitude: "Longitude" | ||
| 58 | |||
| 39 | tags: | 59 | tags: |
| 40 | index: | 60 | index: |
| 41 | title: "Tags" | 61 | title: "Tags" |
| @@ -161,6 +181,10 @@ en: | |||
| 161 | destroy: "Destroy" | 181 | destroy: "Destroy" |
| 162 | search: "Search" | 182 | search: "Search" |
| 163 | reset: "Reset" | 183 | reset: "Reset" |
| 184 | show: "Show" | ||
| 185 | back: "Back" | ||
| 186 | update: "Update" | ||
| 187 | confirm_sure: "Are you sure?" | ||
| 164 | confirm_irreversible: "This cannot be undone. Continue?" | 188 | confirm_irreversible: "This cannot be undone. Continue?" |
| 165 | toggle_preview: "Toggle live preview" | 189 | toggle_preview: "Toggle live preview" |
| 166 | force_render: "Force preview render" | 190 | force_render: "Force preview render" |
| @@ -173,6 +197,9 @@ en: | |||
| 173 | locked_by: "Locked by" | 197 | locked_by: "Locked by" |
| 174 | rev: "Rev." | 198 | rev: "Rev." |
| 175 | path: "Path" | 199 | path: "Path" |
| 200 | preview: "Preview" | ||
| 201 | name: "Name" | ||
| 202 | type: "Type" | ||
| 176 | nodes: | 203 | nodes: |
| 177 | index: | 204 | index: |
| 178 | title: "Nodes" | 205 | title: "Nodes" |
| @@ -327,6 +354,47 @@ en: | |||
| 327 | delete_permanently: "Delete permanently" | 354 | delete_permanently: "Delete permanently" |
| 328 | restore_hint: "To restore a page, open it and pick a new parent in its Trash section." | 355 | restore_hint: "To restore a page, open it and pick a new parent in its Trash section." |
| 329 | 356 | ||
| 357 | events: | ||
| 358 | confirm_delete: "Delete this event?" | ||
| 359 | index: | ||
| 360 | title: "Events" | ||
| 361 | create_event: "Create event" | ||
| 362 | without_page_link: "View events without a page →" | ||
| 363 | edit_link: "edit" | ||
| 364 | edit: | ||
| 365 | title: "Editing event" | ||
| 366 | change_node: "Change node" | ||
| 367 | change_node_hint: "This will re-link the event to a different node — rarely needed." | ||
| 368 | without_node: | ||
| 369 | title: "Events without a node" | ||
| 370 | all_events_link: "← All events" | ||
| 371 | show: | ||
| 372 | title: "Event" | ||
| 373 | title_for_node: "Event for node %{path}" | ||
| 374 | node_link: "Node" | ||
| 375 | recurrence: "Recurrence" | ||
| 376 | form: | ||
| 377 | node_hint: "Optional — search and pick a node to associate this event with a page." | ||
| 378 | recurrence: "Recurrence" | ||
| 379 | title_hint: "Optional — if left blank, the associated node's title is used." | ||
| 380 | rrule_builder: | ||
| 381 | weekly: "Weekly" | ||
| 382 | monthly: "Monthly" | ||
| 383 | biweekly: "Every 2 weeks" | ||
| 384 | monthly_ordinal: "On a specific weekday each month" | ||
| 385 | ordinal_1: "1st" | ||
| 386 | ordinal_2: "2nd" | ||
| 387 | ordinal_3: "3rd" | ||
| 388 | ordinal_4: "4th" | ||
| 389 | ordinal_last: "last" | ||
| 390 | ordinal_second_last: "second to last" | ||
| 391 | ordinal_custom: "Selected weeks" | ||
| 392 | weeks_of_month: "Weeks of the month:" | ||
| 393 | exclude_month: "Except in one month" | ||
| 394 | hint: "Builds the field below automatically. If your pattern is more complex than this covers, just edit it directly below - these controls won't touch it unless you use them." | ||
| 395 | new: | ||
| 396 | title: "New event" | ||
| 397 | |||
| 330 | flash: | 398 | flash: |
| 331 | common: | 399 | common: |
| 332 | logged_in: "Logged in successfully" | 400 | logged_in: "Logged in successfully" |
| @@ -388,3 +456,34 @@ en: | |||
| 388 | none_to_remove: "No %{lang} translation exists to remove." | 456 | none_to_remove: "No %{lang} translation exists to remove." |
| 389 | last_translation: "Can't remove the only remaining translation." | 457 | last_translation: "Can't remove the only remaining translation." |
| 390 | removed: "%{lang} translation removed from the draft. Publish to make this permanent." | 458 | removed: "%{lang} translation removed from the draft. Publish to make this permanent." |
| 459 | assets: | ||
| 460 | index: | ||
| 461 | title: "Assets" | ||
| 462 | create_asset: "Create asset" | ||
| 463 | show: | ||
| 464 | thumbnail: "Thumbnail" | ||
| 465 | attached_to: "Attached to" | ||
| 466 | pending_only: "pending versions only" | ||
| 467 | not_attached: "— not attached to any page —" | ||
| 468 | new_page_with_attachment: "New page with this attachment" | ||
| 469 | public_path: "Public Path" | ||
| 470 | copy_url: "Copy URL" | ||
| 471 | creator: "Creator" | ||
| 472 | source: "Source" | ||
| 473 | license: "License" | ||
| 474 | content_type: "Content Type" | ||
| 475 | size: "Size" | ||
| 476 | new: | ||
| 477 | title: "New asset" | ||
| 478 | edit: | ||
| 479 | title: "Editing asset" | ||
| 480 | current_file: "Current File" | ||
| 481 | replace_file: "Replace file" | ||
| 482 | form: | ||
| 483 | drop_hint: "…or drop a file here." | ||
| 484 | none_option: "— none —" | ||
| 485 | attach_to_page: "attach to page" | ||
| 486 | attach_search_placeholder: "Search for a page…" | ||
| 487 | attach_hint: "Optional — attaches this asset to that page, all pending versions included." | ||
| 488 | as_headline: "attach as the page's headline" | ||
| 489 | headline_hint: "Applies only if the page has no headline yet." | ||
