Merge branches 'preferences' and 'master'

This commit is contained in:
Reinier Balt 2011-08-18 12:49:29 +02:00
commit 8e6699becb
25 changed files with 2523 additions and 2093 deletions

View file

@ -1,23 +1,31 @@
class PreferencesController < ApplicationController
def index
@page_title = t('preferences.page_title')
@prefs = current_user.prefs
@user = current_user
end
def edit
@page_title = t('preferences.page_title_edit')
@prefs = current_user.prefs
end
def update
@prefs = current_user.prefs
@user = current_user
user_updated = current_user.update_attributes(params['user'])
prefs_updated = current_user.preference.update_attributes(params['prefs'])
if user_updated && prefs_updated
if (user_updated && prefs_updated)
notify :notice, "Preferences updated"
redirect_to :action => 'index'
else
render :action => 'edit'
msg = "Preferences could not be updated: "
msg += "User model errors; " unless user_updated
msg += "Prefs model errors; " unless prefs_updated
notify :warning, msg
render 'index'
end
end
def render_date_format
format = params[:date_format]
render :text => l(Date.today, :format => format)
end
end

View file

@ -1,2 +1,18 @@
module PreferencesHelper
def pref(model, pref_name, &block)
s = "<label for #{model+pref_name}>#{Preference.human_attribute_name(pref_name)}:</label><br/>"
s << yield
s << "<br/><br/>"
s
end
def pref_with_select_field(model, pref_name, collection = [ [t('preferences.is_true'),true], [t('preferences.is_false'), false] ])
pref(model, pref_name) { select(model, pref_name, collection) }
end
def pref_with_text_field(model, pref_name)
pref(model, pref_name) { text_field(model, pref_name) }
end
end

View file

@ -0,0 +1,37 @@
<label><%= t('preferences.token_header') %></label><br/><br/>
<%= t('preferences.token_description') %>: <span class="highlight"><%= current_user.token %></span>
<br/><br/>
<div class="pref_new_token">
<% # TODO: make remote AJAX call for new token %>
<%= link_to(
t('preferences.generate_new_token'),
refresh_token_user_path( current_user ),
:method => :post,
:confirm => t('preferences.generate_new_token_confirm'),
:id=>'prefs_new_token') %>
</div>
<br/>
<% if Tracks::Config.auth_schemes.length > 1 %>
<label for="user_auth_type"><%= t('users.label_auth_type') %>:</label><br/>
<% Tracks::Config.auth_schemes.each do |scheme| %>
<%= radio_button_tag('user[auth_type]', scheme, current_user.auth_type == scheme) %><%=scheme%> <br/>
<% end %>
<br/>
<div id="open_id" style="display:<%= current_user.auth_type == 'open_id' ? 'block' : 'none' %>">
<label for="openid_url"><%= t('users.identity_url') %>:</label><br/>
<input type="text" name="user[open_id_url]" value="<%= current_user.open_id_url %>" class="open_id" />
</div>
<div id="database" style="display:<%= current_user.auth_type == 'database' ? 'block' : 'none' %>">
<%= render :partial => 'users/update_password' %>
</div>
<% end %>

View file

@ -0,0 +1,23 @@
<%= pref_with_text_field('prefs', 'date_format') %>
<div class='prefs_example'>This will result in: <span id='prefs.date_format'><%= l(Date.today, :format => current_user.prefs.date_format) %></span></div>
<br/>
Or pick one of the following:<br/>
<% %w{default short long longer}.each do |format| %>
<%= radio_button_tag("date_picker1", t("date.formats.#{format}")) %> <%= l(Date.today, :format => format.to_sym) %> <br/>
<% end %>
<br/>
<%= pref_with_text_field('prefs', 'title_date_format') %>
<div class='prefs_example'>This will result in: <span id='prefs.title_date_format'><%= l(Date.today, :format => current_user.prefs.title_date_format) %></span></div>
<br/>
Or pick one of the following:<br/>
<% %w{default short long longer}.each do |format| %>
<%= radio_button_tag("date_picker2", t("date.formats.#{format}")) %> <%= l(Date.today, :format => format.to_sym) %> <br/>
<% end %>
<br/>
<%= pref('prefs', 'time_zone') { time_zone_select('prefs','time_zone') } %>
<%= pref_with_select_field('prefs', "week_starts", (0..6).to_a.map {|num| [t('date.day_names')[num], num] }) %>

View file

@ -0,0 +1,6 @@
<%= pref_with_text_field 'user', 'first_name' %>
<%= pref_with_text_field 'user', 'last_name' %>
<%= pref_with_select_field('prefs', 'locale', I18n.available_locales.map {|l| l.to_s}) %>
<% if current_user.is_admin? %>
<%= pref_with_text_field('prefs', 'admin_email') %>
<% end %>

View file

@ -0,0 +1,13 @@
<%= pref_with_select_field('prefs', "due_style", [[t('models.preference.due_styles')[0],Preference.due_styles[:due_in_n_days]],[t('models.preference.due_styles')[1],Preference.due_styles[:due_on]]]) %>
<%= pref_with_select_field('prefs', "show_completed_projects_in_sidebar") %>
<%= pref_with_select_field('prefs', "show_hidden_projects_in_sidebar") %>
<%= pref_with_select_field('prefs', "show_hidden_contexts_in_sidebar") %>
<%= pref_with_select_field('prefs', "show_project_on_todo_done") %>
<%= pref_with_text_field('prefs', 'staleness_starts') %>
<%= pref_with_text_field('prefs', 'show_number_completed') %>
<%= pref_with_text_field('prefs', 'refresh') %>
<%= pref_with_select_field('prefs', "verbose_action_descriptors") %>
<%= pref_with_text_field('prefs', "mobile_todos_per_page") %>
<%= pref_with_text_field('prefs', "sms_email") %>
<%= pref('prefs', "sms_context") { select('prefs', 'sms_context_id', current_user.contexts.map{|c| [c.name, c.id]}) } %>

View file

@ -1,59 +0,0 @@
<div id="display_box" class="container context">
<%= render :partial => 'help' %>
</div>
<div id="input_box" class="container context">
<% form_tag :action => 'update' do %>
<table>
<tr>
<td><label><%= User.human_attribute_name('first_name') %></label></td>
<td><%= text_field 'user', 'first_name' %></td>
</tr>
<tr>
<td><label><%= User.human_attribute_name('last_name') %></label></td>
<td><%= text_field 'user', 'last_name' %></td>
</tr>
<%
def table_row(pref_name, nowrap_label = false, &block)
nowrap_attribute = nowrap_label ? ' nowrap="nowrap"' : ''
s = %Q|<tr>\n<td#{nowrap_attribute}><label>#{Preference.human_attribute_name(pref_name)}:</label></td>\n<td>\n|
s << yield
s << "\n</td></tr>"
s
end
def row_with_select_field(pref_name, collection = [ [t('preferences.is_true'),true], [t('preferences.is_false'), false] ], nowrap_label = false)
table_row(pref_name, nowrap_label) { select('prefs', pref_name, collection) }
end
def row_with_text_field(pref_name, nowrap_label = false)
table_row(pref_name, nowrap_label) { text_field('prefs', pref_name) }
end
%>
<%= row_with_select_field('locale', I18n.available_locales.map {|l| l.to_s}) %>
<%= row_with_text_field('date_format') %>
<%= row_with_text_field('title_date_format') %>
<%= table_row('time_zone', false) { time_zone_select('prefs','time_zone') } %>
<%= row_with_select_field("week_starts", (0..6).to_a.map {|num| [t('date.day_names')[num], num] }) %>
<%= row_with_select_field("due_style", [[t('models.preference.due_styles')[0],Preference.due_styles[:due_in_n_days]],[t('models.preference.due_styles')[1],Preference.due_styles[:due_on]]]) %>
<%= row_with_select_field("show_completed_projects_in_sidebar") %>
<%= row_with_select_field("show_hidden_projects_in_sidebar") %>
<%= row_with_select_field("show_hidden_contexts_in_sidebar") %>
<%= row_with_select_field("show_project_on_todo_done") %>
<% if current_user.is_admin? %> <%= row_with_text_field('admin_email') %> <% end %>
<%= row_with_text_field('staleness_starts', false) %>
<%= row_with_text_field('show_number_completed') %>
<%= row_with_text_field('refresh') %>
<%= row_with_select_field("verbose_action_descriptors") %>
<%= row_with_text_field("mobile_todos_per_page") %>
<%= row_with_text_field("sms_email") %>
<%= table_row("sms_context", false) { select('prefs', 'sms_context_id', current_user.contexts.map{|c| [c.name, c.id]}) } %>
<tr><td><%= submit_tag t('common.update') %></td>
<td><%= link_to t('common.cancel'), :action => 'index' %></td>
</tr>
</table>
<% end %>
</div>

View file

