diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index bfc99fe..e2480d8 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 = locale.nil? ? I18n.default_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 8993566..2777a8b 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 374c874..f672510 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 += "<p>#{count_undone_todos_phrase(p)}. "
-    project_description += "Project is #{project.state}."
+    project_description += t('projects.project_state', :state => project.state)
     project_description += "</p>"
     project_description
   end
diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb
index 06a7d18..d217abf 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 <strong>'#{@todo.description}'</strong> was marked as <strong>#{@todo.completed? ? 'complete' : 'incomplete' }</strong>"
+          notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
           redirect_to :action => "index"
         else
-          notify :notice, "The action <strong>'#{@todo.description}'</strong> was NOT marked as <strong>#{@todo.completed? ? 'complete' : 'incomplete' } due to an error on the server.</strong>", "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('common.actions')
     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 = "<div>Due: #{format_date(i.due)}</div>\n" if i.due?
-      done = "<div>Completed: #{format_date(i.completed_at)}</div>\n" if i.completed?
+      due = "<div>#{t('todos.feeds.due', :date => format_date(i.due))}</div>\n" if i.due?
+      done = "<div>#{t('todos.feeds.completed', :date => format_date(i.completed_at))}</div>\n" if i.completed?
       context_link = "<a href=\"#{ context_url(i.context) }\">#{ i.context.name }</a>"
       if i.project_id?
         project_link = "<a href=\"#{ project_url(i.project) }\">#{ i.project.name }</a>"
       else
-        project_link = "<em>none</em>"
+        project_link = "<em>#{t('common.none')}</em>"
       end
-      "#{done||''}#{due||''}#{item_notes||''}\n<div>Project:  #{project_link}</div>\n<div>Context:  #{context_link}</div>"
+      "#{done||''}#{due||''}#{item_notes||''}\n<div>#{t('common.project')}:  #{project_link}</div>\n<div>#{t('common.context')}:  #{context_link}</div>"
     end
   end
 
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 1198837..b4003c3 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 c5dbb91..8573645 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 725cd63..7a2416b 100644
--- a/app/views/contexts/_context_listing.rhtml
+++ b/app/views/contexts/_context_listing.rhtml
@@ -6,7 +6,7 @@
   <div id="<%= dom_id(context) %>" class="context sortable_row" style="display:'';">
     <% unless suppress_drag_handle -%>
       <div class="position">
-        <span class="handle">DRAG</span>
+        <span class="handle"><%= t('common.drag_handle') %></span>
       </div>
     <% end -%>
     <div class="data">
@@ -15,22 +15,22 @@
     
     <div class="buttons">
       <% if context.hide? %>
-        <span class="grey">HIDDEN</span>
+        <span class="grey"><%= t('states.hidden') %></span>
       <% else %>
-        <span class="grey">VISIBLE</span>
+        <span class="grey"><%= t('states.visible') %></span>
       <% 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 3beb3d7..30b4127 100644
--- a/app/views/contexts/_context_state_group.rhtml
+++ b/app/views/contexts/_context_state_group.rhtml
@@ -1,7 +1,7 @@
 <div class="list-stategroup-contexts-container">
-  <h2><span id="<%= state %>-contexts-count" class="badge"><%= context_state_group.length %></span><%= state.titlecase %> <%= t('common.contexts') %></h2>
+  <h2><span id="<%= state %>-contexts-count" class="badge"><%= context_state_group.length %></span><%= t('states.'+ state +'_plural')%> <%= t('common.contexts') %></h2>
   <div id="<%= state%>-contexts-empty-nd" style="<%= no_contexts ? 'display:block' : 'display:none'%>">
-    <div class="message"><p><%= t('contexts.no_contexts', :state => state) %></p></div>
+    <div class="message"><p><%= t('contexts.no_contexts_' + state) %></p></div>
   </div>
   <div id="list-contexts-<%= state %>">
     <%= render :partial => 'context_listing', :collection => context_state_group %>
