From 338d4bb5a68b8c75f814183303c120dd19e98fae Mon Sep 17 00:00:00 2001 From: Marcus Ilgner Date: Sun, 16 Jan 2011 18:14:07 +0100 Subject: [PATCH] Added locale selection to preferences Mostly completed transition to full i18n Incorporated german translations by Ulf Klose --- app/controllers/application_controller.rb | 7 +- app/controllers/preferences_controller.rb | 4 +- app/controllers/projects_controller.rb | 11 +- app/controllers/todos_controller.rb | 58 +- app/controllers/users_controller.rb | 38 +- app/models/user.rb | 9 +- app/views/contexts/_context_listing.rhtml | 12 +- app/views/contexts/_context_state_group.rhtml | 4 +- .../{index.html.erb => index.en.html.erb} | 0 ...ml_form.html.erb => yaml_form.en.html.erb} | 0 .../{index.html.erb => index.en.html.erb} | 0 app/views/layouts/mobile.m.erb | 4 +- app/views/layouts/standard.html.erb | 8 +- app/views/preferences/edit.html.erb | 7 +- app/views/preferences/index.html.erb | 1 + app/views/projects/_project_listing.rhtml | 10 +- app/views/projects/_project_state_group.rhtml | 12 +- app/views/projects/index.html.erb | 16 +- app/views/todos/_completed.rhtml | 4 +- app/views/todos/_deferred.rhtml | 4 +- app/views/todos/_done.rhtml | 2 +- app/views/todos/_edit_form.rhtml | 30 +- app/views/todos/_edit_mobile.rhtml | 18 +- app/views/todos/_hidden.rhtml | 4 +- app/views/todos/_mobile_actions.rhtml | 2 +- app/views/todos/_successor.html.erb | 2 +- app/views/todos/_text_todo.rhtml | 4 +- app/views/todos/add_predecessor.js.rjs | 8 +- app/views/todos/calendar.html.erb | 22 +- app/views/todos/calendar.ics.erb | 2 +- app/views/todos/check_deferred.js.rjs | 2 +- app/views/todos/completed.html.erb | 10 +- app/views/todos/completed_archive.html.erb | 4 +- app/views/todos/create.js.rjs | 10 +- app/views/todos/create_multiple.js.rjs | 6 +- app/views/todos/destroy.js.rjs | 6 +- app/views/todos/error.js.rjs | 2 +- app/views/todos/list_deferred.html.erb | 2 +- app/views/todos/mobile_list_deferred.rhtml | 2 +- ...nosignup.html.erb => nosignup.en.html.erb} | 0 config/environment.rb | 2 + config/locales/de.yml | 716 ++++++++++++++++++ config/locales/en.yml | 206 ++++- ...20110104200112_add_locale_to_preference.rb | 9 + 44 files changed, 1071 insertions(+), 209 deletions(-) rename app/views/data/{index.html.erb => index.en.html.erb} (100%) rename app/views/data/{yaml_form.html.erb => yaml_form.en.html.erb} (100%) rename app/views/integrations/{index.html.erb => index.en.html.erb} (100%) rename app/views/users/{nosignup.html.erb => nosignup.en.html.erb} (100%) create mode 100644 config/locales/de.yml create mode 100644 db/migrate/20110104200112_add_locale_to_preference.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bfc99fe1..1fadd347 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -36,7 +36,7 @@ class ApplicationController < ActionController::Base before_filter :set_locale prepend_before_filter :login_required prepend_before_filter :enable_mobile_content_negotiation - after_filter :set_locale +# after_filter :set_locale after_filter :set_charset include ActionView::Helpers::TextHelper @@ -50,9 +50,10 @@ class ApplicationController < ActionController::Base end def set_locale - locale = params[:locale] + locale = params[:locale] # specifying a locale in the request takes precedence + locale = locale || prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over locale = locale || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE'] - I18n.locale = I18n::available_locales.include?(locale) ? locale : I18n.default_locale + I18n.locale = I18n::available_locales.include?(locale.to_sym) ? locale : I18n.default_locale logger.debug("Selected '#{I18n.locale}' as locale") end diff --git a/app/controllers/preferences_controller.rb b/app/controllers/preferences_controller.rb index 89935666..2777a8b4 100644 --- a/app/controllers/preferences_controller.rb +++ b/app/controllers/preferences_controller.rb @@ -1,12 +1,12 @@ class PreferencesController < ApplicationController def index - @page_title = "TRACKS::Preferences" + @page_title = t('preferences.page_title') @prefs = prefs end def edit - @page_title = "TRACKS::Edit Preferences" + @page_title = t('preferences.page_title_edit') end def update diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 374c874c..f672510f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -43,7 +43,7 @@ class ProjectsController < ApplicationController def show @max_completed = current_user.prefs.show_number_completed init_data_for_sidebar unless mobile? - @page_title = "TRACKS::Project: #{@project.name}" + @page_title = t('projects.page_title', :project => @project.name) @not_done = @project.not_done_todos_including_hidden @deferred = @project.deferred_todos @@ -204,7 +204,7 @@ class ProjectsController < ApplicationController def render_projects_html lambda do - @page_title = "TRACKS::List Projects" + @page_title = t('projects.list_projects') @count = current_user.projects.size @active_projects = current_user.projects.active @hidden_projects = current_user.projects.hidden @@ -230,10 +230,9 @@ class ProjectsController < ApplicationController def render_project_mobile lambda do if @project.default_context.nil? - @project_default_context = "This project does not have a default context" + @project_default_context = t('projects.no_default_context') else - @project_default_context = "The default context for this project is "+ - @project.default_context.name + @project_default_context = t('projects.default_context', :context => @project.default_context.name) end cookies[:mobile_url]= {:value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']} @mobile_from_project = @project.id @@ -293,7 +292,7 @@ class ProjectsController < ApplicationController project_description = '' project_description += sanitize(markdown( project.description )) unless project.description.blank? project_description += "

#{count_undone_todos_phrase(p)}. " - project_description += "Project is #{project.state}." + project_description += t('projects.project_state', :state => project.state) project_description += "