@ -1,68 +1,32 @@
<div id="single_box" class="container context prefscontainer">
<div id="display_box">
<h2><%= t('preferences.title') %></h2>
<div id="edit_error_status"><%= error_messages_for(:user) + error_messages_for(:prefs) %></div>
<ul id="prefs">
<li><%= User.human_attribute_name('first_name') %>: <span class="highlight"><%= current_user.first_name %></span></li>
<li><%= User.human_attribute_name('last_name') %>: <span class="highlight"><%= current_user.last_name %></span></li>
<li><%= Preference.human_attribute_name('date_format') %>: <span class="highlight"><%= current_user.prefs.date_format %></span> Your current date: <%= format_date(current_user.time) %></li>
<li><%= Preference.human_attribute_name('locale') %>: <span class="highlight"><%= current_user.prefs.locale %></span></li>
<li><%= Preference.human_attribute_name('title_date_format') %>: <span class="highlight"><%= current_user.prefs.title_date_format %></span> Your current title date: <%= current_user.time.strftime(current_user.prefs.title_date_format) %></li>
<li><%= Preference.human_attribute_name('time_zone') %>: <span class="highlight"><%= current_user.prefs.time_zone %></span> Your current time: <%= current_user.time.strftime('%I:%M %p') %></li>
<li><%= Preference.human_attribute_name('week_starts') %>: <span class="highlight"><%= t('date.day_names')[current_user.prefs.week_starts] %></span></li>
<li><%= t('preferences.show_number_completed', :number=> "<span class=\"highlight\">#{current_user.prefs.show_number_completed}</span>")%></li>
<li><%= Preference.human_attribute_name('show_completed_projects_in_sidebar') %>: <span class="highlight"><%= current_user.prefs.show_completed_projects_in_sidebar %></span></li>
<li><%= Preference.human_attribute_name('show_hidden_projects_in_sidebar') %>: <span class="highlight"><%= current_user.prefs.show_hidden_projects_in_sidebar %></span></li>
<li><%= Preference.human_attribute_name('show_hidden_contexts_in_sidebar') %>: <span class="highlight"><%= current_user.prefs.show_hidden_contexts_in_sidebar %></span></li>
<li><%= Preference.human_attribute_name('show_project_on_todo_done') %>: <span class="highlight"><%= current_user.prefs.show_project_on_todo_done %></span></li>
<li><%= t('preferences.staleness_starts_after', :days => "<span class=\"highlight\">#{current_user.prefs.staleness_starts}</span>") %></li>
<li><%= Preference.human_attribute_name('due_style') %>: <span class="highlight">
<% if prefs.due_style == Preference.due_styles[:due_in_n_days] %>
<%= t('models.preference.due_styles')[0] %>
<% else %>
<%= t('models.preference.due_styles')[1] %>
<% end %>
</span></li>
<% if current_user.is_admin? %>
<li><%= Preference.human_attribute_name('admin_email') %>: <span class="highlight"><%= current_user.prefs.admin_email %></span></li>
<% end %>
<li><%= Preference.human_attribute_name('refresh') %>: <span class="highlight"><%= current_user.prefs.refresh %></span></li>
<li><%= Preference.human_attribute_name('verbose_action_descriptors') %>: <span class="highlight"><%= current_user.prefs.verbose_action_descriptors %></span></li>
<li><%= Preference.human_attribute_name('mobile_todos_per_page') %>: <span class="highlight"><%= current_user.prefs.mobile_todos_per_page %></span></li>
<li><%= Preference.human_attribute_name('sms_email') %>: <span class="highlight"><%= current_user.prefs.sms_email %></span></li>
<li><%= Preference.human_attribute_name('sms_context') %>: <span class="highlight"><%= current_user.prefs.sms_context.nil? ? t('preferences.sms_context_none') : current_user.prefs.sms_context.name %></span></li>
</ul>
<div class="actions">
<%= link_to t('preferences.edit_preferences') + " &raquo;", { :controller => 'preferences', :action => 'edit'}, :class => 'edit_link' %>
</div>
<h2><%= t('preferences.token_header') %></h2>
<div id="token_area">
<div class="description"><%= t('preferences.token_description') %>:</div>
<div id="token"><span class="highlight"><%= current_user.token %></span></div>
<div class="token_regenerate">
<%= button_to t('preferences.generate_new_token'), refresh_token_user_path(current_user),
:confirm => t('preferences.generate_new_token_confirm') %>
<% form_tag :action => 'update' do %>
<div id="tabs">
<ul>
<li><a href="#tabs-1"><%= t('preferences.tabs.profile')%></a></li>
<li><a href="#tabs-2"><%= t('preferences.tabs.authentication')%></a></li>
<li><a href="#tabs-3"><%= t('preferences.tabs.date_and_time')%></a></li>
<li><a href="#tabs-4"><%= t('preferences.tabs.tracks_behavior')%></a></li>
</ul>
<div id="tabs-1">
<%= render :partial => 'profile'%>
</div>
<div id="tabs-2">
<%= render :partial => 'authentication'%>
</div>
<div id="tabs-3">
<%= render :partial => 'date_and_time'%>
</div>
<div id="tabs-4">
<%= render :partial => 'tracks_behavior'%>
</div>
</div>
<h2><%= t('preferences.authentication_header') %></h2>
<div id="authentication_area">
<% if Tracks::Config.auth_schemes.length > 1 %>
<p><%= t('preferences.current_authentication_type', :auth_type => "<span class=\"highlight\">#{current_user.auth_type}</span>") %>.</p>
<div class="actions">
<%= link_to(t('preferences.change_authentication_type') + " &raquo;", change_auth_type_user_path(current_user), :class => 'edit_link') %>
</div>
<% end %>
<% if current_user.auth_type == 'database' %>
<div class="actions">
<%= link_to(t('preferences.change_password') + ' &raquo;', change_password_user_path(current_user)) %>
</div>
<% end %>
<% if current_user.auth_type == 'open_id' %>
<p><%= t('preferences.open_id_url') %> <span class="highlight"><%= current_user.open_id_url %></span>.</p>
<div class="actions">
<%= link_to(t('preferences.change_identity_url') + ' &raquo;', change_auth_type_user_path(current_user)) %>
</div>
<% end %>
</div>
</div>
<br/>
<button type="submit" id="prefs_submit"><%= t('common.update') %></button>
<% end %>
</div>

View file

@ -1,7 +1,7 @@
<div id="footer">
<p><%= t('footer.send_feedback', :version => TRACKS_VERSION) %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets"><%= t('common.bugs')%></a> |
<p><%= t('footer.send_feedback', :version => TRACKS_VERSION) %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets"><%= t('common.bugs')%></a> |
<a href="http://www.getontracks.org/forums/"><%= t('common.forum')%></a> |
<a href="http://www.getontracks.org/wiki/"><%= t('common.wiki')%></a> |
<a href="https://github.com/TracksApp/tracks/wiki"><%= t('common.wiki')%></a> |
<a href="mailto:butshesagirl@rousette.org.uk?subject=Tracks feedback"><%= t('common.email')%></a> |
<a href="http://www.getontracks.org/"><%= t('common.website')%></a> |
<a href="http://getontracks.org/tracks/contribute"><%= t('common.contribute')%></a></p>

View file

@ -0,0 +1,4 @@
<label for="user[password]"><%= t('users.new_password_label') %>:</label><br/>
<%= password_field "user", "password", :size => 40 %><br/>
<label for="user[password_confirmation]"><%= t('users.password_confirmation_label') %>:</label><br/>
<%= password_field "user", "password_confirmation", :size => 40 %><br/>

View file

@ -1,5 +1,5 @@
<div id="single_box" class="container context">
<h2><%= @page_title %></h2>
<%= error_messages_for 'user' %>
@ -7,20 +7,10 @@
<p><%= t('users.change_password_prompt') %></p>
<% form_tag :action => 'update_password' do %>
<table width="440px">
<tr>
<td><label for="updateuser_password"><%= t('users.new_password_label') %>:</label></td>
<td><%= password_field "updateuser", "password", :size => 40 %></td>
</tr>
<tr>
<td><label for="updateuser_password_confirmation"><%= t('users.password_confirmation_label') %>:</label></td>
<td><%= password_field "updateuser", "password_confirmation", :size => 40 %></td>
</tr>
<tr>
<td><%= link_to t('common.cancel'), preferences_path %></td>
<td><%= submit_tag t('users.change_password_submit') %></td>
</tr>
</table>
<%= render :partial => 'update_password' %>
<br/>
<%= link_to t('common.cancel'), preferences_path %>
<%= submit_tag t('users.change_password_submit') %>
<% end %>
</div>

View file

@ -70,7 +70,7 @@ Rails::Initializer.run do |config|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
# See Rails::Configuration for more options
if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
#requires rubycas-client gem to be installed

View file