diff --git a/app/views/data/index.en.html.erb b/app/views/data/index.en.html.erb
new file mode 100644
index 0000000..414526a
--- /dev/null
+++ b/app/views/data/index.en.html.erb
@@ -0,0 +1,36 @@
+<div id="display_box">
+  <div id="feeds">
+    <div id="feedlegend">
+      <h3>Exporting data</h3>
+      <p>You can choose between the following formats:</p>
+      <ul>
+        <li><strong>YAML: </strong>Best for exporting data. <br/><i>Please note that  importing YAML files is currently supported only in experimentally. Do not rely on it for backing up critical data.</i></li>
+        <li><strong>CSV: </strong>Best for importing into spreadsheet or data analysis software</li>
+        <li><strong>XML: </strong>Best for importing or repurposing the data</li>
+      </ul>
+    </div>
+    <br/><br/>
+    <table class="export_table">
+      <tr>
+        <th>Description</th>
+        <th>Download link</th>
+      </tr>
+      <tr>
+        <td>YAML file containing all your actions, contexts, projects, tags and notes</td>
+        <td><%= link_to "YAML file", :controller => 'data', :action => 'yaml_export' %></td>
+      </tr>
+      <tr>
+        <td>CSV file containing all of your actions, with named contexts and projects</td>
+        <td><%= link_to "CSV file (actions, contexts and projects)", :controller => 'data', :action => 'csv_actions' %></td>
+      </tr>
+      <tr>
+        <td>CSV file containing all your notes</td>
+        <td><%= link_to "CSV file (notes only)", :controller => 'data', :action => 'csv_notes' %></td>
+      </tr>
+      <tr>
+        <td>XML file containing all your actions, contexts, projects, tags and notes</td>
+        <td><%= link_to "XML file (actions only)", :controller => 'data', :action => 'xml_export' %></td>
+      </tr>
+    </table>  
+  </div><!-- End of feeds -->
+</div>
diff --git a/app/views/data/index.html.erb b/app/views/data/index.html.erb
deleted file mode 100644
index 414526a..0000000
--- a/app/views/data/index.html.erb
+++ /dev/null
@@ -1,36 +0,0 @@
-<div id="display_box">
-  <div id="feeds">
-    <div id="feedlegend">
-      <h3>Exporting data</h3>
-      <p>You can choose between the following formats:</p>
-      <ul>
-        <li><strong>YAML: </strong>Best for exporting data. <br/><i>Please note that  importing YAML files is currently supported only in experimentally. Do not rely on it for backing up critical data.</i></li>
-        <li><strong>CSV: </strong>Best for importing into spreadsheet or data analysis software</li>
-        <li><strong>XML: </strong>Best for importing or repurposing the data</li>
-      </ul>
-    </div>
-    <br/><br/>
-    <table class="export_table">
-      <tr>
-        <th>Description</th>
-        <th>Download link</th>
-      </tr>
-      <tr>
-        <td>YAML file containing all your actions, contexts, projects, tags and notes</td>
-        <td><%= link_to "YAML file", :controller => 'data', :action => 'yaml_export' %></td>
-      </tr>
-      <tr>
-        <td>CSV file containing all of your actions, with named contexts and projects</td>
-        <td><%= link_to "CSV file (actions, contexts and projects)", :controller => 'data', :action => 'csv_actions' %></td>
-      </tr>
-      <tr>
-        <td>CSV file containing all your notes</td>
-        <td><%= link_to "CSV file (notes only)", :controller => 'data', :action => 'csv_notes' %></td>
-      </tr>
-      <tr>
-        <td>XML file containing all your actions, contexts, projects, tags and notes</td>
-        <td><%= link_to "XML file (actions only)", :controller => 'data', :action => 'xml_export' %></td>
-      </tr>
-    </table>  
-  </div><!-- End of feeds -->
-</div>
diff --git a/app/views/data/yaml_form.en.html.erb b/app/views/data/yaml_form.en.html.erb
new file mode 100644
index 0000000..1b89a9d
--- /dev/null
+++ b/app/views/data/yaml_form.en.html.erb
@@ -0,0 +1,17 @@
+<div id="display_box">
+  <div id="feeds">
+    <div id="feedlegend">
+      <p><b>Beware</b>: all your current data will be destroyed before importing 
+        the YAML file, so if you have access to the database, we strongly recommend 
+        backing up the database right now in case that anything goes wrong.
+      </p>
+      <p>Paste the contents of the YAML file you exported into the text box below:</p>
+    </div>
+    <p>
+      <% form_for :import, @import, :url => {:controller => 'data', :action => 'yaml_import'} do |f| %>
+        <%= f.text_area :yaml %><br />
+        <input type="submit" value="Import data">
+      <% end %>
+    </p>
+  </div><!-- End of feeds -->
+</div><!-- End of display_box -->
diff --git a/app/views/data/yaml_form.html.erb b/app/views/data/yaml_form.html.erb
deleted file mode 100644
index 1b89a9d..0000000
--- a/app/views/data/yaml_form.html.erb
+++ /dev/null
@@ -1,17 +0,0 @@
-<div id="display_box">
-  <div id="feeds">
-    <div id="feedlegend">
-      <p><b>Beware</b>: all your current data will be destroyed before importing 
-        the YAML file, so if you have access to the database, we strongly recommend 
-        backing up the database right now in case that anything goes wrong.
-      </p>
-      <p>Paste the contents of the YAML file you exported into the text box below:</p>
-    </div>
-    <p>
-      <% form_for :import, @import, :url => {:controller => 'data', :action => 'yaml_import'} do |f| %>
-        <%= f.text_area :yaml %><br />
-        <input type="submit" value="Import data">
-      <% end %>
-    </p>
-  </div><!-- End of feeds -->
-</div><!-- End of display_box -->
diff --git a/app/views/integrations/index.en.html.erb b/app/views/integrations/index.en.html.erb
new file mode 100644
index 0000000..51398c2
--- /dev/null
+++ b/app/views/integrations/index.en.html.erb
@@ -0,0 +1,130 @@
+<% has_contexts = !current_user.contexts.empty? -%>
+<h1>Integrations</h1>
+<p>Tracks can be integrated with a number of other tools...
+  whatever it takes to help you get things done!
+  This page has information on setting up some of these.
+  Not all of these are applicable to all platforms, and some require more
+  technical knowledge than others.
+  See also <%= link_to "developer documentation for Tracks' REST API", url_for(:action => 'rest_api') %>.</p>
+<br/><p>Contents:</p>
+<ul>
+  <li><a href="#applescript1-section">Add an Action with Applescript</a></li>
+  <li><a href="#applescript2-section">Add an Action with Applescript based on the currently selected Email in Mail.app</a></li>
+  <li><a href="#quicksilver-applescript-section">Add Actions with Quicksilver and Applescript</a></li>
+  <li><a href="#email-cron-section">Automatically Email Yourself Upcoming Actions</a></li>
+  <li><a href="#message_gateway">Integrate Tracks with an email server to be able to send an action through email to Tracks</a></li>
+  <li><a href="#google_gadget">Add Tracks as a Google Gmail gadget</a></li>
+</ul><br/>
+<p>Do you have one of your own to add? 
+  <a href="http://www.getontracks.org/forums/viewforum/10/" title="Tracks | Tips and Tricks">Tell us about
+    it in our Tips and Tricks forum</a> and we may include it on this page in a future versions of Tracks.
+</p>
+
+<a name="applescript1-section"> </a>
+<h2>Add an Action with Applescript</h2>
+<p>This is a simple script that pops up a dialog box asking for a description, and then sends that to Tracks with a hard-coded context.</p>
+
+<% if has_contexts -%>
+  <ol>
+    <li>Choose the context you want to add actions to: <select name="applescript1-contexts" id="applescript1-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
+    </li>
+    <li>Copy the Applescript below to the clipboard.<br />
+
+      <textarea id="applescript1" name="applescript1" rows="15"><%= render :partial => 'applescript1', :locals => { :context => current_user.contexts.first } %></textarea>
+    </li>
+    <li>Open Script Editor and paste the script into a new document.</li>
+    <li>Compile and save the script. Run it as necessary.</li>
+  </ol>
+<% else %>
+  <br/><p id="no_context_msg"><i>You do not have any context yet. The script will be available after you add your first context</i></p>
+<% end %>
+
+<a name="applescript2-section"> </a>
+<h2>Add an Action with Applescript based on the currently selected Email in Mail.app</h2>
+<p>This script takes the sender and subject of the selected email(s) in Mail and creates a new action for each one, with the description, "Email [sender] about [subject]". The description gets truncated to 100 characters (the validation limit for the field) if it is longer than that. It also has Growl notifications if you have Growl installed.</p>
+
+<% if has_contexts -%>
+  <ol>
+    <li>Choose the context you want to add actions to: <select name="applescript2-contexts" id="applescript2-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
+    </li>
+    <li>Copy the Applescript below to the clipboard.<br />
+
+      <textarea id="applescript2" name="applescript2" rows="15"><%= render :partial => 'applescript2', :locals => { :context => current_user.contexts.first } %></textarea>
+    </li>
+    <li>Open Script Editor and paste the script into a new document.</li>
+    <li>Compile and save the script to the ~/Library/Scriipts/Mail Scripts directory.</li>
+    <li>For more information on using AppleScript with Mail.app, see <a href="http://www.apple.com/applescript/mail/" title="Scriptable Applications: Mail">this overview</a>.
+  </ol>
+<% else %>
+  <br/><p><i>You do not have any context yet. The script will be available after you add your first context</i></p>
+<% end %>
+
+<a name="quicksilver-applescript-section"></a>
+<h2>Add Actions with Quicksilver and Applescript</h2>
+
+<p>This integration will allow you to add actions to Tracks via <a href="http://quicksilver.blacktree.com/">Quicksilver</a>.</p>
+
+<% if has_contexts -%>
+  <ol>
+    <li>Choose the context you want to add actions to: <select name="quicksilver-contexts" id="quicksilver-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
+    </li>
+    <li>Copy the Applescript below to the clipboard.<br />
+
+      <textarea id="quicksilver" name="quicksilver" rows="15"><%= render :partial => 'quicksilver_applescript', :locals => { :context => current_user.contexts.first } %></textarea>
+    </li>
+    <li>Open Script Editor and paste the script into a new document.</li>
+    <li>Compile and save the script as "Add to Tracks.scpt" in ~/Library/Application Support/Quicksilver/Actions/ (you may need to create the Actions directory)</li>
+    <li>Restart Quicksilver</li>
+    <li>Activate Quicksilver (Ctrl+Space by default)</li>
+    <li>Press "." to put quicksilver into text mode</li>
+    <li>Type the description of the next action you want to add</li>
+    <li>Press tab to switch to the action pane.</li>
+    <li>By typing or scrolling, choose the "Add to Tracks" action.</li>
+  </ol>
+<% else %>
+  <br/><p><i>You do not have any context yet. The script will be available after you add your first context</i></p>
+<% end %>
+
+<a name="email-cron-section"> </a>
+<h2>Automatically Email Yourself Upcoming Actions</h2>
+
+<p>If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.</p>
+
+<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
+
+<p>You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?</p>
+
+<a name="message_gateway"> </a>
+<h2>Integrated email/SMS receiver</h2>
+<p>
+  If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
+<ul>
+  <li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
+  <li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
+  <li>Send an email to your newly configured address!</li>
+</ul>
+<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"
+  or "Call Bill > project X". The subject of the message will fill description,
+  context, and project, while the body will populate the tasks's note.
+</p>
+
+<a name="google_gadget"> </a>
+<h2>Add Tracks as a Google Gmail gadget</h2>
+<p>
+  You can now manage your projects/actions inside Gmail using Tracks Gmail Gadget.
+  Add Tracks Gmail gadget to the sidebar of Gmail and track your next actions
+  or add new action without explicitly open new browser tab for Tracks. Steps to set it up:
+</p>
+<ul>
+  <li>Sign in to Gmail and click Settings in the top right of your Gmail page. In Gmail setting page, click Labs tab</li>
+  <li>Enable the "Add any gadget by URL" feature. You will find it at bottom of the list. Select Enable radio button and click Save Changes button.</li>
+  <li>Now you can see Gadgets tab added to Gmail Settings. Go to the Gadgets tab</li>
+  <li>Paste following link to the Add a gadget by its URL: and then click Add button:<br/>
+    <pre><%= integrations_url + "/google_gadget" %></pre></li>
+</ul>
+
+<Module>
+<ModulePrefs title="GTDify" directory_title="GTDify" description="Official gadget for GTDify service." author="GTDify" author_email="support@gtdify.com" author_affiliation="GTDify" author_location="NJ, USA" title_url="http://www.gtdify.com/" screenshot="http://www.gtdify.com/modules/gmail/ss.png" thumbnail="http://www.gtdify.com/modules/gmail/tn.png" category="communication" category2="tools" height="300">
+  </ModulePrefs>
+<Content type="url" href="http://my.gtdify.com/mobile/"/>
+</Module>
\ No newline at end of file
diff --git a/app/views/integrations/index.html.erb b/app/views/integrations/index.html.erb
deleted file mode 100644
index 51398c2..0000000
--- a/app/views/integrations/index.html.erb
+++ /dev/null
@@ -1,130 +0,0 @@
-<% has_contexts = !current_user.contexts.empty? -%>
-<h1>Integrations</h1>
-<p>Tracks can be integrated with a number of other tools...
-  whatever it takes to help you get things done!
-  This page has information on setting up some of these.
-  Not all of these are applicable to all platforms, and some require more
-  technical knowledge than others.
-  See also <%= link_to "developer documentation for Tracks' REST API", url_for(:action => 'rest_api') %>.</p>
-<br/><p>Contents:</p>
-<ul>
-  <li><a href="#applescript1-section">Add an Action with Applescript</a></li>
-  <li><a href="#applescript2-section">Add an Action with Applescript based on the currently selected Email in Mail.app</a></li>
-  <li><a href="#quicksilver-applescript-section">Add Actions with Quicksilver and Applescript</a></li>
-  <li><a href="#email-cron-section">Automatically Email Yourself Upcoming Actions</a></li>
-  <li><a href="#message_gateway">Integrate Tracks with an email server to be able to send an action through email to Tracks</a></li>
-  <li><a href="#google_gadget">Add Tracks as a Google Gmail gadget</a></li>
-</ul><br/>
-<p>Do you have one of your own to add? 
-  <a href="http://www.getontracks.org/forums/viewforum/10/" title="Tracks | Tips and Tricks">Tell us about
-    it in our Tips and Tricks forum</a> and we may include it on this page in a future versions of Tracks.
-</p>
-
-<a name="applescript1-section"> </a>
-<h2>Add an Action with Applescript</h2>
-<p>This is a simple script that pops up a dialog box asking for a description, and then sends that to Tracks with a hard-coded context.</p>
-
-<% if has_contexts -%>
-  <ol>
-    <li>Choose the context you want to add actions to: <select name="applescript1-contexts" id="applescript1-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
-    </li>
-    <li>Copy the Applescript below to the clipboard.<br />
-
-      <textarea id="applescript1" name="applescript1" rows="15"><%= render :partial => 'applescript1', :locals => { :context => current_user.contexts.first } %></textarea>
-    </li>
-    <li>Open Script Editor and paste the script into a new document.</li>
-    <li>Compile and save the script. Run it as necessary.</li>
-  </ol>
-<% else %>
-  <br/><p id="no_context_msg"><i>You do not have any context yet. The script will be available after you add your first context</i></p>
-<% end %>
-
-<a name="applescript2-section"> </a>
-<h2>Add an Action with Applescript based on the currently selected Email in Mail.app</h2>
-<p>This script takes the sender and subject of the selected email(s) in Mail and creates a new action for each one, with the description, "Email [sender] about [subject]". The description gets truncated to 100 characters (the validation limit for the field) if it is longer than that. It also has Growl notifications if you have Growl installed.</p>
-
-<% if has_contexts -%>
-  <ol>
-    <li>Choose the context you want to add actions to: <select name="applescript2-contexts" id="applescript2-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
-    </li>
-    <li>Copy the Applescript below to the clipboard.<br />
-
-      <textarea id="applescript2" name="applescript2" rows="15"><%= render :partial => 'applescript2', :locals => { :context => current_user.contexts.first } %></textarea>
-    </li>
-    <li>Open Script Editor and paste the script into a new document.</li>
-    <li>Compile and save the script to the ~/Library/Scriipts/Mail Scripts directory.</li>
-    <li>For more information on using AppleScript with Mail.app, see <a href="http://www.apple.com/applescript/mail/" title="Scriptable Applications: Mail">this overview</a>.
-  </ol>
-<% else %>
-  <br/><p><i>You do not have any context yet. The script will be available after you add your first context</i></p>
-<% end %>
-
-<a name="quicksilver-applescript-section"></a>
-<h2>Add Actions with Quicksilver and Applescript</h2>
-
-<p>This integration will allow you to add actions to Tracks via <a href="http://quicksilver.blacktree.com/">Quicksilver</a>.</p>
-
-<% if has_contexts -%>
-  <ol>
-    <li>Choose the context you want to add actions to: <select name="quicksilver-contexts" id="quicksilver-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
-    </li>
-    <li>Copy the Applescript below to the clipboard.<br />
-
-      <textarea id="quicksilver" name="quicksilver" rows="15"><%= render :partial => 'quicksilver_applescript', :locals => { :context => current_user.contexts.first } %></textarea>
-    </li>
-    <li>Open Script Editor and paste the script into a new document.</li>
-    <li>Compile and save the script as "Add to Tracks.scpt" in ~/Library/Application Support/Quicksilver/Actions/ (you may need to create the Actions directory)</li>
-    <li>Restart Quicksilver</li>
-    <li>Activate Quicksilver (Ctrl+Space by default)</li>
-    <li>Press "." to put quicksilver into text mode</li>
-    <li>Type the description of the next action you want to add</li>
-    <li>Press tab to switch to the action pane.</li>
-    <li>By typing or scrolling, choose the "Add to Tracks" action.</li>
-  </ol>
-<% else %>
-  <br/><p><i>You do not have any context yet. The script will be available after you add your first context</i></p>
-<% end %>
-
-<a name="email-cron-section"> </a>
-<h2>Automatically Email Yourself Upcoming Actions</h2>
-
-<p>If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.</p>
-
-<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
-
-<p>You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?</p>
-
-<a name="message_gateway"> </a>
-<h2>Integrated email/SMS receiver</h2>
-<p>
-  If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
-<ul>
-  <li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
-  <li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
-  <li>Send an email to your newly configured address!</li>
-</ul>
-<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"
-  or "Call Bill > project X". The subject of the message will fill description,
-  context, and project, while the body will populate the tasks's note.
-</p>
-
-<a name="google_gadget"> </a>
-<h2>Add Tracks as a Google Gmail gadget</h2>
-<p>
-  You can now manage your projects/actions inside Gmail using Tracks Gmail Gadget.
-  Add Tracks Gmail gadget to the sidebar of Gmail and track your next actions
-  or add new action without explicitly open new browser tab for Tracks. Steps to set it up:
-</p>
-<ul>
-  <li>Sign in to Gmail and click Settings in the top right of your Gmail page. In Gmail setting page, click Labs tab</li>
-  <li>Enable the "Add any gadget by URL" feature. You will find it at bottom of the list. Select Enable radio button and click Save Changes button.</li>
-  <li>Now you can see Gadgets tab added to Gmail Settings. Go to the Gadgets tab</li>
-  <li>Paste following link to the Add a gadget by its URL: and then click Add button:<br/>
-    <pre><%= integrations_url + "/google_gadget" %></pre></li>
-</ul>
-
-<Module>
-<ModulePrefs title="GTDify" directory_title="GTDify" description="Official gadget for GTDify service." author="GTDify" author_email="support@gtdify.com" author_affiliation="GTDify" author_location="NJ, USA" title_url="http://www.gtdify.com/" screenshot="http://www.gtdify.com/modules/gmail/ss.png" thumbnail="http://www.gtdify.com/modules/gmail/tn.png" category="communication" category2="tools" height="300">
-  </ModulePrefs>
-<Content type="url" href="http://my.gtdify.com/mobile/"/>
-</Module>
\ No newline at end of file
diff --git a/app/views/layouts/mobile.m.erb b/app/views/layouts/mobile.m.erb
index 68c61a6..7baa39c 100644
--- a/app/views/layouts/mobile.m.erb
+++ b/app/views/layouts/mobile.m.erb
@@ -13,8 +13,8 @@
 </head><body>
 <% if !(@new_mobile || @edit_mobile)
       if !@prefs.nil? -%>