" project_description end diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 06a7d181..a7766cce 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -173,7 +173,7 @@ class TodosController < ApplicationController if @todos.size > 0 @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil? else - @multiple_error = "You need to submit at least one next action" + @multiple_error = t('todos.next_action_needed') @saved = false; @default_tags = current_user.projects.find_by_name(@initial_project_name).default_tags unless @initial_project_name.blank? end @@ -277,10 +277,10 @@ class TodosController < ApplicationController format.html do if @saved # TODO: I think this will work, but can't figure out how to test it - notify :notice, "The action '#{@todo.description}' was marked as #{@todo.completed? ? 'complete' : 'incomplete' }" + notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete')) redirect_to :action => "index" else - notify :notice, "The action '#{@todo.description}' was NOT marked as #{@todo.completed? ? 'complete' : 'incomplete' } due to an error on the server.", "index" + notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index") redirect_to :action => "index" end end @@ -304,7 +304,7 @@ class TodosController < ApplicationController @saved = @todo.save @context_changed = true - @message = "Context changed to #{@context.name}" + @message = t('todos.context_changed', :name => @context.name) determine_remaining_in_context_count(@original_item_context_id) respond_to do |format| @@ -476,14 +476,14 @@ class TodosController < ApplicationController format.html do if @saved - message = "Successfully deleted next action" + message = t('todos.action_deleted_success') if activated_successor_count > 0 message += " activated #{pluralize(activated_successor_count, 'pending action')}" end notify :notice, message, 2.0 redirect_to :action => 'index' else - notify :error, "Failed to delete the action", 2.0 + notify :error, t('todos.action_deleted_error'), 2.0 redirect_to :action => 'index' end end @@ -507,7 +507,7 @@ class TodosController < ApplicationController end def completed - @page_title = "TRACKS::Completed tasks" + @page_title = t('todos.completed_tasks_title') @done = current_user.completed_todos @done_today = @done.completed_within Time.zone.now - 1.day @done_this_week = @done.completed_within Time.zone.now - 1.week @@ -516,7 +516,7 @@ class TodosController < ApplicationController end def completed_archive - @page_title = "TRACKS::Archived completed tasks" + @page_title = t('todos.archived_tasks_title') @done = current_user.completed_todos @count = @done.size @done_archive = @done.completed_more_than Time.zone.now - 28.days @@ -524,7 +524,7 @@ class TodosController < ApplicationController def list_deferred @source_view = 'deferred' - @page_title = "TRACKS::Tickler" + @page_title = t('todos.deferred_tasks_title') @contexts_to_show = @contexts = current_user.contexts.find(:all) @@ -561,7 +561,7 @@ class TodosController < ApplicationController def tag @source_view = params['_source_view'] || 'tag' @tag_name = params[:name] - @page_title = "TRACKS::Tagged with \'#{@tag_name}\'" + @page_title = t('todos.tagged_page_title', :tag_name => @tag_name) # mobile tags are routed with :name ending on .m. So we need to chomp it @tag_name = @tag_name.chomp('.m') if mobile? @@ -645,7 +645,7 @@ class TodosController < ApplicationController def calendar @source_view = params['_source_view'] || 'calendar' - @page_title = "TRACKS::Calendar" + @page_title = t('todos.calendar_page_title') @projects = current_user.projects.find(:all) @@ -778,24 +778,24 @@ class TodosController < ApplicationController condition_builder.add 'todos.state = ?', 'active' end - @title = "Tracks - Next Actions" - @description = "Filter: " + @title = t('todos.next_actions_title') + @description = t('todos.next_actions_description') if params.key?('due') due_within = params['due'].to_i due_within_when = Time.zone.now + due_within.days condition_builder.add('todos.due <= ?', due_within_when) due_within_date_s = due_within_when.strftime("%Y-%m-%d") - @title << " due today" if (due_within == 0) - @title << " due within a week" if (due_within == 6) - @description << " with a due date #{due_within_date_s} or earlier" + @title << t('todos.next_actions_title_additions.due_today') if (due_within == 0) + @title << t('todos.next_actions_title_additions.due_within_a_week') if (due_within == 6) + @description << t('todos.next_actions_description_additions.due_date', :due_date => due_within_date_s) end if params.key?('done') done_in_last = params['done'].to_i condition_builder.add('todos.completed_at >= ?', Time.zone.now - done_in_last.days) - @title << " actions completed" - @description << " in the last #{done_in_last.to_s} days" + @title << t('todos.next_actions_title_additions.completed') + @description << t('todos.next_actions_description_additions.completed', :count => done_in_last.to_s) end if params.key?('tag') @@ -813,16 +813,16 @@ class TodosController < ApplicationController end def with_parent_resource_scope(&block) - @feed_title = "Actions " + @feed_title = t('todos.feed_title') if (params[:context_id]) @context = current_user.contexts.find_by_params(params) - @feed_title = @feed_title + "in context '#{@context.name}'" + @feed_title = @feed_title + t('todos.feed_title_in_context', :context => @context.name) Todo.send :with_scope, :find => {:conditions => ['todos.context_id = ?', @context.id]} do yield end elsif (params[:project_id]) @project = current_user.projects.find_by_params(params) - @feed_title = @feed_title + "in project '#{@project.name}'" + @feed_title = @feed_title + t('todos.feed_title_in_project', :project => @project.name) @project_feed = true Todo.send :with_scope, :find => {:conditions => ['todos.project_id = ?', @project.id]} do yield @@ -839,9 +839,9 @@ class TodosController < ApplicationController end if TodosController.is_feed_request(request) && @description if params.key?('limit') - @description << "Lists the last #{params['limit']} incomplete next actions" + @description << t('todos.list_incomplete_next_actions_with_limit', :count => params['limit']) else - @description << "Lists incomplete next actions" + @description << t('todos.list_incomplete_next_actions') end end else @@ -971,7 +971,7 @@ class TodosController < ApplicationController def render_todos_html lambda do - @page_title = "TRACKS::List tasks" + @page_title = t('todos.task_list_title') # If you've set no_completed to zero, the completed items box isn't shown # on the home page @@ -996,7 +996,7 @@ class TodosController < ApplicationController def render_todos_mobile lambda do - @page_title = "All actions" + @page_title = t('todos.mobile_todos_page_title') @home = true cookies[:mobile_url]= { :value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']} determine_down_count @@ -1026,15 +1026,15 @@ class TodosController < ApplicationController def todo_feed_content lambda do |i| item_notes = sanitize(markdown( i.notes )) if i.notes? - due = "
Due: #{format_date(i.due)}
\n" if i.due? - done = "
Completed: #{format_date(i.completed_at)}
\n" if i.completed? + due = "
#{t('todos.feeds.due', :date => format_date(i.due))}
\n" if i.due? + done = "
#{t('todos.feeds.completed', :date => format_date(i.completed_at))}
\n" if i.completed? context_link = "#{ i.context.name }" if i.project_id? project_link = "#{ i.project.name }" else - project_link = "none" + project_link = "#{t('common.none')}" end - "#{done||''}#{due||''}#{item_notes||''}\n
Project: #{project_link}
\n
Context: #{context_link}
" + "#{done||''}#{due||''}#{item_notes||''}\n
#{t('common.project')}: #{project_link}
\n
#{t('common.context')}: #{context_link}
" end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1198837f..b4003c36 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -35,15 +35,15 @@ class UsersController < ApplicationController end if User.no_users_yet? - @page_title = "TRACKS::Sign up as the admin user" - @heading = "Welcome to TRACKS. To get started, please create an admin account:" + @page_title = t('users.new_user_title') + @heading = t('users.first_user_heading') @user = get_new_user elsif (@user && @user.is_admin?) || SITE_CONFIG['open_signups'] - @page_title = "TRACKS::Sign up a new user" - @heading = "Sign up a new user:" + @page_title = t('users.new_user_title') + @heading = t('users.new_user_heading') @user = get_new_user else # all other situations (i.e. a non-admin is logged in, or no one is logged in, but we have some users) - @page_title = "TRACKS::No signups" + @page_title = t('users.no_signups_title') @admin_email = User.find_admin.preference.admin_email render :action => "nosignup", :layout => "login" return @@ -66,7 +66,7 @@ class UsersController < ApplicationController respond_to do |format| format.html do unless User.no_users_yet? || (@user && @user.is_admin?) || SITE_CONFIG['open_signups'] - @page_title = "No signups" + @page_title = t('users.no_signups_title') @admin_email = User.find_admin.preference.admin_email render :action => "nosignup", :layout => "login" return @@ -98,10 +98,10 @@ class UsersController < ApplicationController user.is_admin = true if first_user_signing_up if user.save @user = User.authenticate(user.login, params['user']['password']) - @user.create_preference + @user.create_preference({:locale => I18n.locale}) @user.save session['user_id'] = @user.id if first_user_signing_up - notify :notice, "Signup successful for user #{@user.login}." + notify :notice, t('users.signup_successful', :username => @user.login) redirect_back_or_home end return @@ -121,7 +121,7 @@ class UsersController < ApplicationController end user.password_confirmation = params[:request][:password] if user.save - render :text => "User created.", :status => 200 + render :text => t('users.user_created'), :status => 200 else render_failure user.errors.to_xml end @@ -139,9 +139,9 @@ class UsersController < ApplicationController respond_to do |format| format.html do if @saved - notify :notice, "Successfully deleted user #{@deleted_user.login}", 2.0 + notify :notice, t('users.successfully_deleted_user', :username => @deleted_user.login), 2.0 else - notify :error, "Failed to delete user #{@deleted_user.login}", 2.0 + notify :error, t('users.failed_to_delete_user', :username => @deleted_user.login), 2.0 end redirect_to users_url end @@ -152,12 +152,12 @@ class UsersController < ApplicationController def change_password - @page_title = "TRACKS::Change password" + @page_title = t('users.change_password_title') end def update_password @user.change_password(params[:updateuser][:password], params[:updateuser][:password_confirmation]) - notify :notice, "Password updated." + notify :notice, t('users.password_updated') redirect_to preferences_path rescue Exception => error notify :error, error.message @@ -165,7 +165,7 @@ class UsersController < ApplicationController end def change_auth_type - @page_title = "TRACKS::Change authentication type" + @page_title = t('users.change_auth_type_title') end def update_auth_type @@ -177,10 +177,10 @@ class UsersController < ApplicationController @user.auth_type = 'open_id' @user.open_id_url = identity_url if @user.save - notify :notice, "You have successfully verified #{identity_url} as your identity and set your authentication type to Open ID." + notify :notice, t('users.openid_url_verified', :url => identity_url) else debugger - notify :warning, "You have successfully verified #{identity_url} as your identity but there was a problem saving your authentication preferences." + notify :warning, t('users.openid_ok_pref_failed', :url => identity_url) end redirect_to preferences_path else @@ -192,10 +192,10 @@ class UsersController < ApplicationController end @user.auth_type = params[:user][:auth_type] if @user.save - notify :notice, "Authentication type updated." + notify :notice, t('users.auth_type_updated') redirect_to preferences_path else - notify :warning, "There was a problem updating your authentication type: #{ @user.errors.full_messages.join(', ')}" + notify :warning, t('users.auth_type_update_error', :error_messages => @user.errors.full_messages.join(', ')) redirect_to :action => 'change_auth_type' end end @@ -203,7 +203,7 @@ class UsersController < ApplicationController def refresh_token @user.generate_token @user.save! - notify :notice, "New token successfully generated" + notify :notice, t('users.new_token_generated') redirect_to preferences_path end diff --git a/app/models/user.rb b/app/models/user.rb index c5dbb910..8573645d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,6 +3,7 @@ require 'digest/sha1' class User < ActiveRecord::Base # Virtual attribute for the unencrypted password attr_accessor :password + attr_protected :is_admin # don't allow mass-assignment for this has_many :contexts, :order => 'position ASC', @@ -11,11 +12,11 @@ class User < ActiveRecord::Base find(params['id'] || params['context_id']) || nil end def update_positions(context_ids) - context_ids.each_with_index do |id, position| + context_ids.each_with_index {|id, position| context = self.detect { |c| c.id == id.to_i } raise I18n.t('models.user.error_context_not_associated', :context => id, :user => @user.id) if context.nil? context.update_attribute(:position, position + 1) - end + } end end has_many :projects, @@ -25,11 +26,11 @@ class User < ActiveRecord::Base find(params['id'] || params['project_id']) end def update_positions(project_ids) - project_ids.each_with_index do |id, position| + project_ids.each_with_index {|id, position| project = self.detect { |p| p.id == id.to_i } raise I18n.t('models.user.error_project_not_associated', :project => id, :user => @user.id) if project.nil? project.update_attribute(:position, position + 1) - end + } end def projects_in_state_by_position(state) self.sort{ |a,b| a.position <=> b.position }.select{ |p| p.state == state } diff --git a/app/views/contexts/_context_listing.rhtml b/app/views/contexts/_context_listing.rhtml index 725cd633..7a2416b5 100644 --- a/app/views/contexts/_context_listing.rhtml +++ b/app/views/contexts/_context_listing.rhtml @@ -6,7 +6,7 @@
<% unless suppress_drag_handle -%>
- DRAG + <%= t('common.drag_handle') %>
<% end -%>
@@ -15,22 +15,22 @@
<% if context.hide? %> - HIDDEN + <%= t('states.hidden') %> <% else %> - VISIBLE + <%= t('states.visible') %> <% end %> <%= link_to_remote( - image_tag( "blank.png", :title => "Delete context", :class=>"delete_item"), + image_tag( "blank.png", :title => t('contexts.delete_context'), :class=>"delete_item"), :url => {:controller => 'contexts', :action => 'destroy', :id => context.id}, :method => 'delete', :with => "'_source_view=#{@source_view}'", :before => "$('#{dom_id(context)}').block({message:null});", :complete => "$('#{dom_id(context)}').unblock();", - :confirm => "Are you sure that you want to delete the context '#{context.name}'? Be aware that this will also delete all (repeating) actions in this context!", + :confirm => t('contexts.delete_context_confirmation', :name => context.name), :html => { :id => dom_id(context, 'delete') } ) %> <%= link_to_remote( - image_tag( "blank.png", :title => "Edit context", :class=>"edit_item"), + image_tag( "blank.png", :title => t('contexts.edit_context'), :class=>"edit_item"), :url => {:controller => 'contexts', :action => 'edit', :id => context.id}, :method => 'get', :with => "'_source_view=#{@source_view}'", diff --git a/app/views/contexts/_context_state_group.rhtml b/app/views/contexts/_context_state_group.rhtml index 3beb3d7b..30b41271 100644 --- a/app/views/contexts/_context_state_group.rhtml +++ b/app/views/contexts/_context_state_group.rhtml @@ -1,7 +1,7 @@
-

<%= context_state_group.length %><%= state.titlecase %> <%= t('common.contexts') %>

+

<%= context_state_group.length %><%= t('states.'+ state +'_plural')%> <%= t('common.contexts') %>

-

<%= t('contexts.no_contexts', :state => state) %>

+

<%= t('contexts.no_contexts_' + state) %>

<%= render :partial => 'context_listing', :collection => context_state_group %> diff --git a/app/views/data/index.html.erb b/app/views/data/index.en.html.erb similarity index 100% rename from app/views/data/index.html.erb rename to app/views/data/index.en.html.erb diff --git a/app/views/data/yaml_form.html.erb b/app/views/data/yaml_form.en.html.erb similarity index 100% rename from app/views/data/yaml_form.html.erb rename to app/views/data/yaml_form.en.html.erb diff --git a/app/views/integrations/index.html.erb b/app/views/integrations/index.en.html.erb similarity index 100% rename from app/views/integrations/index.html.erb rename to app/views/integrations/index.en.html.erb diff --git a/app/views/layouts/mobile.m.erb b/app/views/layouts/mobile.m.erb index 68c61a61..7baa39c7 100644 --- a/app/views/layouts/mobile.m.erb +++ b/app/views/layouts/mobile.m.erb @@ -13,8 +13,8 @@ <% if !(@new_mobile || @edit_mobile) if !@prefs.nil? -%> -

<%= @down_count %> <%= - current_user.time.strftime(@prefs.title_date_format) -%>

+

<%= @down_count %> <%= + l(Date.today, :format => @prefs.title_date_format) -%>

-

Completed in last 7 days

+

<%= t('todos.completed_last_x_days', :count => 7) %>

<%= render :partial => "done", :collection => @done_this_week %>
-

Completed in the last 28 days

+

<%= t('todos.completed_last_x_days', :count => 28) %>

<%= render :partial => "done", :collection => @done_this_month %>
-

Older completed items: <%= link_to( "Older than 31 days", done_archive_path ) %>

+

<%= t('todos.older_completed_items') %>: <%= link_to( t('todos.older_than_days', :count => 31), done_archive_path ) %>

diff --git a/app/views/todos/completed_archive.html.erb b/app/views/todos/completed_archive.html.erb index 95fa8110..c3f87bba 100644 --- a/app/views/todos/completed_archive.html.erb +++ b/app/views/todos/completed_archive.html.erb @@ -1,8 +1,8 @@
-

There <%= @done_archive.length == 1 ? 'is' : 'are' %> <%= pluralize @done_archive.length, 'completed action' %> in the archive.

+

<%= t('todos.completed_in_archive', :count => @done_archive.length) %>

-

Completed more than 31 days ago

+

<%= t('todos.completed_more_than_x_days_ago', :count => 31) %>

<%= render :partial => "done", :collection => @done_archive %>
diff --git a/app/views/todos/create.js.rjs b/app/views/todos/create.js.rjs index 597ba418..2423105e 100644 --- a/app/views/todos/create.js.rjs +++ b/app/views/todos/create.js.rjs @@ -1,10 +1,10 @@ if @saved page.hide 'status' - status_message = 'Added new next action' - status_message += ' to tickler' if @todo.deferred? - status_message += ' in pending state' if @todo.pending? - status_message = 'Added new project / ' + status_message if @new_project_created - status_message = 'Added new context / ' + status_message if @new_context_created + status_message = t('todos.added_new_next_action') + status_message += t('todos.to_tickler') if @todo.deferred? + status_message += t('todos.in_pending_state') if @todo.pending? + status_message = t('todos.added_new_project') + ' / ' + status_message if @new_project_created + status_message = t('todos.added_new_context') + ' / ' + status_message if @new_context_created page.notify :notice, status_message, 5.0 page['badge_count'].replace_html @down_count page.send :record, "$('#todo-form-new-action').clearForm();$('#todo-form-new-action input:text:first').focus();" diff --git a/app/views/todos/create_multiple.js.rjs b/app/views/todos/create_multiple.js.rjs index 46146a9c..3e6c2fc3 100644 --- a/app/views/todos/create_multiple.js.rjs +++ b/app/views/todos/create_multiple.js.rjs @@ -1,10 +1,10 @@ if @saved page.hide 'multiple_status' - status_message = 'Added new next action' + status_message = t('todos.added_new_next_action') status_message += 's' if @todos.size > 1 - status_message = 'Added new project / ' + status_message if @new_project_created - status_message = 'Added new context / ' + status_message if @new_context_created + status_message = t('todos.added_new_project') + ' / ' + status_message if @new_project_created + status_message = t('todos.added_new_context') + ' / ' + status_message if @new_context_created page.notify :notice, status_message, 5.0 page['badge_count'].replace_html @down_count diff --git a/app/views/todos/destroy.js.rjs b/app/views/todos/destroy.js.rjs index f4e19622..2468a53e 100644 --- a/app/views/todos/destroy.js.rjs +++ b/app/views/todos/destroy.js.rjs @@ -16,10 +16,10 @@ if @saved page.call "todoItems.ensureVisibleWithEffectAppear", item_container_id(@new_recurring_todo) page.insert_html :bottom, item_container_id(@new_recurring_todo), :partial => 'todos/todo', :locals => { :todo => @new_recurring_todo, :parent_container_type => parent_container_type } page.visual_effect :highlight, dom_id(@new_recurring_todo, 'line'), {'startcolor' => "'#99ff99'"} - page.notify :notice, "Action was deleted. Because this action is recurring, a new action was added", 6.0 + page.notify :notice, t('todos.recurring_action_deleted'), 6.0 else if @todo.recurring_todo.todos.active.count == 0 - page.notify :notice, "There is no next action after the recurring action you just deleted. The recurrence is completed", 6.0 if @new_recurring_todo.nil? + page.notify :notice, t('todos.completed_recurrence_completed'), 6.0 if @new_recurring_todo.nil? end end end @@ -32,5 +32,5 @@ if @saved page.visual_effect :highlight, dom_id(t, 'line'), {'startcolor' => "'#99ff99'", :duration => 2} end else - page.notify :error, "There was an error deleting the item #{@todo.description}", 8.0 + page.notify :error, t('todos.error_deleting_item', :description => @todo.description), 8.0 end diff --git a/app/views/todos/error.js.rjs b/app/views/todos/error.js.rjs index 4f82b3e4..b300ea67 100644 --- a/app/views/todos/error.js.rjs +++ b/app/views/todos/error.js.rjs @@ -1 +1 @@ -page.notify :error, @error_message || "An error occurred on the server.", 8.0 \ No newline at end of file +page.notify :error, @error_message || t('common.server_error'), 8.0 \ No newline at end of file diff --git a/app/views/todos/list_deferred.html.erb b/app/views/todos/list_deferred.html.erb index 039aa7c8..5e0b27dc 100644 --- a/app/views/todos/list_deferred.html.erb +++ b/app/views/todos/list_deferred.html.erb @@ -1,7 +1,7 @@
-

Currently there are no deferred actions.

+

<%= t('todos.no_deferred_actions') %>

<%= render :partial => "contexts/context", :collection => @contexts, diff --git a/app/views/todos/mobile_list_deferred.rhtml b/app/views/todos/mobile_list_deferred.rhtml index 4c04a2e3..dd02c9b4 100644 --- a/app/views/todos/mobile_list_deferred.rhtml +++ b/app/views/todos/mobile_list_deferred.rhtml @@ -1,5 +1,5 @@ <% if @count == 0 -%> -

Currently there are no deferred actions.

+

<%= t('todos.no_deferred_actions') %>

<% end -%> <%= render :partial => "contexts/mobile_context", :collection => @contexts, :locals => { :collapsible => true } -%> \ No newline at end of file diff --git a/app/views/users/nosignup.html.erb b/app/views/users/nosignup.en.html.erb similarity index 100% rename from app/views/users/nosignup.html.erb rename to app/views/users/nosignup.en.html.erb diff --git a/config/environment.rb b/config/environment.rb index 55352f15..4861587d 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -14,6 +14,8 @@ class Rails::Configuration attr_accessor :action_web_service end +Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > "1.9" + Rails::Initializer.run do |config| # Skip frameworks you're not going to use # config.frameworks -= [ :action_web_service, :action_mailer ] diff --git a/config/locales/de.yml b/config/locales/de.yml new file mode 100644 index 00000000..091714dc --- /dev/null +++ b/config/locales/de.yml @@ -0,0 +1,716 @@ +de: + date: + formats: + default: "%d.%m.%Y" + short: "%e. %b" + long: "%e. %B %Y" + only_day: "%e" + day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag] + abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa] + month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember] + abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez] + order: [ :day, :month, :year ] + time: + formats: + default: "%A, %d. %B %Y, %H:%M Uhr" + short: "%d. %B, %H:%M Uhr" + long: "%A, %d. %B %Y, %H:%M Uhr" + time: "%H:%M" + am: "vormittags" + pm: "nachmittags" + datetime: + distance_in_words: + half_a_minute: 'eine halbe Minute' + less_than_x_seconds: + zero: 'weniger als 1 Sekunde' + one: 'weniger als 1 Sekunde' + other: 'weniger als {{count}} Sekunden' + x_seconds: + one: '1 Sekunde' + other: '{{count}} Sekunden' + less_than_x_minutes: + zero: 'weniger als 1 Minute' + one: 'weniger als eine Minute' + other: 'weniger als {{count}} Minuten' + x_minutes: + one: '1 Minute' + other: '{{count}} Minuten' + about_x_hours: + one: 'etwa 1 Stunde' + other: 'etwa {{count}} Stunden' + x_days: + one: '1 Tag' + other: '{{count}} Tage' + about_x_months: + one: 'etwa 1 Monat' + other: 'etwa {{count}} Monate' + x_months: + one: '1 Monat' + other: '{{count}} Monate' + about_x_years: + one: 'etwa 1 Jahr' + other: 'etwa {{count}} Jahre' + over_x_years: + one: 'mehr als 1 Jahr' + other: 'mehr als {{count}} Jahre' + prompts: + second: "Sekunden" + minute: "Minuten" + hour: "Stunden" + day: "Tag" + month: "Monat" + year: "Jahr" + number: + format: + precision: 2 + separator: ',' + delimiter: '.' + currency: + format: + unit: '€' + format: '%n%u' + separator: + delimiter: + precision: + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 1 + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + support: + array: + words_connector: ", " + two_words_connector: " und " + last_word_connector: " und " + activerecord: + errors: + template: + header: + one: "Konnte dieses {{model}} Objekt nicht speichern: 1 Fehler." + other: "Konnte dieses {{model}} Objekt nicht speichern: {{count}} Fehler." + body: "Bitte überprüfen Sie die folgenden Felder:" + models: + project: + attributes: + name: + blank: "Projekt muss einen Namen haben" + too_long: "Projektname muss weniger als 256 Zeichen haben" + taken: "existiert bereits" + messages: + inclusion: "ist kein gültiger Wert" + exclusion: "ist nicht verfügbar" + invalid: "ist nicht gültig" + confirmation: "stimmt nicht mit der Bestätigung überein" + accepted: "muss akzeptiert werden" + empty: "muss ausgefüllt werden" + blank: "muss ausgefüllt werden" + too_long: "ist zu lang (nicht mehr als {{count}} Zeichen)" + too_short: "ist zu kurz (nicht weniger als {{count}} Zeichen)" + wrong_length: "hat die falsche Länge (muss genau {{count}} Zeichen haben)" + taken: "ist bereits vergeben" + not_a_number: "ist keine Zahl" + greater_than: "muss größer als {{count}} sein" + greater_than_or_equal_to: "muss größer oder gleich {{count}} sein" + equal_to: "muss genau {{count}} sein" + less_than: "muss kleiner als {{count}} sein" + less_than_or_equal_to: "muss kleiner oder gleich {{count}} sein" + odd: "muss ungerade sein" + even: "muss gerade sein" + attributes: + user: + first_name: "Vorname" + last_name: "Nachname" + todo: + predecessors: "Hängt ab von" + due: "Fällig" + show_from: "Zeigen ab dem" + project: "Projekt" + description: "Beschreibung" + notes: "Notizen" + context: "Kontext" + preference: + week_starts: "Woche startet am" + show_project_on_todo_done: "Zur Projektseite wechseln, wenn To-Do abgeschlossen" + refresh: "Aktualisierungsintverall (in Minuten)" + mobile_todos_per_page: "Aufgaben pro Seite (Mobile Version)" + sms_email: "Per E-Mail" + sms_context: "Standard-E-Mail-Kontext" + project: + description: "Beschreibung" + default_context_name: "Standard Kontext" + default_tags: "Standard Tags" + models: + project: + feed_title: "Tracks-Projekte" + feed_description: "Listet alle Projekte für {{username}} auf" + preference: + due_styles: ['Fällig in ___ Tagen', 'Fällig am _______'] + user: + error_context_not_associated: "Kontext-ID {{context}} nicht mit Benutzer-ID {{user}} verknüpft." + error_project_not_associated: "Projekt-ID {{project}} nicht mit User-ID {{user}} verknüpft." + todo: + error_date_must_be_future: "muss ein Datum in der Zukunft sein" + common: + update: "Aktualisieren" + logout: "Abmelden" + cancel: "Abbrechen" + project: "Projekt" + projects: "Projekte" + context: "Kontext" + action: "Aktion" + actions: "Aktionen" + server_error: "Auf dem Server ist ein Fehler aufgetreten." + contexts: "Kontexte" + numbered_step: "Schritt {{number}}" + errors_with_fields: "Mit folgenden Feldern sind Probleme aufgetreten:" + back: "Zurück" + create: "Erstellen" + go_back: "Zurück" + search: "Suchen" + none: "Keine" + description: "Beschreibung" + notes: "Notizen" + sort: + sort: "Sortieren" + alphabetically: "Alphabetisch" + alphabetically_title: "Projekte alphabetisch sortieren" + by_task_count: "Nach Anzahl der Aufgaben" + by_task_count_title: "Nach Anzahl der Aufgaben sortieren" + drag_handle: "Verschieben" + optional: "optional" + contexts: + status_hidden: "Kontext ist versteckt" + status_active: "Kontext ist aktiv" + no_actions: "Momentan gibt es keine unvollständigen Aufgaben in diesem Kontext" + context_name: "Kontextname" + update_status_message: "Kontextname wurde geändert" + save_status_message: "Kontext gespeichert" + last_completed_in_context: "in diesem Kontext (letzte {{number}})" + add_context: "Kontext hinzufügen" + context_hide: "Auf Startseite ausblenden?" + hide_form: "Formular verstecken" + visible_contexts: "Sichtbare Kontexte" + hidden_contexts: "Versteckte Kontexte" + context_deleted: "Gelöschter Kontext '{{name}}'" + no_contexts_active: "Derzeit gibt es keine aktiven Kontexte" + no_contexts_hidden: "Derzeit gibt es keine versteckten Kontexte" + hide_form_link_title: "Verstecktes, neues Kontextformular" + data: + import_errors: "Beim Import sind Fehler aufgetreten." + import_successful: "Import war erfolgreich." + feedlist: + legend: "Legende:" + rss_feed: "RSS-Feed" + plain_text_feed: "Plain-Text-Feed" + ical_feed: "iCal-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_due_today: "Heute oder früher fällig" + actions_due_next_week: "In den nächsten 7 Tagen oder früher fällige Aufgaben" + actions_completed_last_week: "In den letzten 7 Tagen abgeschlossene Aufgaben" + all_contexts: "Alle Kontexte" + all_projects: "Alle Projekte" + active_projects_wo_next: "Aktive Projekte ohne ausstehende Aufgaben" + active_starred_actions: "Alle markierten, aktiven Aufgaben" + projects_and_actions: "Aktive Projekte und deren Aufgaben" + context_centric_actions: "Feeds für unvollständige Aufgaben in einem bestimmten Kontext" + context_needed: "Es muss mindestens ein Kontext existieren, bevor ein Feed abonniert werden kann." + choose_context: "Kontext für den Feed wählen" + select_feed_for_context: "Feed für diesen Kontext auswählen" + project_centric: "Feeds für unvollständige Aufgaben in einem bestimmten Kontext" + project_needed: "Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann." + choose_project: "Projekt für den Feed wählen" + select_feed_for_project: "Feed für dieses Projekt auswählen" + integrations: + opensearch_description: "In Tracks suchen" + applescript_next_action_prompt: "Beschreibung der nächsten Aufgabe:" + applescript_success_before_id: "Nächste neue Aufgabe mit ID" + applescript_success_after_id: "erstellt" + gmail_description: "Gadget, um Tracks als Gadget zu Googlemail hinzuzufügen" + layouts: + toggle_notes: "Notizen umschalten" + toggle_notes_title: "Alle Notizen umschalten" + navigation: + home: "Start" + home_title: "Start" + starred: "Markiert" + starred_title: "Markierte Aufgaben betrachten" + projects_title: "Projekte" + tickler: "Notizbuch" + tickler_title: "Notizbuch" + organize: "Organisieren" + contexts_title: "Kontexte" + notes_title: "Alle Notizen anzeigen" + recurring_todos: "Sich wiederholende To-Dos" + recurring_todos_title: "Sich wiederholende To-Dos verwalten" + calendar: "Kalender" + completed_tasks: "Erledigt" + completed_tasks_title: "Vollständig" + feeds: "Feeds" + feeds_title: "Liste der verfügbaren Feeds anzeigen" + stats: "Statistiken" + stats_title: "Statistiken anzeigen" + view: "Betrachten" + calendar_title: "Kalender mit überfälligen Aufgaben" + preferences: "Einstellungen" + preferences_title: "Meine Einstellungen" + export_title: "Daten importieren und exportieren" + export: "Export" + manage_users: "Benutzer verwalten" + manage_users_title: "Benutzer hinzufügen oder entfernen" + integrations_: "Tracks integrieren" + api_docs: "REST API Docs" + search: "Alle Einträge durchsuchen" + next_actions_rss_feed: "RSS-Feed kommende Aufgaben" + mobile_navigation: + new_action: "0-Neue Aufgabe" + home: "1-Home" + contexts: "2-Kontexte" + projects: "3-Projekte" + starred: "4-Markiert" + logout: "Abmelden" + tickler: "Notizbuch" + feeds: "Feeds" + login: + successful: "Anmeldung erfolgreich. Willkommen zurück!" + unsuccessful: "Anmeldung war nicht erfolgreich." + log_in_again: "Erneut anmelden." + session_time_out: "Sitzung abgelaufen. Bitte {{link}}" + logged_out: "Sie wurden von Tracks abgemeldet." + session_will_expire: "Sitzung wird nach {{hours}} Stunde(n) der Inaktivität ablaufen." + session_will_not_expire: "Sitzung wird nicht ablaufen." + successful_with_session_info: "Anmeldung erfolgreich:" + cas_username_not_found: "Sorry, aber es existiert kein Benutzer mit dem CAS-Benutzernamen ({{username}})" + openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identitäts-URL ({{identity_url}})" + account_login: "Account-Anmeldung" + please_login: "Bitte melde dich an, um Tracks zu nutzen" + user_no_expiry: "Angemeldet bleiben" + sign_in: "Anmeldung" + cas_logged_in_greeting: "Hallo, {{username}}! Du bist authentifiziert." + cas_no_user_found: "Hallo, {{username}}! Du hast leider keinen Tracks-Account." + cas_create_account: "Wenn du die Anfrage fortsetzen möchtest, klicke bitte hier: {{signup_link}}" + cas_signup_link: "Account beantragen" + cas_login: "CAS-Anmeldung" + login_with_openid: "Mit einer OpenID anmelden" + login_standard: "zurück zum Standard-Login" + login_cas: "zum CAS gehen" + option_separator: "oder," + mobile_use_openid: "…oder mit einer OpenID anmelden" + notes: + note_location_link: "In:" + note_header: "Notiz {{id}}" + note_link_title: "Notiz {{id}} anzeigen" + delete_note_title: "Diese Notiz löschen" + delete_confirmation: "Bist du sicher, dass du die Notiz '{{id}}' löschen möchtest?" + edit_item_title: "Eintrag bearbeiten" + show_note_title: "Notiz anzeigen" + deleted_note: "Notiz '{{id}}' löschen" + no_notes_available: "Derzeit gibt es keine Notizen: füge Notizen von der jeweiligen Projektseite hinzu." + preferences: + title: "Deine Einstellungen" + show_number_completed: "Zeige {{number}} erledigte Einträge" + staleness_starts_after: "Staleness starts after {{days}} days" + sms_context_none: "Keine" + edit_preferences: "Einstellungen bearbeiten" + token_header: "Dein Token" + token_description: "Token (für die Verwendung in Feeds und der API)" + generate_new_token: "Neues Token generieren" + generate_new_token_confirm: "Bist du sicher? Wenn du ein neues Token generierst, wird dies das alte Token ersetzen und jegliche externe Nutzung stören, die das alte Token verwendet." + authentication_header: "Deine Authentifizierung" + current_authentication_type: "Dein Authentifizierungsart ist {{auth_type}}" + change_authentication_type: "Authentifzierungsart ändern" + change_password: "Passwort ändern" + open_id_url: "Deine OpenID-URL lautet:" + change_identity_url: "Ändere deine Identitäts-URL" + page_title: "TRACKS::Einstellungen" + page_title_edit: "TRACKS::Einstellungen ändern" + projects: + status_project_name_changed: "Projektname geändert" + default_tags_removed_notice: "Standard-Tags entfernt" + set_default_tags_notice: "Standard-Tags des Projekts auf {{default_tags}} setzen" + default_context_removed: "Standard-Kontext entfernt" + default_context_set: "Standard-Kontext des Projekts auf {{default_context}} gesetzt" + project_saved_status: "Projekt gespeichert" + no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verknüpft." + add_note: "Notiz hinzufügen" + todos_append: "an dieses Projekt" + add_note_submit: "Notiz hinzufügen" + deferred_actions: "Aufgeschobene Aufgaben für dieses Projekt" + deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben für dieses Projekt" + completed_actions: "Erledigte Aufgaben für dieses Projekt" + completed_actions_empty: "Es gibt keine erledigten Aufgaben für dieses Projekt" + notes: "Notizen" + notes_empty: "Es gibt keine Notizen für dieses Projekt" + settings: "Einstellungen" + state: "Dieses Projekt ist {{state}}" + active_projects: "Aktive Projekte" + hidden_projects: "Versteckte Projekte" + completed_projects: "Abgeschlossene Projekte" + page_title: "TRACKS::Projekt: {{project}}" + list_projects: "TRACKS::Projektliste" + no_default_context: "Dieses Projekt hat keinen Standard-Kontext" + default_context: "Der Standard-Kontext dieses Projektes ist {{context}}" + project_state: "Projekt ist {{state}}" + hide_new_project_form: "Formular verstecken" + hide_form: "Fomular verstecken" + add_project: "Projekt hinzufügen" + to_new_project_page: "Zu neuem Projekt weiterleiten" + delete_project_title: "Projekt löschen" + delete_project: "Projekt löschen" + edit_project_title: "Projekt bearbeiten" + states: + active: "Aktiv" + active_plural: "Aktive" + completed: "Erledigt" + completed_plural: "Erledigte" + hidden: "Versteckt" + hidden_plural: "Versteckte" + visible: "Sichtbar" + visible_plural: "Sichtbare" + search: + no_results: "Die Suche ergab kein Ergebnis." + todos_matching_query: "Todos entsprechen der Suche" + projects_matching_query: "Projekte entsprechen der Suche" + notes_matching_query: "Notizen entsprechen der Suche" + contexts_matching_query: "Kontexte entsprechen der Suche" + tags_matching_query: "Tags entsprechen der Suche" + shared: + hide_action_form_title: "Formular für neue Aufgaben verstecken" + hide_form: "Formular verstecken" + toggle_multi_title: "Zwischen Einzel- und Mehrfachformular für neue Aufgaben umschalten" + toggle_multi: "Mehrere neue Aufgabeneinträge hinzufügen" + separate_tags_with_commas: "mit Kommas trennen" + add_action: "Aufgabe hinzufügen" + multiple_next_actions: "Mehrere neue Aufgaben (eine pro Zeile)" + project_for_all_actions: "Projekt für alle Aufgaben" + context_for_all_actions: "Kontext für alle Aufgaben" + tags_for_all_actions: "Tags für alle Aufgaben (mit Kommas trennen)" + add_actions: "Aufgaben hinzufügen" + sidebar: + list_empty: "Keine" + list_name_active_projects: "Aktive Projekte" + list_name_active_contexts: "Aktive Kontexte" + list_name_hidden_projects: "Versteckte Projekte" + list_name_completed_projects: "Abgeschlossene Projekte" + list_name_hidden_contexts: "Versteckte Kontexte" + stats: + tod30_legend: + time_of_day: "Tageszeit" + number_of_actions: "Anzahl Aufgaben" + tod30: "Tageszeit (letzte 30 Tage)" + no_actions_selected: "Es sind keine Aufgaben ausgewählt." + totals: "Ingesamt" + tags: "Tags" + more_stats_will_appear: "Weitere Statistiken werden verfügbar, wenn einige Aufgaben hinzugefügt wurden." + spread_of_actions_for_all_context: "Aufgabenverteilung aller Kontexte" + spread_of_running_actions_for_visible_contexts: "Verteilung der laufenden Aufgaben aller sichtbaren Kontexte" + current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unvollständiger sichtbarer Aufgaben" + running_time_legend: + actions: "Aufgaben" + percentage: "Prozentsatz" + weeks: "Vergangene Zeit einer Aktion (Wochen). Klick auf eine Leiste für mehr Informationen." + time_of_day: "Tageszeit (alle Aktionen)" + time_of_day_legend: + number_of_actions: "Anzahl Aufgaben" + time_of_day: "Tageszeit" + labels: + created: "Erstellt" + completed: "Erledigt" + avg_created: "Durchschnittlich erstellt" + avg_completed: "Durchschnittlich fertiggestellt" + month_avg_created: "{{months}} Monat durchschnittlich erstellt" + month_avg_completed: "{{months}} Monat durchschnittlich fertig gestellt" + click_to_update_actions: "Klicke auf eine Leiste in der Grafik um die Aktionen unten zu aktualisieren." + click_to_return: "Klick auf {{link}} um zur Statistikseite zurückzukehren." + click_to_return_link: "hier" + click_to_show_actions_from_week: "Klick auf {{link}} um die Aktionen von Woche {{week}} und danach anzuzeigen." + running_time_all: "Aktuelle Laufzeit aller unvollständigen Aktionen." + running_time_all_legend: + actions: "Aktionen" + percentage: "Prozentsatz" + running_time: "Laufzeit einer Aktion (Wochen). Klick auf eine Leiste für mehr Informationen." + actions_last_year: "Aktionen im letzten Jahr" + actions_last_year_legend: + number_of_actions: "Anzahl Aktionen" + months_ago: "Monate zuvor" + other_actions_label: "(andere)" + action_selection_title: "TRACKS::Aktionsauswahl" + actions_selected_from_week: "Aktionen ausgewählt ab Woche" + actions_further: "und danach" + totals_project_count: "Du hast {{count}} Projekte." + totals_active_project_count: "Von diesen sind {{count}} aktive Projekte" + totals_hidden_project_count: "{{count}} sind versteckt" + totals_completed_project_count: "und {{count}} sind abgeschlossene Projekte." + totals_context_count: "Du hast {{count}} Kontexte." + totals_visible_context_count: "Von diesen sind {{count}} sichtbare Kontexte" + totals_hidden_context_count: "und {{count}} sind versteckte Kontexte." + totals_first_action: "Seit deiner ersten Aktion am {{date}}" + totals_action_count: "hattest du insgesamt {{count}} Aktionen" + totals_actions_completed: "{{count}} davon sind abgeschlossen." + totals_incomplete_actions: "Du hast {{count}} unvollständige Aktionen" + totals_deferred_actions: "von denen {{count}} im Notizbuch zurückgestellt sind" + totals_blocked_actions: "{{count}} hängen vom Abschluss anderer Aktionen ab." + totals_tag_count: "Du hast {{count}} Tags in Aktionen." + totals_unique_tags: "Von diesen Tags sind {{count}} einmalig.." + actions_avg_completion_time: "Durchschnittlich hast du {{count}} Tage gebraucht, um eine Aktion abzuschliessen." + actions_min_max_completion_days: "Das Minimum/Maximum an Tagen einer Vervollständigung ist {{min}}/{{max}}." + actions_min_completion_time: "Die minimale Zeit beträgt {{time}}." + actions_actions_avg_created_30days: "In den letzten 30 Tagen hast du im Durchschnitt {{count}} Aktionen erstellt" + actions_avg_completed_30days: "und {{count}} durchschnittlich davon erledigt." + actions_avg_created: "In den letzten 12 Monaten hast du im Durchschnitt {{count}} Aktionen erstellt" + actions_avg_completed: "und {{count}} durchschnittlich davon monatlich erledigt" + tag_cloud_title: "Tag-Cloud aller Aktionen" + tag_cloud_description: "Diese Tag-Cloud beinhaltet Tags aller Aktionen (abgeschlossen, nicht abgeschlossen, sichtbar und/oder unsichtbar)" + no_tags_available: "keine Tags verfügbar" + tag_cloud_90days_title: "Tag-Cloud-Aktionen in den letzten 90 Tagen" + tag_cloud_90days_description: "Diese Tag-Cloud beinhaltet Tags der Aktionen, die in den letzten 90 Tagen erstellt oder abgeschlossen wurden." + top10_projects: "Top 10 aller Projekte" + top10_projects_30days: "Top-10-Projekt der letzten 30 Tage" + top10_longrunning: "Top 10 der am längsten laufenden Projekte" + top5_contexts: "Top 5 aller Kontexte" + top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unvollständigen Aktionen" + actions_30days_title: "_Aktionen der letzten 30 Tage" + actions_lastyear_title: "Aktionen der letzten 12 Monate" + legend: + number_of_actions: "Anzahl Aktionen" + months_ago: "Monate zuvor" + number_of_days: "Anzahl vergangene Tage" + day_of_week: "Wochentag" + actions: "Aktionen" + percentage: "Prozentsatz" + running_time: "Laufzeit einer Aktion (Wochen)" + actions_day_of_week_title: "Wochentag (alle Aktionen)" + actions_dow_30days_title: "Wochentag (letzte 30 Tage)" + action_completion_time_title: "Fertigstellungszeit (alle abgeschlossenen Aktionen)" + todos: + action_saved: "Aktion gespeichert" + recurring_action_saved: "Wiederkehrende Aktion gespeichert" + action_saved_to_tickler: "Aktion im Notizbuch gespeichert" + added_new_project: "Neues Projekt hinzugefügt" + added_new_context: "Neuer Kontext hinzugefügt" + recurrence_completed: "Nach dieser wiederkehrenden Aktion, die du gerade abgeschlossen hast, folgt keine mehr. Die Wiederholung endet hiermit" + tagged_with: "getagged mit ‘{{tag_name}}’" + no_actions_found: "Keine Aktionen gefunden" + no_actions_with: "Im Augenblick gibt es keine unvollständigen Aktionen mit dem Tag '{{tag_name}}'" + removed_predecessor: "{{successor}} entfernt als Abhängigkeit von {{predecessor}}." + error_removing_dependency: "Beim Entfernen der Abhängigkeit ist ein Fehler aufgetreten" + deferred_actions_with: "Zurückgestellte Aktionen mit dem Tag '{{tag_name}}'" + no_deferred_actions_with: "Keine zurückgestellten Aktionen mit dem Tag '{{tag_name}}'" + completed_actions_with: "Abgeschlossene Aktionen mit dem Tag {{tag_name}}" + no_completed_actions_with: "Keine abgeschlossenen Aktionen mit dem Tag '{{tag_name}}'" + next_action_description: "Beschreibung der nächsten Aktion" + notes: "Notizen" + new_related_todo_created: "Eine neue To-Do wurde hinzugefügt, die zu dieser wiederkehrenden To-Do gehört" + error_completing_todo: "Beim Abschliessen/Aktivieren der wiederkehrenden To-Do {{description}} ist ein Fehler aufgetreten" + recurring_todos: "Wiederkehrende To-Dos" + no_recurring_todos: "Im Augenblick gibt es keine wiederkehrenden To-Dos" + completed_recurring: "Abgeschlossene wiederkehrende To-Dos" + no_completed_recurring: "Im Augenblick gibt es keine abgeschlossenen wiederkehrenden To-Dos" + add_new_recurring: "Füge eine neue wiederkehrende Aktion hinzu" + recurring_deleted_success: "Die wiederkehrende Aktion wurde erfolgreich gelöscht." + error_deleting_recurring: "Beim Löschen der wiederkehrenden To-Do {{description}} ist ein Fehler aufgetreten" + recurrence_period: "Wiederholungszeitraum" + action_marked_complete: "Die Aktion '{{description}}' wurde als {{completed}} markiert." + action_marked_complete_error: "Die Aktion '{{description}}' wurde aufgrund eines Fehlers NICHT als {{completed}} markiert." + recurrence: + daily: "Täglich" + weekly: "Wöchentlich" + monthly: "Monatlich" + yearly: "Jährlich" + starts_on: "Beginnt am" + ends_on: "Endet am" + no_end_date: "Kein Enddatum" + ends_on_number_times: "Endet nach {{number}} Mal" + ends_on_date: "Endet am {{date}}" + daily_options: "Einstellungen für sich täglich wiederholenden Aktionen" + daily_every_number_day: "Alle {{number}} Tage" + every_work_day: "Jeden Arbeitstag" + weekly_options: "Einstellungen für sich wöchentlich wiederholende Aktionen" + weekly_every_number_week: "Kehrt jede {{number}}. Woche wieder am" + monthly_options: "Einstellungen für sich monatlich wiederholende Aktionen" + day_x_on_every_x_month: "Tag {{day}} in jedem {{month}}. Monat" + monthly_every_xth_day: "Der {{day}} {{day_of_week}} eines jeden {{month}}. Monats" + yearly_options: "Einstellungen für sich jährlich wiederholende Aktionen" + yearly_every_x_day: "Jeden {{day}}. {{month}} " + yearly_every_xth_day: "Den {{day}} {{day_of_week}} des {{month}}" + recurrence_on_options: "Setze Wiederholung auf" + recurrence_on_due_date: "Das Datum der To-Do ist verstrichen." + show_options: "To-Do anzeigen" + show_option_always: "immer" + show_days_before: "{{days}} Tage bevor die To-Do fällig ist" + from_tickler: "the date todo comes from tickler (no due date set)" + delete_recurring_action: "wiederkehrende Aktion '{{description}}' löschen" + star_action_with_description: "Aktion '{{description}}' markieren" + star_action: "Aktion markieren" + delete_action: "Aktion löschen" + edit_action: "Aktion bearbeiten" + edit_action_with_description: "Aktion '{{description}}' bearbeiten" + confirm_delete: "Bist du sicher, dass du die Aktion '{{description}}' löschen möchtest?" + delete: "Löschen" + edit: "Bearbeiten" + defer_date_after_due_date: "Zurückstellungsdatum nach Ablaufdatum. Bitte passe das Ablaufdatum an, dass es vor dem Zurückstellungsdatum liegt." + convert_to_project: "In Projekt umwandeln" + blocked_by: "Blockiert durch {{predecessors}" + depends_on: "Hängt ab von" + pending: "Ausstehend" + drag_action_title: "Auf andere Aktion ziehen, um sie als Abhängigkeit zu definieren" + action_due_on: "(Aktion fällig am {{date}})" + scheduled_overdue: "Planmäßig angezeigt vor {{days}} Tagen" + show_today: "Heute anzeigen" + show_tomorrow: "Morgen anzeigen" + show_on_date: "Anzeigen am {{date}}" + show_in_days: "Anzeigen in {{days}} Tagen" + defer_x_days: + one: "Einen Tag zurückstellen" + other: "{{count}} Tage zurückstellen" + has_x_pending: + one: "Hat eine ausstehende Aktion" + other: "Hat {{count}} ausstehende Aktionen" + recurring_actions_title: "TRACKS::Wiederkehrende Aktionen" + next_action_needed: "Es muss mindestens eine folgende Aktion angelegt werden" + context_changed: "Kontext zu {{name}} gewechselt" + action_deleted_success: "Die nächste Aktion erfolgreich gelöscht" + action_deleted_error: "Fehler beim Löschen der Aufgabe" + completed_tasks_title: "TRACKS::Erledigte Aufgaben" + archived_tasks_title: "TRACKS::Archivierte erledigte Aufgaben" + deferred_tasks_title: "TRACKS::Notizbuch" + tagged_page_title: "TRACKS::Als '{{tag_name}}' markiert" + calendar_page_title: "TRACKS::Kalender" + next_actions_title: "TRACKS::Weitere Aufgaben" + next_actions_description: "Filter:" + next_actions_title_additions: + due_today: "heute fällig" + due_within_a_week: "diese Woche fällig" + completed: "Aufgaben erledigt" + next_actions_description_additions: + due_date: "mit einem Datum {{due_date}} oder früher" + completed: "In den letzten {{count}} Tagen" + feed_title_in_context: "im Kontext '{{context}}'" + feed_title: "Aufgaben" + feed_title_in_project: "im Projekt '{{project}}'" + list_incomplete_next_actions_with_limit: "Zeige die letzten {{count}} unerledigten Folge-Aufgaben" + list_incomplete_next_actions: "Unerledigte Folge-Aufgaben anzeigen" + task_list_title: "TRACKS::Aufgaben anzeigen" + mobile_todos_page_title: "Alle Aufgaben" + feeds: + due: "F&auuml;llig: {{date}}" + completed: "Erledigt: {{date}}" + deferred_pending_actions: "Aufgeschobene/ausstehende Aufgaben" + no_deferred_pending_actions: "Momentan sind keine aufgeschobenen oder ausstehenden Aufgaben vorhanden." + completed_actions: "Erledigte Aufgaben" + no_completed_actions: "Momentan sind keine erledigten Aufgaben vorhanden." + was_due_on_date: "war am {{date}} fällig" + tags: "Tags (Komma-separiert)" + clear_due_date: "Fälligkeitsdatum leeren" + show_from: "Anzeigen ab dem" + clear_show_from_date: "Datum leeren" + depends_on_separate_with_commas: "Hängt ab von (Komma-separiert)" + done: "Erledigt?" + no_project: "--Kein Projekt--" + due: "Fällig" + hidden_actions: "Verstecke Aufgaben" + no_hidden_actions: "Momentan sind keine versteckten Aufgaben vorhanden" + no_incomplete_actions: "Es gibt keine unerledigten Aufgaben" + remove_dependency: "Abhängigkeit löschen (löscht nicht die Aufgabe)" + completed: "Erledigt" + added_dependency: "{{dependency}} als Abhängigkeit hinzugefügt." + set_to_pending: "{{task}} als ausstehend markiert" + append_in_this_project: "in diesem Projekt" + unable_to_add_dependency: "Abhängigkeit nicht hinzufügbar" + calendar: + due_today: "Heute zu erledigen" + no_actions_due_today: "Heute sind keine Aufgaben fällig" + due_this_week: "Die restliche Woche zu erledigen" + due_next_week: "Nächste Woche fällig" + no_actions_due_next_week: "Keine Aufgaben für die kommende Woche" + due_this_month: "Im {{month}} fällig" + no_actions_due_this_month: "Keine Aktionen für den Rest des Monats" + due_next_month_and_later: "Im {{month}} und später fällig" + no_actions_due_after_this_month: "Nach diesem Monat sind keine Aufgaben fällig" + get_in_ical_format: "Diesen Kalender im iCal Format herunterladen" + no_actions_due_this_week: "Keine zu erledigenden Aufgaben für den Rest der Woche" + overdue: "Überfällig" + tickler_items_due: + one: "Ein Notizbuch-Eintrag ist nun fällig - lade die Seite neu, um sie zu sehen." + other: "{{count}} Notizbuch-Einträge sind nun fällig - lade die Seite neu, um sie zu sehen." + completed_today: + one: "Du hast heute bereits eine Aufgabe erledigt." + other: "Du hast heute bereits {{count}} Aufgaben erledigt." + completed_last_day: "In den letzten 24 Stunden erledigt" + completed_last_x_days: "In den letzten {{count}} Tagen erledigt" + older_completed_items: "Ältere erledigte Aufgaben" + older_than_days: "Älter als {{count}} Tage" + completed_in_archive: + one: "Es befindet sich eine erledigte Aufgabe im Archiv." + other: "Es befinden sich {{count}} erledigte Aufgaben im Archiv." + completed_more_than_x_days_ago: "Vor mehr als {{count}} Tagen erledigt" + added_new_next_action: "Neue Aktion angelegt" + to_tickler: ", im Notizbuch hinterlegt" + in_pending_state: "und als ausstehend markiert" + recurring_action_deleted: "Die Aktion wurde gelöscht. Da dies eine wiederkehrende Aktion ist, wurde eine neue erstellt." + completed_recurrence_completed: "Es gibt keine weitere Aktion nach der soeben gelöschten. Die Wiederholung ist abgeschlossen." + error_deleting_item: "Beim Löschen von {{description}} trat ein Fehler auf" + no_deferred_actions: "Zur Zeit sind keine zurückgestellten Aktionen vorhanden." + users: + change_authentication_type: "Authentifizierungsart ändern" + select_authentication_type: "Wähle deine neue Authentifizierungsart und klicke 'Authentifizierungsart ändern' an, um deine aktuellen Einstellungen zu überschreiben." + label_auth_type: "Authentifizierungsart" + identity_url: "Identity-URL" + auth_change_submit: "Authentifizierungsart ändern" + change_password_prompt: "Gib dein neues Passwort in die unten stehenden Felder ein und klicke auf 'Passwort ändern' um dein altes Passwort durch das neue zu ersetzen." + new_password_label: "Neues Passwort" + password_confirmation_label: "Passwort bestätigen" + change_password_submit: "Passwort ändern" + destroy_successful: "Benutzer {{login}} wurde erfolgreich gelöscht" + destroy_error: "Beim Löschen des Benutzers {{login}} ist ein Fehler aufgetreten." + total_actions: "Alle Aufgaben" + total_contexts: "Alle Kontexte" + total_projects: "Alle Projekte" + total_notes: "Alle Notizen" + destroy_user: "Benutzer löschen" + destroy_confirmation: "Achtung: der Benutzer '{{login}}' wird mit all seinen Aufgaben, Kontexten, Projekten und Notizen gelöscht. Bist du sicher, dass du fortfahren möchtest?" + signup_new_user: "Neuen Benutzer anlegen" + manage_users: "Benutzer verwalten" + total_users_count: "Derzeit existieren {{count}} Benutzer" + account_signup: "Accounteinrichtung" + register_with_cas: "Mit deinem CAS-Benutzernamen" + desired_login: "Gewünschter Benutzername" + choose_password: "Passwort wählen" + confirm_password: "Passwort bestätigen" + signup: "Registrieren" + new_user_title: "TRACKS::Als Administrator anmelden" + first_user_heading: "Willkommen bei TRACKS. Als erstes legen Sie bitte einen Administrator-Zugang an:" + new_user_heading: "Einen neuen Benutzer anlegen:" + no_signups_title: "TRACKS::Anmeldung nicht erlaubt" + signup_successful: "Benutzer {{username}} erfolgreich angelegt." + user_created: "Benutzer angelegt." + successfully_deleted_user: "Benutzer {{username}} erfolgreich gelöscht." + failed_to_delete_user: "Löschen des Benutzers {{username}} fehlgeschlagen" + change_password_title: "TRACKS::Passwort ändern" + password_updated: "Passwort aktualisiert." + change_auth_type_title: "TRACKS::Authentifizierungstyp ändern" + openid_url_verified: "Die URL {{url}} wurde erfolgreich als Identität verifiziert und Deine Authentifizierung auf OpenID umgestellt." + openid_ok_pref_failed: "Die URL {{url}} wurde erfolgreich als Identität verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf." + auth_type_updated: "Authentifizierungs-Art erfolgreich geändert." + auth_type_update_error: "Beim Ändern der Authentifizierung trat ein Fehler auf: {{error_messages}}" + new_token_generated: "Neuer Token erfolgreich generiert" + errors: + user_unauthorized: "401 Unauthorized: Nur administrative Benutzer dürfen auf diese Funktion zugreifen." \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 9ab0fe94..570c69ff 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,4 +1,3 @@ -en: activerecord: errors: models: @@ -38,6 +37,11 @@ en: update: "Update" logout: "Logout" cancel: "Cancel" + project: "Project" + projects: "Projects" + context: "Context" + action: "Action" + actions: "Actions" server_error: "An error occurred on the server." contexts: "Contexts" numbered_step: "Step {{number}}" @@ -46,6 +50,17 @@ en: create: "Create" go_back: "Go back" search: "Search" + none: "None" + description: "Description" + notes: "Notes" + optional: "optional" + sort: + sort: "Sort" + alphabetically: "Alphabetically" + alphabetically_title: "Sort projects alphabetically" + by_task_count: "By number of tasks" + by_task_count_title: "Sort by number of tasks" + drag_handle: "DRAG" contexts: status_hidden: "Context is hidden" status_active: "Context is active" @@ -57,11 +72,15 @@ en: add_context: "Add Context" context_hide: "Hide from front page?" hide_form: "Hide form" - visible_contexts: "Visible Contexts" - hidden_contexts: "Hidden Contexts" + visible_contexts: "Visible contexts" + hidden_contexts: "Hidden contexts" context_deleted: "Deleted context '{{name}}'" - no_contexts: "Currently there are no {{state}} contexts" + no_contexts_hidden: "Currently there are no hidden contexts" + no_contexts_active: "Currently there are no active contexts" hide_form_link_title: "Hide new context form" + delete_context: "Delete context" + delete_context_confirmation: "Are you sure that you want to delete the context '{{name}}'? Be aware that this will also delete all (repeating) actions in this context!" + edit_context: "Edit context" data: import_errors: "Some errors occurred during import" import_successful: "Import was successful." @@ -82,17 +101,17 @@ en: active_starred_actions: "All starred, active actions" projects_and_actions: "Active projects with their actions" context_centric_actions: "Feeds for incomplete actions in a specific context" - context_needed: "There need to be at least one context before you can request a feed" + context_needed: "There needs to be at least one context before you can request a feed" choose_context: "Choose the context you want a feed of" select_feed_for_context: "Select the feed for this context" project_centric: "Feeds for incomplete actions in a specific project" - project_needed: "There need to be at least one project before you can request a feed" + project_needed: "There needs to be at least one project before you can request a feed" choose_project: "Choose the project you want a feed of" select_feed_for_project: "Select the feed for this project" integrations: opensearch_description: "Search in Tracks" applescript_next_action_prompt: "Description of next action:" - applescript_success_before_id: "New next action with id" + applescript_success_before_id: "New next action with ID" applescript_success_after_id: "created" gmail_description: "Gadget to add Tracks to Gmail as a gadget" layouts: @@ -103,14 +122,11 @@ en: home_title: "Home" starred: "Starred" starred_title: "See your starred actions" - projects: "Projects" projects_title: "Projects" tickler: "Tickler" tickler_title: "Tickler" organize: "Organize" - contexts: "Contexts" contexts_title: "Contexts" - notes: "Notes" notes_title: "Show all notes" recurring_todos: "Repeating todos" recurring_todos_title: "Manage recurring actions" @@ -160,13 +176,13 @@ en: cas_logged_in_greeting: "Hello, {{username}}! You are authenticated." cas_no_user_found: "Hello, {{username}}! You do not have an account on Tracks." cas_create_account: "If you like to request on please go here to {{signup_link}}" - cas_signup_link: "Request Account" + cas_signup_link: "Request account" cas_login: "CAS Login" - login_with_openid: "login with an OpenId" + login_with_openid: "login with an OpenID" login_standard: "go back to the standard login" login_cas: "go to the CAS" option_separator: "or," - mobile_use_openid: "...or login with an Open ID" + mobile_use_openid: "…or login with an OpenID" notes: note_location_link: "In:" note_header: "Note {{id}}" @@ -191,8 +207,10 @@ en: current_authentication_type: "Your authentication type is {{auth_type}}" change_authentication_type: "Change your authentication type" change_password: "Change your password" - open_id_url: "Your Open ID URL is" + open_id_url: "Your OpenID URL is" change_identity_url: "Change Your Identity URL" + page_title: "TRACKS::Preferences" + page_title_edit: "TRACKS::Edit Preferences" projects: status_project_name_changed: "Name of project was changed" default_tags_removed_notice: "Removed the default tags" @@ -215,6 +233,28 @@ en: active_projects: "Active projects" hidden_projects: "Hidden projects" completed_projects: "Completed projects" + page_title: "TRACKS::Project: {{project}}" + list_projects: "TRACKS::List Projects" + no_default_context: "This project does not have a default context" + default_context: "The default context for this project is {{context}}" + project_state: "Project is {{state}}." + no_projects: "Currently there are no projects" + hide_new_project_form: "Hide new project form" + hide_form: "Hide form" + add_project: "Add Project" + to_new_project_page: "Take me to the new project page" + delete_project_title: "delete the project" + delete_project: "Delete project" + edit_project_title: "Edit project" + states: + active: "Active" + active_plural: "Active" + completed: "Completed" + completed_plural: "Completed" + hidden: "Hidden" + hidden_plural: "Hidden" + visible: "Visible" + visible_plural: "Visible" search: no_results: "Your search yielded no results." todos_matching_query: "Todos matching query" @@ -236,21 +276,18 @@ en: add_actions: "Add actions" sidebar: list_empty: "None" - list_name_active_projects: "Active Projects" - list_name_active_contexts: "Active Contexts" - list_name_hidden_projects: "Hidden Projects" - list_name_completed_projects: "Completed Projects" - list_name_hidden_contexts: "Hidden Contexts" + list_name_active_projects: "Active projects" + list_name_active_contexts: "Active contexts" + list_name_hidden_projects: "Hidden projects" + list_name_completed_projects: "Completed projects" + list_name_hidden_contexts: "Hidden contexts" stats: tod30_legend: - time_of_day: "Time of Day" + time_of_day: "Time of day" number_of_actions: "Number of actions" tod30: "Time of day (last 30 days)" no_actions_selected: "There are no actions selected." totals: "Totals" - actions: "Actions" - contexts: "Contexts" - projects: "Projects" tags: "Tags" more_stats_will_appear: "More statistics will appear here once you have added some actions." spread_of_actions_for_all_context: "Spread of actions for all context" @@ -263,14 +300,14 @@ en: time_of_day: "Time of day (all actions)" time_of_day_legend: number_of_actions: "Number of actions" - time_of_day: "Time of Day" + time_of_day: "Time of day" labels: created: "Created" completed: "Completed" - avg_created: "Avg Created" - avg_completed: "Avg Completed" - month_avg_created: "{{months}} Month Avg Created" - month_avg_completed: "{{months}} Month Avg Completed" + avg_created: "Avg created" + avg_completed: "Avg completed" + month_avg_created: "{{months}} Month avg created" + month_avg_completed: "{{months}} Month avg completed" click_to_update_actions: "Click on a bar in the chart to update the actions below." click_to_return: "Click {{link}} to return to the statistics page." click_to_return_link: "here" @@ -310,16 +347,16 @@ en: actions_avg_completed_30days: "and completed an average of {{count}} actions per day." actions_avg_created: "In the last 12 months you created on average {{count}} actions" actions_avg_completed: "and completed an average of {{count}} actions per month." - tag_cloud_title: "Tag Cloud for all actions" + tag_cloud_title: "Tag cloud for all actions" tag_cloud_description: "This tag cloud includes tags of all actions (completed, not completed, visible and/or hidden)" no_tags_available: "no tags available" - tag_cloud_90days_title: "Tag Cloud actions in past 90 days" + tag_cloud_90days_title: "Tag cloud actions in past 90 days" tag_cloud_90days_description: "This tag cloud includes tags of actions that were created or completed in the past 90 days." top10_projects: "Top 10 projects" top10_projects_30days: "Top 10 project in past 30 days" top10_longrunning: "Top 10 longest running projects" - top5_contexts: "Top 5 Contexts" - top5_visible_contexts_with_incomplete_actions: "Top 5 Visible Contexts with incomplete actions" + top5_contexts: "Top 5 contexts" + top5_visible_contexts_with_incomplete_actions: "Top 5 visible contexts with incomplete actions" actions_30days_title: "Actions in the last 30 days" actions_lastyear_title: "Actions in the last 12 months" legend: @@ -350,7 +387,6 @@ en: completed_actions_with: "Completed actions with the tag {{tag_name}}" no_completed_actions_with: "No completed actions with the tag '{{tag_name}}'" next_action_description: "Next action description" - notes: "Notes" new_related_todo_created: "A new todo was added which belongs to this recurring todo" error_completing_todo: "There was an error completing / activating the recurring todo {{description}}" recurring_todos: "Recurring todos" @@ -361,6 +397,8 @@ en: recurring_deleted_success: "The recurring action was deleted succesfully." error_deleting_recurring: "There was an error deleting the recurring todo {{description}}" recurrence_period: "Recurrence period" + action_marked_complete: "The action '{{description}}' was marked as {{completed}}" + action_marked_complete_error: "The action '{{description}}' was NOT marked as {{completed}} due to an error on the server." recurrence: daily: "Daily" weekly: "Weekly" @@ -416,13 +454,91 @@ en: one: "Has one pending action" other: "Has {{count}} pending actions" recurring_actions_title: "TRACKS::Recurring Actions" + next_action_needed: "You need to submit at least one next action" + context_changed: "Context changed to {{name}}" + action_deleted_success: "Successfully deleted next action" + action_deleted_error: "Failed to delete the action" + completed_tasks_title: "TRACKS::Completed tasks" + archived_tasks_title: "TRACKS::Archived completed tasks" + deferred_tasks_title: "TRACKS::Tickler" + tagged_page_title: "TRACKS::Tagged with '{{tag_name}}'" + calendar_page_title: "TRACKS::Calendar" + next_actions_title: "Tracks - Next Actions" + next_actions_description: "Filter:" + next_actions_title_additions: + due_today: "due today" + due_within_a_week: "due within a week" + completed: "actions completed" + next_actions_description_additions: + due_date: "with a due date {{due_date}} or earlier" + completed: "in the last {{count}} days" + feed_title_in_context: "in context '{{context}}'" + feed_title: "Actions" + feed_title_in_project: "in project '{{project}}'" + list_incomplete_next_actions_with_limit: "Lists the last {{count}} incomplete next actions" + list_incomplete_next_actions: "Lists incomplete next actions" + task_list_title: "TRACKS::List tasks" + mobile_todos_page_title: "All actions" + feeds: + due: "Due: {{date}}" + completed: "Completed: {{date}}" + deferred_pending_actions: "Deferred/pending actions" + no_deferred_pending_actions: "Currently there are no deferred or pending actions" + completed_actions: "Completed actions" + no_completed_actions: "Currently there are no completed actions." + was_due_on_date: "was due on {{date}}" + tags: "Tags (separate with commas)" + clear_due_date: "Clear due date" + show_from: "Show from" + clear_show_from_date: "Clear show from date" + depends_on_separate_with_commas: "Depends on (separate with commas)" + done: "Done?" + no_project: "--No project--" + due: "Due" + hidden_actions: "Hidden actions" + no_hidden_actions: "Currently there are no hidden actions found" + no_incomplete_actions: "There are no incomplete actions" + remove_dependency: "Remove dependency (does not delete the action)" + completed: "Completed" + added_dependency: "Added {{dependency}} as dependency." + set_to_pending: "{{task}} set to pending" + append_in_this_project: "in this project" + unable_to_add_dependency: "Unable to add dependency" + calendar: + due_today: "Due today" + no_actions_due_today: "No actions due today" + due_this_week: "Due in rest of this week" + due_next_week: "Due next week" + no_actions_due_next_week: "No actions due in next week" + due_this_month: "Due in rest of {{month}}" + no_actions_due_this_month: "No actions due in rest of this month" + due_next_month_and_later: "Due in {{month}} and later" + no_actions_due_after_this_month: "No actions due after this month" + get_in_ical_format: "Get this calendar in iCal format" + no_actions_due_this_week: "No actions due in rest of this week" + overdue: "Overdue" + tickler_items_due: "{{count}} tickler items are now due - refresh the page to see them." + completed_today: "You have completed {{count}} actions so far today." + completed_last_day: "Completed in the last 24 hours" + completed_last_x_days: "Completed in last {{count}} days" + older_completed_items: "Older completed items" + older_than_days: "Older than {{count}} days" + completed_in_archive: "There are {{count}} completed actions in the archive." + completed_more_than_x_days_ago: "Completed more than {{count}} days ago" + added_new_next_action: "Added new next action" + to_tickler: "to tickler" + in_pending_state: "in pending state" + recurring_action_deleted: "Action was deleted. Because this action is recurring, a new action was added" + completed_recurrence_completed: "There is no next action after the recurring action you just deleted. The recurrence is completed" + error_deleting_item: "There was an error deleting the item {{description}}" + no_deferred_actions: "Currently there are no deferred actions." users: change_authentication_type: "Change authentication type" - select_authentication_type: "Select your new authentication type and click 'Change Authentication Type' to replace your current settings." + select_authentication_type: "Select your new authentication type and click 'Change authentication type' to replace your current settings." label_auth_type: "Authentication type" identity_url: "Identity URL" - auth_change_submit: "Change Authentication Type" - change_password_prompt: "Enter your new password in the fields below and click 'Change Password' to replace your current password with your new one." + auth_change_submit: "Change authentication type" + change_password_prompt: "Enter your new password in the fields below and click 'Change password' to replace your current password with your new one." new_password_label: "New password" password_confirmation_label: "Confirm password" change_password_submit: "Change password" @@ -434,7 +550,7 @@ en: total_notes: "Total notes" destroy_user: "Destroy user" destroy_confirmation: "Warning: this will delete user '{{login}}', all their actions, contexts, project and notes. Are you sure that you want to continue?" - signup_new_user: "Signup new user" + signup_new_user: "Sign up new user" manage_users: "Manage users" total_users_count: "You have a total of {{count}} users" account_signup: "Account signup" @@ -443,5 +559,21 @@ en: choose_password: "Choose password" confirm_password: "Confirm password" signup: "Signup" + new_user_title: "TRACKS::Sign up as the admin user" + first_user_heading: "Welcome to TRACKS. To get started, please create an admin account:" + new_user_heading: "Sign up a new user:" + no_signups_title: "TRACKS::No signups" + signup_successful: "Signup successful for user {{username}}." + user_created: "User created." + successfully_deleted_user: "Successfully deleted user {{username}}" + failed_to_delete_user: "Failed to delete user {{username}}" + change_password_title: "TRACKS::Change password" + password_updated: "Password updated." + change_auth_type_title: "TRACKS::Change authentication type" + openid_url_verified: "You have successfully verified {{url}} as your identity and set your authentication type to OpenID." + openid_ok_pref_failed: "You have successfully verified {{url}} as your identity but there was a problem saving your authentication preferences." + auth_type_updated: "Authentication type updated." + auth_type_update_error: "There was a problem updating your authentication type: {{error_messages}}" + new_token_generated: "New token successfully generated" errors: user_unauthorized: "401 Unauthorized: Only administrative users are allowed access to this function." diff --git a/db/migrate/20110104200112_add_locale_to_preference.rb b/db/migrate/20110104200112_add_locale_to_preference.rb new file mode 100644 index 00000000..05525e1e --- /dev/null +++ b/db/migrate/20110104200112_add_locale_to_preference.rb @@ -0,0 +1,9 @@ +class AddLocaleToPreference < ActiveRecord::Migration + def self.up + add_column :preferences, :locale, :string + end + + def self.down + remove_column :preferences, :locale + end +end