@ -3,16 +3,16 @@ de:
layouts:
toggle_notes: Notizen umschalten
next_actions_rss_feed: RSS-Feed kommende Aufgaben
toggle_notes_title: Alle Notizen umschalten
mobile_navigation:
new_action: 0-Neue Aufgabe
logout: Abmelden
feeds: Feeds
new_action: 0-Neue Aufgabe
starred: 4-Markiert
projects: 3-Projekte
tickler: Notizbuch
contexts: 2-Kontexte
home: 1-Home
toggle_notes_title: Alle Notizen umschalten
navigation:
manage_users_title: "Benutzer hinzuf\xC3\xBCgen oder entfernen"
recurring_todos: Sich wiederholende To-Dos
@ -24,18 +24,18 @@ de:
tickler_title: Notizbuch
manage_users: Benutzer verwalten
export_title: Daten importieren und exportieren
integrations_: Tracks integrieren
preferences: Einstellungen
integrations_: Tracks integrieren
feeds_title: "Liste der verf\xC3\xBCgbaren Feeds anzeigen"
calendar_title: "Kalender mit \xC3\xBCberf\xC3\xA4lligen Aufgaben"
stats_title: Statistiken anzeigen
tickler: Notizbuch
home_title: Start
starred_title: Markierte Aufgaben betrachten
recurring_todos_title: Sich wiederholende To-Dos verwalten
tickler: Notizbuch
completed_tasks: Erledigt
organize: Organisieren
stats_title: Statistiken anzeigen
home_title: Start
view: Betrachten
organize: Organisieren
completed_tasks_title: "Vollst\xC3\xA4ndig"
home: Start
export: Export
@ -66,9 +66,6 @@ de:
percentage:
format:
delimiter: ""
precision:
format:
delimiter: ""
currency:
format:
format: "%n%u"
@ -78,6 +75,9 @@ de:
separator: .
precision:
delimiter: ","
precision:
format:
delimiter: ""
integrations:
opensearch_description: In Tracks suchen
applescript_next_action_prompt: "Beschreibung der n\xC3\xA4chsten Aufgabe:"
@ -93,65 +93,68 @@ de:
previous: Vorherige
logout: Abmelden
go_back: "Zur\xC3\xBCck"
optional: optional
week: Woche
cancel: Abbrechen
none: Keine
second: Zweite
month: Monat
optional: optional
notes: Notizen
forum: Forum
server_error: Auf dem Server ist ein Fehler aufgetreten.
forum: Forum
notes: Notizen
last: Letzte
action: Aktion
projects: Projekte
action: Aktion
project: Projekt
contribute: Mitwirken
ok: Ok
contribute: Mitwirken
website: Website
first: Erste
numbered_step: Schritt %{number}
first: Erste
sort:
by_task_count_title: Nach Anzahl der Aufgaben sortieren
by_task_count_title_confirm: Sollen diese Projekte wirklich nach Anzahl der Aufgaben sortiert werden? Die bisherige Sortier-Reihenfolge wird damit &uuml;berschrieben.
alphabetically: Alphabetisch
alphabetically_confirm: Sollen diese Projekte wirklich alphabetisch sortiert werden? Die bisherige Sortier-Reihenfolge wird damit &uuml;berschrieben.
sort: Sortieren
alphabetically_confirm: Sollen diese Projekte wirklich alphabetisch sortiert werden? Die bisherige Sortier-Reihenfolge wird damit &uuml;berschrieben.
alphabetically_title: Projekte alphabetisch sortieren
by_task_count: Nach Anzahl der Aufgaben
fourth: Vierte
create: Erstellen
months: Monate
todo: Aktione
contexts: Kontexte
context: Kontext
next: "N\xC3\xA4chste"
description: Beschreibung
errors_with_fields: "Mit folgenden Feldern sind Probleme aufgetreten:"
todo: Aktione
context: Kontext
drag_handle: Verschieben
update: Aktualisieren
description: Beschreibung
bugs: Bugs
weeks: Woche
update: Aktualisieren
forth: Vierte
wiki: Wiki
weeks: Woche
email: E-Mail
search: Suchen
ajaxError: Fehler beim Empfangen vom Server
email: E-Mail
data:
import_successful: Import war erfolgreich.
import_errors: Beim Import sind Fehler aufgetreten.
models:
project:
feed_title: Tracks-Projekte
feed_description: "Listet alle Projekte f\xC3\xBCr %{username} auf"
todo:
error_date_must_be_future: muss ein Datum in der Zukunft sein
user:
error_context_not_associated: "Kontext-ID %{context} nicht mit Benutzer-ID %{user} verkn\xC3\xBCpft."
error_project_not_associated: "Projekt-ID %{project} nicht mit User-ID %{user} verkn\xC3\xBCpft."
preference:
due_on: "F\xC3\xA4llig auf %{date}"
due_in: "F\xC3\xA4llig in %{days} Tagen"
due_styles:
- "F\xC3\xA4llig in ___ Tagen"
- "F\xC3\xA4llig am _______"
user:
error_context_not_associated: "Kontext-ID %{context} nicht mit Benutzer-ID %{user} verkn\xC3\xBCpft."
error_project_not_associated: "Projekt-ID %{project} nicht mit User-ID %{user} verkn\xC3\xBCpft."
activerecord:
attributes:
project:
@ -160,35 +163,58 @@ de:
default_context_name: Standard Kontext
description: Beschreibung
todo:
show_from: Zeigen ab dem
predecessors: "H\xC3\xA4ngt ab von"
show_from: Zeigen ab dem
notes: Notizen
project: Projekt
context: Kontext
description: Beschreibung
due: F&auml;llig
user:
last_name: Nachname
first_name: Vorname
preference:
show_hidden_projects_in_sidebar: Zeige Versteckte Projekte in der Sidebar
date_format: Datum Format
show_hidden_contexts_in_sidebar: "Zeige Versteckte Zusammenh\xC3\xA4nge in der Sidebar"
mobile_todos_per_page: Aufgaben pro Seite (Mobile Version)
verbose_action_descriptors: "Ausf\xC3\xBChrlich Aktion Deskriptoren"
sms_context: Standard-E-Mail-Kontext
staleness_starts: Anfang des Abgestandenheit
sms_context: Standard-E-Mail-Kontext
title_date_format: Titel Datumsformat
show_number_completed: "Zeige Zahl der abgeschlossenen Ma\xC3\x9Fnahmen"
refresh: Aktualisierungsintverall (in Minuten)
week_starts: Woche startet am
time_zone: Zeit Zone
due_style: "F\xC3\xA4llig stijl"
locale: Zahle
sms_email: Per E-Mail
show_project_on_todo_done: Zur Projektseite wechseln, wenn To-Do abgeschlossen
show_completed_projects_in_sidebar: Zeige abgeschlossene Projekte in der Sidebar
user:
last_name: Nachname
first_name: Vorname
locale: Zahle
due_style: "F\xC3\xA4llig stijl"
time_zone: Zeit Zone
show_project_on_todo_done: Zur Projektseite wechseln, wenn To-Do abgeschlossen
sms_email: Per E-Mail
first_name: Name
show_completed_projects_in_sidebar: Zeige abgeschlossene Projekte in der Sidebar
errors:
messages:
greater_than_or_equal_to: "muss gr\xC3\xB6\xC3\x9Fer oder gleich %{count} sein"
record_invalid: "Validierung fehlgeschlagen: %{Fehler}"
confirmation: "stimmt nicht mit der Best\xC3\xA4tigung \xC3\xBCberein"
less_than_or_equal_to: muss kleiner oder gleich %{count} sein
blank: "muss ausgef\xC3\xBCllt werden"
invalid: "ist nicht g\xC3\xBCltig"
exclusion: "ist nicht verf\xC3\xBCgbar"
odd: muss ungerade sein
even: muss gerade sein
too_short: ist zu kurz (nicht weniger als %{count} Zeichen)
wrong_length: "hat die falsche L\xC3\xA4nge (muss genau %{count} Zeichen haben)"
empty: "muss ausgef\xC3\xBCllt werden"
less_than: muss kleiner als %{count} sein
greater_than: "muss gr\xC3\xB6\xC3\x9Fer als %{count} sein"
equal_to: muss genau %{count} sein
accepted: muss akzeptiert werden
too_long: ist zu lang (nicht mehr als %{count} Zeichen)
taken: ist bereits vergeben
inclusion: "ist kein g\xC3\xBCltiger Wert"
not_a_number: ist keine Zahl
models:
project:
attributes:
@ -196,27 +222,6 @@ de:
blank: Projekt muss einen Namen haben
too_long: Projektname muss weniger als 256 Zeichen haben
taken: existiert bereits
messages:
record_invalid: "Validierung fehlgeschlagen: %{Fehler}"
greater_than_or_equal_to: "muss gr\xC3\xB6\xC3\x9Fer oder gleich %{count} sein"
confirmation: "stimmt nicht mit der Best\xC3\xA4tigung \xC3\xBCberein"
less_than_or_equal_to: muss kleiner oder gleich %{count} sein
blank: "muss ausgef\xC3\xBCllt werden"
invalid: "ist nicht g\xC3\xBCltig"
exclusion: "ist nicht verf\xC3\xBCgbar"
odd: muss ungerade sein
too_short: ist zu kurz (nicht weniger als %{count} Zeichen)
wrong_length: "hat die falsche L\xC3\xA4nge (muss genau %{count} Zeichen haben)"
empty: "muss ausgef\xC3\xBCllt werden"
even: muss gerade sein
less_than: muss kleiner als %{count} sein
greater_than: "muss gr\xC3\xB6\xC3\x9Fer als %{count} sein"
equal_to: muss genau %{count} sein
accepted: muss akzeptiert werden
too_long: ist zu lang (nicht mehr als %{count} Zeichen)
taken: ist bereits vergeben
not_a_number: ist keine Zahl
inclusion: "ist kein g\xC3\xBCltiger Wert"
full_messages:
format: "%{attribute} %{message}"
template:
@ -224,20 +229,22 @@ de:
header:
one: "Konnte dieses %{model} Objekt nicht speichern: 1 Fehler."
other: "Konnte dieses %{model} Objekt nicht speichern: %{count} Fehler."
data:
import_successful: Import war erfolgreich.
import_errors: Beim Import sind Fehler aufgetreten.
stats:
totals_active_project_count: Von diesen sind %{count} aktive Projekte
tag_cloud_title: Tag-Cloud aller Aktionen
actions: Aktionen
tag_cloud_description: Diese Tag-Cloud beinhaltet Tags aller Aktionen (abgeschlossen, nicht abgeschlossen, sichtbar und/oder unsichtbar)
tag_cloud_90days_title: Tag-Cloud-Aktionen in den letzten 90 Tagen
totals_active_project_count: Von diesen sind %{count} aktive Projekte
actions: Aktionen
actions_last_year_legend:
number_of_actions: Anzahl Aktionen
months_ago: Monate zuvor
totals_first_action: Seit deiner ersten Aktion am %{date}
actions_avg_completion_time: Durchschnittlich hast du %{count} Tage gebraucht, um eine Aktion abzuschliessen.
running_time_legend:
actions: Aufgaben
percentage: Prozentsatz
weeks: "Vergangene Zeit einer Aktion (Wochen). Klick auf eine Leiste f\xC3\xBCr mehr Informationen."
actions_dow_30days_title: Wochentag (letzte 30 Tage)
totals_action_count: hattest du insgesamt %{count} Aktionen
legend:
number_of_days: Anzahl vergangene Tage
@ -249,58 +256,55 @@ de:
months_ago: Monate zuvor
current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unvollst\xC3\xA4ndiger sichtbarer Aufgaben"
totals_deferred_actions: "von denen %{count} im Notizbuch zur\xC3\xBCckgestellt sind"
running_time_legend:
actions: Aufgaben
percentage: Prozentsatz
weeks: "Vergangene Zeit einer Aktion (Wochen). Klick auf eine Leiste f\xC3\xBCr mehr Informationen."
top10_longrunning: "Top 10 der am l\xC3\xA4ngsten laufenden Projekte"
actions_dow_30days_title: Wochentag (letzte 30 Tage)
actions_lastyear_title: Aktionen der letzten 12 Monate
totals_actions_completed: "%{count} davon sind abgeschlossen."
totals_incomplete_actions: "Du hast %{count} unvollst\xC3\xA4ndige Aktionen"
totals_unique_tags: Von diesen Tags sind %{count} einmalig..
actions_avg_completed_30days: und %{count} durchschnittlich davon erledigt.
top5_contexts: Top 5 aller Kontexte
action_completion_time_title: Fertigstellungszeit (alle abgeschlossenen Aktionen)
actions_last_year: Aktionen im letzten Jahr
totals_context_count: Du hast %{count} Kontexte.
projects: Projekte
actions_lastyear_title: Aktionen der letzten 12 Monate
totals_actions_completed: "%{count} davon sind abgeschlossen."
totals_incomplete_actions: "Du hast %{count} unvollst\xC3\xA4ndige Aktionen"
totals_visible_context_count: Von diesen sind %{count} sichtbare Kontexte
totals_blocked_actions: "%{count} h\xC3\xA4ngen vom Abschluss anderer Aktionen ab."
actions_day_of_week_title: Wochentag (alle Aktionen)
totals_project_count: Du hast %{count} Projekte.
action_completion_time_title: Fertigstellungszeit (alle abgeschlossenen Aktionen)
actions_last_year: Aktionen im letzten Jahr
projects: Projekte
totals_context_count: Du hast %{count} Kontexte.
actions_min_max_completion_days: "Das Minimum/Maximum an Tagen einer Vervollst\xC3\xA4ndigung ist %{min}/%{max}."
tags: Tags
actions_min_completion_time: "Die minimale Zeit betr\xC3\xA4gt %{time}."
no_tags_available: "keine Tags verf\xC3\xBCgbar"
tags: Tags
running_time_all: "Aktuelle Laufzeit aller unvollst\xC3\xA4ndigen Aktionen."
actions_day_of_week_title: Wochentag (alle Aktionen)
totals_project_count: Du hast %{count} Projekte.
tag_cloud_90days_description: Diese Tag-Cloud beinhaltet Tags der Aktionen, die in den letzten 90 Tagen erstellt oder abgeschlossen wurden.
running_time_all: "Aktuelle Laufzeit aller unvollst\xC3\xA4ndigen Aktionen."
more_stats_will_appear: "Weitere Statistiken werden verf\xC3\xBCgbar, wenn einige Aufgaben hinzugef\xC3\xBCgt wurden."
actions_30days_title: _Aktionen der letzten 30 Tage
top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unvollst\xC3\xA4ndigen Aktionen"
time_of_day: Tageszeit (alle Aktionen)
totals_hidden_project_count: "%{count} sind versteckt"
actions_further: und danach
tod30: Tageszeit (letzte 30 Tage)
totals_hidden_project_count: "%{count} sind versteckt"
totals_tag_count: Du hast %{count} Tags in Aktionen.
more_stats_will_appear: "Weitere Statistiken werden verf\xC3\xBCgbar, wenn einige Aufgaben hinzugef\xC3\xBCgt wurden."
tod30: Tageszeit (letzte 30 Tage)
click_to_return: "Klick auf %{link} um zur Statistikseite zur\xC3\xBCckzukehren."
click_to_show_actions_from_week: Klick auf %{link} um die Aktionen von Woche %{week} und danach anzuzeigen.
other_actions_label: (andere)
top10_projects_30days: Top-10-Projekt der letzten 30 Tage
top10_projects: Top 10 aller Projekte
spread_of_running_actions_for_visible_contexts: Verteilung der laufenden Aufgaben aller sichtbaren Kontexte
actions_avg_created: In den letzten 12 Monaten hast du im Durchschnitt %{count} Aktionen erstellt
actions_selected_from_week: "Aktionen ausgew\xC3\xA4hlt ab Woche"
spread_of_actions_for_all_context: Aufgabenverteilung aller Kontexte
totals_completed_project_count: und %{count} sind abgeschlossene Projekte.
click_to_show_actions_from_week: Klick auf %{link} um die Aktionen von Woche %{week} und danach anzuzeigen.
actions_selected_from_week: "Aktionen ausgew\xC3\xA4hlt ab Woche"
actions_avg_created: In den letzten 12 Monaten hast du im Durchschnitt %{count} Aktionen erstellt
spread_of_actions_for_all_context: Aufgabenverteilung aller Kontexte
click_to_return_link: hier
totals_hidden_context_count: und %{count} sind versteckte Kontexte.
actions_avg_completed: und %{count} durchschnittlich davon monatlich erledigt
contexts: Kontexte
totals: Ingesamt
time_of_day_legend:
number_of_actions: Anzahl Aufgaben
time_of_day: Tageszeit
click_to_return_link: hier
contexts: Kontexte
totals_hidden_context_count: und %{count} sind versteckte Kontexte.
actions_avg_completed: und %{count} durchschnittlich davon monatlich erledigt
click_to_update_actions: Klicke auf eine Leiste in der Grafik um die Aktionen unten zu aktualisieren.
no_actions_selected: "Es sind keine Aufgaben ausgew\xC3\xA4hlt."
labels:
month_avg_completed: "%{months} Monat durchschnittlich fertig gestellt"
completed: Erledigt
@ -308,22 +312,20 @@ de:
avg_created: Durchschnittlich erstellt
avg_completed: Durchschnittlich fertiggestellt
created: Erstellt
no_actions_selected: "Es sind keine Aufgaben ausgew\xC3\xA4hlt."
click_to_update_actions: Klicke auf eine Leiste in der Grafik um die Aktionen unten zu aktualisieren.
running_time_all_legend:
actions: Aktionen
percentage: Prozentsatz
running_time: "Laufzeit einer Aktion (Wochen). Klick auf eine Leiste f\xC3\xBCr mehr Informationen."
action_selection_title: TRACKS::Aktionsauswahl
actions_actions_avg_created_30days: In den letzten 30 Tagen hast du im Durchschnitt %{count} Aktionen erstellt
tod30_legend:
number_of_actions: Anzahl Aufgaben
time_of_day: Tageszeit
action_selection_title: TRACKS::Aktionsauswahl
todos:
completed_actions: Erledigte Aufgaben
show_from: Anzeigen ab dem
error_starring_recurring: Konnte die Hervorhebung der wiederkehrenden Aufgabe \'%{description}\' nicht durchf&uuml;hren
recurring_action_deleted: Die Aktion wurde gel&ouml;scht. Da dies eine wiederkehrende Aktion ist, wurde eine neue erstellt.
completed_actions: Erledigte Aufgaben
completed_recurring: Abgeschlossene wiederkehrende To-Dos
added_new_next_action: Neue Aktion angelegt
completed_rest_of_previous_month: Fertiggestellt den Rest des Vormonats
@ -340,76 +342,77 @@ de:
no_hidden_actions: Momentan sind keine versteckten Aufgaben vorhanden
edit_action_with_description: Aktion '%{description}' bearbeiten
action_due_on: "(Aktion f\xC3\xA4llig am %{date})"
tags: Tags (Komma-separiert)
action_deleted_success: Die n&auml;chste Aktion erfolgreich gel&ouml;scht
archived_tasks_title: TRACKS::Archivierte erledigte Aufgaben
remove_dependency: Abh&auml;ngigkeit l&ouml;schen (l&ouml;scht nicht die Aufgabe)
list_incomplete_next_actions: Unerledigte Folge-Aufgaben anzeigen
mobile_todos_page_title: Alle Aufgaben
tags: Tags (Komma-separiert)
new_related_todo_created: "Eine neue To-Do wurde hinzugef\xC3\xBCgt, die zu dieser wiederkehrenden To-Do geh\xC3\xB6rt"
context_changed: Kontext zu %{name} gewechselt
mobile_todos_page_title: Alle Aufgaben
add_another_dependency: "F\xC3\xBCgen Sie eine andere Abh\xC3\xA4ngigkeit"
delete_recurring_action_title: "Wiederkehrende Aktion '%{description}' l\xC3\xB6schen"
removed_predecessor: "%{successor} entfernt als Abh\xC3\xA4ngigkeit von %{predecessor}."
recurring_actions_title: TRACKS::Wiederkehrende Aktionen
next_action_needed: Es muss mindestens eine folgende Aktion angelegt werden
action_deleted_error: Fehler beim L&ouml;schen der Aufgabe
action_saved: Aktion gespeichert
scheduled_overdue: "Planm\xC3\xA4\xC3\x9Fig angezeigt vor %{days} Tagen"
action_deleted_error: Fehler beim L&ouml;schen der Aufgabe
next_actions_description: "Filter:"
edit_action: Aktion bearbeiten
added_new_context: "Neuer Kontext hinzugef\xC3\xBCgt"
next_actions_description: "Filter:"
added_new_project: "Neues Projekt hinzugef\xC3\xBCgt"
list_incomplete_next_actions_with_limit: Zeige die letzten %{count} unerledigten Folge-Aufgaben
set_to_pending: "%{task} als ausstehend markiert"
next_actions_title_additions:
completed: Aufgaben erledigt
due_today: heute f&auml;llig
due_within_a_week: diese Woche f&auml;llig
added_new_project: "Neues Projekt hinzugef\xC3\xBCgt"
list_incomplete_next_actions_with_limit: Zeige die letzten %{count} unerledigten Folge-Aufgaben
set_to_pending: "%{task} als ausstehend markiert"
older_completed_items: "&Auml;ltere erledigte Aufgaben"
append_in_this_project: in diesem Projekt
error_deleting_item: Beim L&ouml;schen von %{description} trat ein Fehler auf
task_list_title: TRACKS::Aufgaben anzeigen
no_actions_due_this_week: Keine zu erledigenden Aufgaben f&uuml;r den Rest der Woche
delete_recurring_action_confirm: Soll die wiederkehrende Aktion '%{description}' wirklich gel&ouml;scht werden?
recurring_pattern_removed: Das Wiederauftreten Muster ist aus entfernt %{count}
no_recurring_todos: Im Augenblick gibt es keine wiederkehrenden To-Dos
error_completing_todo: Beim Abschliessen/Aktivieren der wiederkehrenden To-Do %{description} ist ein Fehler aufgetreten
recurring_pattern_removed: Das Wiederauftreten Muster ist aus entfernt %{count}
convert_to_project: In Projekt umwandeln
no_deferred_pending_actions: Momentan sind keine aufgeschobenen oder ausstehenden Aufgaben vorhanden.
delete_recurring_action_confirm: Soll die wiederkehrende Aktion '%{description}' wirklich gel&ouml;scht werden?
completed_last_day: In den letzten 24 Stunden erledigt
all_completed: Alle abgeschlossenen Aktionen
error_saving_recurring: Es gab einen Fehler beim Speichern der wiederkehrenden todo '%{description}'
show_in_days: Anzeigen in %{days} Tagen
no_project: --Kein Projekt--
completed_more_than_x_days_ago: Vor mehr als %{count} Tagen erledigt
feed_title_in_context: im Kontext '%{context}'
new_related_todo_created_short: hat einen neuen todo
completed_tagged_page_title: "TRACKS:: Erledigte Aufgaben mit Tag %{tag_name}"
no_project: --Kein Projekt--
show_in_days: Anzeigen in %{days} Tagen
error_saving_recurring: Es gab einen Fehler beim Speichern der wiederkehrenden todo '%{description}'
completed_more_than_x_days_ago: Vor mehr als %{count} Tagen erledigt
all_completed: Alle abgeschlossenen Aktionen
feed_title_in_context: im Kontext '%{context}'
older_than_days: "&Auml;lter als %{count} Tage"
completed_tagged_page_title: "TRACKS:: Erledigte Aufgaben mit Tag %{tag_name}"
edit: Bearbeiten
pending: Ausstehend
completed_actions_with: Abgeschlossene Aktionen mit dem Tag %{tag_name}
completed_tasks_title: TRACKS::Erledigte Aufgaben
deleted_success: "Die Aktion wurde erfolgreich gel\xC3\xB6scht."
completed_tasks_title: TRACKS::Erledigte Aufgaben
feed_title_in_project: im Projekt '%{project}'
clear_due_date: F&auml;lligkeitsdatum leeren
error_removing_dependency: "Beim Entfernen der Abh\xC3\xA4ngigkeit ist ein Fehler aufgetreten"
hidden_actions: Verstecke Aufgaben
was_due_on_date: war am %{date} f&auml;llig
error_removing_dependency: "Beim Entfernen der Abh\xC3\xA4ngigkeit ist ein Fehler aufgetreten"
show_on_date: Anzeigen am %{date}
was_due_on_date: war am %{date} f&auml;llig
recurrence_period: Wiederholungszeitraum
deferred_actions_with: "Zur\xC3\xBCckgestellte Aktionen mit dem Tag '%{tag_name}'"
recurring_deleted_success: "Die wiederkehrende Aktion wurde erfolgreich gel\xC3\xB6scht."
confirm_delete: "Bist du sicher, dass du die Aktion '%{description}' l\xC3\xB6schen m\xC3\xB6chtest?"
deferred_tasks_title: TRACKS::Notizbuch
next_actions_title: TRACKS::Weitere Aufgaben
recurring_deleted_success: "Die wiederkehrende Aktion wurde erfolgreich gel\xC3\xB6scht."
next_action_description: "Beschreibung der n\xC3\xA4chsten Aktion"
next_actions_title: TRACKS::Weitere Aufgaben
deferred_tasks_title: TRACKS::Notizbuch
no_completed_actions_with: Keine abgeschlossenen Aktionen mit dem Tag '%{tag_name}'
clear_show_from_date: Datum leeren
calendar_page_title: TRACKS::Kalender
unresolved_dependency: "Der Wert, den Sie in die Abh\xC3\xA4ngigkeit Feld eingegeben nicht zu einer bestehenden Aktion zu l\xC3\xB6sen. Dieser Wert wird nicht mit dem Rest der Aktion gerettet werden. Weiter gehen?"
in_hidden_state: als versteckt markiert
unresolved_dependency: "Der Wert, den Sie in die Abh\xC3\xA4ngigkeit Feld eingegeben nicht zu einer bestehenden Aktion zu l\xC3\xB6sen. Dieser Wert wird nicht mit dem Rest der Aktion gerettet werden. Weiter gehen?"
completed_last_x_days: In den letzten %{count} Tagen erledigt
show_today: Heute anzeigen
no_actions_found_title: Keine Aktionen gefunden
next_actions_due_date:
@ -418,49 +421,49 @@ de:
due_today: "Heute f\xC3\xA4llig"
overdue_by_plural: "\xC3\x9Cberf\xC3\xA4llig mit %{days} Tagen"
due_tomorrow: "F\xC3\xA4llig morgen"
completed_last_x_days: In den letzten %{count} Tagen erledigt
added_new_next_action_singular: Neue weiterf&uuml;hrende Aufgabe angelegt
no_actions_with: "Im Augenblick gibt es keine unvollst\xC3\xA4ndigen Aktionen mit dem Tag '%{tag_name}'"
defer_x_days:
one: "Einen Tag zur\xC3\xBCckstellen"
other: "%{count} Tage zur\xC3\xBCckstellen"
added_new_next_action_singular: Neue weiterf&uuml;hrende Aufgabe angelegt
no_completed_actions: Momentan sind keine erledigten Aufgaben vorhanden.
feeds:
completed: "Erledigt: %{date}"
due: "F&auuml;llig: %{date}"
deferred_pending_actions: Aufgeschobene/ausstehende Aufgaben
has_x_pending:
one: Hat eine ausstehende Aktion
other: Hat %{count} ausstehende Aktionen
recurring_todos: Wiederkehrende To-Dos
deferred_pending_actions: Aufgeschobene/ausstehende Aufgaben
delete_action: "Aktion l\xC3\xB6schen"
error_deleting_recurring: "Beim L\xC3\xB6schen der wiederkehrenden To-Do %{description} ist ein Fehler aufgetreten"
cannot_add_dependency_to_completed_todo: "Kann nicht hinzugef\xC3\xBCgt werden diese Aktion als eine Abh\xC3\xA4ngigkeit zu einer abgeschlossenen Aktion!"
recurring_todos: Wiederkehrende To-Dos
delete: "L\xC3\xB6schen"
drag_action_title: "Auf andere Aktion ziehen, um sie als Abh\xC3\xA4ngigkeit zu definieren"
cannot_add_dependency_to_completed_todo: "Kann nicht hinzugef\xC3\xBCgt werden diese Aktion als eine Abh\xC3\xA4ngigkeit zu einer abgeschlossenen Aktion!"
no_last_completed_actions: Keine abgeschlossene Aktionen gefunden
depends_on: "H\xC3\xA4ngt ab von"
tickler_items_due:
one: Ein Notizbuch-Eintrag ist nun f&auml;llig - lade die Seite neu, um sie zu sehen.
other: "%{count} Notizbuch-Eintr&auml;ge sind nun f&auml;llig - lade die Seite neu, um sie zu sehen."
action_marked_complete: Die Aktion <strong>'%{description}'</strong> wurde als <strong>%{completed}</strong> markiert.
new_related_todo_not_created_short: nicht schaffen todo
completed_today: Heute Fertiggestellt
added_new_next_action_plural: Neue weiterf&uuml;hrende Aufgaben angelegt
new_related_todo_not_created_short: nicht schaffen todo
completed_rest_of_week: Fertiggestellt den Rest dieser Woche
error_starring: Konnte die Hervorhebung von \'%{description}\' nicht durchf&uuml;hren
calendar:
get_in_ical_format: Diesen Kalender im iCal Format herunterladen
due_next_week: N&auml;chste Woche f&auml;llig
due_this_week: Die restliche Woche zu erledigen
no_actions_due_next_week: Keine Aufgaben f&uuml;r die kommende Woche
no_actions_due_today: Heute sind keine Aufgaben f&auml;llig
due_this_week: Die restliche Woche zu erledigen
due_today: Heute zu erledigen
no_actions_due_today: Heute sind keine Aufgaben f&auml;llig
due_next_month_and_later: Im %{month} und sp&auml;ter f&auml;llig
no_actions_due_after_this_month: Nach diesem Monat sind keine Aufgaben f&auml;llig
due_this_month: Im %{month} f&auml;llig
no_actions_due_this_month: Keine Aktionen f&uuml;r den Rest des Monats
show_tomorrow: Morgen anzeigen
action_deferred: Die Aktion \'% {description}\' wurde vertagt
recurrence:
ends_on_number_times: Endet nach %{number} Mal
ends_on_date: Endet am %{date}
@ -472,10 +475,7 @@ de:
daily_options: "Einstellungen f\xC3\xBCr sich t\xC3\xA4glich wiederholenden Aktionen"
monthly: Monatlich
starts_on: Beginnt am
show_option_always: immer
daily: "T\xC3\xA4glich"
pattern:
third: Drittel
month_names:
-
- Januar
@ -492,19 +492,18 @@ de:
- Oktober
- November
- Dezember
third: Drittel
every_n: jeden %{n}
on_day_n: am Tag %{n}
every_xth_day_of_every_n_months: "jedes %{x} %{day} jedes %{n_months} \xE2\x80\x8B"
second: zweite
on_day_n: am Tag %{n}
weekly: "w\xC3\xB6chentlich"
from: von
weekly: "w\xC3\xB6chentlich"
last: zuletzt
every_day: jeden Tag
the_xth_day_of_month: der %{x} %{day} von %{month}
times: "f\xC3\xBCr %{number} Zeiten"
on_work_days: an Wochentagen
the_xth_day_of_month: der %{x} %{day} von %{month}
first: erste
show: Show
day_names:
- Sonntag
- Montag
@ -513,70 +512,73 @@ de:
- Donnerstag
- Freitag
- Samstag
show: Show
on_work_days: an Wochentagen
every_year_on: jedes Jahr in %{date}
fourth: vierte
due: "F\xC3\xA4llig"
until: bis
every_month: jeden Monat
yearly_every_x_day: "Jeden %{day}. %{month} "
until: bis
show_option_always: immer
daily: "T\xC3\xA4glich"
recurrence_on_options: Setze Wiederholung auf
yearly_every_x_day: "Jeden %{day}. %{month} "
daily_every_number_day: Alle %{number} Tage
show_options: To-Do anzeigen
weekly_every_number_week: Kehrt jede %{number}. Woche wieder am
ends_on: Endet am
show_options: To-Do anzeigen
show_days_before: "%{days} Tage bevor die To-Do f\xC3\xA4llig ist"
from_tickler: the date todo comes from tickler (no due date set)
no_end_date: Kein Enddatum
day_x_on_every_x_month: Tag %{day} in jedem %{month}. Monat
yearly_every_xth_day: Den %{day} %{day_of_week} des %{month}
yearly_options: "Einstellungen f\xC3\xBCr sich j\xC3\xA4hrlich wiederholende Aktionen"
yearly: "J\xC3\xA4hrlich"
show_days_before: "%{days} Tage bevor die To-Do f\xC3\xA4llig ist"
from_tickler: the date todo comes from tickler (no due date set)
yearly_every_xth_day: Den %{day} %{day_of_week} des %{month}
monthly_every_xth_day: Der %{day} %{day_of_week} eines jeden %{month}. Monats
action_deferred: Die Aktion \'% {description}\' wurde vertagt
yearly: "J\xC3\xA4hrlich"
tagged_page_title: TRACKS::Als '%{tag_name}' markiert
no_completed_recurring: Im Augenblick gibt es keine abgeschlossenen wiederkehrenden To-Dos
added_dependency: "%{dependency} als Abh&auml;ngigkeit hinzugef&uuml;gt."
completed_rest_of_month: Fertiggestellt den Rest des Monats
no_deferred_actions: Zur Zeit sind keine zur&uuml;ckgestellten Aktionen vorhanden.
all_completed_tagged_page_title: "TRACKS:: Alle erledigten Aufgaben mit Tag %{tag_name}"
no_deferred_actions: Zur Zeit sind keine zur&uuml;ckgestellten Aktionen vorhanden.
completed_rest_of_month: Fertiggestellt den Rest des Monats
recurrence_completed: Nach dieser wiederkehrenden Aktion, die du gerade abgeschlossen hast, folgt keine mehr. Die Wiederholung endet hiermit
due: F&auml;llig
no_actions_found: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aktionen."
in_pending_state: und als ausstehend markiert
error_toggle_complete: "K\xC3\xB6nnte nicht diese Marke todo komplett"
due: F&auml;llig
action_marked_complete_error: Die Aktion <strong>'%{description}'</strong> wurde aufgrund eines Fehlers NICHT als <strong>%{completed}</strong> markiert.
recurring_action_saved: Wiederkehrende Aktion gespeichert
depends_on_separate_with_commas: H&auml;ngt ab von (Komma-separiert)
action_saved_to_tickler: Aktion im Notizbuch gespeichert
completed_in_archive:
one: Es befindet sich eine erledigte Aufgabe im Archiv.
other: Es befinden sich %{count} erledigte Aufgaben im Archiv.
overdue: "&Uuml;berf&auml;llig"
recurring_action_saved: Wiederkehrende Aktion gespeichert
action_saved_to_tickler: Aktion im Notizbuch gespeichert
to_tickler: ", im Notizbuch hinterlegt"
next_actions_description_additions:
completed: In den letzten %{count} Tagen
due_date: mit einem Datum %{due_date} oder fr&uuml;her
overdue: "&Uuml;berf&auml;llig"
add_new_recurring: "F\xC3\xBCge eine neue wiederkehrende Aktion hinzu"
no_incomplete_actions: Es gibt keine unerledigten Aufgaben
add_new_recurring: "F\xC3\xBCge eine neue wiederkehrende Aktion hinzu"
notes:
delete_confirmation: "Bist du sicher, dass du die Notiz '%{id}' l\xC3\xB6schen m\xC3\xB6chtest?"
delete_item_title: Eintrag l&ouml;schen
delete_note_title: Notiz '%{id}' l&ouml;schen
deleted_note: "Notiz '%{id}' l\xC3\xB6schen"
note_link_title: Notiz %{id} anzeigen
show_note_title: Notiz anzeigen
deleted_note: "Notiz '%{id}' l\xC3\xB6schen"
edit_item_title: Eintrag bearbeiten
note_location_link: "In:"
no_notes_available: "Derzeit gibt es keine Notizen: f\xC3\xBCge Notizen von der jeweiligen Projektseite hinzu."
note_header: Notiz %{id}
no_notes_available: "Derzeit gibt es keine Notizen: f\xC3\xBCge Notizen von der jeweiligen Projektseite hinzu."
delete_note_confirm: Soll die Notiz '%{id}' wirklich gel&ouml;scht werden?
states:
hidden_plural: Versteckte
completed: Erledigt
completed_plural: Erledigte
visible_plural: Sichtbare
active_plural: Aktive
visible: Sichtbar
active_plural: Aktive
active: Aktiv
hidden: Versteckt
time:
@ -589,81 +591,86 @@ de:
long: "%A, %d. %B %Y, %H:%M Uhr"
pm: nachmittags
projects:
deferred_actions: "Aufgeschobene Aufgaben f\xC3\xBCr dieses Projekt"
was_marked_hidden: wurde als verborgen markiert
edit_project_title: Projekt bearbeiten
default_tags_removed_notice: Standard-Tags entfernt
default_context_set: Standard-Kontext des Projekts auf %{default_context} gesetzt
no_actions_in_project: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aktionen in diesem Projekt"
deferred_actions: "Aufgeschobene Aufgaben f\xC3\xBCr dieses Projekt"
was_marked_hidden: wurde als verborgen markiert
all_completed_tasks_title: "TRACKS:: Alle auflisten Abgeschlossene Aktionen in Project '%{project_name}'"
page_title: "TRACKS::Projekt: %{project}"
hide_form: Fomular verstecken
no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verkn\xC3\xBCpft."
deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben f\xC3\xBCr dieses Projekt"
this_project: Dieses Projekt
show_form_title: Neues Projekt anlegen
project_state: Projekt ist %{state}
list_completed_projects: "TRACKS:: Liste Abgeschlossene Projekte"
to_new_project_page: Zu neuem Projekt weiterleiten
no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verkn\xC3\xBCpft."
this_project: Dieses Projekt
deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben f\xC3\xBCr dieses Projekt"
project_state: Projekt ist %{state}
no_last_completed_projects: Keine abgeschlossene Projekte gefunden
no_last_completed_recurring_todos: "Keine abgeschlossene sich wiederholende To-Dos gefunden"
todos_append: an dieses Projekt
no_last_completed_recurring_todos: Keine abgeschlossene sich wiederholende To-Dos gefunden
notes: Notizen
todos_append: an dieses Projekt
notes_empty: "Es gibt keine Notizen f\xC3\xBCr dieses Projekt"
no_projects: Keine Projekte vorhanden
hide_form_title: Formular verstecken
with_no_default_context: hat keinen Standardwert Kontext
delete_project: Projekt l&ouml;schen
completed_actions_empty: "Es gibt keine erledigten Aufgaben f\xC3\xBCr dieses Projekt"
delete_project_confirmation: Soll das Projekt '%{name}' wirklich gel&ouml;scht werden?
with_default_context: mit einem Standard-Rahmen von '%{context_name}'
with_no_default_context: hat keinen Standardwert Kontext
show_form: Projekt erstellen
actions_in_project_title: Die Aktionen in diesem Projekt
add_project: Projekt hinzuf&uuml;gen
delete_project_confirmation: Soll das Projekt '%{name}' wirklich gel&ouml;scht werden?
with_default_context: mit einem Standard-Rahmen von '%{context_name}'
completed_projects: Abgeschlossene Projekte
with_default_tags: und mit '%{tags}' als Standard-Tags
add_note: "Notiz hinzuf\xC3\xBCgen"
list_projects: TRACKS::Projektliste
set_default_tags_notice: Standard-Tags des Projekts auf %{default_tags} setzen
is_active: ist aktiv
settings: Einstellungen
project_saved_status: Projekt gespeichert
completed_projects: Abgeschlossene Projekte
completed_tasks_title: "TRACKS:: Liste Abgeschlossene Aktionen in Project '%{project_name}'"
is_active: ist aktiv
add_project: Projekt hinzuf&uuml;gen
settings: Einstellungen
add_note: "Notiz hinzuf\xC3\xBCgen"
delete_project_title: Projekt l&ouml;schen
completed_tasks_title: "TRACKS:: Liste Abgeschlossene Aktionen in Project '%{project_name}'"
hidden_projects: Versteckte Projekte
add_note_submit: "Notiz hinzuf\xC3\xBCgen"
was_marked_complete: wurde als erledigt markiert
completed_actions: "Erledigte Aufgaben f\xC3\xBCr dieses Projekt"
default_context_removed: Standard-Kontext entfernt
edit_project_settings: Edit Project Settings
active_projects: Aktive Projekte
default_context: Der Standard-Kontext dieses Projektes ist %{context}
status_project_name_changed: "Projektname ge\xC3\xA4ndert"
no_default_context: Dieses Projekt hat keinen Standard-Kontext
with_no_default_tags: und hat keinen Standardwert Tags
edit_project_settings: Edit Project Settings
default_context: Der Standard-Kontext dieses Projektes ist %{context}
status_project_name_changed: "Projektname ge\xC3\xA4ndert"
active_projects: Aktive Projekte
state: Dieses Projekt ist %{state}
errors:
user_unauthorized: "401 Unauthorized: Nur administrative Benutzer d\xC3\xBCrfen auf diese Funktion zugreifen."
preferences:
staleness_starts_after: Abgestandenheit startet nach %{days} Tagen
change_identity_url: "\xC3\x84ndere deine Identit\xC3\xA4ts-URL"
open_id_url: "Deine OpenID-URL lautet:"
staleness_starts_after: Abgestandenheit startet nach %{days} Tagen
change_password: "Passwort \xC3\xA4ndern"
page_title: TRACKS::Einstellungen
title: Deine Einstellungen
token_description: "Token (f\xC3\xBCr die Verwendung in Feeds und der API)"
is_false: Nein
show_number_completed: "Zeige %{number} erledigte Eintr\xC3\xA4ge"
is_false: Nein
page_title_edit: "TRACKS::Einstellungen \xC3\xA4ndern"
is_true: Ja
edit_preferences: Einstellungen bearbeiten
sms_context_none: Keine
generate_new_token: Neues Token generieren
token_header: Dein Token
authentication_header: Deine Authentifizierung
current_authentication_type: Dein Authentifizierungsart ist %{auth_type}
change_authentication_type: "Authentifzierungsart \xC3\xA4ndern"
authentication_header: Deine Authentifizierung
generate_new_token_confirm: "Bist du sicher? Wenn du ein neues Token generierst, wird dies das alte Token ersetzen und jegliche externe Nutzung st\xC3\xB6ren, die das alte Token verwendet."
tabs:
authentication: Authentication
tracks_behavior: Tracks Verhalten
profile: Profil
date_and_time: Datum und Uhrzeit
errors:
user_unauthorized: "401 Unauthorized: Nur administrative Benutzer d\xC3\xBCrfen auf diese Funktion zugreifen."
date:
month_names:
-
@ -681,10 +688,6 @@ de:
- Oktober
- November
- Dezember
order:
- :day
- :month
- :year
abbr_day_names:
- So
- Mo
@ -693,8 +696,13 @@ de:
- Do
- Fr
- Sa
order:
- :day
- :month
- :year
formats:
only_day: "%e"
longer: "%A, %d. %B %Y"
default: "%d.%m.%Y"
short: "%e. %b"
month_day: "%d. %B"
@ -725,19 +733,17 @@ de:
- Dez
support:
array:
last_word_connector: " und "
words_connector: ", "
last_word_connector: " und "
two_words_connector: " und "
select:
prompt: "Bitte w\xC3\xA4hlen Sie"
footer:
send_feedback: Senden Sie Feedback zu %{version}
shared:
multiple_next_actions: Mehrere neue Aufgaben (eine pro Zeile)
toggle_single: Weitere Aktion erstellen
hide_form: Formular verstecken
add_action: "Aufgabe hinzuf\xC3\xBCgen"
add_actions: "Aufgaben hinzuf\xC3\xBCgen"
add_action: "Aufgabe hinzuf\xC3\xBCgen"
tags_for_all_actions: "Tags f\xC3\xBCr alle Aufgaben (mit Kommas trennen)"
project_for_all_actions: "Projekt f\xC3\xBCr alle Aufgaben"
context_for_all_actions: "Kontext f\xC3\xBCr alle Aufgaben"
@ -746,6 +752,8 @@ de:
separate_tags_with_commas: mit Kommas trennen
toggle_multi_title: "Zwischen Einzel- und Mehrfachformular f\xC3\xBCr neue Aufgaben umschalten"
hide_action_form_title: "Formular f\xC3\xBCr neue Aufgaben verstecken"
footer:
send_feedback: Senden Sie Feedback zu %{version}
sidebar:
list_name_active_contexts: Aktive Kontexte
list_name_active_projects: Aktive Projekte
@ -754,71 +762,71 @@ de:
list_name_hidden_projects: Versteckte Projekte
list_name_hidden_contexts: Versteckte Kontexte
users:
auth_type_update_error: "Beim &Auml;ndern der Authentifizierung trat ein Fehler auf: %{error_messages}"
openid_url_verified: Die URL %{url} wurde erfolgreich als Identit&auml;t verifiziert und Deine Authentifizierung auf OpenID umgestellt.
destroy_successful: "Benutzer %{login} wurde erfolgreich gel\xC3\xB6scht"
total_contexts: Alle Kontexte
successfully_deleted_user: Benutzer %{username} erfolgreich gel&ouml;scht.
failed_to_delete_user: L&ouml;schen des Benutzers %{username} fehlgeschlagen
total_contexts: Alle Kontexte
first_user_heading: "Willkommen bei TRACKS. Als erstes legen Sie bitte einen Administrator-Zugang an:"
openid_url_verified: Die URL %{url} wurde erfolgreich als Identit&auml;t verifiziert und Deine Authentifizierung auf OpenID umgestellt.
auth_type_update_error: "Beim &Auml;ndern der Authentifizierung trat ein Fehler auf: %{error_messages}"
successfully_deleted_user: Benutzer %{username} erfolgreich gel&ouml;scht.
destroy_successful: "Benutzer %{login} wurde erfolgreich gel\xC3\xB6scht"
new_token_generated: Neuer Token erfolgreich generiert
total_projects: Alle Projekte
signup_successful: Benutzer %{username} erfolgreich angelegt.
user_created: Benutzer angelegt.
change_password_submit: "Passwort \xC3\xA4ndern"
no_signups_title: TRACKS::Anmeldung nicht erlaubt
user_created: Benutzer angelegt.
account_signup: Accounteinrichtung
manage_users: Benutzer verwalten
account_signup: Accounteinrichtung
password_updated: Passwort aktualisiert.
confirm_password: "Passwort best\xC3\xA4tigen"
signup: Registrieren
new_user_heading: "Einen neuen Benutzer anlegen:"
auth_type_updated: Authentifizierungs-Art erfolgreich ge&auml;ndert.
total_actions: Alle Aufgaben
signup: Registrieren
desired_login: "Gew\xC3\xBCnschter Benutzername"
confirm_password: "Passwort best\xC3\xA4tigen"
new_user_heading: "Einen neuen Benutzer anlegen:"
destroy_error: "Beim L\xC3\xB6schen des Benutzers %{login} ist ein Fehler aufgetreten."
choose_password: "Passwort w\xC3\xA4hlen"
change_password_title: TRACKS::Passwort &auml;ndern
change_auth_type_title: TRACKS::Authentifizierungstyp &auml;ndern
change_password_prompt: "Gib dein neues Passwort in die unten stehenden Felder ein und klicke auf 'Passwort \xC3\xA4ndern' um dein altes Passwort durch das neue zu ersetzen."
password_confirmation_label: "Passwort best\xC3\xA4tigen"
destroy_error: "Beim L\xC3\xB6schen des Benutzers %{login} ist ein Fehler aufgetreten."
label_auth_type: Authentifizierungsart
new_password_label: Neues Passwort
register_with_cas: Mit deinem CAS-Benutzernamen
new_user_title: TRACKS::Als Administrator anmelden
destroy_user: "Benutzer l\xC3\xB6schen"
total_users_count: Derzeit existieren %{count} Benutzer
destroy_confirmation: "Achtung: der Benutzer '%{login}' wird mit all seinen Aufgaben, Kontexten, Projekten und Notizen gel\xC3\xB6scht. Bist du sicher, dass du fortfahren m\xC3\xB6chtest?"
signup_new_user: Neuen Benutzer anlegen
destroy_confirmation: "Achtung: der Benutzer '%{login}' wird mit all seinen Aufgaben, Kontexten, Projekten und Notizen gel\xC3\xB6scht. Bist du sicher, dass du fortfahren m\xC3\xB6chtest?"
change_authentication_type: "Authentifizierungsart \xC3\xA4ndern"
openid_ok_pref_failed: Die URL %{url} wurde erfolgreich als Identit&auml;t verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf.
auth_change_submit: "Authentifizierungsart \xC3\xA4ndern"
identity_url: Identity-URL
change_authentication_type: "Authentifizierungsart \xC3\xA4ndern"
total_notes: Alle Notizen
select_authentication_type: "W\xC3\xA4hle deine neue Authentifizierungsart und klicke 'Authentifizierungsart \xC3\xA4ndern' an, um deine aktuellen Einstellungen zu \xC3\xBCberschreiben."
feedlist:
choose_context: "Kontext f\xC3\xBCr den Feed w\xC3\xA4hlen"
actions_due_today: "Heute oder fr\xC3\xBCher f\xC3\xA4llig"
choose_context: "Kontext f\xC3\xBCr den Feed w\xC3\xA4hlen"
rss_feed: RSS-Feed
legend: "Legende:"
ical_feed: iCal-Feed
all_contexts: Alle Kontexte
legend: "Legende:"
rss_feed: RSS-Feed
choose_project: "Projekt f\xC3\xBCr den Feed w\xC3\xA4hlen"
all_projects: Alle Projekte
project_needed: Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann.
select_feed_for_project: "Feed f\xC3\xBCr dieses Projekt ausw\xC3\xA4hlen"
active_projects_wo_next: Aktive Projekte ohne ausstehende Aufgaben
project_needed: Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann.
active_starred_actions: Alle markierten, aktiven Aufgaben
projects_and_actions: Aktive Projekte und deren Aufgaben
context_needed: Es muss mindestens ein Kontext existieren, bevor ein Feed abonniert werden kann.
select_feed_for_context: "Feed f\xC3\xBCr diesen Kontext ausw\xC3\xA4hlen"
notice_incomplete_only: "Hinweis: Alle Feeds zeigen nur Aufgaben, die noch nicht als erledigt markiert wurden."
projects_and_actions: Aktive Projekte und deren Aufgaben
actions_due_next_week: "In den n\xC3\xA4chsten 7 Tagen oder fr\xC3\xBCher f\xC3\xA4llige Aufgaben"
plain_text_feed: Plain-Text-Feed
notice_incomplete_only: "Hinweis: Alle Feeds zeigen nur Aufgaben, die noch nicht als erledigt markiert wurden."
last_fixed_number: Die letzten %{number} Aufgaben
all_actions: Alle Aufgaben
actions_completed_last_week: In den letzten 7 Tagen abgeschlossene Aufgaben
context_centric_actions: "Feeds f\xC3\xBCr unvollst\xC3\xA4ndige Aufgaben in einem bestimmten Kontext"
plain_text_feed: Plain-Text-Feed
project_centric: "Feeds f\xC3\xBCr unvollst\xC3\xA4ndige Aufgaben in einem bestimmten Kontext"
contexts:
delete_context_title: Kontext l&ouml;schen
@ -832,20 +840,20 @@ de:
no_contexts_active: Derzeit gibt es keine aktiven Kontexte
context_hide: Auf Startseite ausblenden?
hidden_contexts: Versteckte Kontexte
save_status_message: Kontext gespeichert
add_context: "Kontext hinzuf\xC3\xBCgen"
show_form: Neuen Kontext erstellen
visible_contexts: Sichtbare Kontexte
save_status_message: Kontext gespeichert
add_context: "Kontext hinzuf\xC3\xBCgen"
update_status_message: "Kontextname wurde ge\xC3\xA4ndert"
context_name: Kontextname
completed_tasks_title: "TRACKS:: Abgeschlossene Ma\xC3\x9Fnahmen im context '%{context_name}'"
new_context_post: "' wird ebenfalls angelegt. Fortfahren?"
status_active: Kontext ist aktiv
no_contexts_hidden: Derzeit gibt es keine versteckten Kontexte
new_context_pre: Der neue Kontext '
no_actions: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aufgaben in diesem Kontext"
last_completed_in_context: in diesem Kontext (letzte %{number})
context_deleted: "Gel\xC3\xB6schter Kontext '%{name}'"
no_contexts_hidden: Derzeit gibt es keine versteckten Kontexte
new_context_pre: Der neue Kontext '
status_hidden: Kontext ist versteckt
datetime:
prompts:
@ -860,12 +868,12 @@ de:
one: weniger als eine Minute
other: weniger als %{count} Minuten
zero: weniger als 1 Minute
almost_x_years:
one: fast 1 Jahr
other: fast %{count} Jahre
x_days:
one: 1 Tag
other: "%{count} Tage"
almost_x_years:
one: fast 1 Jahr
other: fast %{count} Jahre
x_seconds:
one: 1 Sekunde
other: "%{count} Sekunden"
@ -893,10 +901,10 @@ de:
other: mehr als %{count} Jahre
half_a_minute: eine halbe Minute
login:
login_cas: zum CAS gehen
openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identit\xC3\xA4ts-URL (%{identity_url})"
user_no_expiry: Angemeldet bleiben
login_cas: zum CAS gehen
sign_in: Anmeldung
openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identit\xC3\xA4ts-URL (%{identity_url})"
successful_with_session_info: "Anmeldung erfolgreich:"
please_login: Bitte melde dich an, um Tracks zu nutzen
cas_logged_in_greeting: Hallo, %{username}! Du bist authentifiziert.
@ -909,14 +917,14 @@ de:
account_login: Account-Anmeldung
session_will_not_expire: Sitzung wird nicht ablaufen.
successful: "Anmeldung erfolgreich. Willkommen zur\xC3\xBCck!"
option_separator: oder,
session_time_out: Sitzung abgelaufen. Bitte %{link}
session_will_expire: "Sitzung wird nach %{hours} Stunde(n) der Inaktivit\xC3\xA4t ablaufen."
option_separator: oder,
login_standard: "zur\xC3\xBCck zum Standard-Login"
logged_out: Sie wurden von Tracks abgemeldet.
login_with_openid: Mit einer OpenID anmelden
unsuccessful: Anmeldung war nicht erfolgreich.
log_in_again: Erneut anmelden.
logged_out: Sie wurden von Tracks abgemeldet.
search:
contexts_matching_query: Kontexte entsprechen der Suche
tags_matching_query: Tags entsprechen der Suche

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -85,7 +85,10 @@ ActionController::Routing::Routes.draw do |map|
i.google_gadget 'integrations/google_gadget.xml', :controller => 'integrations', :action => 'google_gadget', :format => 'xml'
end
map.preferences 'preferences', :controller => 'preferences', :action => 'index'
map.with_options :controller => :preferences do |p|
p.preferences 'preferences', :action => 'index'
p.preferences_date_format 'preferences/render_date_format', :action => 'render_date_format'
end
map.with_options :controller => :stats do |stats|
stats.stats 'stats', :action => 'index'