-<h1><span class="count"><%= @down_count %></span> <%= 
-        current_user.time.strftime(@prefs.title_date_format) -%></h1>
+<h1><span class="count"><%= @down_count %></span> <%=
+        l(Date.today, :format => @prefs.title_date_format) -%></h1>
 <div class="nav">
 <%=     (link_to(t('layouts.mobile_navigation.new_action'), new_todo_path(new_todo_params))+" | ") unless @new_mobile -%>
 <%=     (link_to(t('layouts.mobile_navigation.home'), todos_path(:format => 'm'))+" | ") unless @home -%>
diff --git a/app/views/layouts/standard.html.erb b/app/views/layouts/standard.html.erb
index 0d8af77..160af2a 100644
--- a/app/views/layouts/standard.html.erb
+++ b/app/views/layouts/standard.html.erb
@@ -36,7 +36,7 @@
           <% if @count -%>
             <span id="badge_count" class="badge"><%= @count %></span>
           <% end -%>
-          <%= current_user.time.strftime(@prefs.title_date_format) %>
+          <%= l(Date.today, :format => @prefs.title_date_format) %>
         </h1>
       </div>
       <div id="minilinks">
@@ -48,12 +48,12 @@
         <ul class="sf-menu">
           <li><%= navigation_link(t('layouts.navigation.home'), home_path, {:accesskey => "t", :title => t('layouts.navigation.home_title')} ) %></li>
           <li><%= navigation_link(t('layouts.navigation.starred'), tag_path("starred"), :title => t('layouts.navigation.starred_title')) %></li>