View file

@ -10,10 +10,33 @@ Feature: Manage preferences
And I have logged in as "testuser" with password "secret"
Scenario: I can change my password
Given this is a pending scenario
When I go to the preferences page
And I set the password and confirmation to "secret123"
When I log out of Tracks
And I go to the login page
And I submit the login form as user "testuser" with password "secret"
Then I should see "Login unsuccessful"
When I submit the login form as user "testuser" with password "secret123"
Then I should see "Login successful"
Scenario: I can leave password field empty and the password will not be changed
When I go to the preferences page
And I set the password and confirmation to ""
When I log out of Tracks
And I go to the login page
And I submit the login form as user "testuser" with password ""
Then I should see "Login unsuccessful"
When I submit the login form as user "testuser" with password "secret"
Then I should see "Login successful"
Scenario: The password and the confirmation need to be the same
When I go to the preferences page
And I set the password to "secret" and confirmation to "wrong"
Then I should see "Password doesn't match confirmation"
Scenario: I can generate a new token
Given this is a pending scenario
Scenario: I can edit preferences
Given this is a pending scenario
When I go to the preferences page
Then I should see "Logout (testuser)"
When I edit my last name to "Tester"
Then I should see "Logout (Tester)"

View file

@ -25,10 +25,14 @@ When /^my session expires$/ do
# use expire_session to force expiry of session
js = '$.ajax({type: "GET", url: "/login/expire_session", dataType: "script", async: false});'
selenium.run_script(js);
# force check of expiry bypassing timeout
js = '$.ajax({type: "GET", url: "/login/check_expiry", dataType: "script", async: false});'
selenium.run_script(js);
sleep(2)
end
When /^I log out of Tracks$/ do
When "I go to the logout page"
end

View file

@ -0,0 +1,15 @@
When /^I edit my last name to "([^"]*)"$/ do |last_name|
fill_in "user[last_name]", :with => last_name
click_button "prefs_submit"
end
When /^I set the password and confirmation to "([^"]*)"$/ do |new_password|
When "I set the password to \"#{new_password}\" and confirmation to \"#{new_password}\""
end
When /^I set the password to "([^"]*)" and confirmation to "([^"]*)"$/ do |new_password, new_password_confirmation|
fill_in "user[password]", :with => new_password
fill_in "user[password_confirmation]", :with => new_password_confirmation
click_button "prefs_submit"
end

View file

@ -2,7 +2,7 @@ Given /^the following user records?$/ do |table|
User.delete_all
table.hashes.each do |hash|
user = Factory(:user, hash)
user.create_preference
user.create_preference({:locale => 'en'})
end
end

View file

@ -55,6 +55,8 @@ module NavigationHelpers
signup_path(options)
when /the login page/
login_path(options)
when /the logout page/
logout_path(options)
when /the notes page/
notes_path(options)
when /the calendar page/

View file

@ -629,7 +629,7 @@ var ProjectItems = {
var UsersPage = {
setup_behavior: function() {
/* delete button to delete a usedr from the list */
/* delete button to delete a user from the list */
$('a.delete_user_button').live('click', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
@ -641,6 +641,47 @@ var UsersPage = {
}
}
var PreferencesPage = {
get_date_format: function(tag_name) {
var value = $('input[name="prefs['+tag_name+']"]').val();
var element = 'span[id="prefs.'+tag_name+'"]';
var url = 'preferences/render_date_format';
var param = "date_format="+encodeURIComponent( value );
generic_get_script_for_list(element, url, param);
},
setup_getter_for_date_format: function(tag_name) {
$('input[name="prefs['+tag_name+']"]').change(function() {
PreferencesPage.get_date_format(tag_name);
});
},
setup_behavior: function() {
$( "#tabs" ).tabs();
$( "button#prefs_submit" ).button();
$('input[name="user[auth_type]"]').change(function() {
var value = $('input[name="user[auth_type]"]:checked').val();
$('#open_id')[0].style.display = value == 'open_id' ? 'block' : 'none'
$('#database')[0].style.display = value == 'database' ? 'block' : 'none'
});
$('input[name="date_picker1"]').change(function() {
var value = $('input[name="date_picker1"]:checked').val();
$('input[name="prefs[date_format]"]').val(value);
PreferencesPage.get_date_format('date_format');
});
$('input[name="date_picker2"]').change(function() {
var value = $('input[name="date_picker2"]:checked').val();
$('input[name="prefs[title_date_format]"]').val(value);
PreferencesPage.get_date_format('title_date_format');
});
PreferencesPage.setup_getter_for_date_format('date_format');
PreferencesPage.setup_getter_for_date_format('title_date_format');
}
}
var ProjectListPage = {
update_state_count: function(state, count) {
$('#'+state+'-projects-count').html(count);
@ -1238,7 +1279,7 @@ $(document).ready(function() {
TodoItemsContainer.setup_container_toggles();
/* enable page specific behavior */
$([ 'IntegrationsPage', 'NotesPage', 'ProjectListPage', 'ContextListPage',
$([ 'PreferencesPage', 'IntegrationsPage', 'NotesPage', 'ProjectListPage', 'ContextListPage',
'FeedsPage', 'RecurringTodosPage', 'TodoItems', 'TracksPages',
'TracksForm', 'SearchPage', 'UsersPage' ]).each(function() {
eval(this+'.setup_behavior();');

View file

@ -1,33 +1,36 @@
/* @override http://0.0.0.0:3000/stylesheets/standard.css?1181841150 */
/* @override http://0.0.0.0:3000/stylesheets/standard.css?1180885851 */
div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
margin:0;
padding:0;
}
table {
border-collapse:collapse;
border-spacing:0;
}
fieldset,img {
fieldset,img {
border:0;
}
ol,ul {
list-style:none;
}
caption,th {
text-align:left;
}
h1,h2,h3,h4,h5,h6 {
font-size:100%;
font-weight:normal;
}
q:before,q:after {
content:'';
}
abbr,acronym { border:0;
abbr,acronym {
border:0;
}
body {
@ -54,7 +57,7 @@ a, a:link, a:active, a:visited {
a:hover {
color: #fff;
background-color: #cc3334;
}
}
h1 {
font-size: 304%;
@ -115,19 +118,6 @@ a.show_successors:hover, a.link_to_successors:hover {background-image: url(../im
padding-left: 5px;
}
body.preferences div#display_box {
margin-right:510px;
}
body.preferences div#input_box {
width:490px;
right:15px;
}
body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_context_id {
width: 250px;
}
#single_box {
width: 60%;
margin: 80px auto;
@ -145,6 +135,8 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
margin: 0px 15px 90px 15px;
}
/* recurring todos */
#recurring_timespan, #recurring_target {
border: none;
clear: both;
@ -206,10 +198,10 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
}
.recurring_container {
padding: 0px 5px 0px 5px;
padding: 0px 5px 0px 5px;
border: 1px solid #999;
margin: 0px 0px 0px 0px;
background: #fff;
background: #fff;
text-align: left;
}
@ -219,7 +211,7 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
text-align: center;
clear: both;
border: none;
}
}
/* Navigation links at the top */
@ -278,7 +270,7 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
padding-left: 15px;
margin-top: 15px;
margin-bottom: 5px;
white-space: nowrap; /* added 2006-05-17 for safari display, timfm */
white-space: nowrap; /* added 2006-05-17 for safari display, timfm */
}
#date h1 {
font-size: 152%;
@ -293,14 +285,14 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
}
.container {
padding: 0px 5px 0px 5px;
padding: 0px 5px 0px 5px;
border: 1px solid #999;
margin: 0px 0px 15px 0px;
background: #fff;
background: #fff;
}
.completed {
background: #eee;
background: #eee;
}
.container h2 {
@ -309,9 +301,9 @@ body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_conte
margin-top: 0px;
margin-left: -5px;
margin-right: -5px;
margin-bottom: 0px;
margin-bottom: 0px;
color: #666;
position:static;
position:static;
}
.container_toggle img {
@ -342,7 +334,7 @@ div#input_box {
#input_box h2 {
color: #999;
}
#input_box ul {list-style-type: circle; font-size: 0.9em;}
@ -410,7 +402,7 @@ div.item-container {
a.recurring_icon {
vertical-align: middle;
background-color: transparent;
background-color: transparent;
}
a.icon {
@ -454,11 +446,43 @@ input.item-checkbox {
padding: 0px;
}
a.footer_link {color: #cc3334; font-style: normal;}
a.footer_link:hover {color: #fff; background-color: #cc3334 !important;}
/* preferences */
body.preferences div#display_box {
margin-right:510px;
}
body.preferences div#input_box {
width:490px;
right:15px;
}
body.preferences select#prefs_time_zone, body.preferences select#prefs_sms_context_id {
width: 250px;
}
body.preferences div#footer {
margin-right:410px;
}
/* The notes which may be attached to an item */
/* override jquery css to match tracks defaults better */
body.preferences div.ui-widget {
font-size: 1em;
}
body.preferences div.ui-tabs li a {
padding: 0.1em 1em;
}
body.preferences div.pref_new_token a {
color: #CC3334;
}
/* The notes which may be attached to an item */
.todo_notes {
margin: 5px;
padding: 5px;
@ -538,13 +562,16 @@ div.add_note_link {
margin-top:12px;
float: right;
}
div#project_status > div {
padding: 10px;
}
#project_status span {
margin-right:5px;
background-color:white;
}
#project_status .active_state {
font-weight:bold;
}
@ -555,8 +582,6 @@ div#default_context > div{
div#default_tags > div{
padding:10px;
}
a.footer_link {color: #cc3334; font-style: normal;}
a.footer_link:hover {color: #fff; background-color: #cc3334 !important;}
/* Tag formatting */
@ -568,9 +593,9 @@ span.tag {
margin-right: 2px;
}
span.tag a,
span.tag a:link,
span.tag a:active,
span.tag a,
span.tag a:link,
span.tag a:active,
span.tag a:visited {
color: #000;
}
@ -599,16 +624,16 @@ h4.alert {
}
h4.warning {
border: 1px solid #ED2E38;
border: 1px solid #ED2E38;
background-color: #F6979C;
color: #000;
}
h4.error {
color:#fff;
color:#fff;
background:#c00;
}
h4.notice {
border: 1px solid #007E00;
border: 1px solid #007E00;
background-color: #c2ffc2;
color: #007E00;
}
@ -616,14 +641,14 @@ h4.notice {
/* *****/
.project_completed {
border: 1px solid #007E00;
border: 1px solid #007E00;
background-color: #c2ffc2;
padding: 5px;
color: #007E00;
text-align: center;
}
/* Draw attention to some text
/* Draw attention to some text
Same format as traffic lights */
.red {
color: #fff;
@ -671,7 +696,7 @@ Same format as traffic lights */
.highlight {
background: #ffC;
padding: 2px;
}
}
/* Backgrounds marking out 'staleness' of a task based on age of creation date
The colour of the background gets progressively yellower with age */
@ -809,6 +834,7 @@ div.project_settings {
font-size: 10px;
font-weight: normal;
}
#project-next-prev {
text-align:right;
}
@ -830,7 +856,7 @@ form {
/* expand form contents to fill the whole form */
.inline-form table,
.inline-form textarea#item_notes,
.inline-form textarea#item_notes,
.inline-form input#item_description {
width: 100%;
}
@ -839,6 +865,7 @@ form {
.inline-form table td.label {
width: 13ex;
}
#todo_new_action_container, #project_new_project_container, #context_new_container, #recurring_new_container {
background: #ddd;
width: 270px;
@ -855,8 +882,8 @@ form {
padding-top: 50px;
}
#todo_new_action_container input,
#todo_new_action_container textarea,
#todo_new_action_container input,
#todo_new_action_container textarea,
#project_new_project_container input,
#project_new_project_container textarea,
#context_new_container input {
@ -918,6 +945,7 @@ input#go_to_project, input#context_hide {
.hide_form {
text-align:right;
}
#todo-form-new-action label, .edit_todo_form label {
display: block;
padding-bottom: 3px;
@ -946,15 +974,15 @@ input, select, textarea {
}
.feed {
font-family: verdana, sans-serif;
font-size: 10px;
font-weight:bold;
text-decoration:none;
color: white;
background-color: #F60;
border:1px solid;
border-color: #FC9 #630 #330 #F96;
padding:0px 3px 0px 3px;
font-family: verdana, sans-serif;
font-size: 10px;
font-weight:bold;
text-decoration:none;
color: white;
background-color: #F60;
border:1px solid;
border-color: #FC9 #630 #330 #F96;
padding:0px 3px 0px 3px;
margin:0px;
}
@ -972,7 +1000,7 @@ input, select, textarea {
}
div.message {
margin: 5px 0px;
margin: 5px 0px;
background: #FAF4B5;
padding: 2px;
}
@ -1005,9 +1033,6 @@ div.message {
border: 4px dotted #999;
}
.context_target.hover {
}
/* Error message styles */
.fieldWithErrors {
padding: 2px;
@ -1045,7 +1070,7 @@ div.message {
list-style-type: disc;
list-style-position: inside;
margin-left:7px;
color: #333;
color: #333;
}
ul#prefs {list-style-type: disc; margin-left: 15px;}
@ -1054,21 +1079,26 @@ ul#prefs {list-style-type: disc; margin-left: 15px;}
margin-top:20px;
margin-bottom:10px;
}
#token_area .description{
#token_area .description{
font-weight:bold;
}
#token_area form {
width:100%;
text-align:center;
}
.prefscontainer .actions {
text-align:center;
margin-bottom:20px;
}
.authtype_container .actions {
margin-top:20px;
margin-bottom:20px;
margin-bottom:20px;
}
#feedlegend {
padding: 2px;
background-color: #D2D3D6;
@ -1076,39 +1106,48 @@ ul#prefs {list-style-type: disc; margin-left: 15px;}
padding: 5px 20px;
text-align: left;
}
#feedlegend h3, #feedlegend dl, #feedlegend dt, #feedlegend dd {
display: inline;
}
#feedlegend dt {
margin-left: 15px;
}
#feedlegend dd {
margin-left: 3px;
}
#feedlegend p {
margin-bottom: 0px;
}
#feeds img.rss-icon {
margin-bottom: -4px;
}
#feeds li {
font-size:13px;
font-family: "Lucida Grande", Verdana, Geneva, Arial, sans-serif;
}
#feeds li h4 {
margin-top: 12px;
margin-bottom: 4px;
font-weight: normal;
font-style:oblique;
}
input.open_id {
background: url(../images/open-id-login-bg.gif) no-repeat;
background-color: #fff;
background: url(../images/open-id-login-bg.gif) no-repeat;
background-color: #fff;
background-position: 0 50%;
color: #000;
padding-left: 18px;
width:182px;
}
div.page_name_auto_complete {
width: 100%;
background: #fff;
@ -1132,12 +1171,12 @@ div.page_name_auto_complete ul li {
color: #000;
}
div.page_name_auto_complete ul li.selected {
background-color: #ffb;
div.page_name_auto_complete ul li.selected {
background-color: #ffb;
}
div.page_name_auto_complete ul strong.highlight {
color: #800;
div.page_name_auto_complete ul strong.highlight {
color: #800;
margin: 0;
padding: 0;
}
@ -1160,7 +1199,7 @@ table.users_table {
table.export_table {
border: 1px solid #666;
background-color: #fff;
border-spacing: 0px;
border-spacing: 0px;
}
.export_table th {color: #fff; background-color: #000;}
@ -1177,7 +1216,7 @@ http://particletree.com/features/rediscovering-the-button-element/ */
border:1px solid #dedede;
border-top:1px solid #eee;
border-left:1px solid #eee;
font-family:"Lucida Grande", Verdana, Geneva, Arial, sans-serif;
font-size:80%;
line-height:100%;
@ -1280,24 +1319,28 @@ button.positive, .widgets a.positive{
background-position:center center;
background-color:black;
}
.stats_content .open-flash-chart, .stats_content .stats_module {
float: left;
width: 450px;
margin-right:20px;
padding-bottom:20px;
}
.stats_content h2
{
clear:both;
margin-top:15px;
margin-bottom:15px;
}
div.integrations h2 {
margin-top:40px;
padding-top:20px;
margin-bottom:10px;
border-top:1px solid #ccc;
}
div.integrations p, div.integrations li {
font-size:1.0em;
}
@ -1309,17 +1352,20 @@ div.integrations pre {
div.integrations li {
list-style-type: disc;
list-style-position: inside;
margin-left:30px;
margin-left:30px;
}
div.integrations textarea {
margin:10px;
padding:3px;
width:80%;
background-color:#ddd;
}
.defer-container {
float:right;
}
.defer-container a:hover {
background-color: inherit;
}
@ -1329,6 +1375,7 @@ div.auto_complete {
background: #fff;
color: #000;
}
div.auto_complete ul {
border:1px solid #888;
margin:0;
@ -1336,22 +1383,29 @@ div.auto_complete ul {
width:100%;
list-style-type:none;
}
div.auto_complete ul li {
font-size: 1.0em;
margin:0;
padding:3px;
list-style-type: none;
}
div.auto_complete ul li.selected {
background-color: #ffb;
font-weight:bold;
}
div.auto_complete ul strong.highlight {
color: #800;
margin:0;
padding:0;
}
.ui-datepicker {
z-index: 1000;
.ui-datepicker {
z-index: 1000;
}
.ui-autocomplete-loading {
background: white url('/images/ui-anim_basic_16x16.gif') right center no-repeat;
}
.ui-autocomplete-loading { background: white url('/images/ui-anim_basic_16x16.gif') right center no-repeat; }