-          <li><%= navigation_link(t('layouts.navigation.projects'), projects_path, {:accesskey=>"p", :title=>t('layouts.navigation.projects_title')} ) %></li>
+          <li><%= navigation_link(t('common.projects'), projects_path, {:accesskey=>"p", :title=>t('layouts.navigation.projects_title')} ) %></li>
           <li><%= navigation_link(t('layouts.navigation.tickler'), tickler_path, {:accesskey =>"k", :title => t('layouts.navigation.tickler_title')} ) %></li>
           <li><a href="#"><%= t('layouts.navigation.organize') %></a>
             <ul>
-              <li><%= navigation_link( t('layouts.navigation.contexts'), contexts_path, {:accesskey=>"c", :title=>t('layouts.navigation.contexts_title')} ) %></li>
-              <li><%= navigation_link( t('layouts.navigation.notes'), notes_path, {:accesskey => "o", :title => t('layouts.navigation.notes_title')} ) %></li>
+              <li><%= navigation_link( t('common.contexts'), contexts_path, {:accesskey=>"c", :title=>t('layouts.navigation.contexts_title')} ) %></li>
+              <li><%= navigation_link( t('common.notes'), notes_path, {:accesskey => "o", :title => t('layouts.navigation.notes_title')} ) %></li>
               <li><%= navigation_link( t('layouts.navigation.recurring_todos'), {:controller => "recurring_todos", :action => "index"}, :title => t('layouts.navigation.recurring_todos_title')) %></li>
             </ul>
           </li>
diff --git a/app/views/preferences/edit.html.erb b/app/views/preferences/edit.html.erb
index 98c46ca..d3e9851 100644
--- a/app/views/preferences/edit.html.erb
+++ b/app/views/preferences/edit.html.erb
@@ -6,17 +6,17 @@
   <% form_tag :action => 'update' do %>
 	  <table>
 	    <tr>
-	      <td><label><%= Preference.human_attribute_name('first_name') %></label></td>
+	      <td><label><%= User.human_attribute_name('first_name') %></label></td>
 	      <td><%= text_field 'user', 'first_name' %></td>
 	    </tr>
 	    <tr>
-	      <td><label><%= Preference.human_attribute_name('last_name') %></label></td>
+	      <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>#{pref_name.gsub(/_/,' ')}:</label></td>\n<td>\n|
+	      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
@@ -30,6 +30,7 @@
 	      table_row(pref_name, nowrap_label) { text_field('prefs', pref_name) }
 	    end
 	  %>
+          <%= row_with_select_field('locale', I18n.available_locales) %>
 	  <%= row_with_text_field('date_format') %>
 	  <%= row_with_text_field('title_date_format') %>
     <%= table_row('time_zone', false) { time_zone_select('prefs','time_zone') } %>
diff --git a/app/views/preferences/index.html.erb b/app/views/preferences/index.html.erb
index e48e6b4..15e7126 100644
--- a/app/views/preferences/index.html.erb
+++ b/app/views/preferences/index.html.erb
@@ -6,6 +6,7 @@
     <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"><%= prefs.date_format %></span> Your current date: <%= format_date(current_user.time) %></li>
+    <li><%= Preference.human_attribute_name('locale') %>: <span class="highlight"><%= prefs.locale %></span></li>
     <li><%= Preference.human_attribute_name('title_date_format') %>: <span class="highlight"><%= prefs.title_date_format %></span> Your current title date: <%= current_user.time.strftime(prefs.title_date_format) %></li>
     <li><%= Preference.human_attribute_name('time_zone') %>: <span class="highlight"><%= 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')[prefs.week_starts] %></span></li>
diff --git a/app/views/projects/_project_listing.rhtml b/app/views/projects/_project_listing.rhtml
index bf607d4..b6742ee 100644
--- a/app/views/projects/_project_listing.rhtml
+++ b/app/views/projects/_project_listing.rhtml
@@ -6,23 +6,23 @@ suppress_edit_button ||= false
   <div id="<%= dom_id(project) %>" class="project sortable_row" style="display:''">
     <% unless suppress_drag_handle -%>
       <div class="position">
-        <span class="handle">DRAG</span>
+        <span class="handle"><%= t('common.drag_handle') %></span>
       </div>
     <% end -%>
     <div class="data">
       <%= link_to_project( project ) %><%= " (" + count_undone_todos_and_notes_phrase(project,"actions") + ")" %>
     </div>
     <div class="buttons">
-      <span class="grey"><%= project.current_state.to_s.upcase %></span>
+      <span class="grey"><%= t('states.' + project.current_state.to_s).upcase %></span>
       <a class="delete_project_button"
          href="<%= project_path(project, :format => 'js') %>"
-         title="delete the project '<%= project.name %>'"><%= image_tag( "blank.png",
-             :title => "Delete project",
+         title="<%= t('projects.delete_project_title') %> '<%= project.name %>'"><%= image_tag( "blank.png",
+             :title => t('projects.delete_project'),
           :class=>"delete_item") %></a>
 
       <% unless suppress_edit_button -%>
         <%=  link_to_remote(
-          image_tag( "blank.png", :title => "Edit project", :class=>"edit_item"),
+          image_tag( "blank.png", :title => t('projects.edit_project_title'), :class=>"edit_item"),
           :url => {:controller => 'projects', :action => 'edit', :id => project.id},
           :method => 'get',
           :with => "'_source_view=#{@source_view}'",
diff --git a/app/views/projects/_project_state_group.rhtml b/app/views/projects/_project_state_group.rhtml
index 527f138..aa39b7b 100644
--- a/app/views/projects/_project_state_group.rhtml
+++ b/app/views/projects/_project_state_group.rhtml
@@ -1,12 +1,12 @@
 <div class="project-state-group" id="list-<%= state %>-projects-container" <%= " style=\"display:none\"" if project_state_group.empty? %>>
-  <h2><span id="<%= state %>-projects-count" class="badge"><%= project_state_group.length %></span><%= state.titlecase %> Projects</h2>
-  <div class="menu_sort"><span class="sort_separator">Sort&nbsp;</span>
+  <h2><span id="<%= state %>-projects-count" class="badge"><%= project_state_group.length %></span><%= t('states.'+state+'_plural' )%> <%= t('common.projects') %></h2>
+  <div class="menu_sort"><span class="sort_separator"><%= t('common.sort.sort') %>&nbsp;</span>
     <div class="alpha_sort">
-      <%= link_to("Alphabetically", alphabetize_projects_path(:state => state),
-        :class => "alphabetize_link", :title => "Sort these projects alphabetically") %>
+      <%= link_to(t('common.sort.alphabetically'), alphabetize_projects_path(:state => state),
+        :class => "alphabetize_link", :title => t('common.sort.alphabetically_title')) %>
     </div><span class="sort_separator">&nbsp;|&nbsp;</span><div class="tasks_sort">
-      <%= link_to("By number of tasks", actionize_projects_path(:state => state),
-        :class => "actionize_link", :title => "Sort these projects by number of tasks") %>
+      <%= link_to(t('common.sort.by_task_count'), actionize_projects_path(:state => state),
+        :class => "actionize_link", :title => t('common.sort.by_task_count_title')) %>
     </div>
   </div>
 
diff --git a/app/views/projects/index.html.erb b/app/views/projects/index.html.erb
index 3428344..0c396c1 100644
--- a/app/views/projects/index.html.erb
+++ b/app/views/projects/index.html.erb
@@ -1,6 +1,6 @@
 <div id="display_box">
   <div id="projects-empty-nd" style="<%= @no_projects ? 'display:block' : 'display:none'%>">
-    <div class="message"><p>Currently there are no projects</p></div>
+    <div class="message"><p><%= t('projects.no_projects') %></p></div>
   </div>
   <%= render :partial => 'project_state_group', :object => @active_projects, :locals => { :state => 'active'} %>
   <%= render :partial => 'project_state_group', :object => @hidden_projects, :locals => { :state => 'hidden'} %>
@@ -13,7 +13,7 @@
     <div id="project_new_project_container">
 
       <div id="toggle_project_new" class="hide_form">
-        <a title="Hide new project form" accesskey="n">&laquo; Hide form</a>
+        <a title="<%= t('projects.hide_new_project_form') %>" accesskey="n">&laquo; <%= t('projects.hide_form') %></a>
       </div>
 
       <div id="project_new" class="project_new" style="display:block">
@@ -24,19 +24,19 @@
 
           <div id="status"><%= error_messages_for('project') %></div>
 
-          <label for="project_name">Name:</label><br />
+          <label for="project_name"><%= Project.human_attribute_name(:name) %>:</label><br />
           <%= text_field 'project', 'name', "tabindex" => 1  %><br />
 
-          <label for="project_description">Description (optional):</label><br />
+          <label for="project_description"><%= Project.human_attribute_name(:description) %> (<%= t('common.optional') %>):</label><br />
           <%= text_area 'project', 'description', "cols" => 30, "rows" => 4, "tabindex" => 2  %><br />
 
           <% unless @contexts.empty? -%>
-            <label for="default_context_name">Default Context (optional):</label><br />
+            <label for="default_context_name"><%= Project.human_attribute_name(:default_context_name) %> (<%= t('common.optional') %>):</label><br />
             <%= text_field_tag("project[default_context_name]", @project.default_context.name, :tabindex => 3) %>
             <br />
           <% end -%>
 
-          <label for="default_tags">Default Tags (optional):</label><br />
+          <label for="default_tags"><%= Project.human_attribute_name(:default_tags) %> (<%= t('common.optional') %>):</label><br />
           <%= text_field_tag("project[default_tags]", @project.default_tags, :tabindex => 4) %>
           <br />
 
@@ -45,13 +45,13 @@
           <div class="submit_box">
             <div class="widgets">
               <button type="submit" class="positive" id="project_new_project_submit">
-                <%= image_tag("accept.png", :alt => "") + 'Add Project' %>
+                <%= image_tag("accept.png", :alt => "") + t('projects.add_project') %>
               </button>
             </div>
           </div>
 
           <br/><br/>
-          <input id="go_to_project" type="checkbox" tabindex="5" name="go_to_project"/><label for="go_to_project"> Take me to the new project page</label><br />
+          <input id="go_to_project" type="checkbox" tabindex="5" name="go_to_project"/><label for="go_to_project"><%= t('projects.to_new_project_page') %></label><br />
 
         <% end -%>
       </div>
diff --git a/app/views/todos/_completed.rhtml b/app/views/todos/_completed.rhtml
index 60b864e..3e2b695 100644
--- a/app/views/todos/_completed.rhtml
+++ b/app/views/todos/_completed.rhtml
@@ -7,12 +7,12 @@
       <% if collapsible %>
       <a href="#" class="container_toggle" id="toggle_completed"><%= image_tag("collapse.png") %></a>
       <% end %>
-      Completed actions <%= suffix %>
+      <%= t('todos.completed_actions') %> <%= suffix %>
   </h2>
   <div id="completed_containeritems" class="items toggle_target">
 
     <div id="empty-d" style="display:<%= @done.empty? ? 'block' : 'none' %>">
-      <div class="message"><p>Currently there are no completed actions.</p></div>
+      <div class="message"><p><%= t('todos.no_completed_actions') %></p></div>
     </div>
 
       <%= render :partial => "todos/todo", :collection => done, :locals => { :parent_container_type => "completed", :suppress_context => suppress_context, :suppress_project => suppress_project } %>
diff --git a/app/views/todos/_deferred.rhtml b/app/views/todos/_deferred.rhtml
index c38e156..fa060e6 100644
--- a/app/views/todos/_deferred.rhtml
+++ b/app/views/todos/_deferred.rhtml
@@ -3,12 +3,12 @@
       <% if collapsible %>
       <a href="#" class="container_toggle" id="toggle_deferred"><%= image_tag("collapse.png") %></a>
       <% end %>
-      Deferred/pending actions <%= append_descriptor ? append_descriptor : '' %>
+      <%= t('todos.deferred_pending_actions') %> <%= append_descriptor ? append_descriptor : '' %>
   </h2>
 
   <div id="tickleritems" class="items toggle_target">
     <div id="tickler-empty-nd" style="display:<%= deferred.empty? && pending.empty? ? 'block' : 'none'%>;">
-      <div class="message"><p>Currently there are no deferred or pending actions</p></div>
+      <div class="message"><p><%= t('todos.no_deferred_pending_actions') %></p></div>
     </div>
 
     <%= render :partial => "todos/todo", :collection => deferred, :locals => { :parent_container_type => parent_container_type } %>
diff --git a/app/views/todos/_done.rhtml b/app/views/todos/_done.rhtml
index 3c28bbf..8ecd335 100644
--- a/app/views/todos/_done.rhtml
+++ b/app/views/todos/_done.rhtml
@@ -11,7 +11,7 @@
   <% end %>
 
   <% if done.due %>
-    <%= " - was due on " + format_date( done.due ) %>
+    <%= " - " + t('todos.was_due_on_date', :date => format_date( done.due )) %>
   <% end %>
 
   <% if done.notes? -%>
diff --git a/app/views/todos/_edit_form.rhtml b/app/views/todos/_edit_form.rhtml
index 3662448..d0279ca 100644
--- a/app/views/todos/_edit_form.rhtml
+++ b/app/views/todos/_edit_form.rhtml
@@ -4,42 +4,42 @@
 <%= source_view_tag( @source_view ) -%>
 <%= "<INPUT TYPE=\"hidden\" name=\"_tag_name\" value=\""+ @tag_name+"\">" unless @tag_name.nil? -%>
 
-<label for="<%= dom_id(@todo, 'description') %>">Description</label>
+<label for="<%= dom_id(@todo, 'description') %>"><%= t('common.description') %></label>
 <%= text_field( "todo", "description", "size" => 30, "tabindex" => 8, "maxlength" => 100) %>
 
-<label for="<%= dom_id(@todo, 'notes') %>">Notes</label>
+<label for="<%= dom_id(@todo, 'notes') %>"><%= t('common.notes') %></label>
 <%= text_area( "todo", "notes", "cols" => 29, "rows" => 4, "tabindex" => 9) %>
 
 <div class="project_input">
-  <label for="<%= dom_id(@todo, 'project_name') %>">Project</label>
+  <label for="<%= dom_id(@todo, 'project_name') %>"><%= t('common.project') %></label>
   <input id="<%= dom_id(@todo, 'project_name') %>" name="project_name" autocomplete="off" tabindex="10" size="30" type="text" value="<%= @todo.project.nil? ? 'None' : @todo.project.name.gsub(/"/,"&quot;") %>" />
 </div>
 
 <div class="context_input">
-  <label for="<%= dom_id(@todo, 'context_name') %>">Context</label>
+  <label for="<%= dom_id(@todo, 'context_name') %>"><%= t('common.context')  %></label>
   <input id="<%= dom_id(@todo, 'context_name') %>" name="context_name" autocomplete="off" tabindex="11" size="30" type="text" value="<%= @todo.context.name %>" />
 </div>
 
-<label class="tag_list_label" for="<%= dom_id(@todo, 'tag_list') %>">Tags (separate with commas)</label>
+<label class="tag_list_label" for="<%= dom_id(@todo, 'tag_list') %>"><%= t('todos.tags') %></label>
 <%= text_field_tag 'tag_list', tag_list_text, :id => dom_id(@todo, 'tag_list'), :size => 30, :tabindex => 12 %> 
 
 <div class="due_input">
   <label for="<%= dom_id(@todo, 'due_label') %>">Due</label>
   <%= date_field_tag("todo[due]", dom_id(@todo, 'due'), format_date(@todo.due), "tabindex" => 13) %>
-  <a href="#" id="<%= dom_id(@todo, 'due_x') %>" class="date_clear" title="Clear due date">
-    <%= image_tag("delete_off.png", :alt => "Clear due date") %>
+  <a href="#" id="<%= dom_id(@todo, 'due_x') %>" class="date_clear" title="<%= t('todos.clear_due_date') %>">
+    <%= image_tag("delete_off.png", :alt => "<%= t('todos.clear_due_date') %>") %>
   </a>
 </div>
 
 <div class="show_from_input">
-  <label for="<%= dom_id(@todo, 'show_from') %>">Show from</label>
+  <label for="<%= dom_id(@todo, 'show_from') %>"><%= t('todos.show_from') %></label>
   <%= date_field_tag("todo[show_from]", dom_id(@todo, 'show_from'), format_date(@todo.show_from), "tabindex" => 14) %>
-  <a href="#" id="<%= dom_id(@todo, 'show_from_x') %>" class="date_clear" title="Clear show from date">
-    <%= image_tag("delete_off.png", :alt => "Clear show from date") %>
+  <a href="#" id="<%= dom_id(@todo, 'show_from_x') %>" class="date_clear" title="<%= t('todos.clear_show_from_date') %>">
+    <%= image_tag("delete_off.png", :alt => "<%= t('todos.clear_show_from_date') %>") %>
   </a>
 </div>
 
-<label class="predecessor_list_label" for="<%= dom_id(@todo, 'predecessor_list') %>">Depends on (separate with commas)</label>
+<label class="predecessor_list_label" for="<%= dom_id(@todo, 'predecessor_list') %>"><%= t('todos.depends_on_separate_with_commas') %></label>
 <%= text_field_tag 'predecessor_list', predecessor_list_text, :id => dom_id(@todo, 'predecessor_list'), :size => 30, :tabindex => 15 %> 
 
 <% if controller.controller_name == "project" || @todo.deferred? -%>
@@ -49,12 +49,12 @@
 <div class="submit_box">
   <div class="widgets">
     <button type="submit" class="positive" id="<%= dom_id(@todo, 'submit') %>" tabindex="16">
-      <%=image_tag("accept.png", :alt => "") %>
-      Update
+      <%= image_tag("accept.png", :alt => "") %>
+      <%= t('common.update') %>
     </button>
     <a href="#" class="negative">
-      <%=image_tag("cancel.png", :alt => "") %>
-      Cancel
+      <%= image_tag("cancel.png", :alt => "") %>
+      <%= t('common.cancel') %>
     </a>
   </div>
 </div>
diff --git a/app/views/todos/_edit_mobile.rhtml b/app/views/todos/_edit_mobile.rhtml
index 712ecaa..dcdf0ac 100644
--- a/app/views/todos/_edit_mobile.rhtml
+++ b/app/views/todos/_edit_mobile.rhtml
@@ -5,13 +5,13 @@
 </span>
 <% this_year = current_user.time.to_date.strftime("%Y").to_i
 if parent_container_type == 'show_mobile' -%>
-<p><label for="todo_done">Done?</label>&nbsp;<%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1) %></p>
+<p><label for="todo_done"><%= t('todos.done') %></label>&nbsp;<%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1) %></p>
 <% end -%>
-<h2><label for="todo_description">Description</label></h2>
+<h2><label for="todo_description"><%= t('common.description') %></label></h2>
 <%= text_field( "todo", "description", "tabindex" => 2, "maxlength" => 100, "size" => 50) %>
-<h2><label for="todo_notes">Notes</label></h2>
+<h2><label for="todo_notes"><%= t('common.notes') %></label></h2>
 <%= text_area( "todo", "notes", "cols" => 40, "rows" => 3, "tabindex" => 3) %>
-<h2><label for="todo_context_id">Context</label></h2>
+<h2><label for="todo_context_id"><%= t('common.context') %></label></h2>
 <%= unless @mobile_from_context
   collection_select( "todo", "context_id", @contexts, "id", "name", {}, {"tabindex" => 4} ) 
 else
@@ -19,10 +19,10 @@ else
     @contexts, "id", "name", @mobile_from_context.id), 
     {"id" => :todo_context_id, :tabindex => 4} )
 end %>
-<h2><label for="todo_project_id">Project</label></h2>
+<h2><label for="todo_project_id"><%= t('common.context')  %></label></h2>
 <%= unless @mobile_from_project
   collection_select( "todo", "project_id", @projects, "id", "name",
-                          {:include_blank => '--No project--'}, {"tabindex" => 5} )
+                          {:include_blank => t('todos.no_project')}, {"tabindex" => 5} )
 else
   # manually add blank option since :include_blank does not work 
   # with options_from_collection_for_select
@@ -30,11 +30,11 @@ else
     @projects, "id", "name", @mobile_from_project.id), 
     {"id" => :todo_project_id, :tabindex => 5} )
 end %>
-<h2><label for="tag_list">Tags (separate with commas)</label></h2>
+<h2><label for="tag_list"><%= t('todos.tags') %></label></h2>
 <%= text_field_tag "tag_list", @tag_list_text, :size => 50, :tabindex => 6 %>
-<h2><label for="todo_due">Due</label></h2>
+<h2><label for="todo_due"><%= t('todos.due') %></label></h2>
 <%= date_select("todo", "due", {:order => [:day, :month, :year],
                     :start_year => this_year, :include_blank => '--'}, :tabindex => 7) %>
-<h2><label for="todo_show_from">Show from</label></h2>
+<h2><label for="todo_show_from"><%= t('todos.show_from') %></label></h2>
 <%= date_select("todo", "show_from", {:order => [:day, :month, :year], 
                     :start_year => this_year, :include_blank => true}, :tabindex => 8) %>
diff --git a/app/views/todos/_hidden.rhtml b/app/views/todos/_hidden.rhtml
index 21f7b01..cedfb29 100644
--- a/app/views/todos/_hidden.rhtml
+++ b/app/views/todos/_hidden.rhtml
@@ -3,12 +3,12 @@
       <% if collapsible %>
       <a href="#" class="container_toggle" id="toggle_deferred"><%= image_tag("collapse.png") %></a>
       <% end %>
-      Hidden actions <%= append_descriptor ? append_descriptor : '' %>
+      <%= t('todos.hidden_actions') %> <%= append_descriptor ? append_descriptor : '' %>
   </h2>
 
   <div id="hiddenitems" class="items toggle_target">
     <div id="hidden-empty-nd" style="display:<%= hidden.empty? ? 'block' : 'none'%>;">
-      <div class="message"><p>Currently there are no hidden actions found</p></div>
+      <div class="message"><p><%= t('todos.no_hidden_actions') %></p></div>
     </div>
 
     <%= render :partial => "todos/todo", :collection => hidden, :locals => { :parent_container_type => 'tag' } %>
diff --git a/app/views/todos/_mobile_actions.rhtml b/app/views/todos/_mobile_actions.rhtml
index 861a981..623c804 100644
--- a/app/views/todos/_mobile_actions.rhtml
+++ b/app/views/todos/_mobile_actions.rhtml
@@ -1,5 +1,5 @@
 <% if @not_done_todos.empty? -%>
-<p>There are no incomplete actions</p>
+<p><%= t('todos.no_incomplete_actions') %></p>
 <% else -%>
 <%= render :partial => "contexts/mobile_context", :collection => @contexts_to_show -%>
 <% end -%>
\ No newline at end of file
diff --git a/app/views/todos/_successor.html.erb b/app/views/todos/_successor.html.erb
index 83f1fc5..bfd76dd 100644
--- a/app/views/todos/_successor.html.erb
+++ b/app/views/todos/_successor.html.erb
@@ -12,7 +12,7 @@ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
       <span class="todo.descr"><%= h sanitize(successor.description) %></span>
       
       <%= link_to_remote(
-        image_tag("blank.png", :title => "Remove dependency (does not delete the action)", :align => "absmiddle", :class => "delete_item"),
+        image_tag("blank.png", :title => t('todos.remove_dependency'), :align => "absmiddle", :class => "delete_item"),
         {:url => {:controller => 'todos', :action => 'remove_predecessor', :id => successor.id},
          :method => 'delete',
          :with => "'#{parameters}&predecessor=#{predecessor.id}'",
diff --git a/app/views/todos/_text_todo.rhtml b/app/views/todos/_text_todo.rhtml
index 34939e3..291bd60 100644
--- a/app/views/todos/_text_todo.rhtml
+++ b/app/views/todos/_text_todo.rhtml
@@ -8,11 +8,11 @@ else
 end
 
 if (todo.completed?) && todo.completed_at
-  result_string << "[Completed: " + format_date(todo.completed_at) + "] "
+  result_string << "["+ t('todos.completed') +": " + format_date(todo.completed_at) + "] "
 end
 
 if todo.due
-  result_string << "[Due: " + format_date(todo.due) + "] "
+  result_string << "[" + t('todos.due') + ": " + format_date(todo.due) + "] "
   result_string << todo.description + " "
 else
   result_string << todo.description + " "
diff --git a/app/views/todos/add_predecessor.js.rjs b/app/views/todos/add_predecessor.js.rjs
index 4030339..61705ff 100644
--- a/app/views/todos/add_predecessor.js.rjs
+++ b/app/views/todos/add_predecessor.js.rjs
@@ -1,8 +1,8 @@
 if @saved
   # show update message
-  status_message = "Added #{@predecessor.description} as dependency."
+  status_message = t('todos.added_dependency', :dependency => @predecessor.description)
   unless @original_state == 'pending'
-    status_message += " #{@todo.description} set to pending"
+    status_message += t('todos.set_to_pending', :task => @todo.description)
   end
   # remove successor from page
   page[@todo].remove
@@ -22,7 +22,7 @@ if @saved
     page['tickler-empty-nd'].hide
     page.replace "tickler", :partial => 'todos/deferred', :locals =>  { :deferred => @todo.project.deferred_todos, 
                                                                         :collapsible => false, 
-                                                                        :append_descriptor => "in this project", 
+                                                                        :append_descriptor => t('todos.append_in_this_project'), 
                                                                         :parent_container_type => 'project', 
                                                                         :pending => @todo.project.pending_todos }
   end
@@ -30,6 +30,6 @@ if @saved
   page << 'enable_rich_interaction();'
   page.notify :notice, status_message, 5.0
 else
-  page.replace_html "status", content_tag("div", content_tag("h2", "Unable to add dependency"), "id" => "errorExplanation", "class" => "errorExplanation")  
+  page.replace_html "status", content_tag("div", content_tag("h2", t('todos.unable_to_add_dependency')), "id" => "errorExplanation", "class" => "errorExplanation")  
 end
 
diff --git a/app/views/todos/calendar.html.erb b/app/views/todos/calendar.html.erb
index 33ccae7..987b7b5 100644
--- a/app/views/todos/calendar.html.erb
+++ b/app/views/todos/calendar.html.erb
@@ -1,9 +1,9 @@
 <div id="display_box">
 
   <div class="container">
-    <h2>Due today</h2>
+    <h2><%= t('todos.calendar.due_today') %></h2>
     <div id="empty_due_today" <%= "style=\"display:none\"" unless @due_today.empty? %>>
-      No actions due today
+      <%= t('todos.calendar.no_actions_due_today') %>
     </div>
     <div id="due_today">
       <%= render :partial => "todos/todo", :collection => @due_today %>
@@ -11,9 +11,9 @@
   </div>
 
   <div class="container">
-    <h2>Due in rest of this week</h2>
+    <h2><%= t('todos.calendar.due_this_week') %></h2>
     <div id="empty_due_this_week" <%= "style=\"display:none\"" unless @due_this_week.empty? %>>
-      No actions due in rest of this week
+      <%= t('todos.no_actions_due_this_week') %>
     </div>
     <div id="due_this_week">
       <%= render :partial => "todos/todo", :collection => @due_this_week %>
@@ -21,9 +21,9 @@
   </div>
 
   <div class="container">
-    <h2>Due next week</h2>
+    <h2><%= t('todos.calendar.due_next_week') %></h2>
     <div id="empty_due_next_week" <%= "style=\"display:none\"" unless @due_next_week.empty? %>>
-      No actions due in next week
+      <%= t('todos.calendar.no_actions_due_next_week') %>
     </div>
     <div id="due_next_week">
       <%= render :partial => "todos/todo", :collection => @due_next_week %>
@@ -31,9 +31,9 @@
   </div>
 
   <div class="container">
-    <h2>Due in rest of <%= Time.zone.now.strftime("%B") %> </h2>
+    <h2><%= t('todos.calendar.due_this_month', :month => Time.zone.now.strftime("%B")) %></h2>
     <div id="empty_due_this_month" <%= "style=\"display:none\"" unless @due_this_month.empty? %>>
-      No actions due in rest of this month
+      <%= t('todos.calendar.no_actions_due_this_month') %>
     </div>
     <div id="due_this_month">
       <%= render :partial => "todos/todo", :collection => @due_this_month %>
@@ -41,9 +41,9 @@
   </div>
 
   <div class="container">
-    <h2>Due in <%= (Time.zone.now+1.month).strftime("%B") %> and later</h2>
+    <h2><%= t('todos.calendar.due_next_month_and_later', :month => (Time.zone.now+1.month).strftime("%B")) %></h2>
     <div id="empty_due_after_this_month" <%= "style=\"display:none\"" unless @due_after_this_month.empty? %>>
-      No actions due after this month
+      <%= t('todos.calendar.no_actions_due_after_this_month') %>
     </div>
     <div id="due_after_this_month">
       <%= render :partial => "todos/todo", :collection => @due_after_this_month %>
@@ -53,5 +53,5 @@
 </div><!-- End of display_box -->
 <div class="input_box" id="input_box">
   <p><%= link_to('<span class="feed">iCal</span>', {:format => 'ics', :token => current_user.token}, :title => "iCal feed" ) %>
-  - Get this calendar in iCal format</p>
+  - <%= t('todos.calendar.get_in_ical_format') %></p>
 </div>
diff --git a/app/views/todos/calendar.ics.erb b/app/views/todos/calendar.ics.erb
index 3751ac1..221216e 100644
--- a/app/views/todos/calendar.ics.erb
+++ b/app/views/todos/calendar.ics.erb
@@ -9,7 +9,7 @@ X-WR-CALNAME:Tracks
   overdue_text = ""
   if due_date.at_midnight < Time.zone.now.at_midnight
     due_date = Time.zone.now
-    overdue_text = "Overdue: "
+    overdue_text = t('todos.overdue') +": "
   end
   modified = todo.updated_at || todo.created_at
 %>BEGIN:VEVENT
diff --git a/app/views/todos/check_deferred.js.rjs b/app/views/todos/check_deferred.js.rjs
index 38bbb98..f5cef36 100644
--- a/app/views/todos/check_deferred.js.rjs
+++ b/app/views/todos/check_deferred.js.rjs
@@ -1,4 +1,4 @@
 unless @due_tickles.empty?
   #TODO: why not just add the new items here in addition to notifying?
-  page.notify :notice, "#{@due_tickles.length} tickler items are now due - refresh the page to see them.", 5.0
+  page.notify :notice, t('todos.tickler_items_due', :count => @due_tickles.length), 5.0
 end
\ No newline at end of file
diff --git a/app/views/todos/completed.html.erb b/app/views/todos/completed.html.erb
index 72b9eb1..40682be 100644
--- a/app/views/todos/completed.html.erb
+++ b/app/views/todos/completed.html.erb
@@ -1,25 +1,25 @@
 <div id="display_box_projects">
-<p>You have completed <%= pluralize @done_today.length, 'action' %> so far today.</p>
+<p><%= t('todos.completed_today', :count => @due_tickles.nil? ? 0 : @due_tickles.length) %></p>
 <div class="container">
-  <h2>Completed in the last 24 hours</h2>
+  <h2><%= t('todos.completed_last_day') %></h2>
   <table class="next_actions" border="0">
     <%= render :partial => "done", :collection => @done_today %>
   </table>
 </div>
 
 <div class="container">
-  <h2>Completed in last 7 days</h2>
+  <h2><%= t('todos.completed_last_x_days', :count => 7) %></h2>
   <table class="next_actions" border="0">
     <%= render :partial => "done", :collection => @done_this_week %>
   </table>
 </div>
 
 <div class="container">
-  <h2>Completed in the last 28 days</h2>
+  <h2><%= t('todos.completed_last_x_days', :count => 28) %></h2>
   <table class="next_actions" border="0">
     <%= render :partial => "done", :collection => @done_this_month %>
   </table>
 </div>
 
-<p>Older completed items: <%= link_to( "Older than 31 days", done_archive_path ) %></p>
+<p><%= t('todos.older_completed_items') %>: <%= link_to( t('todos.older_than_days', :count => 31), done_archive_path ) %></p>
 </div><!-- End of display_box -->
diff --git a/app/views/todos/completed_archive.html.erb b/app/views/todos/completed_archive.html.erb
index 95fa811..c3f87bb 100644
--- a/app/views/todos/completed_archive.html.erb
+++ b/app/views/todos/completed_archive.html.erb
@@ -1,8 +1,8 @@
 <div id="display_box_projects">
 
-<p>There <%= @done_archive.length == 1 ? 'is' : 'are' %> <%= pluralize @done_archive.length, 'completed action' %> in the archive.</p>
+<p><%= t('todos.completed_in_archive', :count => @done_archive.length) %></p>
 <div class="container">
-  <h2>Completed more than 31 days ago</h2>
+  <h2><%= t('todos.completed_more_than_x_days_ago', :count => 31) %></h2>
   <table class="next_actions" cellspacing="5" cellpadding="0" border="0">
     <%= render :partial => "done", :collection => @done_archive %>
   </table>
diff --git a/app/views/todos/create.js.rjs b/app/views/todos/create.js.rjs
index 597ba41..2423105 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 46146a9..3e6c2fc 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 f4e1962..2468a53 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 4f82b3e..b300ea6 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 039aa7c..5e0b27d 100644
--- a/app/views/todos/list_deferred.html.erb
+++ b/app/views/todos/list_deferred.html.erb
@@ -1,7 +1,7 @@
 <div id="display_box">
 
   <div id="tickler-empty-nd" style="display:<%= (@count == 0) ? 'block' : 'none'%>;">
-    <div class="message"><p>Currently there are no deferred actions.</p></div>
+    <div class="message"><p><%= t('todos.no_deferred_actions') %></p></div>
   </div>
 
   <%= 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 4c04a2e..dd02c9b 100644
--- a/app/views/todos/mobile_list_deferred.rhtml
+++ b/app/views/todos/mobile_list_deferred.rhtml
@@ -1,5 +1,5 @@
 <% if @count == 0 -%>
-<div class="message"><p>Currently there are no deferred actions.</p></div>
+<div class="message"><p><%= t('todos.no_deferred_actions') %></p></div>
 <% end -%>
 <%= render :partial => "contexts/mobile_context", :collection => @contexts, 
             :locals => { :collapsible => true } -%>
\ No newline at end of file
diff --git a/app/views/users/nosignup.en.html.erb b/app/views/users/nosignup.en.html.erb
new file mode 100644
index 0000000..b886ae0
--- /dev/null
+++ b/app/views/users/nosignup.en.html.erb
@@ -0,0 +1,5 @@
+<div title="No signups" id="signupform" class="form">
+<h3>No Signups</h3>
+<p>You don't have permission to sign up for a new account.</p> 
+<p>Please contact the site administrator <%= mail_to "#{@admin_email}", "by email", :encode => "hex" %> to get permission.</p>
+</div>
diff --git a/app/views/users/nosignup.html.erb b/app/views/users/nosignup.html.erb
deleted file mode 100644
index b886ae0..0000000
--- a/app/views/users/nosignup.html.erb
+++ /dev/null
@@ -1,5 +0,0 @@
-<div title="No signups" id="signupform" class="form">
-<h3>No Signups</h3>
-<p>You don't have permission to sign up for a new account.</p> 
-<p>Please contact the site administrator <%= mail_to "#{@admin_email}", "by email", :encode => "hex" %> to get permission.</p>
-</div>
diff --git a/config/environment.rb b/config/environment.rb
index 55352f1..4861587 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 0000000..091714d
--- /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&auml;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&uuml;gen"
+    to_new_project_page: "Zu neuem Projekt weiterleiten"
+    delete_project_title: "Projekt l&ouml;schen"
+    delete_project: "Projekt l&ouml;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 &lsquo;{{tag_name}}&rsquo;"
+    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 <strong>'{{description}}'</strong> wurde als <strong>{{completed}}</strong> markiert."
+    action_marked_complete_error: "Die Aktion <strong>'{{description}}'</strong> wurde aufgrund eines Fehlers NICHT als <strong>{{completed}}</strong> 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&auml;chste Aktion erfolgreich gel&ouml;scht"
+    action_deleted_error: "Fehler beim L&ouml;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&auml;llig"
+     due_within_a_week: "diese Woche f&auml;llig"
+     completed: "Aufgaben erledigt"
+    next_actions_description_additions:
+     due_date: "mit einem Datum {{due_date}} oder fr&uuml;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&auml;llig"
+    tags: "Tags (Komma-separiert)"
+    clear_due_date: "F&auml;lligkeitsdatum leeren"
+    show_from: "Anzeigen ab dem"
+    clear_show_from_date: "Datum leeren"
+    depends_on_separate_with_commas: "H&auml;ngt ab von (Komma-separiert)"
+    done: "Erledigt?"
+    no_project: "--Kein Projekt--"
+    due: "F&auml;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&auml;ngigkeit l&ouml;schen (l&ouml;scht nicht die Aufgabe)"
+    completed: "Erledigt"
+    added_dependency: "{{dependency}} als Abh&auml;ngigkeit hinzugef&uuml;gt."
+    set_to_pending: "{{task}} als ausstehend markiert"
+    append_in_this_project: "in diesem Projekt"
+    unable_to_add_dependency: "Abh&auml;ngigkeit nicht hinzuf&uuml;gbar"
+    calendar:
+      due_today: "Heute zu erledigen"
+      no_actions_due_today: "Heute sind keine Aufgaben f&auml;llig"
+      due_this_week: "Die restliche Woche zu erledigen"
+      due_next_week: "N&auml;chste Woche f&auml;llig"
+      no_actions_due_next_week: "Keine Aufgaben f&uuml;r die kommende Woche"
+      due_this_month: "Im {{month}} f&auml;llig"
+      no_actions_due_this_month: "Keine Aktionen f&uuml;r den Rest des Monats"
+      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"
+      get_in_ical_format: "Diesen Kalender im iCal Format herunterladen"
+    no_actions_due_this_week: "Keine zu erledigenden Aufgaben f&uuml;r den Rest der Woche"
+    overdue: "&Uuml;berf&auml;llig"
+    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."
+    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: "&Auml;ltere erledigte Aufgaben"
+    older_than_days: "&Auml;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&ouml;scht. Da dies eine wiederkehrende Aktion ist, wurde eine neue erstellt."
+    completed_recurrence_completed: "Es gibt keine weitere Aktion nach der soeben gel&ouml;schten. Die Wiederholung ist abgeschlossen."
+    error_deleting_item: "Beim L&ouml;schen von {{description}} trat ein Fehler auf"
+    no_deferred_actions: "Zur Zeit sind keine zur&uuml;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&ouml;scht."
+    failed_to_delete_user: "L&ouml;schen des Benutzers {{username}} fehlgeschlagen"
+    change_password_title: "TRACKS::Passwort &auml;ndern"
+    password_updated: "Passwort aktualisiert."
+    change_auth_type_title: "TRACKS::Authentifizierungstyp &auml;ndern"
+    openid_url_verified: "Die URL {{url}} wurde erfolgreich als Identit&auml;t verifiziert und Deine Authentifizierung auf OpenID umgestellt."
+    openid_ok_pref_failed: "Die URL {{url}} wurde erfolgreich als Identit&auml;t verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf."
+    auth_type_updated: "Authentifizierungs-Art erfolgreich ge&auml;ndert."
+    auth_type_update_error: "Beim &Auml;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 9ab0fe9..a724358 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -38,6 +38,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 +51,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 +73,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 +102,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 +123,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 +177,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 +208,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 +234,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 +277,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 +301,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 +348,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 +388,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 +398,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 <strong>'{{description}}'</strong> was marked as <strong>{{completed}}</strong>"
+    action_marked_complete_error: "The action <strong>'{{description}}'</strong> was NOT marked as <strong>{{completed}} due to an error on the server.</strong>"
     recurrence:
       daily: "Daily"
       weekly: "Weekly"
@@ -416,13 +455,90 @@ 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_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 0000000..05525e1
--- /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

