From c2d627bb432a665a41310f9c75644dadba45fe51 Mon Sep 17 00:00:00 2001 From: Devin Weaver Date: Thu, 7 Jun 2012 15:54:58 -0400 Subject: [PATCH 01/41] Removes redundent assignment of @new_project --- app/controllers/projects_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 5605fc5c..9fba5216 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -31,7 +31,6 @@ class ProjectsController < ApplicationController @completed_count = current_user.projects.completed.count @no_projects = current_user.projects.empty? current_user.projects.cache_note_counts - @new_project = current_user.projects.build end format.m do @completed_projects = current_user.projects.completed From e71d23555e8986263c129bfaa0103adcb50a5b67 Mon Sep 17 00:00:00 2001 From: Devin Weaver Date: Thu, 7 Jun 2012 15:55:26 -0400 Subject: [PATCH 02/41] Fixes a crash when using the XML API The use of "http://localhost/projects.xml" would crash with missing method 'all' for object 'Array' This is because the variable @projects did not need to use all in the XML formatting since it was already assigned above and is now an array. --- app/controllers/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 9fba5216..e5104a49 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -37,7 +37,7 @@ class ProjectsController < ApplicationController @down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size cookies[:mobile_url]= {:value => request.fullpath, :secure => SITE_CONFIG['secure_cookies']} end - format.xml { render :xml => @projects.all.to_xml( :except => :user_id ) } + format.xml { render :xml => @projects.to_xml( :except => :user_id ) } format.rss do @feed_title = I18n.t('models.project.feed_title') @feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name) From dd0ec129ef4d335402b2b08f1234372ac07ca8be Mon Sep 17 00:00:00 2001 From: Devin Weaver Date: Thu, 7 Jun 2012 15:57:22 -0400 Subject: [PATCH 03/41] Adds functional tests for /projects.xml --- test/functional/projects_controller_test.rb | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 7ec69685..e2fa10a7 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -221,5 +221,39 @@ class ProjectsControllerTest < ActionController::TestCase assert_equal projects(:gardenclean), exposed_projects[1] assert_equal projects(:moremoney), exposed_projects[2] end + + # XML (REST API) + + def test_xml_content + login_as(:admin_user) + get :index, { :format => "xml" } + assert_equal 'application/xml', @response.content_type + # puts @response.body + + assert_xml_select 'projects' do + assert_select 'project', 3 do + assert_select 'name', /.+/ + assert_select 'state', 'active' + end + end + end + + def test_xml_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "xml" } + assert_response 401 + end + + def test_xml_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "xml", :token => 'foo' } + assert_response 401 + end + + def test_xml_not_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "xml", :token => users(:admin_user).token } + assert_response 401 + end end From 5d703975a34403da41fe5b9426d9e2cfab8a6946 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 27 Jun 2012 14:07:57 +0200 Subject: [PATCH 04/41] fix #1292. Make the sort order in project view the same as context view --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index d877dbcc..0ce8b151 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,5 +1,5 @@ class Project < ActiveRecord::Base - has_many :todos, :dependent => :delete_all + has_many :todos, :dependent => :delete_all, :order => 'todos.due IS NULL, todos.due ASC, todos.created_at ASC' has_many :notes, :dependent => :delete_all, :order => "created_at DESC" has_many :recurring_todos From 89f96da623d80c9a952bd1561bc44c88e31b9d7c Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 27 Jun 2012 14:38:03 +0200 Subject: [PATCH 05/41] fix #1290. Actionize and alphabetize did not work for hidden projects --- app/controllers/projects_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 5605fc5c..e67f0bd0 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -288,6 +288,7 @@ class ProjectsController < ApplicationController @projects = current_user.projects.alphabetize(:state => @state) if @state @contexts = current_user.contexts init_not_done_counts(['project']) + init_project_hidden_todo_counts(['project']) if @state == 'hidden' end def actionize @@ -295,6 +296,7 @@ class ProjectsController < ApplicationController @projects = current_user.projects.actionize(:state => @state) if @state @contexts = current_user.contexts init_not_done_counts(['project']) + init_project_hidden_todo_counts(['project']) if @state == 'hidden' end def done_todos From 51da342cdc4af9d6528eebbd483362894c2653af Mon Sep 17 00:00:00 2001 From: tim madden Date: Thu, 10 May 2012 13:53:01 -0500 Subject: [PATCH 06/41] harmonizing todo_tag_list and tag_list, using just the shorter tag_list --- app/assets/javascripts/tracks.js | 3 +-- app/assets/stylesheets/mobile.css | 2 +- app/controllers/todos_controller.rb | 6 +++--- app/views/todos/_edit_form.html.erb | 4 ++-- app/views/todos/_edit_form.m.erb | 4 ++-- app/views/todos/_new_todo_form.html.erb | 4 ++-- features/step_definitions/todo_create_steps.rb | 8 ++++---- features/step_definitions/todo_steps.rb | 6 +++--- test/functional/todos_controller_test.rb | 4 ++-- test/unit/todo_create_params_helper_test.rb | 4 ++-- 10 files changed, 22 insertions(+), 23 deletions(-) diff --git a/app/assets/javascripts/tracks.js b/app/assets/javascripts/tracks.js index 47a4a4be..8bb7e154 100644 --- a/app/assets/javascripts/tracks.js +++ b/app/assets/javascripts/tracks.js @@ -35,7 +35,7 @@ var TracksForm = { $('#project_name').html(name); }, set_tag_list: function (name) { - $('input#todo_tag_list').val(name); + $('input#tag_list').val(name); }, set_tag_list_for_multi_add: function (name) { $('#multi_tag_list').val(name); @@ -252,7 +252,6 @@ var TracksPages = { ContextItems.setup_autocomplete_for_contexts('input[name=context_name]'); ContextItems.setup_autocomplete_for_contexts('input[id="project_default_context_name"]'); TracksPages.setup_autocomplete_for_tag_list('input[name=tag_list]'); // todo edit form - TracksPages.setup_autocomplete_for_tag_list('input[name=todo_tag_list]'); // new todo form TracksPages.setup_autocomplete_for_tag_list('input[id="project_default_tags"]'); TodoItems.setup_autocomplete_for_predecessor(); }, diff --git a/app/assets/stylesheets/mobile.css b/app/assets/stylesheets/mobile.css index cf05eea6..33e0e1f6 100644 --- a/app/assets/stylesheets/mobile.css +++ b/app/assets/stylesheets/mobile.css @@ -230,7 +230,7 @@ table.c { display:inline; } -input#todo_description, input#todo_tag_list, textarea#todo_notes, select#todo_project_id, select#todo_context_id { +input#todo_description, input#tag_list, textarea#todo_notes, select#todo_project_id, select#todo_context_id { width: 95%; } diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 8660eae8..17eb5664 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -1269,8 +1269,8 @@ class TodosController < ApplicationController end def update_tags - if params[:todo_tag_list] - @todo.tag_with(params[:todo_tag_list]) + if params[:tag_list] + @todo.tag_with(params[:tag_list]) @todo.tags(true) #force a reload for proper rendering end end @@ -1423,7 +1423,7 @@ class TodosController < ApplicationController end def tag_list - @params['todo_tag_list'] + @params['tag_list'] end def predecessor_list diff --git a/app/views/todos/_edit_form.html.erb b/app/views/todos/_edit_form.html.erb index c0f8319a..c46548fc 100644 --- a/app/views/todos/_edit_form.html.erb +++ b/app/views/todos/_edit_form.html.erb @@ -30,8 +30,8 @@ - - <%= text_field_tag 'todo_tag_list', tag_list_text, :id => dom_id(@todo, 'todo_tag_list'), :size => 30, :tabindex => next_tab_index %> + + <%= text_field_tag 'tag_list', tag_list_text, :id => dom_id(@todo, 'tag_list'), :size => 30, :tabindex => next_tab_index %>
diff --git a/app/views/todos/_edit_form.m.erb b/app/views/todos/_edit_form.m.erb index 93b6fc0e..83e90d23 100644 --- a/app/views/todos/_edit_form.m.erb +++ b/app/views/todos/_edit_form.m.erb @@ -6,8 +6,8 @@ <% this_year = current_user.time.to_date.strftime("%Y").to_i -%>

<%= text_field( "todo", "description", "tabindex" => 1, "maxlength" => 100, "size" => 50) %> -

-<%= text_field_tag "todo_tag_list", @tag_list_text, :size => 50, :tabindex => 2 %> +

+<%= text_field_tag "tag_list", @tag_list_text, :size => 50, :tabindex => 2 %>

<%= unless @mobile_from_context collection_select( "todo", "context_id", @contexts, "id", "name", {}, {"tabindex" => 3} ) diff --git a/app/views/todos/_new_todo_form.html.erb b/app/views/todos/_new_todo_form.html.erb index 507b1980..4def4af2 100644 --- a/app/views/todos/_new_todo_form.html.erb +++ b/app/views/todos/_new_todo_form.html.erb @@ -30,9 +30,9 @@ - + <%= hidden_field_tag "initial_tag_list", @initial_tags%> - <%= text_field_tag "todo_tag_list", @initial_tags, :size => 30, :tabindex => next_tab_index %> + <%= text_field_tag "tag_list", @initial_tags, :size => 30, :tabindex => next_tab_index %> <%= content_tag("div", "", :id => "tag_list_auto_complete", :class => "auto_complete") %>
diff --git a/features/step_definitions/todo_create_steps.rb b/features/step_definitions/todo_create_steps.rb index d3b560e5..d9391daf 100644 --- a/features/step_definitions/todo_create_steps.rb +++ b/features/step_definitions/todo_create_steps.rb @@ -215,7 +215,7 @@ end When /^I submit a new action with description "([^"]*)" and the tags "([^"]*)" in the context "([^"]*)"$/ do |description, tags, context_name| fill_in "todo[description]", :with => description - fill_in "todo_tag_list", :with => tags + fill_in "tag_list", :with => tags # fill_in does not seem to work when the field is prefilled with something. Empty the field first clear_context_name_from_next_action_form @@ -231,7 +231,7 @@ When /^I submit a new action with description "([^"]*)" to project "([^"]*)" wit fill_in "todo_project_name", :with => project_name fill_in "todo_context_name", :with => context_name - fill_in "todo_tag_list", :with => tags + fill_in "tag_list", :with => tags submit_next_action_form end @@ -263,7 +263,7 @@ When /^I submit a new deferred action with description "([^"]*)" and the tags "( clear_context_name_from_next_action_form fill_in "todo_context_name", :with => context_name - fill_in "todo_tag_list", :with => tags + fill_in "tag_list", :with => tags fill_in "todo[show_from]", :with => format_date(@current_user.time + 1.week) submit_next_action_form end @@ -276,7 +276,7 @@ When /^I submit a new deferred action with description "([^"]*)" to project "([^ fill_in "todo_project_name", :with => project_name fill_in "todo_context_name", :with => context_name - fill_in "todo_tag_list", :with => tags + fill_in "tag_list", :with => tags fill_in "todo[show_from]", :with => format_date(@current_user.time + 1.week) submit_next_action_form diff --git a/features/step_definitions/todo_steps.rb b/features/step_definitions/todo_steps.rb index 5e0c548f..aa0c5cf9 100644 --- a/features/step_definitions/todo_steps.rb +++ b/features/step_definitions/todo_steps.rb @@ -122,12 +122,12 @@ Then /^the default context of the new todo form should be "([^"]*)"$/ do |contex end Then /^the tag field in the new todo form should be empty$/ do - xpath= "//form[@id='todo-form-new-action']/input[@id='todo_tag_list']" + xpath= "//form[@id='todo-form-new-action']/input[@id='tag_list']" page.find(:xpath, xpath).value.blank?.should be_true end Then /^the tag field in the new todo form should be "([^"]*)"$/ do |tag_list| - xpath= "//form[@id='todo-form-new-action']/input[@id='todo_tag_list']" + xpath= "//form[@id='todo-form-new-action']/input[@id='tag_list']" tag_list.should == page.find(:xpath, xpath).value end @@ -161,4 +161,4 @@ Then /^I should (see|not see) the notes of "([^"]*)"$/ do |visible, todo_descrip todo.should_not be_nil page.find("div#notes_todo_#{todo.id}").send(visible=="see" ? "should" : "should_not", be_visible) -end \ No newline at end of file +end diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index 6cbae911..a9ffd45e 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -49,7 +49,7 @@ class TodosControllerTest < ActionController::TestCase assert_difference 'Todo.count' do put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ "notes"=>"", "description"=>"test tags", "due"=>"30/11/2006"}, - "todo_tag_list"=>"1234,5667,9876" + "tag_list"=>"1234,5667,9876" # default has_many_polymorphs will fail on these high numbers as tags with those id's do not exist end t = assigns['todo'] @@ -63,7 +63,7 @@ class TodosControllerTest < ActionController::TestCase assert_difference 'Todo.count' do put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ "notes"=>"", "description"=>"test tags", "due"=>"30/11/2006"}, - "todo_tag_list"=>"a,,b" + "tag_list"=>"a,,b" # default has_many_polymorphs will fail on the empty tag end t = assigns['todo'] diff --git a/test/unit/todo_create_params_helper_test.rb b/test/unit/todo_create_params_helper_test.rb index 7b981b88..3251150a 100644 --- a/test/unit/todo_create_params_helper_test.rb +++ b/test/unit/todo_create_params_helper_test.rb @@ -34,7 +34,7 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase end def test_tag_list_accessor - params = { 'todo' => { }, 'todo_tag_list' => 'foo, bar'} + params = { 'todo' => { }, 'tag_list' => 'foo, bar'} prefs = users(:admin_user).prefs params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) assert_equal('foo, bar', params_helper.tag_list) @@ -133,4 +133,4 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase assert_equal false, params_helper.context_specified_by_name? end -end \ No newline at end of file +end From a98f8be27983e02edefaa986895f5d9f1ecc8603 Mon Sep 17 00:00:00 2001 From: Tim Madden Date: Fri, 11 May 2012 22:46:28 -0500 Subject: [PATCH 07/41] fixing a broken i18n reference --- app/models/recurring_todo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/recurring_todo.rb b/app/models/recurring_todo.rb index 82d8e2d0..88f328a2 100644 --- a/app/models/recurring_todo.rb +++ b/app/models/recurring_todo.rb @@ -411,7 +411,7 @@ class RecurringTodo < ActiveRecord::Base return I18n.t("todos.recurrence.pattern.on_work_days") else if every_other1 > 1 - return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.days") + return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.days_midsentence.other") else return I18n.t("todos.recurrence.pattern.every_day") end From 0b1d521bbfd1858603951e3d314ed572ccd18976 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 27 Jun 2012 21:40:12 +0200 Subject: [PATCH 08/41] ugly fix for deprecation warnings fopr mouseover and fix failing tests --- app/helpers/todos_helper.rb | 12 ++++++++++-- app/views/layouts/standard.html.erb | 2 +- app/views/preferences/_authentication.html.erb | 2 +- app/views/stats/_tags.html.erb | 14 ++++++-------- config/routes.rb | 5 ++++- test/functional/preferences_controller_test.rb | 3 +++ test/functional/stats_controller_test.rb | 8 +++++--- test/functional/users_controller_test.rb | 17 ++++++++++------- 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index bc1e24a2..917ced19 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -16,8 +16,12 @@ module TodosHelper end def remote_delete_menu_item(todo) + # TODO: what is the current way to do mouseover with css? return link_to( - image_tag("delete_off.png", :mouseover => "delete_on.png", :alt => t('todos.delete'), :align => "absmiddle")+" "+t('todos.delete'), + image_tag("delete_off.png", + :onmouseover => "this.src='#{path_to_image("delete_on.png")}'", + :onmouseout => "this.src='#{path_to_image("delete_off.png")}'", + :alt => t('todos.delete'), :align => "absmiddle")+" "+t('todos.delete'), {:controller => 'todos', :action => 'destroy', :id => todo.id}, :class => "icon_delete_item", :id => "delete_#{dom_id(todo)}", @@ -59,7 +63,11 @@ module TodosHelper end def image_tag_for_defer(days) - image_tag("defer_#{days}_off.png", :mouseover => "defer_#{days}.png", :alt => t('todos.defer_x_days', :count => days), :align => "absmiddle")+" "+t('todos.defer_x_days', :count => days) + # TODO: what is the current way to do mouseover with css? + image_tag("defer_#{days}_off.png", + :onmouseover => "this.src='#{path_to_image("defer_#{days}.png")}'", + :onmouseout => "this.src='#{path_to_image("defer_#{days}_off.png")}'", + :alt => t('todos.defer_x_days', :count => days), :align => "absmiddle")+" "+t('todos.defer_x_days', :count => days) end def collapsed_notes_image(todo) diff --git a/app/views/layouts/standard.html.erb b/app/views/layouts/standard.html.erb index 3e80e184..3ea698e8 100644 --- a/app/views/layouts/standard.html.erb +++ b/app/views/layouts/standard.html.erb @@ -8,7 +8,7 @@ <%= csrf_meta_tag %> <%= auto_discovery_link_tag(:rss, {:controller => "todos", :action => "index", :format => 'rss', :token => "#{current_user.token}"}, {:title => t('layouts.next_actions_rss_feed')}) %> - + <%= @page_title %> diff --git a/config/routes.rb b/config/routes.rb index 1eaf7d6c..3dc52191 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -68,14 +68,14 @@ Tracksapp::Application.routes.draw do match 'calendar' => "todos#calendar" match 'done' => "stats#done", :as => 'done_overview' - match 'data' => "data#index" + match 'data' => "data#index" match 'data/csv_notes' => 'data#csv_notes' match 'data/yaml_export' => 'data#yaml_export' match 'integrations' => "integrations#index" match 'integrations/rest_api' => "integrations#rest_api", :as => 'rest_api_docs' match 'integrations/cloudmailin' => 'integrations#cloudmailin' - match 'integrations/search_plugin.xml' => "integrations#search_plugin", :as => 'search_plugin' + match 'integrations/search_plugin' => "integrations#search_plugin", :as => 'search_plugin' match 'integrations/google_gadget.xml' => 'integrations#google_gadget', :as => 'google_gadget' match 'integrations/get_applescript1.js' => 'integrations#get_applescript1' match 'integrations/get_applescript2.js' => 'integrations#get_applescript2' From 6fd369b91e638ef818272355638b88caabf4e96e Mon Sep 17 00:00:00 2001 From: Michael Witrant Date: Sat, 7 Jul 2012 10:27:59 +0200 Subject: [PATCH 14/41] fixed AddRenderedNotes migration on Rails > 3.1 --- db/migrate/20120412072508_add_rendered_notes.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/db/migrate/20120412072508_add_rendered_notes.rb b/db/migrate/20120412072508_add_rendered_notes.rb index 25fa4603..bbf813c4 100644 --- a/db/migrate/20120412072508_add_rendered_notes.rb +++ b/db/migrate/20120412072508_add_rendered_notes.rb @@ -9,7 +9,11 @@ class AddRenderedNotes < ActiveRecord::Migration # Call save! on each todo to force generation of rendered_todos i=0; max = Todo.all.count; start = Time.now Todo.all.each do |todo| - todo.save(false) + if Rails.version < '3.0' + todo.save(false) + else + todo.save(:validate => false) + end i = i + 1 if i%250==0 elapsed_sec = (Time.now-start) From 0e2634526d75aeef204f0a850e8170d7e453996b Mon Sep 17 00:00:00 2001 From: Michael Witrant Date: Sat, 7 Jul 2012 10:39:42 +0200 Subject: [PATCH 15/41] disabled autocomplete on new password field --- app/views/users/_update_password.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/_update_password.html.erb b/app/views/users/_update_password.html.erb index 1bb6ecfe..09e044b5 100644 --- a/app/views/users/_update_password.html.erb +++ b/app/views/users/_update_password.html.erb @@ -1,4 +1,4 @@
-<%= password_field "user", "password", :size => 40 %>
+<%= password_field "user", "password", :size => 40, :autocomplete => "off" %>

-<%= password_field "user", "password_confirmation", :size => 40 %>
+<%= password_field "user", "password_confirmation", :size => 40, :autocomplete => "off" %>
From 017e1761cae566f87912039a5870e96a3e9bcf73 Mon Sep 17 00:00:00 2001 From: Michael Witrant Date: Sat, 7 Jul 2012 11:34:12 +0200 Subject: [PATCH 16/41] added script to rewrite locales utf8 --- lib/tasks/rewrite_locales_utf8.rake | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 lib/tasks/rewrite_locales_utf8.rake diff --git a/lib/tasks/rewrite_locales_utf8.rake b/lib/tasks/rewrite_locales_utf8.rake new file mode 100644 index 00000000..04dee515 --- /dev/null +++ b/lib/tasks/rewrite_locales_utf8.rake @@ -0,0 +1,17 @@ +task :rewrite_locales_utf8 do + require 'base64' + Dir[Rails.root.join("config/locales/*.yml")].each do |path| + content = File.read(path) + content.force_encoding('utf-8') + content.gsub! /\\x([A-Fa-f0-9]{2})/ do |hex| + Integer(hex[2..3], 16).chr + end + content.gsub! /!binary \|\n\s+(.+?)\n\n/m do |match| + decoded = Base64.decode64($1) + decoded.gsub! /"/, '\\"' + "\"#{decoded}\"\n" + end + content = content.force_encoding('utf-8') + File.open(path, 'w') { |f| f.write content } + end +end From 6f5612e98df228bd9a2ec5edd099e8d88d4812fb Mon Sep 17 00:00:00 2001 From: Michael Witrant Date: Sat, 7 Jul 2012 11:34:27 +0200 Subject: [PATCH 17/41] rewritten locales in utf8 --- config/locales/cz.yml | 1809 +++++++++------------- config/locales/de.yml | 362 +++-- config/locales/en.yml | 2 +- config/locales/es.yml | 260 ++-- config/locales/fr.yml | 790 +++++----- config/locales/he.yml | 3392 ++++++++++------------------------------- config/locales/nl.yml | 12 +- 7 files changed, 2170 insertions(+), 4457 deletions(-) diff --git a/config/locales/cz.yml b/config/locales/cz.yml index 17fa2b21..3930a903 100755 --- a/config/locales/cz.yml +++ b/config/locales/cz.yml @@ -1,68 +1,54 @@ --- cz: layouts: - toggle_contexts_title: "Zobraz\xC3\xAD/skryje sbalen\xC3\xA9 kontexty" - toggle_contexts: "P\xC5\x99epnout sbalen\xC3\xA9 kontexty" - toggle_notes: "Zobrazit/skr\xC3\xBDt pozn\xC3\xA1mky" - next_actions_rss_feed: "RSS feed aktu\xC3\xA1ln\xC3\xADch \xC3\xBAkol\xC5\xAF" - toggle_notes_title: "Zobraz\xC3\xAD/skryje v\xC5\xA1echny pozn\xC3\xA1mky" + toggle_contexts_title: "Zobrazí/skryje sbalené kontexty" + toggle_contexts: "Přepnout sbalené kontexty" + toggle_notes: "Zobrazit/skrýt poznámky" + next_actions_rss_feed: "RSS feed aktuálních úkolů" + toggle_notes_title: "Zobrazí/skryje všechny poznámky" mobile_navigation: - new_action: !binary | - MC1Ob3bDvSDDumtvbA== - - logout: "Odhl\xC3\xA1sit" + new_action: "0-Nový úkol" + logout: "Odhlásit" feeds: Feedy - starred: !binary | - NC1IdsSbemRpxI1reQ== - + starred: "4-Hvězdičky" projects: 3-Projekty tickler: Tickler contexts: 2-Kontexty - home: "1-Dom\xC5\xAF" + home: "1-Domů" navigation: - manage_users_title: "P\xC5\x99idat nebo smazat u\xC5\xBEivatele" - recurring_todos: "Opakuj\xC3\xADc\xC3\xAD se \xC3\xBAkoly" + manage_users_title: "Přidat nebo smazat uživatele" + recurring_todos: "Opakující se úkoly" api_docs: REST API Dokumenty help: "?" feeds: Feedy - starred: "S hv\xC4\x9Bzdou" + starred: "S hvězdou" stats: Statistiky - notes_title: "Zobrazit v\xC5\xA1echny pozn\xC3\xA1mky" - manage_users: !binary | - U3Byw6F2YSB1xb5pdmF0ZWzFrw== - + notes_title: "Zobrazit všechny poznámky" + manage_users: "Správa uživatelů" tickler_title: Tickler admin: n/d - preferences: "Nastaven\xC3\xAD" + preferences: "Nastavení" integrations_: Integrovat Tracks export_title: Import a export dat - calendar_title: !binary | - S2FsZW5kw6HFmSBkYXRvdmFuw71jaCDDumtvbMWv - - feeds_title: "Seznam dostupn\xC3\xBDch feed\xC5\xAF" - stats_title: "Zobraz\xC3\xAD statistiky \xC3\xBAkol\xC5\xAF" + calendar_title: "Kalendář datovaných úkolů" + feeds_title: "Seznam dostupných feedů" + stats_title: "Zobrazí statistiky úkolů" tickler: Tickler - home_title: !binary | - RG9txa8= - - starred_title: "Zobraz\xC3\xAD \xC3\xBAkoly s hv\xC4\x9Bzdi\xC4\x8Dkou" - recurring_todos_title: "Spr\xC3\xA1va opakovan\xC3\xBDch \xC3\xBAkol\xC5\xAF" - completed_tasks: "Hotov\xC3\xA9" - view: "Uk\xC3\xA1zat" - organize: "Spr\xC3\xA1va" - completed_tasks_title: "Hotov\xC3\xA9 \xC3\xBAkoly" - home: !binary | - RG9txa8= - + home_title: "Domů" + starred_title: "Zobrazí úkoly s hvězdičkou" + recurring_todos_title: "Správa opakovaných úkolů" + completed_tasks: "Hotové" + view: "Ukázat" + organize: "Správa" + completed_tasks_title: "Hotové úkoly" + home: "Domů" export: Export contexts_title: Kontexty - preferences_title: "Zobraz\xC3\xAD mo\xC5\xBEnosti nastaven\xC3\xAD" + preferences_title: "Zobrazí možnosti nastavení" search: Hledat - review_title: "Prov\xC3\xA9st revizi" + review_title: "Provést revizi" projects_title: Projekty - calendar: !binary | - S2FsZW5kw6HFmQ== - + calendar: "Kalendář" number: format: separator: . @@ -80,9 +66,7 @@ cz: gb: GB byte: one: Byte - other: !binary | - Qnl0xa8= - + other: "Bytů" mb: MB percentage: format: @@ -98,937 +82,635 @@ cz: precision: 2 delimiter: "," common: - recurring_todos: "Opakovan\xC3\xA9 \xC3\xBAkoly" - back: !binary | - WnDEm3Q= - - actions: !binary | - w5prb2x5 - - third: !binary | - VMWZZXTDrQ== - - add: "P\xC5\x99idat" - previous: !binary | - UMWZZWRjaG96w60= - - go_back: !binary | - WnDEm3Q= - - logout: "Odhl\xC3\xA1sit" - second: !binary | - RHJ1aMO9 - - none: !binary | - xb3DoWRuw70= - - week: !binary | - dMO9ZGVu - - optional: "voliteln\xC3\xA9" - deferred: !binary | - b2Rsb8W+ZW7DqQ== - - show_all: "Zobrazit v\xC5\xA1echny" - cancel: "Zru\xC5\xA1it" - month: !binary | - bcSbc8OtYw== - + recurring_todos: "Opakované úkoly" + back: "Zpět" + actions: "Úkoly" + third: "Třetí" + add: "Přidat" + previous: "Předchozí" + go_back: "Zpět" + logout: "Odhlásit" + second: "Druhý" + none: "Žádný" + week: "týden" + optional: "volitelné" + deferred: "odložené" + show_all: "Zobrazit všechny" + cancel: "Zrušit" + month: "měsíc" actions_midsentence: - one: !binary | - w7prb2zFrw== - - other: !binary | - w5prb2x5 - - zero: !binary | - w5prb2x5 - - notes: "Pozn\xC3\xA1mky" + one: "úkolů" + other: "Úkoly" + zero: "Úkoly" + notes: "Poznámky" server_error: Nastala chyba na serveru. - forum: !binary | - RsOzcnVt - + forum: "Fórum" projects: Projekty - last: "Posledn\xC3\xAD" + last: "Poslední" review: Revize - action: !binary | - w5prb2w= - + action: "Úkol" days_midsentence: one: den - other: !binary | - ZG7DrQ== - - zero: !binary | - ZG7DrQ== - + other: "dní" + zero: "dní" project: Projekt - contribute: !binary | - UMWZaXNwxJt0 - + contribute: "Přispět" ok: Ok - website: "Webov\xC3\xA1 str\xC3\xA1nka" - first: !binary | - UHJ2bsOt - + website: "Webová stránka" + first: "První" note: - one: !binary | - MSBuYSB2xJtkb23DrQ== - - other: "%{count} na v\xC4\x9Bdomy" - zero: !binary | - MCBuYSB2xJtkb23DrQ== - + one: "1 na vědomí" + other: "%{count} na vědomy" + zero: "0 na vědomí" numbered_step: Krok %{number} - create: "Vytvo\xC5\x99it" + create: "Vytvořit" sort: - by_task_count_title: "\xC5\x98adit podle po\xC4\x8Dtu \xC3\xBAkol\xC5\xAF" - by_task_count_title_confirm: "Ur\xC4\x8Dit\xC4\x9B chcete \xC5\x99adit tyto projekty podle po\xC4\x8Dtu \xC3\xBAkol\xC5\xAF? St\xC3\xA1vaj\xC3\xADc\xC3\xAD po\xC5\x99ad\xC3\xAD bude ztraceno." - alphabetically: "Abecedn\xC4\x9B" - sort: !binary | - xZhhZGl0 - - alphabetically_title: "Se\xC5\x99adit projekty abecedn\xC4\x9B" - alphabetically_confirm: "Ur\xC4\x8Dit\xC4\x9B chcete \xC5\x99adit tyto projekty abecedn\xC4\x9B? St\xC3\xA1vaj\xC3\xADc\xC3\xAD po\xC5\x99ad\xC3\xAD bude ztraceno." - by_task_count: "Podle po\xC4\x8Dtu \xC3\xBAkol\xC5\xAF" - todo: !binary | - w7prb2w= - - months: !binary | - bcSbc8OtY2U= - - errors_with_fields: !binary | - TmFzdGFseSBwb3TDrcW+ZSBzIG7DoXNsZWR1asOtY8OtbWkgcG9sw63EjWt5 - Og== - + by_task_count_title: "Řadit podle počtu úkolů" + by_task_count_title_confirm: "Určitě chcete řadit tyto projekty podle počtu úkolů? Stávající pořadí bude ztraceno." + alphabetically: "Abecedně" + sort: "Řadit" + alphabetically_title: "Seřadit projekty abecedně" + alphabetically_confirm: "Určitě chcete řadit tyto projekty abecedně? Stávající pořadí bude ztraceno." + by_task_count: "Podle počtu úkolů" + todo: "úkol" + months: "měsíce" + errors_with_fields: "Nastaly potíže s následujícími políčky:" description: Popis - next: !binary | - RGFsxaHDrQ== - - fourth: !binary | - xIx0dnJ0w70= - - drag_handle: !binary | - Q0hZxaQgTcSa - + next: "Další" + fourth: "Čtvrtý" + drag_handle: "CHYŤ MĚ" context: Kontext contexts: Kontexty bugs: Chyby - update: "Ulo\xC5\xBEit" - weeks: !binary | - dMO9ZG55 - - forth: !binary | - xIx0dnJ0w70= - + update: "Uložit" + weeks: "týdny" + forth: "Čtvrtý" wiki: Wiki email: Email - ajaxError: "Chyba \xC4\x8Dten\xC3\xAD ze serveru" + ajaxError: "Chyba čtení ze serveru" search: Hledat not_available_abbr: n/a integrations: opensearch_description: Prohledat Tracks - applescript_next_action_prompt: "Popis \xC3\xBAkolu:" + applescript_next_action_prompt: "Popis úkolu:" gmail_description: Gadget pro Tracks do Gmailu - applescript_success_after_id: "vytvo\xC5\x99en" - applescript_success_before_id: "Nov\xC3\xBD \xC3\xBAkol s ID" + applescript_success_after_id: "vytvořen" + applescript_success_before_id: "Nový úkol s ID" activerecord: attributes: project: - name: !binary | - TsOhemV2 - - default_tags: !binary | - VsO9Y2hvesOtIMWhdMOtdGt5 - - default_context_name: "V\xC3\xBDchoz\xC3\xAD kontext" + name: "Název" + default_tags: "Výchozí štítky" + default_context_name: "Výchozí kontext" description: Popis note: - created_at: "Vytvo\xC5\x99eno:" - updated_at: "Aktualizov\xC3\xA1n" + created_at: "Vytvořeno:" + updated_at: "Aktualizován" todo: show_from: Zobrazovat od - predecessors: !binary | - WsOhdmlzw60gbmE= - - notes: "Pozn\xC3\xA1mky" + predecessors: "Závisí na" + notes: "Poznámky" tags: Tagy project: Projekt description: Popis context: Kontext - due: "Pl\xC3\xA1nov\xC3\xA1no na" + due: "Plánováno na" preference: - show_hidden_projects_in_sidebar: "Zobrazovat skryt\xC3\xA9 projekty v sidebaru" - show_hidden_contexts_in_sidebar: "Zobrazovat skryt\xC3\xA9 kontexty v sidebaru" - date_format: "Form\xC3\xA1t data" - sms_context: "V\xC3\xBDchoz\xC3\xAD emailov\xC3\xBD kontext" - verbose_action_descriptors: "Ukecan\xC3\xA9 popisova\xC4\x8De \xC3\xBAkol\xC5\xAF" - staleness_starts: "Jako pro\xC5\xA1l\xC3\xA9 ozna\xC4\x8Dit projekty star\xC5\xA1\xC3\xAD ne\xC5\xBE" - mobile_todos_per_page: "\xC3\x9Akol\xC5\xAF na str\xC3\xA1nku (mobiln\xC3\xAD zobrazen\xC3\xAD)" - show_number_completed: "Po\xC4\x8Det hotov\xC3\xBDch \xC3\xBAkol\xC5\xAF k zobrazen\xC3\xAD" - title_date_format: "Form\xC3\xA1t data nadpisu" - refresh: "Interval obnoven\xC3\xAD str\xC3\xA1nky (v minut\xC3\xA1ch)" - week_starts: !binary | - WmHEjcOhdGVrIHTDvWRuZQ== - - last_name: !binary | - UMWZw61qbWVuw60= - - due_style: "Zobrazen\xC3\xAD datovan\xC3\xBDch \xC3\xBAkol\xC5\xAF" - locale: "Lok\xC3\xA1le" - time_zone: !binary | - xIxhc292w6kgcMOhc21v - + show_hidden_projects_in_sidebar: "Zobrazovat skryté projekty v sidebaru" + show_hidden_contexts_in_sidebar: "Zobrazovat skryté kontexty v sidebaru" + date_format: "Formát data" + sms_context: "Výchozí emailový kontext" + verbose_action_descriptors: "Ukecané popisovače úkolů" + staleness_starts: "Jako prošlé označit projekty starší než" + mobile_todos_per_page: "Úkolů na stránku (mobilní zobrazení)" + show_number_completed: "Počet hotových úkolů k zobrazení" + title_date_format: "Formát data nadpisu" + refresh: "Interval obnovení stránky (v minutách)" + week_starts: "Začátek týdne" + last_name: "Příjmení" + due_style: "Zobrazení datovaných úkolů" + locale: "Lokále" + time_zone: "Časové pásmo" sms_email: SMS email - show_project_on_todo_done: "Po spln\xC4\x9Bn\xC3\xAD \xC3\xBAkolu p\xC5\x99ej\xC3\xADt na projekt" - show_completed_projects_in_sidebar: "Zobrazovat hotov\xC3\xA9 projekty v sidebaru" - first_name: !binary | - Sm3DqW5v - - review_period: "Interval revize projekt\xC5\xAF" + show_project_on_todo_done: "Po splnění úkolu přejít na projekt" + show_completed_projects_in_sidebar: "Zobrazovat hotové projekty v sidebaru" + first_name: "Jméno" + review_period: "Interval revize projektů" user: - last_name: !binary | - Sm3DqW5v - - first_name: !binary | - UMWZw61qbWVuw60= - + last_name: "Jméno" + first_name: "Příjmení" errors: models: project: attributes: name: - blank: "projekt mus\xC3\xAD m\xC3\xADt n\xC3\xA1zev" - too_long: "n\xC3\xA1zev projektu mus\xC3\xAD b\xC3\xBDt krat\xC5\xA1\xC3\xAD ne\xC5\xBE 256 znak\xC5\xAF" - taken: "u\xC5\xBE existuje" + blank: "projekt musí mít název" + too_long: "název projektu musí být kratší než 256 znaků" + taken: "už existuje" messages: - record_invalid: "Probl\xC3\xA9m s daty: %{errors}" - greater_than_or_equal_to: "mus\xC3\xAD b\xC3\xBDt v\xC4\x9Bt\xC5\xA1\xC3\xAD nebo rovno %{count}" - confirmation: "se neshoduje s ov\xC4\x9B\xC5\x99en\xC3\xADm" - less_than_or_equal_to: "mus\xC3\xAD b\xC3\xBDt men\xC5\xA1\xC3\xAD nebo rovno %{count}" - blank: !binary | - bmVzbcOtIGLDvXQgcHLDoXpkbsOp - - exclusion: "je rezervovan\xC3\xA9" - invalid: "nesm\xC3\xAD obsahovat \xC4\x8D\xC3\xA1rku (',')" + record_invalid: "Problém s daty: %{errors}" + greater_than_or_equal_to: "musí být větší nebo rovno %{count}" + confirmation: "se neshoduje s ověřením" + less_than_or_equal_to: "musí být menší nebo rovno %{count}" + blank: "nesmí být prázdné" + exclusion: "je rezervované" + invalid: "nesmí obsahovat čárku (',')" odd: must be odd even: must be even - empty: !binary | - bmVzbcOtIGLDvXQgcHLDoXpkbsOp - - too_short: "je p\xC5\x99\xC3\xADli\xC5\xA1 kr\xC3\xA1tk\xC3\xA9 (minimum je %{count} znak\xC5\xAF)" - wrong_length: "nem\xC3\xA1 spr\xC3\xA1vnou d\xC3\xA9lku (m\xC3\xA1 m\xC3\xADt %{count} znak\xC5\xAF)" - less_than: !binary | - bXVzw60gYsO9dCBtZW7FocOtIG5lxb4gJXtjb3VudH0= - - greater_than: !binary | - bXVzw60gYsO9dCB2xJt0xaHDrSBuZcW+ICV7Y291bnR9 - - equal_to: "se mus\xC3\xAD rovnat %{count}" - accepted: "mus\xC3\xAD b\xC3\xBDt akceptov\xC3\xA1no" - too_long: "je p\xC5\x99\xC3\xADli\xC5\xA1 dlouh\xC3\xA9 (maximum je %{count} znak\xC5\xAF)" - taken: "u\xC5\xBE bylo zabr\xC3\xA1no" - inclusion: "nen\xC3\xAD na seznamu" - not_a_number: !binary | - bmVuw60gxI3DrXNsbw== - + empty: "nesmí být prázdné" + too_short: "je příliš krátké (minimum je %{count} znaků)" + wrong_length: "nemá správnou délku (má mít %{count} znaků)" + less_than: "musí být menší než %{count}" + greater_than: "musí být větší než %{count}" + equal_to: "se musí rovnat %{count}" + accepted: "musí být akceptováno" + too_long: "je příliš dlouhé (maximum je %{count} znaků)" + taken: "už bylo zabráno" + inclusion: "není na seznamu" + not_a_number: "není číslo" full_messages: format: "%{attribute} %{message}" template: - body: !binary | - TmFzdGFseSBwb3TDrcW+ZSBzIG7DoXNsZWR1asOtY8OtbWkgcG9sw63EjWt5 - Og== - + body: "Nastaly potíže s následujícími políčky:" header: - one: "jedna chyba br\xC3\xA1n\xC3\xAD ulo\xC5\xBEen\xC3\xAD tohoto objektu %{model}" - other: "%{count} chyb br\xC3\xA1n\xC3\xAD ulo\xC5\xBEen\xC3\xAD tohoto objektu %{model}" + one: "jedna chyba brání uložení tohoto objektu %{model}" + other: "%{count} chyb brání uložení tohoto objektu %{model}" data: - import_successful: !binary | - SW1wb3J0IGJ5bCDDunNwxJvFoW7DvS4= - - import_errors: "P\xC5\x99i importu do\xC5\xA1lo k chyb\xC3\xA1m" + import_successful: "Import byl úspěšný." + import_errors: "Při importu došlo k chybám" models: project: feed_title: Projekty - feed_description: "V\xC5\xA1echny projekty u\xC5\xBEivatele %{username}" + feed_description: "Všechny projekty uživatele %{username}" todo: - error_date_must_be_future: "datum mus\xC3\xAD b\xC3\xBDt v budoucnosti" + error_date_must_be_future: "datum musí být v budoucnosti" preference: - due_on: "Pl\xC3\xA1nov\xC3\xA1no na %{date}" - due_in: "Pl\xC3\xA1nov\xC3\xA1no za %{days} dn\xC3\xAD" + due_on: "Plánováno na %{date}" + due_in: "Plánováno za %{days} dní" due_styles: - - "Pl\xC3\xA1nov\xC3\xA1no za ___ dn\xC3\xAD" - - "Pl\xC3\xA1nov\xC3\xA1no na _______" + - "Plánováno za ___ dní" + - "Plánováno na _______" user: - error_context_not_associated: "Kontext %{context} nepat\xC5\x99\xC3\xAD u\xC5\xBEivateli %{user}." - error_project_not_associated: "Projekt %{project} nepat\xC5\x99\xC3\xAD u\xC5\xBEivateli %{user}." + error_context_not_associated: "Kontext %{context} nepatří uživateli %{user}." + error_project_not_associated: "Projekt %{project} nepatří uživateli %{user}." stats: - actions_min_max_completion_days: "Maximum/minimum dn\xC3\xAD na dokon\xC4\x8Den\xC3\xAD je %{min}/%{max}." - totals_hidden_context_count: "a %{count} skryt\xC3\xBDch kontext\xC5\xAF." - actions_avg_created: "Za posledn\xC3\xADch 12 m\xC4\x9Bs\xC3\xADc\xC5\xAF bylo vytvo\xC5\x99eno pr\xC5\xAFm\xC4\x9Brn\xC4\x9B %{count} \xC3\xBAkol\xC5\xAF" - totals_actions_completed: "%{count} z nich je hotov\xC3\xBDch." - tag_cloud_title: !binary | - TXJhayDFoXTDrXRrxa8gcHJvIHbFoWVjaG55IMO6a2x5 - - actions_actions_avg_created_30days: "Za posledn\xC3\xADch 30 dn\xC3\xAD bylo vytvo\xC5\x99eno pr\xC5\xAFm\xC4\x9Brn\xC4\x9B %{count} \xC3\xBAkol\xC5\xAF" - actions_avg_completed: !binary | - YSB1emF2xZllbm8gcHLFr23Em3JuxJsgJXtjb3VudH0gw7prb2zFryB6YSBt - xJtzw61jLg== - - top5_visible_contexts_with_incomplete_actions: "Top 5 viditeln\xC3\xBDch kontext\xC5\xAF s nehotov\xC3\xBDmi \xC3\xBAkoly" - actions: !binary | - w5prb2x5 - + actions_min_max_completion_days: "Maximum/minimum dní na dokončení je %{min}/%{max}." + totals_hidden_context_count: "a %{count} skrytých kontextů." + actions_avg_created: "Za posledních 12 měsíců bylo vytvořeno průměrně %{count} úkolů" + totals_actions_completed: "%{count} z nich je hotových." + tag_cloud_title: "Mrak štítků pro všechny úkly" + actions_actions_avg_created_30days: "Za posledních 30 dní bylo vytvořeno průměrně %{count} úkolů" + actions_avg_completed: "a uzavřeno průměrně %{count} úkolů za měsíc." + top5_visible_contexts_with_incomplete_actions: "Top 5 viditelných kontextů s nehotovými úkoly" + actions: "Úkoly" time_of_day_legend: - number_of_actions: !binary | - UG/EjWV0IMO6a29sxa8= - - time_of_day: "Denn\xC3\xAD doba" - totals_incomplete_actions: "M\xC3\xA1te %{count} nehotov\xC3\xBDch \xC3\xBAkol\xC5\xAF" - totals_deferred_actions: "z nich\xC5\xBE %{count} jsou odlo\xC5\xBEen\xC3\xA9 \xC3\xBAkoly v Ticlkeru" + number_of_actions: "Počet úkolů" + time_of_day: "Denní doba" + totals_incomplete_actions: "Máte %{count} nehotových úkolů" + totals_deferred_actions: "z nichž %{count} jsou odložené úkoly v Ticlkeru" running_time_legend: - actions: !binary | - w5prb2x5 - - percentage: !binary | - UG9kw61s - - weeks: "\xC4\x8Cas b\xC4\x9Bhu \xC3\xBAkolu (t\xC3\xBDdny). Klepn\xC4\x9Bte na sloupec pro dal\xC5\xA1\xC3\xAD info" - totals_action_count: "m\xC3\xA1te celkem %{count} \xC3\xBAkol\xC5\xAF" - tag_cloud_90days_title: "Zna\xC4\x8Dky \xC3\xBAkol\xC5\xAF z posledn\xC3\xADch 90-ti dn\xC3\xAD" - actions_avg_completion_time: "Pro v\xC5\xA1echny va\xC5\xA1e hotov\xC3\xA9 \xC3\xBAkoly je pr\xC5\xAFm\xC4\x9Brn\xC3\xBD \xC4\x8Das dokon\xC4\x8Den\xC3\xAD %{count} dn\xC3\xAD." - tod30: "Denn\xC3\xAD doba (posledn\xC3\xADch 30 dn\xC3\xAD)" - tags: !binary | - xaB0w610a3k= - + actions: "Úkoly" + percentage: "Podíl" + weeks: "Čas běhu úkolu (týdny). Klepněte na sloupec pro další info" + totals_action_count: "máte celkem %{count} úkolů" + tag_cloud_90days_title: "Značky úkolů z posledních 90-ti dní" + actions_avg_completion_time: "Pro všechny vaše hotové úkoly je průměrný čas dokončení %{count} dní." + tod30: "Denní doba (posledních 30 dní)" + tags: "Štítky" projects: Projekty - totals_completed_project_count: "a %{count} je hotov\xC3\xBDch projekt\xC5\xAF." + totals_completed_project_count: "a %{count} je hotových projektů." labels: - month_avg_completed: !binary | - JXttb250aHN9IG3Em3PDrcSNbsOtIHByxa9txJtyIGhvdG92w71jaA== - + month_avg_completed: "%{months} měsíční průměr hotových" completed: Completed - month_avg_created: !binary | - JXttb250aHN9IG3Em3PDrcSNbsOtIHByxa9txJtyIHZ5dHZvxZllbsO9Y2g= - - avg_created: !binary | - cHLFr23Em3JuxJsgdnl0dm/FmWVubw== - - avg_completed: !binary | - cHLFr23Em3JuxJsgdXphdsWZZW5v - - created: "Vytvo\xC5\x99eno" - actions_selected_from_week: "\xC3\x9Akoly vybran\xC3\xA9 z t\xC3\xBDdne " - actions_day_of_week_title: "Den v t\xC3\xBDdnu (v\xC5\xA1echny \xC3\xBAkoly)" - actions_lastyear_title: "\xC3\x9Akoly za posledn\xC3\xADch 12 m\xC4\x9Bs\xC3\xADc\xC5\xAF" - open_per_week: "Aktivn\xC3\xAD (viditeln\xC3\xA9 i skryt\xC3\xA9) dal\xC5\xA1\xC3\xAD akce za t\xC3\xBDden" - action_selection_title: !binary | - VFJBQ0tTOjp2w71ixJtyIMO6a29sxa8= - - totals_project_count: "M\xC3\xA1te %{count} projekt\xC5\xAF." + month_avg_created: "%{months} měsíční průměr vytvořených" + avg_created: "průměrně vytvořeno" + avg_completed: "průměrně uzavřeno" + created: "Vytvořeno" + actions_selected_from_week: "Úkoly vybrané z týdne " + actions_day_of_week_title: "Den v týdnu (všechny úkoly)" + actions_lastyear_title: "Úkoly za posledních 12 měsíců" + open_per_week: "Aktivní (viditelné i skryté) další akce za týden" + action_selection_title: "TRACKS::výběr úkolů" + totals_project_count: "Máte %{count} projektů." legend: - number_of_days: "P\xC5\x99ed kolika dny" - actions: !binary | - w5prb2x5 - - number_of_actions: !binary | - UG/EjWV0IMO6a29sxa8= - - day_of_week: "Den v t\xC3\xBDdnu" - running_time: "\xC4\x8Cas k dokon\xC4\x8Den\xC3\xAD \xC3\xBAkolu (t\xC3\xBDdny)" - percentage: !binary | - UG9kw61s - - months_ago: !binary | - bcSbc8OtY8WvIHpwxJt0 - - current_running_time_of_incomplete_visible_actions: !binary | - QWt0dcOhbG7DrSDEjWFzIGLEm2h1IG5lZG9rb27EjWVuw71jaCB2aWRpdGVs - bsO9Y2ggw7prb2zFrw== - + number_of_days: "Před kolika dny" + actions: "Úkoly" + number_of_actions: "Počet úkolů" + day_of_week: "Den v týdnu" + running_time: "Čas k dokončení úkolu (týdny)" + percentage: "Podíl" + months_ago: "měsíců zpět" + current_running_time_of_incomplete_visible_actions: "Aktuální čas běhu nedokončených viditelných úkolů" tod30_legend: - number_of_actions: !binary | - UG/EjWV0IMO6a29sxa8= - - time_of_day: "Denn\xC3\xAD doba" - totals_context_count: "M\xC3\xA1te %{count} kontext\xC5\xAF." + number_of_actions: "Počet úkolů" + time_of_day: "Denní doba" + totals_context_count: "Máte %{count} kontextů." open_per_week_legend: - actions: !binary | - QWtjw60= - - weeks: !binary | - VMO9ZG55 - + actions: "Akcí" + weeks: "Týdny" actions_last_year_legend: - number_of_actions: !binary | - UG/EjWV0IMO6a2xvbMWv - - months_ago: !binary | - bcSbc8OtY8WvIHpwxJt0 - - top5_contexts: "Top 5 kontext\xC5\xAF" - top10_projects: "Top 10 projekt\xC5\xAF" + number_of_actions: "Počet úklolů" + months_ago: "měsíců zpět" + top5_contexts: "Top 5 kontextů" + top10_projects: "Top 10 projektů" contexts: Kontexty totals: Celkem - click_to_return: "Klepn\xC4\x9Bte %{link} pro n\xC3\xA1vrat ke statistik\xC3\xA1m." - tag_cloud_90days_description: "Tento mrak zahrnuje \xC5\xA1t\xC3\xADtky \xC3\xBAkol\xC5\xAF, kter\xC3\xA9 byly vytvo\xC5\x99eny nebo dokon\xC4\x8Deny v posledn\xC3\xADch 90-ti dnech." - totals_visible_context_count: "Z nich je %{count} viditeln\xC3\xBDch kontext\xC5\xAF" - top10_projects_30days: "Top 10 projekt\xC5\xAF za posledn\xC3\xADch 30 dn\xC3\xAD" - running_time_all: !binary | - QWt0dcOhbG7DrSDEjWFzIGLEm2h1IHbFoWVjaCBuZWhvdG92w71jaCDDumtv - bMWv - - actions_min_completion_time: "Minim\xC3\xA1ln\xC3\xAD \xC4\x8Das k dokon\xC4\x8Den\xC3\xAD je %{time}." - action_completion_time_title: "\xC4\x8Cas dokon\xC4\x8Den\xC3\xAD (v\xC5\xA1echny hotov\xC3\xA9 \xC3\xBAkoly)" - click_to_show_actions_from_week: "Klepn\xC4\x9Bte %{link} pro zobrazen\xC3\xAD \xC3\xBAkol\xC5\xAF z t\xC3\xBDdne %{week} a dal\xC5\xA1\xC3\xADch." - top10_longrunning: !binary | - MTAgbmVqZMOpbGUgYsSbxb7DrWPDrWNoIHByb2pla3TFrw== - - no_actions_selected: !binary | - TmVqc291IHZ5YnLDoW55IMW+w6FkbsOpIMO6a29seS4= - - totals_tag_count: "Na akc\xC3\xADch je um\xC3\xADst\xC4\x9Bno %{count} \xC5\xA1t\xC3\xADtk\xC5\xAF." - actions_further: " a d\xC3\xA1le" + click_to_return: "Klepněte %{link} pro návrat ke statistikám." + tag_cloud_90days_description: "Tento mrak zahrnuje štítky úkolů, které byly vytvořeny nebo dokončeny v posledních 90-ti dnech." + totals_visible_context_count: "Z nich je %{count} viditelných kontextů" + top10_projects_30days: "Top 10 projektů za posledních 30 dní" + running_time_all: "Aktuální čas běhu všech nehotových úkolů" + actions_min_completion_time: "Minimální čas k dokončení je %{time}." + action_completion_time_title: "Čas dokončení (všechny hotové úkoly)" + click_to_show_actions_from_week: "Klepněte %{link} pro zobrazení úkolů z týdne %{week} a dalších." + top10_longrunning: "10 nejdéle běžících projektů" + no_actions_selected: "Nejsou vybrány žádné úkoly." + totals_tag_count: "Na akcích je umístěno %{count} štítků." + actions_further: " a dále" actions_dow_30days_legend: - number_of_actions: !binary | - UG/EjWV0IGFrY8Ot - - day_of_week: "Den v t\xC3\xBDdnu" - totals_first_action: "Od va\xC5\xA1eho prvn\xC3\xADho \xC3\xBAkolu %{date}" - tag_cloud_description: "Tento mrak zahrnuje \xC5\xA1t\xC3\xADtky v\xC5\xA1ech \xC3\xBAkol\xC5\xAF (hotov\xC3\xBDch, nehotov\xC3\xBDch, viditeln\xC3\xBDch i skryt\xC3\xBDch)" - spread_of_actions_for_all_context: "Distribuce v\xC5\xA1ech \xC3\xBAkol\xC5\xAF do kontext\xC5\xAF" - click_to_update_actions: "Klepn\xC4\x9Bte na sloupec v grafu pro zobrazen\xC3\xAD detail\xC5\xAF n\xC3\xAD\xC5\xBEe." + number_of_actions: "Počet akcí" + day_of_week: "Den v týdnu" + totals_first_action: "Od vašeho prvního úkolu %{date}" + tag_cloud_description: "Tento mrak zahrnuje štítky všech úkolů (hotových, nehotových, viditelných i skrytých)" + spread_of_actions_for_all_context: "Distribuce všech úkolů do kontextů" + click_to_update_actions: "Klepněte na sloupec v grafu pro zobrazení detailů níže." click_to_return_link: zde - more_stats_will_appear: "Dal\xC5\xA1\xC3\xAD statistiky se zobraz\xC3\xAD a\xC5\xBE p\xC5\x99ibyde v\xC3\xADce \xC3\xBAkol\xC5\xAF." - actions_avg_completed_30days: "a dokon\xC4\x8Deno pr\xC5\xAFm\xC4\x9Brn\xC4\x9B %{count} \xC3\xBAkol\xC5\xAF za den." - actions_30days_title: "\xC3\x9Akoly za posledn\xC3\xADch 30 dn\xC3\xAD" - no_tags_available: !binary | - xb7DoWRuw6kgxaF0w610a3kgbmVqc291IGRlZmlub3bDoW55 - + more_stats_will_appear: "Další statistiky se zobrazí až přibyde více úkolů." + actions_avg_completed_30days: "a dokončeno průměrně %{count} úkolů za den." + actions_30days_title: "Úkoly za posledních 30 dní" + no_tags_available: "žádné štítky nejsou definovány" index_title: TRACKS::Statistika - actions_dow_30days_title: "Dny v t\xC3\xBDdnu (poslen\xC3\xADch 30 dn\xC3\xAD)" + actions_dow_30days_title: "Dny v týdnu (posleních 30 dní)" actions_day_of_week_legend: - number_of_actions: !binary | - UG/EjWV0IGFrY8Ot - - day_of_week: "Den v t\xC3\xBDdnu" - within_one: "V r\xC3\xA1mci 1." - spread_of_running_actions_for_visible_contexts: "Distribuce b\xC4\x9B\xC5\xBE\xC3\xADc\xC3\xADch \xC3\xBAkol\xC5\xAF do viditeln\xC3\xBDch kontext\xC5\xAF" - actions_last_year: "\xC3\x9Akoly v posledn\xC3\xADm roce" - totals_blocked_actions: "%{count} je z\xC3\xA1visl\xC3\xBDch na dokon\xC4\x8Den\xC3\xAD jin\xC3\xBDch akc\xC3\xAD." - totals_unique_tags: "Z t\xC4\x9Bchto \xC5\xA1t\xC3\xADtk\xC5\xAF je %{count} unik\xC3\xA1tn\xC3\xADch." - totals_active_project_count: "Znich %{count} je aktivn\xC3\xADch projek\xC5\xAF" + number_of_actions: "Počet akcí" + day_of_week: "Den v týdnu" + within_one: "V rámci 1." + spread_of_running_actions_for_visible_contexts: "Distribuce běžících úkolů do viditelných kontextů" + actions_last_year: "Úkoly v posledním roce" + totals_blocked_actions: "%{count} je závislých na dokončení jiných akcí." + totals_unique_tags: "Z těchto štítků je %{count} unikátních." + totals_active_project_count: "Znich %{count} je aktivních projeků" running_time_all_legend: - actions: !binary | - w5prb2x5 - - running_time: "\xC4\x8Cas b\xC4\x9Bhu \xC3\xBAkol\xC5\xAF (t\xC3\xBDdny). Klepn\xC4\x9Bte na sloupec pro dal\xC5\xA1\xC3\xAD info" - percentage: !binary | - UG9kw61s - - other_actions_label: "(ostatn\xC3\xAD)" - totals_hidden_project_count: "%{count} je skryt\xC3\xBDch" - time_of_day: "Denn\xC3\xAD doba (v\xC5\xA1echny \xC3\xBAkoly)" + actions: "Úkoly" + running_time: "Čas běhu úkolů (týdny). Klepněte na sloupec pro další info" + percentage: "Podíl" + other_actions_label: "(ostatní)" + totals_hidden_project_count: "%{count} je skrytých" + time_of_day: "Denní doba (všechny úkoly)" todos: - recurring_action_deleted: "\xC3\x9Akol byl smaz\xC3\xA1n. Proto\xC5\xBEe jde o opakovan\xC3\xBD \xC3\xBAkol, byl vlo\xC5\xBEen nov\xC3\xBD \xC3\xBAkol" + recurring_action_deleted: "Úkol byl smazán. Protože jde o opakovaný úkol, byl vložen nový úkol" show_from: Zobrazovat od - error_starring_recurring: "Nebylo mo\xC5\xBEno ohv\xC4\x9Bzdi\xC4\x8Dkovat opakovan\xC3\xBD \xC3\xBAkol \\'%{description}\\'" - completed_actions: "Hotov\xC3\xA9 \xC3\xBAkoly" - added_new_next_action: !binary | - UMWZaWTDoW4gbm92w70gw7prb2w= - - completed_recurring: "Hotov\xC3\xA9 opakovan\xC3\xA9 \xC3\xBAkoly" - completed_rest_of_previous_month: "Uzav\xC5\x99eno ve zbytku minul\xC3\xA9ho m\xC4\x9Bs\xC3\xADce" - blocked_by: "\xC4\x8Cek\xC3\xA1 na %{predecessors}" - star_action: "Ozna\xC5\x99it hv\xC4\x9Bzdi\xC4\x8Dkou" - completed_recurrence_completed: "Bylo smaz\xC3\xA1no posledn\xC3\xAD opakov\xC3\xA1n\xC3\xAD opakovan\xC3\xA9ho \xC3\xBAkolu. Opakov\xC3\xA1n\xC3\xAD dokon\xC4\x8Deno" - defer_date_after_due_date: "Datum zobrazen\xC3\xAD je a\xC5\xBE po pl\xC3\xA1novan\xC3\xA9m datu \xC3\xBAkolu. Upravte datum \xC3\xBAkolu p\xC5\x99ed dal\xC5\xA1\xC3\xADm pokusem o odplo\xC5\xBEen\xC3\xAD zobrazen\xC3\xAD." - unable_to_add_dependency: "Nepoda\xC5\x99ilo se p\xC5\x99idat z\xC3\xA1vislost" + error_starring_recurring: "Nebylo možno ohvězdičkovat opakovaný úkol \\'%{description}\\'" + completed_actions: "Hotové úkoly" + added_new_next_action: "Přidán nový úkol" + completed_recurring: "Hotové opakované úkoly" + completed_rest_of_previous_month: "Uzavřeno ve zbytku minulého měsíce" + blocked_by: "Čeká na %{predecessors}" + star_action: "Oznařit hvězdičkou" + completed_recurrence_completed: "Bylo smazáno poslední opakování opakovaného úkolu. Opakování dokončeno" + defer_date_after_due_date: "Datum zobrazení je až po plánovaném datu úkolu. Upravte datum úkolu před dalším pokusem o odpložení zobrazení." + unable_to_add_dependency: "Nepodařilo se přidat závislost" done: Hotovo? - star_action_with_description: "ohv\xC4\x9Bzdi\xC4\x8Dkovat \xC3\xBAkol '%{description}'" - tagged_with: "ozna\xC4\x8Deno \xC5\xA1t\xC3\xADtkem ‘%{tag_name}’" + star_action_with_description: "ohvězdičkovat úkol '%{description}'" + tagged_with: "označeno štítkem ‘%{tag_name}’" completed: Hotovo - no_deferred_actions_with: !binary | - xb3DoWRuw6kgb2Rsb8W+ZW7DqSDDumtvbHkgc2UgxaF0w610a2VtICcle3Rh - Z19uYW1lfSc= - - no_hidden_actions: !binary | - xb3DoWRuw6kgc2tyeXTDqSDDumtvbHk= - - edit_action_with_description: "Upravit \xC3\xBAkol '%{description}'" - action_due_on: "(\xC3\xBAkol pl\xC3\xA1nov\xC3\xA1n na %{date})" - list_incomplete_next_actions: "Zabraz\xC3\xAD nehotov\xC3\xA9 \xC3\xBAkoly" - archived_tasks_title: "TRACKS::Archiv hotov\xC3\xBDch \xC3\xBAkol\xC5\xAF" - remove_dependency: "Odstranit z\xC3\xA1vislost (nesma\xC5\xBEe \xC3\xBAkol)" - action_deleted_success: !binary | - w5prb2wgYnlsIMO6c3DEm8WhbsSbIHNtYXrDoW4= - - tags: !binary | - xaB0w610a3kgKG9kZMSbbGVuw6kgxI3DoXJrYW1pKQ== - - delete_recurring_action_title: "Smazat opakovan\xC3\xBD \xC3\xBAkol" - context_changed: "Kontext byl zm\xC4\x9Bn\xC4\x9Bn na %{name}" - new_related_todo_created: "Byl vytvo\xC5\x99en nov\xC3\xBD \xC3\xBAkol pat\xC5\x99\xC3\xADc\xC3\xAD do tohoto opakovan\xC3\xA9ho \xC3\xBAkolu" - mobile_todos_page_title: "V\xC5\xA1echny \xC3\xBAkoly" - add_another_dependency: !binary | - UMWZaWRhdCBkYWzFocOtIHrDoXZpc2xvc3Q= - - removed_predecessor: "Byl odstran\xC4\x9Bn %{successor} jako z\xC3\xA1vislost pro %{predecessor}." - recurring_actions_title: "TRACKS::Opakovan\xC3\xA9 \xC3\xBAkoly" - next_action_needed: "Je pot\xC5\x99eba zadat aspo\xC5\x88 jeden \xC3\xBAkol" - action_saved: !binary | - w5prb2wgdWxvxb5lbg== - - scheduled_overdue: "Napl\xC3\xA1nov\xC3\xA1no zobrazen\xC3\xAD p\xC5\x99ed %{days} dny" - action_deleted_error: "Nepoda\xC5\x99ilo se smazat \xC3\xBAkol" - edit_action: "Upravit \xC3\xBAkol" - added_new_context: "P\xC5\x99id\xC3\xA1n nov\xC3\xBD kontext" + no_deferred_actions_with: "Žádné odložené úkoly se štítkem '%{tag_name}'" + no_hidden_actions: "Žádné skryté úkoly" + edit_action_with_description: "Upravit úkol '%{description}'" + action_due_on: "(úkol plánován na %{date})" + list_incomplete_next_actions: "Zabrazí nehotové úkoly" + archived_tasks_title: "TRACKS::Archiv hotových úkolů" + remove_dependency: "Odstranit závislost (nesmaže úkol)" + action_deleted_success: "Úkol byl úspěšně smazán" + tags: "Štítky (oddělené čárkami)" + delete_recurring_action_title: "Smazat opakovaný úkol" + context_changed: "Kontext byl změněn na %{name}" + new_related_todo_created: "Byl vytvořen nový úkol patřící do tohoto opakovaného úkolu" + mobile_todos_page_title: "Všechny úkoly" + add_another_dependency: "Přidat další závislost" + removed_predecessor: "Byl odstraněn %{successor} jako závislost pro %{predecessor}." + recurring_actions_title: "TRACKS::Opakované úkoly" + next_action_needed: "Je potřeba zadat aspoň jeden úkol" + action_saved: "Úkol uložen" + scheduled_overdue: "Naplánováno zobrazení před %{days} dny" + action_deleted_error: "Nepodařilo se smazat úkol" + edit_action: "Upravit úkol" + added_new_context: "Přidán nový kontext" next_actions_description: "Filtr:" - list_incomplete_next_actions_with_limit: "Zobrazuje posledn\xC3\xADch %{count} nedokon\xC4\x8Den\xC3\xBDch \xC3\xBAkol\xC5\xAF" - set_to_pending: "%{task} nastaven jako \xC4\x8Dekaj\xC3\xADc\xC3\xAD" - added_new_project: "P\xC5\x99id\xC3\xA1n nov\xC3\xBD projekt" + list_incomplete_next_actions_with_limit: "Zobrazuje posledních %{count} nedokončených úkolů" + set_to_pending: "%{task} nastaven jako čekající" + added_new_project: "Přidán nový projekt" next_actions_title_additions: - completed: "hotov\xC3\xA9 \xC3\xBAkoly" + completed: "hotové úkoly" due_today: dnes - due_within_a_week: !binary | - YsSbaGVtIHTDvWRuZQ== - + due_within_a_week: "během týdne" older_completed_items: "" - no_actions_due_this_week: !binary | - xb3DoWRuw6kgw7prb2x5IHBsw6Fub3bDoW55IG5hIHRlbnRvIHTDvWRlbg== - + no_actions_due_this_week: "Žádné úkoly plánovány na tento týden" all_completed_here: zde append_in_this_project: v tomto projektu - edit_recurring_todo: "Upravit opakovan\xC3\xBD \xC3\xBAkol" - error_deleting_item: "Nepoda\xC5\x99ilo se smazat polo\xC5\xBEku %{description}" - task_list_title: "TRACKS::\xC3\x9Akoly" - no_recurring_todos: !binary | - xb3DoWRuw6kgb3Bha292YW7DqSDDumtvbHk= - - error_completing_todo: "Nepoda\xC5\x99ilo se ukon\xC4\x8Dit / aktivovat opakovan\xC3\xBD \xC3\xBAkol %{description}" - recurring_pattern_removed: "Vzor opakov\xC3\xA1n\xC3\xAD byl odstran\xC4\x9Bn z %{count}" - convert_to_project: "Vytvo\xC5\x99it projekt" - no_deferred_pending_actions: !binary | - xb3DoWRuw6kgb2Rsb8W+ZW7DqSBhbmkgxI1la2Fqw61jw60gw7prb2x5 - - delete_recurring_action_confirm: "Opravdu chcete smazat opakovan\xC3\xBD \xC3\xBAkol '%{description}'?" - completed_last_day: "Ukon\xC4\x8Den\xC3\xA9 v posledn\xC3\xADch 24 hodin\xC3\xA1ch" + edit_recurring_todo: "Upravit opakovaný úkol" + error_deleting_item: "Nepodařilo se smazat položku %{description}" + task_list_title: "TRACKS::Úkoly" + no_recurring_todos: "Žádné opakované úkoly" + error_completing_todo: "Nepodařilo se ukončit / aktivovat opakovaný úkol %{description}" + recurring_pattern_removed: "Vzor opakování byl odstraněn z %{count}" + convert_to_project: "Vytvořit projekt" + no_deferred_pending_actions: "Žádné odložené ani čekající úkoly" + delete_recurring_action_confirm: "Opravdu chcete smazat opakovaný úkol '%{description}'?" + completed_last_day: "Ukončené v posledních 24 hodinách" feed_title_in_context: v kontextu '%{context}' - no_project: "--\xC5\xBD\xC3\xA1dn\xC3\xBD projekt--" - show_in_days: "Zobrazit za %{days} dn\xC3\xAD" - error_saving_recurring: "Nepoda\xC5\x99ilo se ulo\xC5\xBEit opakovan\xC3\xBD \xC3\xBAkol \\'%{description}\\'" + no_project: "--Žádný projekt--" + show_in_days: "Zobrazit za %{days} dní" + error_saving_recurring: "Nepodařilo se uložit opakovaný úkol \\'%{description}\\'" completed_more_than_x_days_ago: "" - new_related_todo_created_short: "vytvo\xC5\x99en nov\xC3\xBD \xC3\xBAkol" - all_completed: "V\xC5\xA1echny hotov\xC3\xA9 \xC3\xBAkoly" + new_related_todo_created_short: "vytvořen nový úkol" + all_completed: "Všechny hotové úkoly" edit: Upravit - completed_actions_with: "Hotov\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" + completed_actions_with: "Hotové úkoly se štítkem '%{tag_name}'" older_than_days: "" - completed_tagged_page_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" - pending: !binary | - xIxla2Fqw61jw60= - - completed_tasks_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly" - deleted_success: !binary | - w5prb2wgYnlsIMO6c3DEm8WhbsSbIHNtYXrDoW4u - + completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem '%{tag_name}'" + pending: "Čekající" + completed_tasks_title: "TRACKS::Hotové úkoly" + deleted_success: "Úkol byl úspěšně smazán." feed_title_in_project: v projektu '%{project}' - clear_due_date: "Smazat pl\xC3\xA1novan\xC3\xA9 datum \xC3\xBAkolu" - error_removing_dependency: "Nepoda\xC5\x99ilo se odstranit z\xC3\xA1vislost" - hidden_actions: "Skryt\xC3\xA9 \xC3\xBAkoly" - was_due_on_date: "bylo pl\xC3\xA1nov\xC3\xA1no na %{date}" - show_on_date: "Uk\xC3\xA1zat %{date}" - recurrence_period: "Interval opakov\xC3\xA1n\xC3\xAD" - deferred_actions_with: "Odlo\xC5\xBEen\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" - confirm_delete: "Opravdu chcete smazat \xC3\xBAkol '%{description}'?" - recurring_deleted_success: !binary | - T3Bha292YW7DvSDDumtvbCBieWwgw7pzcMSbxaFuxJsgc21hesOhbi4= - - no_completed_actions_with: "\xC5\xBD\xC3\xA1dn\xC3\xA9 hotov\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" - next_actions_title: "Tracks - \xC3\x9Akoly" - next_action_description: "Popis \xC3\xBAkolu" + clear_due_date: "Smazat plánované datum úkolu" + error_removing_dependency: "Nepodařilo se odstranit závislost" + hidden_actions: "Skryté úkoly" + was_due_on_date: "bylo plánováno na %{date}" + show_on_date: "Ukázat %{date}" + recurrence_period: "Interval opakování" + deferred_actions_with: "Odložené úkoly se štítkem '%{tag_name}'" + confirm_delete: "Opravdu chcete smazat úkol '%{description}'?" + recurring_deleted_success: "Opakovaný úkol byl úspěšně smazán." + no_completed_actions_with: "Žádné hotové úkoly se štítkem '%{tag_name}'" + next_actions_title: "Tracks - Úkoly" + next_action_description: "Popis úkolu" deferred_tasks_title: TRACKS::Tickler - clear_show_from_date: "Odstranit datum zobrazen\xC3\xAD" - in_hidden_state: "(skryt\xC3\xBD)" - see_all_completed: "M\xC5\xAF\xC5\xBEete vid\xC4\x9Bt v\xC5\xA1echny dokon\xC4\x8Den\xC3\xA9 akce %{link}" - calendar_page_title: "TRACKS::Kalend\xC3\xA1\xC5\x99" - unresolved_dependency: "Hodnota v poli 'z\xC3\xA1vis\xC3\xAD na' neodpov\xC3\xADd\xC3\xA1 \xC5\xBE\xC3\xA1dn\xC3\xA9mu existuj\xC3\xADc\xC3\xADmu \xC3\xBAkolu. Hodnota bude ignorov\xC3\xA1na. Pokra\xC4\x8Dovat?" - no_actions_found_title: !binary | - TmVuYWxlemVueSDFvsOhZG7DqSDDumtvbHk= - + clear_show_from_date: "Odstranit datum zobrazení" + in_hidden_state: "(skrytý)" + see_all_completed: "Můžete vidět všechny dokončené akce %{link}" + calendar_page_title: "TRACKS::Kalendář" + unresolved_dependency: "Hodnota v poli 'závisí na' neodpovídá žádnému existujícímu úkolu. Hodnota bude ignorována. Pokračovat?" + no_actions_found_title: "Nenalezeny žádné úkoly" show_today: Zobrazit Dnes next_actions_due_date: - overdue_by: "Pro\xC5\xA1l\xC3\xA9 %{days} den" - due_in_x_days: "Za %{days} dn\xC3\xAD" + overdue_by: "Prošlé %{days} den" + due_in_x_days: "Za %{days} dní" due_today: Dnes - overdue_by_plural: "Pro\xC5\xA1l\xC3\xA9 %{days} dn\xC3\xAD" - due_tomorrow: !binary | - WsOtdHJh - - completed_last_x_days: "Uzav\xC5\x99en\xC3\xA9 za posledn\xC3\xADch %{count} dn\xC3\xAD" - no_actions_with: "\xC5\xBD\xC3\xA1dn\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" + overdue_by_plural: "Prošlé %{days} dní" + due_tomorrow: "Zítra" + completed_last_x_days: "Uzavřené za posledních %{count} dní" + no_actions_with: "Žádné úkoly se štítkem '%{tag_name}'" defer_x_days: - one: "Uk\xC3\xA1zat z\xC3\xADtra" - other: "Uk\xC3\xA1zat za %{count} dn\xC3\xAD" - added_new_next_action_singular: !binary | - UMWZaWTDoW4gbm92w70gw7prb2w= - - no_completed_actions: !binary | - xb3DoWRuw6kgaG90b3bDqSDDumtvbHku - - deferred_pending_actions: !binary | - T2Rsb8W+ZW7DqS/EjWVrYWrDrWPDrSDDumtvbHk= - + one: "Ukázat zítra" + other: "Ukázat za %{count} dní" + added_new_next_action_singular: "Přidán nový úkol" + no_completed_actions: "Žádné hotové úkoly." + deferred_pending_actions: "Odložené/čekající úkoly" has_x_pending: - one: !binary | - SmVkZW4gxI1la2Fqw61jw60gw7prb2w= - - other: !binary | - JXtjb3VudH0gxI1la2Fqw61jw61jaCDDumtvbMWv - + one: "Jeden čekající úkol" + other: "%{count} čekajících úkolů" feeds: - completed: "Hotov\xC3\xA9: %{date}" - due: "Pl\xC3\xA1nov\xC3\xA1no na: %{date}" - recurring_todos: "Opakovan\xC3\xA9 \xC3\xBAkoly" - error_deleting_recurring: "Nepoda\xC5\x99ilo se smazat opakovan\xC3\xBD \xC3\xBAkol \\'%{description}\\'" - delete_action: "Smazat \xC3\xBAkol" + completed: "Hotové: %{date}" + due: "Plánováno na: %{date}" + recurring_todos: "Opakované úkoly" + error_deleting_recurring: "Nepodařilo se smazat opakovaný úkol \\'%{description}\\'" + delete_action: "Smazat úkol" delete: Smazat - no_last_completed_actions: !binary | - xb3DoWRuw6kgaG90b3bDqSDDumtvbHk= - - drag_action_title: "P\xC5\x99et\xC3\xA1hnout na jin\xC3\xBD \xC3\xBAkol pro vytvo\xC5\x99en\xC3\xAD z\xC3\xA1vislosti" - cannot_add_dependency_to_completed_todo: "Nelze p\xC5\x99idat \xC3\xBAkol jako z\xC3\xA1vislost k hotov\xC3\xA9mu \xC3\xBAkolu!" - depends_on: !binary | - WsOhdmlzw60gbmE= - + no_last_completed_actions: "Žádné hotové úkoly" + drag_action_title: "Přetáhnout na jiný úkol pro vytvoření závislosti" + cannot_add_dependency_to_completed_todo: "Nelze přidat úkol jako závislost k hotovému úkolu!" + depends_on: "Závisí na" tickler_items_due: - one: "Jeden \xC3\xBAkol v Tickleru je pl\xC3\xA1nov\xC3\xA1n dnes - obnovte str\xC3\xA1nku pro zobrazen\xC3\xAD." - other: "%{count} polo\xC5\xBEek v Tickleru je pl\xC3\xA1nov\xC3\xA1no na dnes tickler items are now due - obnovte str\xC3\xA1nku pro zobrazen\xC3\xAD." - action_marked_complete: "\xC3\x9Akol '%{description}' byl ozna\xC4\x8Den jako %{completed}" - completed_today: "Dokon\xC4\x8Den\xC3\xA9 dnes" - added_new_next_action_plural: "\xC3\x9Akoly byly p\xC5\x99id\xC3\xA1ny" - new_related_todo_not_created_short: "\xC3\xBAkol nebyl vytvo\xC5\x99en" - completed_rest_of_week: "Dokon\xC4\x8Den\xC3\xA9 ve zbytku t\xC3\xBDdne" - show_tomorrow: "Zobrazit z\xC3\xADtra" - error_starring: "Nepoda\xC5\x99ilo se ozna\xC4\x8Dit \xC3\xBAkol hv\xC4\x9Bzdi\xC4\x8Dkou '%{description}'" + one: "Jeden úkol v Tickleru je plánován dnes - obnovte stránku pro zobrazení." + other: "%{count} položek v Tickleru je plánováno na dnes tickler items are now due - obnovte stránku pro zobrazení." + action_marked_complete: "Úkol '%{description}' byl označen jako %{completed}" + completed_today: "Dokončené dnes" + added_new_next_action_plural: "Úkoly byly přidány" + new_related_todo_not_created_short: "úkol nebyl vytvořen" + completed_rest_of_week: "Dokončené ve zbytku týdne" + show_tomorrow: "Zobrazit zítra" + error_starring: "Nepodařilo se označit úkol hvězdičkou '%{description}'" calendar: - get_in_ical_format: "Kalend\xC3\xA1\xC5\x99 ve form\xC3\xA1tu iCal" - due_next_week: !binary | - UGzDoW5vdmFuw6kgcMWZw63FoXTDrSB0w71kZW4= - - no_actions_due_next_week: !binary | - TmEgcMWZw63FoXTDrSB0w71kZW4gbmVqc291IHBsw6Fub3ZhbsOpIMW+w6Fk - bsOpIMO6a29seQ== - - due_this_week: "Pl\xC3\xA1novan\xC3\xA9 ve zbytku t\xC3\xBDdne" - no_actions_due_today: !binary | - TmEgZG5lxaFlayBuZWpzb3UgcGzDoW5vdmFuw6kgxb7DoWRuw6kgw7prb2x5 - - due_today: "Pl\xC3\xA1novan\xC3\xA9 dnes" - due_next_month_and_later: "Pl\xC3\xA1nov\xC3\xA1no na %{month} a d\xC3\xA1le" - no_actions_due_after_this_month: !binary | - TmEgcMWZw63FoXTDrSBtxJtzw61jIGEgZMOhbGUgbmVqc291IHBsw6Fub3Zh - bsOpIMW+w6FkbsOpIMO6a29seQ== - - no_actions_due_this_month: "Na zbytek tohoto m\xC4\x9Bs\xC3\xADce nejsou \xC5\xBE\xC3\xA1dn\xC3\xA9 \xC3\xBAkoly" - due_this_month: "Pl\xC3\xA1nov\xC3\xA1no na %{month}" - no_completed_recurring: !binary | - xb3DoWRuw6kgaG90b3bDqSBvcGFrb3ZhbsOpIMO6a29seQ== - + get_in_ical_format: "Kalendář ve formátu iCal" + due_next_week: "Plánované příští týden" + no_actions_due_next_week: "Na příští týden nejsou plánované žádné úkoly" + due_this_week: "Plánované ve zbytku týdne" + no_actions_due_today: "Na dnešek nejsou plánované žádné úkoly" + due_today: "Plánované dnes" + due_next_month_and_later: "Plánováno na %{month} a dále" + no_actions_due_after_this_month: "Na příští měsíc a dále nejsou plánované žádné úkoly" + no_actions_due_this_month: "Na zbytek tohoto měsíce nejsou žádné úkoly" + due_this_month: "Plánováno na %{month}" + no_completed_recurring: "Žádné hotové opakované úkoly" recurrence: - ends_on_date: "Kon\xC4\x8D\xC3\xAD %{date}" - every_work_day: "Ka\xC5\xBEd\xC3\xBD pracovn\xC3\xAD den" - ends_on_number_times: "Kon\xC4\x8D\xC3\xAD po %{number} opakov\xC3\xA1n\xC3\xADch" - recurrence_on_due_date: "datum na kter\xC3\xA9 je \xC3\xBAkol pl\xC3\xA1nov\xC3\xA1n" - weekly_options: "Nastaven\xC3\xAD pro t\xC3\xBDdenn\xC3\xAD opakovan\xC3\xA9 \xC3\xBAkoly" - weekly: !binary | - VMO9ZG7Emw== - - monthly_options: !binary | - TmFzdGF2ZW7DrSBwcm8gbcSbc8OtxI1uw60gb3Bha292YW7DqSDDumtvbHk= - - daily_options: "Nastaven\xC3\xAD pro denn\xC3\xAD opakovan\xC3\xA9 \xC3\xBAkoly" - monthly: !binary | - TcSbc8OtxI1uxJs= - - starts_on: !binary | - WmHEjcOtbsOh - - daily: !binary | - RGVubsSb - - show_option_always: !binary | - c3TDoWxl - + ends_on_date: "Končí %{date}" + every_work_day: "Každý pracovní den" + ends_on_number_times: "Končí po %{number} opakováních" + recurrence_on_due_date: "datum na které je úkol plánován" + weekly_options: "Nastavení pro týdenní opakované úkoly" + weekly: "Týdně" + monthly_options: "Nastavení pro měsíční opakované úkoly" + daily_options: "Nastavení pro denní opakované úkoly" + monthly: "Měsíčně" + starts_on: "Začíná" + daily: "Denně" + show_option_always: "stále" pattern: - third: !binary | - dMWZZXTDrQ== - + third: "třetí" month_names: - - Leden - - !binary | - w5pub3I= - - - "B\xC5\x99ezen" + - "Únor" + - "Březen" - Duben - - "Kv\xC4\x9Bten" - - "\xC4\x8Cerven" - - "\xC4\x8Cervenec" + - "Květen" + - "Červen" + - "Červenec" - Srpen - - !binary | - WsOhxZnDrQ== - - - !binary | - xZjDrWplbg== - + - "Září" + - "Říjen" - Listopad - Prosinec - every_n: !binary | - a2HFvmTDqSAle259 - - second: !binary | - ZHJ1aMO9 - - every_xth_day_of_every_n_months: "ka\xC5\xBEd\xC3\xBD %{x} %{day} ka\xC5\xBEd\xC3\xBDch %{n_months}" + every_n: "každé %{n}" + second: "druhý" + every_xth_day_of_every_n_months: "každý %{x} %{day} každých %{n_months}" on_day_n: "%{n}. den" - weekly: !binary | - a2HFvmTDvSB0w71kZW4= - + weekly: "každý týden" from: od - last: "posledn\xC3\xAD" - every_day: !binary | - a2HFvmTDvSBkZW4= - - the_xth_day_of_month: "%{x} %{day} m\xC4\x9Bs\xC3\xADce %{month}" - times: "(%{number} opakov\xC3\xA1n\xC3\xAD)" - show: "uk\xC3\xA1zat" - first: !binary | - cHJ2bsOt - - every_year_on: "ka\xC5\xBEd\xC3\xBD rok %{date}" + last: "poslední" + every_day: "každý den" + the_xth_day_of_month: "%{x} %{day} měsíce %{month}" + times: "(%{number} opakování)" + show: "ukázat" + first: "první" + every_year_on: "každý rok %{date}" day_names: - - "ned\xC4\x9Ble" - - !binary | - cG9uZMSbbMOt - - - !binary | - w7p0ZXLDvQ== - - - "st\xC5\x99eda" - - "\xC4\x8Dtvrtek" - - !binary | - cMOhdGVr - + - "neděle" + - "pondělí" + - "úterý" + - "středa" + - "čtvrtek" + - "pátek" - sobota - on_work_days: "v pracovn\xC3\xAD dny" - fourth: !binary | - xI10dnJ0w70= - - due: "pl\xC3\xA1nov\xC3\xA1no na" - every_month: !binary | - a2HFvmTDvSBtxJtzw61j - + on_work_days: "v pracovní dny" + fourth: "čtvrtý" + due: "plánováno na" + every_month: "každý měsíc" until: do - yearly_every_x_day: "Ka\xC5\xBEd\xC3\xBD %{month} %{day}" - recurrence_on_options: "Nastavit opakov\xC3\xA1n\xC3\xAD na" - daily_every_number_day: "Ka\xC5\xBEd\xC3\xBDch %{number} dn\xC3\xAD" - show_options: !binary | - w5prw6F6YXQgw7prb2w= - - weekly_every_number_week: "Ka\xC5\xBEd\xC3\xBDch %{number} t\xC3\xBDdn\xC5\xAF" - ends_on: !binary | - S29uxI3DrQ== - - show_days_before: "%{days} dn\xC3\xAD p\xC5\x99ed pl\xC3\xA1novan\xC3\xBDm datem" - from_tickler: "datum kdy \xC3\xBAkol vypadne z Tickleru (nen\xC3\xAD nastaveno pl\xC3\xA1novan\xC3\xA9 datum)" + yearly_every_x_day: "Každý %{month} %{day}" + recurrence_on_options: "Nastavit opakování na" + daily_every_number_day: "Každých %{number} dní" + show_options: "Úkázat úkol" + weekly_every_number_week: "Každých %{number} týdnů" + ends_on: "Končí" + show_days_before: "%{days} dní před plánovaným datem" + from_tickler: "datum kdy úkol vypadne z Tickleru (není nastaveno plánované datum)" no_end_date: Nikdy - day_x_on_every_x_month: "%{day}. den ka\xC5\xBEd\xC3\xBD %{month}. m\xC4\x9Bs\xC3\xADc" - yearly_every_xth_day: "%{day} %{day_of_week} m\xC4\x9Bs\xC3\xADce %{month}" - yearly_options: "Nastaven\xC3\xAD pro ro\xC4\x8Dn\xC3\xAD opakovan\xC3\xA9 \xC3\xBAkoly" - yearly: !binary | - Um/EjW7Emw== - - monthly_every_xth_day: "%{day} %{day_of_week} ka\xC5\xBEd\xC3\xBD %{month}. m\xC4\x9Bs\xC3\xADc" - action_deferred: "\xC3\x9Akol '%{description}' byl oldo\xC5\xBEen" - tagged_page_title: "TRACKS::Se \xC5\xA1t\xC3\xADtkem '%{tag_name}'" - added_dependency: "P\xC5\x99id\xC3\xA1no %{dependency} jako z\xC3\xA1vislost." - completed_rest_of_month: "Ukon\xC4\x8Den\xC3\xA9 ve zbytku tohoto m\xC4\x9Bs\xC3\xADce" - all_completed_tagged_page_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly se \xC5\xA1t\xC3\xADtkem %{tag_name}" - no_deferred_actions: !binary | - xb3DoWRuw6kgb2Rsb8W+ZW7DqSDDumtvbHku - - recurrence_completed: "Posledn\xC3\xAD opakov\xC3\xA1n\xC3\xAD \xC3\xBAkolu bylo ozna\xC4\x8Deno jako hotov\xC3\xA9. Opakovan\xC3\xBD \xC3\xBAkol je dokon\xC4\x8Den\xC3\xBD" - action_marked_complete_error: "\xC3\x9Akol '%{description}' NEBYL ozna\xC4\x8Den jako %{completed} kv\xC5\xAFli chyb\xC4\x9B na serveru." - no_actions_found: !binary | - xb3DoWRuw6kgYsSbxb7DrWPDrSDDumtvbHku - - in_pending_state: "ve stavu \xC4\x8Dekaj\xC3\xADc\xC3\xAD" - error_toggle_complete: "Nepoda\xC5\x99ilo se ozna\xC4\x8Dit \xC3\xBAkol jako hotov\xC3\xBD" - due: "Pl\xC3\xA1nov\xC3\xA1no na" - no_incomplete_actions: !binary | - xb3DoWRuw6kgbmVob3RvdsOpIMO6a29seQ== - - action_saved_to_tickler: "\xC3\x9Akol byl ulo\xC5\xBEen do Tickleru" - recurring_action_saved: "Opakovan\xC3\xBD \xC3\xBAkol byl ulo\xC5\xBEen" - depends_on_separate_with_commas: !binary | - WsOhdmlzw60gbmEgKG9kZMSbbGVubyDEjcOhcmthbWkp - + day_x_on_every_x_month: "%{day}. den každý %{month}. měsíc" + yearly_every_xth_day: "%{day} %{day_of_week} měsíce %{month}" + yearly_options: "Nastavení pro roční opakované úkoly" + yearly: "Ročně" + monthly_every_xth_day: "%{day} %{day_of_week} každý %{month}. měsíc" + action_deferred: "Úkol '%{description}' byl oldožen" + tagged_page_title: "TRACKS::Se štítkem '%{tag_name}'" + added_dependency: "Přidáno %{dependency} jako závislost." + completed_rest_of_month: "Ukončené ve zbytku tohoto měsíce" + all_completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem %{tag_name}" + no_deferred_actions: "Žádné odložené úkoly." + recurrence_completed: "Poslední opakování úkolu bylo označeno jako hotové. Opakovaný úkol je dokončený" + action_marked_complete_error: "Úkol '%{description}' NEBYL označen jako %{completed} kvůli chybě na serveru." + no_actions_found: "Žádné běžící úkoly." + in_pending_state: "ve stavu čekající" + error_toggle_complete: "Nepodařilo se označit úkol jako hotový" + due: "Plánováno na" + no_incomplete_actions: "Žádné nehotové úkoly" + action_saved_to_tickler: "Úkol byl uložen do Tickleru" + recurring_action_saved: "Opakovaný úkol byl uložen" + depends_on_separate_with_commas: "Závisí na (odděleno čárkami)" completed_in_archive: - one: "V archivu je hotov\xC3\xBD \xC3\xBAkol." - other: "V archivu je %{count} hotov\xC3\xBDch \xC3\xBAkol\xC5\xAF." + one: "V archivu je hotový úkol." + other: "V archivu je %{count} hotových úkolů." to_tickler: do Tickleru next_actions_description_additions: - completed: "v posledn\xC3\xADch %{count} dnech" - due_date: "pl\xC3\xA1novano na %{due_date} nebo d\xC5\x99\xC3\xADve" - overdue: !binary | - U3Bvxb5kxJtuw6kgw7prb2x5 - - add_new_recurring: "Vytvo\xC5\x99it opakovan\xC3\xBD \xC3\xBAkol" + completed: "v posledních %{count} dnech" + due_date: "plánovano na %{due_date} nebo dříve" + overdue: "Spožděné úkoly" + add_new_recurring: "Vytvořit opakovaný úkol" notes: - delete_note_title: "Smazat pozn\xC3\xA1mku '%{id}'" - delete_confirmation: "Opravdu chcete smazat pozn\xC3\xA1mku '%{id}'?" + delete_note_title: "Smazat poznámku '%{id}'" + delete_confirmation: "Opravdu chcete smazat poznámku '%{id}'?" in_project: "V:" - delete_item_title: "Smazat polo\xC5\xBEku" - deleted_note: "Smazat pozn\xC3\xA1mku '%{id}'" - note_link_title: "Zobrazit pozn\xC3\xA1mku %{id}" - show_note_title: "Zobrazit pozn\xC3\xA1mku" - edit_item_title: "Upravit polo\xC5\xBEku" + delete_item_title: "Smazat položku" + deleted_note: "Smazat poznámku '%{id}'" + note_link_title: "Zobrazit poznámku %{id}" + show_note_title: "Zobrazit poznámku" + edit_item_title: "Upravit položku" note_location_link: "V:" - no_notes_available: "\xC5\xBD\xC3\xA1dn\xC3\xA9 pozn\xC3\xA1mky: p\xC5\x99idejte pozn\xC3\xA1mky ze str\xC3\xA1nek jednotliv\xC3\xBDch projekt\xC5\xAF." - note_header: "Pozn\xC3\xA1mka %{id}" - delete_note_confirm: "Opravdu chcete smazat pozn\xC3\xA1mku '%{id}'?" + no_notes_available: "Žádné poznámky: přidejte poznámky ze stránek jednotlivých projektů." + note_header: "Poznámka %{id}" + delete_note_confirm: "Opravdu chcete smazat poznámku '%{id}'?" projects: - default_context_set: "V\xC3\xBDchoz\xC3\xAD kontext %{default_context} byl nastaven" - no_actions_in_project: !binary | - xb3DoWRuw6kgYWt0aXZuw60gw7prb2x5 - - deferred_actions: "Odlo\xC5\xBEen\xC3\xA9 \xC3\xBAkoly projektu" - was_marked_hidden: "byl ozna\xC4\x8Den jako skryt\xC3\xBD" + default_context_set: "Výchozí kontext %{default_context} byl nastaven" + no_actions_in_project: "Žádné aktivní úkoly" + deferred_actions: "Odložené úkoly projektu" + was_marked_hidden: "byl označen jako skrytý" edit_project_title: Upravit projekt - default_tags_removed_notice: "V\xC3\xBDchoz\xC3\xAD \xC5\xA1t\xC3\xADtky byly odstran\xC4\x9Bny" + default_tags_removed_notice: "Výchozí štítky byly odstraněny" page_title: "TRACKS::Projekt: %{project}" - all_completed_tasks_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly projektu '%{project_name}'" - hide_form: !binary | - U2tyw710IGZvcm11bMOhxZk= - - list_completed_projects: "TRACKS::Hotov\xC3\xA9 projekty" - no_notes_attached: !binary | - xb3DoWRuw6kgcG96bsOhbWt5 - - to_new_project_page: "p\xC5\x99ej\xC3\xADt k nov\xC3\xA9mu projektu" - show_form_title: "Nov\xC3\xBD projekt" - deferred_actions_empty: !binary | - xb3DoWRuw6kgb2Rsb8W+ZW7DqSDDumtvbHk= - + all_completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" + hide_form: "Skrýt formulář" + list_completed_projects: "TRACKS::Hotové projekty" + no_notes_attached: "Žádné poznámky" + to_new_project_page: "přejít k novému projektu" + show_form_title: "Nový projekt" + deferred_actions_empty: "Žádné odložené úkoly" project_state: Projekt je %{state}. this_project: Tento projekt - no_last_completed_projects: !binary | - xb3DoWRuw6kgaG90b3bDqSBwcm9qZWt0eQ== - - no_last_completed_recurring_todos: !binary | - xb3DoWRuw6kgaG90b3bDqSBvcGFrb3ZhbsOpIMO6a29seQ== - - notes: "Pozn\xC3\xA1mky" + no_last_completed_projects: "Žádné hotové projekty" + no_last_completed_recurring_todos: "Žádné hotové opakované úkoly" + notes: "Poznámky" todos_append: v tomto projektu list_reviews: TRACKS::Revize - notes_empty: !binary | - xb3DoWRuw6kgcG96bsOhbWt5 - - no_projects: !binary | - xb3DoWRuw6kgcHJvamVrdHk= - - hide_form_title: "Schovat formul\xC3\xA1\xC5\x99 zalo\xC5\xBEen\xC3\xAD projektu" + notes_empty: "Žádné poznámky" + no_projects: "Žádné projekty" + hide_form_title: "Schovat formulář založení projektu" delete_project: Smazat projekt - completed_actions_empty: "V tomto projektu nejsou \xC5\xBE\xC3\xA1dn\xC3\xA9 hotov\xC3\xA9 \xC3\xBAkoly" - with_no_default_context: "bez v\xC3\xBDchoz\xC3\xADho kontextu" + completed_actions_empty: "V tomto projektu nejsou žádné hotové úkoly" + with_no_default_context: "bez výchozího kontextu" delete_project_confirmation: Opravdu chcete smazat projekt '%{name}'? - with_default_context: "s v\xC3\xBDchoz\xC3\xADm kontextem '%{context_name}'" - show_form: "Nov\xC3\xBD projekt" - actions_in_project_title: "\xC3\x9Akoly v tomto projetku" - completed_projects: "Hotov\xC3\xA9 projetky" - is_active: "je aktivn\xC3\xAD" - add_note: "Nov\xC3\xA1 pozn\xC3\xA1mka" - set_default_tags_notice: "Nastavit v\xC3\xBDchoz\xC3\xAD \xC5\xA1\xC3\xADtky \xC3\xBAkol\xC5\xAF v tomto projektu %{default_tags}" - add_project: "P\xC5\x99idat projekt" - settings: "Nastaven\xC3\xAD" - project_saved_status: "Projekt byl ulo\xC5\xBEen" + with_default_context: "s výchozím kontextem '%{context_name}'" + show_form: "Nový projekt" + actions_in_project_title: "Úkoly v tomto projetku" + completed_projects: "Hotové projetky" + is_active: "je aktivní" + add_note: "Nová poznámka" + set_default_tags_notice: "Nastavit výchozí šítky úkolů v tomto projektu %{default_tags}" + add_project: "Přidat projekt" + settings: "Nastavení" + project_saved_status: "Projekt byl uložen" list_projects: TRACKS::Projekty - with_default_tags: "a s '%{tags}' jako v\xC3\xBDchoz\xC3\xAD \xC5\xA1t\xC3\xADtky" - completed_tasks_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly projektu '%{project_name}'" - hidden_projects: "Skryt\xC3\xA9 projekty" - delete_project_title: "Sma\xC5\xBEe projekt" - default_context_removed: "V\xC3\xBDchoz\xC3\xAD kontext byl odstran\xC4\x9Bn" - add_note_submit: "Nov\xC3\xA1 pozn\xC3\xA1mka" - completed_actions: "Hotov\xC3\xA9 \xC3\xBAkoly tohoto projektu" - was_marked_complete: "byl ozna\xC4\x8Den jako hotov\xC3\xBD" - no_default_context: "Tento projekt nem\xC3\xA1 v\xC3\xBDchoz\xC3\xAD kontext" - with_no_default_tags: !binary | - YSBuZW3DoSDFvsOhZG7DqSB2w71jaG96w60gem5hxI1reQ== - - default_context: "V\xC3\xBDchoz\xC3\xAD kontext pro tento projekt je %{context}" + with_default_tags: "a s '%{tags}' jako výchozí štítky" + completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" + hidden_projects: "Skryté projekty" + delete_project_title: "Smaže projekt" + default_context_removed: "Výchozí kontext byl odstraněn" + add_note_submit: "Nová poznámka" + completed_actions: "Hotové úkoly tohoto projektu" + was_marked_complete: "byl označen jako hotový" + no_default_context: "Tento projekt nemá výchozí kontext" + with_no_default_tags: "a nemá žádné výchozí značky" + default_context: "Výchozí kontext pro tento projekt je %{context}" edit_project_settings: Upravit vlastnosti projektu - status_project_name_changed: "Jm\xC3\xA9no projektu bylo zm\xC4\x9Bn\xC4\x9Bno" + status_project_name_changed: "Jméno projektu bylo změněno" state: Tento projekt je %{state} - active_projects: "Aktivn\xC3\xAD projekty" + active_projects: "Aktivní projekty" states: - hidden_plural: "Skryt\xC3\xA9" - stalled: !binary | - T3B1xaF0xJtuw70= - - review_plural: "Nerevidovan\xC3\xA9" - completed: "Hotov\xC3\xBD" - current: !binary | - QWt0dcOhbG7DrQ== - - review: "Nerevidovan\xC3\xBD" - completed_plural: "Hotov\xC3\xA9" - blocked: "Blokovan\xC3\xBD" - blocked_plural: "Blokovan\xC3\xA9" - stalled_plural: !binary | - T3B1xaF0xJtuw6k= - - visible_plural: "Viditeln\xC3\xA9" - active_plural: "Aktivn\xC3\xAD" - visible: "Viditeln\xC3\xBD" - hidden: "Skryt\xC3\xBD" - active: "Aktivn\xC3\xAD" - current_plural: !binary | - QWt0dcOhbG7DrQ== - + hidden_plural: "Skryté" + stalled: "Opuštěný" + review_plural: "Nerevidované" + completed: "Hotový" + current: "Aktuální" + review: "Nerevidovaný" + completed_plural: "Hotové" + blocked: "Blokovaný" + blocked_plural: "Blokované" + stalled_plural: "Opuštěné" + visible_plural: "Viditelné" + active_plural: "Aktivní" + visible: "Viditelný" + hidden: "Skrytý" + active: "Aktivní" + current_plural: "Aktuální" errors: - user_unauthorized: "401 Neautorizov\xC3\xA1no: Jen administr\xC3\xA1to\xC5\x99i sm\xC3\xAD pou\xC5\xBE\xC3\xADvat tuto funkci." + user_unauthorized: "401 Neautorizováno: Jen administrátoři smí používat tuto funkci." preferences: - open_id_url: "Va\xC5\xA1e OpenID URL je" - change_identity_url: "Zm\xC4\x9Bna URL identity" - staleness_starts_after: "Zastar\xC3\xA1n\xC3\xAD nast\xC3\xA1v\xC3\xA1 po %{days} dnech" - page_title: "TRACKS::Nastaven\xC3\xAD" - change_password: "Zm\xC4\x9Bna hesla" - token_description: "Pe\xC5\xA1ek (feedy a pou\xC5\xBEit\xC3\xAD API)" - title: "Va\xC5\xA1e nastaven\xC3\xAD" + open_id_url: "Vaše OpenID URL je" + change_identity_url: "Změna URL identity" + staleness_starts_after: "Zastarání nastává po %{days} dnech" + page_title: "TRACKS::Nastavení" + change_password: "Změna hesla" + token_description: "Pešek (feedy a použití API)" + title: "Vaše nastavení" is_false: ne - show_number_completed: "Zobrazit %{number} hotov\xC3\xBDch polo\xC5\xBEek" - password_changed: "Heslo bylo zm\xC4\x9Bn\xC4\x9Bno. Pros\xC3\xADm znovu se p\xC5\x99ihla\xC5\xA1te." - edit_preferences: "Editace nastaven\xC3\xAD" - page_title_edit: "TRACKS::Editace nastaven\xC3\xAD" + show_number_completed: "Zobrazit %{number} hotových položek" + password_changed: "Heslo bylo změněno. Prosím znovu se přihlašte." + edit_preferences: "Editace nastavení" + page_title_edit: "TRACKS::Editace nastavení" is_true: ano - sms_context_none: !binary | - xb7DoWRuw70= - - generate_new_token: "Generovat nov\xC3\xA9ho pe\xC5\xA1ka" - token_header: !binary | - VsOhxaEgcGXFoWVr - - authentication_header: "Va\xC5\xA1e autentizace" - updated: "Nastaven\xC3\xAD bylo ulo\xC5\xBEeno" - current_authentication_type: "Pou\xC5\xBE\xC3\xADv\xC3\xA1te autentizaci %{auth_type}" - change_authentication_type: "Zm\xC4\x9Bna typu autentizace" - generate_new_token_confirm: "Opravdu? Nov\xC3\xBD pe\xC5\xA1ek nahrad\xC3\xAD ten p\xC5\xAFvodn\xC3\xAD a zp\xC5\xAFsob\xC3\xAD nefunk\xC4\x8Dnost ve v\xC5\xA1ech aplikac\xC3\xADch, kde jej pou\xC5\xBE\xC3\xADv\xC3\xA1te." + sms_context_none: "žádný" + generate_new_token: "Generovat nového peška" + token_header: "Váš pešek" + authentication_header: "Vaše autentizace" + updated: "Nastavení bylo uloženo" + current_authentication_type: "Používáte autentizaci %{auth_type}" + change_authentication_type: "Změna typu autentizace" + generate_new_token_confirm: "Opravdu? Nový pešek nahradí ten původní a způsobí nefunkčnost ve všech aplikacích, kde jej používáte." tabs: authentication: Autentizace - tracks_behavior: "Chov\xC3\xA1n\xC3\xAD Tracks" + tracks_behavior: "Chování Tracks" profile: Profil - date_and_time: "Datum a \xC4\x8Das" + date_and_time: "Datum a čas" time: am: am formats: @@ -1043,42 +725,28 @@ cz: month_names: - - Leden - - !binary | - w5pub3I= - - - "B\xC5\x99ezen" + - "Únor" + - "Březen" - Duben - - "Kv\xC4\x9Bten" - - "\xC4\x8Cerven" - - "\xC4\x8Cervenec" + - "Květen" + - "Červen" + - "Červenec" - Srpen - - !binary | - WsOhxZnDrQ== - - - !binary | - xZjDrWplbg== - + - "Září" + - "Říjen" - Listopad - Prosinec abbr_day_names: - Ne - Po - - !binary | - w5p0 - + - "Út" - St - - !binary | - xIx0 - - - !binary | - UMOh - + - "Čt" + - "Pá" - So order: - :rok - - !binary | - Om3Em3PDrWM= - + - ":měsíc" - :den formats: only_day: "" @@ -1088,323 +756,244 @@ cz: month_day: "" long: "%B %d, %Y" day_names: - - "Ned\xC4\x9Ble" - - !binary | - UG9uxJtsw60= - - - !binary | - w5p0ZXLDvQ== - - - "St\xC5\x99eda" - - "\xC4\x8Ctvrtek" - - !binary | - UMOhdGVr - + - "Neděle" + - "Ponělí" + - "Úterý" + - "Středa" + - "Čtvrtek" + - "Pátek" - Sobota abbr_month_names: - - Led - - !binary | - w5pubw== - - - !binary | - QsWZZQ== - + - "Úno" + - "Bře" - Dub - - !binary | - S3bEmw== - - - !binary | - xIxlcg== - - - !binary | - xIxlYw== - + - "Kvě" + - "Čer" + - "Čec" - Srp - - !binary | - WsOhxZk= - - - !binary | - xZjDrWo= - + - "Zář" + - "Říj" - Lis - Pro will_paginate: - previous_label: "« p\xC5\x99edchoz\xC3\xAD" + previous_label: "« předchozí" page_entries_info: multi_page: Zobrazuji %{model} %{from} - %{to} o %{count} celkem single_page_html: - one: "Zobrazen\xC3\xAD 1 %{model}" - other: "Zobrazen\xC3\xAD v\xC5\xA1e %{count} %{model}" - zero: !binary | - xb3DoWRuw6kgJXttb2RlbH0gbmFsw6l6dA== - + one: "Zobrazení 1 %{model}" + other: "Zobrazení vše %{count} %{model}" + zero: "Žádné %{model} nalézt" single_page: one: Zobrazuji 1 %{model} - other: "Zobrazen\xC3\xAD v\xC5\xA1ech %{count} %{model}" - zero: !binary | - xb3DoWRuw6kgJXttb2RlbH0gbmFsw6l6dA== - + other: "Zobrazení všech %{count} %{model}" + zero: "Žádné %{model} nalézt" multi_page_html: Zobrazuji %{model} %{from} - %{to} of %{count} celkem page_gap: "…" - next_label: "dal\xC5\xA1\xC3\xAD »" + next_label: "další »" support: array: words_connector: ", " last_word_connector: ", a " two_words_connector: " a " select: - prompt: "Pros\xC3\xADm vyberte" + prompt: "Prosím vyberte" footer: - send_feedback: "Poslat zp\xC4\x9Btnou vazbu na %{version}" + send_feedback: "Poslat zpětnou vazbu na %{version}" shared: - multiple_next_actions: "\xC3\x9Akoly (jeden na ka\xC5\xBEd\xC3\xA9m \xC5\x99\xC3\xA1dku)" - make_actions_dependent: "Akce budou vz\xC3\xA1jemn\xC4\x9B z\xC3\xA1visl\xC3\xA9" - toggle_single: !binary | - UMWZaWRhdCDDumtvbA== - - hide_form: "Schovat formul\xC3\xA1\xC5\x99" - add_actions: "P\xC5\x99idat \xC3\xBAkoly" - add_action: !binary | - UMWZaWRhdCDDumtvbA== - - tags_for_all_actions: !binary | - Wm5hxI1reSAob2RkxJtsZW7DqSDEjcOhcmthbWkp - - toggle_single_title: "P\xC5\x99idat jeden nov\xC3\xBD \xC3\xBAkol" - project_for_all_actions: "Projekt (pro v\xC5\xA1echny)" - context_for_all_actions: "Kontext (pro v\xC5\xA1echny)" - toggle_multi: !binary | - UMWZaWRhdCB2w61jZSDDumtvbMWv - - separate_tags_with_commas: !binary | - b2RkxJtsZW7DqSDEjcOhcmthbWk= - - add_context: "P\xC5\x99idejte kontext" - toggle_multi_title: !binary | - UMWZZXBub3V0IGZvcm11bMOhxZkgemFrbMOhZMOhbsOtIGplZG9oby92w61j - ZSDDumtvbMWv - - hide_action_form_title: "Skr\xC3\xBDt formul\xC3\xA1\xC5\x99 pro zalo\xC5\xBEen\xC3\xAD nov\xC3\xA9ho \xC3\xBAkolu" + multiple_next_actions: "Úkoly (jeden na každém řádku)" + make_actions_dependent: "Akce budou vzájemně závislé" + toggle_single: "Přidat úkol" + hide_form: "Schovat formulář" + add_actions: "Přidat úkoly" + add_action: "Přidat úkol" + tags_for_all_actions: "Značky (oddělené čárkami)" + toggle_single_title: "Přidat jeden nový úkol" + project_for_all_actions: "Projekt (pro všechny)" + context_for_all_actions: "Kontext (pro všechny)" + toggle_multi: "Přidat více úkolů" + separate_tags_with_commas: "oddělené čárkami" + add_context: "Přidejte kontext" + toggle_multi_title: "Přepnout formulář zakládání jedoho/více úkolů" + hide_action_form_title: "Skrýt formulář pro založení nového úkolu" feedlist: - choose_context: "Vyberte kontext jeho\xC5\xBE feed si p\xC5\x99ejete" - actions_due_today: "Akce pl\xC3\xA1novan\xC3\xA9 na dnes" + choose_context: "Vyberte kontext jehož feed si přejete" + actions_due_today: "Akce plánované na dnes" ical_feed: iCal feed legend: "Legenda:" - all_contexts: "V\xC5\xA1echny kontexty" + all_contexts: "Všechny kontexty" rss_feed: RSS Feed - choose_project: "Vyberte projekt jeho\xC5\xBE feed si p\xC5\x99ejete" - all_projects: "V\xC5\xA1echny projekty" - project_needed: "Mus\xC3\xADte nejd\xC5\x99\xC3\xADve zalo\xC5\xBEit aspo\xC5\x88 jeden projekt" + choose_project: "Vyberte projekt jehož feed si přejete" + all_projects: "Všechny projekty" + project_needed: "Musíte nejdříve založit aspoň jeden projekt" select_feed_for_project: Vyberte feed pro tento projekt - active_projects_wo_next: "Aktivni projekty bez \xC3\xBAkol\xC5\xAF" - active_starred_actions: "V\xC5\xA1echny aktivn\xC3\xAD \xC3\xBAkoly s hv\xC4\x9Bzdi\xC4\x8Dkou" - context_needed: "Mus\xC3\xADte nejd\xC5\x99\xC3\xADve zalo\xC5\xBEit aspo\xC5\x88 jeden kontext" + active_projects_wo_next: "Aktivni projekty bez úkolů" + active_starred_actions: "Všechny aktivní úkoly s hvězdičkou" + context_needed: "Musíte nejdříve založit aspoň jeden kontext" select_feed_for_context: Select the feed for this context - projects_and_actions: "Aktivn\xC3\xAD projekty a jejich \xC3\xBAkoly" - notice_incomplete_only: "Pozn\xC3\xA1mka: v\xC5\xA1echny feedy obsahuj\xC3\xAD jen nehotov\xC3\xA9 \xC3\xBAkoly." - actions_due_next_week: !binary | - w5prb2x5IHBsw6Fub3ZhbsOpIG5hIHDFmcOtxaF0w61jaCBzZWRtIGRuw60= - - actions_completed_last_week: "\xC3\x9Akoly dokon\xC4\x8Den\xC3\xA9 v posledn\xC3\xADch sedmi dnech" - context_centric_actions: "Feedy s aktivn\xC3\xADmi \xC3\xBAkoly podle kontext\xC5\xAF" - plain_text_feed: "Prost\xC3\xBD text" - last_fixed_number: "Posledn\xC3\xADch %{number} \xC3\xBAkol\xC5\xAF" - all_actions: "V\xC5\xA1echny \xC3\xBAkoly" - project_centric: "Feedy s aktivn\xC3\xADmi \xC3\xBAkoly podle projektu" + projects_and_actions: "Aktivní projekty a jejich úkoly" + notice_incomplete_only: "Poznámka: všechny feedy obsahují jen nehotové úkoly." + actions_due_next_week: "Úkoly plánované na příštích sedm dní" + actions_completed_last_week: "Úkoly dokončené v posledních sedmi dnech" + context_centric_actions: "Feedy s aktivními úkoly podle kontextů" + plain_text_feed: "Prostý text" + last_fixed_number: "Posledních %{number} úkolů" + all_actions: "Všechny úkoly" + project_centric: "Feedy s aktivními úkoly podle projektu" sidebar: - list_name_active_contexts: "Aktivn\xC3\xAD kontexty" - list_name_active_projects: "Aktivn\xC3\xAD projekty" + list_name_active_contexts: "Aktivní kontexty" + list_name_active_projects: "Aktivní projekty" list_empty: Nic - list_name_completed_projects: "Hotov\xC3\xA9 projekty" - list_name_hidden_projects: "Skryt\xC3\xA9 projekty" - list_name_hidden_contexts: "Skryt\xC3\xA9 kontexty" + list_name_completed_projects: "Hotové projekty" + list_name_hidden_projects: "Skryté projekty" + list_name_hidden_contexts: "Skryté kontexty" users: - openid_url_verified: "Identitn\xC3\xAD url %{url} bylo \xC3\xBAsp\xC4\x9B\xC5\xA1n\xC4\x9B ov\xC4\x9B\xC5\x99eno a nastavena autentizace pomoc\xC3\xAD OpenID." - auth_type_update_error: "Nepoda\xC5\x99ilo se zm\xC4\x9Bnit typ autentizace: %{error_messages}" - failed_to_delete_user: "Nepoda\xC5\x99ilo se smazat u\xC5\xBEivatele %{username}" - destroy_successful: "U\xC5\xBEivatel %{login} byl \xC3\xBAsp\xC4\x9B\xC5\xA1n\xC4\x9B zni\xC4\x8Den" - first_user_heading: "V\xC3\xADtejte v TRACKS. Nejd\xC5\x99\xC3\xADve je nutn\xC3\xA9 vytvo\xC5\x99it administr\xC3\xA1torsk\xC3\xBD \xC3\xBA\xC4\x8Det:" - total_contexts: "Kontext\xC5\xAF celkem" - successfully_deleted_user: "U\xC5\xBEivatel %{username} byl \xC3\xBAsp\xC4\x9B\xC5\xA1n\xC4\x9B smaz\xC3\xA1n" - signup_successful: "Registrace u\xC5\xBEivatele %{username} byla \xC3\xBAsp\xC4\x9B\xC5\xA1n\xC3\xA1." - new_token_generated: !binary | - Tm92w70gcGXFoWVrIGJ5bCDDunNwxJvFoW7EmyB2eWdlbmVyb3bDoW4= - - total_projects: "Projekt\xC5\xAF celkem" - change_password_submit: "Zm\xC4\x9Bnit heslo" - no_signups_title: "TRACKS::Registrace nen\xC3\xAD povolena" - user_created: "U\xC5\xBEivatel byl vytvo\xC5\x99en." - account_signup: "Registrace u\xC5\xBEivatele" - manage_users: !binary | - U3Byw6F2YSB1xb5pdmF0ZWzFrw== - - password_updated: "Heslo bylo zm\xC4\x9Bn\xC4\x9Bno." - auth_type_updated: "Typ autentizace byl zm\xC4\x9Bn\xC4\x9Bn." - total_actions: "\xC3\x9Akol\xC5\xAF celkem" - desired_login: "U\xC5\xBEivatelsk\xC3\xA9 jm\xC3\xA9no" + openid_url_verified: "Identitní url %{url} bylo úspěšně ověřeno a nastavena autentizace pomocí OpenID." + auth_type_update_error: "Nepodařilo se změnit typ autentizace: %{error_messages}" + failed_to_delete_user: "Nepodařilo se smazat uživatele %{username}" + destroy_successful: "Uživatel %{login} byl úspěšně zničen" + first_user_heading: "Vítejte v TRACKS. Nejdříve je nutné vytvořit administrátorský účet:" + total_contexts: "Kontextů celkem" + successfully_deleted_user: "Uživatel %{username} byl úspěšně smazán" + signup_successful: "Registrace uživatele %{username} byla úspěšná." + new_token_generated: "Nový pešek byl úspěšně vygenerován" + total_projects: "Projektů celkem" + change_password_submit: "Změnit heslo" + no_signups_title: "TRACKS::Registrace není povolena" + user_created: "Uživatel byl vytvořen." + account_signup: "Registrace uživatele" + manage_users: "Správa uživatelů" + password_updated: "Heslo bylo změněno." + auth_type_updated: "Typ autentizace byl změněn." + total_actions: "Úkolů celkem" + desired_login: "Uživatelské jméno" signup: Registrace - confirm_password: "Potvrzen\xC3\xAD hesla" - new_user_heading: "Registrace nov\xC3\xA9ho u\xC5\xBEivatele:" - password_confirmation_label: "Potvrzen\xC3\xAD hesla" - destroy_error: "Nepoda\xC5\x99ilo se smazat u\xC5\xBEivatele %{login}" + confirm_password: "Potvrzení hesla" + new_user_heading: "Registrace nového uživatele:" + password_confirmation_label: "Potvrzení hesla" + destroy_error: "Nepodařilo se smazat uživatele %{login}" choose_password: Zvolte heslo - change_password_title: "TRACKS::Zm\xC4\x9Bna hesla" - change_auth_type_title: "TRACKS::Zm\xC4\x9Bna z\xC5\xAFsobu autentizace" - change_password_prompt: "Pro zm\xC4\x9Bnu hesla zadejte nov\xC3\xA9 hestlo do pol\xC3\xAD n\xC3\xAD\xC5\xBEe a stiskn\xC4\x9Bte 'Zm\xC4\x9Bna hesla'." - new_password_label: "Nov\xC3\xA9 heslo" - register_with_cas: "S va\xC5\xA1\xC3\xADm u\xC5\xBEivatelsk\xC3\xBDm jm\xC3\xA9nem z CASu" - label_auth_type: "Zp\xC5\xAFsob autentizace" - total_users_count: "M\xC3\xA1te celkem %{count} u\xC5\xBEivatel\xC5\xAF" - new_user_title: "TRACKS::P\xC5\x99ihl\xC3\xA1\xC5\xA1en\xC3\xAD jako administr\xC3\xA1tor" - destroy_user: "Zni\xC4\x8Dit u\xC5\xBEivatele" - destroy_confirmation: "Varov\xC3\xA1n\xC3\xAD: tato akce sma\xC5\xBEe u\xC5\xBEivatele '%{login}', v\xC5\xA1echny jeho \xC3\xBAkoly, kontexty, projekty i pozn\xC3\xA1mky. Opravdu chcete pokra\xC4\x8Dovat?" - you_have_to_reset_your_password: "Je nutn\xC3\xA9 zm\xC4\x9Bnit heslo" - signup_new_user: "Registrace nov\xC3\xA9ho u\xC5\xBEivatele" + change_password_title: "TRACKS::Změna hesla" + change_auth_type_title: "TRACKS::Změna zůsobu autentizace" + change_password_prompt: "Pro změnu hesla zadejte nové hestlo do polí níže a stiskněte 'Změna hesla'." + new_password_label: "Nové heslo" + register_with_cas: "S vaším uživatelským jménem z CASu" + label_auth_type: "Způsob autentizace" + total_users_count: "Máte celkem %{count} uživatelů" + new_user_title: "TRACKS::Přihlášení jako administrátor" + destroy_user: "Zničit uživatele" + destroy_confirmation: "Varování: tato akce smaže uživatele '%{login}', všechny jeho úkoly, kontexty, projekty i poznámky. Opravdu chcete pokračovat?" + you_have_to_reset_your_password: "Je nutné změnit heslo" + signup_new_user: "Registrace nového uživatele" identity_url: URL identity - openid_ok_pref_failed: "Va\xC5\xA1e identitn\xC3\xAD URL %{url} bylo \xC3\xBAsp\xC4\x9B\xC5\xA1n\xC4\x9B ov\xC4\x9B\xC5\x99eno, ale do\xC5\xA1lo k probl\xC3\xA9mu p\xC5\x99i ukl\xC3\xA1d\xC3\xA1n\xC3\xAD nastaven\xC3\xAD." - auth_change_submit: !binary | - Wm3Em25pdCB6cMWvc29iIHDFmWlobGHFoW92w6Fuw60= - - change_authentication_type: !binary | - Wm3Em25hIHpwxa9zb2J1IHDFmWlobGHFoW92w6Fuw60= - - total_notes: "Pozn\xC3\xA1mek celkem" - select_authentication_type: "Vyberte nov\xC3\xBD zp\xC5\xAFsob autentizace a stiskn\xC4\x9Bte 'Zm\xC4\x9Bnit zp\xC5\xAFsob p\xC5\x99ihla\xC5\xA1ov\xC3\xA1n\xC3\xAD'." + openid_ok_pref_failed: "Vaše identitní URL %{url} bylo úspěšně ověřeno, ale došlo k problému při ukládání nastavení." + auth_change_submit: "Změnit způsob přihlašování" + change_authentication_type: "Změna způsobu přihlašování" + total_notes: "Poznámek celkem" + select_authentication_type: "Vyberte nový způsob autentizace a stiskněte 'Změnit způsob přihlašování'." contexts: delete_context_title: Smazat kontext - all_completed_tasks_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly v kontextu '%{context_name}'" - hide_form: "Schovat formul\xC3\xA1\xC5\x99" - show_form_title: "Nov\xC3\xBD kontext" - delete_context_confirmation: "Opravdu chcete smazat kontext '%{name}'? Dojde ke smaz\xC3\xA1n\xC3\xAD v\xC5\xA1ech (opakovan\xC3\xBDch) \xC3\xBAkol\xC5\xAF z dan\xC3\xA9ho kontextu!" - todos_append: "v t\xC3\xA9to souvislosti" + all_completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" + hide_form: "Schovat formulář" + show_form_title: "Nový kontext" + delete_context_confirmation: "Opravdu chcete smazat kontext '%{name}'? Dojde ke smazání všech (opakovaných) úkolů z daného kontextu!" + todos_append: "v této souvislosti" delete_context: Smazat kontext edit_context: Upravit kontext - hide_form_title: "Schovat formul\xC3\xA1\xC5\x99" + hide_form_title: "Schovat formulář" hidden_contexts: Schovat kontexty - no_contexts_active: !binary | - xb3DoWRuw6kgYWt0aXZuw60ga29udGV4dHk= - - context_hide: "Schovat z \xC3\xBAvodn\xC3\xAD str\xC3\xA1nky?" - add_context: "Vytvo\xC5\x99it kontext" - show_form: "Nov\xC3\xBD kontext" - save_status_message: "Kontext ulo\xC5\xBEen" - visible_contexts: "Viditeln\xC3\xA9 kontexty" - update_status_message: "N\xC3\xA1zev kontextu byl zm\xC4\x9Bn\xC4\x9Bn" - context_name: "N\xC3\xA1ev kontextu" - status_active: "Kontext je aktivn\xC3\xAD" - completed_tasks_title: "TRACKS::Hotov\xC3\xA9 \xC3\xBAkoly v kontextu '%{context_name}'" - new_context_post: "' bude tak\xC3\xA9 vytvo\xC5\x99en. Opravdu?" - new_context_pre: "Nov\xC3\xBD kontext '" - no_actions: "\xC5\xBD\xC3\xA1dn\xC3\xA9 aktivn\xC3\xAD \xC3\xBAkoly v tomto kontextu" - last_completed_in_context: "v tomto kontextu (posledn\xC3\xADch %{number})" - context_deleted: "Kontext byl odstran\xC4\x9Bn '%{name}'" - no_contexts_hidden: !binary | - xb3DoWRuw6kgc2tyeXTDqSBrb250ZXh0eQ== - - status_hidden: "kontext je skryt\xC3\xBD" + no_contexts_active: "Žádné aktivní kontexty" + context_hide: "Schovat z úvodní stránky?" + add_context: "Vytvořit kontext" + show_form: "Nový kontext" + save_status_message: "Kontext uložen" + visible_contexts: "Viditelné kontexty" + update_status_message: "Název kontextu byl změněn" + context_name: "Náev kontextu" + status_active: "Kontext je aktivní" + completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" + new_context_post: "' bude také vytvořen. Opravdu?" + new_context_pre: "Nový kontext '" + no_actions: "Žádné aktivní úkoly v tomto kontextu" + last_completed_in_context: "v tomto kontextu (posledních %{number})" + context_deleted: "Kontext byl odstraněn '%{name}'" + no_contexts_hidden: "Žádné skryté kontexty" + status_hidden: "kontext je skrytý" login: - openid_identity_url_not_found: "Je n\xC3\xA1m l\xC3\xADto, neexistuje u\xC5\xBEivatel s touto identitou (%{identity_url})" - user_no_expiry: "Neodhl\xC5\xA1ovat" - sign_in: "P\xC5\x99ihl\xC3\xA1sit se" - login_cas: "p\xC5\x99ej\xC3\xADt na CAS" - cas_no_user_found: "Nazdar, %{username}! Nem\xC3\xA1te \xC3\xBA\xC4\x8Det na Tracks." - cas_login: !binary | - UMWZaWhsw6HFoWVuw60gcMWZZXMgQ0FT - - successful_with_session_info: !binary | - UMWZaWhsw6HFoWVuw60gYnlsbyDDunNwxJvFoW7DqTo= - - please_login: "Pro pokra\xC4\x8Dov\xC3\xA1n\xC3\xAD se pros\xC3\xADm p\xC5\x99ihl\xC5\xA1te do Tracks" - cas_logged_in_greeting: "Zdrav\xC3\xAD\xC4\x8Dko, %{username}! Byl jste autorizov\xC3\xA1n." - cas_username_not_found: "Bohu\xC5\xBEel neexistuje u\xC5\xBEivatel v CASu se jm\xC3\xA9nem (%{username})" - cas_create_account: "Pro vytvo\xC5\x99en\xC3\xAD \xC3\xBA\xC4\x8Dtu v CASu pros\xC3\xADm pokra\xC4\x8Dujte sem %{signup_link}" - mobile_use_openid: !binary | - 4oCmbmVibyBwxZlpaGzDocWhZW7DrSBzIE9wZW5JRA== - - cas_signup_link: !binary | - VnnFvsOhZGF0IMO6xI1ldA== - - account_login: !binary | - UMWZaWhsw6HFoWVuw60gdcW+aXZhdGVsZQ== - - successful: !binary | - UMWZaWhsw6HFoWVuw60gw7pzcMSbxaFuw6kuIFbDrXRlanRlIHpwxJt0IQ== - - session_will_not_expire: "sezen\xC3\xAD bylo nastaveno jako trval\xC3\xA9." + openid_identity_url_not_found: "Je nám líto, neexistuje uživatel s touto identitou (%{identity_url})" + user_no_expiry: "Neodhlšovat" + sign_in: "Přihlásit se" + login_cas: "přejít na CAS" + cas_no_user_found: "Nazdar, %{username}! Nemáte účet na Tracks." + cas_login: "Přihlášení přes CAS" + successful_with_session_info: "Přihlášení bylo úspěšné:" + please_login: "Pro pokračování se prosím přihlšte do Tracks" + cas_logged_in_greeting: "Zdravíčko, %{username}! Byl jste autorizován." + cas_username_not_found: "Bohužel neexistuje uživatel v CASu se jménem (%{username})" + cas_create_account: "Pro vytvoření účtu v CASu prosím pokračujte sem %{signup_link}" + mobile_use_openid: "…nebo přihlášení s OpenID" + cas_signup_link: "Vyžádat účet" + account_login: "Přihlášení uživatele" + successful: "Přihlášení úspěšné. Vítejte zpět!" + session_will_not_expire: "sezení bylo nastaveno jako trvalé." option_separator: nebo - session_time_out: "Sezen\xC3\xAD vypr\xC5\xA1elo. Pros\xC3\xADm %{link}" - session_will_expire: "sezen vypr\xC5\xA1\xC3\xAD za %{hours} hodin neaktivity." - login_standard: "vra\xC5\xA5te se ke standardn\xC3\xADmu p\xC5\x99ihl\xC3\xA1\xC5\xA1en\xC3\xAD" - login_with_openid: "p\xC5\x99ihla\xC5\xA1te se se sv\xC3\xBDm OpenID" - unsuccessful: !binary | - UMWZaWhsw6HFoWVuw60gYnlsbyDDunNwxJvFoW7DqS4= - - log_in_again: "p\xC5\x99ihla\xC5\xA1te se znovu." + session_time_out: "Sezení vypršelo. Prosím %{link}" + session_will_expire: "sezen vyprší za %{hours} hodin neaktivity." + login_standard: "vraťte se ke standardnímu přihlášení" + login_with_openid: "přihlašte se se svým OpenID" + unsuccessful: "Přihlášení bylo úspěšné." + log_in_again: "přihlašte se znovu." logged_out: You have been logged out of Tracks. datetime: prompts: minute: Minuta second: Sekunda - month: !binary | - TcSbc8OtYw== - + month: "Měsíc" hour: Hodina day: Den year: Rok distance_in_words: less_than_x_minutes: - one: !binary | - bcOpbsSbIG5lxb4gbWludXRh - - other: "m\xC3\xA9n\xC4\x9B ne\xC5\xBE %{count} minut" - zero: !binary | - bcOpbsSbIG5lxb4gbWludXRh - + one: "méně než minuta" + other: "méně než %{count} minut" + zero: "méně než minuta" almost_x_years: one: almost 1 rok other: skoro %{count} let x_days: one: 1 den - other: "%{count} dn\xC3\xAD" + other: "%{count} dní" x_seconds: one: 1 sekunda other: "%{count} sekund" about_x_hours: one: about 1 hodina - other: "p\xC5\x99ibli\xC5\xBEn\xC4\x9B %{count} hodin" + other: "přibližně %{count} hodin" less_than_x_seconds: - one: "m\xC3\xA9n\xC4\x9B ne\xC5\xBE 1 sekunda" - other: "m\xC3\xA9n ne\xC5\xBE %{count} sekund" - zero: "m\xC3\xA9n\xC4\x9B ne\xC5\xBE 1 sekunda" + one: "méně než 1 sekunda" + other: "mén než %{count} sekund" + zero: "méně než 1 sekunda" x_months: - one: !binary | - MSBtxJtzw61j - - other: !binary | - JXtjb3VudH0gbcSbc8OtY8Wv - + one: "1 měsíc" + other: "%{count} měsíců" x_minutes: one: 1 minuta other: "%{count} minut" about_x_years: one: about 1 rok - other: "p\xC5\x99ibli\xC5\xBEn\xC4\x9B %{count} let" + other: "přibližně %{count} let" about_x_months: - one: "about 1 m\xC4\x9Bs\xC3\xADc" - other: !binary | - cMWZaWJsacW+bsSbICV7Y291bnR9IG3Em3PDrWPFrw== - + one: "about 1 měsíc" + other: "přibližně %{count} měsíců" over_x_years: - one: "p\xC5\x99es rok" - other: "p\xC5\x99es %{count} let" - half_a_minute: "p\xC5\xAFl minuty" + one: "přes rok" + other: "přes %{count} let" + half_a_minute: "půl minuty" search: - contexts_matching_query: "Nalezen\xC3\xA9 kontexty" - tags_matching_query: !binary | - TmFsZXplbsOpIMWhdMOtdGt5 - - no_results: "Na v\xC3\xA1\xC5\xA1 dotaz nebylo nic nalezeno." - todos_matching_query: "Nalezen\xC3\xA9 \xC3\xBAkoly" - projects_matching_query: "Nalezen\xC3\xA9 projekty" - notes_matching_query: "Nalezen\xC3\xA9 pozn\xC3\xA1mky" + contexts_matching_query: "Nalezené kontexty" + tags_matching_query: "Nalezené štítky" + no_results: "Na váš dotaz nebylo nic nalezeno." + todos_matching_query: "Nalezené úkoly" + projects_matching_query: "Nalezené projekty" + notes_matching_query: "Nalezené poznámky" diff --git a/config/locales/de.yml b/config/locales/de.yml index 39001004..d063bc54 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -16,7 +16,7 @@ de: contexts: Kontexte home: Home navigation: - manage_users_title: "Benutzer hinzuf\xC3\xBCgen oder entfernen" + manage_users_title: "Benutzer hinzufügen oder entfernen" recurring_todos: Sich wiederholende To-Dos api_docs: REST API Docs help: "?" @@ -30,8 +30,8 @@ de: preferences: Einstellungen integrations_: Tracks integrieren export_title: Daten importieren und exportieren - calendar_title: "Kalender mit \xC3\xBCberf\xC3\xA4lligen Aufgaben" - feeds_title: "Liste der verf\xC3\xBCgbaren Feeds anzeigen" + calendar_title: "Kalender mit überfälligen Aufgaben" + feeds_title: "Liste der verfügbaren Feeds anzeigen" stats_title: Statistiken anzeigen tickler: Notizbuch home_title: Start @@ -40,13 +40,13 @@ de: completed_tasks: Erledigt view: Betrachten organize: Organisieren - completed_tasks_title: "Vollst\xC3\xA4ndig" + completed_tasks_title: "Vollständig" home: Start export: Export contexts_title: Kontexte preferences_title: Meine Einstellungen - search: "Alle Eintr\xC3\xA4ge durchsuchen" - review_title: "Machen Sie \xC3\xBCberpr\xC3\xBCfen" + search: "Alle Einträge durchsuchen" + review_title: "Machen Sie überprüfen" projects_title: Projekte calendar: Kalender number: @@ -77,19 +77,17 @@ de: currency: format: format: "%n%u" - unit: !binary | - 4oKs - + unit: "€" separator: . precision: delimiter: "," common: recurring_todos: Wiederholenden Aktionen - back: "Zur\xC3\xBCck" + back: "Zurück" actions: Aktionen third: Dritte - add: "Hinzuf\xC3\xBCgen" - go_back: "Zur\xC3\xBCck" + add: "Hinzufügen" + go_back: "Zurück" previous: Vorherige logout: Abmelden second: Zweite @@ -109,9 +107,7 @@ de: notes: Notizen projects: Projekte last: Letzte - review: !binary | - w5xiZXJwcsO8ZnVuZw== - + review: "Überprüfung" action: Aktion days_midsentence: one: Tag @@ -141,7 +137,7 @@ de: description: Beschreibung errors_with_fields: "Mit folgenden Feldern sind Probleme aufgetreten:" drag_handle: Verschieben - next: "N\xC3\xA4chste" + next: "Nächste" fourth: Vierte context: Kontext contexts: Kontexte @@ -156,10 +152,10 @@ de: not_available_abbr: n/b integrations: opensearch_description: In Tracks suchen - applescript_next_action_prompt: "Beschreibung der n\xC3\xA4chsten Aufgabe:" - gmail_description: "Gadget, um Tracks als Gadget zu Googlemail hinzuzuf\xC3\xBCgen" + applescript_next_action_prompt: "Beschreibung der nächsten Aufgabe:" + gmail_description: "Gadget, um Tracks als Gadget zu Googlemail hinzuzufügen" applescript_success_after_id: erstellt - applescript_success_before_id: "N\xC3\xA4chste neue Aufgabe mit ID" + applescript_success_before_id: "Nächste neue Aufgabe mit ID" activerecord: attributes: project: @@ -172,7 +168,7 @@ de: updated_at: Aktualisiert am todo: show_from: Zeigen ab dem - predecessors: "H\xC3\xA4ngt ab von" + predecessors: "Hängt ab von" notes: Notizen tags: Stichworte project: Projekt @@ -181,18 +177,18 @@ de: due: Fällig preference: show_hidden_projects_in_sidebar: Zeige Versteckte Projekte in der Sidebar - show_hidden_contexts_in_sidebar: "Zeige Versteckte Zusammenh\xC3\xA4nge in der Sidebar" + show_hidden_contexts_in_sidebar: "Zeige Versteckte Zusammenhänge in der Sidebar" date_format: Datum Format sms_context: Standard-E-Mail-Kontext - verbose_action_descriptors: "Ausf\xC3\xBChrlich Aktion Deskriptoren" + verbose_action_descriptors: "Ausführlich Aktion Deskriptoren" staleness_starts: Anfang des Abgestandenheit mobile_todos_per_page: Aufgaben pro Seite (Mobile Version) - show_number_completed: "Zeige Zahl der abgeschlossenen Ma\xC3\x9Fnahmen" + show_number_completed: "Zeige Zahl der abgeschlossenen Maßnahmen" title_date_format: Titel Datumsformat refresh: Aktualisierungsintverall (in Minuten) week_starts: Woche startet am last_name: Nachname - due_style: "F\xC3\xA4llig stijl" + due_style: "Fällig stijl" locale: Zahle time_zone: Zeit Zone sms_email: Per E-Mail @@ -213,27 +209,27 @@ de: taken: existiert bereits messages: record_invalid: "Validierung fehlgeschlagen: %{Fehler}" - greater_than_or_equal_to: "muss gr\xC3\xB6\xC3\x9Fer oder gleich %{count} sein" - confirmation: "stimmt nicht mit der Best\xC3\xA4tigung \xC3\xBCberein" + greater_than_or_equal_to: "muss größer oder gleich %{count} sein" + confirmation: "stimmt nicht mit der Bestätigung überein" less_than_or_equal_to: muss kleiner oder gleich %{count} sein - blank: "muss ausgef\xC3\xBCllt werden" - exclusion: "ist nicht verf\xC3\xBCgbar" - invalid: "ist nicht g\xC3\xBCltig" + blank: "muss ausgefüllt werden" + exclusion: "ist nicht verfügbar" + invalid: "ist nicht gültig" odd: muss ungerade sein even: muss gerade sein - empty: "muss ausgef\xC3\xBCllt werden" + empty: "muss ausgefüllt werden" too_short: ist zu kurz (nicht weniger als %{count} Zeichen) - wrong_length: "hat die falsche L\xC3\xA4nge (muss genau %{count} Zeichen haben)" + wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)" less_than: muss kleiner als %{count} sein - greater_than: "muss gr\xC3\xB6\xC3\x9Fer als %{count} sein" + greater_than: "muss größer als %{count} sein" equal_to: muss genau %{count} sein accepted: muss akzeptiert werden too_long: ist zu lang (nicht mehr als %{count} Zeichen) taken: ist bereits vergeben - inclusion: "ist kein g\xC3\xBCltiger Wert" + inclusion: "ist kein gültiger Wert" not_a_number: ist keine Zahl template: - body: "Bitte \xC3\xBCberpr\xC3\xBCfen Sie die folgenden Felder:" + body: "Bitte überprüfen Sie die folgenden Felder:" header: one: "Konnte dieses %{model} Objekt nicht speichern: 1 Fehler." other: "Konnte dieses %{model} Objekt nicht speichern: %{count} Fehler." @@ -245,37 +241,37 @@ de: models: project: feed_title: Tracks-Projekte - feed_description: "Listet alle Projekte f\xC3\xBCr %{username} auf" + feed_description: "Listet alle Projekte für %{username} auf" todo: error_date_must_be_future: muss ein Datum in der Zukunft sein preference: - due_on: "F\xC3\xA4llig auf %{date}" - due_in: "F\xC3\xA4llig in %{days} Tagen" + due_on: "Fällig auf %{date}" + due_in: "Fällig in %{days} Tagen" due_styles: - - "F\xC3\xA4llig in ___ Tagen" - - "F\xC3\xA4llig am _______" + - "Fällig in ___ Tagen" + - "Fällig am _______" user: - error_context_not_associated: "Kontext-ID %{context} nicht mit Benutzer-ID %{user} verkn\xC3\xBCpft." - error_project_not_associated: "Projekt-ID %{project} nicht mit User-ID %{user} verkn\xC3\xBCpft." + 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." stats: totals_hidden_context_count: und %{count} sind versteckte Kontexte. actions_avg_created: In den letzten 12 Monaten hast du im Durchschnitt %{count} Aktionen erstellt - actions_min_max_completion_days: "Das Minimum/Maximum an Tagen einer Vervollst\xC3\xA4ndigung ist %{min}/%{max}." + actions_min_max_completion_days: "Das Minimum/Maximum an Tagen einer Vervollständigung ist %{min}/%{max}." totals_actions_completed: "%{count} davon sind abgeschlossen." tag_cloud_title: Tag-Cloud aller Aktionen actions_actions_avg_created_30days: In den letzten 30 Tagen hast du im Durchschnitt %{count} Aktionen erstellt actions_avg_completed: und %{count} durchschnittlich davon monatlich erledigt - top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unvollst\xC3\xA4ndigen Aktionen" + top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unvollständigen Aktionen" actions: Aktionen time_of_day_legend: number_of_actions: Anzahl Aufgaben time_of_day: Tageszeit - totals_incomplete_actions: "Du hast %{count} unvollst\xC3\xA4ndige Aktionen" - totals_deferred_actions: "von denen %{count} im Notizbuch zur\xC3\xBCckgestellt sind" + totals_incomplete_actions: "Du hast %{count} unvollständige Aktionen" + totals_deferred_actions: "von denen %{count} im Notizbuch zurückgestellt sind" running_time_legend: actions: Aufgaben percentage: Prozentsatz - weeks: "Vergangene Zeit einer Aktion (Wochen). Klick auf eine Leiste f\xC3\xBCr mehr Informationen." + weeks: "Vergangene Zeit einer Aktion (Wochen). Klick auf eine Leiste für mehr Informationen." totals_action_count: hattest du insgesamt %{count} Aktionen tag_cloud_90days_title: Tag-Cloud-Aktionen in den letzten 90 Tagen actions_avg_completion_time: Durchschnittlich hast du %{count} Tage gebraucht, um eine Aktion abzuschliessen. @@ -290,10 +286,10 @@ de: avg_created: Durchschnittlich erstellt avg_completed: Durchschnittlich fertiggestellt created: Erstellt - actions_selected_from_week: "Aktionen ausgew\xC3\xA4hlt ab Woche" + actions_selected_from_week: "Aktionen ausgewählt ab Woche" actions_day_of_week_title: Wochentag (alle Aktionen) actions_lastyear_title: Aktionen der letzten 12 Monate - open_per_week: "Aktiv (sichtbar und unsichtbar) n\xC3\xA4chsten Aktionen pro Woche" + open_per_week: "Aktiv (sichtbar und unsichtbar) nächsten Aktionen pro Woche" action_selection_title: TRACKS::Aktionsauswahl totals_project_count: Du hast %{count} Projekte. legend: @@ -304,7 +300,7 @@ de: running_time: Laufzeit einer Aktion (Wochen) percentage: Prozentsatz months_ago: Monate zuvor - current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unvollst\xC3\xA4ndiger sichtbarer Aufgaben" + current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unvollständiger sichtbarer Aufgaben" tod30_legend: number_of_actions: Anzahl Aufgaben time_of_day: Tageszeit @@ -319,16 +315,16 @@ de: top10_projects: Top 10 aller Projekte contexts: Kontexte totals: Ingesamt - click_to_return: "Klick auf %{link} um zur Statistikseite zur\xC3\xBCckzukehren." + click_to_return: "Klick auf %{link} um zur Statistikseite zurückzukehren." tag_cloud_90days_description: Diese Tag-Cloud beinhaltet Tags der Aktionen, die in den letzten 90 Tagen erstellt oder abgeschlossen wurden. totals_visible_context_count: Von diesen sind %{count} sichtbare Kontexte top10_projects_30days: Top-10-Projekt der letzten 30 Tage - running_time_all: "Aktuelle Laufzeit aller unvollst\xC3\xA4ndigen Aktionen." - actions_min_completion_time: "Die minimale Zeit betr\xC3\xA4gt %{time}." + running_time_all: "Aktuelle Laufzeit aller unvollständigen Aktionen." + actions_min_completion_time: "Die minimale Zeit beträgt %{time}." action_completion_time_title: Fertigstellungszeit (alle abgeschlossenen Aktionen) click_to_show_actions_from_week: Klick auf %{link} um die Aktionen von Woche %{week} und danach anzuzeigen. - top10_longrunning: "Top 10 der am l\xC3\xA4ngsten laufenden Projekte" - no_actions_selected: "Es sind keine Aufgaben ausgew\xC3\xA4hlt." + top10_longrunning: "Top 10 der am längsten laufenden Projekte" + no_actions_selected: "Es sind keine Aufgaben ausgewählt." totals_tag_count: Du hast %{count} Tags in Aktionen. actions_further: und danach actions_dow_30days_legend: @@ -339,11 +335,11 @@ de: spread_of_actions_for_all_context: Aufgabenverteilung aller Kontexte click_to_update_actions: Klicke auf eine Leiste in der Grafik um die Aktionen unten zu aktualisieren. click_to_return_link: hier - more_stats_will_appear: "Weitere Statistiken werden verf\xC3\xBCgbar, wenn einige Aufgaben hinzugef\xC3\xBCgt wurden." + more_stats_will_appear: "Weitere Statistiken werden verfügbar, wenn einige Aufgaben hinzugefügt wurden." actions_avg_completed_30days: und %{count} durchschnittlich davon erledigt. index_title: TRACKS::Statistik actions_30days_title: _Aktionen der letzten 30 Tage - no_tags_available: "keine Tags verf\xC3\xBCgbar" + no_tags_available: "keine Tags verfügbar" actions_dow_30days_title: Wochentag (letzte 30 Tage) actions_day_of_week_legend: number_of_actions: Anzahl der Aktionen @@ -351,12 +347,12 @@ de: within_one: Innerhalb von 1 spread_of_running_actions_for_visible_contexts: Verteilung der laufenden Aufgaben aller sichtbaren Kontexte actions_last_year: Aktionen im letzten Jahr - totals_blocked_actions: "%{count} h\xC3\xA4ngen vom Abschluss anderer Aktionen ab." + totals_blocked_actions: "%{count} hängen vom Abschluss anderer Aktionen ab." totals_unique_tags: Von diesen Tags sind %{count} einmalig.. totals_active_project_count: Von diesen sind %{count} aktive Projekte running_time_all_legend: actions: Aktionen - running_time: "Laufzeit einer Aktion (Wochen). Klick auf eine Leiste f\xC3\xBCr mehr Informationen." + running_time: "Laufzeit einer Aktion (Wochen). Klick auf eine Leiste für mehr Informationen." percentage: Prozentsatz other_actions_label: (andere) totals_hidden_project_count: "%{count} sind versteckt" @@ -372,38 +368,38 @@ de: blocked_by: Blockiert durch %{predecessors} star_action: Aktion markieren completed_recurrence_completed: Es gibt keine weitere Aktion nach der soeben gelöschten. Die Wiederholung ist abgeschlossen. - defer_date_after_due_date: "Zur\xC3\xBCckstellungsdatum nach Ablaufdatum. Bitte passe das Ablaufdatum an, dass es vor dem Zur\xC3\xBCckstellungsdatum liegt." + defer_date_after_due_date: "Zurückstellungsdatum nach Ablaufdatum. Bitte passe das Ablaufdatum an, dass es vor dem Zurückstellungsdatum liegt." unable_to_add_dependency: Abhängigkeit nicht hinzufügbar done: Erledigt? star_action_with_description: Aktion '%{description}' markieren tagged_with: getagged mit ‘%{tag_name}’ completed: Erledigt - no_deferred_actions_with: "Keine zur\xC3\xBCckgestellten Aktionen mit dem Tag '%{tag_name}'" + no_deferred_actions_with: "Keine zurückgestellten Aktionen mit dem Tag '%{tag_name}'" no_hidden_actions: Momentan sind keine versteckten Aufgaben vorhanden edit_action_with_description: Aktion '%{description}' bearbeiten - action_due_on: "(Aktion f\xC3\xA4llig am %{date})" + action_due_on: "(Aktion fällig am %{date})" list_incomplete_next_actions: Unerledigte Folge-Aufgaben anzeigen archived_tasks_title: TRACKS::Archivierte erledigte Aufgaben remove_dependency: Abhängigkeit löschen (löscht nicht die Aufgabe) action_deleted_success: Die nächste Aktion erfolgreich gelöscht tags: Tags (Komma-separiert) - delete_recurring_action_title: "Wiederkehrende Aktion '%{description}' l\xC3\xB6schen" + delete_recurring_action_title: "Wiederkehrende Aktion '%{description}' löschen" context_changed: Kontext zu %{name} gewechselt - new_related_todo_created: "Eine neue To-Do wurde hinzugef\xC3\xBCgt, die zu dieser wiederkehrenden To-Do geh\xC3\xB6rt" + new_related_todo_created: "Eine neue To-Do wurde hinzugefügt, die zu dieser wiederkehrenden To-Do gehört" mobile_todos_page_title: Alle Aufgaben - add_another_dependency: "F\xC3\xBCgen Sie eine andere Abh\xC3\xA4ngigkeit" - removed_predecessor: "%{successor} entfernt als Abh\xC3\xA4ngigkeit von %{predecessor}." + add_another_dependency: "Fügen Sie eine andere Abhängigkeit" + removed_predecessor: "%{successor} entfernt als Abhängigkeit von %{predecessor}." recurring_actions_title: TRACKS::Wiederkehrende Aktionen next_action_needed: Es muss mindestens eine folgende Aktion angelegt werden action_saved: Aktion gespeichert - scheduled_overdue: "Planm\xC3\xA4\xC3\x9Fig angezeigt vor %{days} Tagen" + scheduled_overdue: "Planmäßig angezeigt vor %{days} Tagen" action_deleted_error: Fehler beim Löschen der Aufgabe edit_action: Aktion bearbeiten - added_new_context: "Neuer Kontext hinzugef\xC3\xBCgt" + added_new_context: "Neuer Kontext hinzugefügt" next_actions_description: "Filter:" list_incomplete_next_actions_with_limit: Zeige die letzten %{count} unerledigten Folge-Aufgaben set_to_pending: "%{task} als ausstehend markiert" - added_new_project: "Neues Projekt hinzugef\xC3\xBCgt" + added_new_project: "Neues Projekt hinzugefügt" next_actions_title_additions: completed: Aufgaben erledigt due_today: heute fällig @@ -435,39 +431,39 @@ de: completed_tagged_page_title: "TRACKS:: Erledigte Aufgaben mit Tag %{tag_name}" pending: Ausstehend completed_tasks_title: TRACKS::Erledigte Aufgaben - deleted_success: "Die Aktion wurde erfolgreich gel\xC3\xB6scht." + deleted_success: "Die Aktion wurde erfolgreich gelöscht." feed_title_in_project: im Projekt '%{project}' clear_due_date: Fälligkeitsdatum leeren - error_removing_dependency: "Beim Entfernen der Abh\xC3\xA4ngigkeit ist ein Fehler aufgetreten" + error_removing_dependency: "Beim Entfernen der Abhängigkeit ist ein Fehler aufgetreten" hidden_actions: Verstecke Aufgaben was_due_on_date: war am %{date} fällig show_on_date: Anzeigen am %{date} recurrence_period: Wiederholungszeitraum - deferred_actions_with: "Zur\xC3\xBCckgestellte Aktionen mit dem Tag '%{tag_name}'" - confirm_delete: "Bist du sicher, dass du die Aktion '%{description}' l\xC3\xB6schen m\xC3\xB6chtest?" - recurring_deleted_success: "Die wiederkehrende Aktion wurde erfolgreich gel\xC3\xB6scht." + deferred_actions_with: "Zurückgestellte Aktionen mit dem Tag '%{tag_name}'" + confirm_delete: "Bist du sicher, dass du die Aktion '%{description}' löschen möchtest?" + recurring_deleted_success: "Die wiederkehrende Aktion wurde erfolgreich gelöscht." no_completed_actions_with: Keine abgeschlossenen Aktionen mit dem Tag '%{tag_name}' next_actions_title: TRACKS::Weitere Aufgaben - next_action_description: "Beschreibung der n\xC3\xA4chsten Aktion" + next_action_description: "Beschreibung der nächsten Aktion" deferred_tasks_title: TRACKS::Notizbuch clear_show_from_date: Datum leeren in_hidden_state: als versteckt markiert - see_all_completed: "Sie k\xC3\xB6nnen alle Aktionen abgeschlossen siehe %{link}" + see_all_completed: "Sie können alle Aktionen abgeschlossen siehe %{link}" calendar_page_title: TRACKS::Kalender - unresolved_dependency: "Der Wert, den Sie in die Abh\xC3\xA4ngigkeit Feld eingegeben nicht zu einer bestehenden Aktion zu l\xC3\xB6sen. Dieser Wert wird nicht mit dem Rest der Aktion gerettet werden. Weiter gehen?" + unresolved_dependency: "Der Wert, den Sie in die Abhängigkeit Feld eingegeben nicht zu einer bestehenden Aktion zu lösen. Dieser Wert wird nicht mit dem Rest der Aktion gerettet werden. Weiter gehen?" no_actions_found_title: Keine Aktionen gefunden show_today: Heute anzeigen next_actions_due_date: - overdue_by: "\xC3\x9Cberf\xC3\xA4llig mit %{days} Tag" - due_in_x_days: "F\xC3\xA4llig in %{days} Tagen" - due_today: "Heute f\xC3\xA4llig" - overdue_by_plural: "\xC3\x9Cberf\xC3\xA4llig mit %{days} Tagen" - due_tomorrow: "F\xC3\xA4llig morgen" + overdue_by: "Überfällig mit %{days} Tag" + due_in_x_days: "Fällig in %{days} Tagen" + due_today: "Heute fällig" + overdue_by_plural: "Überfällig mit %{days} Tagen" + due_tomorrow: "Fällig morgen" completed_last_x_days: In den letzten %{count} Tagen erledigt - no_actions_with: "Im Augenblick gibt es keine unvollst\xC3\xA4ndigen Aktionen mit dem Tag '%{tag_name}'" + no_actions_with: "Im Augenblick gibt es keine unvollständigen Aktionen mit dem Tag '%{tag_name}'" defer_x_days: - one: "Einen Tag zur\xC3\xBCckstellen" - other: "%{count} Tage zur\xC3\xBCckstellen" + one: "Einen Tag zurückstellen" + other: "%{count} Tage zurückstellen" added_new_next_action_singular: Neue weiterführende Aufgabe angelegt no_completed_actions: Momentan sind keine erledigten Aufgaben vorhanden. deferred_pending_actions: Aufgeschobene/ausstehende Aufgaben @@ -478,13 +474,13 @@ de: completed: "Erledigt: %{date}" due: "F&auuml;llig: %{date}" recurring_todos: Wiederkehrende To-Dos - error_deleting_recurring: "Beim L\xC3\xB6schen der wiederkehrenden To-Do %{description} ist ein Fehler aufgetreten" - delete_action: "Aktion l\xC3\xB6schen" - delete: "L\xC3\xB6schen" + error_deleting_recurring: "Beim Löschen der wiederkehrenden To-Do %{description} ist ein Fehler aufgetreten" + delete_action: "Aktion löschen" + delete: "Löschen" no_last_completed_actions: Keine abgeschlossene Aktionen gefunden - drag_action_title: "Auf andere Aktion ziehen, um sie als Abh\xC3\xA4ngigkeit zu definieren" - cannot_add_dependency_to_completed_todo: "Kann nicht hinzugef\xC3\xBCgt werden diese Aktion als eine Abh\xC3\xA4ngigkeit zu einer abgeschlossenen Aktion!" - depends_on: "H\xC3\xA4ngt ab von" + drag_action_title: "Auf andere Aktion ziehen, um sie als Abhängigkeit zu definieren" + cannot_add_dependency_to_completed_todo: "Kann nicht hinzugefügt werden diese Aktion als eine Abhängigkeit zu einer abgeschlossenen Aktion!" + depends_on: "Hängt ab von" tickler_items_due: one: Ein Notizbuch-Eintrag ist nun fällig - lade die Seite neu, um sie zu sehen. other: "%{count} Notizbuch-Einträge sind nun fällig - lade die Seite neu, um sie zu sehen." @@ -512,13 +508,13 @@ de: every_work_day: Jeden Arbeitstag ends_on_number_times: Endet nach %{number} Mal recurrence_on_due_date: Das Datum der To-Do ist verstrichen. - weekly_options: "Einstellungen f\xC3\xBCr sich w\xC3\xB6chentlich wiederholende Aktionen" - weekly: "W\xC3\xB6chentlich" - monthly_options: "Einstellungen f\xC3\xBCr sich monatlich wiederholende Aktionen" - daily_options: "Einstellungen f\xC3\xBCr sich t\xC3\xA4glich wiederholenden Aktionen" + weekly_options: "Einstellungen für sich wöchentlich wiederholende Aktionen" + weekly: "Wöchentlich" + monthly_options: "Einstellungen für sich monatlich wiederholende Aktionen" + daily_options: "Einstellungen für sich täglich wiederholenden Aktionen" monthly: Monatlich starts_on: Beginnt am - daily: "T\xC3\xA4glich" + daily: "Täglich" show_option_always: immer pattern: third: Drittel @@ -526,9 +522,7 @@ de: - - Januar - Februar - - !binary | - TcOkcno= - + - "März" - April - Mai - Juni @@ -540,14 +534,14 @@ de: - Dezember every_n: jeden %{n} second: zweite - every_xth_day_of_every_n_months: "jedes %{x} %{day} jedes %{n_months} \xE2\x80\x8B" + every_xth_day_of_every_n_months: "jedes %{x} %{day} jedes %{n_months} ​" on_day_n: am Tag %{n} - weekly: "w\xC3\xB6chentlich" + weekly: "wöchentlich" from: von last: zuletzt every_day: jeden Tag the_xth_day_of_month: der %{x} %{day} von %{month} - times: "f\xC3\xBCr %{number} Zeiten" + times: "für %{number} Zeiten" first: erste show: Show every_year_on: jedes Jahr in %{date} @@ -561,7 +555,7 @@ de: - Freitag - Samstag fourth: vierte - due: "F\xC3\xA4llig" + due: "Fällig" every_month: jeden Monat until: bis yearly_every_x_day: "Jeden %{day}. %{month} " @@ -570,13 +564,13 @@ de: show_options: To-Do anzeigen weekly_every_number_week: Kehrt jede %{number}. Woche wieder am ends_on: Endet am - show_days_before: "%{days} Tage bevor die To-Do f\xC3\xA4llig ist" + show_days_before: "%{days} Tage bevor die To-Do fällig ist" from_tickler: the date todo comes from tickler (no due date set) no_end_date: Kein Enddatum day_x_on_every_x_month: Tag %{day} in jedem %{month}. Monat yearly_every_xth_day: Den %{day} %{day_of_week} des %{month} - yearly_options: "Einstellungen f\xC3\xBCr sich j\xC3\xA4hrlich wiederholende Aktionen" - yearly: "J\xC3\xA4hrlich" + yearly_options: "Einstellungen für sich jährlich wiederholende Aktionen" + yearly: "Jährlich" monthly_every_xth_day: Der %{day} %{day_of_week} eines jeden %{month}. Monats action_deferred: Die Aktion \'% {description}\' wurde vertagt tagged_page_title: TRACKS::Als '%{tag_name}' markiert @@ -586,9 +580,9 @@ de: no_deferred_actions: Zur Zeit sind keine zurückgestellten Aktionen vorhanden. recurrence_completed: Nach dieser wiederkehrenden Aktion, die du gerade abgeschlossen hast, folgt keine mehr. Die Wiederholung endet hiermit action_marked_complete_error: Die Aktion '%{description}' wurde aufgrund eines Fehlers NICHT als %{completed} markiert. - no_actions_found: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aktionen." + no_actions_found: "Momentan gibt es keine unvollständigen Aktionen." in_pending_state: und als ausstehend markiert - error_toggle_complete: "K\xC3\xB6nnte nicht diese Marke todo komplett" + error_toggle_complete: "Könnte nicht diese Marke todo komplett" due: Fällig no_incomplete_actions: Es gibt keine unerledigten Aufgaben action_saved_to_tickler: Aktion im Notizbuch gespeichert @@ -602,24 +596,24 @@ de: completed: In den letzten %{count} Tagen due_date: mit einem Datum %{due_date} oder früher overdue: "Überfällig" - add_new_recurring: "F\xC3\xBCge eine neue wiederkehrende Aktion hinzu" + add_new_recurring: "Füge eine neue wiederkehrende Aktion hinzu" notes: delete_note_title: Notiz '%{id}' löschen - delete_confirmation: "Bist du sicher, dass du die Notiz '%{id}' l\xC3\xB6schen m\xC3\xB6chtest?" + delete_confirmation: "Bist du sicher, dass du die Notiz '%{id}' löschen möchtest?" in_project: "In:" delete_item_title: Eintrag löschen - deleted_note: "Notiz '%{id}' l\xC3\xB6schen" + deleted_note: "Notiz '%{id}' löschen" note_link_title: Notiz %{id} anzeigen show_note_title: Notiz anzeigen edit_item_title: Eintrag bearbeiten note_location_link: "In:" - no_notes_available: "Derzeit gibt es keine Notizen: f\xC3\xBCge Notizen von der jeweiligen Projektseite hinzu." + no_notes_available: "Derzeit gibt es keine Notizen: füge Notizen von der jeweiligen Projektseite hinzu." note_header: Notiz %{id} delete_note_confirm: Soll die Notiz '%{id}' wirklich gelöscht werden? projects: default_context_set: Standard-Kontext des Projekts auf %{default_context} gesetzt - no_actions_in_project: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aktionen in diesem Projekt" - deferred_actions: "Aufgeschobene Aufgaben f\xC3\xBCr dieses Projekt" + no_actions_in_project: "Momentan gibt es keine unvollständigen Aktionen in diesem Projekt" + deferred_actions: "Aufgeschobene Aufgaben für dieses Projekt" was_marked_hidden: wurde als verborgen markiert edit_project_title: Projekt bearbeiten default_tags_removed_notice: Standard-Tags entfernt @@ -627,22 +621,22 @@ de: all_completed_tasks_title: "TRACKS:: Alle auflisten Abgeschlossene Aktionen in Project '%{project_name}'" hide_form: Fomular verstecken list_completed_projects: "TRACKS:: Liste Abgeschlossene Projekte" - no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verkn\xC3\xBCpft." + no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verknüpft." to_new_project_page: Zu neuem Projekt weiterleiten show_form_title: Neues Projekt anlegen - deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben f\xC3\xBCr dieses Projekt" + deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben für dieses Projekt" project_state: Projekt ist %{state} this_project: Dieses Projekt no_last_completed_projects: Keine abgeschlossene Projekte gefunden no_last_completed_recurring_todos: Keine abgeschlossene sich wiederholende To-Dos gefunden notes: Notizen todos_append: an dieses Projekt - list_reviews: "TRACKS::R\xC3\xBCckblick" - notes_empty: "Es gibt keine Notizen f\xC3\xBCr dieses Projekt" + list_reviews: "TRACKS::Rückblick" + notes_empty: "Es gibt keine Notizen für dieses Projekt" no_projects: Keine Projekte vorhanden hide_form_title: Formular verstecken delete_project: Projekt löschen - completed_actions_empty: "Es gibt keine erledigten Aufgaben f\xC3\xBCr dieses Projekt" + completed_actions_empty: "Es gibt keine erledigten Aufgaben für dieses Projekt" with_no_default_context: hat keinen Standardwert Kontext delete_project_confirmation: Soll das Projekt '%{name}' wirklich gelöscht werden? with_default_context: mit einem Standard-Rahmen von '%{context_name}' @@ -650,7 +644,7 @@ de: actions_in_project_title: Die Aktionen in diesem Projekt completed_projects: Abgeschlossene Projekte is_active: ist aktiv - add_note: "Notiz hinzuf\xC3\xBCgen" + add_note: "Notiz hinzufügen" set_default_tags_notice: Standard-Tags des Projekts auf %{default_tags} setzen add_project: Projekt hinzufügen settings: Einstellungen @@ -661,14 +655,14 @@ de: hidden_projects: Versteckte Projekte delete_project_title: Projekt löschen default_context_removed: Standard-Kontext entfernt - add_note_submit: "Notiz hinzuf\xC3\xBCgen" - completed_actions: "Erledigte Aufgaben f\xC3\xBCr dieses Projekt" + add_note_submit: "Notiz hinzufügen" + completed_actions: "Erledigte Aufgaben für dieses Projekt" was_marked_complete: wurde als erledigt markiert no_default_context: Dieses Projekt hat keinen Standard-Kontext with_no_default_tags: und hat keinen Standardwert Tags edit_project_settings: Edit Project Settings default_context: Der Standard-Kontext dieses Projektes ist %{context} - status_project_name_changed: "Projektname ge\xC3\xA4ndert" + status_project_name_changed: "Projektname geändert" state: Dieses Projekt ist %{state} active_projects: Aktive Projekte states: @@ -689,20 +683,20 @@ de: active: Aktiv current_plural: Auf dem neusten Stand errors: - user_unauthorized: "401 Unauthorized: Nur administrative Benutzer d\xC3\xBCrfen auf diese Funktion zugreifen." + user_unauthorized: "401 Unauthorized: Nur administrative Benutzer dürfen auf diese Funktion zugreifen." preferences: open_id_url: "Deine OpenID-URL lautet:" - change_identity_url: "\xC3\x84ndere deine Identit\xC3\xA4ts-URL" + change_identity_url: "Ändere deine Identitäts-URL" staleness_starts_after: Abgestandenheit startet nach %{days} Tagen page_title: TRACKS::Einstellungen - change_password: "Passwort \xC3\xA4ndern" - token_description: "Token (f\xC3\xBCr die Verwendung in Feeds und der API)" + change_password: "Passwort ändern" + token_description: "Token (für die Verwendung in Feeds und der API)" title: Deine Einstellungen is_false: Nein - show_number_completed: "Zeige %{number} erledigte Eintr\xC3\xA4ge" - password_changed: "Ihr Passwort ge\xC3\xA4ndert wurde, melden Sie sich bitte wieder an." + show_number_completed: "Zeige %{number} erledigte Einträge" + password_changed: "Ihr Passwort geändert wurde, melden Sie sich bitte wieder an." edit_preferences: Einstellungen bearbeiten - page_title_edit: "TRACKS::Einstellungen \xC3\xA4ndern" + page_title_edit: "TRACKS::Einstellungen ändern" is_true: Ja sms_context_none: Keine generate_new_token: Neues Token generieren @@ -710,8 +704,8 @@ de: authentication_header: Deine Authentifizierung updated: Einstellungen aktualisiert current_authentication_type: Dein Authentifizierungsart ist %{auth_type} - change_authentication_type: "Authentifzierungsart \xC3\xA4ndern" - generate_new_token_confirm: "Bist du sicher? Wenn du ein neues Token generierst, wird dies das alte Token ersetzen und jegliche externe Nutzung st\xC3\xB6ren, die das alte Token verwendet." + change_authentication_type: "Authentifzierungsart ändern" + 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." tabs: authentication: Authentication tracks_behavior: Tracks Verhalten @@ -732,9 +726,7 @@ de: - - Januar - Februar - - !binary | - TcOkcno= - + - "März" - April - Mai - Juni @@ -775,9 +767,7 @@ de: - - Jan - Feb - - !binary | - TcOkcg== - + - "Mär" - Apr - Mai - Jun @@ -788,9 +778,7 @@ de: - Nov - Dez will_paginate: - previous_label: !binary | - wqsgWnVyw7xjaw== - + previous_label: "« Zurück" page_entries_info: multi_page: Angezeigte %{model} %{from} - %{to} von %{count} insgesamt single_page_html: @@ -803,58 +791,56 @@ de: zero: Kein %{model} gefunden multi_page_html: Angezeigte %{model} %{from} - %{to} von %{count} insgesamt page_gap: ... - next_label: !binary | - TsOkY2hzdGUgwrs= - + next_label: "Nächste »" support: array: words_connector: ", " last_word_connector: " und " two_words_connector: " und " select: - prompt: "Bitte w\xC3\xA4hlen Sie" + prompt: "Bitte wählen Sie" footer: send_feedback: Senden Sie Feedback zu %{version} shared: multiple_next_actions: Mehrere neue Aufgaben (eine pro Zeile) - make_actions_dependent: "Machen Sie Aktionen voneinander abh\xC3\xA4ngig" + make_actions_dependent: "Machen Sie Aktionen voneinander abhängig" toggle_single: Weitere Aktion erstellen hide_form: Formular verstecken - add_actions: "Aufgaben hinzuf\xC3\xBCgen" - add_action: "Aufgabe hinzuf\xC3\xBCgen" - tags_for_all_actions: "Tags f\xC3\xBCr alle Aufgaben (mit Kommas trennen)" + add_actions: "Aufgaben hinzufügen" + add_action: "Aufgabe hinzufügen" + tags_for_all_actions: "Tags für alle Aufgaben (mit Kommas trennen)" toggle_single_title: Eine weitere Aktion hinzufügen - project_for_all_actions: "Projekt f\xC3\xBCr alle Aufgaben" - context_for_all_actions: "Kontext f\xC3\xBCr alle Aufgaben" - toggle_multi: "Mehrere neue Aufgabeneintr\xC3\xA4ge hinzuf\xC3\xBCgen" + project_for_all_actions: "Projekt für alle Aufgaben" + context_for_all_actions: "Kontext für alle Aufgaben" + toggle_multi: "Mehrere neue Aufgabeneinträge hinzufügen" separate_tags_with_commas: mit Kommas trennen - add_context: "F\xC3\xBCgen Kontext" - toggle_multi_title: "Zwischen Einzel- und Mehrfachformular f\xC3\xBCr neue Aufgaben umschalten" - hide_action_form_title: "Formular f\xC3\xBCr neue Aufgaben verstecken" + add_context: "Fügen Kontext" + toggle_multi_title: "Zwischen Einzel- und Mehrfachformular für neue Aufgaben umschalten" + hide_action_form_title: "Formular für neue Aufgaben verstecken" feedlist: - choose_context: "Kontext f\xC3\xBCr den Feed w\xC3\xA4hlen" - actions_due_today: "Heute oder fr\xC3\xBCher f\xC3\xA4llig" + choose_context: "Kontext für den Feed wählen" + actions_due_today: "Heute oder früher fällig" ical_feed: iCal-Feed legend: "Legende:" all_contexts: Alle Kontexte rss_feed: RSS-Feed - choose_project: "Projekt f\xC3\xBCr den Feed w\xC3\xA4hlen" + choose_project: "Projekt für den Feed wählen" all_projects: Alle Projekte project_needed: Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann. - select_feed_for_project: "Feed f\xC3\xBCr dieses Projekt ausw\xC3\xA4hlen" + select_feed_for_project: "Feed für dieses Projekt auswählen" active_projects_wo_next: Aktive Projekte ohne ausstehende Aufgaben active_starred_actions: Alle markierten, aktiven Aufgaben context_needed: Es muss mindestens ein Kontext existieren, bevor ein Feed abonniert werden kann. - select_feed_for_context: "Feed f\xC3\xBCr diesen Kontext ausw\xC3\xA4hlen" + select_feed_for_context: "Feed für diesen Kontext auswählen" projects_and_actions: Aktive Projekte und deren Aufgaben notice_incomplete_only: "Hinweis: Alle Feeds zeigen nur Aufgaben, die noch nicht als erledigt markiert wurden." - actions_due_next_week: "In den n\xC3\xA4chsten 7 Tagen oder fr\xC3\xBCher f\xC3\xA4llige Aufgaben" + 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 - context_centric_actions: "Feeds f\xC3\xBCr unvollst\xC3\xA4ndige Aufgaben in einem bestimmten Kontext" + context_centric_actions: "Feeds für unvollständige Aufgaben in einem bestimmten Kontext" plain_text_feed: Plain-Text-Feed last_fixed_number: Die letzten %{number} Aufgaben all_actions: Alle Aufgaben - project_centric: "Feeds f\xC3\xBCr unvollst\xC3\xA4ndige Aufgaben in einem bestimmten Kontext" + project_centric: "Feeds für unvollständige Aufgaben in einem bestimmten Kontext" sidebar: list_name_active_contexts: Aktive Kontexte list_name_active_projects: Aktive Projekte @@ -866,14 +852,14 @@ de: openid_url_verified: Die URL %{url} wurde erfolgreich als Identität verifiziert und Deine Authentifizierung auf OpenID umgestellt. auth_type_update_error: "Beim Ändern der Authentifizierung trat ein Fehler auf: %{error_messages}" failed_to_delete_user: Löschen des Benutzers %{username} fehlgeschlagen - destroy_successful: "Benutzer %{login} wurde erfolgreich gel\xC3\xB6scht" + destroy_successful: "Benutzer %{login} wurde erfolgreich gelöscht" first_user_heading: "Willkommen bei TRACKS. Als erstes legen Sie bitte einen Administrator-Zugang an:" total_contexts: Alle Kontexte successfully_deleted_user: Benutzer %{username} erfolgreich gelöscht. signup_successful: Benutzer %{username} erfolgreich angelegt. new_token_generated: Neuer Token erfolgreich generiert total_projects: Alle Projekte - change_password_submit: "Passwort \xC3\xA4ndern" + change_password_submit: "Passwort ändern" no_signups_title: TRACKS::Anmeldung nicht erlaubt user_created: Benutzer angelegt. account_signup: Accounteinrichtung @@ -881,34 +867,34 @@ de: password_updated: Passwort aktualisiert. auth_type_updated: Authentifizierungs-Art erfolgreich geändert. total_actions: Alle Aufgaben - desired_login: "Gew\xC3\xBCnschter Benutzername" + desired_login: "Gewünschter Benutzername" signup: Registrieren - confirm_password: "Passwort best\xC3\xA4tigen" + confirm_password: "Passwort bestätigen" new_user_heading: "Einen neuen Benutzer anlegen:" - password_confirmation_label: "Passwort best\xC3\xA4tigen" - destroy_error: "Beim L\xC3\xB6schen des Benutzers %{login} ist ein Fehler aufgetreten." - choose_password: "Passwort w\xC3\xA4hlen" + password_confirmation_label: "Passwort bestätigen" + destroy_error: "Beim Löschen des Benutzers %{login} ist ein Fehler aufgetreten." + choose_password: "Passwort wählen" change_password_title: TRACKS::Passwort ändern change_auth_type_title: TRACKS::Authentifizierungstyp ändern - change_password_prompt: "Gib dein neues Passwort in die unten stehenden Felder ein und klicke auf 'Passwort \xC3\xA4ndern' um dein altes Passwort durch das neue zu ersetzen." + 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 register_with_cas: Mit deinem CAS-Benutzernamen label_auth_type: Authentifizierungsart total_users_count: Derzeit existieren %{count} Benutzer new_user_title: TRACKS::Als Administrator anmelden - destroy_user: "Benutzer l\xC3\xB6schen" - destroy_confirmation: "Achtung: der Benutzer '%{login}' wird mit all seinen Aufgaben, Kontexten, Projekten und Notizen gel\xC3\xB6scht. Bist du sicher, dass du fortfahren m\xC3\xB6chtest?" - you_have_to_reset_your_password: "Sie haben Ihr Passwort zur\xC3\xBCcksetzen" + 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?" + you_have_to_reset_your_password: "Sie haben Ihr Passwort zurücksetzen" signup_new_user: Neuen Benutzer anlegen identity_url: Identity-URL openid_ok_pref_failed: Die URL %{url} wurde erfolgreich als Identität verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf. - auth_change_submit: "Authentifizierungsart \xC3\xA4ndern" - change_authentication_type: "Authentifizierungsart \xC3\xA4ndern" + auth_change_submit: "Authentifizierungsart ändern" + change_authentication_type: "Authentifizierungsart ändern" total_notes: Alle Notizen - select_authentication_type: "W\xC3\xA4hle deine neue Authentifizierungsart und klicke 'Authentifizierungsart \xC3\xA4ndern' an, um deine aktuellen Einstellungen zu \xC3\xBCberschreiben." + select_authentication_type: "Wähle deine neue Authentifizierungsart und klicke 'Authentifizierungsart ändern' an, um deine aktuellen Einstellungen zu überschreiben." contexts: delete_context_title: Kontext löschen - all_completed_tasks_title: "TRACKS:: Alle Abgeschlossene Ma\xC3\x9Fnahmen im context '%{context_name}'" + all_completed_tasks_title: "TRACKS:: Alle Abgeschlossene Maßnahmen im context '%{context_name}'" hide_form: Formular verstecken show_form_title: Neuen Kontext erstellen todos_append: In diesem Context @@ -919,23 +905,23 @@ de: hidden_contexts: Versteckte Kontexte no_contexts_active: Derzeit gibt es keine aktiven Kontexte context_hide: Auf Startseite ausblenden? - add_context: "Kontext hinzuf\xC3\xBCgen" + add_context: "Kontext hinzufügen" show_form: Neuen Kontext erstellen save_status_message: Kontext gespeichert visible_contexts: Sichtbare Kontexte - update_status_message: "Kontextname wurde ge\xC3\xA4ndert" + update_status_message: "Kontextname wurde geändert" context_name: Kontextname status_active: Kontext ist aktiv - completed_tasks_title: "TRACKS:: Abgeschlossene Ma\xC3\x9Fnahmen im context '%{context_name}'" + completed_tasks_title: "TRACKS:: Abgeschlossene Maßnahmen im context '%{context_name}'" new_context_post: "' wird ebenfalls angelegt. Fortfahren?" new_context_pre: Der neue Kontext ' - no_actions: "Momentan gibt es keine unvollst\xC3\xA4ndigen Aufgaben in diesem Kontext" + no_actions: "Momentan gibt es keine unvollständigen Aufgaben in diesem Kontext" last_completed_in_context: in diesem Kontext (letzte %{number}) - context_deleted: "Gel\xC3\xB6schter Kontext '%{name}'" + context_deleted: "Gelöschter Kontext '%{name}'" no_contexts_hidden: Derzeit gibt es keine versteckten Kontexte status_hidden: Kontext ist versteckt login: - openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identit\xC3\xA4ts-URL (%{identity_url})" + openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identitäts-URL (%{identity_url})" user_no_expiry: Angemeldet bleiben sign_in: Anmeldung login_cas: zum CAS gehen @@ -945,16 +931,16 @@ de: please_login: Bitte melde dich an, um Tracks zu nutzen cas_logged_in_greeting: Hallo, %{username}! Du bist authentifiziert. cas_username_not_found: Sorry, aber es existiert kein Benutzer mit dem CAS-Benutzernamen (%{username}) - cas_create_account: "Wenn du die Anfrage fortsetzen m\xC3\xB6chtest, klicke bitte hier: %{signup_link}" - mobile_use_openid: "\xE2\x80\xA6oder mit einer OpenID anmelden" + cas_create_account: "Wenn du die Anfrage fortsetzen möchtest, klicke bitte hier: %{signup_link}" + mobile_use_openid: "…oder mit einer OpenID anmelden" cas_signup_link: Account beantragen account_login: Account-Anmeldung - successful: "Anmeldung erfolgreich. Willkommen zur\xC3\xBCck!" + successful: "Anmeldung erfolgreich. Willkommen zurück!" session_will_not_expire: Sitzung wird nicht ablaufen. option_separator: oder, session_time_out: Sitzung abgelaufen. Bitte %{link} - session_will_expire: "Sitzung wird nach %{hours} Stunde(n) der Inaktivit\xC3\xA4t ablaufen." - login_standard: "zur\xC3\xBCck zum Standard-Login" + session_will_expire: "Sitzung wird nach %{hours} Stunde(n) der Inaktivität ablaufen." + login_standard: "zurück zum Standard-Login" login_with_openid: Mit einer OpenID anmelden unsuccessful: Anmeldung war nicht erfolgreich. log_in_again: Erneut anmelden. diff --git a/config/locales/en.yml b/config/locales/en.yml index e23261df..ba8047c3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -916,7 +916,7 @@ en: please_login: Please log in to use Tracks cas_logged_in_greeting: Hello, %{username}! You are authenticated. cas_username_not_found: Sorry, no user by that CAS username exists (%{username}) - mobile_use_openid: "\xE2\x80\xA6or login with an OpenID" + mobile_use_openid: "…or login with an OpenID" cas_create_account: If you like to request on please go here to %{signup_link} account_login: Account login cas_signup_link: Request account diff --git a/config/locales/es.yml b/config/locales/es.yml index bf1ea096..470c2a64 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1,14 +1,14 @@ --- es: layouts: - toggle_contexts_title: "Haga contextos se derrumb\xC3\xB3 (in)visible" - toggle_contexts: "Cambiar los contextos se derrumb\xC3\xB3" + toggle_contexts_title: "Haga contextos se derrumbó (in)visible" + toggle_contexts: "Cambiar los contextos se derrumbó" toggle_notes: Activar/Desactivar notas next_actions_rss_feed: RSS feed of next actions toggle_notes_title: Activar/Desactivar todas las notas mobile_navigation: new_action: Nueva tarea - logout: "Cerrar sesi\xC3\xB3n" + logout: "Cerrar sesión" feeds: Feeds starred: avoritos projects: Proyectos @@ -16,13 +16,13 @@ es: contexts: Contextos home: Inicio navigation: - manage_users_title: "A\xC3\xB1adir o eliminar usuarios" + manage_users_title: "Añadir o eliminar usuarios" recurring_todos: Tareas repetitivas api_docs: REST API Docs help: "?" feeds: Feeds starred: Estrellas - stats: "Estad\xC3\xADsticas" + stats: "Estadísticas" notes_title: Mostrar todas las notas manage_users: Administrar usuarios tickler_title: Tickler @@ -46,7 +46,7 @@ es: contexts_title: Contexts preferences_title: Mostrar mis preferencias search: Search All Items - review_title: "Posibilidad de una revisi\xC3\xB3n" + review_title: "Posibilidad de una revisión" projects_title: Proyectos calendar: Calendario number: @@ -67,21 +67,17 @@ es: currency: format: format: "%u%n" - unit: !binary | - 4oKs - + unit: "€" separator: . delimiter: "," common: - recurring_todos: "Repetici\xC3\xB3n de acciones" - back: !binary | - QXRyw6Fz - + recurring_todos: "Repetición de acciones" + back: "Atrás" actions: Tareas third: Tercero - add: "A\xC3\xB1adir" + add: "Añadir" previous: Anterior - go_back: "Volver atr\xC3\xA1s" + go_back: "Volver atrás" logout: Salir second: Segundo optional: opcional @@ -99,19 +95,13 @@ es: server_error: Ha ocurrido un error en el servidor. forum: Foro projects: Proyectos - last: "\xC3\x9Altimo" - review: "Revisi\xC3\xB3n" + last: "Último" + review: "Revisión" action: Tarea days_midsentence: - one: !binary | - ZMOtYQ== - - other: !binary | - ZMOtYXM= - - zero: !binary | - ZMOtYXM= - + one: "día" + other: "días" + zero: "días" project: Proyecto contribute: Contribuir ok: Ok @@ -123,20 +113,20 @@ es: zero: 0 notas numbered_step: Paso %{number} sort: - by_task_count_title: "Ordenar por n\xC3\xBAmero de tareas" - by_task_count_title_confirm: "\xC2\xBFEst\xC3\xA1 seguro que desea ordenar los proyectos por el n\xC3\xBAmero de tareas? Esto reemplazar\xC3\xA1 el orden existente." - alphabetically: "Alfab\xC3\xA9ticamente" + by_task_count_title: "Ordenar por número de tareas" + by_task_count_title_confirm: "¿Está seguro que desea ordenar los proyectos por el número de tareas? Esto reemplazará el orden existente." + alphabetically: "Alfabéticamente" sort: Ordenar - alphabetically_title: "Proyectos de ordenar alfab\xC3\xA9ticamente" - alphabetically_confirm: "\xC2\xBFEst\xC3\xA1 seguro que desea ordenar los proyectos por orden alfab\xC3\xA9tico? Esto reemplazar\xC3\xA1 el orden existente." - by_task_count: "Por n\xC3\xBAmero de tareas" + alphabetically_title: "Proyectos de ordenar alfabéticamente" + alphabetically_confirm: "¿Está seguro que desea ordenar los proyectos por orden alfabético? Esto reemplazará el orden existente." + by_task_count: "Por número de tareas" create: Crear todo: Todo months: meses errors_with_fields: "Ha habido problemas con los siguientes campos:" - description: "Descripci\xC3\xB3n" + description: "Descripción" fourth: Cuarto - next: "Pr\xC3\xB3ximo" + next: "Próximo" drag_handle: ARRASTRAR contexts: Contextos context: Contexto @@ -151,17 +141,17 @@ es: not_available_abbr: n/e integrations: opensearch_description: Buscar en las Tracks - applescript_next_action_prompt: "Descripci\xC3\xB3n de la pr\xC3\xB3xima tarea:" - gmail_description: "Gadget para a\xC3\xB1adir pistas a Gmail como un gadget" + applescript_next_action_prompt: "Descripción de la próxima tarea:" + gmail_description: "Gadget para añadir pistas a Gmail como un gadget" applescript_success_after_id: creado - applescript_success_before_id: "Nueva acci\xC3\xB3n junto con la identificaci\xC3\xB3n" + applescript_success_before_id: "Nueva acción junto con la identificación" activerecord: attributes: project: name: Nombre - default_tags: "Etiquetas est\xC3\xA1ndar" + default_tags: "Etiquetas estándar" default_context_name: Default contexto - description: "Descripci\xC3\xB3n" + description: "Descripción" note: created_at: Creado el updated_at: actualizado a las @@ -171,30 +161,30 @@ es: notes: Notas tags: Etiquetas project: Proyecto - description: "Descripci\xC3\xB3n" + description: "Descripción" context: Contexto - due: "Fecha l\xC3\xADmite" + due: "Fecha límite" preference: show_hidden_projects_in_sidebar: Mostrar proyectos ocultos en el lateral show_hidden_contexts_in_sidebar: Mostrar los contextos ocultos en el lateral date_format: Formato de fecha sms_context: Contexto por defecto para el email - verbose_action_descriptors: "Descriptores detallado de acci\xC3\xB3n" + verbose_action_descriptors: "Descriptores detallado de acción" staleness_starts: Comienzo de estancamiento - mobile_todos_per_page: "Tareas por p\xC3\xA1gina (Vista M\xC3\xB3vil)" - show_number_completed: "Mostrar n\xC3\xBAmero de tareas completadas" - title_date_format: "T\xC3\xADtulo del formato de fecha" - refresh: "Intervalo de actualizaci\xC3\xB3n (en minutos)" + mobile_todos_per_page: "Tareas por página (Vista Móvil)" + show_number_completed: "Mostrar número de tareas completadas" + title_date_format: "Título del formato de fecha" + refresh: "Intervalo de actualización (en minutos)" week_starts: La semana comienza last_name: Apellido due_style: Debido al estilo locale: Lugar time_zone: Zona horaria sms_email: Email origen - show_project_on_todo_done: "Ir a la p\xC3\xA1gina del proyecto al completar la tarea" + show_project_on_todo_done: "Ir a la página del proyecto al completar la tarea" show_completed_projects_in_sidebar: Show completed projects in sidebar first_name: Nombre - review_period: "Intervalo de revisi\xC3\xB3n del proyecto" + review_period: "Intervalo de revisión del proyecto" user: last_name: Apellido first_name: Primer nombre @@ -207,36 +197,36 @@ es: too_long: El nombre del proyecto tiene que tener menos de 256 caracteres taken: ya existe messages: - record_invalid: "La validaci\xC3\xB3n ha fallado: %{errores}" + record_invalid: "La validación ha fallado: %{errores}" greater_than_or_equal_to: debe ser mayor que o igual a %{count} - confirmation: "no coincide con la confirmaci\xC3\xB3n" + confirmation: "no coincide con la confirmación" less_than_or_equal_to: debe ser menor o igual a %{count} blank: no puede estar en blanco - exclusion: "est\xC3\xA1 reservado" - invalid: "no puede contener el car\xC3\xA1cter de coma (',')" + exclusion: "está reservado" + invalid: "no puede contener el carácter de coma (',')" odd: tiene que ser impar - even: "debe ser a\xC3\xBAn" - empty: "no puede estar vac\xC3\xADo" - too_short: "es demasiado corto (m\xC3\xADnimo %{count} caracteres)" + even: "debe ser aún" + empty: "no puede estar vacío" + too_short: "es demasiado corto (mínimo %{count} caracteres)" wrong_length: es la longitud del mal (debe ser %{count} caracteres) less_than: debe ser menor que %{count} greater_than: debe ser mayor que %{count} equal_to: debe ser igual a %{count} accepted: debe ser aceptada - too_long: "es demasiado largo (el m\xC3\xA1ximo es %{count} caracteres)" + too_long: "es demasiado largo (el máximo es %{count} caracteres)" taken: Ya se ha dado - inclusion: "no est\xC3\xA1 incluido en la lista" - not_a_number: "no es un n\xC3\xBAmero" + inclusion: "no está incluido en la lista" + not_a_number: "no es un número" template: body: "Hubo problemas con los campos siguientes:" header: one: Un error esta prohibido %{model} se guarden - other: "%{count} errores proh\xC3\xADbe este %{model} que se guarden" + other: "%{count} errores prohíbe este %{model} que se guarden" full_messages: format: "%{attribute} %{message}" data: - import_successful: "Importaci\xC3\xB3n se realiz\xC3\xB3 correctamente." - import_errors: "Han ocurrido algunos errores durante la importaci\xC3\xB3n" + import_successful: "Importación se realizó correctamente." + import_errors: "Han ocurrido algunos errores durante la importación" models: project: feed_title: Tracks Projects @@ -263,7 +253,7 @@ es: top5_visible_contexts_with_incomplete_actions: Top 5 visible contexts with incomplete actions actions: Actions time_of_day_legend: - number_of_actions: "N\xC3\xBAmero de tareas" + number_of_actions: "Número de tareas" time_of_day: Time of day totals_incomplete_actions: You have %{count} incomplete actions totals_deferred_actions: of which %{count} are deferred actions in the tickler @@ -288,25 +278,25 @@ es: actions_selected_from_week: "Actions selected from week " actions_day_of_week_title: Day of week (all actions) actions_lastyear_title: Actions in the last 12 months - open_per_week: "Pr\xC3\xB3ximas acciones activas (visibles y ocultas) a la semana" + open_per_week: "Próximas acciones activas (visibles y ocultas) a la semana" action_selection_title: TRACKS::Action selection totals_project_count: You have %{count} projects. legend: number_of_days: Number of days ago actions: Tareas - number_of_actions: "N\xC3\xBAmero de tareas" + number_of_actions: "Número de tareas" day_of_week: Day of week running_time: Running time of an action (weeks) percentage: Percentage months_ago: Months ago current_running_time_of_incomplete_visible_actions: Current running time of incomplete visible actions tod30_legend: - number_of_actions: "N\xC3\xBAmero de tareas" + number_of_actions: "Número de tareas" time_of_day: Time of day totals_context_count: You have %{count} contexts. open_per_week_legend: actions: Acciones - weeks: "Semanas atr\xC3\xA1s" + weeks: "Semanas atrás" actions_last_year_legend: number_of_actions: Number of actions months_ago: Months ago @@ -327,8 +317,8 @@ es: totals_tag_count: You have %{count} tags placed on actions. actions_further: " and further" actions_dow_30days_legend: - number_of_actions: "N\xC3\xBAmero de acciones" - day_of_week: "D\xC3\xADa de la semana" + number_of_actions: "Número de acciones" + day_of_week: "Día de la semana" totals_first_action: Since your first action on %{date} tag_cloud_description: This tag cloud includes tags of all actions (completed, not completed, visible and/or hidden) spread_of_actions_for_all_context: Spread of actions for all context @@ -338,11 +328,11 @@ es: actions_avg_completed_30days: and completed an average of %{count} actions per day. actions_30days_title: Actions in the last 30 days no_tags_available: no tags available - index_title: "TRACKS::Estad\xC3\xADstica" + index_title: "TRACKS::Estadística" actions_dow_30days_title: Day of week (past 30 days) actions_day_of_week_legend: - number_of_actions: "N\xC3\xBAmero de acciones" - day_of_week: "D\xC3\xADa de la semana" + number_of_actions: "Número de acciones" + day_of_week: "Día de la semana" within_one: Dentro de un spread_of_running_actions_for_visible_contexts: Spread of running actions for visible contexts actions_last_year: Actions in the last years @@ -384,7 +374,7 @@ es: tags: Tags (separate with commas) delete_recurring_action_title: Delete the recurring action context_changed: Context changed to %{name} - new_related_todo_created: "Una nueva tarea fue a\xC3\xB1adida y que pertenece a esta tarea recurrente" + new_related_todo_created: "Una nueva tarea fue añadida y que pertenece a esta tarea recurrente" mobile_todos_page_title: Todas las tareas add_another_dependency: Add another dependency removed_predecessor: Removed %{successor} as dependency from %{predecessor}. @@ -405,16 +395,14 @@ es: due_within_a_week: due within a week older_completed_items: Older completed items no_actions_due_this_week: No actions due in rest of this week - all_completed_here: !binary | - YXF1w60= - + all_completed_here: "aquí" append_in_this_project: in this project - edit_recurring_todo: "Editar la acci\xC3\xB3n de repetici\xC3\xB3n" + edit_recurring_todo: "Editar la acción de repetición" error_deleting_item: There was an error deleting the item %{description} task_list_title: TRACKS::List tasks no_recurring_todos: Currently there are no recurring todos error_completing_todo: There was an error completing / activating the recurring todo %{description} - recurring_pattern_removed: "El patr\xC3\xB3n de repetici\xC3\xB3n se retira de %{count}" + recurring_pattern_removed: "El patrón de repetición se retira de %{count}" convert_to_project: Make project no_deferred_pending_actions: Currently there are no deferred or pending actions delete_recurring_action_confirm: Are you sure that you want to delete the recurring action '%{description}'? @@ -445,7 +433,7 @@ es: recurring_deleted_success: The recurring action was deleted succesfully. no_completed_actions_with: No completed actions with the tag '%{tag_name}' next_actions_title: Tracks - Next Actions - next_action_description: "Descripci\xC3\xB3n de la nueva tarea" + next_action_description: "Descripción de la nueva tarea" deferred_tasks_title: TRACKS::Tickler clear_show_from_date: Clear show from date in_hidden_state: en estado oculto @@ -456,10 +444,10 @@ es: show_today: Show Today next_actions_due_date: overdue_by: Overdue by %{days} day - due_in_x_days: "Vence en %{days} d\xC3\xADas" + due_in_x_days: "Vence en %{days} días" due_today: Vence hoy overdue_by_plural: Overdue by %{days} days - due_tomorrow: "Vence ma\xC3\xB1ana" + due_tomorrow: "Vence mañana" completed_last_x_days: Completed in last %{count} days no_actions_with: Currently there are no incomplete actions with the tag '%{tag_name}' defer_x_days: @@ -478,7 +466,7 @@ es: error_deleting_recurring: There was an error deleting the recurring todo \'%{description}\' delete_action: Delete action delete: Delete - no_last_completed_actions: "No encontr\xC3\xB3 las acciones realizadas" + no_last_completed_actions: "No encontró las acciones realizadas" drag_action_title: Drag onto another action to make it depend on that action cannot_add_dependency_to_completed_todo: Cannot add this action as a dependency to a completed action! depends_on: Depends on @@ -488,7 +476,7 @@ es: action_marked_complete: The action '%{description}' was marked as %{completed} completed_today: Completed Today added_new_next_action_plural: Added new next actions - new_related_todo_not_created_short: "no se cre\xC3\xB3 la tarea" + new_related_todo_not_created_short: "no se creó la tarea" completed_rest_of_week: Completado en el resto de esta semana show_tomorrow: Show Tomorrow error_starring: Could not toggle the star of this todo \'%{description}\' @@ -573,7 +561,7 @@ es: yearly_options: Settings for yearly recurring actions yearly: Yearly monthly_every_xth_day: The %{day} %{day_of_week} of every %{month} month - action_deferred: "La acci\xC3\xB3n \\'%{description}\\' se aplaz\xC3\xB3" + action_deferred: "La acción \\'%{description}\\' se aplazó" tagged_page_title: TRACKS::Tagged with '%{tag_name}' added_dependency: Added %{dependency} as dependency. completed_rest_of_month: Completado en el resto de este mes @@ -584,7 +572,7 @@ es: no_actions_found: Currently there are no incomplete actions. in_pending_state: en estado pendiente error_toggle_complete: Could not mark this todo complete - due: "Fecha l\xC3\xADmite" + due: "Fecha límite" no_incomplete_actions: There are no incomplete actions action_saved_to_tickler: Action saved to tickler recurring_action_saved: Recurring action saved @@ -632,7 +620,7 @@ es: no_last_completed_recurring_todos: No se ha completado las acciones repetitivas que se encuentran notes: Notes todos_append: in this project - list_reviews: "TRACKS::Revisi\xC3\xB3n" + list_reviews: "TRACKS::Revisión" notes_empty: There are no notes for this project no_projects: Currently there are no projects hide_form_title: Hide new project form @@ -644,10 +632,10 @@ es: show_form: Add a project actions_in_project_title: Actions in this project completed_projects: Proyectos completados - is_active: "est\xC3\xA1 activo" - add_note: "A\xC3\xB1adir una nota" + is_active: "está activo" + add_note: "Añadir una nota" set_default_tags_notice: Set project's default tags to %{default_tags} - add_project: "A\xC3\xB1adir Proyecto" + add_project: "Añadir Proyecto" settings: Settings project_saved_status: Project saved list_projects: TRACKS::Lista de Proyectos @@ -656,7 +644,7 @@ es: hidden_projects: Proyectos ocultos delete_project_title: Delete the project default_context_removed: Eliminado el contexto por defecto - add_note_submit: "A\xC3\xB1adir nota" + add_note_submit: "Añadir nota" completed_actions: Tareas completadas para este proyecto was_marked_complete: has been marked as completed no_default_context: Este proyecto no tiene un contexto por defecto @@ -671,7 +659,7 @@ es: stalled: Estancado review_plural: Fechado completed: Completed - current: "Hasta al d\xC3\xADa" + current: "Hasta al día" review: Fechado completed_plural: Completed blocked: Bloqueado @@ -682,9 +670,9 @@ es: visible: Visible hidden: Hidden active: Active - current_plural: "Hasta al d\xC3\xADa" + current_plural: "Hasta al día" errors: - user_unauthorized: "401 No autorizado: Solo los usuarios administrativos pueden acceder a esta funci\xC3\xB3n." + user_unauthorized: "401 No autorizado: Solo los usuarios administrativos pueden acceder a esta función." preferences: open_id_url: Your OpenID URL is change_identity_url: Change Your Identity URL @@ -695,7 +683,7 @@ es: title: Your preferences is_false: "false" show_number_completed: Show %{number} completed items - password_changed: "Que ha cambiado la contrase\xC3\xB1a, por favor vuelve a iniciar sesi\xC3\xB3n." + password_changed: "Que ha cambiado la contraseña, por favor vuelve a iniciar sesión." edit_preferences: Edit preferences page_title_edit: TRACKS::Edit Preferences is_true: "true" @@ -703,12 +691,12 @@ es: generate_new_token: Generate a new token token_header: Your token authentication_header: Your authentication - updated: "Las preferencias de actualizaci\xC3\xB3n" + updated: "Las preferencias de actualización" current_authentication_type: Your authentication type is %{auth_type} change_authentication_type: Change your authentication type generate_new_token_confirm: Are you sure? Generating a new token will replace the existing one and break any external usages of this token. tabs: - authentication: "Autenticaci\xC3\xB3n" + authentication: "Autenticación" tracks_behavior: Rastrea el comportamiento de profile: Perfil date_and_time: Fecha y hora @@ -756,10 +744,10 @@ es: - Domingo - Lunes - Martes - - "Mi\xC3\xA9rcoles" + - "Miércoles" - Jueves - Viernes - - "S\xC3\xA1bado" + - "Sábado" abbr_month_names: - - Ene @@ -775,7 +763,7 @@ es: - Nov - Dic will_paginate: - previous_label: "\xC2\xAB Anterior" + previous_label: "« Anterior" page_entries_info: multi_page: Viendo %{model} {%from} - %{to} de %{count} en el total de single_page_html: @@ -788,7 +776,7 @@ es: zero: No %{model} encontrado multi_page_html: Viendo %{model} %{from} - %{to} de %{count} en el total de page_gap: ... - next_label: "Siguiente \xC2\xBB" + next_label: "Siguiente »" support: array: words_connector: "," @@ -797,14 +785,14 @@ es: select: prompt: Por favor seleccione footer: - send_feedback: "Env\xC3\xADa comentarios sobre el %{version}" + send_feedback: "Envía comentarios sobre el %{version}" shared: multiple_next_actions: Multiple next actions (one on each line) - make_actions_dependent: "Aseg\xC3\xBArese que las acciones dependen unos de otros" + make_actions_dependent: "Asegúrese que las acciones dependen unos de otros" toggle_single: Add a next action hide_form: Esconder formulario - add_actions: "A\xC3\xB1adir tareas" - add_action: "A\xC3\xB1adir tarea" + add_actions: "Añadir tareas" + add_action: "Añadir tarea" tags_for_all_actions: Tags for all actions (sep. with commas) toggle_single_title: Add a new next action project_for_all_actions: Project for all actions @@ -817,7 +805,7 @@ es: feedlist: choose_context: Elija el contexto en el que desea un canal de actions_due_today: Acciones pendientes hoy o antes - ical_feed: "iCal alimentaci\xC3\xB3n" + ical_feed: "iCal alimentación" legend: "Leyenda:" all_contexts: Todos los contextos rss_feed: RSS Feed @@ -825,19 +813,19 @@ es: all_projects: Todos los proyectos project_needed: Es necesario que haya al menos un proyecto antes de poder solicitar un feed select_feed_for_project: Seleccione la fuente para este proyecto - active_projects_wo_next: "Proyectos activos, sin las pr\xC3\xB3ximas acciones" - active_starred_actions: "Todas las acciones que protagoniz\xC3\xB3, activa" + active_projects_wo_next: "Proyectos activos, sin las próximas acciones" + active_starred_actions: "Todas las acciones que protagonizó, activa" context_needed: Es necesario que haya al menos un contexto antes de poder solicitar un feed - select_feed_for_context: "Seleccione la alimentaci\xC3\xB3n de este contexto" + select_feed_for_context: "Seleccione la alimentación de este contexto" projects_and_actions: Proyectos activos con sus acciones - notice_incomplete_only: "Nota: Todos los alimentos muestran s\xC3\xB3lo las acciones que no han sido marcadas como realizadas, a menos que se indique lo contrario." - actions_due_next_week: "Tareas pendientes en 7 d\xC3\xADas o menos" - actions_completed_last_week: "Tareas completadas en los \xC3\xBAltimos 7 d\xC3\xADas" - context_centric_actions: "Feeds de acciones incompletas en un contexto espec\xC3\xADfico" + notice_incomplete_only: "Nota: Todos los alimentos muestran sólo las acciones que no han sido marcadas como realizadas, a menos que se indique lo contrario." + actions_due_next_week: "Tareas pendientes en 7 días o menos" + actions_completed_last_week: "Tareas completadas en los últimos 7 días" + context_centric_actions: "Feeds de acciones incompletas en un contexto específico" plain_text_feed: Canal Texto sin formato - last_fixed_number: "\xC3\x9Altima %{number} acciones" + last_fixed_number: "Última %{number} acciones" all_actions: Todas las tareas - project_centric: "Feeds de acciones incompletas en un proyecto espec\xC3\xADfico" + project_centric: "Feeds de acciones incompletas en un proyecto específico" sidebar: list_name_active_contexts: Active contexts list_name_active_projects: Active projects @@ -881,7 +869,7 @@ es: new_user_title: TRACKS::Sign up as the admin user 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?" - you_have_to_reset_your_password: "Usted tiene que restablecer su contrase\xC3\xB1a" + you_have_to_reset_your_password: "Usted tiene que restablecer su contraseña" signup_new_user: Sign up new user identity_url: Identity URL openid_ok_pref_failed: You have successfully verified %{url} as your identity but there was a problem saving your authentication preferences. @@ -893,27 +881,27 @@ es: delete_context_title: Eliminar contexto all_completed_tasks_title: "TRACKS:: Todas las acciones completadas en '%{context_name}' contexto" hide_form: Esconder formulario - show_form_title: "A\xC3\xB1adir un contexto" - delete_context_confirmation: "\xC2\xBFEst\xC3\xA1 seguro que desea eliminar '%{name}' el contexto? Tenga en cuenta que esto tambi\xC3\xA9n se eliminar\xC3\xA1n todas las acciones (la repetici\xC3\xB3n) en este contexto!" + show_form_title: "Añadir un contexto" + delete_context_confirmation: "¿Está seguro que desea eliminar '%{name}' el contexto? Tenga en cuenta que esto también se eliminarán todas las acciones (la repetición) en este contexto!" todos_append: en este contexto delete_context: Eliminar contexto edit_context: Editar contexto hide_form_title: Ocultar el formulario nuevo contexto hidden_contexts: Contextos ocultos no_contexts_active: Actualmente no hay contextos activos - context_hide: "\xC2\xBFEsconder de la p\xC3\xA1gina principal?" - add_context: "A\xC3\xB1adir contexto" + context_hide: "¿Esconder de la página principal?" + add_context: "Añadir contexto" show_form: Crear un nuevo contexto save_status_message: Contexto guardado visible_contexts: Contextos visible update_status_message: Nombre de contexto ha cambiado context_name: Nombre del contexto - status_active: "El contexto est\xC3\xA1 activo" + status_active: "El contexto está activo" completed_tasks_title: "TRACKS:: Las acciones completadas en '%{context_name}' el contexto" - new_context_post: "' Tambi\xC3\xA9n se ha creado. \xC2\xBFEst\xC3\xA1 seguro?" + new_context_post: "' También se ha creado. ¿Está seguro?" new_context_pre: Nuevo contexto ' no_actions: Actualmente no hay acciones incompletas en este contexto - last_completed_in_context: "en este contexto (\xC3\xBAltimos %{number})" + last_completed_in_context: "en este contexto (últimos %{number})" context_deleted: Contexto eliminado '%{name}' no_contexts_hidden: Actualmente no hay contextos ocultos status_hidden: Contexto se oculta @@ -929,10 +917,10 @@ es: cas_logged_in_greeting: Hello, %{username}! You are authenticated. cas_username_not_found: Sorry, no user by that CAS username exists (%{username}) cas_create_account: If you like to request on please go here to %{signup_link} - mobile_use_openid: "\xE2\x80\xA6or login with an OpenID" + mobile_use_openid: "…or login with an OpenID" cas_signup_link: Request account account_login: Acceso a la cuenta - successful: "Has entrado con \xC3\xA9xito. Bienvenido!" + successful: "Has entrado con éxito. Bienvenido!" session_will_not_expire: session will not expire. option_separator: or, session_time_out: Session has timed out. Please %{link} @@ -948,25 +936,19 @@ es: second: Segundos month: Mes hour: Hora - day: !binary | - RMOtYQ== - - year: !binary | - QcOxbw== - + day: "Día" + year: "Año" distance_in_words: less_than_x_minutes: one: menos de un minuto other: menos de %{count} minutos zero: menos de 1 minuto almost_x_years: - one: "casi 1 a\xC3\xB1o" - other: "Casi %{count} a\xC3\xB1os" + one: "casi 1 año" + other: "Casi %{count} años" x_days: - one: !binary | - MSBkw61h - - other: "%{count} d\xC3\xADas" + one: "1 día" + other: "%{count} días" x_seconds: one: Un segundo other: "%{count} segundos" @@ -984,14 +966,14 @@ es: one: 1 minuto other: "%{count} minutos" about_x_years: - one: "alrededor de 1 a\xC3\xB1o" - other: "Acerca de %{count} a\xC3\xB1os" + one: "alrededor de 1 año" + other: "Acerca de %{count} años" about_x_months: one: alrededor de 1 mes other: Acerca de %{count} meses over_x_years: - one: "m\xC3\xA1s de 1 a\xC3\xB1o" - other: "en %{count} a\xC3\xB1os" + one: "más de 1 año" + other: "en %{count} años" half_a_minute: medio minuto search: contexts_matching_query: Contexts matching query diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f83d7cca..68e0f7f1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1,52 +1,50 @@ --- fr: layouts: - toggle_contexts_title: "Faire des contextes effondr\xC3\xA9 (in)visibles" - toggle_contexts: "Basculer contextes effondr\xC3\xA9" + toggle_contexts_title: "Faire des contextes effondré (in)visibles" + toggle_contexts: "Basculer contextes effondré" toggle_notes: Afficher/Cacher notes next_actions_rss_feed: Flux RSS des prochaines actions toggle_notes_title: Afficher/Cacher toutes les notes mobile_navigation: new_action: 0-Nouvelle action - logout: "D\xC3\xA9connexion" + logout: "Déconnexion" feeds: Flux - starred: "Marqu\xC3\xA9" + starred: "Marqué" projects: Projets tickler: Reporteur contexts: Contextes home: Accueil navigation: manage_users_title: Ajouter ou supprimer des utilisateurs - recurring_todos: "T\xC3\xA2ches (todos) r\xC3\xA9p\xC3\xA9titives" + recurring_todos: "Tâches (todos) répétitives" api_docs: Doc REST API help: "?" feeds: Flux - starred: "Marqu\xC3\xA9" + starred: "Marqué" stats: Statistiques notes_title: Voir toutes les notes manage_users: Gestion des utilisateurs tickler_title: Reporteur admin: Admin - preferences: !binary | - UHLDqWbDqXJlbmNlcw== - - integrations_: "Int\xC3\xA9grer Tracks" - export_title: "Importer et exporter des donn\xC3\xA9es" - calendar_title: "Calendrier des actions \xC3\xA0 \xC3\xA9ch\xC3\xA9ance" + preferences: "Préférences" + integrations_: "Intégrer Tracks" + export_title: "Importer et exporter des données" + calendar_title: "Calendrier des actions à échéance" feeds_title: Voir une liste des flux disponibles stats_title: Voir vos statistiques tickler: Reporteur home_title: Accueil - starred_title: "Voir vos actions pr\xC3\xA9f\xC3\xA9r\xC3\xA9es" - recurring_todos_title: "Gerer les actions r\xC3\xA9currentes" - completed_tasks: "Termin\xC3\xA9" + starred_title: "Voir vos actions préférées" + recurring_todos_title: "Gerer les actions récurrentes" + completed_tasks: "Terminé" view: Vue organize: Organiser - completed_tasks_title: "Termin\xC3\xA9" + completed_tasks_title: "Terminé" home: Accueil export: Exporter contexts_title: Contextes - preferences_title: "Voir mes pr\xC3\xA9f\xC3\xA9rences" + preferences_title: "Voir mes préférences" search: Recherches tous les items review_title: Faire examiner projects_title: Projets @@ -83,21 +81,19 @@ fr: separator: . delimiter: "," common: - recurring_todos: "R\xC3\xA9p\xC3\xA9tition d'actions" + recurring_todos: "Répétition d'actions" back: Retour actions: Actions - third: "Troisi\xC3\xA8me" + third: "Troisième" add: Ajouter go_back: Retour - previous: !binary | - UHLDqWPDqWRlbnRl - - logout: "D\xC3\xA9connexion" + previous: "Précédente" + logout: "Déconnexion" second: Seconde none: Aucun week: semaine optional: optionnel - deferred: "report\xC3\xA9es" + deferred: "reportées" cancel: Annuler show_all: Voir tous month: mois @@ -127,41 +123,37 @@ fr: zero: non notes numbered_step: Etape %{number} sort: - by_task_count_title: "Trier par nombre de t\xC3\xA2ches" - by_task_count_title_confirm: "Etes vous s\xC3\xBBr de vouloir trier ces projets par nombre de t\xC3\xA2ches ? L\\'ordre actuel sera remplac\xC3\xA9." - alphabetically: "Par ordre alphab\xC3\xA9tique" + by_task_count_title: "Trier par nombre de tâches" + by_task_count_title_confirm: "Etes vous sûr de vouloir trier ces projets par nombre de tâches ? L\\'ordre actuel sera remplacé." + alphabetically: "Par ordre alphabétique" sort: Trier - alphabetically_title: "Trier les projets par ordre alphab\xC3\xA9tique" - alphabetically_confirm: "Etes vous s\xC3\xBBr de vouloir trier ces projets par ordre alphab\xC3\xA9tique ? L\\'ordre actuel sera remplac\xC3\xA9." - by_task_count: "Par nombre de t\xC3\xA2ches" - create: !binary | - Q3LDqWVy - + alphabetically_title: "Trier les projets par ordre alphabétique" + alphabetically_confirm: "Etes vous sûr de vouloir trier ces projets par ordre alphabétique ? L\\'ordre actuel sera remplacé." + by_task_count: "Par nombre de tâches" + create: "Créer" todo: Action months: Mois description: Description - errors_with_fields: "Il y a des probl\xC3\xA8me avec les champs suivants :" + errors_with_fields: "Il y a des problème avec les champs suivants :" drag_handle: DRAG next: Suivant - fourth: "Quatri\xC3\xA8me" + fourth: "Quatrième" context: Contexte contexts: Contextes bugs: Bugs - update: "Mettre \xC3\xA0 jour" + update: "Mettre à jour" forth: FORTH weeks: semaines wiki: Wiki email: Email search: Rechercher - ajaxError: "Une erreur s'est produite en acc\xC3\xA9dant un serveur" + ajaxError: "Une erreur s'est produite en accédant un serveur" not_available_abbr: n/a integrations: opensearch_description: Rechercher dans Tracks applescript_next_action_prompt: "Description de l'action suivante:" - gmail_description: "Gadget pour ajouter Tracks \xC3\xA0 Gmail" - applescript_success_after_id: !binary | - Q3LDqcOp - + gmail_description: "Gadget pour ajouter Tracks à Gmail" + applescript_success_after_id: "Créé" applescript_success_before_id: Nouvelle action suivante avec ID activerecord: attributes: @@ -171,142 +163,132 @@ fr: default_context_name: Contexte par defaut description: Description note: - created_at: !binary | - Y3LDqcOpZSDDoA== - - updated_at: "Mise \xC3\xA0 jour \xC3\xA0" + created_at: "créée à" + updated_at: "Mise à jour à" todo: show_from: Afficher depuis - predecessors: "D\xC3\xA9pend de" + predecessors: "Dépend de" notes: Note - tags: "Mots-cl\xC3\xA9s" + tags: "Mots-clés" project: Projet description: Description context: Contexte - due: "Ech\xC3\xA9ance" + due: "Echéance" preference: - show_hidden_projects_in_sidebar: "Montrer les projets cach\xC3\xA9s dans le panneau lat\xC3\xA9ral" - show_hidden_contexts_in_sidebar: "Montrer les contextes cach\xC3\xA9s dans le panneau lat\xC3\xA9ral" + show_hidden_projects_in_sidebar: "Montrer les projets cachés dans le panneau latéral" + show_hidden_contexts_in_sidebar: "Montrer les contextes cachés dans le panneau latéral" date_format: Format date sms_context: Contexte Email par default - verbose_action_descriptors: "Descripteurs d\\'action d\xC3\xA9taill\xC3\xA9s" - staleness_starts: "D\xC3\xA9but de d\xC3\xA9passement" + verbose_action_descriptors: "Descripteurs d\\'action détaillés" + staleness_starts: "Début de dépassement" mobile_todos_per_page: Actions par page (Vue Mobile) - show_number_completed: "Montrer le nombre d\\'action compl\xC3\xA9t\xC3\xA9es" + show_number_completed: "Montrer le nombre d\\'action complétées" title_date_format: Format de la date en titre refresh: Intervalle de rafraichissement (en minutes) week_starts: Les semaines commencent un last_name: Nom - due_style: "Style Ech\xC3\xA9ance" + due_style: "Style Echéance" locale: Langue time_zone: Fuseau horaire sms_email: De l\'Email - show_project_on_todo_done: "Aller au projet quand la t\xC3\xA2che est termin\xC3\xA9e" - show_completed_projects_in_sidebar: "Montrer les projets compl\xC3\xA9t\xC3\xA9s dans le panneau lat\xC3\xA9ral" + show_project_on_todo_done: "Aller au projet quand la tâche est terminée" + show_completed_projects_in_sidebar: "Montrer les projets complétés dans le panneau latéral" first_name: Nom review_period: Intervalle de revue de projet user: last_name: Nom - first_name: "Pr\xC3\xA9nom" + first_name: "Prénom" errors: models: project: attributes: name: blank: le projet doit avoir un nom - too_long: "le nom du projet doit faire moins de 256 caract\xC3\xA8res" - taken: !binary | - RXhpc3RlIGTDqWrDoA== - + too_long: "le nom du projet doit faire moins de 256 caractères" + taken: "Existe déjà" messages: - record_invalid: "La validation \xC3\xA0 \xC3\xA9chou\xC3\xA9 : %{errors}" - greater_than_or_equal_to: "doit \xC3\xAAtre plus grand ou \xC3\xA9gal \xC3\xA0 %{count}" - confirmation: "n\\'est pas identique \xC3\xA0 la confirmation" - less_than_or_equal_to: "doit \xC3\xAAtre inf\xC3\xA9rieur ou \xC3\xA9gal \xC3\xA0 %{count}" - blank: "ne peux \xC3\xAAtre vide" + record_invalid: "La validation à échoué : %{errors}" + greater_than_or_equal_to: "doit être plus grand ou égal à %{count}" + confirmation: "n\\'est pas identique à la confirmation" + less_than_or_equal_to: "doit être inférieur ou égal à %{count}" + blank: "ne peux être vide" exclusion: exclusion? - invalid: "ne peut contenir le caract\xC3\xA8re virgule (\\',\\')" - odd: "doit \xC3\xAAtre impair" - even: "doit \xC3\xAAtre pair" - empty: "ne peut \xC3\xAAtre vide" - too_short: "est trop court (minimum de %{count} charact\xC3\xA8res)" - wrong_length: "est de longueur incorrecte (doit \xC3\xAAtre de %{count} caract\xC3\xA8res)" - less_than: "doit \xC3\xAAtre inf\xC3\xA9rieur \xC3\xA0 %{count}" - greater_than: "doit \xC3\xAAtre plus grand que %{count}" - equal_to: "doit \xC3\xAAtre \xC3\xA9gal \xC3\xA0 %{count}" - accepted: "doit \xC3\xAAtre accept\xC3\xA9" - too_long: "est trop long (maximum de %{count} caract\xC3\xA8res)" - taken: "est d\xC3\xA9j\xC3\xA0 pris" + invalid: "ne peut contenir le caractère virgule (\\',\\')" + odd: "doit être impair" + even: "doit être pair" + empty: "ne peut être vide" + too_short: "est trop court (minimum de %{count} charactères)" + wrong_length: "est de longueur incorrecte (doit être de %{count} caractères)" + less_than: "doit être inférieur à %{count}" + greater_than: "doit être plus grand que %{count}" + equal_to: "doit être égal à %{count}" + accepted: "doit être accepté" + too_long: "est trop long (maximum de %{count} caractères)" + taken: "est déjà pris" inclusion: n\'est pas inclus dans la liste not_a_number: n\'est pas un nombre full_messages: format: "%{attribute} %{message}" template: - body: "Il y a des probl\xC3\xA8mes avec les champs suivants :" + body: "Il y a des problèmes avec les champs suivants :" header: - one: "1 erreur a emp\xC3\xA9ch\xC3\xA9 ce %{model} d\\'\xC3\xAAtre sauvegard\xC3\xA9" - other: "%{count} erreurs ont emp\xC3\xA9ch\xC3\xA9 ce %{model} d\\'\xC3\xAAtre sauvegard\xC3\xA9" + one: "1 erreur a empéché ce %{model} d\\'être sauvegardé" + other: "%{count} erreurs ont empéché ce %{model} d\\'être sauvegardé" data: - import_successful: "L'import a r\xC3\xA9ussi." + import_successful: "L'import a réussi." import_errors: Des erreurs se sont produites durant l'import models: project: feed_title: Projets Tracks feed_description: Liste de tous les projets de %{username} todo: - error_date_must_be_future: "doit \xC3\xAAtre une date dans le futur" + error_date_must_be_future: "doit être une date dans le futur" preference: - due_on: "Ech\xC3\xA9ance le %{date}" - due_in: "Ech\xC3\xA9ance dans %{days} jours" + due_on: "Echéance le %{date}" + due_in: "Echéance dans %{days} jours" due_styles: - - "Ech\xC3\xA9ance dans ____ jours" - - "Ech\xC3\xA9ance le ____" + - "Echéance dans ____ jours" + - "Echéance le ____" user: - error_context_not_associated: "L'identifiant contexte %{context} n'est pas associ\xC3\xA9 \xC3\xA0 l'identifiant utilisateur %{user}." - error_project_not_associated: "L'identifiant projet %{context} n'est pas associ\xC3\xA9 \xC3\xA0 l'identifiant utilisateur %{user}." + error_context_not_associated: "L'identifiant contexte %{context} n'est pas associé à l'identifiant utilisateur %{user}." + error_project_not_associated: "L'identifiant projet %{context} n'est pas associé à l'identifiant utilisateur %{user}." stats: - totals_hidden_context_count: "et %{count} sont des contextes cach\xC3\xA9s." - actions_avg_created: "Dans les 12 derniers mois vous avez cr\xC3\xA9\xC3\xA9 une moyenne de %{count} actions" - actions_min_max_completion_days: "Le nombre max/min de jours pour r\xC3\xA9aliser est %{min}/%{max}." - totals_actions_completed: "dont %{count} sont r\xC3\xA9alis\xC3\xA9es." + totals_hidden_context_count: "et %{count} sont des contextes cachés." + actions_avg_created: "Dans les 12 derniers mois vous avez créé une moyenne de %{count} actions" + actions_min_max_completion_days: "Le nombre max/min de jours pour réaliser est %{min}/%{max}." + totals_actions_completed: "dont %{count} sont réalisées." tag_cloud_title: Nuage de tag pour toutes les actions - actions_actions_avg_created_30days: "Dans les 30 jours vous avez cr\xC3\xA9er en moyenne %{count} actions" - actions_avg_completed: "et r\xC3\xA9alis\xC3\xA9 une moyenne de %{count} actions par mois." + actions_actions_avg_created_30days: "Dans les 30 jours vous avez créer en moyenne %{count} actions" + actions_avg_completed: "et réalisé une moyenne de %{count} actions par mois." top5_visible_contexts_with_incomplete_actions: Top 5 des contextes visible avec des actions en cours actions: Actions time_of_day_legend: number_of_actions: Nombre d'actions time_of_day: Heure totals_incomplete_actions: Vous avez %{count} actions en cours - totals_deferred_actions: "desquels %{count} sont des actions report\xC3\xA9s dans le Reporteur" + totals_deferred_actions: "desquels %{count} sont des actions reportés dans le Reporteur" running_time_legend: actions: Actions percentage: Pourcentage weeks: Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info totals_action_count: vous avez un total de %{count} actions tag_cloud_90days_title: Nuage de tag des actions des 90 derniers jours - actions_avg_completion_time: "Pour toutes vos actions r\xC3\xA9alis\xC3\xA9s, le temps moyen de r\xC3\xA9alisation est %{count} jours." + actions_avg_completion_time: "Pour toutes vos actions réalisés, le temps moyen de réalisation est %{count} jours." tod30: Heure (30 derniers jours) tags: Tags projects: Projets - totals_completed_project_count: "et %{count} sont des projets r\xC3\xA9alis\xC3\xA9s." + totals_completed_project_count: "et %{count} sont des projets réalisés." labels: - month_avg_completed: "%{month} mois moy. r\xC3\xA9alis\xC3\xA9" - completed: !binary | - Q29tcGzDqXTDqQ== - - month_avg_created: "%{month} mois moy. cr\xC3\xA9\xC3\xA9" - avg_created: !binary | - TW95LiBDcsOpw6k= - - avg_completed: "Moy. R\xC3\xA9alis\xC3\xA9" - created: !binary | - Q3LDqcOp - - actions_selected_from_week: "Actions selectionn\xC3\xA9es depuis la semaine" + month_avg_completed: "%{month} mois moy. réalisé" + completed: "Complété" + month_avg_created: "%{month} mois moy. créé" + avg_created: "Moy. Créé" + avg_completed: "Moy. Réalisé" + created: "Créé" + actions_selected_from_week: "Actions selectionnées depuis la semaine" actions_day_of_week_title: Jour de la semaine (toutes les actions) actions_lastyear_title: Actions des 12 derniers mois - open_per_week: "Actifs (visibles et cach\xC3\xA9s) prochaines actions par semaine" + open_per_week: "Actifs (visibles et cachés) prochaines actions par semaine" action_selection_title: TRACKS::Selection action totals_project_count: Vous avez %{count} projets legend: @@ -317,7 +299,7 @@ fr: running_time: Temps en cours d'une action (en semaines) percentage: Pourcentage months_ago: Il y a ... mois - current_running_time_of_incomplete_visible_actions: "Dur\xC3\xA9e en cours des actions incompl\xC3\xA8tes visibles" + current_running_time_of_incomplete_visible_actions: "Durée en cours des actions incomplètes visibles" tod30_legend: number_of_actions: Nombre d'actions time_of_day: Heure @@ -327,33 +309,33 @@ fr: weeks: Semaines Il ya actions_last_year_legend: number_of_actions: Nombre d'actions - months_ago: "Mois pr\xC3\xA9c\xC3\xA9dents" + months_ago: "Mois précédents" top5_contexts: Top 5 des contextes top10_projects: Top 10 des projets contexts: Contextes totals: Totaux - click_to_return: "Cliquer %{link} pour revenir \xC3\xA0 la page des statistiques" - tag_cloud_90days_description: "Ce nuage de tag contient les tags des actions cr\xC3\xA9\xC3\xA9es ou r\xC3\xA9alis\xC3\xA9es dans les 90 derniers jours." + click_to_return: "Cliquer %{link} pour revenir à la page des statistiques" + tag_cloud_90days_description: "Ce nuage de tag contient les tags des actions créées ou réalisées dans les 90 derniers jours." totals_visible_context_count: De ceux-ci %{count} sont des contextes visibles top10_projects_30days: Top 10 des projets des 30 derniers jours - running_time_all: "Temps en cours de toutes les actions incompl\xC3\xA8tes" - actions_min_completion_time: "Le temps minimum de r\xC3\xA9alisation est %{time}." - action_completion_time_title: "Temps de r\xC3\xA9alisation (toutes les actions r\xC3\xA9alis\xC3\xA9es)" + running_time_all: "Temps en cours de toutes les actions incomplètes" + actions_min_completion_time: "Le temps minimum de réalisation est %{time}." + action_completion_time_title: "Temps de réalisation (toutes les actions réalisées)" click_to_show_actions_from_week: Cliquer %{link} pour voir les actions depuis la semaine %{week}. top10_longrunning: Top 10 des plus long projets en cours - no_actions_selected: "Il n'y a pas d'actions s\xC3\xA9lectionn\xC3\xA9es." + no_actions_selected: "Il n'y a pas d'actions sélectionnées." totals_tag_count: Vous avez %{count} tags sur des actions. actions_further: et plus actions_dow_30days_legend: number_of_actions: Certain nombre d'actions day_of_week: Jour de la semaine - totals_first_action: "Depuis votre premi\xC3\xA8re action du %{date}" - tag_cloud_description: "Ce nuage de tags contient les tags de toutes les actions (r\xC3\xA9alis\xC3\xA9es, en cours, visibles ou cach\xC3\xA9es)" + totals_first_action: "Depuis votre première action du %{date}" + tag_cloud_description: "Ce nuage de tags contient les tags de toutes les actions (réalisées, en cours, visibles ou cachées)" spread_of_actions_for_all_context: Vue des actions pour tous les contextes click_to_update_actions: Cliquer sur une barre du graphique pour mettre a jour les actions ci-dessous. click_to_return_link: ici more_stats_will_appear: Plus de statistiques apparaitront quand vous aurez ajouter quelques actions. - actions_avg_completed_30days: "et r\xC3\xA9alis\xC3\xA9 une moyenne de %{count} actions par jour." + actions_avg_completed_30days: "et réalisé une moyenne de %{count} actions par jour." index_title: TRACKS::Statistiques actions_30days_title: Actions des 30 derniers jours no_tags_available: pas de tags disponibles @@ -363,8 +345,8 @@ fr: day_of_week: Jour de la semaine within_one: Moins de 1 spread_of_running_actions_for_visible_contexts: Vue des actions en cours pour tous les contextes - actions_last_year: "Actions des derni\xC3\xA8res ann\xC3\xA9es" - totals_blocked_actions: "%{count} d\xC3\xA9pendent de la r\xC3\xA9alisation de leurs actions" + actions_last_year: "Actions des dernières années" + totals_blocked_actions: "%{count} dépendent de la réalisation de leurs actions" totals_unique_tags: De ces tags, %{count} sont uniques. totals_active_project_count: De ceux-ci %{count} sont des projets actifs running_time_all_legend: @@ -372,175 +354,173 @@ fr: running_time: Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info percentage: Pourcentage other_actions_label: (autres) - totals_hidden_project_count: "%{count} sont cach\xC3\xA9s" + totals_hidden_project_count: "%{count} sont cachés" time_of_day: Heure (toutes les actions) todos: - recurring_action_deleted: "L'action a \xC3\xA9t\xC3\xA9 supprim\xC3\xA9e. Parce que cette action est r\xC3\xA9currente, une nouvelle action \xC3\xA0 \xC3\xA9t\xC3\xA9 ajout\xC3\xA9e" + recurring_action_deleted: "L'action a été supprimée. Parce que cette action est récurrente, une nouvelle action à été ajoutée" show_from: Afficher depuis - error_starring_recurring: "Impossible d'actionner l'\xC3\xA9toile de la tache r\xC3\xA9currente \\'%{description}\\'" - completed_actions: "Action compl\xC3\xA9t\xC3\xA9es" - added_new_next_action: "Nouvelle action suivante ajout\xC3\xA9e" - completed_recurring: "T\xC3\xA2ches reccurents compl\xC3\xA9t\xC3\xA9s" - completed_rest_of_previous_month: "Compl\xC3\xA9t\xC3\xA9 dans le reste du mois pr\xC3\xA9c\xC3\xA9dent" - blocked_by: "Bloqu\xC3\xA9 par %{predecessors}" + error_starring_recurring: "Impossible d'actionner l'étoile de la tache récurrente \\'%{description}\\'" + completed_actions: "Action complétées" + added_new_next_action: "Nouvelle action suivante ajoutée" + completed_recurring: "Tâches reccurents complétés" + completed_rest_of_previous_month: "Complété dans le reste du mois précédent" + blocked_by: "Bloqué par %{predecessors}" star_action: Elire cette action - completed_recurrence_completed: "Il n'y pas d'action suivante apr\xC3\xA8s l'action r\xC3\xA9currente que vous avez supprim\xC3\xA9e. La r\xC3\xA9currence est termin\xC3\xA9e" - defer_date_after_due_date: "La date de report est apr\xC3\xA8s la date d'\xC3\xA9ch\xC3\xA9ance. Veuillez ajuster la date d'\xC3\xA9cheance avant de reporter." - unable_to_add_dependency: "Impossible d'ajouter la d\xC3\xA9pendance" - done: "Termin\xC3\xA9 ?" + completed_recurrence_completed: "Il n'y pas d'action suivante après l'action récurrente que vous avez supprimée. La récurrence est terminée" + defer_date_after_due_date: "La date de report est après la date d'échéance. Veuillez ajuster la date d'écheance avant de reporter." + unable_to_add_dependency: "Impossible d'ajouter la dépendance" + done: "Terminé ?" star_action_with_description: Elire l'action '%{description}' - tagged_with: "tagg\xC3\xA9 avec ‘%{tag_name}’" - completed: !binary | - Q29tcGzDqXTDqQ== - - no_deferred_actions_with: "Pas d'actions report\xC3\xA9es avec le tag '%{tag_name}'" - no_hidden_actions: "Il n'y a pas d'actions cach\xC3\xA9es actuellement" + tagged_with: "taggé avec ‘%{tag_name}’" + completed: "Complété" + no_deferred_actions_with: "Pas d'actions reportées avec le tag '%{tag_name}'" + no_hidden_actions: "Il n'y a pas d'actions cachées actuellement" edit_action_with_description: Modifier l'action '%{description}' - action_due_on: "(action \xC3\xA0 terminer avant le %{date})" - list_incomplete_next_actions: "Liste les prochaines actions incompl\xC3\xA8tes" - archived_tasks_title: "TRACKS::T\xC3\xA2ches r\xC3\xA9alis\xC3\xA9es archiv\xC3\xA9es" - remove_dependency: "Enlever les d\xC3\xA9pendances (l'action n'est pas supprim\xC3\xA9e)" - action_deleted_success: "L'action suivante \xC3\xA0 \xC3\xA9t\xC3\xA9 supprim\xC3\xA9e avec succ\xC3\xA8s" - tags: "Tags (s\xC3\xA9par\xC3\xA9s par des virgules)" - delete_recurring_action_title: "Supprimer l'action r\xC3\xA9currente" - context_changed: "Contexte chang\xC3\xA9 en %{name}" - new_related_todo_created: "Une nouvelle t\xC3\xA2che a \xC3\xA9t\xC3\xA9 ajout\xC3\xA9e qui appartient \xC3\xA0 cette t\xC3\xA2che r\xC3\xA9currente" + action_due_on: "(action à terminer avant le %{date})" + list_incomplete_next_actions: "Liste les prochaines actions incomplètes" + archived_tasks_title: "TRACKS::Tâches réalisées archivées" + remove_dependency: "Enlever les dépendances (l'action n'est pas supprimée)" + action_deleted_success: "L'action suivante à été supprimée avec succès" + tags: "Tags (séparés par des virgules)" + delete_recurring_action_title: "Supprimer l'action récurrente" + context_changed: "Contexte changé en %{name}" + new_related_todo_created: "Une nouvelle tâche a été ajoutée qui appartient à cette tâche récurrente" mobile_todos_page_title: Toutes les actions - add_another_dependency: "Ajouter une autre d\xC3\xA9pendance" - removed_predecessor: "Suppression de %{successor} comme d\xC3\xA9pendance de %{predecessor}" - recurring_actions_title: "TRACKS::Actions r\xC3\xA9currentes" + add_another_dependency: "Ajouter une autre dépendance" + removed_predecessor: "Suppression de %{successor} comme dépendance de %{predecessor}" + recurring_actions_title: "TRACKS::Actions récurrentes" next_action_needed: Vous devez soumettre au moins une prochaine action - action_saved: "Action sauvegard\xC3\xA9e" - scheduled_overdue: "Programm\xC3\xA9e pour apparaitre il y a %{days} jours" - action_deleted_error: "La suppression de l'action a \xC3\xA9chou\xC3\xA9" + action_saved: "Action sauvegardée" + scheduled_overdue: "Programmée pour apparaitre il y a %{days} jours" + action_deleted_error: "La suppression de l'action a échoué" edit_action: Modifier action - added_new_context: "Nouveau context ajout\xC3\xA9" + added_new_context: "Nouveau context ajouté" next_actions_description: "Filtre:" - list_incomplete_next_actions_with_limit: "Liste les %{count} derni\xC3\xA8res actions suivantes incompl\xC3\xA8tes" + list_incomplete_next_actions_with_limit: "Liste les %{count} dernières actions suivantes incomplètes" set_to_pending: "%{task} mise en attente" - added_new_project: "Nouveau projet ajout\xC3\xA9" + added_new_project: "Nouveau projet ajouté" next_actions_title_additions: - completed: "Actions compl\xC3\xA9t\xC3\xA9es" - due_today: "\xC3\xA9ch\xC3\xA9ance aujourd'hui" - due_within_a_week: "\xC3\xA9ch\xC3\xA9ance dans la semaine" - older_completed_items: "Anciens \xC3\xA9l\xC3\xA9ments compl\xC3\xA9t\xC3\xA9s" - no_actions_due_this_week: "Pas actions \xC3\xA0 faire cette semaine" + completed: "Actions complétées" + due_today: "échéance aujourd'hui" + due_within_a_week: "échéance dans la semaine" + older_completed_items: "Anciens éléments complétés" + no_actions_due_this_week: "Pas actions à faire cette semaine" all_completed_here: ici append_in_this_project: dans ce projet - edit_recurring_todo: "Modifier l'action r\xC3\xA9p\xC3\xA9tant" - error_deleting_item: "Il s'est produit une erreur lors de la suppression de l'\xC3\xA9l\xC3\xA9ment %{description}" - task_list_title: "TRACKS::Lister les t\xC3\xA2ches" - no_recurring_todos: "Il n'y a pas de t\xC3\xA2ches r\xC3\xA9currentes actuellement" - error_completing_todo: "Il s'est produit une erreur lors de l'execution de l'action r\xC3\xA9currente %{description}" - recurring_pattern_removed: "La p\xC3\xA9riodicit\xC3\xA9 est retir\xC3\xA9 de %{count}" + edit_recurring_todo: "Modifier l'action répétant" + error_deleting_item: "Il s'est produit une erreur lors de la suppression de l'élément %{description}" + task_list_title: "TRACKS::Lister les tâches" + no_recurring_todos: "Il n'y a pas de tâches récurrentes actuellement" + error_completing_todo: "Il s'est produit une erreur lors de l'execution de l'action récurrente %{description}" + recurring_pattern_removed: "La périodicité est retiré de %{count}" convert_to_project: Faire projet - no_deferred_pending_actions: "Il n'y pas d'actions report\xC3\xA9es ou en attente actuellement" - delete_recurring_action_confirm: "Etes-vous s\xC3\xBBr de vouloir supprimer l'action r\xC3\xA9currente '%{description'}?" - completed_last_day: "Compl\xC3\xA9t\xC3\xA9 ces derni\xC3\xA8res 24 heures" + no_deferred_pending_actions: "Il n'y pas d'actions reportées ou en attente actuellement" + delete_recurring_action_confirm: "Etes-vous sûr de vouloir supprimer l'action récurrente '%{description'}?" + completed_last_day: "Complété ces dernières 24 heures" feed_title_in_context: dans le contexte '%{context}' no_project: --Pas de projet-- show_in_days: Afficher dans %{days} jours - error_saving_recurring: "Il s'est produit une erreur lors de la sauvegarde de la t\xC3\xA2che r\xC3\xA9currente \\'%{description}\\'" - completed_more_than_x_days_ago: "Compl\xC3\xA9t\xC3\xA9 il y a plus de %{count} jours" - new_related_todo_created_short: "\xC3\xA0 cr\xC3\xA9\xC3\xA9 une nouvelle t\xC3\xA2che" - all_completed: "Toutes les actions r\xC3\xA9alis\xC3\xA9es" + error_saving_recurring: "Il s'est produit une erreur lors de la sauvegarde de la tâche récurrente \\'%{description}\\'" + completed_more_than_x_days_ago: "Complété il y a plus de %{count} jours" + new_related_todo_created_short: "à créé une nouvelle tâche" + all_completed: "Toutes les actions réalisées" edit: Modifier - completed_actions_with: "Action compl\xC3\xA9t\xC3\xA9es avec le tag %{tag_name}" + completed_actions_with: "Action complétées avec le tag %{tag_name}" older_than_days: Plus ancien que %{count} jours - completed_tagged_page_title: "TRACKS::Les t\xC3\xA2ches termin\xC3\xA9es avec marquer %{tag_name}" + completed_tagged_page_title: "TRACKS::Les tâches terminées avec marquer %{tag_name}" pending: En attente - completed_tasks_title: "TRACKS::T\xC3\xA2ches compl\xC3\xA9t\xC3\xA9es" - deleted_success: "Action supprim\xC3\xA9e avec succ\xC3\xA8s." + completed_tasks_title: "TRACKS::Tâches complétées" + deleted_success: "Action supprimée avec succès." feed_title_in_project: dans le projet '%{project}' - clear_due_date: "Effacer la date d'\xC3\xA9ch\xC3\xA9ance" - error_removing_dependency: "Il s'est produit une erreur lors de la suppression de la d\xC3\xA9pendance" - hidden_actions: "Actions cach\xC3\xA9es" - was_due_on_date: "arriv\xC3\xA9e \xC3\xA0 \xC3\xA9ch\xC3\xA9ance le %{date}" + clear_due_date: "Effacer la date d'échéance" + error_removing_dependency: "Il s'est produit une erreur lors de la suppression de la dépendance" + hidden_actions: "Actions cachées" + was_due_on_date: "arrivée à échéance le %{date}" show_on_date: Afficher le %{date} - recurrence_period: "Periode de r\xC3\xA9currence" - deferred_actions_with: "Action report\xC3\xA9es avec le tag '%{tag_name}'" - confirm_delete: "Etes-vous s\xC3\xBBr de vouloir supprimer l'action '%{description}' ?" - recurring_deleted_success: "L'action r\xC3\xA9currente a \xC3\xA9t\xC3\xA9 supprim\xC3\xA9e avec succ\xC3\xA8s." - no_completed_actions_with: "Pas d'actions compl\xC3\xA9t\xC3\xA9es avec le tag '%{tag_name}'" + recurrence_period: "Periode de récurrence" + deferred_actions_with: "Action reportées avec le tag '%{tag_name}'" + confirm_delete: "Etes-vous sûr de vouloir supprimer l'action '%{description}' ?" + recurring_deleted_success: "L'action récurrente a été supprimée avec succès." + no_completed_actions_with: "Pas d'actions complétées avec le tag '%{tag_name}'" next_actions_title: Tracks - Prochaines Actions next_action_description: Description de la prochaine action deferred_tasks_title: TRACKS::Reporteur clear_show_from_date: Effacer show from date - in_hidden_state: "a l\\'\xC3\xA9tat cach\xC3\xA9" + in_hidden_state: "a l\\'état caché" see_all_completed: Vous pouvez voir toutes les actions accomplies %{link} calendar_page_title: TRACKS::Calendrier - unresolved_dependency: "La valeur saisie dans le champ d\xC3\xA9pendance ne correspond pas \xC3\xA0 une action existante. Cette valeur ne sera pas sauvegard\xC3\xA9e avec le reste de l'action. Continuer ?" - no_actions_found_title: "Aucune action trouv\xC3\xA9e" + unresolved_dependency: "La valeur saisie dans le champ dépendance ne correspond pas à une action existante. Cette valeur ne sera pas sauvegardée avec le reste de l'action. Continuer ?" + no_actions_found_title: "Aucune action trouvée" show_today: Afficher aujourd'hui next_actions_due_date: - overdue_by: "D\xC3\xA9pass\xC3\xA9e de %{days} jour" - due_in_x_days: "Ech\xC3\xA9ance dans %{days} days" - due_today: "Ech\xC3\xA9ance aujourd'hui" - overdue_by_plural: "D\xC3\xA9pass\xC3\xA9e de %{days} jours" - due_tomorrow: "Ech\xC3\xA9ance demain" - completed_last_x_days: "Compl\xC3\xA9t\xC3\xA9 ces %{count} jours" - no_actions_with: "Il n'y pas d'actions incompl\xC3\xA8tes avec le tag '%{tag_name}' actuellement" + overdue_by: "Dépassée de %{days} jour" + due_in_x_days: "Echéance dans %{days} days" + due_today: "Echéance aujourd'hui" + overdue_by_plural: "Dépassée de %{days} jours" + due_tomorrow: "Echéance demain" + completed_last_x_days: "Complété ces %{count} jours" + no_actions_with: "Il n'y pas d'actions incomplètes avec le tag '%{tag_name}' actuellement" defer_x_days: one: Reporter d'un jour other: Report de %{count} jours - added_new_next_action_singular: "Nouvelle action suivante ajout\xC3\xA9e" - no_completed_actions: "Il n'y a pas d'actions compl\xC3\xA9t\xC3\xA9es actuellement." - deferred_pending_actions: "Actions report\xC3\xA9es ou en attente" + added_new_next_action_singular: "Nouvelle action suivante ajoutée" + no_completed_actions: "Il n'y a pas d'actions complétées actuellement." + deferred_pending_actions: "Actions reportées ou en attente" has_x_pending: one: A une action en attente other: A %{count} actions en attente feeds: - completed: "Compl\xC3\xA9t\xC3\xA9 : %{date}" - due: "Ech\xC3\xA9ance : %{date}" - recurring_todos: "T\xC3\xA2ches r\xC3\xA9currentes" - error_deleting_recurring: "Il s'est produit une erreur lors de la suppression de la t\xC3\xA2che r\xC3\xA9currente \\'%{description}\\'" + completed: "Complété : %{date}" + due: "Echéance : %{date}" + recurring_todos: "Tâches récurrentes" + error_deleting_recurring: "Il s'est produit une erreur lors de la suppression de la tâche récurrente \\'%{description}\\'" delete_action: Supprimer action delete: Supprimer - no_last_completed_actions: "Aucune action achev\xC3\xA9e trouve" - drag_action_title: "D\xC3\xA9placer sur une autre action pour la rendre d\xC3\xA9pendante de cette action" - cannot_add_dependency_to_completed_todo: "Impossible d'ajouter cette action comme d\xC3\xA9pendance d'une action compl\xC3\xA9t\xC3\xA9e !" - depends_on: "D\xC3\xA9pend de" + no_last_completed_actions: "Aucune action achevée trouve" + drag_action_title: "Déplacer sur une autre action pour la rendre dépendante de cette action" + cannot_add_dependency_to_completed_todo: "Impossible d'ajouter cette action comme dépendance d'une action complétée !" + depends_on: "Dépend de" tickler_items_due: - one: "Un \xC3\xA9l\xC3\xA9ment du reporteur est arriv\xC3\xA9 \xC3\xA0 \xC3\xA9ch\xC3\xA9ance - rafraichir la page pour le voir." - other: "%{count} \xC3\xA9l\xC3\xA9ments du reporteur sont arriv\xC3\xA9s \xC3\xA0 \xC3\xA9ch\xC3\xA9ance - rafraichir la page pour les voir." - action_marked_complete: "L'action '%{description}' a \xC3\xA9t\xC3\xA9 marqu\xC3\xA9e comme %{completed}" - completed_today: "otherVous avez compl\xC3\xA9t\xC3\xA9 %{count} action aujourd'huioneVous avez compl\xC3\xA9t\xC3\xA9 une action aujourd'hui" - added_new_next_action_plural: "Nouvelles actions suivantes ajout\xC3\xA9es" - new_related_todo_not_created_short: "n'a pas cr\xC3\xA9\xC3\xA9 la t\xC3\xA2che" - completed_rest_of_week: "Compl\xC3\xA9t\xC3\xA9 dans le reste de cette semaine" + one: "Un élément du reporteur est arrivé à échéance - rafraichir la page pour le voir." + other: "%{count} éléments du reporteur sont arrivés à échéance - rafraichir la page pour les voir." + action_marked_complete: "L'action '%{description}' a été marquée comme %{completed}" + completed_today: "otherVous avez complété %{count} action aujourd'huioneVous avez complété une action aujourd'hui" + added_new_next_action_plural: "Nouvelles actions suivantes ajoutées" + new_related_todo_not_created_short: "n'a pas créé la tâche" + completed_rest_of_week: "Complété dans le reste de cette semaine" show_tomorrow: Afficher demain - error_starring: "Impossible d'actionner l'\xC3\xA9toile de cette tache \\'%{description}\\'" + error_starring: "Impossible d'actionner l'étoile de cette tache \\'%{description}\\'" calendar: get_in_ical_format: Obtenir ce calendrier au format iCal - due_next_week: "A r\xC3\xA9aliser la semaine prochaine" - no_actions_due_next_week: "Pas d'actions \xC3\xA0 terminer la semaine prochaine" - due_this_week: "A r\xC3\xA9aliser avant la fin de cette semaine" - no_actions_due_today: "Pas d'action \xC3\xA0 terminer aujourd'hui" - due_today: "A r\xC3\xA9aliser aujourd'hui" - due_next_month_and_later: "A r\xC3\xA9aliser dans %{month} et plus" - no_actions_due_after_this_month: "Pas d'actions \xC3\xA0 r\xC3\xA9aliser apr\xC3\xA8s ce mois" - no_actions_due_this_month: "Pas d'actions \xC3\xA0 terminer pour ce mois" - due_this_month: "A r\xC3\xA9aliser avant la fin de %{month}" - no_completed_recurring: "Il n'y a pas d'actions r\xC3\xA9currentes compl\xC3\xA9t\xC3\xA9es actuellement" + due_next_week: "A réaliser la semaine prochaine" + no_actions_due_next_week: "Pas d'actions à terminer la semaine prochaine" + due_this_week: "A réaliser avant la fin de cette semaine" + no_actions_due_today: "Pas d'action à terminer aujourd'hui" + due_today: "A réaliser aujourd'hui" + due_next_month_and_later: "A réaliser dans %{month} et plus" + no_actions_due_after_this_month: "Pas d'actions à réaliser après ce mois" + no_actions_due_this_month: "Pas d'actions à terminer pour ce mois" + due_this_month: "A réaliser avant la fin de %{month}" + no_completed_recurring: "Il n'y a pas d'actions récurrentes complétées actuellement" recurrence: ends_on_date: Fini le %{date} - every_work_day: "Chaque jour ouvr\xC3\xA9" + every_work_day: "Chaque jour ouvré" ends_on_number_times: Fini au bout de %{number} fois - recurrence_on_due_date: "La date d'\xC3\xA9ch\xC3\xA9ance de la t\xC3\xA2che" - weekly_options: "Param\xC3\xA8tres pour les actions r\xC3\xA9currentes hebdomadaires" + recurrence_on_due_date: "La date d'échéance de la tâche" + weekly_options: "Paramètres pour les actions récurrentes hebdomadaires" weekly: Toutes les semaines - monthly_options: "Param\xC3\xA8tres pour les actions r\xC3\xA9currentes mensuelles" - daily_options: "Param\xC3\xA8tres des actions r\xC3\xA9currentes quotidiennes" + monthly_options: "Paramètres pour les actions récurrentes mensuelles" + daily_options: "Paramètres des actions récurrentes quotidiennes" monthly: Mensuellement - starts_on: "D\xC3\xA9marre le" + starts_on: "Démarre le" daily: Quotidiennement show_option_always: toujours pattern: - third: "troisi\xC3\xA8me" + third: "troisième" month_names: - - Janvier - - "F\xC3\xA9vrier" + - "Février" - Mars - Avril - Mai @@ -550,7 +530,7 @@ fr: - Septembre - Octobre - Novembre - - "D\xC3\xA9cembre" + - "Décembre" every_n: tous les %{n} second: seconde every_xth_day_of_every_n_months: tous les %{x} %{day} tous les %{n_months} @@ -563,8 +543,8 @@ fr: times: pour %{number} fois first: premier show: montrer - every_year_on: "chaque ann\xC3\xA9e le %{date}" - on_work_days: "les jours ouvr\xC3\xA9s" + every_year_on: "chaque année le %{date}" + on_work_days: "les jours ouvrés" day_names: - Dimanche - Lundi @@ -573,81 +553,81 @@ fr: - Jeudi - Vendredi - Samedi - fourth: "quatri\xC3\xA8me" - due: "Ech\xC3\xA9ance" + fourth: "quatrième" + due: "Echéance" every_month: chaque mois until: jusqu'a yearly_every_x_day: Chaque %{month} %{day} - recurrence_on_options: "Activer la r\xC3\xA9currence" + recurrence_on_options: "Activer la récurrence" daily_every_number_day: Tous les %{number} jour(s) - show_options: "Montrer la t\xC3\xA2che" + show_options: "Montrer la tâche" weekly_every_number_week: Returns every %{number} week on ends_on: Fini le - show_days_before: "%{days} jours avant la date d'\xC3\xA9ch\xC3\xA9ance de la t\xC3\xA2che" - from_tickler: "la date de la t\xC3\xA2che provient du reporteur (pas de date d\\'\xC3\xA9ch\xC3\xA9ance d\xC3\xA9finie)" + show_days_before: "%{days} jours avant la date d'échéance de la tâche" + from_tickler: "la date de la tâche provient du reporteur (pas de date d\\'échéance définie)" no_end_date: Pas de date de fin day_x_on_every_x_month: Le %{day} tous les %{month} mois yearly_every_xth_day: Chaque %{day} %{day_of_week} de %{month} - yearly_options: "Param\xC3\xA8tres pour les actions r\xC3\xA9currentes annuelles" + yearly_options: "Paramètres pour les actions récurrentes annuelles" yearly: Tous les ans monthly_every_xth_day: Le %{day} %{day_of_week} tous les %{month} mois - action_deferred: "L'action '%{description}' a \xC3\xA9t\xC3\xA9 report\xC3\xA9" - tagged_page_title: "TRACKS::Tagg\xC3\xA9 avec %{tag_name}'" - added_dependency: "%{dependency} ajout\xC3\xA9e comme d\xC3\xA9pendance" - completed_rest_of_month: "Compl\xC3\xA9t\xC3\xA9 dans le reste de ce mois-ci" - all_completed_tagged_page_title: "TRACKS::Toutes les t\xC3\xA2ches accomplies par marquer %{tag_name}" - no_deferred_actions: "Il n'y a pas d'actions report\xC3\xA9es actuellement" - recurrence_completed: "Il n'y a pas d'action suivante apr\xC3\xA8s l'action r\xC3\xA9currente que vous venez de terminer. Fin de la r\xC3\xA9currence" - action_marked_complete_error: "L'action '%{description}' n'a PAS \xC3\xA9t\xC3\xA9 marqu\xC3\xA9e comme %{completed} a cause d'une erreur sur le serveur " - no_actions_found: "Il n'y pas d'actions incompl\xC3\xA8tes actuellement." + action_deferred: "L'action '%{description}' a été reporté" + tagged_page_title: "TRACKS::Taggé avec %{tag_name}'" + added_dependency: "%{dependency} ajoutée comme dépendance" + completed_rest_of_month: "Complété dans le reste de ce mois-ci" + all_completed_tagged_page_title: "TRACKS::Toutes les tâches accomplies par marquer %{tag_name}" + no_deferred_actions: "Il n'y a pas d'actions reportées actuellement" + recurrence_completed: "Il n'y a pas d'action suivante après l'action récurrente que vous venez de terminer. Fin de la récurrence" + action_marked_complete_error: "L'action '%{description}' n'a PAS été marquée comme %{completed} a cause d'une erreur sur le serveur " + no_actions_found: "Il n'y pas d'actions incomplètes actuellement." in_pending_state: en attente - error_toggle_complete: "Impossible de marquer cette tache comme compl\xC3\xA9t\xC3\xA9e" - due: "Ech\xC3\xA9ance" - no_incomplete_actions: "Il n'y a pas d'actions incompl\xC3\xA8tes" - action_saved_to_tickler: "Action sauvegard\xC3\xA9e dans le Reporteur" - recurring_action_saved: "Action r\xC3\xA9currente sauv\xC3\xA9e" - depends_on_separate_with_commas: "D\xC3\xA9pend de (s\xC3\xA9parer avec des virgules)" + error_toggle_complete: "Impossible de marquer cette tache comme complétée" + due: "Echéance" + no_incomplete_actions: "Il n'y a pas d'actions incomplètes" + action_saved_to_tickler: "Action sauvegardée dans le Reporteur" + recurring_action_saved: "Action récurrente sauvée" + depends_on_separate_with_commas: "Dépend de (séparer avec des virgules)" completed_in_archive: - one: "Il n'y a pas d'action compl\xC3\xA9t\xC3\xA9e dans l'archive" - other: "Il y a %{count} actions compl\xC3\xA9t\xC3\xA9es dans l'archive" + one: "Il n'y a pas d'action complétée dans l'archive" + other: "Il y a %{count} actions complétées dans l'archive" to_tickler: Vers le reporteur next_actions_description_additions: completed: dans les %{count} derniers jours - due_date: "avec au plus la date d'\xC3\xA9ch\xC3\xA9ance %{due_date}" + due_date: "avec au plus la date d'échéance %{due_date}" overdue: En retard - add_new_recurring: "Ajouter une nouvelle action r\xC3\xA9currente" + add_new_recurring: "Ajouter une nouvelle action récurrente" notes: delete_note_title: Supprimer la note '%{id}' delete_confirmation: Etes-vous sur de vouloir supprimer la note '%{id}' ? in_project: "Dans:" - delete_item_title: "Supprimer l'\xC3\xA9l\xC3\xA9ment" + delete_item_title: "Supprimer l'élément" deleted_note: Supprimer la note '%{id}' note_link_title: Voir note %{id} show_note_title: Voir note - edit_item_title: "Modifier l'\xC3\xA9l\xC3\xA9ment" + edit_item_title: "Modifier l'élément" note_location_link: "ln:" no_notes_available: "Il n'y a actuellement aucune note: ajouter des notes aux projets sur les pages individuelles des projets." note_header: Note %{id} delete_note_confirm: Etes-vous sur de vouloir supprimer la note '%{id}' ? projects: - default_context_set: "D\xC3\xA9finir le contexte par d\xC3\xA9faut du projet \xC3\xA0 %{default_context}" - no_actions_in_project: "Il n'y pas d'action incompl\xC3\xA8tes pour ce projet" - deferred_actions: "Actions report\xC3\xA9es pour ce projet" - was_marked_hidden: "est cach\xC3\xA9" + default_context_set: "Définir le contexte par défaut du projet à %{default_context}" + no_actions_in_project: "Il n'y pas d'action incomplètes pour ce projet" + deferred_actions: "Actions reportées pour ce projet" + was_marked_hidden: "est caché" edit_project_title: Editer le projet default_tags_removed_notice: Supprimer les tags par defaut page_title: "TRACKS::Projet: %{project}" - all_completed_tasks_title: "TRACKS::Tous les Actions Achev\xC3\xA9 en Projet '%{project_name}'" + all_completed_tasks_title: "TRACKS::Tous les Actions Achevé en Projet '%{project_name}'" hide_form: Cacher le formulaire - list_completed_projects: "TRACKS::Liste des projets achev\xC3\xA9s" - no_notes_attached: "Il n'y a actuellement aucune note attach\xC3\xA9e \xC3\xA0 ce projet" - to_new_project_page: "Aller \xC3\xA0 la page du nouveau projet" - show_form_title: "Cr\xC3\xA9er un nouveau projet" - deferred_actions_empty: "Il n'y a pas d'actions report\xC3\xA9es pour ce projet" + list_completed_projects: "TRACKS::Liste des projets achevés" + no_notes_attached: "Il n'y a actuellement aucune note attachée à ce projet" + to_new_project_page: "Aller à la page du nouveau projet" + show_form_title: "Créer un nouveau projet" + deferred_actions_empty: "Il n'y a pas d'actions reportées pour ce projet" project_state: Le projet est %{state} this_project: Ce projet - no_last_completed_projects: "Pas de projets termin\xC3\xA9s trouv\xC3\xA9s" - no_last_completed_recurring_todos: "Non termin\xC3\xA9 actions r\xC3\xA9p\xC3\xA9titives trouv\xC3\xA9es" + no_last_completed_projects: "Pas de projets terminés trouvés" + no_last_completed_recurring_todos: "Non terminé actions répétitives trouvées" notes: Notes todos_append: dans ce projet list_reviews: TRACKS::Revue @@ -655,82 +635,76 @@ fr: no_projects: Il n'y a actuellement aucun projet hide_form_title: Cacher le formulaire nouveau projet delete_project: Supprimer projet - completed_actions_empty: "Il n'y a pas d'actions r\xC3\xA9alis\xC3\xA9es pour ce projet" - with_no_default_context: "sans contexte par d\xC3\xA9faut" - delete_project_confirmation: "Etes vous s\xC3\xBBr de vouloir supprimer le projet '%{name}' ?" - with_default_context: "avec '%{context_name}' comme contexte par d\xC3\xA9faut" + completed_actions_empty: "Il n'y a pas d'actions réalisées pour ce projet" + with_no_default_context: "sans contexte par défaut" + delete_project_confirmation: "Etes vous sûr de vouloir supprimer le projet '%{name}' ?" + with_default_context: "avec '%{context_name}' comme contexte par défaut" show_form: Ajouter un projet actions_in_project_title: Actions pour ce projet - completed_projects: "Projets r\xC3\xA9alis\xC3\xA9s" + completed_projects: "Projets réalisés" is_active: est actif add_note: Ajouter une note - set_default_tags_notice: "D\xC3\xA9finir les tags par d\xC3\xA9faut du projet \xC3\xA0 %{default_tags}" + set_default_tags_notice: "Définir les tags par défaut du projet à %{default_tags}" add_project: Ajouter projet - settings: "Param\xC3\xA8tres" - project_saved_status: "Projet sauvegard\xC3\xA9" + settings: "Paramètres" + project_saved_status: "Projet sauvegardé" list_projects: TRACKS::Liste des Projets with_default_tags: et avec '%{tags'} comme tags par defaut - completed_tasks_title: "TRACKS::Liste des actions men\xC3\xA9es \xC3\xA0 terme dans Projet '%{project_name}'" - hidden_projects: "Projets cach\xC3\xA9s" + completed_tasks_title: "TRACKS::Liste des actions menées à terme dans Projet '%{project_name}'" + hidden_projects: "Projets cachés" delete_project_title: Supprimer le projet - default_context_removed: "Contexte par d\xC3\xA9faut supprim\xC3\xA9" + default_context_removed: "Contexte par défaut supprimé" add_note_submit: Ajouter note - completed_actions: "Actions r\xC3\xA9alis\xC3\xA9es pour ce projet" - was_marked_complete: "est compl\xC3\xA9t\xC3\xA9" + completed_actions: "Actions réalisées pour ce projet" + was_marked_complete: "est complété" no_default_context: Ce projet n'a pas de contexte par defaut - with_no_default_tags: "et sans tags par d\xC3\xA9faut" - default_context: "Le contexte par d\xC3\xA9faut pour ce projet est %{context}" - edit_project_settings: "Modifier les param\xC3\xA8tres du projet" - status_project_name_changed: "Le nom du projet a \xC3\xA9t\xC3\xA9 modifi\xC3\xA9" + with_no_default_tags: "et sans tags par défaut" + default_context: "Le contexte par défaut pour ce projet est %{context}" + edit_project_settings: "Modifier les paramètres du projet" + status_project_name_changed: "Le nom du projet a été modifié" state: Le projet est %{state} active_projects: Projets actifs states: - hidden_plural: "Cach\xC3\xA9s" - stalled: "Bloqu\xC3\xA9s" - review_plural: !binary | - RGF0w6ll - - completed: "Complet\xC3\xA9" + hidden_plural: "Cachés" + stalled: "Bloqués" + review_plural: "Datée" + completed: "Completé" current: Up-to-date - review: !binary | - RGF0w6ll - - completed_plural: "Complet\xC3\xA9s" - blocked: "Bloqu\xC3\xA9e" - blocked_plural: "Bloqu\xC3\xA9e" - stalled_plural: "Bloqu\xC3\xA9s" + review: "Datée" + completed_plural: "Completés" + blocked: "Bloquée" + blocked_plural: "Bloquée" + stalled_plural: "Bloqués" visible_plural: Visibles active_plural: Actifs visible: Visible - hidden: !binary | - Q2FjaMOp - + hidden: "Caché" active: Actif current_plural: Up-to-date errors: - user_unauthorized: "401 Non autoris\xC3\xA9: Administrateur seulement." + user_unauthorized: "401 Non autorisé: Administrateur seulement." preferences: open_id_url: Votre URL OpenID est - change_identity_url: "Modifier votre URL d'identit\xC3\xA9" - staleness_starts_after: "\"date de fraicher\" d\xC3\xA9pass\xC3\xA9e \xC3\xA0 pr\xC3\xA8s %{days} days" - page_title: "TRACKS::Pr\xC3\xA9f\xC3\xA9rences" + change_identity_url: "Modifier votre URL d'identité" + staleness_starts_after: "\"date de fraicher\" dépassée à près %{days} days" + page_title: "TRACKS::Préférences" change_password: Modifier votre mot de passe token_description: Jeton (pour flux et utilisation API) - title: "Vos pr\xC3\xA9f\xC3\xA9rences" + title: "Vos préférences" is_false: faux - show_number_completed: "Montrer %{number} items r\xC3\xA9alis\xC3\xA9s" - password_changed: "Votre mot de passe a \xC3\xA9t\xC3\xA9 chang\xC3\xA9, s'il vous pla\xC3\xAEt vous connecter \xC3\xA0 nouveau." - edit_preferences: "Editer les pr\xC3\xA9f\xC3\xA9rences" - page_title_edit: "TRACKS::Editer les pr\xC3\xA9f\xC3\xA9rences" + show_number_completed: "Montrer %{number} items réalisés" + password_changed: "Votre mot de passe a été changé, s'il vous plaît vous connecter à nouveau." + edit_preferences: "Editer les préférences" + page_title_edit: "TRACKS::Editer les préférences" is_true: vrai sms_context_none: Aucun - generate_new_token: "G\xC3\xA9n\xC3\xA9rer un nouveau jeton" + generate_new_token: "Générer un nouveau jeton" token_header: Votre jeton authentication_header: Votre authentification - updated: "Pr\xC3\xA9f\xC3\xA9rences jour" + updated: "Préférences jour" current_authentication_type: Votre type d'authentification est %{auth_type} change_authentication_type: Modifier votre type d'authentification - generate_new_token_confirm: "Etes vous s\xC3\xBBr ? G\xC3\xA9n\xC3\xA9rer un nouveau jeton va remplacer le jeton existant et en interdire les utilisations externes." + generate_new_token_confirm: "Etes vous sûr ? Générer un nouveau jeton va remplacer le jeton existant et en interdire les utilisations externes." tabs: authentication: Authentification tracks_behavior: Comportements Tracks @@ -750,7 +724,7 @@ fr: month_names: - - janvier - - "f\xC3\xA9vrier" + - "février" - mars - avril - mai @@ -760,7 +734,7 @@ fr: - septembre - octobre - novembre - - "d\xC3\xA9cembre" + - "décembre" abbr_day_names: - dim - lun @@ -791,9 +765,7 @@ fr: abbr_month_names: - - jan. - - !binary | - RsOpdi4= - + - "Fév." - mar. - avr. - mai @@ -803,36 +775,34 @@ fr: - sept. - oct. - nov. - - d\xC3\xA9c. + - déc. will_paginate: - previous_label: !binary | - wqtQcsOpY8OpZGVudA== - + previous_label: "«Précédent" page_entries_info: - multi_page: "Affiche %{model} de %{from} - %{to} \xC3\xA0 %{count} au total" + multi_page: "Affiche %{model} de %{from} - %{to} à %{count} au total" single_page_html: one: Voir de 1 %{model} other: Afficher tous les %{count} %{model} - zero: "Aucun %{model} trouv\xC3\xA9s" + zero: "Aucun %{model} trouvés" single_page: one: Voir de 1 %{model} other: Afficher tous les %{count} %{model} - zero: "Aucun %{model} trouv\xC3\xA9s" - multi_page_html: "Affiche %{model} %{from} - %{to} \xC3\xA0 la %{count} au total" + zero: "Aucun %{model} trouvés" + multi_page_html: "Affiche %{model} %{from} - %{to} à la %{count} au total" page_gap: ... - next_label: "Suivant \xC2\xBB" + next_label: "Suivant »" support: array: words_connector: "," last_word_connector: ", et" two_words_connector: et select: - prompt: "Veuillez s\xC3\xA9lectionner" + prompt: "Veuillez sélectionner" footer: send_feedback: Envoyer un feedback sur %{version} shared: multiple_next_actions: Actions suivante multiples (une sur chaque ligne) - make_actions_dependent: "Faire actions d\xC3\xA9pendantes les unes des autres" + make_actions_dependent: "Faire actions dépendantes les unes des autres" toggle_single: Ajouter action suivante hide_form: Cacher le formulaire add_actions: Ajouter actions @@ -842,7 +812,7 @@ fr: project_for_all_actions: Projet pour toutes les actions context_for_all_actions: Contexte pour toutes les actions toggle_multi: Ajouter plusieurs actions suivantes - separate_tags_with_commas: "s\xC3\xA9parer avec des virgules" + separate_tags_with_commas: "séparer avec des virgules" add_context: Ajouter Contexte toggle_multi_title: Basculer formulaire action simple/multiple hide_action_form_title: Cacher le formulaire nouvelle action @@ -850,7 +820,7 @@ fr: choose_context: Choisir le contexte dont vous voulez un flux actions_due_today: Actions devant se terminer aujourd'hui ou avant ical_feed: Flux iCal - legend: "L\xC3\xA9gende" + legend: "Légende" all_contexts: Tous les contextes rss_feed: Flux RSS choose_project: Choisir le projet dont vous voulez un flux @@ -858,48 +828,48 @@ fr: project_needed: Il faut au moins un projet pour le flux select_feed_for_project: Selectionner le flux pour ce projet active_projects_wo_next: Projets actifs avec aucune action suivante - active_starred_actions: "Toutes les actions pr\xC3\xA9ferr\xC3\xA9es actives" + active_starred_actions: "Toutes les actions préferrées actives" context_needed: Il faut au moins un contexte pour le flux select_feed_for_context: Selectionner un flux pour ce contexte projects_and_actions: Projets actifs et leurs actions - notice_incomplete_only: "NB: Les flux ne montrent que les actions incompl\xC3\xA8tes, sauf indication contraire" + notice_incomplete_only: "NB: Les flux ne montrent que les actions incomplètes, sauf indication contraire" actions_due_next_week: Actions devant se terminer dans les 7 prochains jours ou moins - actions_completed_last_week: "Actions r\xC3\xA9alis\xC3\xA9es dans les 7 derniers jours" - context_centric_actions: "Flux des actions dans un contexte sp\xC3\xA9cifique" + actions_completed_last_week: "Actions réalisées dans les 7 derniers jours" + context_centric_actions: "Flux des actions dans un contexte spécifique" plain_text_feed: Flux texte - last_fixed_number: "Derni\xC3\xA8res %{number} actions" + last_fixed_number: "Dernières %{number} actions" all_actions: Toutes les actions - project_centric: "Flux des actions incompl\xC3\xA8tes d'un projet sp\xC3\xA9cifique" + project_centric: "Flux des actions incomplètes d'un projet spécifique" sidebar: list_name_active_contexts: Contextes actifs list_name_active_projects: Projets actifs list_empty: Aucun - list_name_completed_projects: "Projets r\xC3\xA9alis\xC3\xA9s" - list_name_hidden_projects: "Projets cach\xC3\xA9s" - list_name_hidden_contexts: "Contextes cach\xC3\xA9s" + list_name_completed_projects: "Projets réalisés" + list_name_hidden_projects: "Projets cachés" + list_name_hidden_contexts: "Contextes cachés" users: - openid_url_verified: "Vous avez v\xC3\xA9rifi\xC3\xA9 avec succ\xC3\xA8s votre identit\xC3\xA9 comme %{url} et d\xC3\xA9fini votre type authentification comme OpenID" - auth_type_update_error: "Un probl\xC3\xA8me est survenu lors de la modification du type d'authentification : %{error_messages}" - failed_to_delete_user: "La suppression de l'utilisateur {username} \xC3\xA0 \xC3\xA9chou\xC3\xA9" - destroy_successful: "Utilisateur %{login} supprim\xC3\xA9 avec succ\xC3\xA8s" - first_user_heading: "Bienvenu \xC3\xA0 TRAKS. Pour commencer, veuillez cr\xC3\xA9er un compte administrateur" + openid_url_verified: "Vous avez vérifié avec succès votre identité comme %{url} et défini votre type authentification comme OpenID" + auth_type_update_error: "Un problème est survenu lors de la modification du type d'authentification : %{error_messages}" + failed_to_delete_user: "La suppression de l'utilisateur {username} à échoué" + destroy_successful: "Utilisateur %{login} supprimé avec succès" + first_user_heading: "Bienvenu à TRAKS. Pour commencer, veuillez créer un compte administrateur" total_contexts: Total contextes - successfully_deleted_user: "Utilisateur %{username} supprim\xC3\xA9 avec succ\xC3\xA8s" - signup_successful: "Utilisateur %{username} cr\xC3\xA9\xC3\xA9 avec succ\xC3\xA8s." - new_token_generated: "Nouveau token g\xC3\xA9n\xC3\xA9r\xC3\xA9 avec succ\xC3\xA9s" + successfully_deleted_user: "Utilisateur %{username} supprimé avec succès" + signup_successful: "Utilisateur %{username} créé avec succès." + new_token_generated: "Nouveau token généré avec succés" total_projects: Total projets change_password_submit: Modifier mot de passe no_signups_title: TRACKS::Pas de signups - user_created: "Utilisateur cr\xC3\xA9\xC3\xA9." - account_signup: "Cr\xC3\xA9er un compte" - manage_users: "G\xC3\xA9rer utilisateurs" - password_updated: "Mot de passe modifi\xC3\xA9." - auth_type_updated: "Type d'authentification modifi\xC3\xA9." + user_created: "Utilisateur créé." + account_signup: "Créer un compte" + manage_users: "Gérer utilisateurs" + password_updated: "Mot de passe modifié." + auth_type_updated: "Type d'authentification modifié." total_actions: Total actions - desired_login: "Login souhait\xC3\xA9" - signup: "Cr\xC3\xA9ation" + desired_login: "Login souhaité" + signup: "Création" confirm_password: Confirmer le mot de passe - new_user_heading: "Cr\xC3\xA9er un nouvel utilisateur:" + new_user_heading: "Créer un nouvel utilisateur:" password_confirmation_label: Confirmer mot de passe destroy_error: Une erreur s'est produite lors de la suppression de l'utilisateur %{login} choose_password: Choisir le mot de passe @@ -910,70 +880,70 @@ fr: register_with_cas: Avec votre nom d'utilisateur CAS label_auth_type: Type d'authentification total_users_count: Vous avez %{count} utilisateurs - new_user_title: "TRACKS::Cr\xC3\xA9er un administrateur" + new_user_title: "TRACKS::Créer un administrateur" destroy_user: Supprimer utilisateur - destroy_confirmation: "Attention : cela va supprimer l'utilisateur '%{login}', toutes ses actions, contextes, projets et notes. Etes-vous s\xC3\xBBr de vouloir continuer ?" - you_have_to_reset_your_password: "Vous devez r\xC3\xA9initialiser votre mot de passe" - signup_new_user: "Cr\xC3\xA9er un nouvel utilisateur" - identity_url: "URL Identit\xC3\xA9" - openid_ok_pref_failed: "Vous avez v\xC3\xA9rifi\xC3\xA9 avec succ\xC3\xA8s votre identit\xC3\xA9 comme %{url} mais un probl\xC3\xA8me est survenu lors de la sauvegarde de vos pr\xC3\xA9f\xC3\xA9rences d'authentification." + destroy_confirmation: "Attention : cela va supprimer l'utilisateur '%{login}', toutes ses actions, contextes, projets et notes. Etes-vous sûr de vouloir continuer ?" + you_have_to_reset_your_password: "Vous devez réinitialiser votre mot de passe" + signup_new_user: "Créer un nouvel utilisateur" + identity_url: "URL Identité" + openid_ok_pref_failed: "Vous avez vérifié avec succès votre identité comme %{url} mais un problème est survenu lors de la sauvegarde de vos préférences d'authentification." auth_change_submit: Modifier le type d'authenfication change_authentication_type: Modifier le type d'authentification total_notes: Total notes - select_authentication_type: "S\xC3\xA9lectionner votre nouveau type d'authentification et cliquer sur 'Modifier type d'authenfication' pour remplacer les param\xC3\xA8tres actuels." + select_authentication_type: "Sélectionner votre nouveau type d'authentification et cliquer sur 'Modifier type d'authenfication' pour remplacer les paramètres actuels." contexts: delete_context_title: Supprimer contexte - all_completed_tasks_title: "TRACKS::Toutes les actions Achev\xC3\xA9 en le contexte '%{context_name}'" + all_completed_tasks_title: "TRACKS::Toutes les actions Achevé en le contexte '%{context_name}'" hide_form: Cacher le formulaire show_form_title: Ajouter un contexte - delete_context_confirmation: "Etes vous s\xC3\xBBr de vouloir supprimer le contexte %{name}? Toutes les actions (r\xC3\xA9p\xC3\xA9titives) de ce contexte seront \xC3\xA9galement supprim\xC3\xA9es !" + delete_context_confirmation: "Etes vous sûr de vouloir supprimer le contexte %{name}? Toutes les actions (répétitives) de ce contexte seront également supprimées !" todos_append: dans ce contexte delete_context: Supprimer contexte edit_context: Modifier contexte hide_form_title: Cacher le formulaire nouveau contexte - hidden_contexts: "Contextes cach\xC3\xA9s" + hidden_contexts: "Contextes cachés" no_contexts_active: Actuellement, il n'y a pas de contextes actifs - context_hide: "Cach\xC3\xA9 de la premi\xC3\xA8re page ?" + context_hide: "Caché de la première page ?" add_context: Ajouter un contexte - show_form: "Cr\xC3\xA9er un nouveau contexte" - save_status_message: "Contexte sauvegard\xC3\xA9" + show_form: "Créer un nouveau contexte" + save_status_message: "Contexte sauvegardé" visible_contexts: Contextes visibles - update_status_message: "Le nom du contexte \xC3\xA0 \xC3\xA9t\xC3\xA9 modifi\xC3\xA9" + update_status_message: "Le nom du contexte à été modifié" context_name: Nom du Contexte status_active: Le Contexte est actif - completed_tasks_title: "TRACKS::actions Achev\xC3\xA9 en le contexte '%{context_name}'" - new_context_post: "'sera aussi cr\xC3\xA9\xC3\xA9. Etes-vous s\xC3\xBBr ?" + completed_tasks_title: "TRACKS::actions Achevé en le contexte '%{context_name}'" + new_context_post: "'sera aussi créé. Etes-vous sûr ?" new_context_pre: Nouveau contexte ' - no_actions: "Actuellement, il n'y pas d'actions incompl\xC3\xA8tes dans ce contexte" + no_actions: "Actuellement, il n'y pas d'actions incomplètes dans ce contexte" last_completed_in_context: dans ce contexte (dernier %{number}) - context_deleted: "Contexte \\'%{name}\\' supprim\xC3\xA9" - no_contexts_hidden: "Actuellement, il n'y a pas de contextes cach\xC3\xA9s" - status_hidden: "Le Contexte est cach\xC3\xA9" + context_deleted: "Contexte \\'%{name}\\' supprimé" + no_contexts_hidden: "Actuellement, il n'y a pas de contextes cachés" + status_hidden: "Le Contexte est caché" login: - openid_identity_url_not_found: "D\xC3\xA9sol\xC3\xA9, aucun utilisateur avec cette identit\xC3\xA9 URL n'existe (%{identity_url})" - user_no_expiry: "Rester connect\xC3\xA9" + openid_identity_url_not_found: "Désolé, aucun utilisateur avec cette identité URL n'existe (%{identity_url})" + user_no_expiry: "Rester connecté" sign_in: Se connecter login_cas: Aller au CAS cas_no_user_found: Bonjour, %{username}! Vous n'avez pas de compte sur Tracks. cas_login: Login CAS - successful_with_session_info: "La connexion \xC3\xA0 r\xC3\xA9ussi:" + successful_with_session_info: "La connexion à réussi:" please_login: Veuillez vous connecter pour utiliser Tracks - cas_logged_in_greeting: "Bonjour, %{username}! Vous \xC3\xAAtes authentifi\xC3\xA9." - cas_username_not_found: "D\xC3\xA9sol\xC3\xA9, aucun utilisateur avec ce nom CAS n'existe (%{username})" - cas_create_account: "Si vous voulez vous inscrire aller \xC3\xA0 %{signup_link}" + cas_logged_in_greeting: "Bonjour, %{username}! Vous êtes authentifié." + cas_username_not_found: "Désolé, aucun utilisateur avec ce nom CAS n'existe (%{username})" + cas_create_account: "Si vous voulez vous inscrire aller à %{signup_link}" mobile_use_openid: ... ou ce connecter avec un OpenID cas_signup_link: Demander un compte account_login: Identifiant du compte - successful: "La connexion \xC3\xA0 r\xC3\xA9ussi. Bienvenue !" + successful: "La connexion à réussi. Bienvenue !" session_will_not_expire: la session n'expire jamais. option_separator: ou, - session_time_out: "La session \xC3\xA0 expir\xC3\xA9. Merci de %{link}" - session_will_expire: "la session expire apr\xC3\xA8s %{hours} heure(s) d'inactivit\xC3\xA9." - login_standard: "retourner \xC3\xA0 l'\xC3\xA9cran de connexion standard" + session_time_out: "La session à expiré. Merci de %{link}" + session_will_expire: "la session expire après %{hours} heure(s) d'inactivité." + login_standard: "retourner à l'écran de connexion standard" login_with_openid: se connecter avec un OpenID - unsuccessful: "La connexion \xC3\xA0 \xC3\xA9chou\xC3\xA9." + unsuccessful: "La connexion à échoué." log_in_again: Se reconnecter - logged_out: "Vous avez \xC3\xA9t\xC3\xA9 d\xC3\xA9connect\xC3\xA9 de Tracks." + logged_out: "Vous avez été déconnecté de Tracks." datetime: prompts: minute: Minute @@ -981,9 +951,7 @@ fr: month: Mois hour: Heure day: Jour - year: !binary | - QW5uw6ll - + year: "Année" distance_in_words: less_than_x_minutes: one: moins d'une minute @@ -1022,9 +990,9 @@ fr: other: plus de %{count} ans half_a_minute: une demi-minute search: - contexts_matching_query: "Contextes correspondant \xC3\xA0 la requ\xC3\xAAte" - tags_matching_query: "Tags correspondant \xC3\xA0 la requ\xC3\xAAte" - no_results: "Aucun r\xC3\xA9sultat \xC3\xA0 votre recherche." - todos_matching_query: "AFaire (todos) correspondant \xC3\xA0 la requ\xC3\xAAte" - projects_matching_query: "Projets correspondant \xC3\xA0 la requ\xC3\xAAte" - notes_matching_query: "Notes correspondant \xC3\xA0 la requ\xC3\xAAte" + contexts_matching_query: "Contextes correspondant à la requête" + tags_matching_query: "Tags correspondant à la requête" + no_results: "Aucun résultat à votre recherche." + todos_matching_query: "AFaire (todos) correspondant à la requête" + projects_matching_query: "Projets correspondant à la requête" + notes_matching_query: "Notes correspondant à la requête" diff --git a/config/locales/he.yml b/config/locales/he.yml index aa97b35a..5a69203b 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -2,687 +2,248 @@ he: will_paginate: page_entries_info: - multi_page: !binary | - 157XpteZ15IgJXttb2RlbH0gJXtmcm9tfSAtICV7dG99INee16rXldeaICV7 - Y291bnR9INeR16HXmiDXlNeb15w= - + multi_page: "מציג %{model} %{from} - %{to} מתוך %{count} בסך הכל" single_page: - other: !binary | - 157XpteZ15Ig15DXqiDXm9ecICV7Y291bnR9ICV7bW9kZWx9 - - zero: !binary | - 15zXkCDXoNee16bXkCAle21vZGVsfQ== - - one: !binary | - 157XpteZ15IgJXttb2RlbH0g15DXl9eT - - multi_page_html: !binary | - 157XpteZ15IgJXttb2RlbH0gPGI+JXtmcm9tfSZuYnNwOy0mbmJzcDsle3Rv - fTwvYj4g157XqteV15ogPGI+JXtjb3VudH08L2I+INeR16HXmiDXlNeb15w= - + other: "מציג את כל %{count} %{model}" + zero: "לא נמצא %{model}" + one: "מציג %{model} אחד" + multi_page_html: "מציג %{model} %{from} - %{to} מתוך %{count} בסך הכל" single_page_html: - other: "\xD7\x9E\xD7\xA6\xD7\x99\xD7\x92 \xD7\x9B\xD7\x9C %{count} %{model}" - zero: !binary | - 15zXkCDXoNee16bXkCAle21vZGVsfQ== - - one: "\xD7\x9E\xD7\xA6\xD7\x99\xD7\x92 1 %{model}" - previous_label: !binary | - JmxhcXVvOyDXlNen15XXk9ed - + other: "מציג כל %{count} %{model}" + zero: "לא נמצא %{model}" + one: "מציג 1 %{model}" + previous_label: "« הקודם" page_gap: "…" - next_label: !binary | - 15TXkdeQICZyYXF1bzs= - + next_label: "הבא »" integrations: - applescript_success_before_id: !binary | - 16TXoteV15zXqiDXlNee16nXmiDXotedINeW15nXlNeV15k= - - gmail_description: !binary | - 15fWstek1rTXmdelINec15TXldeh16TXqiDXnteh15zXldec15nXnSDXnC1H - bWFpbA== - - applescript_next_action_prompt: !binary | - 16rXmdeQ15XXqCDXlNek16LXldec15XXqiDXlNeR15DXldeqOg== - - applescript_success_after_id: !binary | - 16DXldem16g= - - opensearch_description: !binary | - 15fXmdek15XXqSDXkdee16HXnNeV15zXmded - + applescript_success_before_id: "פעולת המשך עם זיהוי" + gmail_description: "חֲפִיץ להוספת מסלולים ל-Gmail" + applescript_next_action_prompt: "תיאור הפעולות הבאות:" + applescript_success_after_id: "נוצר" + opensearch_description: "חיפוש במסלולים" projects: - edit_project_settings: !binary | - 16LXqNeZ15vXqiDXlNeS15PXqNeV16og16TXqNeV15nXmden15g= - - deferred_actions_empty: !binary | - 15DXmdefINek16LXldec15XXqiDXqdeg15PXl9eVINei15HXldeoINek16jX - ldeZ15nXp9eYINeW15Q= - - hide_form_title: !binary | - 15TXodeq16jXqiDXmNeV16TXoSDXpNeo15XXmdeZ16fXmCDXl9eT16k= - - completed_projects: !binary | - 16TXqNeV15nXmden15jXmdedINep15TXodeq15nXmdee15U= - - no_default_context: !binary | - 15DXmdefINeU16fXqdeoINeR16jXmdeo16og157Xl9eT15wg15zXpNeo15XX - mdeZ16fXmCDXlteU - - settings: !binary | - 15TXkteT16jXldeq - - add_note_submit: !binary | - 15TXldeh16TXqiDXpNeq16c= - - no_last_completed_projects: !binary | - 15zXkCDXoNee16bXkNeVINek16jXldeZ15nXp9eY15nXnSDXqdeU16HXqteZ - 15nXnteV - - notes_empty: !binary | - 15DXmdefINek16rXp9eZ15XXqiDXnNek16jXldeZ15nXp9eYINeW15Q= - - with_default_context: !binary | - 16LXnSDXlNen16nXqCDXkdeZ16jXqiDXnteX15PXnCAnJXtjb250ZXh0X25h - bWV9Jw== - - show_form: !binary | - 15TXldeh16TXqiDXpNeo15XXmdeZ16fXmA== - - with_default_tags: !binary | - 16LXnSDXlNeq15LXmdeV16ogICcle3RhZ3N9JyDXm9eR16jXmdeo16og15TX - nteX15PXnA== - - completed_tasks_title: !binary | - 157Xodec15XXnNeZ1506OteU16bXkteqINeo16nXmdee16og15TXntep15nX - nteV16og16nXlNeV16nXnNee15Ug15HXpNeo15XXmdeZ16fXmCAgJyV7cHJv - amVjdF9uYW1lfSc= - - edit_project_title: !binary | - 16LXqNeZ15vXqiDXpNeo15XXmdeZ16fXmA== - - to_new_project_page: !binary | - 16LXkdeV16gg15zXotee15XXkyDXlNek16jXldeZ15nXp9eYINeU15fXk9ep - - project_saved_status: !binary | - 16TXqNeV15nXmden15gg16DXqdee16g= - - default_context_removed: !binary | - 15TXp9ep16gg15HXqNeZ16jXqiDXlNee15fXk9ecINeU15XXodeo - - default_context_set: !binary | - 15HXl9eZ16jXqiDXlNen16nXqCDXkdeo15nXqNeqINeU157Xl9eT15wg15zX - pNeo15XXmdeZ16fXmCDXnC0le2RlZmF1bHRfY29udGV4dH0= - - with_no_default_tags: !binary | - 15XXnNec15Ag16rXkteZ15XXqiDXkdeo15nXqNeqINee15fXk9ec - - was_marked_hidden: !binary | - 16HXldee158g15vXnteV16HXqteo - - no_projects: !binary | - 15DXmdefINeb16jXkteiINek16jXldeZ15nXp9eY15nXnQ== - - delete_project: !binary | - 157Xl9eZ16fXqiDXpNeo15XXmdeZ16fXmA== - - delete_project_title: !binary | - 157Xl9eZ16fXqiDXlNek16jXldeZ15nXp9eY - - active_projects: !binary | - 16TXqNeV15nXmden15jXmdedINek16LXmdec15nXnQ== - - list_completed_projects: !binary | - 157Xodec15XXnNeZ1506Oteo16nXmdee16og15TXpNeo15XXmdeZ16fXmNeZ - 150g16nXlNeV15zXqdee15U= - - no_last_completed_recurring_todos: !binary | - 15zXkCDXoNee16bXkNeVINee16nXmdee15XXqiDXnteX15bXldeo15nXldeq - INep15TXodeq15nXmdee15U= - - state: !binary | - 15TXpNeo15XXmdeZ16fXmCDXkdee16bXkSAle3N0YXRlfQ== - - completed_actions_empty: !binary | - 15DXmdefINek16LXldec15XXqiDXqdeU16HXqteZ15nXnteVINeR16TXqNeV - 15nXmden15gg15bXlA== - - add_project: !binary | - 15TXldeh16TXqiDXpNeo15XXmdeZ16fXmA== - - was_marked_complete: !binary | - 16HXldee158g15vXkdeV16bXog== - - no_actions_in_project: !binary | - 15DXmdefINeb16jXkteiINee16nXmdee15XXqiDXqdecINeU15XXqdec157X - lSDXkdek16jXldeZ15nXp9eYINeW15Q= - - page_title: !binary | - 157Xodec15XXnNeZ1506Otek16jXldeZ15nXp9eYOiAle3Byb2plY3R9 - - delete_project_confirmation: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNek16jXldeZ15nXp9eYICAnJXtu - YW1lfSc/ - - actions_in_project_title: !binary | - 16TXoteV15zXldeqINeR16TXqNeV15nXmden15gg15bXlA== - - add_note: !binary | - 15TXldeh16TXqiDXpNeq16c= - - list_projects: !binary | - 157Xodec15XXnNeZ1506Oteo16nXmdee16og16TXqNeV15nXmden15jXmded - - todos_append: !binary | - 15HXpNeo15XXmdeZ16fXmCDXlteU - - default_tags_removed_notice: !binary | - 16rXkteZ15XXqiDXkdeo15nXqNeqINeU157Xl9eT15wg15TXldeh16jXlQ== - - no_notes_attached: !binary | - 15DXmdefINeb16jXkteiINek16rXp9eZ15XXqiDXlNee16fXldep16jXldeq - INec16TXqNeV15nXmden15gg15bXlA== - - project_state: !binary | - 15TXpNeo15XXmdeZ16fXmCAle3N0YXRlfQ== - - hidden_projects: !binary | - 16TXqNeV15nXmden15jXmdedINep15TXldeh16rXqNeV - - deferred_actions: !binary | - 16TXoteV15zXldeqINep16DXk9eX15Ug16LXkdeV16gg16TXqNeV15nXmden - 15gg15bXlA== - - default_context: !binary | - 15TXp9ep16gg15HXqNeZ16jXqiDXlNee15fXk9epINec16TXqNeV15nXmden - 15gg15bXlCAle2NvbnRleHR9 - - set_default_tags_notice: !binary | - 15HXl9eZ16jXqiDXqteS15nXldeqINeR16jXmdeo16og15TXnteX15PXnCDX - nC0le2RlZmF1bHRfdGFnc30= - - completed_actions: !binary | - 16TXoteV15zXldeqINep15TXodeq15nXmdee15Ug15HXpNeo15XXmdeZ16fX - mCDXlteU - - status_project_name_changed: !binary | - 16nXnSDXlNek16jXldeZ15nXp9eYINep15XXoNeU - - with_no_default_context: !binary | - 15zXnNeQINeU16fXqdeoINeR16jXmdeo16og157Xl9eT15w= - - all_completed_tasks_title: !binary | - 157Xodec15XXnNeZ1506OteU16bXkteqINeo16nXmdee16og15vXnCDXlNee - 16nXmdee15XXqiDXqdeU15XXqdec157XlSDXkdek16jXldeZ15nXp9eYICAn - JXtwcm9qZWN0X25hbWV9Jw== - - is_active: !binary | - 16TXoteZ15w= - - hide_form: !binary | - 15TXodeq16jXqiDXmNeV16TXoQ== - - show_form_title: !binary | - 15nXpteZ16jXqiDXpNeo15XXmdeZ16fXmCDXl9eT16k= - - notes: !binary | - 16TXqten15nXldeq - - this_project: !binary | - 16TXqNeV15nXmden15gg15bXlA== - - list_reviews: !binary | - 157Xodec15XXnNeZ1506Oteh16fXmdeo15Q= - + edit_project_settings: "עריכת הגדרות פרוייקט" + deferred_actions_empty: "אין פעולות שנדחו עבור פרוייקט זה" + hide_form_title: "הסתרת טופס פרוייקט חדש" + completed_projects: "פרוייקטים שהסתיימו" + no_default_context: "אין הקשר ברירת מחדל לפרוייקט זה" + settings: "הגדרות" + add_note_submit: "הוספת פתק" + no_last_completed_projects: "לא נמצאו פרוייקטים שהסתיימו" + notes_empty: "אין פתקיות לפרוייקט זה" + with_default_context: "עם הקשר בירת מחדל '%{context_name}'" + show_form: "הוספת פרוייקט" + with_default_tags: "עם התגיות '%{tags}' כברירת המחדל" + completed_tasks_title: "מסלולים::הצגת רשימת המשימות שהושלמו בפרוייקט '%{project_name}'" + edit_project_title: "עריכת פרוייקט" + to_new_project_page: "עבור לעמוד הפרוייקט החדש" + project_saved_status: "פרוייקט נשמר" + default_context_removed: "הקשר ברירת המחדל הוסר" + default_context_set: "בחירת הקשר ברירת המחדל לפרוייקט ל-%{default_context}" + with_no_default_tags: "וללא תגיות ברירת מחדל" + was_marked_hidden: "סומן כמוסתר" + no_projects: "אין כרגע פרוייקטים" + delete_project: "מחיקת פרוייקט" + delete_project_title: "מחיקת הפרוייקט" + active_projects: "פרוייקטים פעילים" + list_completed_projects: "מסלולים::רשימת הפרוייקטים שהולשמו" + no_last_completed_recurring_todos: "לא נמצאו משימות מחזוריות שהסתיימו" + state: "הפרוייקט במצב %{state}" + completed_actions_empty: "אין פעולות שהסתיימו בפרוייקט זה" + add_project: "הוספת פרוייקט" + was_marked_complete: "סומן כבוצע" + no_actions_in_project: "אין כרגע משימות של הושלמו בפרוייקט זה" + page_title: "מסלולים::פרוייקט: %{project}" + delete_project_confirmation: "האם למחוק את הפרוייקט '%{name}'?" + actions_in_project_title: "פעולות בפרוייקט זה" + add_note: "הוספת פתק" + list_projects: "מסלולים::רשימת פרוייקטים" + todos_append: "בפרוייקט זה" + default_tags_removed_notice: "תגיות ברירת המחדל הוסרו" + no_notes_attached: "אין כרגע פתקיות המקושרות לפרוייקט זה" + project_state: "הפרוייקט %{state}" + hidden_projects: "פרוייקטים שהוסתרו" + deferred_actions: "פעולות שנדחו עבור פרוייקט זה" + default_context: "הקשר ברירת המחדש לפרוייקט זה %{context}" + set_default_tags_notice: "בחירת תגיות ברירת המחדל ל-%{default_tags}" + completed_actions: "פעולות שהסתיימו בפרוייקט זה" + status_project_name_changed: "שם הפרוייקט שונה" + with_no_default_context: "ללא הקשר ברירת מחדל" + all_completed_tasks_title: "מסלולים::הצגת רשימת כל המשימות שהושלמו בפרוייקט '%{project_name}'" + is_active: "פעיל" + hide_form: "הסתרת טופס" + show_form_title: "יצירת פרוייקט חדש" + notes: "פתקיות" + this_project: "פרוייקט זה" + list_reviews: "מסלולים::סקירה" errors: - user_unauthorized: !binary | - NDAxINec15Ag157XkNeV16nXqDog16jXpyDXntep16rXntep15nXnSDXkdeT - 16jXkteqINee16DXlNecINeo16nXkNeZ150g15zXlNek16LXmdecINek16LX - ldec15Qg15bXlQ== - + user_unauthorized: "401 לא מאושר: רק משתמשים בדרגת מנהל רשאים להפעיל פעולה זו" support: array: words_connector: "," - last_word_connector: !binary | - LCDXlS0= - - two_words_connector: !binary | - 15Ut - + last_word_connector: ", ו-" + two_words_connector: "ו-" select: - prompt: !binary | - 15nXqSDXnNeR16bXoiDXkdeX15nXqNeU - + prompt: "יש לבצע בחירה" login: - log_in_again: !binary | - 15vXoNeZ16HXlCDXnteX15XXk9ep16o= - - cas_login: !binary | - 15TXqteX15HXqNeV16og16nXkCLXniAo16nXmdeo15XXqiDXkNeZ157Xldeq - INee16jXm9eW15kp - - mobile_use_openid: !binary | - Li4u15DXlSDXm9eg15nXodeUINei150gT3BlbklE - - cas_signup_link: !binary | - 15HXp9ep16og157Xqdeq157XqQ== - - login_standard: !binary | - 15fXlteo15Qg15zXm9eg15nXodeUINeU16jXkteZ15zXlA== - - session_time_out: !binary | - 16TXkiDXqteV16fXoyDXlNeS15nXqdeULiDXoNeQICV7bGlua30= - - login_cas: !binary | - 15TXktei15Qg15DXnCDXqdeQItee - - sign_in: !binary | - 15vXoNeZ16HXlA== - - session_will_not_expire: !binary | - 15TXkteZ16nXlCDXnNec15Ag16rXpNeV15LXlC4= - - login_with_openid: !binary | - 15vXoNeZ16HXlCDXotecIE9wZW5JRA== - - cas_username_not_found: !binary | - 15zXptei16jXoNeVLCDXnNeQINen15nXmdedINee16nXqtee16kg16nXkCLX - niDXkdep150gKCV7dXNlcm5hbWV9KQ== - - cas_create_account: !binary | - 15DXnSDXkdeo16bXldeg15og15zXkden16kg15nXqSDXnNeU157XqdeZ15og - 15wtJXtzaWdudXBfbGlua30= - - logged_out: !binary | - 15HXldem16LXlCDXmdem15nXkNeUINeeLdee16HXnNeV15zXmded - - please_login: !binary | - 15nXqSDXnNeU15vXoNehINeb15PXmSDXnNeU16nXqtee16kg15Et157Xodec - 15XXnNeZ150= - - account_login: !binary | - 15vXoNeZ16HXlCDXnNeX16nXkdeV158= - - session_will_expire: !binary | - 16rXlden16Mg15TXkteZ16nXlCDXmdek15XXkiDXnNeQ15fXqCAle2hvdXJz - fSDXqdei15Qo15XXqikg16nXnCDXl9eV16HXqCDXpNei15nXnNeV16ou - - unsuccessful: !binary | - 15vXoNeZ16HXlCDXoNeb16nXnNeULg== - - openid_identity_url_not_found: !binary | - 15zXptei16jXoNeVLCDXnNeQINen15nXmdedINee16nXqtee16kg16LXnSDX - m9eq15XXkdeqINeW15TXldeqICAoJXtpZGVudGl0eV91cmx9KQ== - - successful: !binary | - 15vXoNeZ16HXlCDXkdeV16bXoteUINeR15TXptec15fXlC4g15HXqNeV15og - 16nXldeR15oh - - cas_no_user_found: !binary | - JXt1c2VybmFtZX0g16nXnNeV150hINeQ15nXnyDXl9ep15HXldefINeR16nX - nSDXlteUINeR157Xodec15XXnNeZ150u - - successful_with_session_info: !binary | - 15vXoNeZ16HXlCDXnteV16bXnNeX16o6 - - cas_logged_in_greeting: !binary | - 16nXnNeV150gJXt1c2VybmFtZX0hINeU15bXmdeU15XXmSDXlNem15zXmdeX - - option_separator: !binary | - 15DXlSw= - - user_no_expiry: !binary | - 15TXqdeQ16jXqiDXl9eZ15HXldeo - + log_in_again: "כניסה מחודשת" + cas_login: "התחברות שא\"מ (שירות אימות מרכזי)" + mobile_use_openid: "...או כניסה עם OpenID" + cas_signup_link: "בקשת משתמש" + login_standard: "חזרה לכניסה הרגילה" + session_time_out: "פג תוקף הגישה. נא %{link}" + login_cas: "הגעה אל שא\"מ" + sign_in: "כניסה" + session_will_not_expire: "הגישה ללא תפוגה." + login_with_openid: "כניסה על OpenID" + cas_username_not_found: "לצערנו, לא קיים משתמש שא\"מ בשם (%{username})" + cas_create_account: "אם ברצונך לבקש יש להמשיך ל-%{signup_link}" + logged_out: "בוצעה יציאה מ-מסלולים" + please_login: "יש להכנס כדי להשתמש ב-מסלולים" + account_login: "כניסה לחשבון" + session_will_expire: "תוקף הגישה יפוג לאחר %{hours} שעה(ות) של חוסר פעילות." + unsuccessful: "כניסה נכשלה." + openid_identity_url_not_found: "לצערנו, לא קיים משתמש עם כתובת זהות (%{identity_url})" + successful: "כניסה בוצעה בהצלחה. ברוך שובך!" + cas_no_user_found: "%{username} שלום! אין חשבון בשם זה במסלולים." + successful_with_session_info: "כניסה מוצלחת:" + cas_logged_in_greeting: "שלום %{username}! הזיהוי הצליח" + option_separator: "או," + user_no_expiry: "השארת חיבור" sidebar: - list_name_active_contexts: !binary | - 15TXp9ep16jXmdedINek16LXmdec15nXnQ== - - list_name_completed_projects: !binary | - 16TXqNeV15nXmden15jXmdedINep15TXodeq15nXmdee15U= - - list_name_hidden_projects: !binary | - 16TXqNeV15nXmden15jXmdedINee15XXodeq16jXmded - - list_name_hidden_contexts: !binary | - 15TXp9ep16jXmdedINee15XXodeq16jXmded - - list_name_active_projects: !binary | - 16TXqNeV15nXmden15jXmdedINek16LXmdec15nXnQ== - - list_empty: !binary | - 15DXmdef - + list_name_active_contexts: "הקשרים פעילים" + list_name_completed_projects: "פרוייקטים שהסתיימו" + list_name_hidden_projects: "פרוייקטים מוסתרים" + list_name_hidden_contexts: "הקשרים מוסתרים" + list_name_active_projects: "פרוייקטים פעילים" + list_empty: "אין" datetime: distance_in_words: about_x_years: - other: !binary | - 15stJXtjb3VudH0g16nXoNeZ150= - - one: !binary | - 15vXqdeg15Q= - + other: "כ-%{count} שנים" + one: "כשנה" less_than_x_seconds: - other: !binary | - 16TXl9eV16og154tJXtjb3VudH0g16nXoNeZ15XXqg== - - zero: !binary | - 16TXl9eV16og157Xqdeg15nXmdeU - - one: !binary | - 16TXl9eV16og157Xqdeg15nXmdeU - + other: "פחות מ-%{count} שניות" + zero: "פחות משנייה" + one: "פחות משנייה" less_than_x_minutes: - other: !binary | - 16TXl9eV16og154tJXtjb3VudH0g15PXp9eV16o= - - zero: !binary | - 16TXl9eV16og157Xk9en15Q= - - one: !binary | - 16TXl9eV16og157Xk9en15Q= - + other: "פחות מ-%{count} דקות" + zero: "פחות מדקה" + one: "פחות מדקה" x_minutes: - other: !binary | - JXtjb3VudH0g15PXp9eV16o= - - one: !binary | - 15PXp9eU - + other: "%{count} דקות" + one: "דקה" almost_x_years: - other: !binary | - 15vXntei15ggJXtjb3VudH0g16nXoNeZ150= - - one: !binary | - 15vXntei15gg16nXoNeU - + other: "כמעט %{count} שנים" + one: "כמעט שנה" about_x_months: - other: !binary | - 15stJXtjb3VudH0g15fXldeT16nXmded - - one: !binary | - 15vXl9eV15PXqQ== - + other: "כ-%{count} חודשים" + one: "כחודש" x_seconds: - other: !binary | - JXtjb3VudH0g16nXoNeZ15XXqg== - - one: !binary | - 16nXoNeZ15nXlA== - + other: "%{count} שניות" + one: "שנייה" over_x_years: - other: !binary | - 157XotecICV7Y291bnR9INep16DXmded - - one: !binary | - 157Xotec15Qg15zXqdeg15Q= - + other: "מעל %{count} שנים" + one: "מעלה לשנה" about_x_hours: - other: !binary | - 15stJXtjb3VudH0g16nXoteV16o= - - one: !binary | - 15vXqdei15Q= - + other: "כ-%{count} שעות" + one: "כשעה" x_months: - other: !binary | - JXtjb3VudH0g15fXldeT16nXmded - - one: !binary | - 15fXldeT16k= - + other: "%{count} חודשים" + one: "חודש" x_days: - other: !binary | - JXtjb3VudH0g15nXnteZ150= - - one: !binary | - 15nXlded - - half_a_minute: !binary | - 15fXpteZINeT16fXlA== - + other: "%{count} ימים" + one: "יום" + half_a_minute: "חצי דקה" prompts: - hour: !binary | - 16nXoteU - - second: !binary | - 16nXoNeZ15XXqg== - - day: !binary | - 15nXlded - - minute: !binary | - 15PXp9eU - - month: !binary | - 15fXldeT16k= - - year: !binary | - 16nXoNeU - + hour: "שעה" + second: "שניות" + day: "יום" + minute: "דקה" + month: "חודש" + year: "שנה" activerecord: errors: template: - body: !binary | - 15HXoteZ15XXqiDXkdep15PXldeqINeU15HXkNeZ1506 - + body: "בעיות בשדות הבאים:" header: - other: !binary | - 16nXkteZ15DXldeqINee16DXoteVINee157XldeT15wgJXttb2RlbH0g15zX - lNeZ16nXnteo - - one: !binary | - 16nXkteZ15DXlCDXnteg16LXlCDXntee15XXk9ecICV7bW9kZWx9INec15TX - mdep157XqA== - + other: "שגיאות מנעו ממודל %{model} להישמר" + one: "שגיאה מנעה ממודל %{model} להישמר" messages: - greater_than: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXkteT15XXnCDXniAle2NvdW50fQ== - - confirmation: !binary | - 15DXmdeg15Ug16rXldeQ150g15DXqiDXlNeQ15nXqdeV16g= - - too_short: !binary | - 16fXpteoINem15PXmSAo15zXm9ecINeU16TXl9eV16ogJXtjb3VudH0g16rX - ldeV15nXnSg= - - equal_to: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXnCAle2NvdW50fQ== - - too_long: !binary | - 15DXqNeV15og157Xk9eZICjXnNeb15wg15TXmdeV16rXqCAle2NvdW50fSDX - qteV15XXmdedKA== - - exclusion: !binary | - 16nXnteV16g= - - less_than: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXp9eY158g154gJHtjb3VudH0= - - inclusion: !binary | - 15zXkCDXnteV15vXnCDXkdeo16nXmdee15Q= - - accepted: !binary | - 15fXmdeZ15Eg15zXlNeq16fXkdec - - blank: !binary | - 15zXkCDXmdeb15XXnCDXnNeU15nXldeqINeo15nXpw== - - odd: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXkNeZINeW15XXkteZ - - invalid: !binary | - 15zXkCDXmdeb15XXnCDXnNeU15vXmdecINeQ16og16rXlSAoJywnKSDXlNek - 16HXmden - - wrong_length: !binary | - 15HXkNeV16jXmiDXnNeQINeg15vXldefICjXpteo15nXmiDXnNeU15nXldeq - ICV7Y291bnR9INeq15XXldeZ150o - - less_than_or_equal_to: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXp9eY158g15DXlSDXqdeV15XXlCDXnCAl - e2NvdW50fQ== - - not_a_number: !binary | - 15DXmdeg15Ug157Xodek16g= - - record_invalid: !binary | - 15DXmdee15XXqiDXoNeb16nXnCAle2Vycm9yc30= - - taken: !binary | - 15vXkdeoINeg157XpteQINeR16nXmdee15XXqQ== - - even: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXlteV15LXmQ== - - greater_than_or_equal_to: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXkteV15PXnCDXkNeVINep15XXldeUINec - ICV7Y291bnR9 - - empty: !binary | - 15zXkCDXmdeb15XXnCDXnNeU15nXldeqINeo15nXpw== - + greater_than: "חייב להיות גדול מ %{count}" + confirmation: "אינו תואם את האישור" + too_short: "קצר צדי (לכל הפחות %{count} תווים(" + equal_to: "חייב להיות שווה ל %{count}" + too_long: "ארוך מדי (לכל היותר %{count} תווים(" + exclusion: "שמור" + less_than: "חייב להיות קטן מ ${count}" + inclusion: "לא מוכל ברשימה" + accepted: "חייב להתקבל" + blank: "לא יכול להיות ריק" + odd: "חייב להיות אי זוגי" + invalid: "לא יכול להכיל את תו (',') הפסיק" + wrong_length: "באורך לא נכון (צריך להיות %{count} תווים(" + less_than_or_equal_to: "חייב להיות קטן או שווה ל %{count}" + not_a_number: "אינו מספר" + record_invalid: "אימות נכשל %{errors}" + taken: "כבר נמצא בשימוש" + even: "חייב להיות זוגי" + greater_than_or_equal_to: "חייב להיות גודל או שווה ל %{count}" + empty: "לא יכול להיות ריק" models: project: attributes: name: - too_long: !binary | - 16LXnCDXqdedINeU16TXqNeV15nXmden15gg15zXlNeb15nXnCDXpNeX15XX - qiDXni0yNTYg16rXldeV15nXnQ== - - blank: !binary | - 15zXpNeo15XXmdeZ16fXmCDXl9eZ15nXkSDXnNeU15nXldeqINep150= - - taken: !binary | - 15vXkdeoINen15nXmded - + too_long: "על שם הפרוייקט להכיל פחות מ-256 תווים" + blank: "לפרוייקט חייב להיות שם" + taken: "כבר קיים" full_messages: format: "%{attribute} %{message}" attributes: todo: - description: !binary | - 16rXmdeQ15XXqA== - - show_from: !binary | - 15TXpteSINee - - predecessors: !binary | - 16rXnNeV15kg15E= - - tags: !binary | - 16rXkteZ15XXqg== - - project: !binary | - 16TXqNeV15nXmden15jXmded - - due: !binary | - 16rXkNeo15nXmiDXmdei15M= - - context: !binary | - 15TXp9ep16g= - - notes: !binary | - 16TXqten15nXldeq - + description: "תיאור" + show_from: "הצג מ" + predecessors: "תלוי ב" + tags: "תגיות" + project: "פרוייקטים" + due: "תאריך יעד" + context: "הקשר" + notes: "פתקיות" note: - created_at: !binary | - 16DXldem16gg15E= - - updated_at: !binary | - 16LXldeT15vXnyDXkQ== - + created_at: "נוצר ב" + updated_at: "עודכן ב" user: - first_name: !binary | - 16nXnSDXpNeo15jXmQ== - - last_name: !binary | - 16nXnSDXntep16TXl9eU - + first_name: "שם פרטי" + last_name: "שם משפחה" project: - name: !binary | - 16nXnQ== - - description: !binary | - 16rXmdeQ15XXqA== - - default_context_name: !binary | - 15TXp9ep16gg15HXqNeZ16jXqiDXnteX15PXnA== - - default_tags: !binary | - 16rXkteZ15XXqiDXkdeo15nXqNeqINee15fXk9ec - + name: "שם" + description: "תיאור" + default_context_name: "הקשר ברירת מחדל" + default_tags: "תגיות ברירת מחדל" preference: - review_period: !binary | - 16rXk9eZ16jXldeqINeo16LXoNeV158g16TXqNeV15nXmden15g= - - locale: !binary | - 16nXpNeU - - date_format: !binary | - 157Xkdeg15Qg16rXkNeo15nXmg== - - show_project_on_todo_done: !binary | - 16LXkdeV16gg15zXotee15XXkyDXlNek16jXldeZ15nXp9eYINeR16HXmdeV - 150g157XqdeZ157XlA== - - show_hidden_projects_in_sidebar: !binary | - 15TXpteSINek16jXldeZ15nXp9eY15nXnSDXnteV16HXqteo15nXnSDXkdem - 15M= - - show_completed_projects_in_sidebar: !binary | - 15TXpteSINek16jXldeZ15nXp9eY15nXnSDXqdeU16HXqteZ15nXnteVINeR - 16bXkw== - - verbose_action_descriptors: !binary | - 16rXmdeQ15XXqNeZINee16nXmdee15XXqiDXntek15XXqNeY15nXnQ== - - sms_context: !binary | - 15PXldeQItecINeR16jXmdeo16og157Xl9eT16gg16LXkdeV16gg15TXp9ep - 16g= - - first_name: !binary | - 16nXnSDXpNeo15jXmQ== - - sms_email: !binary | - 15PXldeQ16gg157XkNeq - - due_style: !binary | - 16HXkteg15XXnyDXqteQ16jXmdeaINeZ16LXkw== - - last_name: !binary | - 16nXnSDXntep16TXl9eU - - refresh: !binary | - 16rXk9eZ16jXldeqINeo16LXoNeV158gKNeR15PXp9eV16op - - title_date_format: !binary | - 157Xkdeg15Qg16rXkNeo15nXmiDXm9eV16rXqNeq - - show_number_completed: !binary | - 15TXpteSINee16HXpNenINek16LXldec15XXqiDXqdeR15XXptei15U= - - staleness_starts: !binary | - 15TXqteX15zXqiDXqtek15zXldeq - - week_starts: !binary | - 16nXkdeV16Ig157XqteX15nXnCDXkdeZ15XXnQ== - - show_hidden_contexts_in_sidebar: !binary | - 15TXpteSINeU16fXqdeo15nXnSDXnteV16HXqteo15nXnSDXkdem15M= - - mobile_todos_per_page: !binary | - 157Xodek16gg16TXoteV15zXldeqINec15PXoyAo16rXpteV15LXlCDXoNeZ - 15nXk9eqKQ== - - time_zone: !binary | - 15DXlteV16gg15bXntef - + review_period: "תדירות רענון פרוייקט" + locale: "שפה" + date_format: "מבנה תאריך" + show_project_on_todo_done: "עבור לעמוד הפרוייקט בסיום משימה" + show_hidden_projects_in_sidebar: "הצג פרוייקטים מוסתרים בצד" + show_completed_projects_in_sidebar: "הצג פרוייקטים שהסתיימו בצד" + verbose_action_descriptors: "תיאורי משימות מפורטים" + sms_context: "דוא\"ל ברירת מחדר עבור הקשר" + first_name: "שם פרטי" + sms_email: "דואר מאת" + due_style: "סגנון תאריך יעד" + last_name: "שם משפחה" + refresh: "תדירות רענון (בדקות)" + title_date_format: "מבנה תאריך כותרת" + show_number_completed: "הצג מספק פעולות שבוצעו" + staleness_starts: "התחלת תפלות" + week_starts: "שבוע מתחיל ביום" + show_hidden_contexts_in_sidebar: "הצג הקשרים מוסתרים בצד" + mobile_todos_per_page: "מספר פעולות לדף (תצוגה ניידת)" + time_zone: "אזור זמן" data: - import_successful: !binary | - 15nXkdeV15Ag15HXldem16Ig15HXlNem15zXl9eU - - import_errors: !binary | - 16nXkteZ15DXldeqINeR15nXkdeV15A= - + import_successful: "יבוא בוצע בהצלחה" + import_errors: "שגיאות ביבוא" date: formats: short: "%b %d " @@ -690,2035 +251,664 @@ he: default: "%Y-%m-%d " long: "%B %d, %Y " shared: - toggle_single_title: !binary | - 15TXldeh16TXqiDXpNei15XXnNeqINeU157XqdeaINeX15PXqdeU - - toggle_multi_title: !binary | - 15jXldek16Eg16nXmdeg15XXmSDXntem15Eg16TXoteV15zXlCDXkdeV15PX - k9eqIC8g16TXoteV15zXldeqINee16jXldeR15XXqg== - - toggle_multi: !binary | - 15TXldeh16TXqiDXpNei15XXnNeV16og15TXntep15og157XqNeV15HXldeq - - separate_tags_with_commas: !binary | - 157Xldek16jXkyDXkdek16HXmden15nXnQ== - - add_action: !binary | - 15TXldeh16TXqiDXpNei15XXnNeU - - tags_for_all_actions: !binary | - 16rXkteZ15XXqiDXnNeb15wg15TXpNei15XXnNeV16ogKNeZ16kg15zXlNek - 16jXmdeTINeR16TXodeZ16fXmdedKQ== - - multiple_next_actions: !binary | - 16TXoteV15zXldeqINeU157XqdeaINee16jXldeR15XXqiAo16TXoteV15zX - lCDXkNeX16og15HXqdeV16jXlCk= - - add_actions: !binary | - 15TXldeh16TXqiDXpNei15XXnNeU - - context_for_all_actions: !binary | - 15TXp9ep16gg15zXm9ecINeU16TXoteV15zXldeq - - hide_action_form_title: !binary | - 15TXodeq16jXqiDXmNeV16TXoSDXpNei15XXnNeV16og15fXk9ep15XXqg== - - make_actions_dependent: !binary | - 15nXpteZ16jXqiDXqtec15XXqiDXkdeZ158g16TXoteV15zXldeq - - toggle_single: !binary | - 15TXldeh16TXqiDXpNei15XXnNeqINeU157Xqdea - - project_for_all_actions: !binary | - 16TXqNeV15nXmden15gg15zXm9ecINeU16TXoteV15zXldeq - - hide_form: !binary | - 15TXodeq16jXqiDXmNeV16TXoQ== - - add_context: !binary | - 15TXldeh16TXqiDXlNen16nXqA== - + toggle_single_title: "הוספת פעולת המשך חדשה" + toggle_multi_title: "טופס שינוי מצב פעולה בודדת / פעולות מרובות" + toggle_multi: "הוספת פעולות המשך מרובות" + separate_tags_with_commas: "מופרד בפסיקים" + add_action: "הוספת פעולה" + tags_for_all_actions: "תגיות לכל הפעולות (יש להפריד בפסיקים)" + multiple_next_actions: "פעולות המשך מרובות (פעולה אחת בשורה)" + add_actions: "הוספת פעולה" + context_for_all_actions: "הקשר לכל הפעולות" + hide_action_form_title: "הסתרת טופס פעולות חדשות" + make_actions_dependent: "יצירת תלות בין פעולות" + toggle_single: "הוספת פעולת המשך" + project_for_all_actions: "פרוייקט לכל הפעולות" + hide_form: "הסתרת טופס" + add_context: "הוספת הקשר" time: - pm: !binary | - 15DXl9eUItem - + pm: "אחה\"צ" formats: short: "%d %b %H:%M " stats: "%a %d-%m" default: "%a, %d %b %Y %H:%M:%S %z " month_day: "%B %d " long: "%B %d, %Y " - am: !binary | - 15zXpNeg15Qi16Y= - + am: "לפנה\"צ" todos: - added_new_project: !binary | - 16DXldeh16Mg16TXqNeV15nXmden15gg15fXk9ep - - recurring_action_saved: !binary | - 16TXoteV15zXlCDXnteX15bXldeo15nXqiDXoNep157XqNeU - - completed_recurrence_completed: !binary | - 15DXmdefINek16LXldec16og15TXntep15og15zXpNei15XXnNeUINeU157X - l9eW15XXqNeZ16og16nXoNee15fXp9eULiDXlNek16LXldec15Qg15TXnteX - 15bXldeo15nXqiDXoNee15fXp9eULg== - - all_completed_tagged_page_title: !binary | - 157Xodec15XXnNeZ1506Oteb15wg15TXpNei15XXnNeV16og16nXlNeh16rX - mdeZ157XlSDXotedINeU16rXkteZ16ogJXt0YWdfbmFtZX0= - - depends_on_separate_with_commas: !binary | - 16rXnNeV15kg15EtICjXmdepINec15TXpNeo15nXkyDXkdek16HXmden15nX - nSg= - + added_new_project: "נוסף פרוייקט חדש" + recurring_action_saved: "פעולה מחזורית נשמרה" + completed_recurrence_completed: "אין פעולת המשך לפעולה המחזורית שנמחקה. הפעולה המחזורית נמחקה." + all_completed_tagged_page_title: "מסלולים::כל הפעולות שהסתיימו עם התגית %{tag_name}" + depends_on_separate_with_commas: "תלוי ב- (יש להפריד בפסיקים(" next_actions_description_additions: - due_date: !binary | - 16LXnSDXqteQ16jXmdeaINeZ16LXkyAle2R1ZV9kYXRlfSDXkNeVINee15XX - p9eT150g15nXldeq16gg - - completed: !binary | - 15EtJXtjb3VudH0g15TXmdee15nXnSDXlNeQ15fXqNeV16DXmded - - next_action_description: !binary | - 16rXmdeQ15XXqCDXpNei15XXnNeqINeU157Xqdea - - calendar_page_title: !binary | - 157Xodec15XXnNeZ1506Otec15XXlyDXqdeg15Q= - + due_date: "עם תאריך יעד %{due_date} או מוקדם יותר " + completed: "ב-%{count} הימים האחרונים" + next_action_description: "תיאור פעולת המשך" + calendar_page_title: "מסלולים::לוח שנה" calendar: - no_actions_due_after_this_month: !binary | - 15DXmdefINek16LXldec15XXqiDXnNeR15nXpteV16Ig15zXkNeX16gg15fX - ldeT16kg15bXlA== - - due_this_month: !binary | - 16rXkNeo15nXmiDXmdei15Mg15zXmdeq16jXqiDXl9eV15PXqSAle21vbnRo - fQ== - - no_actions_due_today: !binary | - 15DXmdefINek16LXldec15XXqiDXoNeV16HXpNeV16og15zXlNeZ15XXnQ== - - due_next_week: !binary | - 15zXqdeR15XXoiDXlNeR15A= - - due_next_month_and_later: !binary | - 16rXkNeo15nXmiDXmdei15MgJXttb250aH0g15DXlSDXnteQ15XXl9eoINeZ - 15XXqteo - - due_today: !binary | - 15zXlNeZ15XXnQ== - - due_this_week: !binary | - 15zXlNee16nXmiDXlNep15HXldei - - get_in_ical_format: !binary | - 16fXkdec16og15zXldeXINep16DXlCDXlteUINeR16TXldeo157XmCBpQ2Fs - - no_actions_due_next_week: !binary | - 15DXmdefINek16LXldec15XXqiDXnNeR15nXpteV16Ig15HXqdeR15XXoiDX - lNeR15A= - - no_actions_due_this_month: !binary | - 15DXmdefINek16LXldec15XXqiDXnNeR15nXpteV16Ig15HXmdeq16jXqiDX - lNeX15XXk9ep - - recurring_deleted_success: !binary | - 15TXpNei15XXnNeUINeU157Xl9eW15XXqNeZ16og16DXnteX16fXlCDXkdeU - 16bXnNeX15Q= - - added_new_context: !binary | - 16DXldeh16Mg15TXp9ep16gg15fXk9ep - - edit: !binary | - 16LXqNeZ15vXlA== - - show_today: !binary | - 15TXpteS16og15TXmdeV150= - - added_dependency: !binary | - 16DXldeh16TXlCAle2RlcGVuZGVuY3l9INeb16rXnNeV16o= - - show_from: !binary | - 15TXpteS15Qg154t - + no_actions_due_after_this_month: "אין פעולות לביצוע לאחר חודש זה" + due_this_month: "תאריך יעד ליתרת חודש %{month}" + no_actions_due_today: "אין פעולות נוספות להיום" + due_next_week: "לשבוע הבא" + due_next_month_and_later: "תאריך יעד %{month} או מאוחר יותר" + due_today: "להיום" + due_this_week: "להמשך השבוע" + get_in_ical_format: "קבלת לוח שנה זה בפורמט iCal" + no_actions_due_next_week: "אין פעולות לביצוע בשבוע הבא" + no_actions_due_this_month: "אין פעולות לביצוע ביתרת החודש" + recurring_deleted_success: "הפעולה המחזורית נמחקה בהצלחה" + added_new_context: "נוסף הקשר חדש" + edit: "עריכה" + show_today: "הצגת היום" + added_dependency: "נוספה %{dependency} כתלות" + show_from: "הצגה מ-" next_actions_due_date: - due_tomorrow: !binary | - 15zXnteX16g= - - due_in_x_days: !binary | - 15nXoteTINeR16LXldeTICV7ZGF5c30g15nXnteZ150= - - overdue_by_plural: !binary | - 15HXkNeZ15fXldeoINep15wgJXtkYXlzfSDXmdee15nXnQ== - - due_today: !binary | - 15zXlNeZ15XXnQ== - - overdue_by: !binary | - 15HXkNeZ15fXldeoINep15wgJXtkYXlzfSDXmdeV150= - - completed_rest_of_week: !binary | - 15TXodeq15nXmdee15Ug15HXmdeq16jXqiDXqdeR15XXoiDXlteU - - new_related_todo_created_short: !binary | - 15nXpteZ16jXqiDXntep15nXnteUINeX15PXqdeU - - delete_action: !binary | - 157Xl9eZ16fXqiDXpNei15XXnNeU - - task_list_title: !binary | - 157Xodec15XXnNeZ1506Oteo16nXmdee16og157XqdeZ157Xldeq - - blocked_by: !binary | - 16DXl9eh150g16LXnCDXmdeT15kgJXtwcmVkZWNlc3NvcnN9 - - error_deleting_recurring: !binary | - 15DXqNei15Qg16nXkteZ16LXlCDXkdee15fXmden16og15TXntep15nXnteU - INeU157Xl9eW15XXqNeZ16ogIFwnJXtkZXNjcmlwdGlvbn1cJw== - - feed_title_in_context: !binary | - 15HXlNen16nXqCAnJXtjb250ZXh0fSc= - - completed_actions_with: !binary | - 16TXoteV15zXldeqINep15TXodeq15nXmdee15Ug16LXnSDXlNeq15LXmdeq - ICV7dGFnX25hbWV9ICA= - - error_saving_recurring: !binary | - 15DXqNei15Qg16nXkteZ16LXlCDXkdep157Xmdeo16og15TXntep15nXnteU - INeU157Xl9eW15XXqNeZ16ogIFwnJXtkZXNjcmlwdGlvbn1cJw== - - delete: !binary | - 157Xl9eZ16fXlA== - - deferred_tasks_title: !binary | - 157Xodec15XXnNeZ1506Otee1rTXltaw15vWuNa816g= - - tagged_with: !binary | - 157XqteV15nXmdeSINeRLSAmbHNxdW87JXt0YWdfbmFtZX0mcnNxdW87 - - removed_predecessor: !binary | - 15TXldeh16jXlCV7c3VjY2Vzc29yfSAg15vXqtec15XXqiDXqdecICV7cHJl - ZGVjZXNzb3J9Lta+ - - no_recurring_todos: !binary | - 15DXmdefINeb16jXkteiINee16nXmdee15XXqiDXnteX15bXldeo15nXldeq - - added_new_next_action_plural: !binary | - 16DXldeh16TXlSDXpNei15XXnNeV16og15TXntep15og15fXk9ep15XXqg== - - in_pending_state: !binary | - 15HXntem15Eg15TXnteq16DXlA== - - clear_show_from_date: !binary | - 16DXp9eUINeU16bXkteUINee16rXkNeo15nXmg== - - scheduled_overdue: !binary | - 16rXldeW157XnyDXnNeq16bXldeS15Qg15zXpNeg15kgJXtkYXlzfSDXmdee - 15nXnQ== - - error_completing_todo: !binary | - 15DXqNei15Qg16nXkteZ16LXlCDXkdeh15nXldedIC8g15TXpNei15zXlCDX - qdecINee16nXmdee15QgJXtkZXNjcmlwdGlvbn0= - - no_hidden_actions: !binary | - 15zXkCDXoNee16bXkNeVINek16LXldec15XXqiDXnteV16HXqteo15XXqg== - - drag_action_title: !binary | - 15nXqSDXnNeS16jXldeoINeQ15wg16TXoteV15zXlCDXkNeX16jXqiDXm9eT - 15kg15zXmdem15XXqCDXqtec15XXqiDXkdeU - - depends_on: !binary | - 16rXnNeV15kg15E= - - new_related_todo_not_created_short: !binary | - 15zXkCDXoNeV16bXqNeUINee16nXmdee15Q= - - action_deleted_success: !binary | - 16TXoteV15zXqiDXlNee16nXmiDXoNee15fXp9eUINeR15TXptec15fXlA== - - feed_title_in_project: !binary | - 15HXpNeo15XXmdeZ16fXmCAnJXtwcm9qZWN0fSc= - + due_tomorrow: "למחר" + due_in_x_days: "יעד בעוד %{days} ימים" + overdue_by_plural: "באיחור של %{days} ימים" + due_today: "להיום" + overdue_by: "באיחור של %{days} יום" + completed_rest_of_week: "הסתיימו ביתרת שבוע זה" + new_related_todo_created_short: "יצירת משימה חדשה" + delete_action: "מחיקת פעולה" + task_list_title: "מסלולים::רשימת משימות" + blocked_by: "נחסם על ידי %{predecessors}" + error_deleting_recurring: "ארעה שגיעה במחיקת המשימה המחזורית \'%{description}\'" + feed_title_in_context: "בהקשר '%{context}'" + completed_actions_with: "פעולות שהסתיימו עם התגית %{tag_name} " + error_saving_recurring: "ארעה שגיעה בשמירת המשימה המחזורית \'%{description}\'" + delete: "מחיקה" + deferred_tasks_title: "מסלולים::מִזְכָּר" + tagged_with: "מתוייג ב- ‘%{tag_name}’" + removed_predecessor: "הוסרה%{successor} כתלות של %{predecessor}.־" + no_recurring_todos: "אין כרגע משימות מחזוריות" + added_new_next_action_plural: "נוספו פעולות המשך חדשות" + in_pending_state: "במצב המתנה" + clear_show_from_date: "נקה הצגה מתאריך" + scheduled_overdue: "תוזמן לתצוגה לפני %{days} ימים" + error_completing_todo: "ארעה שגיעה בסיום / הפעלה של משימה %{description}" + no_hidden_actions: "לא נמצאו פעולות מוסתרות" + drag_action_title: "יש לגרור אל פעולה אחרת כדי ליצור תלות בה" + depends_on: "תלוי ב" + new_related_todo_not_created_short: "לא נוצרה משימה" + action_deleted_success: "פעולת המשך נמחקה בהצלחה" + feed_title_in_project: "בפרוייקט '%{project}'" next_actions_title_additions: - completed: !binary | - 16TXoteV15zXldeqINep15TXodeq15nXnteV - - due_within_a_week: !binary | - 16rXldeaINep15HXldei - - due_today: !binary | - 15zXlNeZ15XXnQ== - - deferred_actions_with: !binary | - 16TXoteV15zXldeqINeT15fXldeZ15XXqiDXotecINeq15LXmdeqICcle3Rh - Z19uYW1lfSc= - - show_on_date: !binary | - 15TXpteSINeR16rXkNeo15nXmiAle2RhdGV9 - - recurring_todos: !binary | - 157XqdeZ157XldeqINee15fXlteV16jXmdeV16o= - - append_in_this_project: !binary | - 15HXpNeo15XXmdeZ16fXmCDXlteU - - next_action_needed: !binary | - 15nXqSDXnNeU15bXmdefINec16TXl9eV16og16TXoteV15zXqiDXlNee16nX - miDXkNeX16o= - + completed: "פעולות שהסתימו" + due_within_a_week: "תוך שבוע" + due_today: "להיום" + deferred_actions_with: "פעולות דחויות על תגית '%{tag_name}'" + show_on_date: "הצג בתאריך %{date}" + recurring_todos: "משימות מחזוריות" + append_in_this_project: "בפרוייקט זה" + next_action_needed: "יש להזין לפחות פעולת המשך אחת" tickler_items_due: - other: !binary | - JXtjb3VudH0g157XlNee1rTXltaw15vWuNa816jXmdedINeU15LXmdei15Ug - 15zXqteQ16jXmdeaINeU15nXoteTIC0g15nXqSDXnNeo16LXoNefINeU16LX - nteV15Mg15zXlNem15LXlC4= - - one: !binary | - 15DXl9eTINee15TXnta015bWsNeb1rjWvNeo15nXnSDXlNeS15nXoiDXnNeq - 15DXqNeZ15og15TXmdei15MgLSDXmdepINec16jXoteg158g15TXotee15XX - kyDXnNeU16bXkteULg== - - action_deleted_error: !binary | - 16DXm9ep15zXlCDXnteX15nXp9eqINeU16TXoteV15zXlA== - - completed_rest_of_month: !binary | - 15TXodeq15nXmdee15Ug15HXmdeq16jXqiDXlNeX15XXk9epINeU16DXldeb - 15fXmQ== - - recurring_pattern_removed: !binary | - 15TXk9ek15XXoSDXlNee15fXlteV16jXmSDXlNeV16HXqCDXni0le2NvdW50 - fQ== - - done: !binary | - 15TXodeq15nXmdedPw== - - overdue: !binary | - 15HXkNeZ15fXldeo - - add_another_dependency: !binary | - 15TXldeh16TXqiDXqtec15XXqiDXoNeV16HXpNeq - + other: "%{count} מהמִזְכָּרים הגיעו לתאריך היעד - יש לרענן העמוד להצגה." + one: "אחד מהמִזְכָּרים הגיע לתאריך היעד - יש לרענן העמוד להצגה." + action_deleted_error: "נכשלה מחיקת הפעולה" + completed_rest_of_month: "הסתיימו ביתרת החודש הנוכחי" + recurring_pattern_removed: "הדפוס המחזורי הוסר מ-%{count}" + done: "הסתיים?" + overdue: "באיחור" + add_another_dependency: "הוספת תלות נוספת" defer_x_days: - other: !binary | - 15PXl9eZ15Qg15EtJXtjb3VudH0g15nXnteZ150= - - one: !binary | - 15PXl9eZ15Qg15HXmdeV150= - - set_to_pending: !binary | - JXt0YXNrfSDXlNeV15LXk9eo15Qg15vXntee16rXmdeg15Q= - - completed_tasks_title: !binary | - 157Xodec15XXnNeZ1506Otee16nXmdee15XXqiDXqdeU15XXqdec157XlQ== - - completed_tagged_page_title: !binary | - 157Xodec15XXnNeZ1506Otee16nXmdee15XXqiDXqdeU16HXqteZ15nXnteV - INei150g16rXkteZ16ogJyV7dGFnX25hbWV9Jw== - - see_all_completed: !binary | - 16DXmdeq158g15zXqNeQ15XXqiDXm9ecINeb15wg15TXpNei15XXnNeV16og - 16nXlNeh16rXmdeZ157XlSDXm9eQ1586ICV7bGlua30= - - add_new_recurring: !binary | - 15TXldeh16TXqiDXpNei15XXnNeUINee15fXlteV16jXmdeqINeX15PXqdeU - - in_hidden_state: !binary | - 15HXntem15Eg157Xldeh16rXqA== - - list_incomplete_next_actions_with_limit: !binary | - 16jXmdep157XqiAle2NvdW50fSDXpNei15XXnNeV16og15TXlNee16nXmiDX - qdec15Ag15TXodeq15nXmdee15U= - - clear_due_date: !binary | - 157Xl9eZ16fXqiDXqteQ16jXmdeaINeZ16LXkw== - - deferred_pending_actions: !binary | - 16TXoteV15zXldeqINee157XqteZ16DXldeqL9eT15fXldeZ15XXqg== - - tagged_page_title: !binary | - 157Xodec15XXnNeZ1506Oteq15LXmdeV16og16LXnSAnJXt0YWdfbmFtZX0n - - action_saved: !binary | - 16TXoteV15zXlCDXoNep157XqNeU - - completed_last_day: !binary | - 15TXodeq15nXmdee15Ug15EtMjQg16nXoteV16og15TXkNeX16jXldeg15XX - qg== - - error_starring: !binary | - 15TXk9eS16nXqiDXlNee16nXmdee15QgIFwnJXtkZXNjcmlwdGlvbn1cJyDX - nNeQINem15zXl9eU - - defer_date_after_due_date: !binary | - 16rXkNeo15nXmiDXlNeT15fXmdeZ15Qg157XkNeV15fXqCDXnteq15DXqNeZ - 15og15TXmdei15MuINeZ16kg15zXoteo15XXmiDXkNeqINeq15DXqNeZ15og - 15TXmdei15Mg15HXlNeq15DXnSDXnNek16DXmSDXkden16nXqiDXlNeT15fX - mdeZ15Qu - - new_related_todo_created: !binary | - 157XqdeZ157XlCDXl9eT16nXlCDXlNeV16HXpNeUINec157XqdeZ157XlCDX - nteX15bXldeo15nXqiDXlteV - + other: "דחיה ב-%{count} ימים" + one: "דחיה ביום" + set_to_pending: "%{task} הוגדרה כממתינה" + completed_tasks_title: "מסלולים::משימות שהושלמו" + completed_tagged_page_title: "מסלולים::משימות שהסתיימו עם תגית '%{tag_name}'" + see_all_completed: "ניתן לראות כל כל הפעולות שהסתיימו כאן: %{link}" + add_new_recurring: "הוספת פעולה מחזורית חדשה" + in_hidden_state: "במצב מוסתר" + list_incomplete_next_actions_with_limit: "רישמת %{count} פעולות ההמשך שלא הסתיימו" + clear_due_date: "מחיקת תאריך יעד" + deferred_pending_actions: "פעולות ממתינות/דחויות" + tagged_page_title: "מסלולים::תגיות עם '%{tag_name}'" + action_saved: "פעולה נשמרה" + completed_last_day: "הסתיימו ב-24 שעות האחרונות" + error_starring: "הדגשת המשימה \'%{description}\' לא צלחה" + defer_date_after_due_date: "תאריך הדחייה מאוחר מתאריך היעד. יש לערוך את תאריך היעד בהתאם לפני בקשת הדחייה." + new_related_todo_created: "משימה חדשה הוספה למשימה מחזורית זו" completed_in_archive: - other: !binary | - 16fXmdeZ157XldeqICV7Y291bnR9INek16LXldec15XXqiDXqdeU16HXqteZ - 15nXnteVINeR15DXqNeb15nXldefLg== - - one: !binary | - 16fXmdeZ157XqiDXkdeQ16jXm9eZ15XXnyDXpNei15XXnNeUINep15TXodeq - 15nXmdee15Qu - - action_due_on: !binary | - KNek16LXldec15Qg16LXkyAgJXtkYXRlfSk= - - remove_dependency: !binary | - 15TXodeo16og16rXnNeV16ogKNec15Ag157XldeX16cg15DXqiDXlNek16LX - ldec15Qp - - star_action: !binary | - 15TXk9eS16nXqiDXpNei15XXnNeU - - completed_actions: !binary | - 16TXoteV15zXldeqINep15TXodeq15nXmdee15U= - - show_in_days: !binary | - 15TXpteSINeR16LXldeTICV7ZGF5c30g15nXnteZ150= - - tags: !binary | - 16rXkteZ15XXqiAo157Xldek16jXk9eV16og15HXpNeh15nXp9eZ150p - - recurrence_completed: !binary | - 15DXmdefINek16LXldec16og15TXntep15og15zXpNei15XXnNeUINeU157X - l9eW15XXqNeZ16og16nXodeV15nXnteULiDXlNee15fXlteV16jXmdeV16og - 15TXodeq15nXmdee15Qu - - edit_action_with_description: !binary | - 16LXqNeZ15vXqiDXlNek16LXldec15QgJyV7ZGVzY3JpcHRpb259Jw== - - deleted_success: !binary | - 15TXpNei15XXnNeUINeg157Xl9en15Qg15HXlNem15zXl9eU - - edit_action: !binary | - 16LXqNeZ15vXqiDXpNei15XXnNeU - - edit_recurring_todo: !binary | - 16LXqNeb15nXqiDXpNei15XXnNeV16og157Xl9eW15XXqNeZ15XXqg== - - no_actions_with: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXqdec15Ag15TXodeq15nX - mdee15XXqiDXotedINeU16rXkteZ16ogJyV7dGFnX25hbWV9Jw== - - was_due_on_date: !binary | - 15TXmdeUINee15nXldei15Mg16LXkyAle2RhdGV9 - - confirm_delete: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNek16LXmdec15XXqiAnJXtkZXNj - cmlwdGlvbn0nPw== - - no_actions_found_title: !binary | - 15zXkCDXoNee16bXkCDXpNei15XXnNeV16o= - - next_actions_title: !binary | - 157Xodec15XXnNeZ150gLSDXpNei15XXnNeV16og15TXntep15o= - - due: !binary | - 15nXoteT - - no_actions_due_this_week: !binary | - 15DXmdefINek16LXldec15XXqiDXlNee15nXldei15PXldeqINec15TXntep - 15og15TXqdeR15XXog== - - no_completed_recurring: !binary | - 15DXmdefINeb16jXkteiINee16nXmdee15XXqiDXnteX15bXldeo15nXldeq - INep15TXodeq15nXmdee15U= - - unresolved_dependency: !binary | - 15TXoteo15og16nXlNeV15vXoNehINeR16rXnNeV16og15zXkCDXqteQ150g - 15zXkNejINek16LXldec15Qg16fXmdeZ157Xqi4g15TXoteo15og15zXkCDX - mdep157XqCDXotedINeZ16rXqNeqINeU16TXoteV15zXlC4g15zXlNee16nX - mdeaPw== - - completed_recurring: !binary | - 15TXodeq15nXmdee15Ug157XqdeZ157XldeqINee15fXlteV16jXmdeV16o= - - no_project: !binary | - LS3XkNeZ158g16TXqNeV15nXmden15gtLQ== - - older_completed_items: !binary | - 157XqdeZ157XldeqINep15TXodeq15nXmdee15XXqiDXmdep16DXldeqINeZ - 15XXqteo - - archived_tasks_title: !binary | - 157Xodec15XXnNeZ1506INee16nXmdee15XXqiDXqdeU16HXqteZ15nXnteV - INeU15XXoteR16jXlSDXnNeQ16jXm9eZ15XXnw== - + other: "קיימות %{count} פעולות שהסתיימו בארכיון." + one: "קיימת בארכיון פעולה שהסתיימה." + action_due_on: "(פעולה עד %{date})" + remove_dependency: "הסרת תלות (לא מוחק את הפעולה)" + star_action: "הדגשת פעולה" + completed_actions: "פעולות שהסתיימו" + show_in_days: "הצג בעוד %{days} ימים" + tags: "תגיות (מופרדות בפסיקים)" + recurrence_completed: "אין פעולת המשך לפעולה המחזורית שסוימה. המחזוריות הסתיימה." + edit_action_with_description: "עריכת הפעולה '%{description}'" + deleted_success: "הפעולה נמחקה בהצלחה" + edit_action: "עריכת פעולה" + edit_recurring_todo: "ערכית פעולות מחזוריות" + no_actions_with: "אין כרגע פעולות שלא הסתיימות עם התגית '%{tag_name}'" + was_due_on_date: "היה מיועד עד %{date}" + confirm_delete: "האם למחוק את הפעילות '%{description}'?" + no_actions_found_title: "לא נמצא פעולות" + next_actions_title: "מסלולים - פעולות המשך" + due: "יעד" + no_actions_due_this_week: "אין פעולות המיועדות להמשך השבוע" + no_completed_recurring: "אין כרגע משימות מחזוריות שהסתיימו" + unresolved_dependency: "הערך שהוכנס בתלות לא תאם לאף פעולה קיימת. הערך לא ישמר עם יתרת הפעולה. להמשיך?" + completed_recurring: "הסתיימו משימות מחזוריות" + no_project: "--אין פרוייקט--" + older_completed_items: "משימות שהסתיימות ישנות יותר" + archived_tasks_title: "מסלולים: משימות שהסתיימו הועברו לארכיון" completed_today: - other: !binary | - 16LXkyDXoteq15Qg15TXodeq15nXmdee15UgJXtjb3VudH0g16TXoteV15zX - qiDXlNeZ15XXnS4= - - one: !binary | - 15TXldep15zXnteUINek16LXldec15Qg15DXl9eqINeU15nXldedLCDXoteT - INei16rXlC4= - - pending: !binary | - 157Xnteq15nXnw== - - context_changed: !binary | - 15TXp9ep16gg16nXldeg15Qg15wtJXtuYW1lfQ== - - error_removing_dependency: !binary | - 15TXqteo15fXqdeUINep15LXmdeQ15Qg15HXlNeh16jXqiDXlNeq15zXldeq - - show_tomorrow: !binary | - 15TXpteS16og157Xl9eo - - error_toggle_complete: !binary | - 15zXkCDXoNeZ16rXnyDXnNeh157XnyDXntep15nXnteUINebIteU16HXqteZ - 15nXnteUIg== - - recurring_action_deleted: !binary | - 16TXoteV15zXlCDXoNee15fXp9eULiDXnteQ15fXqCDXldeU16TXoteV15zX - lCDXnteX15bXldeo15nXqi4g16TXoteV15zXlCDXl9eT16nXlCDXoNeV16HX - pNeU - - completed_more_than_x_days_ago: !binary | - 15TXodeq15nXmdee15Ug15zXpNeg15kg15nXldeq16gg154tJXtjb3VudH0g - 15nXnteZ150= - - delete_recurring_action_confirm: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNek16LXmdec15XXqiDXlNee15fX - lteV16jXmdeqICcle2Rlc2NyaXB0aW9ufSc/ - - no_completed_actions_with: !binary | - 15DXmdefINek16LXldec15XXqiDXqdeU16HXqteZ15nXnteVINei15wg15TX - qteS15nXqiAnJXt0YWdfbmFtZX0n - + other: "עד עתה הסתיימו %{count} פעולת היום." + one: "הושלמה פעולה אחת היום, עד עתה." + pending: "ממתין" + context_changed: "הקשר שונה ל-%{name}" + error_removing_dependency: "התרחשה שגיאה בהסרת התלות" + show_tomorrow: "הצגת מחר" + error_toggle_complete: "לא ניתן לסמן משימה כ\"הסתיימה\"" + recurring_action_deleted: "פעולה נמחקה. מאחר והפעולה מחזורית. פעולה חדשה נוספה" + completed_more_than_x_days_ago: "הסתיימו לפני יותר מ-%{count} ימים" + delete_recurring_action_confirm: "האם למחוק את הפעילות המחזורית '%{description}'?" + no_completed_actions_with: "אין פעולות שהסתיימו על התגית '%{tag_name}'" feeds: - completed: !binary | - 15TXodeq15nXmdedOiAle2RhdGV9 - - due: !binary | - 15nXoteTICV7ZGF0ZX0= - - completed_rest_of_previous_month: !binary | - 15TXodeq15nXmdee15Ug15HXmdeq16jXqiDXlNeX15XXk9epINeU16fXldeT - 150= - - cannot_add_dependency_to_completed_todo: !binary | - 15DXmdefINeQ16TXqdeo15XXqiDXnNeU15XXodeZ16Mg16TXoteV15zXlCDX - lteVINeb16rXnNeV16og15zXpNei15XXnNeUINep15TXodeq15nXmdee15Qh - - completed: !binary | - 15TXodeq15nXmdee15U= - - list_incomplete_next_actions: !binary | - 16jXqdeZ157XqiDXpNei15XXnNeV16og15TXntep15og16nXnNeQINeU16HX - qteZ15nXnteV - + completed: "הסתיים: %{date}" + due: "יעד %{date}" + completed_rest_of_previous_month: "הסתיימו ביתרת החודש הקודם" + cannot_add_dependency_to_completed_todo: "אין אפשרות להוסיף פעולה זו כתלות לפעולה שהסתיימה!" + completed: "הסתיימו" + list_incomplete_next_actions: "רשימת פעולות המשך שלא הסתיימו" recurrence: - recurrence_on_options: !binary | - 15TXkteT16jXqiDXnteX15bXldeo15nXldeqINec16TXmQ== - - show_days_before: !binary | - JXtkYXlzfSDXmdee15nXnSDXnNek16DXmSDXqteQ16jXmdeaINeU15nXoteT - INec157XqdeZ157XlA== - - ends_on: !binary | - 157Xodeq15nXmdedINeR - - monthly: !binary | - 15fXldeT16nXmQ== - - every_work_day: !binary | - 15HXm9ecINeZ15XXnSDXoteR15XXk9eU - - weekly_options: !binary | - 15TXkteT16jXldeqINec16TXoteV15zXldeqINeR157Xl9eW15XXqNeZ15XX - qiDXqdeR15XXoteZ16o= - - daily_options: !binary | - 15TXkteT16jXldeqINec16TXoteV15zXldeqINee15fXlteV16jXmdeV16og - 15nXldee15nXldeq - - weekly_every_number_week: !binary | - 15fXldeW16gg15vXnCAle251bWJlcn0gINep15HXldeiINeR - - yearly_every_xth_day: !binary | - 15nXldedICV7ZGF5fSDXlCAtJXtkYXlfb2Zfd2Vla30gINeR15vXnCAle21v - bnRofSDXl9eV15PXqQ== - - weekly: !binary | - 16nXkdeV16LXmQ== - - daily_every_number_day: !binary | - 15vXnCAle251bWJlcn0gINeZ157Xmded - - ends_on_date: !binary | - 157Xodeq15nXmdedINeRLSV7ZGF0ZX0= - - ends_on_number_times: !binary | - 157Xodeq15nXmdedINec15DXl9eoICV7bnVtYmVyfSDXpNei157Xmded - - recurrence_on_due_date: !binary | - 15nXoteTINec157XqdeZ157XlA== - - monthly_options: !binary | - 15TXkteT16jXldeqINec16TXoteV15zXldeqINeR15fXlteV16jXmdeV16og - 15fXldeT16nXmdeq - - starts_on: !binary | - 157XqteX15nXnCDXkQ== - - show_option_always: !binary | - 16rXnteZ15M= - - monthly_every_xth_day: !binary | - 15nXldedICV7ZGF5fSDXlCAtJXtkYXlfb2Zfd2Vla30gINeR15vXnCAle21v - bnRofSDXl9eV15PXqQ== - - daily: !binary | - 15nXldee15k= - - no_end_date: !binary | - 15DXmdefINeq15DXqNeZ15og16HXmdeV150= - - show_options: !binary | - 15TXpteS16og157XqdeZ157Xldeq - - day_x_on_every_x_month: !binary | - 15HXmdeV150gJXtkYXl9INeR15vXnCAle21vbnRofSAg15fXldeT16k= - + recurrence_on_options: "הגדרת מחזוריות לפי" + show_days_before: "%{days} ימים לפני תאריך היעד למשימה" + ends_on: "מסתיים ב" + monthly: "חודשי" + every_work_day: "בכל יום עבודה" + weekly_options: "הגדרות לפעולות במחזוריות שבועית" + daily_options: "הגדרות לפעולות מחזוריות יומיות" + weekly_every_number_week: "חוזר כל %{number} שבוע ב" + yearly_every_xth_day: "יום %{day} ה -%{day_of_week} בכל %{month} חודש" + weekly: "שבועי" + daily_every_number_day: "כל %{number} ימים" + ends_on_date: "מסתיים ב-%{date}" + ends_on_number_times: "מסתיים לאחר %{number} פעמים" + recurrence_on_due_date: "יעד למשימה" + monthly_options: "הגדרות לפעולות בחזוריות חודשית" + starts_on: "מתחיל ב" + show_option_always: "תמיד" + monthly_every_xth_day: "יום %{day} ה -%{day_of_week} בכל %{month} חודש" + daily: "יומי" + no_end_date: "אין תאריך סיום" + show_options: "הצגת משימות" + day_x_on_every_x_month: "ביום %{day} בכל %{month} חודש" pattern: - on_day_n: !binary | - 15HXmdeV150gJXtufQ== - - on_work_days: !binary | - 15HXmdee15kg16LXkdeV15PXlA== - - times: !binary | - 15stJXtudW1iZXJ9INek16LXnteZ150= - - second: !binary | - 16nXoNeZ - - every_month: !binary | - 15vXnCDXl9eV15PXqQ== - - weekly: !binary | - 16nXkdeV16LXmQ== - - every_day: !binary | - 15vXnCDXmdeV150= - - third: !binary | - 16nXnNeZ16nXmQ== - - show: !binary | - 15TXpteS15Q= - - every_year_on: !binary | - 15HXm9ecINep16DXlCDXkdeq15DXqNeZ15ogJXtkYXRlfQ== - - last: !binary | - 15DXl9eo15XXnw== - - the_xth_day_of_month: !binary | - 15TXmdeV150g15QtICV7eH0gJXtkYXl9INeR15fXldeT16kgJXttb250aH0= - - fourth: !binary | - 16jXkdeZ16LXmQ== - - until: !binary | - 16LXkw== - - every_n: !binary | - 15vXnCAle259 - - first: !binary | - 16jXkNep15XXnw== - - every_xth_day_of_every_n_months: "\xD7\x9B\xD7\x9C %{x} %{day} \xD7\x91\xD7\x9B\xD7\x9C %{n_months}" - due: !binary | - 15nXoteT - - from: !binary | - 154= - - yearly: !binary | - 16nXoNeq15nXqg== - - yearly_every_x_day: "\xD7\x9B\xD7\x9C %{month} %{day}" - from_tickler: !binary | - 16rXkNeo15nXmiDXlNeZ16LXkyDXnNee16nXmdee15Qg157XkteZ16Ig157X - lNee1rTXltaw15vWuNa816ggKNec15Ag16DXp9eR16Ig16rXkNeo15nXmiDX - mdei15Mp - - yearly_options: !binary | - 15TXkteT16jXldeqINec16TXoteV15zXldeqINeR157Xl9eW15XXqNeZ15XX - qiDXqdeg16rXmdeV16o= - - no_deferred_pending_actions: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXk9eX15XXmdeV16og15DX - lSDXntee16rXmdeg15XXqg== - - action_marked_complete_error: !binary | - 15TXpNei15XXnNeUIDxzdHJvbmc+JyV7ZGVzY3JpcHRpb259Jzwvc3Ryb25n - Pta+15zXkNa+INeh15XXnteg15Qg15sgLSA8c3Ryb25nPiV7Y29tcGxldGVk - fSDXoten15Eg16nXkteZ15DXqiDXqdeo16o8L3N0cm9uZz4= - - recurrence_period: !binary | - 16rXp9eV16TXqiDXnteX15bXldeo15nXldeq - - no_last_completed_actions: !binary | - 15zXkCDXoNee16bXkNeVINek16LXldec15XXqiDXqdeU16HXqteZ15nXnteV - - hidden_actions: !binary | - 16TXoteV15zXldeqINee15XXodeq16jXldeq - - to_tickler: !binary | - 15zXnta015bWsNeb1rjWvNeo - - added_new_next_action_singular: !binary | - 16DXldeh16TXlCDXpNei15XXnNeqINeU157XqdeaINeX15PXqdeU - - star_action_with_description: !binary | - 15TXk9eS16nXqiDXpNei15nXnNeV16ogJyV7ZGVzY3JpcHRpb259Jw== - - no_completed_actions: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXqdeU16HXqteZ15nXnteV - Lg== - - no_incomplete_actions: !binary | - 15DXmdefINek16LXldec15XXqiDXqdec15Ag15TXodeq15nXmdee15U= - - older_than_days: !binary | - 15XXldeq16cg157XotecICV7Y291bnR9INeZ157Xmded - - error_deleting_item: !binary | - 15DXqNei15Qg16nXkteZ15DXlCDXkdee15fXmden16og15TXpNeo15nXmCAl - e2Rlc2NyaXB0aW9ufQ== - - action_saved_to_tickler: !binary | - 16TXoteV15zXlCDXoNep157XqNeUINec157WtNeW1rDXm9a41rzXqA== - - recurring_actions_title: !binary | - 157Xodec15XXnNeZ1506Otek16LXldec15XXqiDXnteX15bXldeo15nXldeq - - action_deferred: !binary | - 15TXpNei15XXnNeUICcle2Rlc2NyaXB0aW9ufScg16DXk9eX16rXlA== - - action_marked_complete: "\xD7\x94\xD7\xA4\xD7\xA2\xD7\x95\xD7\x9C\xD7\x94 '%{description}' \xD7\xA1\xD7\x95\xD7\x9E\xD7\xA0\xD7\x94 \xD7\x9B- %{completed}" - no_deferred_actions_with: !binary | - 15DXmdefINek16LXldec15XXqiDXk9eX15XXmdeV16og16LXnSDXlNeq15LX - mdeqICcle3RhZ19uYW1lfSc= - - error_starring_recurring: !binary | - INeU15PXktep16og15TXntep15nXnteUINeU157Xl9eW15XXqNeZ16ogIFwn - JXtkZXNjcmlwdGlvbn1cJyDXnNeQINem15zXl9eU - + on_day_n: "ביום %{n}" + on_work_days: "בימי עבודה" + times: "כ-%{number} פעמים" + second: "שני" + every_month: "כל חודש" + weekly: "שבועי" + every_day: "כל יום" + third: "שלישי" + show: "הצגה" + every_year_on: "בכל שנה בתאריך %{date}" + last: "אחרון" + the_xth_day_of_month: "היום ה- %{x} %{day} בחודש %{month}" + fourth: "רביעי" + until: "עד" + every_n: "כל %{n}" + first: "ראשון" + every_xth_day_of_every_n_months: "כל %{x} %{day} בכל %{n_months}" + due: "יעד" + from: "מ" + yearly: "שנתית" + yearly_every_x_day: "כל %{month} %{day}" + from_tickler: "תאריך היעד למשימה מגיע מהמִזְכָּר (לא נקבע תאריך יעד)" + yearly_options: "הגדרות לפעולות במחזוריות שנתיות" + no_deferred_pending_actions: "אין כרגע פעולות דחויות או ממתינות" + action_marked_complete_error: "הפעולה '%{description}'־לא־ סומנה כ - %{completed} עקב שגיאת שרת" + recurrence_period: "תקופת מחזוריות" + no_last_completed_actions: "לא נמצאו פעולות שהסתיימו" + hidden_actions: "פעולות מוסתרות" + to_tickler: "למִזְכָּר" + added_new_next_action_singular: "נוספה פעולת המשך חדשה" + star_action_with_description: "הדגשת פעילות '%{description}'" + no_completed_actions: "אין כרגע פעולות שהסתיימו." + no_incomplete_actions: "אין פעולות שלא הסתיימו" + older_than_days: "וותק מעל %{count} ימים" + error_deleting_item: "ארעה שגיאה במחיקת הפריט %{description}" + action_saved_to_tickler: "פעולה נשמרה למִזְכָּר" + recurring_actions_title: "מסלולים::פעולות מחזוריות" + action_deferred: "הפעולה '%{description}' נדחתה" + action_marked_complete: "הפעולה '%{description}' סומנה כ- %{completed}" + no_deferred_actions_with: "אין פעולות דחויות עם התגית '%{tag_name}'" + error_starring_recurring: " הדגשת המשימה המחזורית \'%{description}\' לא צלחה" has_x_pending: - other: !binary | - 157Xm9eZ15wgJXtjb3VudH0g16TXoteV15zXqiDXntee16rXmdeg15XXqg== - - one: !binary | - 15HXotecINek16LXldec15Qg15PXl9eV15nXlCDXkNeX16o= - - no_deferred_actions: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXqdeg15PXl9eVLg== - - completed_last_x_days: !binary | - 15TXodeq15nXmdee15Ug15EtJXtjb3VudH0g15TXmdee15nXnSDXlNeQ15fX - qNeV16DXmded - - mobile_todos_page_title: !binary | - 15vXnCDXlNek16LXldec15XXqg== - - convert_to_project: !binary | - 15nXpteZ16jXqiDXpNeo15XXmdeZ16fXmA== - - added_new_next_action: !binary | - 16DXldeh16TXlCDXpNei15XXnNeqINeU157XqdeaINeX15PXqdeU - - no_actions_found: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXqdec15Ag15TXodeq15nX - mdee15U= - - delete_recurring_action_title: !binary | - 157Xl9eZ16fXqiDXpNei15XXnNeUINee15fXlteV16jXmdeq - - all_completed_here: !binary | - 15vXkNef - - all_completed: !binary | - 15vXnCDXlNek16LXldec15XXqiDXqdeU16HXqteZ15nXnteV - - unable_to_add_dependency: !binary | - 15zXkCDXoNeZ16rXnyDXnNeU15XXodeZ16Mg16rXnNeV16o= - - next_actions_description: !binary | - 157Xodeg1586 - + other: "מכיל %{count} פעולת ממתינות" + one: "בעל פעולה דחויה אחת" + no_deferred_actions: "אין כרגע פעולות שנדחו." + completed_last_x_days: "הסתיימו ב-%{count} הימים האחרונים" + mobile_todos_page_title: "כל הפעולות" + convert_to_project: "יצירת פרוייקט" + added_new_next_action: "נוספה פעולת המשך חדשה" + no_actions_found: "אין כרגע פעולות שלא הסתיימו" + delete_recurring_action_title: "מחיקת פעולה מחזורית" + all_completed_here: "כאן" + all_completed: "כל הפעולות שהסתיימו" + unable_to_add_dependency: "לא ניתן להוסיף תלות" + next_actions_description: "מסנן:" stats: - actions_avg_completed_30days: !binary | - 15XXlNeh16rXmdeZ157XlSDXkdee157Xldem16IgJXtjb3VudH0g16TXoteV - 15zXldeqINec15nXlded - - projects: !binary | - 16TXqNeV15nXmden15jXmded - + actions_avg_completed_30days: "והסתיימו בממוצע %{count} פעולות ליום" + projects: "פרוייקטים" actions_dow_30days_legend: - number_of_actions: !binary | - 157Xodek16gg16TXoteV15zXldeq - - day_of_week: !binary | - 15nXldedINeR16nXkdeV16I= - - click_to_return: !binary | - 15TXp9ec16fXlCDXotecICV7bGlua30g16rXl9eW15nXqCDXnNei157XldeT - INeU16HXmNeY15nXodeY15nXp9eU - - top10_projects: !binary | - 16LXqdeo16og15TXpNeo15XXmdeZ16fXmNeZ150g15TXnteV15HXmdec15nX - nQ== - - other_actions_label: !binary | - KNeQ15fXqNeZ150p - - top5_contexts: !binary | - NSDXlNen16nXqNeZ150g157XldeR15nXnNeZ150= - - totals_context_count: !binary | - 16fXmdeZ157XmdedICV7Y291bnR9INeU16fXqdeo15nXnS4= - + number_of_actions: "מספר פעולות" + day_of_week: "יום בשבוע" + click_to_return: "הקלקה על %{link} תחזיר לעמוד הסטטיסטיקה" + top10_projects: "עשרת הפרוייקטים המובילים" + other_actions_label: "(אחרים)" + top5_contexts: "5 הקשרים מובילים" + totals_context_count: "קיימים %{count} הקשרים." running_time_legend: - percentage: !binary | - 15DXl9eV15Y= - - weeks: !binary | - 15bXntefINee16bXmNeR16gg15zXpNei15XXnNeV16ogKNep15HXldei15XX - qikuINeU16fXnNen15Qg16LXnCDXlNeR16gg15zXnteZ15PXoiDXoNeV16HX - ow== - - actions: !binary | - 16TXoteV15zXldeq - - actions_avg_created: !binary | - 15EtMTIg15TXl9eV15PXqdeZ150g15TXkNeX16jXldeg15nXnSDXmdeV16bX - qNeVINeR157Xldem16IgJXtjb3VudH0g16TXoteV15zXldeq - - actions_avg_completed: !binary | - 15XXlNeh16rXmdeZ157XlSDXkdee157Xldem16IgJXtjb3VudH0g16TXoteV - 15zXldeqINec15fXldeT16k= - - totals_incomplete_actions: !binary | - 16fXmdeZ157XldeqICV7Y291bnR9INek16LXldec15XXqiDXqdec15Ag15TX - odeq15nXmdee15U= - - top5_visible_contexts_with_incomplete_actions: !binary | - NSDXlNeU16fXqdeo15nXnSDXlNee15XXkdeZ15zXmdedINei150g16TXoteV - 15zXldeqINep15zXkCDXlNeh16rXmdeZ157XlQ== - - index_title: !binary | - 157Xodec15XXnNeZ1506Oteh15jXmNeZ16HXmNeZ16fXlA== - - tag_cloud_90days_title: !binary | - 16LXoNefINeq15LXmdeV16og15zXpNei15XXnNeV16og15EtOTAg15TXmdee - 15nXnSDXlNeQ15fXqNeV16DXmded - - action_completion_time_title: !binary | - 15bXntefINeh15nXldedICjXm9ecINeU16TXoteV15zXldeqINep15TXodeq - 15nXmdee15Up - + percentage: "אחוז" + weeks: "זמן מצטבר לפעולות (שבועות). הקלקה על הבר למידע נוסף" + actions: "פעולות" + actions_avg_created: "ב-12 החודשים האחרונים יוצרו במוצע %{count} פעולות" + actions_avg_completed: "והסתיימו בממוצע %{count} פעולות לחודש" + totals_incomplete_actions: "קיימות %{count} פעולות שלא הסתיימו" + top5_visible_contexts_with_incomplete_actions: "5 ההקשרים המובילים עם פעולות שלא הסתיימו" + index_title: "מסלולים::סטטיסטיקה" + tag_cloud_90days_title: "ענן תגיות לפעולות ב-90 הימים האחרונים" + action_completion_time_title: "זמן סיום (כל הפעולות שהסתיימו)" open_per_week_legend: - weeks: !binary | - 16nXkdeV16LXldeqINen15XXk9edINec15vXnw== - - actions: !binary | - 16TXoteV15zXldeq - - action_selection_title: !binary | - 157Xodec15XXnNeZ1506OteR15fXmdeo16og16TXoteV15zXlA== - - actions_day_of_week_title: !binary | - 15nXldedINeR16nXkdeV16IgKNeb15wg15TXpNei15XXnNeV16op - - spread_of_actions_for_all_context: !binary | - 16TXmdeW15XXqCDXpNei15XXnNeV16og15zXm9ecINeU15TXp9ep16jXmded - - totals_hidden_project_count: !binary | - JXtjb3VudH0g157Xldeh16rXqNeZ150= - - totals_deferred_actions: !binary | - 157XlNefICV7Y291bnR9INek16LXldec15XXqiDXk9eX15XXmdeV16og15HX - nta015bWsNeb1rjWvNeo - - click_to_show_actions_from_week: !binary | - 15TXp9ec16fXlCDXotecICV7bGlua30g16rXpteZ15Ig15DXqiDXlNek16LX - ldec15XXqiDXntep15HXldeiICV7d2Vla30g15XXkNeZ15zXmg== - - actions_dow_30days_title: !binary | - 15nXldedINeR16nXkdeV16IgKDMwINeU15nXnteZ150g15TXkNeX16jXldeg - 15nXnSg= - + weeks: "שבועות קודם לכן" + actions: "פעולות" + action_selection_title: "מסלולים::בחירת פעולה" + actions_day_of_week_title: "יום בשבוע (כל הפעולות)" + spread_of_actions_for_all_context: "פיזור פעולות לכל ההקשרים" + totals_hidden_project_count: "%{count} מוסתרים" + totals_deferred_actions: "מהן %{count} פעולות דחויות במִזְכָּר" + click_to_show_actions_from_week: "הקלקה על %{link} תציג את הפעולות משבוע %{week} ואילך" + actions_dow_30days_title: "יום בשבוע (30 הימים האחרונים(" legend: - number_of_actions: !binary | - 157Xodek16gg16TXoteV15zXldeq - - percentage: !binary | - 15DXl9eV15Y= - - number_of_days: !binary | - 157Xodek16gg15nXnteZ150g16fXldeT150g15zXm9ef - - day_of_week: !binary | - 15nXldedINeR16nXkdeV16I= - - running_time: !binary | - 15bXntefINee16bXmNeR16gg15zXpNei15XXnNeUICjXqdeR15XXoteV16op - - months_ago: !binary | - 15fXldeT16nXmdedINen15XXk9ed - - actions: !binary | - 16TXoteV15zXldeq - + number_of_actions: "מספר פעולות" + percentage: "אחוז" + number_of_days: "מספר ימים קודם לכן" + day_of_week: "יום בשבוע" + running_time: "זמן מצטבר לפעולה (שבועות)" + months_ago: "חודשים קודם" + actions: "פעולות" actions_last_year_legend: - number_of_actions: !binary | - 157Xodek16gg15TXpNei15XXnNeV16o= - - months_ago: !binary | - 15fXldeT16nXmdedINen15XXk9ed - - totals_visible_context_count: !binary | - 157XqteV15og15DXnNeVICV7Y291bnR9INeU16fXqdeo15nXnSDXktec15XX - mdeZ150= - - totals_blocked_actions: !binary | - JXtjb3VudH0g16rXnNeV15nXmdedINeR16HXmdeV150g15TXntep15nXnteV - 16og16nXnNeU150= - - spread_of_running_actions_for_visible_contexts: !binary | - 16TXmdeW15XXqCDXlNek16LXldec15XXqiDXnNeU16fXqdeo15nXnSDXktec - 15XXmdeZ150= - - tag_cloud_description: !binary | - 16LXoNefINeU16rXkteZ15XXqiDXnteb15nXnCDXqteS15nXldeqINec15vX - nCDXlNek16LXldec15XXqiAo15TXodeq15nXmdee15UsINec15Ag15TXodeq - 15nXmdee15UsINeS15zXldeZ15XXqiDXlS/XkNeVINee15XXodeq16jXldeq - KA== - - totals: !binary | - 16HXmdeb15XXnteZ150= - + number_of_actions: "מספר הפעולות" + months_ago: "חודשים קודם" + totals_visible_context_count: "מתוך אלו %{count} הקשרים גלויים" + totals_blocked_actions: "%{count} תלויים בסיום המשימות שלהם" + spread_of_running_actions_for_visible_contexts: "פיזור הפעולות להקשרים גלויים" + tag_cloud_description: "ענן התגיות מכיל תגיות לכל הפעולות (הסתיימו, לא הסתיימו, גלויות ו/או מוסתרות(" + totals: "סיכומים" time_of_day_legend: - number_of_actions: !binary | - 157Xodek16gg16TXoteV15zXldeq - - time_of_day: !binary | - 15bXntefINeR15nXlded - - tags: !binary | - 16rXkteZ15XXqg== - - totals_action_count: !binary | - 16fXmdeZ157XldeqICV7Y291bnR9INek16LXldec15XXqiDXkdeh15og15TX - m9ec - - more_stats_will_appear: !binary | - 16HXmNeY15nXodeY15nXp9eV16og16DXldeh16TXldeqINeZ15XXpteS15Ug - 15vXkNefINec15DXl9eoINeU15XXodek16og16TXoteV15zXldeqINeg15XX - odek15XXqi4= - - open_per_week: !binary | - 16TXoteV15zXldeqINeU157XqdeaICjXnteV16bXkteV16og15DXlSDXnteV - 16HXqteo15XXqikg15zXm9ecINep15HXldei - - no_actions_selected: !binary | - 15zXkCDXoNeR15fXqNeVINek16LXldec15XXqg== - - totals_completed_project_count: !binary | - JXtjb3VudH0g157XlNedINek16jXldeZ15nXp9eY15nXnSDXqdeg16HXqteZ - 15nXnteVLg== - - totals_hidden_context_count: !binary | - 15UtJXtjb3VudH0g15HXlNen16nXqNeZ150g157Xldeh16rXqNeZ150u - + number_of_actions: "מספר פעולות" + time_of_day: "זמן ביום" + tags: "תגיות" + totals_action_count: "קיימות %{count} פעולות בסך הכל" + more_stats_will_appear: "סטטיסטיקות נוספות יוצגו כאן לאחר הוספת פעולות נוספות." + open_per_week: "פעולות המשך (מוצגות או מוסתרות) לכל שבוע" + no_actions_selected: "לא נבחרו פעולות" + totals_completed_project_count: "%{count} מהם פרוייקטים שנסתיימו." + totals_hidden_context_count: "ו-%{count} בהקשרים מוסתרים." actions_day_of_week_legend: - number_of_actions: !binary | - 157Xodek16gg16TXoteV15zXldeq - - day_of_week: !binary | - 15nXldedINeR16nXkdeV16I= - - click_to_update_actions: !binary | - 15TXp9ec16fXlCDXotecINeU15HXqCDXkdeS16jXoyDXntei15PXm9eg16og - 15DXqiDXlNek16LXldec15Qg15zXnteY15Q= - - totals_first_action: !binary | - 157XkNeWINeU16TXoteV15zXlCDXlNeo15DXqdeV16DXlCDXkS0le2RhdGV9 - - tod30: !binary | - 15bXntefINeR15nXldedICgzMCDXmdee15nXnSDXkNeX16jXldeg15kp - - tag_cloud_90days_description: !binary | - 16LXoNefINeU16rXkteZ15XXqiDXnteb15nXnCDXqteS15nXldeqINei15HX - ldeoINek16LXldec15XXqiDXqdeg15XXpteo15Ug15DXlSDXlNeh16rXmdeZ - 157XlSDXkS05MCDXlNeZ157XmdedINeU15DXl9eo15XXoNeZ150u - - top10_projects_30days: !binary | - 16LXqdeo16og15TXpNeo15XXmdeZ16fXmNeZ150g15TXnteV15HXmdec15nX - nSDXkS0zMCDXlNeZ157XmdedINeU15DXl9eo15XXoNeZ150= - - top10_longrunning: !binary | - MTAg15TXpNeo15XXmdeZ16fXmNeZ150g16nXqNem15nXnSDXlNeb15kg15TX - qNeR15Qg15bXntef - - within_one: !binary | - 16rXldeaIDE= - - actions: !binary | - 16TXoteV15zXldeq - - no_tags_available: !binary | - 15DXmdefINeq15LXmdeV16og15bXnteZ16DXldeq - - actions_min_completion_time: !binary | - 15TXltee158g15TXnteW16LXqNeZINec16HXmdeV150g15TXldeQICV7dGlt - ZX0u - - totals_active_project_count: !binary | - 157XqteV15vXnSwgJXtjb3VudH0g15TXnSDXpNeo15XXmdeZ16fXmNeZ150g - 16TXoteZ15zXmded - - actions_selected_from_week: !binary | - 16TXoteV15zXldeqINeg15HXl9eo15XXqiDXntep15HXldei - - totals_actions_completed: !binary | - JXtjb3VudH0g157XlNedINeU16HXqteZ15nXnteV - - actions_avg_completion_time: !binary | - 157Xm9ecINeU16TXoteV15zXmdeV16og16nXoNeh16rXmdeZ157XldeqINeU - 15bXntefINeU157XnteV16bXoiDXnNeh15nXldedINeU15XXkCAle2NvdW50 - fSDXmdee15nXnQ== - - time_of_day: !binary | - 15bXntefINeR15nXldedICjXm9ecINeU16TXoteV15zXldeqKQ== - + number_of_actions: "מספר פעולות" + day_of_week: "יום בשבוע" + click_to_update_actions: "הקלקה על הבר בגרף מעדכנת את הפעולה למטה" + totals_first_action: "מאז הפעולה הראשונה ב-%{date}" + tod30: "זמן ביום (30 ימים אחרוני)" + tag_cloud_90days_description: "ענן התגיות מכיל תגיות עבור פעולות שנוצרו או הסתיימו ב-90 הימים האחרונים." + top10_projects_30days: "עשרת הפרוייקטים המובילים ב-30 הימים האחרונים" + top10_longrunning: "10 הפרוייקטים שרצים הכי הרבה זמן" + within_one: "תוך 1" + actions: "פעולות" + no_tags_available: "אין תגיות זמינות" + actions_min_completion_time: "הזמן המזערי לסיום הוא %{time}." + totals_active_project_count: "מתוכם, %{count} הם פרוייקטים פעילים" + actions_selected_from_week: "פעולות נבחרות משבוע" + totals_actions_completed: "%{count} מהם הסתיימו" + actions_avg_completion_time: "מכל הפעוליות שנסתיימות הזמן הממוצע לסיום הוא %{count} ימים" + time_of_day: "זמן ביום (כל הפעולות)" labels: - avg_created: !binary | - 16DXldem16jXlSDXkdee157Xldem16I= - - created: !binary | - 16DXldem16jXlQ== - - month_avg_created: !binary | - JXttb250aHN9INeg15XXpteo15Ug15HXntee15XXpteiINec15fXldeT16k= - - completed: !binary | - 15TXodeq15nXmdee15U= - - month_avg_completed: !binary | - JXttb250aHN9INeU16HXqteZ15nXnteVINeR157XnteV16bXoiDXnNeX15XX - k9ep - - avg_completed: !binary | - 15TXodeq15nXmdee15Ug15HXntee15XXptei - - actions_further: !binary | - 15XXkNeZ15zXmg== - - tag_cloud_title: !binary | - 16LXoNefINeq15LXmdeV16og15zXm9ecINeU16TXoteV15zXldeq - + avg_created: "נוצרו בממוצע" + created: "נוצרו" + month_avg_created: "%{months} נוצרו בממוצע לחודש" + completed: "הסתיימו" + month_avg_completed: "%{months} הסתיימו בממוצע לחודש" + avg_completed: "הסתיימו בממוצע" + actions_further: "ואילך" + tag_cloud_title: "ענן תגיות לכל הפעולות" running_time_all_legend: - percentage: !binary | - 15DXl9eV15Y= - - running_time: !binary | - 15bXntefINee16bXmNeR16gg15zXpNei15XXnNeV16ogKNep15HXldei15XX - qikuINeU16fXnNen15Qg16LXnCDXlNeR16gg15zXnteZ15PXoiDXoNeV16HX - ow== - - actions: !binary | - 16TXoteV15zXldeq - - totals_tag_count: !binary | - 16fXmdeZ157XmdedICV7Y291bnR9INeq15LXmdeV16og15TXntep15XXmdeZ - 15vXldeqINec16TXoteV15zXldeqLg== - - totals_project_count: !binary | - 16fXmdeZ157XmdedICV7Y291bnR9INek16jXldeZ15nXp9eY15nXnS4= - - actions_30days_title: !binary | - 16TXoteV15zXldeqINeRLTMwINeU15nXnteZ150g15TXkNeX16jXldeg15nX - nQ== - - current_running_time_of_incomplete_visible_actions: !binary | - 15bXntefINee16bXmNeR16gg15zXm9ecINeU16TXoteV15zXldeqINeU15LX - nNeV15nXldeq - - click_to_return_link: !binary | - 15vXkNef - + percentage: "אחוז" + running_time: "זמן מצטבר לפעולות (שבועות). הקלקה על הבר למידע נוסף" + actions: "פעולות" + totals_tag_count: "קיימים %{count} תגיות המשוייכות לפעולות." + totals_project_count: "קיימים %{count} פרוייקטים." + actions_30days_title: "פעולות ב-30 הימים האחרונים" + current_running_time_of_incomplete_visible_actions: "זמן מצטבר לכל הפעולות הגלויות" + click_to_return_link: "כאן" tod30_legend: - number_of_actions: !binary | - 157Xodek16gg16TXoteV15zXldeq - - time_of_day: !binary | - 15bXntefINeR15nXlded - - contexts: !binary | - 15TXp9ep16jXmded - - running_time_all: !binary | - 15bXntefINee16bXmNeR16gg15zXm9ecINeU16TXoteV15zXldeqINep15zX - kCDXlNeh16rXmdeZ157XlQ== - - actions_min_max_completion_days: !binary | - 15nXl9ehINeW157XnyDXnteZ15bXoteo15kv157Xmdeo15HXmSDXnNeh15nX - ldedINeU15XXkCAle21pbn0vJXttYXh9Lg== - - totals_unique_tags: !binary | - 157XqteV15og16rXkteZ15XXqiDXkNec15UsICV7Y291bnR9INeZ15nXl9eV - 15PXmdeV16ou - - actions_lastyear_title: !binary | - 16TXoteV15zXldeqINeRLTEyINeU15fXldeT16nXmdedINeU15DXl9eo15XX - oNeZ150= - - actions_last_year: !binary | - 16TXoteV15zXldeqINeR16nXoNeZ150g15TXkNeX16jXldeg15XXqg== - - actions_actions_avg_created_30days: !binary | - 15EtMzAg15TXmdee15nXnSDXlNeQ15fXqNeV16DXmdedINeg15XXpteo15Ug - 15HXntee15XXpteiICV7Y291bnR9INek16LXldec15XXqg== - + number_of_actions: "מספר פעולות" + time_of_day: "זמן ביום" + contexts: "הקשרים" + running_time_all: "זמן מצטבר לכל הפעולות שלא הסתיימו" + actions_min_max_completion_days: "יחס זמן מיזערי/מירבי לסיום הוא %{min}/%{max}." + totals_unique_tags: "מתוך תגיות אלו, %{count} ייחודיות." + actions_lastyear_title: "פעולות ב-12 החודשים האחרונים" + actions_last_year: "פעולות בשנים האחרונות" + actions_actions_avg_created_30days: "ב-30 הימים האחרונים נוצרו בממוצע %{count} פעולות" search: - no_results: !binary | - 15TXl9eZ16TXldepINec15Ag15TXoNeZ15Eg16rXldem15DXldeq - - contexts_matching_query: !binary | - 15TXp9ep16jXmdedINeq15XXkNee15nXnSDXnNep15DXmdec16rXkA== - - projects_matching_query: !binary | - 16TXqNeV15nXmden15jXmdedINeq15XXkNee15nXnSDXqdeQ15nXnNeq15A= - - todos_matching_query: !binary | - 157XqdeZ157XldeqINeq15XXkNee15XXqiDXqdeQ15nXnNeq15A= - - tags_matching_query: !binary | - 16rXkteZ15XXqiDXqteV15DXnteV16og15zXqdeQ15nXnNeq15A= - - notes_matching_query: !binary | - 16TXqten15nXldeqINeq15XXkNee15XXqiDXqdeQ15nXnNeq15A= - + no_results: "החיפוש לא הניב תוצאות" + contexts_matching_query: "הקשרים תואמים לשאילתא" + projects_matching_query: "פרוייקטים תואמים שאילתא" + todos_matching_query: "משימות תואמות שאילתא" + tags_matching_query: "תגיות תואמות לשאילתא" + notes_matching_query: "פתקיות תואמות שאילתא" contexts: - last_completed_in_context: !binary | - 15HXlNen16nXqCDXlteUICAo15DXl9eo15XXoNeV16ogJXtudW1iZXJ9KQ== - - hide_form_title: !binary | - 15TXodeq16jXqiDXmNeV16TXoSDXlNen16nXqCDXl9eT16k= - - status_hidden: !binary | - 15TXlNen16nXqCDXnteV16HXqteo - - delete_context_title: !binary | - 157Xl9eZ16fXqiDXlNen16nXqA== - - delete_context_confirmation: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNeU16fXqdeoICAnJXtuYW1lfSc/ - INeZ16kg15zXlNeW15TXqCDXntek16DXmSDXqdek16LXldec15Qg15bXlSDX - nteq15fXldenINeQ16og15vXnCDXlNek16LXldec15XXqiDXlNee15fXlteV - 16jXmdeV16og15HXlNen16nXqCDXlteU - - update_status_message: !binary | - 16nXldeg15Qg16nXnSDXlNeU16fXqdeo - - edit_context: !binary | - 16LXqNeZ15vXqiDXlNen16nXqA== - - show_form: !binary | - 15nXpteZ16jXqiDXlNen16nXqCDXl9eT16k= - - context_name: !binary | - 16nXnSDXlNen16nXqA== - - completed_tasks_title: !binary | - 157Xodec15XXnNeZ1506Otek16LXldec15XXqiDXqdeR15XXptei15Ug15HX - ntec15XXkNefINeR15TXp9ep16ggICcle2NvbnRleHRfbmFtZX0n - - no_contexts_active: !binary | - 15DXmdefINeb16jXkteiINeU16fXqdeo15nXnSDXpNei15nXnNeZ150= - - save_status_message: !binary | - 15TXp9ep16gg16DXqdee16g= - - no_actions: !binary | - 15DXmdefINeb16jXkteiINek16LXldec15XXqiDXqdec15Ag15TXldep15zX - nteVINeR15TXp9ep16gg15TXoNeV15vXl9eZ - - delete_context: !binary | - 157Xl9enINeU16fXqdeo - - hidden_contexts: !binary | - 15TXp9ep16jXmdedINee15XXodeq16jXmded - - visible_contexts: !binary | - 15TXp9ep16jXmdedINeS15zXldeZ15nXnQ== - - context_hide: !binary | - 15TXodeq16jXlCDXntei157XldeTINeU15HXmdeqPw== - - context_deleted: !binary | - 16DXnteX16cg15TXp9ep16ggJyV7bmFtZX0n - - todos_append: !binary | - 15HXlNen16nXqCDXlteU - - new_context_post: !binary | - JyDXmdeV15XXpteo15Ug15HXoNeV16HXoy4g15TXkNedINec15TXntep15nX - mj8= - - no_contexts_hidden: !binary | - 15DXmdefINeb16jXkteiINeU16fXqdeo15nXnSDXnteV16HXqteo15nXnQ== - - status_active: !binary | - 15TXlNen16nXqCDXpNei15nXnA== - - all_completed_tasks_title: !binary | - 157Xodec15XXnNeZ1506Oteb15wg15TXpNei15XXnNeV16og16nXkdeV16bX - oteVINeR157XnNeV15DXnyDXkdeU16fXqdeoICAnJXtjb250ZXh0X25hbWV9 - Jw== - - hide_form: !binary | - 15TXodeq16jXqiDXmNeV16TXoQ== - - add_context: !binary | - 15TXldeh16TXqiDXlNen16nXqA== - - new_context_pre: !binary | - 15TXp9ep16gg15fXk9epICc= - - show_form_title: !binary | - 15TXldeh16TXqiDXlNen16nXqA== - + last_completed_in_context: "בהקשר זה (אחרונות %{number})" + hide_form_title: "הסתרת טופס הקשר חדש" + status_hidden: "ההקשר מוסתר" + delete_context_title: "מחיקת הקשר" + delete_context_confirmation: "האם למחוק את ההקשר '%{name}'? יש להזהר מפני שפעולה זו מתחוק את כל הפעולות המחזוריות בהקשר זה" + update_status_message: "שונה שם ההקשר" + edit_context: "עריכת הקשר" + show_form: "יצירת הקשר חדש" + context_name: "שם הקשר" + completed_tasks_title: "מסלולים::פעולות שבוצעו במלואן בהקשר '%{context_name}'" + no_contexts_active: "אין כרגע הקשרים פעילים" + save_status_message: "הקשר נשמר" + no_actions: "אין כרגע פעולות שלא הושלמו בהקשר הנוכחי" + delete_context: "מחק הקשר" + hidden_contexts: "הקשרים מוסתרים" + visible_contexts: "הקשרים גלויים" + context_hide: "הסתרה מעמוד הבית?" + context_deleted: "נמחק הקשר '%{name}'" + todos_append: "בהקשר זה" + new_context_post: "' יווצרו בנוסף. האם להמשיך?" + no_contexts_hidden: "אין כרגע הקשרים מוסתרים" + status_active: "ההקשר פעיל" + all_completed_tasks_title: "מסלולים::כל הפעולות שבוצעו במלואן בהקשר '%{context_name}'" + hide_form: "הסתרת טופס" + add_context: "הוספת הקשר" + new_context_pre: "הקשר חדש '" + show_form_title: "הוספת הקשר" models: todo: - error_date_must_be_future: !binary | - 15fXmdeZ15Eg15zXlNeZ15XXqiDXqteQ16jXmdeaINei16rXmdeT15k= - + error_date_must_be_future: "חייב להיות תאריך עתידי" user: - error_project_not_associated: !binary | - 157XlteU15Qg16TXqNeV15nXmden15ggJXtwcm9qZWN0fSDXkNeZ16DXlSDX - ntep15XXmdeZ15og16LXnSDXnteW15Qg157Xqdeq157XqSAle3VzZXJ9Lg== - - error_context_not_associated: !binary | - 157XlteU15Qg15TXp9ep16ggJXtjb250ZXh0fSDXkNeZ16DXlSDXntep15XX - mdeZ15og16LXnSDXnteW15Qg157Xqdeq157XqSAle3VzZXJ9Lg== - + error_project_not_associated: "מזהה פרוייקט %{project} אינו משוייך עם מזה משתמש %{user}." + error_context_not_associated: "מזהה הקשר %{context} אינו משוייך עם מזה משתמש %{user}." project: - feed_title: !binary | - 16TXqNeV15nXmden15jXmdedINeR157Xodec15XXnNeZ150= - - feed_description: !binary | - 16jXqdeZ157XqiDXm9ecINeU16TXqNeV15nXmden15jXmdedINei15HXldeo - ICV7dXNlcm5hbWV9 - + feed_title: "פרוייקטים במסלולים" + feed_description: "רשימת כל הפרוייקטים עבור %{username}" preference: - due_on: !binary | - LSDXmdei15Mg15Ele2RhdGV9 - - due_in: !binary | - 16rXkNeo15nXmiDXmdei15Mg15HXoteV15MgJXtkYXlzfSDXmdee15nXnQ== - + due_on: "- יעד ב%{date}" + due_in: "תאריך יעד בעוד %{days} ימים" users: - total_notes: !binary | - 15vXnCDXlNek16rXp9eZ15XXqg== - - destroy_successful: !binary | - 157Xqdeq157XqSAle2xvZ2lufSDXlNeV16nXnteTINeR15TXptec15fXlA== - - change_password_submit: !binary | - 16nXmdeg15XXmSDXodeZ16HXnteQ - - destroy_confirmation: !binary | - 15DXlteU16jXlDog15TXpNei15XXnNeUINeq157Xl9enINeQ16og15TXntep - 16rXntepICcle2xvZ2lufScsINeb15wg15TXpNei15XXnNeV16osINeU16TX - qNeV15nXmden15jXmdedINeV15TXpNeq16fXmdedLiDXlNeQ150g15zXlNee - 16nXmdeaPw== - - label_auth_type: !binary | - 16nXmdeY16og15DXmdee15XXqg== - - identity_url: !binary | - 15vXqteV15HXqiDXlteU15XXqg== - - total_users_count: !binary | - 16fXmdeZ157XmdedICV7Y291bnR9INee16nXqtee16nXmded - - new_user_title: !binary | - 157Xodec15XXnNeZ1506Oteo15nXqdeV150g157Xqdeq157XqSDXm9ee16DX - lNec - - account_signup: !binary | - 16jXmdep15XXnSDXnNeX16nXkdeV158= - - password_confirmation_label: !binary | - 15DXmdee15XXqiDXodeZ16HXnteQ - - change_password_title: !binary | - 157Xodec15XXnNeZ1506Otep15nXoNeV15kg16HXmdeh157XkA== - - no_signups_title: !binary | - 157Xodec15XXnNeZ1506OteQ15nXnyDXqNeZ16nXldee15nXnQ== - - new_user_heading: !binary | - 16jXmdep15XXnSDXntep16rXntepINeX15PXqTo= - - total_projects: !binary | - 16TXqNeV15nXp9eY15nXnSDXkdeh15og15TXm9ec - - destroy_error: !binary | - 15DXqNei15Qg16nXkteZ15DXlCDXkdee15fXmden16og15TXntep16rXntep - ICV7bG9naW59 - - new_password_label: !binary | - 16HXmdeh157XkCDXl9eT16nXlA== - - you_have_to_reset_your_password: !binary | - 15nXqSDXnNeQ16TXoSDXkNeqINeU16HXmdeh157XkA== - - openid_ok_pref_failed: !binary | - 15vXqteV15HXqiDXlNeW15TXldeqICV7dXJsfSAu15DXldee16rXlCDXkdeU - 16bXnNeX15Qg15DXmiDXkNeo16LXlCDXqten15zXlCDXkdep157Xmdeo16og - 15TXkteT16jXldeqINeU15TXlteT15TXldeq - - first_user_heading: !binary | - 15HXqNeV15vXmdedINeU15HXkNeZ150g15DXnCDXnteh15zXldec15nXnS4g - 15vXk9eZINec15TXqteX15nXnCwg15nXqSDXnNeZ16bXldeoINeX16nXkdeV - 158g157XoNeU15w6 - - select_authentication_type: !binary | - 15nXqSDXnNeR15fXldeoINeQ16og16nXmdeY16og15TXlteZ15TXldeZINeU - 15fXk9ep15Qg15XXnNeU15zXnNeZ16cgJ9ep15nXoNeV15kg16nXmdeY16og - 15TXlteT15TXldeqJyDXnNeR15fXmdeo16og15TXqdeZ15jXlCDXlNeg15XX - m9eX15nXqg== - - desired_login: !binary | - 157Xqdeq157XqSDXm9eg15nXodeUINeo16bXldeZ - - confirm_password: !binary | - 15DXmdep15XXqCDXodeZ16HXnteQ - - change_password_prompt: !binary | - 15nXqSDXnNeb16rXldeRINeQ16og15TXodeZ16HXnteQINeU15fXk9ep15Qg - 15HXqdeT15XXqiDXqdec157XmNeUINeV15zXlNen15zXmdenICfXqdeg15Qg - 16HXmdeh157XkCcg15vXk9eZINec15TXl9ec15nXoyDXkNeqINeU16HXmdeh - 157XkCDXlNeg15XXm9eX15nXqiDXkdeX15PXqdeULg== - - failed_to_delete_user: !binary | - 157Xl9eZ16fXqiDXlNee16nXqtee16kgJXt1c2VybmFtZX0g16DXm9ep15zX - lA== - - register_with_cas: !binary | - 16LXnSDXntep16rXntepINeU16nXkCLXniDXqdec15o= - - new_token_generated: !binary | - 15DXodeZ157XldefINeX15PXqSDXoNeV16bXqCDXkdeU16bXnNeX15Q= - - password_updated: !binary | - 16HXmdeh157XkCDXoteV15PXm9eg15Qu - - total_actions: !binary | - 16HXmiDXpNei15XXnNeV16o= - - choose_password: !binary | - 15HXl9eZ16jXqiDXodeZ16HXnteQ - - auth_change_submit: !binary | - 16nXmdeg15XXmSDXqdeZ15jXqiDXkNeZ157Xldeq - - total_contexts: !binary | - 16HXmiDXlNen16nXqNeZ150= - - manage_users: !binary | - 16DXmdeU15XXnCDXntep16rXntep15nXnQ== - - auth_type_updated: !binary | - 16nXmdeY16og15DXmdee15XXqiDXoteV15PXm9eg15Q= - - signup_successful: !binary | - 16jXmdep15XXnSDXnteV16bXnNeXINei15HXldeoINee16nXqtee16kgJXt1 - c2VybmFtZX0u - - change_authentication_type: !binary | - 16nXmdeg15XXmSDXqdeZ15jXqiDXlNeW15PXlNeV16o= - - auth_type_update_error: !binary | - 15DXqNei15Qg16nXkteZ15DXlCDXkdei15nXk9eb15XXnyDXqdeZ15jXqiDX - lNeQ15nXnteV16o6ICV7ZXJyb3JfbWVzc2FnZXN9 - - change_auth_type_title: !binary | - 157Xodec15XXnNeZ1506Otep15nXoNeV15kg16nXmdeY16og15TXlteT15TX - ldeq - - signup_new_user: !binary | - 16jXqdeV150g157Xqdeq157XqSDXl9eT16k= - - openid_url_verified: !binary | - 15vXqteV15HXqiDXlNeW15TXldeqICV7dXJsfSAu15DXldee16rXlCDXkdeU - 16bXnNeX15Qg15XXkNeV16TXnyDXlNeQ15nXnteV16og16DXp9eR16Ig15wt - T3BlbklELg== - - destroy_user: !binary | - 15TXqdee15PXqiDXntep16rXntep - - user_created: !binary | - 157Xqdeq157XqSDXoNeV16bXqA== - - signup: !binary | - 16jXmdep15XXnQ== - - successfully_deleted_user: !binary | - 157Xqdeq157XqSAgJXt1c2VybmFtZX0g16DXnteX16cg15HXlNem15zXl9eU - + total_notes: "כל הפתקיות" + destroy_successful: "משתמש %{login} הושמד בהצלחה" + change_password_submit: "שינוי סיסמא" + destroy_confirmation: "אזהרה: הפעולה תמחק את המשתמש '%{login}', כל הפעולות, הפרוייקטים והפתקים. האם להמשיך?" + label_auth_type: "שיטת אימות" + identity_url: "כתובת זהות" + total_users_count: "קיימים %{count} משתמשים" + new_user_title: "מסלולים::רישום משתמש כמנהל" + account_signup: "רישום לחשבון" + password_confirmation_label: "אימות סיסמא" + change_password_title: "מסלולים::שינוי סיסמא" + no_signups_title: "מסלולים::אין רישומים" + new_user_heading: "רישום משתמש חדש:" + total_projects: "פרויקטים בסך הכל" + destroy_error: "ארעה שגיאה במחיקת המשתמש %{login}" + new_password_label: "סיסמא חדשה" + you_have_to_reset_your_password: "יש לאפס את הסיסמא" + openid_ok_pref_failed: "כתובת הזהות %{url} .אומתה בהצלחה אך ארעה תקלה בשמירת הגדרות ההזדהות" + first_user_heading: "ברוכים הבאים אל מסלולים. כדי להתחיל, יש ליצור חשבון מנהל:" + select_authentication_type: "יש לבחור את שיטת הזיהוי החדשה ולהלליק 'שינוי שיטת הזדהות' לבחירת השיטה הנוכחית" + desired_login: "משתמש כניסה רצוי" + confirm_password: "אישור סיסמא" + change_password_prompt: "יש לכתוב את הסיסמא החדשה בשדות שלמטה ולהקליק 'שנה סיסמא' כדי להחליף את הסיסמא הנוכחית בחדשה." + failed_to_delete_user: "מחיקת המשתמש %{username} נכשלה" + register_with_cas: "עם משתמש השא\"מ שלך" + new_token_generated: "אסימון חדש נוצר בהצלחה" + password_updated: "סיסמא עודכנה." + total_actions: "סך פעולות" + choose_password: "בחירת סיסמא" + auth_change_submit: "שינוי שיטת אימות" + total_contexts: "סך הקשרים" + manage_users: "ניהול משתמשים" + auth_type_updated: "שיטת אימות עודכנה" + signup_successful: "רישום מוצלח עבור משתמש %{username}." + change_authentication_type: "שינוי שיטת הזדהות" + auth_type_update_error: "ארעה שגיאה בעידכון שיטת האימות: %{error_messages}" + change_auth_type_title: "מסלולים::שינוי שיטת הזדהות" + signup_new_user: "רשום משתמש חדש" + openid_url_verified: "כתובת הזהות %{url} .אומתה בהצלחה ואופן האימות נקבע ל-OpenID." + destroy_user: "השמדת משתמש" + user_created: "משתמש נוצר" + signup: "רישום" + successfully_deleted_user: "משתמש %{username} נמחק בהצלחה" preferences: - page_title_edit: !binary | - 157Xodec15XXnNeZ1506Otei16jXmdeb16og15TXoteT16TXldeq - - authentication_header: !binary | - 15TXlteZ15TXldeZINep15zXmQ== - - change_password: !binary | - 16HXmdeg15XXmSDXodeZ16HXnteQ - - staleness_starts_after: !binary | - 16rXpNec15XXqiDXnteq15fXmdec15Qg15zXkNeX16ggJXtkYXlzfSDXmdee - 15nXnQ== - - change_identity_url: !binary | - 16nXmdeg15XXmSDXm9eq15XXkdeqIFVSTCDXlNeW15PXlNeV16o= - - updated: !binary | - 15TXoteT16TXldeqINei15XXk9eb16DXlQ== - - current_authentication_type: !binary | - 16nXmdeY16og15TXlteZ15TXldeZINep15zXmSDXlNeZ15AgJXthdXRoX3R5 - cGV9 - - token_description: !binary | - 15DXodeZ157XldefICjXntep157XqSDXnNeU15bXoNeV16og15nXqdeZ157X - ldepINee157XqdenINeq15vXqteg15XXqik= - - edit_preferences: !binary | - 16LXqNeZ15vXqiDXlNei15PXpNeV16o= - - is_true: !binary | - 15fXmdeV15HXmQ== - - token_header: !binary | - 15TXkNeh15nXnteV158g16nXnNeZ - - generate_new_token_confirm: !binary | - 15HXmNeV15c/INeZ16bXmdeo16og15DXodeZ157XldefINeX15PXqSDXqteX - 15zXmdejINeQ16og15TXkNeh15nXnteV158g15TXp9eZ15nXnSDXldeq15HX - mNecINeQ16og15TXqdeZ157XldepINeR15Uu - - is_false: !binary | - 16nXnNeZ15zXmQ== - + page_title_edit: "מסלולים::עריכת העדפות" + authentication_header: "הזיהוי שלי" + change_password: "סינוי סיסמא" + staleness_starts_after: "תפלות מתחילה לאחר %{days} ימים" + change_identity_url: "שינוי כתובת URL הזדהות" + updated: "העדפות עודכנו" + current_authentication_type: "שיטת הזיהוי שלי היא %{auth_type}" + token_description: "אסימון (משמש להזנות ישימוש ממשק תכתנות)" + edit_preferences: "עריכת העדפות" + is_true: "חיובי" + token_header: "האסימון שלי" + generate_new_token_confirm: "בטוח? יצירת אסימון חדש תחליף את האסימון הקיים ותבטל את השימוש בו." + is_false: "שלילי" tabs: - authentication: !binary | - 15DXmdee15XXqg== - - tracks_behavior: !binary | - 15TXqteg15TXkteV16og157Xodec15XXnNeZ150= - - date_and_time: !binary | - 16rXkNeo15nXmiDXldep16LXlA== - - profile: !binary | - 16TXqNeV16TXmdec - - page_title: !binary | - 157Xodec15XXnNeZ1506OteU16LXk9ek15XXqg== - - sms_context_none: !binary | - 15zXnNeQ - - change_authentication_type: !binary | - 16nXmdeg15XXmSDXodeV15Ig15TXlteT15TXldeq - - open_id_url: !binary | - 15vXqteV15HXqiDXlteZ15TXldeZIE9wZW5JRCDXqdec15og15TXmdeQ - - show_number_completed: !binary | - 15TXpteSICV7bnVtYmVyfSDXpNeo15nXmNeZ150g16nXlNeh16rXmdeZ157X - lQ== - - generate_new_token: !binary | - 15nXpteZ16jXqiDXkNeh15nXnteV158g15fXk9ep - - password_changed: !binary | - 15TXodeZ16HXnteQINep15XXoNeq15QsINeZ16kg15zXlNeZ15vXoNehINep - 16DXmdeqLg== - - title: !binary | - 15TXlNeS15PXqNeV16og16nXnNeZ - + authentication: "אימות" + tracks_behavior: "התנהגות מסלולים" + date_and_time: "תאריך ושעה" + profile: "פרופיל" + page_title: "מסלולים::העדפות" + sms_context_none: "ללא" + change_authentication_type: "שינוי סוג הזדהות" + open_id_url: "כתובת זיהוי OpenID שלך היא" + show_number_completed: "הצג %{number} פריטים שהסתיימו" + generate_new_token: "יצירת אסימון חדש" + password_changed: "הסיסמא שונתה, יש להיכנס שנית." + title: "ההגדרות שלי" common: - numbered_step: !binary | - 16bXoteTICV7bnVtYmVyfQ== - - projects: !binary | - 16TXqNeV15nXmden15jXmded - - add: !binary | - 15TXldeh16M= - - go_back: !binary | - 15fXlteV16g= - - optional: !binary | - 15DXpNep16jXmQ== - - contribute: !binary | - 16rXqNeV150= - - todo: !binary | - 157XqdeZ157XlA== - - forth: !binary | - 15XXkNeZ15zXmg== - - none: !binary | - 15TXoteo15Q= - - back: !binary | - 15DXl9eV16jXlA== - - second: !binary | - 16nXoNeZ - - update: !binary | - 16LXk9eb158= - - create: !binary | - 16bXldeo - - description: !binary | - 16rXmdeQ15XXqA== - - bugs: !binary | - 15HXkNeS15nXnQ== - - third: !binary | - 16nXnNeZ16nXmQ== - - weeks: !binary | - 16nXkdeV16LXldeq - + numbered_step: "צעד %{number}" + projects: "פרוייקטים" + add: "הוסף" + go_back: "חזור" + optional: "אפשרי" + contribute: "תרום" + todo: "משימה" + forth: "ואילך" + none: "הערה" + back: "אחורה" + second: "שני" + update: "עדכן" + create: "צור" + description: "תיאור" + bugs: "באגים" + third: "שלישי" + weeks: "שבועות" days_midsentence: - other: !binary | - 15nXnteZ150= - - zero: !binary | - 15nXnteZ150= - - one: !binary | - 15nXlded - - cancel: !binary | - 15HXmNec - + other: "ימים" + zero: "ימים" + one: "יום" + cancel: "בטל" sort: - sort: !binary | - 157XmdeZ158= - - by_task_count: !binary | - 15zXpNeZINee16HXpNeoINee16nXmdee15XXqg== - - alphabetically_title: !binary | - 16HXk9eoINek16jXldeZ15nXp9eY15nXnSDXkNec16TXkdeY15nXqg== - - by_task_count_title_confirm: !binary | - 15zXodeT16gg15DXqiDXlNek16jXldeZ15nXp9eY15nXnSDXnNek15kg157X - odek16gg15TXntep15nXnteV16o/INeU16TXoteV15zXlCDXqteX15zXmdej - INeQ16og15TXodeT16gg15TXp9eZ15nXnQ== - - alphabetically_confirm: !binary | - 15zXodeT16gg15DXqiDXlNek16jXldeZ15nXp9eY15nXnSDXkdeh15PXqCDX - kNec16TXkdeq15k/INeU16TXoteV15zXlCDXqteX15zXmdejINeQ16og15TX - odeT16gg15TXp9eZ15nXnQ== - - by_task_count_title: !binary | - 157XmdeZ158g15zXpNeZINee16HXpNeoINee16nXmdee15XXqg== - - alphabetically: !binary | - 15DXnNek15HXqteZ - - errors_with_fields: !binary | - 16nXkteZ16jXldeqINeR16nXk9eV16og15TXntem15XXmdeZ16DXmded - - ajaxError: !binary | - 16nXkteZ15DXlCDXkdeq15LXldeR15Qg157XlNep16jXqg== - - server_error: !binary | - 15TXqteo15fXqdeUINep15LXmdeQ16og16nXqNeq - - action: !binary | - 16TXoteV15zXlA== - - last: !binary | - 15DXl9eo15XXnw== - - email: !binary | - 15PXldeQItec - + sort: "מיין" + by_task_count: "לפי מספר משימות" + alphabetically_title: "סדר פרוייקטים אלפבטית" + by_task_count_title_confirm: "לסדר את הפרוייקטים לפי מספר המשימות? הפעולה תחליף את הסדר הקיים" + alphabetically_confirm: "לסדר את הפרוייקטים בסדר אלפבתי? הפעולה תחליף את הסדר הקיים" + by_task_count_title: "מיין לפי מספר משימות" + alphabetically: "אלפבתי" + errors_with_fields: "שגירות בשדות המצויינים" + ajaxError: "שגיאה בתגובה מהשרת" + server_error: "התרחשה שגיאת שרת" + action: "פעולה" + last: "אחרון" + email: "דוא\"ל" note: - other: !binary | - JXtjb3VudH0g16TXqten15nXldeq - - zero: !binary | - 15DXmdefINek16rXp9eZ15XXqg== - - one: !binary | - 16TXqten15Q= - - deferred: !binary | - 16DXk9eX15Q= - - previous: !binary | - 15TXp9eV15PXnQ== - - months: !binary | - 15fXldeT16nXmded - - fourth: !binary | - 16jXkdeZ16LXmQ== - - search: !binary | - 15fXmdek15XXqQ== - - contexts: !binary | - 15TXp9ep16jXmded - - recurring_todos: !binary | - 16TXoteV15zXldeqINee15fXlteV16jXmdeV16o= - - project: !binary | - 16TXqNeV15nXmden15g= - - website: !binary | - 15DXqteo - - logout: !binary | - 16bXkA== - - forum: !binary | - 16TXldeo15XXnQ== - - month: !binary | - 15fXldeT16k= - - week: !binary | - 16nXkdeV16I= - - first: !binary | - 16jXkNep15XXnw== - - show_all: !binary | - 15TXpteSINeU15vXnA== - - review: !binary | - 15HXmden15XXqNeq - - context: !binary | - 15TXp9ep16g= - - drag_handle: !binary | - 157XqdeV15o= - - wiki: !binary | - 15XXmden15k= - - not_available_abbr: !binary | - 15wv15k= - - actions: !binary | - 16TXoteV15zXldeq - - next: !binary | - 15TXkdeQ - - notes: !binary | - 16TXqten15nXldeq - - ok: !binary | - 15DXlden15k= - + other: "%{count} פתקיות" + zero: "אין פתקיות" + one: "פתקה" + deferred: "נדחה" + previous: "הקודם" + months: "חודשים" + fourth: "רביעי" + search: "חיפוש" + contexts: "הקשרים" + recurring_todos: "פעולות מחזוריות" + project: "פרוייקט" + website: "אתר" + logout: "צא" + forum: "פורום" + month: "חודש" + week: "שבוע" + first: "ראשון" + show_all: "הצג הכל" + review: "ביקורת" + context: "הקשר" + drag_handle: "משוך" + wiki: "ויקי" + not_available_abbr: "ל/י" + actions: "פעולות" + next: "הבא" + notes: "פתקיות" + ok: "אוקי" actions_midsentence: - other: !binary | - 16TXoteV15zXldeq - - zero: !binary | - 16TXoteV15zXldeq - - one: !binary | - 16TXoteV15zXlA== - + other: "פעולות" + zero: "פעולות" + one: "פעולה" layouts: - toggle_notes_title: !binary | - 15fXqdeZ16TXqiDXm9ecINeU16TXqten15nXldeq - + toggle_notes_title: "חשיפת כל הפתקיות" mobile_navigation: - home: !binary | - MS3XkdeZ16o= - - projects: !binary | - 16TXqNeV15nXmden15jXmded - - tickler: !binary | - 157WtNeW1rDXm9a41rzXqA== - - starred: !binary | - NC3XnteV15PXktep15nXnQ== - - feeds: !binary | - 15TXlteg15XXqg== - - new_action: !binary | - MC3XpNei15XXnNeUINeX15PXqdeU - - contexts: !binary | - Mi3XlNen16nXqNeZ150= - - logout: !binary | - 16bXkA== - + home: "1-בית" + projects: "פרוייקטים" + tickler: "מִזְכָּר" + starred: "4-מודגשים" + feeds: "הזנות" + new_action: "0-פעולה חדשה" + contexts: "2-הקשרים" + logout: "צא" navigation: - home: !binary | - 15HXmdeq - - starred_title: !binary | - 15TXpteS16og16TXoteV15zXldeqINee15XXk9eS16nXldeq - - recurring_todos_title: !binary | - 16DXmdeU15XXnCDXpNei15XXnNeV16og157Xl9eW15XXqNeZ15XXqg== - - tickler: !binary | - 157WtNeW1rDXm9a41rzXqA== - + home: "בית" + starred_title: "הצגת פעולות מודגשות" + recurring_todos_title: "ניהול פעולות מחזוריות" + tickler: "מִזְכָּר" help: "?" - admin: !binary | - 16DXmdeU15XXnA== - - starred: !binary | - 157XldeT15LXqdeZ150= - - completed_tasks_title: !binary | - 15TXodeq15nXmded - - api_docs: !binary | - 16rXmdei15XXkyDXntee16nXpyDXqteb16DXldeq - - integrations_: !binary | - 16nXmdec15XXkSDXnteh15zXldec15nXnQ== - - feeds: !binary | - 15TXlteg15XXqg== - - preferences_title: !binary | - 15TXpteS16og15TXoteT16TXldeq15k= - - export_title: !binary | - 15nXkdeV15Ag15XXmdem15XXkCDXoNeq15XXoNeZ150= - - stats: !binary | - 16HXmNeY15nXodeY15nXp9eU - - home_title: !binary | - 15HXmdeq - - organize: !binary | - 15DXqNeS15XXnw== - - feeds_title: !binary | - 16bXpNeZ15Qg15HXqNep15nXnteqINeU15TXlteg15XXqiDXlNeW157Xmdeg - 15Q= - - manage_users: !binary | - 16DXmdeU15XXnCDXntep16rXntep15nXnQ== - - notes_title: !binary | - 15TXpteS16og15vXnCDXlNek16rXp9eZ15XXqg== - - search: !binary | - 15fXmdek15XXqSDXm9ecINeU16TXqNeZ15jXmded - - completed_tasks: !binary | - 15HXldem16I= - - review_title: !binary | - 16LXqNeZ15vXpiDXkdeZ16fXldeo16o= - - recurring_todos: !binary | - 157XqdeZ157XldeqINee15fXlteV16jXmdeV16o= - - preferences: !binary | - 15TXoteT16TXldeq - - manage_users_title: !binary | - 15TXldeh16TXlCDXkNeVINeU16HXqNeUINep15wg157Xqdeq157XqdeZ150= - - stats_title: !binary | - 15TXpteS16og15TXodeY15jXmdeh15jXmden15Qg16nXnNeZ - - view: !binary | - 16rXpteV15LXlA== - - contexts_title: !binary | - 15TXp9ep16jXmded - - calendar_title: !binary | - 15zXldeXINep16DXlCDXqdecINee16nXmdee15XXqiDXnNeR15nXpteV16I= - - projects_title: !binary | - 16TXqNeV15nXmden15jXmded - - calendar: !binary | - 15zXldeXINep16DXlA== - - tickler_title: !binary | - 157WtNeW1rDXm9a41rzXqA== - - export: !binary | - 15nXpteV15A= - - next_actions_rss_feed: !binary | - 15TXlteg16og16jXodehINec16TXoteV15zXldeqINeU157Xqdea - - toggle_contexts_title: !binary | - 15TXodeq16jXqi/XlNem15LXqiDXqdeT15XXqiDXnteV16HXqteo15nXnQ== - - toggle_contexts: !binary | - 15TXpteS16og16nXk9eV16og157Xldeh16rXqNeZ150= - - toggle_notes: !binary | - 15fXqdeZ16TXqiDXpNeq16fXmdeV16o= - + admin: "ניהול" + starred: "מודגשים" + completed_tasks_title: "הסתיים" + api_docs: "תיעוד ממשק תכנות" + integrations_: "שילוב מסלולים" + feeds: "הזנות" + preferences_title: "הצגת העדפותי" + export_title: "יבוא ויצוא נתונים" + stats: "סטטיסטיקה" + home_title: "בית" + organize: "ארגון" + feeds_title: "צפיה ברשימת ההזנות הזמינה" + manage_users: "ניהול משתמשים" + notes_title: "הצגת כל הפתקיות" + search: "חיפוש כל הפריטים" + completed_tasks: "בוצע" + review_title: "עריכצ ביקורת" + recurring_todos: "משימות מחזוריות" + preferences: "העדפות" + manage_users_title: "הוספה או הסרה של משתמשים" + stats_title: "הצגת הסטטיסטיקה שלי" + view: "תצוגה" + contexts_title: "הקשרים" + calendar_title: "לוח שנה של משימות לביצוע" + projects_title: "פרוייקטים" + calendar: "לוח שנה" + tickler_title: "מִזְכָּר" + export: "יצוא" + next_actions_rss_feed: "הזנת רסס לפעולות המשך" + toggle_contexts_title: "הסתרת/הצגת שדות מוסתרים" + toggle_contexts: "הצגת שדות מוסתרים" + toggle_notes: "חשיפת פתקיות" feedlist: - actions_due_today: !binary | - 16TXoteV15zXldeqINec15HXmdem15XXoiDXlNeZ15XXnSDXkNeVINee15XX - p9eT150g15nXldeq16g= - - active_projects_wo_next: !binary | - 16TXqNeV15nXmden15jXmdedINek16LXmdec15nXnSDXnNec15Ag16TXoteV - 15zXldeqINeU157Xqdea - - select_feed_for_project: !binary | - 15HXl9eZ16jXqiDXlNeU15bXoNeUINei15HXldeoINeU16TXqNeV15nXmden - 15g= - - actions_completed_last_week: !binary | - 16TXoteV15zXldeqINep15TXodeq15nXmdee15Ug15HXqdeR16LXqiDXlNeZ - 157XmdedINeU15DXl9eo15XXoNeZ150= - - all_contexts: !binary | - 15vXnCDXlNeU16fXqdeo15nXnQ== - - project_needed: !binary | - 15PXqNeV16kg15zXpNeX15XXqiDXpNeo15XXmdeZ16fXmCDXkNeX15Mg15zX - pNeg15kg16nXoNeZ16rXnyDXnNeR16fXqSDXlNeW16DXlA== - - notice_incomplete_only: !binary | - 15TXoteo15Q6INeb15wg15TXlNeW16DXldeqINee16bXmdeS15XXqiDXkNeq - INeb15wg15TXpNei15XXnNeV16og16nXnNeQINeh15XXnteg15Ug15vXnteR - 15XXptei15XXqiDXkNec15Ag15DXnSDXm9efINeg15HXl9eoINeR157XpNeV - 16jXqSDXkNeX16jXqi4= - - choose_context: !binary | - 15HXl9eZ16jXqiDXlNeU16fXqdeoINei15HXldeo15Ug15PXqNeV16nXlCDX - lNeW16DXlA== - - all_projects: !binary | - 15vXnCDXlNek16jXldeZ15nXp9eY15nXnQ== - - context_centric_actions: !binary | - 15TXlteg15XXqiDXoteR15XXqCDXpNei15XXnNeV16og16nXnNeQINeg16HX - qteZ15nXnteVINeR15TXp9ep16gg16DXqteV158= - - context_needed: !binary | - 16bXqNeZ15og15zXlNeZ15XXqiDXnNek15fXldeqINeU16fXqdeoINeQ15fX - kyDXnNek16DXmSDXqdeg15nXqtefINec15HXp9ep16gg15TXlteg15Q= - - project_centric: !binary | - 15TXlteg15XXqiDXoteR15XXqCDXpNei15XXnNeV16og16nXnNeQINeU16HX - qteZ15nXnteVINeR16TXqNeV15nXmden15gg157XodeV15nXmded - - ical_feed: !binary | - 15TXlteg16ogaUNhbA== - - active_starred_actions: !binary | - 15vXnCDXlNek16LXldec15XXqiDXlNek16LXmdec15XXqiDXldeU157Xk9eS - 16nXldeq - - last_fixed_number: !binary | - JXtudW1iZXJ9INek16LXldec15XXqiDXkNeX16jXldeg15XXqg== - - rss_feed: !binary | - 15TXlteg16og16jXodeh - - choose_project: !binary | - 15HXl9eZ16jXqiDXlNek16jXldeZ15nXp9eYINei15HXldeo15Ug15PXqNeV - 16nXlCDXlNeW16DXlA== - - projects_and_actions: !binary | - 16TXqNeV15XXmden15jXmdedINek16LXmdec15nXnSDXldeU16TXoteV15zX - ldeqINep15zXlNed - - actions_due_next_week: !binary | - 16TXoteV15zXldeqINep15nXqSDXnNeR16bXoiDXkdep15HXoteqINeU15nX - nteZ150g15TXp9eo15XXkdeZ150= - - plain_text_feed: !binary | - 15TXlteg16og15jXp9eh15gg16TXqdeV15g= - - all_actions: !binary | - 15vXnCDXlNek16LXldec15XXqg== - - legend: !binary | - 157Xp9eo15A6 - - select_feed_for_context: !binary | - 15HXl9eZ16jXqiDXlNeU15bXoNeUINei15HXldeoINeU15TXp9ep16gg15TX - oNeq15XXnw== - + actions_due_today: "פעולות לביצוע היום או מוקדם יותר" + active_projects_wo_next: "פרוייקטים פעילים ללא פעולות המשך" + select_feed_for_project: "בחירת ההזנה עבור הפרוייקט" + actions_completed_last_week: "פעולות שהסתיימו בשבעת הימים האחרונים" + all_contexts: "כל ההקשרים" + project_needed: "דרוש לפחות פרוייקט אחד לפני שניתן לבקש הזנה" + notice_incomplete_only: "הערה: כל ההזנות מציגות את כל הפעולות שלא סומנו כמבוצעות אלא אם כן נבחר במפורש אחרת." + choose_context: "בחירת ההקשר עבורו דרושה הזנה" + all_projects: "כל הפרוייקטים" + context_centric_actions: "הזנות עבור פעולות שלא נסתיימו בהקשר נתון" + context_needed: "צריך להיות לפחות הקשר אחד לפני שניתן לבקשר הזנה" + project_centric: "הזנות עבור פעולות שלא הסתיימו בפרוייקט מסויים" + ical_feed: "הזנת iCal" + active_starred_actions: "כל הפעולות הפעילות והמדגשות" + last_fixed_number: "%{number} פעולות אחרונות" + rss_feed: "הזנת רסס" + choose_project: "בחירת הפרוייקט עבורו דרושה הזנה" + projects_and_actions: "פרוויקטים פעילים והפעולות שלהם" + actions_due_next_week: "פעולות שיש לבצע בשבעת הימים הקרובים" + plain_text_feed: "הזנת טקסט פשוט" + all_actions: "כל הפעולות" + legend: "מקרא:" + select_feed_for_context: "בחירת ההזנה עבור ההקשר הנתון" number: currency: format: - unit: !binary | - 4oKq - + unit: "₪" separator: . delimiter: "," format: "%u%n " human: storage_units: units: - tb: !binary | - 15jXqNeUINeR15nXmdeY - - kb: !binary | - 16fXmdec15Ug15HXmdeZ15g= - - gb: !binary | - 15In15nXkteU15HXmdeZ15g= - - mb: !binary | - 157XkteUINeR15nXmdeY - + tb: "טרה בייט" + kb: "קילו בייט" + gb: "ג'יגהבייט" + mb: "מגה בייט" byte: - other: !binary | - 15HXqteZ150= - - one: !binary | - 15HXmdeZ15g= - + other: "בתים" + one: "בייט" format: "%u%n" format: separator: . delimiter: "," footer: - send_feedback: !binary | - 16nXnNeZ15fXqiDXntep15XXkSDXotecINeS15nXqNeh15AgJXt2ZXJzaW9u - fQ== - + send_feedback: "שליחת משוב על גירסא %{version}" notes: - delete_item_title: !binary | - 157Xl9eZ16fXqiDXpNeo15nXmA== - - in_project: !binary | - 15E6 - - show_note_title: !binary | - 15TXpteS16og16TXqten15nXqg== - - note_location_link: !binary | - 15HXqteV15o6 - - deleted_note: !binary | - 15TXpNeq16fXmdeqICcle2lkfScg16DXnteX16fXlA== - - delete_confirmation: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNek16rXp9eZ16ogICcle2lkfSc/ - - delete_note_confirm: !binary | - 15TXkNedINec157Xl9eV16cg15DXqiDXlNek16rXp9eZ16ogICcle2lkfSc/ - - note_link_title: !binary | - 15TXpteS16og16TXqten15nXqiAle2lkfQ== - - edit_item_title: !binary | - 16LXqNeZ15vXqiDXpNeo15nXmA== - - no_notes_available: !binary | - 15DXmdefINeb16jXkteiINek16rXp9eZ15XXqjog16DXmdeq158g15zXlNeV - 16HXmdejINek16rXp9eZ15XXqiDXnNek1rDWvNeo15XWudeZ1rbXp9aw15jX - mdedINeh16TXpteZ16TXmdeZ150g157Xotee15XXkyDXlNek1rDWvNeo15XW - udeZ1rbXp9aw15g= - - note_header: !binary | - 16TXqten15nXqiAle2lkfQ== - - delete_note_title: !binary | - 157Xl9eZ16fXqiDXlNek16rXp9eZ16ogJyV7aWR9Jw== - + delete_item_title: "מחיקת פריט" + in_project: "ב:" + show_note_title: "הצגת פתקית" + note_location_link: "בתוך:" + deleted_note: "הפתקית '%{id}' נמחקה" + delete_confirmation: "האם למחוק את הפתקית '%{id}'?" + delete_note_confirm: "האם למחוק את הפתקית '%{id}'?" + note_link_title: "הצגת פתקית %{id}" + edit_item_title: "עריכת פריט" + no_notes_available: "אין כרגע פתקיות: ניתן להוסיף פתקיות לפְּרוֹיֶקְטים ספציפיים מעמוד הפְּרוֹיֶקְט" + note_header: "פתקית %{id}" + delete_note_title: "מחיקת הפתקית '%{id}'" states: - stalled_plural: !binary | - 16LXpteV16jXmded - - visible_plural: !binary | - 15LXnNeV15nXmded - - hidden: !binary | - 157Xldeh16rXqNeZ150= - - review_plural: !binary | - 157XqteV15DXqNeb15nXnQ== - - completed_plural: !binary | - 15TXodeq15nXmdee15U= - - current_plural: !binary | - 157XoteV15PXm9eg15nXnQ== - - visible: !binary | - 15LXnNeV15k= - - completed: !binary | - 15TXodeq15nXmded - - hidden_plural: !binary | - 157Xldeh16rXqNeZ150= - - blocked_plural: !binary | - 15fXodeV157Xmded - - stalled: !binary | - 16DXotem16g= - - current: !binary | - 16LXk9eb16DXmQ== - - active_plural: !binary | - 16TXoteZ15zXmded - - active: !binary | - 16TXoteZ15w= - - review: !binary | - 157XqteV15DXqNea - - blocked: !binary | - 16DXl9eh150= - + stalled_plural: "עצורים" + visible_plural: "גלויים" + hidden: "מוסתרים" + review_plural: "מתוארכים" + completed_plural: "הסתיימו" + current_plural: "מעודכנים" + visible: "גלוי" + completed: "הסתיים" + hidden_plural: "מוסתרים" + blocked_plural: "חסומים" + stalled: "נעצר" + current: "עדכני" + active_plural: "פעילים" + active: "פעיל" + review: "מתוארך" + blocked: "נחסם" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 7206555d..54a0f98f 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -67,9 +67,7 @@ nl: currency: format: format: "%u %n" - unit: !binary | - 4oKs - + unit: "€" separator: "," delimiter: . common: @@ -776,7 +774,7 @@ nl: select: prompt: Selecteer will_paginate: - previous_label: "\xC2\xABVorige" + previous_label: "«Vorige" page_entries_info: multi_page: Toon %{model} %{from} - %{to} van %{count} in totaal single_page_html: @@ -789,7 +787,7 @@ nl: zero: Geen %{model} gevonden multi_page_html: Toon %{model} %{from} - %{to} van %{count} in totaal page_gap: "…" - next_label: "Volgende \xC2\xBB" + next_label: "Volgende »" dates: month_names: - Januari @@ -839,11 +837,11 @@ nl: rss_feed: RSS Feed choose_project: Kies het project waar je een feed van wilt all_projects: Alle projecten - project_needed: "Er moet ten minste \xC3\xA9\xC3\xA9n project zijn voor een feed opgevraagd kan worden" + project_needed: "Er moet ten minste één project zijn voor een feed opgevraagd kan worden" select_feed_for_project: Kies de feed voor dit project active_projects_wo_next: Actieve projecten zonder acties active_starred_actions: Alle gesterde, actieve acties - context_needed: "Er moet eerst ten minste \xC3\xA9\xC3\xA9n context zijn voor je een feed kan opvragen" + context_needed: "Er moet eerst ten minste één context zijn voor je een feed kan opvragen" select_feed_for_context: Kies de feed voor deze context projects_and_actions: Actieve projecten met hun acties notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld." From 883daa51685cf2b685606a6a9e59441e33fe8a2d Mon Sep 17 00:00:00 2001 From: Michael Witrant Date: Sat, 7 Jul 2012 22:19:03 +0200 Subject: [PATCH 18/41] fixed escaped inputs in new recurring todo form --- .../_recurring_todo_form.html.erb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/recurring_todos/_recurring_todo_form.html.erb b/app/views/recurring_todos/_recurring_todo_form.html.erb index cdbf9c2a..faee8b8b 100644 --- a/app/views/recurring_todos/_recurring_todo_form.html.erb +++ b/app/views/recurring_todos/_recurring_todo_form.html.erb @@ -35,17 +35,17 @@

<%= radio_button_tag('recurring_todo[ends_on]', 'no_end_date', true, {:tabindex => next_tab_index})%> <%= t('todos.recurrence.no_end_date') %>
- <%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', false, {:tabindex => next_tab_index})%> <%= t('todos.recurrence.ends_on_number_times', :number => text_field( :recurring_todo, :number_of_occurences, "size" => 3, "tabindex" => next_tab_index)) %>
- <%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', false, {:tabindex => next_tab_index})%> <%= t('todos.recurrence.ends_on_date', :date => text_field(:recurring_todo, :end_date, "size" => 12, "class" => "Date", "tabindex" => next_tab_index, "autocomplete" => "off", "value" => "")) %>
+ <%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', false, {:tabindex => next_tab_index})%> <%= raw t('todos.recurrence.ends_on_number_times', :number => text_field( :recurring_todo, :number_of_occurences, "size" => 3, "tabindex" => next_tab_index)) %>
+ <%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', false, {:tabindex => next_tab_index})%> <%= raw t('todos.recurrence.ends_on_date', :date => text_field(:recurring_todo, :end_date, "size" => 12, "class" => "Date", "tabindex" => next_tab_index, "autocomplete" => "off", "value" => "")) %>

- <%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', true, {:tabindex => next_tab_index})%> <%= t('todos.recurrence.daily_every_number_day', :number=> text_field_tag( 'recurring_todo[daily_every_x_days]', "1", {"size" => 3, "tabindex" => next_tab_index})) %>
+ <%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', true, {:tabindex => next_tab_index})%> <%= raw t('todos.recurrence.daily_every_number_day', :number=> text_field_tag( 'recurring_todo[daily_every_x_days]', "1", {"size" => 3, "tabindex" => next_tab_index})) %>
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_work_day', false, {:tabindex => next_tab_index})%> <%= t('todos.recurrence.every_work_day') %>
diff --git a/app/views/todos/_completed.html.erb b/app/views/todos/_completed.html.erb index b1a79823..354a03f6 100644 --- a/app/views/todos/_completed.html.erb +++ b/app/views/todos/_completed.html.erb @@ -8,7 +8,7 @@ <% if collapsible %> <%= image_tag("collapse.png") %> <% end %> - <%= t('todos.completed_actions') %> <%= suffix %> + <%= t('todos.completed_actions') %> <%= raw suffix %>
diff --git a/app/views/todos/_deferred.html.erb b/app/views/todos/_deferred.html.erb index fa060e64..cab8f027 100644 --- a/app/views/todos/_deferred.html.erb +++ b/app/views/todos/_deferred.html.erb @@ -3,7 +3,7 @@ <% if collapsible %> <%= image_tag("collapse.png") %> <% end %> - <%= t('todos.deferred_pending_actions') %> <%= append_descriptor ? append_descriptor : '' %> + <%= t('todos.deferred_pending_actions') %> <%= raw(append_descriptor ? append_descriptor : '') %>
diff --git a/app/views/todos/_hidden.html.erb b/app/views/todos/_hidden.html.erb index cedfb298..4f7e581f 100644 --- a/app/views/todos/_hidden.html.erb +++ b/app/views/todos/_hidden.html.erb @@ -3,7 +3,7 @@ <% if collapsible %> <%= image_tag("collapse.png") %> <% end %> - <%= t('todos.hidden_actions') %> <%= append_descriptor ? append_descriptor : '' %> + <%= t('todos.hidden_actions') %> <%= raw(append_descriptor ? append_descriptor : '') %>
diff --git a/config/cucumber.yml b/config/cucumber.yml index 645eff4e..710cc9ea 100644 --- a/config/cucumber.yml +++ b/config/cucumber.yml @@ -4,5 +4,5 @@ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'pr std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip" %> default: <%= std_opts %> features -wip: --tags @wip:10 --wip features +wip: --tags @wip:15 --wip features rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip diff --git a/config/routes.rb b/config/routes.rb index 3dc52191..1093319e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -71,6 +71,8 @@ Tracksapp::Application.routes.draw do match 'data' => "data#index" match 'data/csv_notes' => 'data#csv_notes' match 'data/yaml_export' => 'data#yaml_export' + match 'data/xml_export' => 'data#xml_export' + match 'data/csv_actions' => 'data#csv_actions' match 'integrations' => "integrations#index" match 'integrations/rest_api' => "integrations#rest_api", :as => 'rest_api_docs' @@ -151,6 +153,8 @@ Tracksapp::Application.routes.draw do end end match 'todos/tag/:name' => 'todos#tag', :as => :tag + match 'tags.autocomplete' => "todos#tags", :format => 'autocomplete' + match 'todos/done/tag/:name' => "todos#done_tag", :as => :done_tag match 'todos/all_done/tag/:name' => "todos#all_done_tag", :as => :all_done_tag match 'auto_complete_for_predecessor' => 'todos#auto_complete_for_predecessor' @@ -230,7 +234,6 @@ Tracksapp::Application.routes.draw do # todos.done_tag 'todos/done/tag/:name', :action => "done_tag" # todos.all_done_tag 'todos/all_done/tag/:name', :action => "all_done_tag" # - # todos.tags 'tags.autocomplete', :action => "tags", :format => 'autocomplete' # todos.auto_complete_for_predecessor 'auto_complete_for_predecessor', :action => 'auto_complete_for_predecessor' # # todos.calendar 'calendar.ics', :action => "calendar", :format => 'ics' diff --git a/features/edit_a_todo.feature b/features/edit_a_todo.feature index eeb5f05f..b68bcdaf 100644 --- a/features/edit_a_todo.feature +++ b/features/edit_a_todo.feature @@ -248,7 +248,6 @@ Feature: Edit a next action from every page Then I should see the todo "bla" And I should see the todo "bli" - @wip Scenario: Clicking a tag of a todo will go to that tag page Given I have a todo "tag you are it" in context "@tags" with tags "taga, tagb" When I go to the home page diff --git a/features/logging_in.feature b/features/logging_in.feature index fb22579b..2f2e86e3 100644 --- a/features/logging_in.feature +++ b/features/logging_in.feature @@ -50,7 +50,7 @@ Feature: Existing user logging in | "top secret" project for user "testuser" | "top secret" project for user "testuser" | Logout (Test User) | | context page for "@secret location" for user "testuser" | context page for "@secret location" for user "testuser" | Logout (Test User) | - @javascript @wip + @javascript Scenario: When session expires, you should be logged out When I go to the login page And I submit the login form as user "testuser" with password "secret" diff --git a/features/project_edit.feature b/features/project_edit.feature index b5c3b8c7..1420db21 100644 --- a/features/project_edit.feature +++ b/features/project_edit.feature @@ -101,7 +101,7 @@ Feature: Edit a project And I cancel adding a note to the project Then the form for adding a note should not be visible - @javascript @wip + @javascript Scenario: Long notes in a project are shown cut off Given I have a project called "test" When I go to the "test" project diff --git a/features/step_definitions/project_steps.rb b/features/step_definitions/project_steps.rb index a70f0b53..ab3ccc56 100644 --- a/features/step_definitions/project_steps.rb +++ b/features/step_definitions/project_steps.rb @@ -198,7 +198,11 @@ When /^I add a note "([^"]*)" to the project$/ do |note_body| page.should have_css "div.widgets button#submit_note" fill_in "note[body]", :with => note_body click_button "Add note" - page.should_not have_css "div.widgets button#submit_note" + + submit_button = "div.widgets button#submit_note" + elem = find(submit_button) + elem.should_not be_nil # form is hidden + elem.should_not be_visible end When /^I click on the first note icon$/ do diff --git a/features/step_definitions/todo_edit_steps.rb b/features/step_definitions/todo_edit_steps.rb index 6086892c..3d905495 100644 --- a/features/step_definitions/todo_edit_steps.rb +++ b/features/step_definitions/todo_edit_steps.rb @@ -173,7 +173,9 @@ When /^I edit the tags of "([^"]*)" to "([^"]*)"$/ do |action_description, tags| todo.should_not be_nil open_edit_form_for(todo) - fill_in "todo_tag_list", :with => tags + within "form#form_todo_#{todo.id}" do + fill_in "tag_list", :with => tags + end submit_edit_todo_form(todo) end diff --git a/features/view_done.feature b/features/view_done.feature index f74bc346..4834d212 100644 --- a/features/view_done.feature +++ b/features/view_done.feature @@ -181,7 +181,6 @@ Feature: Show done When I go to the projects page Then I should see "completed project" - @wip Scenario Outline: All pages are internationalized Given I set the locale to "" When I go to the From 48cc8740cb6e2906f533a2c7e0c78e7b6f268dc0 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 11 Jul 2012 16:25:24 +0200 Subject: [PATCH 23/41] fix #1303. Adding test for it. --- features/step_definitions/project_steps.rb | 8 ++++++++ features/tagging_todos.feature | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/features/step_definitions/project_steps.rb b/features/step_definitions/project_steps.rb index ab3ccc56..9ec49c8d 100644 --- a/features/step_definitions/project_steps.rb +++ b/features/step_definitions/project_steps.rb @@ -100,6 +100,14 @@ Given /^I have a project "([^\"]*)" with (.*) notes?$/ do |project_name, num| end end +Given /^the default tags for "(.*?)" are "(.*?)"$/ do |project_name, default_tags| + project = @current_user.projects.find_by_name(project_name) + project.should_not be_nil + + project.default_tags = default_tags + project.save! +end + When /^I open the project edit form$/ do click_link "link_edit_project_#{@project.id}" page.should have_css("button#submit_project_#{@project.id}", :visible => true) diff --git a/features/tagging_todos.feature b/features/tagging_todos.feature index d2371db3..d67d1973 100644 --- a/features/tagging_todos.feature +++ b/features/tagging_todos.feature @@ -77,6 +77,14 @@ Feature: Tagging todos When I submit a new action with description "are my tags prefilled" Then the tags of "are my tags prefilled" should be "tests" + @javascript + Scenario: Selecting a project with default tags when editing a todo will prefill the tags field + Given I have a todo "tag me" in the context "@pc" + And the default tags for "hacking tracks" are "TagA, TagB" + When I go to the "@pc" context + And I edit the project of "tag me" to "hacking tracks" + Then the tags of "tag me" should be "taga, tagb" + @javascript Scenario: If there are todos for a tag, when viewing the tag's page, the Tags field for new todos should be defaulted to that tag Given I have a todo "migrate old scripts" in context "@pc" with tags "starred" From f9dc8c6969e41682460c25d0225920c9b367e1b3 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 11 Jul 2012 16:46:18 +0200 Subject: [PATCH 24/41] fix #1296 by adding translate functions to mobile view of todo --- app/views/todos/show.m.erb | 18 +++++++++--------- config/locales/en.yml | 5 +++-- config/locales/nl.yml | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/views/todos/show.m.erb b/app/views/todos/show.m.erb index 73794a79..30275735 100644 --- a/app/views/todos/show.m.erb +++ b/app/views/todos/show.m.erb @@ -1,39 +1,39 @@ -

Description

+

<%= t('common.description') %>

<%= @todo.description %>
-

Actions

+

<%= t('common.actions') %>

- +
- +
- +
- +
- +
- +
- +
diff --git a/config/locales/en.yml b/config/locales/en.yml index ba8047c3..64a87ee7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -359,7 +359,7 @@ en: action_selection_title: TRACKS::Action selection todos: show_from: Show from - error_starring_recurring: Could not toggle the star of recurring todo \'%{description}\' + error_starring_recurring: "Could not toggle the star of recurring todo \'%{description}\'" recurring_action_deleted: Action was deleted. Because this action is recurring, a new action was added completed_actions: Completed actions completed_recurring: Completed recurring todos @@ -371,7 +371,7 @@ en: defer_date_after_due_date: Defer date is after due date. Please edit and adjust due date before deferring. unable_to_add_dependency: Unable to add dependency done: Done? - star_action_with_description: star the action '%{description}' + star_action_with_description: "star the action '%{description}'" tagged_with: tagged with ‘%{tag_name}’ completed: Completed no_deferred_actions_with: No deferred actions with the tag '%{tag_name}' @@ -501,6 +501,7 @@ en: show_tomorrow: Show Tomorrow tagged_page_title: TRACKS::Tagged with '%{tag_name}' action_deferred: The action '%{description}' was deferred + mark_complete: Mark complete recurrence: ends_on_number_times: Ends after %{number} times ends_on_date: Ends on %{date} diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 54a0f98f..348568db 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -347,6 +347,7 @@ nl: totals_hidden_project_count: "%{count} zijn verborgen" time_of_day: Tijd van de dag (alle acties) todos: + mark_complete: Markeer gereed recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd show_from: Toon vanaf error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omzetten \'%{description}\' From 9af3dee277bed75c189766b17fe64981e62329eb Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Thu, 12 Jul 2012 11:17:08 +0200 Subject: [PATCH 25/41] remove backup files from rails2 - rails3 migration --- backup.rails2.3/Gemfile.rails2.3 | 65 -- backup.rails2.3/Gemfile.rails3 | 39 -- backup.rails2.3/app/apis/todo_api.rb | 22 - backup.rails2.3/application_helper.rb.rails2 | 301 --------- backup.rails2.3/backend_controller.rb | 73 --- backup.rails2.3/database.yml.rails2 | 37 -- backup.rails2.3/development.rb.rails2 | 19 - backup.rails2.3/env.rb | 70 --- backup.rails2.3/environment.rb.rails2 | 119 ---- backup.rails2.3/hoverIntent.js | 84 --- backup.rails2.3/lib/assets/.gitkeep | 0 .../lib/authenticated_test_helper.rb | 113 ---- backup.rails2.3/lib/login_system.rb | 222 ------- backup.rails2.3/lib/name_part_finder.rb | 5 - backup.rails2.3/lib/tagging_extensions.rb | 200 ------ backup.rails2.3/lib/tasks/.gitkeep | 0 .../lib/tasks/cucumber-tracks.rake | 38 -- backup.rails2.3/lib/tasks/cucumber.rake | 53 -- backup.rails2.3/lib/tasks/database.rake | 27 - .../lib/tasks/extract_fixtures.rake | 17 - backup.rails2.3/lib/tasks/gems.rake | 34 -- .../lib/tasks/load_exported_fixtures.rake | 8 - .../lib/tasks/query_trace_toggle.rake | 50 -- backup.rails2.3/lib/tasks/reset_password.rake | 23 - backup.rails2.3/lib/tasks/rspec.rake | 144 ----- backup.rails2.3/lib/tasks/setup_tracks.rake | 15 - .../lib/tasks/upgrade_sqlite_db.rake | 40 -- backup.rails2.3/lib/tracks/config.rb | 27 - backup.rails2.3/lib/tracks/source_view.rb | 68 --- backup.rails2.3/lib/tracks/todo_list.rb | 59 -- backup.rails2.3/mongrel_workaround.rb | 107 ---- backup.rails2.3/new_rails_defaults.rb | 21 - .../plugins/extra_validations/init.rb | 2 - .../lib/extra_validations.rb | 29 - .../plugins/open_id_authentication/CHANGELOG | 35 -- .../plugins/open_id_authentication/README | 231 ------- .../plugins/open_id_authentication/Rakefile | 22 - ...open_id_authentication_tables_generator.rb | 11 - .../templates/migration.rb | 20 - .../templates/migration.rb | 26 - ...open_id_authentication_tables_generator.rb | 11 - .../plugins/open_id_authentication/init.rb | 18 - .../lib/open_id_authentication.rb | 240 -------- .../lib/open_id_authentication/association.rb | 9 - .../lib/open_id_authentication/db_store.rb | 55 -- .../lib/open_id_authentication/nonce.rb | 5 - .../lib/open_id_authentication/request.rb | 23 - .../open_id_authentication/timeout_fixes.rb | 20 - .../tasks/open_id_authentication_tasks.rake | 30 - .../test/normalize_test.rb | 32 - .../test/open_id_authentication_test.rb | 46 -- .../test/status_test.rb | 14 - .../test/test_helper.rb | 17 - .../plugins/resource_feeder/README | 7 - .../plugins/resource_feeder/Rakefile | 22 - .../plugins/resource_feeder/init.rb | 2 - .../resource_feeder/lib/resource_feeder.rb | 2 - .../lib/resource_feeder/atom.rb | 67 -- .../lib/resource_feeder/common.rb | 24 - .../lib/resource_feeder/rss.rb | 68 --- .../resource_feeder/test/atom_feed_test.rb | 85 --- .../resource_feeder/test/rss_feed_test.rb | 86 --- .../resource_feeder/test/test_helper.rb | 64 -- .../plugins/simple_ldap_authenticator/README | 5 - .../simple_ldap_authenticator/Rakefile | 22 - .../plugins/simple_ldap_authenticator/init.rb | 2 - .../simple_ldap_authenticator/install.rb | 1 - .../lib/simple_ldap_authenticator.rb | 127 ---- .../simple_ldap_authenticator_tasks.rake | 4 - .../test/simple_ldap_authenticator_test.rb | 8 - .../plugins/skinny_spec/.gitignore | 2 - .../plugins/skinny_spec/README.rdoc | 270 -------- backup.rails2.3/plugins/skinny_spec/Rakefile | 11 - .../additional/helper_overrides.txt | 58 -- .../skinny_scaffold_generator.rb | 102 ---- .../skinny_scaffold/templates/controller.rb | 105 ---- .../templates/controller_spec.rb | 93 --- .../skinny_scaffold/templates/form.html.erb | 25 - .../skinny_scaffold/templates/form.html.haml | 18 - .../templates/form.html_spec.rb | 40 -- .../skinny_scaffold/templates/helper.rb | 2 - .../skinny_scaffold/templates/helper_spec.rb | 5 - .../skinny_scaffold/templates/index.html.erb | 31 - .../skinny_scaffold/templates/index.html.haml | 23 - .../templates/index.html_spec.rb | 15 - .../templates/index_partial.html.erb | 12 - .../templates/index_partial.html.haml | 11 - .../templates/index_partial.html_spec.rb | 31 - .../skinny_scaffold/templates/migration.rb | 14 - .../skinny_scaffold/templates/model.rb | 2 - .../skinny_scaffold/templates/model_spec.rb | 25 - .../skinny_scaffold/templates/show.html.erb | 15 - .../skinny_scaffold/templates/show.html.haml | 13 - .../templates/show.html_spec.rb | 31 - .../lib/lucky_sneaks/common_spec_helpers.rb | 83 --- .../controller_request_helpers.rb | 67 -- .../lucky_sneaks/controller_spec_helpers.rb | 571 ----------------- .../lucky_sneaks/controller_stub_helpers.rb | 238 -------- .../lib/lucky_sneaks/model_spec_helpers.rb | 496 --------------- .../lib/lucky_sneaks/view_spec_helpers.rb | 577 ------------------ .../lib/lucky_sneaks/view_stub_helpers.rb | 15 - .../plugins/skinny_spec/lib/skinny_spec.rb | 26 - backup.rails2.3/plugins/swf_fu/CHANGELOG.rdoc | 46 -- .../plugins/swf_fu/FLASH_OBJECT.rdoc | 31 - backup.rails2.3/plugins/swf_fu/LICENSE | 29 - backup.rails2.3/plugins/swf_fu/README.rdoc | 92 --- backup.rails2.3/plugins/swf_fu/Rakefile | 22 - .../swf_fu/assets/javascripts/swfobject.js | 4 - .../swf_fu/assets/swfs/expressInstall.swf | Bin 727 -> 0 bytes backup.rails2.3/plugins/swf_fu/init.rb | 14 - backup.rails2.3/plugins/swf_fu/install.rb | 24 - .../helpers/asset_tag_helper/swf_asset.rb | 61 -- .../lib/action_view/helpers/swf_fu_helper.rb | 197 ------ .../plugins/swf_fu/test/results.rb | 42 -- .../plugins/swf_fu/test/swf_fu_test.rb | 159 ----- .../plugins/swf_fu/test/test_helper.rb | 20 - backup.rails2.3/plugins/swf_fu/uninstall.rb | 6 - backup.rails2.3/plugins/translate/MIT-LICENSE | 20 - backup.rails2.3/plugins/translate/README | 63 -- backup.rails2.3/plugins/translate/Rakefile | 11 - backup.rails2.3/plugins/translate/init.rb | 8 - .../plugins/translate/lib/translate.rb | 8 - .../plugins/translate/lib/translate/file.rb | 35 -- .../plugins/translate/lib/translate/keys.rb | 152 ----- .../plugins/translate/lib/translate/log.rb | 35 -- .../plugins/translate/lib/translate/routes.rb | 11 - .../translate/lib/translate/storage.rb | 28 - .../translate/lib/translate_controller.rb | 165 ----- .../plugins/translate/lib/translate_helper.rb | 45 -- .../controllers/translate_controller_spec.rb | 129 ---- .../plugins/translate/spec/file_spec.rb | 54 -- .../files/translate/app/models/article.rb | 12 - .../files/translate/app/views/category.erb | 1 - .../files/translate/app/views/category.html | 1 - .../translate/app/views/category.html.erb | 1 - .../files/translate/app/views/category.rhtml | 5 - .../public/javascripts/application.js | 1 - .../plugins/translate/spec/keys_spec.rb | 179 ------ .../plugins/translate/spec/log_spec.rb | 47 -- .../plugins/translate/spec/spec_helper.rb | 11 - .../plugins/translate/spec/storage_spec.rb | 33 - .../plugins/translate/tasks/translate.rake | 178 ------ .../translate/views/layouts/translate.rhtml | 359 ----------- .../views/translate/_pagination.rhtml | 24 - .../translate/views/translate/index.rhtml | 114 ---- backup.rails2.3/production.rb.rails2 | 17 - backup.rails2.3/routes.rb.rails2 | 113 ---- backup.rails2.3/slider.js | 283 --------- .../controllers/projects_controller_spec.rb | 21 - .../spec/controllers/todos_controller_spec.rb | 4 - backup.rails2.3/spec/factories/factories.rb | 26 - backup.rails2.3/spec/fixtures/contexts.yml | 22 - backup.rails2.3/spec/fixtures/preferences.yml | 34 -- backup.rails2.3/spec/fixtures/todos.yml | 68 --- backup.rails2.3/spec/fixtures/users.yml | 27 - backup.rails2.3/spec/models/context_spec.rb | 100 --- .../spec/models/message_gateway_spec.rb | 29 - backup.rails2.3/spec/models/todo_spec.rb | 182 ------ backup.rails2.3/spec/models/user_spec.rb | 168 ----- backup.rails2.3/spec/rcov.opts | 2 - backup.rails2.3/spec/spec.opts | 4 - backup.rails2.3/spec/spec_helper.rb | 52 -- .../spec/support/should_validate_length_of.rb | 25 - .../views/login/login_mobile.html.erb_spec.rb | 9 - .../spec/views/notes/_notes.rhtml_spec.rb | 39 -- backup.rails2.3/test_helper.rb.rails2 | 152 ----- .../test_views/views/context_helper_test.rb | 7 - .../test_views/views/todos_helper_test.rb | 98 --- 168 files changed, 10578 deletions(-) delete mode 100644 backup.rails2.3/Gemfile.rails2.3 delete mode 100644 backup.rails2.3/Gemfile.rails3 delete mode 100644 backup.rails2.3/app/apis/todo_api.rb delete mode 100644 backup.rails2.3/application_helper.rb.rails2 delete mode 100644 backup.rails2.3/backend_controller.rb delete mode 100644 backup.rails2.3/database.yml.rails2 delete mode 100644 backup.rails2.3/development.rb.rails2 delete mode 100644 backup.rails2.3/env.rb delete mode 100644 backup.rails2.3/environment.rb.rails2 delete mode 100644 backup.rails2.3/hoverIntent.js delete mode 100644 backup.rails2.3/lib/assets/.gitkeep delete mode 100644 backup.rails2.3/lib/authenticated_test_helper.rb delete mode 100644 backup.rails2.3/lib/login_system.rb delete mode 100644 backup.rails2.3/lib/name_part_finder.rb delete mode 100644 backup.rails2.3/lib/tagging_extensions.rb delete mode 100644 backup.rails2.3/lib/tasks/.gitkeep delete mode 100644 backup.rails2.3/lib/tasks/cucumber-tracks.rake delete mode 100644 backup.rails2.3/lib/tasks/cucumber.rake delete mode 100644 backup.rails2.3/lib/tasks/database.rake delete mode 100644 backup.rails2.3/lib/tasks/extract_fixtures.rake delete mode 100644 backup.rails2.3/lib/tasks/gems.rake delete mode 100644 backup.rails2.3/lib/tasks/load_exported_fixtures.rake delete mode 100644 backup.rails2.3/lib/tasks/query_trace_toggle.rake delete mode 100644 backup.rails2.3/lib/tasks/reset_password.rake delete mode 100644 backup.rails2.3/lib/tasks/rspec.rake delete mode 100644 backup.rails2.3/lib/tasks/setup_tracks.rake delete mode 100644 backup.rails2.3/lib/tasks/upgrade_sqlite_db.rake delete mode 100644 backup.rails2.3/lib/tracks/config.rb delete mode 100644 backup.rails2.3/lib/tracks/source_view.rb delete mode 100644 backup.rails2.3/lib/tracks/todo_list.rb delete mode 100644 backup.rails2.3/mongrel_workaround.rb delete mode 100644 backup.rails2.3/new_rails_defaults.rb delete mode 100644 backup.rails2.3/plugins/extra_validations/init.rb delete mode 100644 backup.rails2.3/plugins/extra_validations/lib/extra_validations.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/CHANGELOG delete mode 100644 backup.rails2.3/plugins/open_id_authentication/README delete mode 100644 backup.rails2.3/plugins/open_id_authentication/Rakefile delete mode 100644 backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/open_id_authentication_tables_generator.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/migration.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/migration.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/upgrade_open_id_authentication_tables_generator.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/init.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/association.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/db_store.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/nonce.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/request.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/timeout_fixes.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake delete mode 100644 backup.rails2.3/plugins/open_id_authentication/test/normalize_test.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/test/open_id_authentication_test.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/test/status_test.rb delete mode 100644 backup.rails2.3/plugins/open_id_authentication/test/test_helper.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/README delete mode 100644 backup.rails2.3/plugins/resource_feeder/Rakefile delete mode 100644 backup.rails2.3/plugins/resource_feeder/init.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/lib/resource_feeder.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/atom.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/common.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/rss.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/test/atom_feed_test.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/test/rss_feed_test.rb delete mode 100644 backup.rails2.3/plugins/resource_feeder/test/test_helper.rb delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/README delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/Rakefile delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/init.rb delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/install.rb delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/lib/simple_ldap_authenticator.rb delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/tasks/simple_ldap_authenticator_tasks.rake delete mode 100644 backup.rails2.3/plugins/simple_ldap_authenticator/test/simple_ldap_authenticator_test.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/.gitignore delete mode 100644 backup.rails2.3/plugins/skinny_spec/README.rdoc delete mode 100644 backup.rails2.3/plugins/skinny_spec/Rakefile delete mode 100644 backup.rails2.3/plugins/skinny_spec/additional/helper_overrides.txt delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/skinny_scaffold_generator.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.erb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.haml delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.erb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.haml delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.erb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.haml delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/migration.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.erb delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.haml delete mode 100644 backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html_spec.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/common_spec_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_request_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_spec_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_stub_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/model_spec_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_spec_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_stub_helpers.rb delete mode 100644 backup.rails2.3/plugins/skinny_spec/lib/skinny_spec.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/CHANGELOG.rdoc delete mode 100644 backup.rails2.3/plugins/swf_fu/FLASH_OBJECT.rdoc delete mode 100644 backup.rails2.3/plugins/swf_fu/LICENSE delete mode 100644 backup.rails2.3/plugins/swf_fu/README.rdoc delete mode 100644 backup.rails2.3/plugins/swf_fu/Rakefile delete mode 100644 backup.rails2.3/plugins/swf_fu/assets/javascripts/swfobject.js delete mode 100755 backup.rails2.3/plugins/swf_fu/assets/swfs/expressInstall.swf delete mode 100644 backup.rails2.3/plugins/swf_fu/init.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/install.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/asset_tag_helper/swf_asset.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/swf_fu_helper.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/test/results.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/test/swf_fu_test.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/test/test_helper.rb delete mode 100644 backup.rails2.3/plugins/swf_fu/uninstall.rb delete mode 100644 backup.rails2.3/plugins/translate/MIT-LICENSE delete mode 100644 backup.rails2.3/plugins/translate/README delete mode 100644 backup.rails2.3/plugins/translate/Rakefile delete mode 100644 backup.rails2.3/plugins/translate/init.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate/file.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate/keys.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate/log.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate/routes.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate/storage.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate_controller.rb delete mode 100644 backup.rails2.3/plugins/translate/lib/translate_helper.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/controllers/translate_controller_spec.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/file_spec.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/app/models/article.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.erb delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html.erb delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.rhtml delete mode 100644 backup.rails2.3/plugins/translate/spec/files/translate/public/javascripts/application.js delete mode 100644 backup.rails2.3/plugins/translate/spec/keys_spec.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/log_spec.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/spec_helper.rb delete mode 100644 backup.rails2.3/plugins/translate/spec/storage_spec.rb delete mode 100644 backup.rails2.3/plugins/translate/tasks/translate.rake delete mode 100644 backup.rails2.3/plugins/translate/views/layouts/translate.rhtml delete mode 100644 backup.rails2.3/plugins/translate/views/translate/_pagination.rhtml delete mode 100644 backup.rails2.3/plugins/translate/views/translate/index.rhtml delete mode 100644 backup.rails2.3/production.rb.rails2 delete mode 100644 backup.rails2.3/routes.rb.rails2 delete mode 100644 backup.rails2.3/slider.js delete mode 100644 backup.rails2.3/spec/controllers/projects_controller_spec.rb delete mode 100644 backup.rails2.3/spec/controllers/todos_controller_spec.rb delete mode 100644 backup.rails2.3/spec/factories/factories.rb delete mode 100644 backup.rails2.3/spec/fixtures/contexts.yml delete mode 100644 backup.rails2.3/spec/fixtures/preferences.yml delete mode 100644 backup.rails2.3/spec/fixtures/todos.yml delete mode 100644 backup.rails2.3/spec/fixtures/users.yml delete mode 100644 backup.rails2.3/spec/models/context_spec.rb delete mode 100644 backup.rails2.3/spec/models/message_gateway_spec.rb delete mode 100644 backup.rails2.3/spec/models/todo_spec.rb delete mode 100644 backup.rails2.3/spec/models/user_spec.rb delete mode 100644 backup.rails2.3/spec/rcov.opts delete mode 100644 backup.rails2.3/spec/spec.opts delete mode 100644 backup.rails2.3/spec/spec_helper.rb delete mode 100644 backup.rails2.3/spec/support/should_validate_length_of.rb delete mode 100644 backup.rails2.3/spec/views/login/login_mobile.html.erb_spec.rb delete mode 100644 backup.rails2.3/spec/views/notes/_notes.rhtml_spec.rb delete mode 100644 backup.rails2.3/test_helper.rb.rails2 delete mode 100644 backup.rails2.3/test_views/views/context_helper_test.rb delete mode 100644 backup.rails2.3/test_views/views/todos_helper_test.rb diff --git a/backup.rails2.3/Gemfile.rails2.3 b/backup.rails2.3/Gemfile.rails2.3 deleted file mode 100644 index dc3af876..00000000 --- a/backup.rails2.3/Gemfile.rails2.3 +++ /dev/null @@ -1,65 +0,0 @@ -source :gemcutter -source "http://gems.github.com/" - -gem "rake", "~>0.8.7" -gem "rails", "~>2.3.12" -gem "highline", "~>1.5.0" -gem "RedCloth", "4.2.8" -gem "sanitize", "~>1.2.1" -gem "rack", "1.1.0" -gem "will_paginate", "~> 2.3.15" -gem "has_many_polymorphs", "~> 2.13" -gem "acts_as_list", "~>0.1.4" -gem "aasm", "~>2.2.0" -gem "rubyjedi-actionwebservice", :require => "actionwebservice" -gem "rubycas-client", "~>2.2.1" -gem "ruby-openid", :require => "openid" - -# you may comment out the database driver you will not be using. -# This will prevent a native build of the driver. Building native drivers is not always possible on all hosters -gem "sqlite3" -gem "mysql" - -gem 'bcrypt-ruby', '~> 2.1.4' -gem 'htmlentities', '~> 4.3.0' -gem "mail" - -if RUBY_VERSION.to_f >= 1.9 - gem "soap4r-ruby1.9" -else - gem "soap4r", "~>1.5.8" -end - -group :development do - if RUBY_VERSION.to_f >= 1.9 - gem "ruby-debug19" - gem "mongrel", "1.2.0.pre2" - else - gem "ruby-debug" - gem "mongrel" - end - gem "yard" -end - -group :test do - gem "test-unit", "1.2.3" - gem "flexmock" - gem "ZenTest", ">=4.0.0" - gem "hpricot" - gem "hoe" - gem "rspec-rails", "~>1.3.3" - gem "thoughtbot-factory_girl" - gem 'memory_test_fix', '~>0.1.3' - gem "capybara", ">=0.3.5" - gem "selenium-webdriver" # Note that > 2.14 has problems: https://code.google.com/p/selenium/issues/detail?id=3075 - gem "database_cleaner", ">=0.5.0" - gem "cucumber-rails", "~>0.3.2" - gem "aruba", "0.2.2", :path => "vendor/gems/aruba-0.2.2" - - # uncomment to use the webkit option. This depends on Qt to be installed - #gem "capybara-webkit" - - # uncomment to be able to make screenshots from scenarios - #gem "capybara-screenshot" - #gem "launchy" -end diff --git a/backup.rails2.3/Gemfile.rails3 b/backup.rails2.3/Gemfile.rails3 deleted file mode 100644 index c07b2b6a..00000000 --- a/backup.rails2.3/Gemfile.rails3 +++ /dev/null @@ -1,39 +0,0 @@ -source 'https://rubygems.org' - -gem 'rails', '3.2.3' - -# Bundle edge Rails instead: -# gem 'rails', :git => 'git://github.com/rails/rails.git' - -gem 'sqlite3' -gem 'mysql' - - -# Gems used only for assets and not required -# in production environments by default. -group :assets do - gem 'sass-rails', '~> 3.2.3' - gem 'coffee-rails', '~> 3.2.1' - - # See https://github.com/sstephenson/execjs#readme for more supported runtimes - # gem 'therubyracer', :platform => :ruby - - gem 'uglifier', '>= 1.0.3' -end - -gem 'jquery-rails' - -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' - -# To use Jbuilder templates for JSON -# gem 'jbuilder' - -# Use unicorn as the app server -# gem 'unicorn' - -# Deploy with Capistrano -# gem 'capistrano' - -# To use debugger -# gem 'ruby-debug19', :require => 'ruby-debug' diff --git a/backup.rails2.3/app/apis/todo_api.rb b/backup.rails2.3/app/apis/todo_api.rb deleted file mode 100644 index 5f980a64..00000000 --- a/backup.rails2.3/app/apis/todo_api.rb +++ /dev/null @@ -1,22 +0,0 @@ -class TodoApi < ActionWebService::API::Base - api_method :new_todo, - :expects => [{:username => :string}, {:token => :string}, {:context_id => :int}, {:description => :string}, {:notes => :string}], - :returns => [:int] - - api_method :new_todo_for_project, - :expects => [{:username => :string}, {:token => :string}, {:context_id => :int}, {:project_id => :int}, {:description => :string}, {:notes => :string}], - :returns => [:int] - - api_method :new_rich_todo, - :expects => [{:username => :string}, {:token => :string}, {:default_context_id => :int}, {:description => :string}, {:notes => :string}], - :returns => [:int] - - api_method :list_contexts, - :expects => [{:username => :string}, {:token => :string}], - :returns => [[Context]] - - api_method :list_projects, - :expects => [{:username => :string}, {:token => :string}], - :returns => [[Project]] - -end diff --git a/backup.rails2.3/application_helper.rb.rails2 b/backup.rails2.3/application_helper.rb.rails2 deleted file mode 100644 index 39c591e4..00000000 --- a/backup.rails2.3/application_helper.rb.rails2 +++ /dev/null @@ -1,301 +0,0 @@ -# The methods added to this helper will be available to all templates in the -# application. -module ApplicationHelper - - # Replicates the link_to method but also checks request.request_uri to find - # current page. If that matches the url, the link is marked id = "current" - # - def navigation_link(name, options = {}, html_options = nil, *parameters_for_method_reference) - if html_options - html_options = html_options.stringify_keys - convert_options_to_javascript!(html_options) - tag_options = tag_options(html_options) - else - tag_options = nil - end - url = options.is_a?(String) ? options : self.url_for(options, *parameters_for_method_reference) - id_tag = (request.request_uri == url) ? " id=\"current\"" : "" - - "#{name || url}" - end - - def days_from_today(date) - date.in_time_zone.to_date - current_user.time.to_date - end - - # Check due date in comparison to today's date Flag up date appropriately with - # a 'traffic light' colour code - # - def due_date(due) - return "" if due.nil? - - days = days_from_today(due) - - colors = ['amber','amber','orange','orange','orange','orange','orange','orange'] - color = :red if days < 0 - color = :green if days > 7 - color = colors[days] if color.nil? - - return content_tag(:a, {:title => format_date(due)}) { - content_tag(:span, {:class => color}) { - case days - when 0 - t('todos.next_actions_due_date.due_today') - when 1 - t('todos.next_actions_due_date.due_tomorrow') - when 2..7 - if prefs.due_style == Preference.due_styles[:due_on] - # TODO: internationalize strftime here - t('models.preference.due_on', :date => due.strftime("%A")) - else - t('models.preference.due_in', :days => days) - end - else - # overdue or due very soon! sound the alarm! - if days == -1 - t('todos.next_actions_due_date.overdue_by', :days => days * -1) - elsif days < -1 - t('todos.next_actions_due_date.overdue_by_plural', :days => days * -1) - else - # more than a week away - relax - t('models.preference.due_in', :days => days) - end - end - } - } - end - - # Check due date in comparison to today's date Flag up date appropriately with - # a 'traffic light' colour code Modified method for mobile screen - # - def due_date_mobile(due) - if due == nil - return "" - end - - days = days_from_today(due) - - case days - when 0 - ""+ format_date(due) + "" - when 1 - "" + format_date(due) + "" - # due 2-7 days away - when 2..7 - "" + format_date(due) + "" - else - # overdue or due very soon! sound the alarm! - if days < 0 - "" + format_date(due) +"" - else - # more than a week away - relax - "" + format_date(due) + "" - end - end - end - - # Returns a count of next actions in the given context or project. The result - # is count and a string descriptor, correctly pluralised if there are no - # actions or multiple actions - # - def count_undone_todos_phrase(todos_parent, string="actions") - @controller.count_undone_todos_phrase(todos_parent, string) - end - - def count_undone_todos_phrase_text(todos_parent, string="actions") - count_undone_todos_phrase(todos_parent, string).gsub(" "," ") - end - - def count_undone_todos_and_notes_phrase(project, string="actions") - s = count_undone_todos_phrase(project, string) - s += ", #{pluralize(project.note_count, 'note')}" unless project.note_count == 0 - s - end - - def link_to_context(context, descriptor = sanitize(context.name)) - link_to( descriptor, context, :title => "View context: #{context.name}" ) - end - - def link_to_project(project, descriptor = sanitize(project.name)) - link_to( descriptor, project, :title => "View project: #{project.name}" ) - end - - def link_to_edit_note (note, descriptor = sanitize(note.id.to_s)) - link_to(descriptor, - url_for({:controller => 'notes', :action => 'edit', :id => note.id}), - {:id => "link_edit_#{dom_id(note)}", :class => "note_edit_settings"}) - end - - def link_to_project_mobile(project, accesskey, descriptor = sanitize(project.name)) - link_to( descriptor, project_path(project, :format => 'm'), {:title => "View project: #{project.name}", :accesskey => accesskey} ) - end - - def item_link_to_context(item) - descriptor = "[C]" - descriptor = "[#{item.context.name}]" if prefs.verbose_action_descriptors - link_to_context( item.context, descriptor ) - end - - def item_link_to_project(item) - descriptor = "[P]" - descriptor = "[#{item.project.name}]" if prefs.verbose_action_descriptors - link_to_project( item.project, descriptor ) - end - - def render_flash - render :partial => 'shared/flash', :object => flash - end - - def recurrence_time_span(rt) - case rt.ends_on - when "no_end_date" - return rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from) - when "ends_on_number_of_times" - return I18n.t("todos.recurrence.pattern.times", :number => rt.number_of_occurences) - when "ends_on_end_date" - starts = rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from) - ends = rt.end_date.nil? ? "" : " " + I18n.t("todos.recurrence.pattern.until") + " " + format_date(rt.end_date) - return starts+ends - else - raise Exception.new, "unknown recurrence time span selection (#{rt.ends_on})" - end - end - - def recurrence_pattern_as_text(recurring_todo) - rt = recurring_todo.recurring_target_as_text - rp = recurring_todo.recurrence_pattern - # only add space if recurrence_pattern has content - rp = " " + rp if !rp.nil? - rts = recurrence_time_span(recurring_todo) - # only add space if recurrence_time_span has content - rts = " " + rts if !(rts == "") - return rt+rp+rts - end - - def date_format_for_date_picker() - standard_format = current_user.prefs.date_format - translations = [ - ['%m', 'mm'], - ['%b', 'M'], - ['%B', 'MM'], - ['%d', 'dd'], - ['%a', 'D'], - ['%A', 'DD'], - ['%y', 'y'], - ['%Y', 'yy'] - ] - translations.inject(standard_format) do |str, translation| - str.gsub(*translation) - end - end - - AUTO_LINK_MESSAGE_RE = %r{message://<[^>]+>} unless const_defined?(:AUTO_LINK_MESSAGE_RE) - - # Converts message:// links to href. This URL scheme is used on Mac OS X - # to link to a mail message in Mail.app. - def auto_link_message(text) - text.gsub(AUTO_LINK_MESSAGE_RE) do - href = $& - left, right = $`, $' - # detect already linked URLs and URLs in the middle of a tag - if left =~ /<[^>]+$/ && right =~ /^[^>]*>/ - # do not change string; URL is alreay linked - href - else - content = content_tag(:a, h(href), :href => h(href)) - end - end - end - - def format_note(note) - note = auto_link_message(note) - note = markdown(note) - note = auto_link(note, :link => :urls) - - # add onenote and message protocols - Sanitize::Config::RELAXED[:protocols]['a']['href'] << 'onenote' - Sanitize::Config::RELAXED[:protocols]['a']['href'] << 'message' - - note = Sanitize.clean(note, Sanitize::Config::RELAXED) - return note - end - - def sidebar_html_for_titled_list (list, title) - return content_tag(:h3, title+" (#{list.length})") + - content_tag(:ul, sidebar_html_for_list(list)) - end - - def sidebar_html_for_list(list) - if list.empty? - return content_tag(:li, t('sidebar.list_empty')) - else - return list.inject("") do |html, item| - link = (item.class == "Project") ? link_to_project( item ) : link_to_context(item) - html << content_tag(:li, link + " (" + count_undone_todos_phrase(item,"actions")+")") - end - end - end - - def generate_i18n_strings - js = "i18n_locale='#{I18n.locale}';\n" - js << "i18n = new Array();\n" - %w{ - shared.toggle_multi shared.toggle_multi_title - shared.hide_form shared.hide_action_form_title - shared.toggle_single shared.toggle_single_title - projects.hide_form projects.hide_form_title - projects.show_form projects.show_form_title - contexts.hide_form contexts.hide_form_title - contexts.show_form contexts.show_form_title - contexts.new_context_pre contexts.new_context_post - common.cancel common.ok - common.ajaxError todos.unresolved_dependency - }.each do |s| - js << "i18n['#{s}'] = '#{ t(s).gsub(/'/, "\\\\'") }';\n" - end - return js - end - - def javascript_tag_for_i18n_datepicker - locale = I18n.locale - # do not include en as locale since this the available by default - if locale and locale != :en - javascript_include_tag("i18n/jquery.ui.datepicker-#{locale}.js") - end - end - - def determine_done_path - case @controller.controller_name - when "contexts" - done_todos_context_path(@context) - when "projects" - done_todos_project_path(@project) - when "todos" - if source_view_is(:tag) - done_tag_path(@tag_name) - else - done_todos_path - end - else - done_todos_path - end - end - - def determine_all_done_path - case @controller.controller_name - when "contexts" - all_done_todos_context_path(@context) - when "projects" - all_done_todos_project_path(@project) - when "todos" - if source_view_is(:tag) - all_done_tag_path(@tag_name) - else - all_done_todos_path - end - else - all_done_todos_path - end - end - -end diff --git a/backup.rails2.3/backend_controller.rb b/backup.rails2.3/backend_controller.rb deleted file mode 100644 index 0f84c649..00000000 --- a/backup.rails2.3/backend_controller.rb +++ /dev/null @@ -1,73 +0,0 @@ -class CannotAccessContext < RuntimeError; end - -class BackendController < ApplicationController - acts_as_web_service - wsdl_service_name 'Backend' - web_service_api TodoApi - web_service_scaffold :invoke - skip_before_filter :login_required - - - def new_todo(username, token, context_id, description, notes) - check_token(username, token) - check_context_belongs_to_user(context_id) - item = create_todo(description, context_id, nil, notes) - item.id - end - - def new_todo_for_project(username, token, context_id, project_id, description, notes) - check_token(username, token) - check_context_belongs_to_user(context_id) - item = create_todo(description, context_id, project_id, notes) - item.id - end - - def new_rich_todo(username, token, default_context_id, description, notes) - check_token(username,token) - item = Todo.from_rich_message(@user, default_context_id, description, notes) - item.save - raise item.errors.full_messages.to_s if item.new_record? - item.id - end - - def list_contexts(username, token) - check_token(username, token) - - @user.contexts - end - - def list_projects(username, token) - check_token(username, token) - - @user.projects - end - - private - - # Check whether the token in the URL matches the token in the User's table - def check_token(username, token) - @user = User.find_by_login( username ) - unless (token == @user.token) - raise(InvalidToken, "Sorry, you don't have permission to perform this action.") - end - end - - def check_context_belongs_to_user(context_id) - unless @user.contexts.exists? context_id - raise(CannotAccessContext, "Cannot access a context that does not belong to this user.") - end - end - - def create_todo(description, context_id, project_id = nil, notes="") - item = @user.todos.build - item.description = description - item.notes = notes - item.context_id = context_id - item.project_id = project_id unless project_id.nil? - item.save - raise item.errors.full_messages.to_s if item.new_record? - item - end -end - -class InvalidToken < RuntimeError; end diff --git a/backup.rails2.3/database.yml.rails2 b/backup.rails2.3/database.yml.rails2 deleted file mode 100644 index da7aebc8..00000000 --- a/backup.rails2.3/database.yml.rails2 +++ /dev/null @@ -1,37 +0,0 @@ -# MySQL. Versions 4.1 and 5.0 are recommended. -# -# -# Be sure to use new-style password hashing: -# http://dev.mysql.com/doc/refman/5.0/en/old-client.html -development: - adapter: mysql - database: tracks_trunk - encoding: utf8 - host: localhost - username: tracks - password: 32tracks55 - -mdevelopment: - adapter: sqlite3 - database: db/tracks-21-test.sqlite3.db - -test: &TEST -# adapter: sqlite3 -# database: ":memory:" -# verbosity: quiet - adapter: mysql - database: tracks_test - host: localhost - username: tracks - password: 32tracks55 - -production: - adapter: mysql - database: tracks_trunk - encoding: utf8 - host: localhost - username: tracks - password: 32tracks55 - -cucumber: - <<: *TEST diff --git a/backup.rails2.3/development.rb.rails2 b/backup.rails2.3/development.rb.rails2 deleted file mode 100644 index 05c880d7..00000000 --- a/backup.rails2.3/development.rb.rails2 +++ /dev/null @@ -1,19 +0,0 @@ -# In the development environment your application's code is reloaded on -# every request. This slows down response time but is perfect for development -# since you don't have to restart the webserver when you make code changes. -config.cache_classes = false - -# Log error messages when you accidentally call methods on nil. -config.whiny_nils = true - -# Show full error reports and disable caching -config.action_controller.consider_all_requests_local = true -config.action_controller.perform_caching = false - -# Don't care if the mailer can't send -config.action_mailer.raise_delivery_errors = false - -# Unique cookies -config.action_controller.session = { :key => 'TracksDev' } - -NOTIFY_BAR="
 
" diff --git a/backup.rails2.3/env.rb b/backup.rails2.3/env.rb deleted file mode 100644 index b763fced..00000000 --- a/backup.rails2.3/env.rb +++ /dev/null @@ -1,70 +0,0 @@ -# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. -# It is recommended to regenerate this file in the future when you upgrade to a -# newer version of cucumber-rails. Consider adding your own code to a new file -# instead of editing this one. Cucumber will automatically load all features/**/*.rb -# files. - -ENV["RAILS_ENV"] ||= "cucumber" -require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') - -require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support -# require 'cucumber/rails/rspec' -require 'cucumber/rails/world' -require 'cucumber/rails/active_record' -require 'cucumber/web/tableish' -require 'aruba/cucumber' - -require 'capybara/rails' -require 'capybara/cucumber' -require 'capybara/session' -# BUG in this version of cucumber/capybara: require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript - -Capybara.default_wait_time = 5 -Capybara.javascript_driver = ENV["JS_DRIVER"] ? ENV["JS_DRIVER"].to_sym : :selenium - -if Capybara.javascript_driver == :webkit - require 'capybara/webkit' -end - -# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In -# order to ease the transition to Capybara we set the default here. If you'd -# prefer to use XPath just remove this line and adjust any selectors in your -# steps to use the XPath syntax. -Capybara.default_selector = :css - -Capybara.prefer_visible_elements = true - -# If you set this to false, any error raised from within your app will bubble -# up to your step definition and out to cucumber unless you catch it somewhere -# on the way. You can make Rails rescue errors and render error pages on a -# per-scenario basis by tagging a scenario or feature with the @allow-rescue tag. -# -# If you set this to true, Rails will rescue all errors and render error -# pages, more or less in the same way your application would behave in the -# default production environment. It's not recommended to do this for all -# of your scenarios, as this makes it hard to discover errors in your application. -ActionController::Base.allow_rescue = false - -# If you set this to true, each scenario will run in a database transaction. -# You can still turn off transactions on a per-scenario basis, simply tagging -# a feature or scenario with the @no-txn tag. If you are using Capybara, -# tagging with @culerity or @javascript will also turn transactions off. -# -# If you set this to false, transactions will be off for all scenarios, -# regardless of whether you use @no-txn or not. -# -# Beware that turning transactions off will leave data in your database -# after each scenario, which can lead to hard-to-debug failures in -# subsequent scenarios. If you do this, we recommend you create a Before -# block that will explicitly put your database in a known state. -Cucumber::Rails::World.use_transactional_fixtures = true - -# How to clean your database when transactions are turned off. See -# http://github.com/bmabey/database_cleaner for more info. -if defined?(ActiveRecord::Base) - begin - require 'database_cleaner' - DatabaseCleaner.strategy = :truncation - rescue LoadError => ignore_if_database_cleaner_not_present - end -end diff --git a/backup.rails2.3/environment.rb.rails2 b/backup.rails2.3/environment.rb.rails2 deleted file mode 100644 index 390f585b..00000000 --- a/backup.rails2.3/environment.rb.rails2 +++ /dev/null @@ -1,119 +0,0 @@ -# Be sure to restart your webserver when you modify this file. -# Uncomment below to force Rails into production mode - -# (Use only when you can't set environment variables through your web/app server) -# ENV['RAILS_ENV'] = 'production' - -# Bootstrap the Rails environment, frameworks, and default configuration -require File.join(File.dirname(__FILE__), 'boot') - -require 'yaml' -SITE_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'site.yml')) - -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 ] - config.autoload_paths += %W( #{RAILS_ROOT}/app/apis ) - - config.action_controller.use_accept_header = true - - # Use the database for sessions instead of the file system - # (create the session table with 'rake create_sessions_table') - config.action_controller.session_store = :active_record_store - - config.action_controller.session = { - :key => '_tracks_session_id', - :secret => SITE_CONFIG['salt'] * (30.0 / SITE_CONFIG['salt'].length).ceil #must be at least 30 characters - } - - config.action_controller.relative_url_root = SITE_CONFIG['subdir'] if SITE_CONFIG['subdir'] - - # Enable page/fragment caching by setting a file-based store - # (remember to create the caching directory and make it readable to the application) - # config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache" - - # Activate observers that should always be running - # config.active_record.observers = :cacher, :garbage_collector - - # Make Active Record use UTC-base instead of local time - config.active_record.default_timezone = :utc - - # You''ll probably want to change this to the time zone of the computer where Tracks is running - # run rake time:zones:local have Rails suggest time zone names on your system - config.time_zone = SITE_CONFIG['time_zone'] - - # Use Active Record's schema dumper instead of SQL when creating the test database - # (enables use of different database adapters for development and test environments) - config.active_record.schema_format = :ruby - - # allow other protocols in urls for sanitzer. Add to your liking, for example - # config.action_view.sanitized_allowed_protocols = 'onenote', 'blah', 'proto' - # to enable "link":onenote://... or "link":blah://... hyperlinks - config.action_view.sanitized_allowed_protocols = 'onenote', 'message' - - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - # config.i18n.default_locale = :de - -end - -# Add new inflection rules using the following format -# (all these examples are active by default): -# Inflector.inflections do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# Include your application configuration below - - -require 'name_part_finder' -require 'tracks/todo_list' -require 'tracks/config' -require 'tagging_extensions' # Needed for tagging-specific extensions -require 'digest/sha1' #Needed to support 'rake db:fixtures:load' on some ruby installs: http://dev.rousette.org.uk/ticket/557 - -if ( SITE_CONFIG['authentication_schemes'].include? 'ldap') - require 'net/ldap' #requires ruby-net-ldap gem be installed - require 'simple_ldap_authenticator' - ldap = SITE_CONFIG['ldap'] - SimpleLdapAuthenticator.ldap_library = ldap['library'] - SimpleLdapAuthenticator.servers = ldap['servers'] - SimpleLdapAuthenticator.use_ssl = ldap['ssl'] - SimpleLdapAuthenticator.login_format = ldap['login_format'] -end - -if ( SITE_CONFIG['authentication_schemes'].include? 'open_id') - #requires ruby-openid gem to be installed - OpenID::Util.logger = RAILS_DEFAULT_LOGGER -end - -if ( SITE_CONFIG['authentication_schemes'].include? 'cas') - #requires rubycas-client gem to be installed - if defined? CASClient - require 'casclient/frameworks/rails/filter' - CASClient::Frameworks::Rails::Filter.configure( - :cas_base_url => SITE_CONFIG['cas_server'] , - :cas_server_logout => SITE_CONFIG['cas_server_logout'] - ) - end -end - -# changed in development.rb to show under_construction bar -NOTIFY_BAR = "" unless defined?(NOTIFY_BAR) - -tracks_version='2.2devel' -# comment out next two lines if you do not want (or can not) the date of the -# last git commit in the footer -info=`git log --pretty=format:"%ai" -1` -tracks_version=tracks_version + ' ('+info+')' - -TRACKS_VERSION=tracks_version diff --git a/backup.rails2.3/hoverIntent.js b/backup.rails2.3/hoverIntent.js deleted file mode 100644 index dd8a9da2..00000000 --- a/backup.rails2.3/hoverIntent.js +++ /dev/null @@ -1,84 +0,0 @@ -(function($){ - /* hoverIntent by Brian Cherne */ - $.fn.hoverIntent = function(f,g) { - // default configuration options - var cfg = { - sensitivity: 7, - interval: 100, - timeout: 400 - }; - // override configuration options with user supplied object - cfg = $.extend(cfg, g ? { over: f, out: g } : f ); - - // instantiate variables - // cX, cY = current X and Y position of mouse, updated by mousemove event - // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval - var cX, cY, pX, pY; - - // A private function for getting mouse position - var track = function(ev) { - cX = ev.pageX; - cY = ev.pageY; - }; - - // A private function for comparing current and previous mouse position - var compare = function(ev,ob) { - ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); - // compare mouse positions to see if they've crossed the threshold - if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) { - $(ob).unbind("mousemove",track); - // set hoverIntent state to true (so mouseOut can be called) - ob.hoverIntent_s = 1; - return cfg.over.apply(ob,[ev]); - } else { - // set previous coordinates for next time - pX = cX; pY = cY; - // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) - ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval ); - } - }; - - // A private function for delaying the mouseOut function - var delay = function(ev,ob) { - ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); - ob.hoverIntent_s = 0; - return cfg.out.apply(ob,[ev]); - }; - - // A private function for handling mouse 'hovering' - var handleHover = function(e) { - // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut - var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; - while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } } - if ( p == this ) { return false; } - - // copy objects to be passed into t (required for event object to be passed in IE) - var ev = jQuery.extend({},e); - var ob = this; - - // cancel hoverIntent timer if it exists - if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); } - - // else e.type == "onmouseover" - if (e.type == "mouseover") { - // set "previous" X and Y position based on initial entry point - pX = ev.pageX; pY = ev.pageY; - // update "current" X and Y position based on mousemove - $(ob).bind("mousemove",track); - // start polling interval (self-calling timeout) to compare mouse coordinates over time - if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );} - - // else e.type == "onmouseout" - } else { - // unbind expensive mousemove event - $(ob).unbind("mousemove",track); - // if hoverIntent state is true, then call the mouseOut function after the specified delay - if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );} - } - }; - - // bind the function to the two event listeners - return this.mouseover(handleHover).mouseout(handleHover); - }; - -})(jQuery); diff --git a/backup.rails2.3/lib/assets/.gitkeep b/backup.rails2.3/lib/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/backup.rails2.3/lib/authenticated_test_helper.rb b/backup.rails2.3/lib/authenticated_test_helper.rb deleted file mode 100644 index 7a52e62b..00000000 --- a/backup.rails2.3/lib/authenticated_test_helper.rb +++ /dev/null @@ -1,113 +0,0 @@ -module AuthenticatedTestHelper - # Sets the current user in the session from the user fixtures. - def login_as(user) - @request.session['user_id'] = user ? users(user).id : nil - end - - def content_type(type) - @request.env['Content-Type'] = type - end - - def accept(accept) - @request.env["HTTP_ACCEPT"] = accept - end - - def authorize_as(user) - if user - @request.env["HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{users(user).login}:test")}" - accept 'application/xml' - content_type 'application/xml' - else - @request.env["HTTP_AUTHORIZATION"] = nil - accept nil - content_type nil - end - end - - # http://project.ioni.st/post/217#post-217 - # - # def test_new_publication - # assert_difference(Publication, :count) do - # post :create, :publication => {...} - # # ... - # end - # end - # - def assert_difference(object, method = nil, difference = 1) - initial_value = object.send(method) - yield - assert_equal initial_value + difference, object.send(method), "#{object}##{method}" - end - - def assert_no_difference(object, method, &block) - assert_difference object, method, 0, &block - end - - # Assert the block redirects to the login - # - # assert_requires_login(:bob) { |c| c.get :edit, :id => 1 } - # - def assert_requires_login(login = nil) - yield HttpLoginProxy.new(self, login) - end - - def assert_http_authentication_required(login = nil) - yield XmlLoginProxy.new(self, login) - end - - def reset!(*instance_vars) - instance_vars = [:controller, :request, :response] unless instance_vars.any? - instance_vars.collect! { |v| "@#{v}".to_sym } - instance_vars.each do |var| - instance_variable_set(var, instance_variable_get(var).class.new) - end - end -end - -class BaseLoginProxy - attr_reader :controller - attr_reader :options - def initialize(controller, login) - @controller = controller - @login = login - end - - private - def authenticated - raise NotImplementedError - end - - def check - raise NotImplementedError - end - - def method_missing(method, *args) - @controller.reset! - authenticate - @controller.send(method, *args) - check - end -end - -class HttpLoginProxy < BaseLoginProxy - protected - def authenticate - @controller.login_as @login if @login - end - - def check - @controller.assert_redirected_to :controller => 'account', :action => 'login' - end -end - -class XmlLoginProxy < BaseLoginProxy - protected - def authenticate - @controller.accept 'application/xml' - @controller.authorize_as @login if @login - end - - def check - @controller.assert_response 401 - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/login_system.rb b/backup.rails2.3/lib/login_system.rb deleted file mode 100644 index bc25de08..00000000 --- a/backup.rails2.3/lib/login_system.rb +++ /dev/null @@ -1,222 +0,0 @@ -require_dependency "user" - -module LoginSystem - - def current_user - get_current_user - end - - def prefs - current_user.prefs unless current_user.nil? - end - - # Logout the {#current_user} and redirect to login page - # - # @param [String] message notification to display - def logout_user message=t('login.logged_out') - @user.forget_me if logged_in? - cookies.delete :auth_token - session['user_id'] = nil - if ( SITE_CONFIG['authentication_schemes'].include? 'cas') && session[:cas_user] - CASClient::Frameworks::Rails::Filter.logout(self) - else - reset_session - notify :notice, message - redirect_to_login - end - end - - protected - - # overwrite this if you want to restrict access to only a few actions - # or if you want to check if the user has the correct rights - # example: - # - # # only allow nonbobs - # def authorize?(user) - # user.login != "bob" - # end - def authorize?(user) - true - end - - # overwrite this method if you only want to protect certain actions of the controller - # example: - # - # # don't protect the login and the about method - # def protect?(action) - # if ['action', 'about'].include?(action) - # return false - # else - # return true - # end - # end - def protect?(action) - true - end - - # When called with before_filter :login_from_cookie will check for an :auth_token - # cookie and log the user back in if appropriate - def login_from_cookie - return unless cookies[:auth_token] && !logged_in? - token = cookies[:auth_token] - user = User.where(:remember_token => token) - if user && user.remember_token? - session['user_id'] = user.id - set_current_user(user) - current_user.remember_me - cookies[:auth_token] = { :value => current_user.remember_token , :expires => current_user.remember_token_expires_at, :secure => SITE_CONFIG['secure_cookies'] } - flash[:notice] = t('login.successful') - end - end - - def login_or_feed_token_required - if ['rss', 'atom', 'txt', 'ics'].include?(params[:format]) - if user = User.find_by_token(params[:token]) - set_current_user(user) - return true - end - end - login_required - end - - # login_required filter. add - # - # before_filter :login_required - # - # if the controller should be under any rights management. - # for finer access control you can overwrite - # - # def authorize?(user) - # - def login_required - - if not protect?(action_name) - return true - end - - login_from_cookie - - if session['user_id'] and authorize?(get_current_user) - return true - end - - http_user, http_pass = get_basic_auth_data - if user = User.authenticate(http_user, http_pass) - session['user_id'] = user.id - set_current_user(user) - return true - end - - # store current location so that we can - # come back after the user logged in - store_location unless params[:format] == 'js' - - # call overwriteable reaction to unauthorized access - access_denied - return false - end - - def login_optional - - login_from_cookie - - if session['user_id'] and authorize?(get_current_user) - return true - end - - http_user, http_pass = get_basic_auth_data - if user = User.authenticate(http_user, http_pass) - session['user_id'] = user.id - set_current_user(user) - return true - end - - return true - end - - def logged_in? - current_user != nil - end - - def get_current_user - if @user.nil? && session['user_id'] - @user = User.find(session['user_id']) - end - @user - end - - def set_current_user(user) - @user = user - end - - # overwrite if you want to have special behavior in case the user is not authorized - # to access the current operation. - # the default action is to redirect to the login screen - # example use : - # a popup window might just close itself for instance - def access_denied - respond_to do |format| - format.html { redirect_to login_path } - format.m { redirect_to formatted_login_path(:format => 'm') } - format.js { render :partial => 'login/redirect_to_login' } - format.xml { basic_auth_denied } - format.rss { basic_auth_denied } - format.atom { basic_auth_denied } - format.text { basic_auth_denied } - end - end - - # store current uri in the session. - # we can return to this location by calling return_location - def store_location - session['return-to'] = request.request_uri - end - - # move to the last store_location call or to the passed default one - def redirect_back_or_default(default) - if session['return-to'].nil? - redirect_to default - else - redirect_to session['return-to'] - session['return-to'] = nil - end - end - - # HTTP Basic auth code adapted from Coda Hale's simple_http_auth plugin. Thanks, Coda! - def get_basic_auth_data - - auth_locations = ['REDIRECT_REDIRECT_X_HTTP_AUTHORIZATION', - 'REDIRECT_X_HTTP_AUTHORIZATION', - 'X-HTTP_AUTHORIZATION', 'HTTP_AUTHORIZATION'] - - authdata = nil - for location in auth_locations - if request.env.has_key?(location) - authdata = request.env[location].to_s.split - end - end - if authdata and authdata[0] == 'Basic' - user, pass = Base64.decode64(authdata[1]).split(':')[0..1] - else - user, pass = ['', ''] - end - return user, pass - end - - def basic_auth_denied - response.headers["WWW-Authenticate"] = "Basic realm=\"'Tracks Login Required'\"" - render :text => t('login.unsuccessful'), :status => 401 - end - -private - - # Redirect the user to the login page. - def redirect_to_login - respond_to do |format| - format.html { redirect_to login_path } - format.m { redirect_to login_path(:format => 'm') } - end - end - -end \ No newline at end of file diff --git a/backup.rails2.3/lib/name_part_finder.rb b/backup.rails2.3/lib/name_part_finder.rb deleted file mode 100644 index 79d66338..00000000 --- a/backup.rails2.3/lib/name_part_finder.rb +++ /dev/null @@ -1,5 +0,0 @@ -module NamePartFinder - def find_by_namepart(namepart) - find_by_name(namepart) || find(:first, :conditions => ["name LIKE ?", namepart + '%']) - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tagging_extensions.rb b/backup.rails2.3/lib/tagging_extensions.rb deleted file mode 100644 index 2808f42a..00000000 --- a/backup.rails2.3/lib/tagging_extensions.rb +++ /dev/null @@ -1,200 +0,0 @@ -class ActiveRecord::Base #:nodoc: - - # These extensions make models taggable. This file is automatically generated and required by your app if you run the tagging generator included with has_many_polymorphs. - module TaggingExtensions - - # Add tags to self. Accepts a string of tagnames, an array of tagnames, an array of ids, or an array of Tags. - # - # We need to avoid name conflicts with the built-in ActiveRecord association methods, thus the underscores. - def _add_tags incoming - taggable?(true) - tag_cast_to_string(incoming).each do |tag_name| - # added following check to prevent empty tags from being saved (which will fail) - unless tag_name.blank? - begin - tag = Tag.find_or_create_by_name(tag_name) - raise Tag::Error, "tag could not be saved: #{tag_name}" if tag.new_record? - tags << tag - rescue ActiveRecord::StatementInvalid => e - raise unless e.to_s =~ /duplicate/i - end - end - end - end - - # Removes tags from self. Accepts a string of tagnames, an array of tagnames, an array of ids, or an array of Tags. - def _remove_tags outgoing - taggable?(true) - outgoing = tag_cast_to_string(outgoing) - tags.delete(*(tags.select do |tag| - outgoing.include? tag.name - end)) - end - - # Returns the tags on self as a string. - def tag_list - # Redefined later to avoid an RDoc parse error. - end - - # Replace the existing tags on self. Accepts a string of tagnames, an array of tagnames, an array of ids, or an array of Tags. - def tag_with list - #:stopdoc: - taggable?(true) - list = tag_cast_to_string(list) - - # Transactions may not be ideal for you here; be aware. - Tag.transaction do - current = tags.map(&:name) - _add_tags(list - current) - _remove_tags(current - list) - end - - self - #:startdoc: - end - - # Returns the tags on self as a string. - def tag_list #:nodoc: - #:stopdoc: - taggable?(true) - tags.reload - tags.to_s - #:startdoc: - end - - def tag_list=(value) - tag_with(value) - end - - private - - def tag_cast_to_string obj #:nodoc: - case obj - when Array - obj.map! do |item| - case item - # removed next line as it prevents using numbers as tags - # when /^\d+$/, Fixnum then Tag.find(item).name # This will be slow if you use ids a lot. - when Tag then item.name - when String then item - else - raise "Invalid type" - end - end - when String - obj = obj.split(Tag::DELIMITER).map do |tag_name| - tag_name.strip.squeeze(" ") - end - else - raise "Invalid object of class #{obj.class} as tagging method parameter" - end.flatten.compact.map(&:downcase).uniq - end - - # Check if a model is in the :taggables target list. The alternative to this check is to explicitly include a TaggingMethods module (which you would create) in each target model. - def taggable?(should_raise = false) #:nodoc: - unless flag = respond_to?(:tags) - raise "#{self.class} is not a taggable model" if should_raise - end - flag - end - - end - - module TaggingFinders - # Find all the objects tagged with the supplied list of tags - # - # Usage : Model.tagged_with("ruby") - # Model.tagged_with("hello", "world") - # Model.tagged_with("hello", "world", :limit => 10) - # - # XXX This query strategy is not performant, and needs to be rewritten as an inverted join or a series of unions - # - def tagged_with(*tag_list) - options = tag_list.last.is_a?(Hash) ? tag_list.pop : {} - tag_list = parse_tags(tag_list) - - scope = scope(:find) - options[:select] ||= "#{table_name}.*" - options[:from] ||= "#{table_name}, tags, taggings" - - sql = "SELECT #{(scope && scope[:select]) || options[:select]} " - sql << "FROM #{(scope && scope[:from]) || options[:from]} " - - add_joins!(sql, options[:joins], scope) - - sql << "WHERE #{table_name}.#{primary_key} = taggings.taggable_id " - sql << "AND taggings.taggable_type = '#{ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s}' " - sql << "AND taggings.tag_id = tags.id " - - tag_list_condition = tag_list.map {|name| "'#{name}'"}.join(", ") - - sql << "AND (tags.name IN (#{sanitize_sql(tag_list_condition)})) " - sql << "AND #{sanitize_sql(options[:conditions])} " if options[:conditions] - - columns = column_names.map do |column| - "#{table_name}.#{column}" - end.join(", ") - - sql << "GROUP BY #{columns} " - sql << "HAVING COUNT(taggings.tag_id) = #{tag_list.size}" - - add_order!(sql, options[:order], scope) - add_limit!(sql, options, scope) - add_lock!(sql, options, scope) - - find_by_sql(sql) - end - - def self.tagged_with_any(*tag_list) - options = tag_list.last.is_a?(Hash) ? tag_list.pop : {} - tag_list = parse_tags(tag_list) - - scope = scope(:find) - options[:select] ||= "#{table_name}.*" - options[:from] ||= "#{table_name}, meta_tags, taggings" - - sql = "SELECT #{(scope && scope[:select]) || options[:select]} " - sql << "FROM #{(scope && scope[:from]) || options[:from]} " - - add_joins!(sql, options, scope) - - sql << "WHERE #{table_name}.#{primary_key} = taggings.taggable_id " - sql << "AND taggings.taggable_type = '#{ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s}' " - sql << "AND taggings.meta_tag_id = meta_tags.id " - - sql << "AND (" - or_options = [] - tag_list.each do |name| - or_options << "meta_tags.name = '#{name}'" - end - or_options_joined = or_options.join(" OR ") - sql << "#{or_options_joined}) " - - - sql << "AND #{sanitize_sql(options[:conditions])} " if options[:conditions] - - columns = column_names.map do |column| - "#{table_name}.#{column}" - end.join(", ") - - sql << "GROUP BY #{columns} " - - add_order!(sql, options[:order], scope) - add_limit!(sql, options, scope) - add_lock!(sql, options, scope) - - find_by_sql(sql) - end - - def parse_tags(tags) - return [] if tags.blank? - tags = Array(tags).first - tags = tags.respond_to?(:flatten) ? tags.flatten : tags.split(Tag::DELIMITER) - tags.map { |tag| tag.strip.squeeze(" ") }.flatten.compact.map(&:downcase).uniq - end - - end - - include TaggingExtensions - extend TaggingFinders -end diff --git a/backup.rails2.3/lib/tasks/.gitkeep b/backup.rails2.3/lib/tasks/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/backup.rails2.3/lib/tasks/cucumber-tracks.rake b/backup.rails2.3/lib/tasks/cucumber-tracks.rake deleted file mode 100644 index ae5bdfad..00000000 --- a/backup.rails2.3/lib/tasks/cucumber-tracks.rake +++ /dev/null @@ -1,38 +0,0 @@ -# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. -# It is recommended to regenerate this file in the future when you upgrade to a -# newer version of cucumber-rails. Consider adding your own code to a new file -# instead of editing this one. Cucumber will automatically load all features/**/*.rb -# files. - -vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first -$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil? - -begin - require 'cucumber/rake/task' - - namespace :cucumber do - Cucumber::Rake::Task.new({:selenium => :env_to_selenium}, 'Run features that require selenium') do |t| - t.binary = vendored_cucumber_bin - t.fork = true # You may get faster startup if you set this to false - t.profile = 'selenium' - end - - Cucumber::Rake::Task.new({:selenium_wip => :env_to_selenium}, 'Run unfinished features that require selenium') do |t| - t.binary = vendored_cucumber_bin - t.fork = true # You may get faster startup if you set this to false - t.profile = 'selenium_wip' - end - - task :env_to_selenium => 'db:test:prepare' do - ENV['RAILS_ENV'] = 'selenium' - end - - desc 'Run all features' - task :all => [:ok, :wip, :selenium, :selenium_wip] - end -rescue LoadError - desc 'cucumber rake task not available (cucumber not installed)' - task :cucumber do - abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tasks/cucumber.rake b/backup.rails2.3/lib/tasks/cucumber.rake deleted file mode 100644 index 7db1a557..00000000 --- a/backup.rails2.3/lib/tasks/cucumber.rake +++ /dev/null @@ -1,53 +0,0 @@ -# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. -# It is recommended to regenerate this file in the future when you upgrade to a -# newer version of cucumber-rails. Consider adding your own code to a new file -# instead of editing this one. Cucumber will automatically load all features/**/*.rb -# files. - - -unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks - -vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first -$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil? - -begin - require 'cucumber/rake/task' - - namespace :cucumber do - Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t| - t.binary = vendored_cucumber_bin # If nil, the gem's binary is used. - t.fork = true # You may get faster startup if you set this to false - t.profile = 'default' - end - - Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t| - t.binary = vendored_cucumber_bin - t.fork = true # You may get faster startup if you set this to false - t.profile = 'wip' - end - - Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t| - t.binary = vendored_cucumber_bin - t.fork = true # You may get faster startup if you set this to false - t.profile = 'rerun' - end - - desc 'Run all features' - task :all => [:ok, :wip] - end - desc 'Alias for cucumber:ok' - task :cucumber => 'cucumber:ok' - - task :default => :cucumber - - task :features => :cucumber do - STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***" - end -rescue LoadError - desc 'cucumber rake task not available (cucumber not installed)' - task :cucumber do - abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' - end -end - -end diff --git a/backup.rails2.3/lib/tasks/database.rake b/backup.rails2.3/lib/tasks/database.rake deleted file mode 100644 index eb02a45f..00000000 --- a/backup.rails2.3/lib/tasks/database.rake +++ /dev/null @@ -1,27 +0,0 @@ -require 'rake' - -namespace :db do - desc "Dump the current SQLite3 or MySQL database to a sql file" - task :dump_sql do - load 'config/environment.rb' - abcs = ActiveRecord::Base.configurations - case abcs[RAILS_ENV]["adapter"] - when 'mysql' - ActiveRecord::Base.establish_connection(abcs[RAILS_ENV]) - File.open("db/#{RAILS_ENV}_data.sql", "w+") do |f| - if abcs[RAILS_ENV]["password"].blank? - f << `mysqldump -h #{abcs[RAILS_ENV]["host"]} -u #{abcs[RAILS_ENV]["username"]} #{abcs[RAILS_ENV]["database"]}` - else - f << `mysqldump -h #{abcs[RAILS_ENV]["host"]} -u #{abcs[RAILS_ENV]["username"]} -p#{abcs[RAILS_ENV]["password"]} #{abcs[RAILS_ENV]["database"]}` - end - end - when 'sqlite3' - ActiveRecord::Base.establish_connection(abcs[RAILS_ENV]) - File.open("db/#{RAILS_ENV}_data.sql", "w+") do |f| - f << `sqlite3 #{abcs[RAILS_ENV]["database"]} .dump` - end - else - raise "Task not supported by '#{abcs[RAILS_ENV]['adapter']}'" - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tasks/extract_fixtures.rake b/backup.rails2.3/lib/tasks/extract_fixtures.rake deleted file mode 100644 index f69683a3..00000000 --- a/backup.rails2.3/lib/tasks/extract_fixtures.rake +++ /dev/null @@ -1,17 +0,0 @@ -desc ' Create YAML test fixtures from data in an existing database. -Defaults to development database. Set RAILS_ENV to override (taken from Rails Recipes book).' -task :extract_fixtures => :environment do - sql = "SELECT * FROM %s" - skip_tables = ["schema_info", "sessions", "users"] - ActiveRecord::Base.establish_connection - (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name| - i = "000" - File.open("#{RAILS_ROOT}/db/exported_fixtures/#{table_name}.yml", 'w' ) do |file| - data = ActiveRecord::Base.connection.select_all(sql % table_name) - file.write data.inject({}) { |hash, record| - hash["#{table_name}_#{i.succ!}"] = record - hash - }.to_yaml - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tasks/gems.rake b/backup.rails2.3/lib/tasks/gems.rake deleted file mode 100644 index 464b787f..00000000 --- a/backup.rails2.3/lib/tasks/gems.rake +++ /dev/null @@ -1,34 +0,0 @@ -desc "Copy third-party gems into ./lib" -task :freeze_other_gems do - # TODO Get this list from parsing environment.rb - libraries = %w(redcloth) - require 'rubygems' - require 'find' - - libraries.each do |library| - library_gem = Gem.cache.search(library).sort_by { |g| g.version }.last - puts "Freezing #{library} for #{library_gem.version}..." - - # TODO Add dependencies to list of libraries to freeze - #library_gem.dependencies.each { |g| libraries << g } - - folder_for_library = "#{library_gem.name}-#{library_gem.version}" - system "cd vendor; gem unpack -v '#{library_gem.version}' #{library_gem.name};" - - # Copy files recursively to ./lib - folder_for_library_with_lib = "vendor/#{folder_for_library}/lib/" - Find.find(folder_for_library_with_lib) do |original_file| - destination_file = "./lib/" + original_file.gsub(folder_for_library_with_lib, '') - - if File.directory?(original_file) - if !File.exist?(destination_file) - Dir.mkdir destination_file - end - else - File.copy original_file, destination_file - end - end - - system "rm -r vendor/#{folder_for_library}" - end -end diff --git a/backup.rails2.3/lib/tasks/load_exported_fixtures.rake b/backup.rails2.3/lib/tasks/load_exported_fixtures.rake deleted file mode 100644 index 10757471..00000000 --- a/backup.rails2.3/lib/tasks/load_exported_fixtures.rake +++ /dev/null @@ -1,8 +0,0 @@ -desc "Load exported fixtures (in db/exported_fixtures) into the current environment's database" -task :load_exported_fixtures => :environment do - require 'active_record/fixtures' - ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym) - Dir.glob(File.join(RAILS_ROOT, 'db', 'exported_fixtures', '*.{yml,csv}')).each do |fixture_file| - Fixtures.create_fixtures('db/exported_fixtures', File.basename(fixture_file, '.*')) - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tasks/query_trace_toggle.rake b/backup.rails2.3/lib/tasks/query_trace_toggle.rake deleted file mode 100644 index a6321541..00000000 --- a/backup.rails2.3/lib/tasks/query_trace_toggle.rake +++ /dev/null @@ -1,50 +0,0 @@ -namespace :query_trace do - desc "Enables the query_trace plugin. Must restart server to take effect." - task :on => :environment do - unless File.exist?("#{RAILS_ROOT}/vendor/query_trace.tar.gz") - Dir.chdir("#{RAILS_ROOT}/vendor") do - url = "https://terralien.devguard.com/svn/projects/plugins/query_trace" - puts "Loading query_trace from #{url}..." - system "svn co #{url} query_trace" - system "tar zcf query_trace.tar.gz --exclude=.svn query_trace" - FileUtils.rm_rf("query_trace") - end - end - Dir.chdir("#{RAILS_ROOT}/vendor/plugins") do - system "tar zxf ../query_trace.tar.gz query_trace" - end - puts "QueryTrace plugin enabled. Must restart server to take effect." - end - - desc "Disables the query_trace plugin. Must restart server to take effect." - task :off => :environment do - FileUtils.rm_rf("#{RAILS_ROOT}/vendor/plugins/query_trace") - puts "QueryTrace plugin disabled. Must restart server to take effect." - end -end - -namespace :query_analyzer do - desc "Enables the query_analyzer plugin. Must restart server to take effect." - task :on => :environment do - unless File.exist?("#{RAILS_ROOT}/vendor/query_analyzer.tar.gz") - Dir.chdir("#{RAILS_ROOT}/vendor") do - url = "http://svn.nfectio.us/plugins/query_analyzer" - puts "Loading query_analyzer from #{url}..." - system "svn co #{url} query_analyzer" - system "tar zcf query_analyzer.tar.gz --exclude=.svn query_analyzer" - FileUtils.rm_rf("query_analyzer") - end - end - Dir.chdir("#{RAILS_ROOT}/vendor/plugins") do - system "tar zxf ../query_analyzer.tar.gz query_analyzer" - end - puts "QueryAnalyzer plugin enabled. Must restart server to take effect." - end - - desc "Disables the query_analyzer plugin. Must restart server to take effect." - task :off => :environment do - FileUtils.rm_rf("#{RAILS_ROOT}/vendor/plugins/query_analyzer") - puts "QueryAnalyzer plugin disabled. Must restart server to take effect." - end -end - diff --git a/backup.rails2.3/lib/tasks/reset_password.rake b/backup.rails2.3/lib/tasks/reset_password.rake deleted file mode 100644 index 6cc61a60..00000000 --- a/backup.rails2.3/lib/tasks/reset_password.rake +++ /dev/null @@ -1,23 +0,0 @@ -namespace :tracks do - desc 'Replace the password of USER with a new one.' - task :password => :environment do - require "highline/import" - - user = User.find_by_login(ENV['USER']) - if user.nil? - puts "Sorry, we couldn't find user '#{ENV['USER']}'. To specify a different user, pass USER=username to this task." - exit 0 - end - - puts "Changing Tracks password for #{ENV['USER']}." - password = ask("New password: ") { |q| q.echo = false } - password_confirmation = ask('Retype new password: ') { |q| q.echo = false } - - begin - user.change_password(password, password_confirmation) - rescue ActiveRecord::RecordInvalid - puts "Sorry, we couldn't change #{ENV['USER']}'s password: " - user.errors.each_full { |msg| puts "- #{msg}\n" } - end - end -end diff --git a/backup.rails2.3/lib/tasks/rspec.rake b/backup.rails2.3/lib/tasks/rspec.rake deleted file mode 100644 index dba3ffcc..00000000 --- a/backup.rails2.3/lib/tasks/rspec.rake +++ /dev/null @@ -1,144 +0,0 @@ -gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9 -rspec_gem_dir = nil -Dir["#{RAILS_ROOT}/vendor/gems/*"].each do |subdir| - rspec_gem_dir = subdir if subdir.gsub("#{RAILS_ROOT}/vendor/gems/","") =~ /^(\w+-)?rspec-(\d+)/ && File.exist?("#{subdir}/lib/spec/rake/spectask.rb") -end -rspec_plugin_dir = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec') - -if rspec_gem_dir && (test ?d, rspec_plugin_dir) - raise "\n#{'*'*50}\nYou have rspec installed in both vendor/gems and vendor/plugins\nPlease pick one and dispose of the other.\n#{'*'*50}\n\n" -end - -if rspec_gem_dir - $LOAD_PATH.unshift("#{rspec_gem_dir}/lib") -elsif File.exist?(rspec_plugin_dir) - $LOAD_PATH.unshift("#{rspec_plugin_dir}/lib") -end - -# Don't load rspec if running "rake gems:*" -unless ARGV.any? {|a| a =~ /^gems/} - -begin - require 'spec/rake/spectask' -rescue MissingSourceFile - module Spec - module Rake - class SpecTask - def initialize(name) - task name do - # if rspec-rails is a configured gem, this will output helpful material and exit ... - require File.expand_path(File.join(File.dirname(__FILE__),"..","..","config","environment")) - - # ... otherwise, do this: - raise <<-MSG - -#{"*" * 80} -* You are trying to run an rspec rake task defined in -* #{__FILE__}, -* but rspec can not be found in vendor/gems, vendor/plugins or system gems. -#{"*" * 80} -MSG - end - end - end - end - end -end - -Rake.application.instance_variable_get('@tasks').delete('default') - -spec_prereq = File.exist?(File.join(RAILS_ROOT, 'config', 'database.yml')) ? "db:test:prepare" : :noop -task :noop do -end - -task :default => :spec -task :stats => "spec:statsetup" - -desc "Run all specs in spec directory (excluding plugin specs)" -Spec::Rake::SpecTask.new(:spec => spec_prereq) do |t| - t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] - t.spec_files = FileList['spec/**/*_spec.rb'] -end - -namespace :spec do - desc "Run all specs in spec directory with RCov (excluding plugin specs)" - Spec::Rake::SpecTask.new(:rcov) do |t| - t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] - t.spec_files = FileList['spec/**/*_spec.rb'] - t.rcov = true - t.rcov_opts = lambda do - IO.readlines("#{RAILS_ROOT}/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten - end - end - - desc "Print Specdoc for all specs (excluding plugin specs)" - Spec::Rake::SpecTask.new(:doc) do |t| - t.spec_opts = ["--format", "specdoc", "--dry-run"] - t.spec_files = FileList['spec/**/*_spec.rb'] - end - - desc "Print Specdoc for all plugin examples" - Spec::Rake::SpecTask.new(:plugin_doc) do |t| - t.spec_opts = ["--format", "specdoc", "--dry-run"] - t.spec_files = FileList['vendor/plugins/**/spec/**/*_spec.rb'].exclude('vendor/plugins/rspec/*') - end - - [:models, :controllers, :views, :helpers, :lib, :integration].each do |sub| - desc "Run the code examples in spec/#{sub}" - Spec::Rake::SpecTask.new(sub => spec_prereq) do |t| - t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] - t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"] - end - end - - desc "Run the code examples in vendor/plugins (except RSpec's own)" - Spec::Rake::SpecTask.new(:plugins => spec_prereq) do |t| - t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] - t.spec_files = FileList['vendor/plugins/**/spec/**/*_spec.rb'].exclude('vendor/plugins/rspec/*').exclude("vendor/plugins/rspec-rails/*") - end - - namespace :plugins do - desc "Runs the examples for rspec_on_rails" - Spec::Rake::SpecTask.new(:rspec_on_rails) do |t| - t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] - t.spec_files = FileList['vendor/plugins/rspec-rails/spec/**/*_spec.rb'] - end - end - - # Setup specs for stats - task :statsetup do - require 'code_statistics' - ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models') - ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views') - ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers') - ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers') - ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib') - ::STATS_DIRECTORIES << %w(Routing\ specs spec/routing) if File.exist?('spec/routing') - ::STATS_DIRECTORIES << %w(Integration\ specs spec/integration) if File.exist?('spec/integration') - ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models') - ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views') - ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers') - ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers') - ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib') - ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing') - ::CodeStatistics::TEST_TYPES << "Integration specs" if File.exist?('spec/integration') - end - - namespace :db do - namespace :fixtures do - desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z." - task :load => :environment do - ActiveRecord::Base.establish_connection(Rails.env) - base_dir = File.join(Rails.root, 'spec', 'fixtures') - fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir - - require 'active_record/fixtures' - (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file| - Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*')) - end - end - end - end -end - -end diff --git a/backup.rails2.3/lib/tasks/setup_tracks.rake b/backup.rails2.3/lib/tasks/setup_tracks.rake deleted file mode 100644 index 0881dfb3..00000000 --- a/backup.rails2.3/lib/tasks/setup_tracks.rake +++ /dev/null @@ -1,15 +0,0 @@ -desc "Initialises the installation, copy the *.tmpl files and directories to versions named without the .tmpl extension. It won't overwrite the files and directories if you've already copied them. You need to manually copy database.yml.tmpl -> database.yml and fill in the details before you run this task." -task :setup_tracks => :environment do - # Check the root directory for template files - FileList["*.tmpl"].each do |template_file| - f = File.basename(template_file) # with suffix - f_only = File.basename(template_file,".tmpl") # without suffix - if File.exists?(f_only) - puts f_only + " already exists" - else - cp_r(f, f_only) - puts f_only + " created" - end - end - -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tasks/upgrade_sqlite_db.rake b/backup.rails2.3/lib/tasks/upgrade_sqlite_db.rake deleted file mode 100644 index 8e96fb18..00000000 --- a/backup.rails2.3/lib/tasks/upgrade_sqlite_db.rake +++ /dev/null @@ -1,40 +0,0 @@ -desc "Updates sqlite/sqlite3 databases created under Tracks 1.03 to the format required for Tracks 1.04. After this is done, you should be able to keep up to date with changes in the schema by running rake db:migrate." -task :upgrade_sqlite_db => :environment do - # Change the three lines below appropriately for your setup - old_db = "tracks_103.db" - new_db = "tracks_104.db" - cmd = "sqlite3" - replace_string = "update todos set done='f' where done=0;\nupdate todos set done='t' where done=1;\nupdate contexts set hide='f' where hide=0;\nupdate contexts set hide='t' where hide=1;\nupdate projects set done='f' where done=0;\nupdate projects set done='t' where done=1;\nCREATE TABLE 'schema_info' (\n 'version' INTEGER default NULL\n);\nINSERT INTO \"schema_info\" VALUES(1);\nCOMMIT;" - - # cd to the db directory - cd("db") do - # Dump the old db into the temp file and replace the tinyints with booleans - `#{cmd} #{old_db} .dump | sed "s/tinyint(4) NOT NULL default '0'/boolean default 'f'/" > temp.sql` - # Create a second sqldump file for writing - sqldump = File.open("temp2.sql", "w+") - File.open("temp.sql") do |file| - file.each_line do |line| - # If COMMIT is on the line, insert the replace string - # else just write the line back in - # This effectively replaces COMMIT with the replace string - if /COMMIT/ =~ line - sqldump.write replace_string - else - sqldump.write line - end - end - sqldump.close - end - - # Read the second dump back in to a new db - system "#{cmd} #{new_db} < temp2.sql" - puts "Created the a new database called #{new_db}." - # Clean up the temp files - rm("temp.sql") - rm("temp2.sql") - puts "Temporary files cleaned up." - end - - # rake db:migrate - puts "Now check the database and run 'rake db:migrate' in the root of your Tracks installation." -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tracks/config.rb b/backup.rails2.3/lib/tracks/config.rb deleted file mode 100644 index 0ca04f97..00000000 --- a/backup.rails2.3/lib/tracks/config.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Tracks - class Config - def self.salt - SITE_CONFIG['salt'] - end - - def self.auth_schemes - SITE_CONFIG['authentication_schemes'] || [] - end - - def self.openid_enabled? - auth_schemes.include?('open_id') - end - - def self.cas_enabled? - auth_schemes.include?('cas') - end - - def self.prefered_auth? - if SITE_CONFIG['prefered_auth'] - SITE_CONFIG['prefered_auth'] - else - auth_schemes.first - end - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/lib/tracks/source_view.rb b/backup.rails2.3/lib/tracks/source_view.rb deleted file mode 100644 index 8cb17ca8..00000000 --- a/backup.rails2.3/lib/tracks/source_view.rb +++ /dev/null @@ -1,68 +0,0 @@ -# Inspiration from Bruce Williams [http://codefluency.com/articles/2006/07/01/rails-views-getting-in-context/] -module Tracks - - module SourceViewSwitching - - class Responder - - def initialize(source_view) - @source_view = source_view.underscore.gsub(/\s+/,'_').to_sym rescue nil - end - - def nil? - yield if @source_view.nil? && block_given? - end - - def context - yield if :context == @source_view && block_given? - end - - def method_missing(check_source_view,*args) - yield if check_source_view == @source_view && block_given? - end - - end - - module Controller - - def self.included(base) - base.send(:helper, Tracks::SourceViewSwitching::Helper) - base.send(:helper_method, :source_view) - end - - def source_view_is( s ) - s == (params[:_source_view] || @source_view).to_sym - end - - def source_view_is_one_of( *s ) - s.include?(params[:_source_view].to_sym) - end - - def source_view - responder = Tracks::SourceViewSwitching::Responder.new(params[:_source_view] || @source_view) - block_given? ? yield(responder) : responder - end - - end - - module Helper - - def source_view_tag(name) - hidden_field_tag :_source_view, name.underscore.gsub(/\s+/,'_') - end - - def source_view_is( s ) - s == (params[:_source_view] || @source_view).to_sym - end - - def source_view_is_one_of( *s ) - s.include?(params[:_source_view].to_sym) - end - - end - - end - -end - -ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller) diff --git a/backup.rails2.3/lib/tracks/todo_list.rb b/backup.rails2.3/lib/tracks/todo_list.rb deleted file mode 100644 index b1a32229..00000000 --- a/backup.rails2.3/lib/tracks/todo_list.rb +++ /dev/null @@ -1,59 +0,0 @@ -module Tracks - module TodoList - # TODO: this module should be deprecated. This could mostly (all?) be replaced by named scopes) - - def not_done_todos(opts={}) - @not_done_todos ||= self.find_not_done_todos(opts) - end - - def done_todos - @done_todos ||= self.find_done_todos - end - - def deferred_todos - @deferred_todos ||= self.find_deferred_todos - end - - def find_not_done_todos(opts={}) - with_not_done_scope(opts) do - self.todos.find(:all, :order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC") - end - end - - def find_deferred_todos(opts={}) - self.todos.find_in_state(:all, :deferred, :order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC") - end - - def find_done_todos - self.todos.completed.all(:order => "todos.completed_at DESC", :limit => self.user.prefs.show_number_completed) - end - - def not_done_todo_count(opts={}) - with_not_done_scope(opts) do - self.todos.count - end - end - - def with_not_done_scope(opts={}) - conditions = ["todos.state = ?", 'active'] - if opts.has_key?(:include_project_hidden_todos) && (opts[:include_project_hidden_todos] == true) - conditions = ["(todos.state = ? OR todos.state = ?)", 'active', 'project_hidden'] - end - if opts.has_key?(:tag) - conditions = ["todos.state = ? AND taggings.tag_id = ?", 'active', opts[:tag]] - end - self.todos.send :with_scope, :find => {:conditions => conditions, :include => [:taggings]} do - yield - end - end - - def done_todo_count - self.todos.count_in_state(:completed) - end - - def deferred_todo_count - self.todos.count_in_state(:deferred) - end - - end -end diff --git a/backup.rails2.3/mongrel_workaround.rb b/backup.rails2.3/mongrel_workaround.rb deleted file mode 100644 index 60b207b9..00000000 --- a/backup.rails2.3/mongrel_workaround.rb +++ /dev/null @@ -1,107 +0,0 @@ -# adapted from https://gist.github.com/471663 and https://rails.lighthouseapp.com/projects/8994/tickets/4690-mongrel-doesnt-work-with-rails-238 - -def check_mongrel_around_115 -begin - # Gem.available? is deprecated from rubygems 1.8.2 - Gem::Specification::find_by_name "mongrel", "~>1.1.5" - rescue - if RUBY_VERSION[2] == "9" - false - else - Gem.available?('mongrel', '~>1.1.5') - end - end -end - -mongrel115 = check_mongrel_around_115 - -if Rails.version == '2.3.14' && mongrel115 && self.class.const_defined?(:Mongrel) - - # Pulled right from latest rack. Old looked like this in 1.1.0 version. - # - # def [](k) - # super(@names[k] ||= @names[k.downcase]) - # end - # - module Rack - module Utils - class HeaderHash < Hash - def [](k) - super(@names[k]) if @names[k] - super(@names[k.downcase]) - end - end - end - end - - # Code pulled from the ticket above. - # - class Mongrel::CGIWrapper - def header_with_rails_fix(options = 'text/html') - @head['cookie'] = options.delete('cookie').flatten.map { |v| v.sub(/^\n/,'') } if options.class != String and options['cookie'] - header_without_rails_fix(options) - end - alias_method_chain :header, :rails_fix - end - - # Pulled right from 2.3.10 ActionPack. Simple diff was - # - # if headers.include?('Set-Cookie') - # headers['cookie'] = headers.delete('Set-Cookie').split("\n") - # end - # - # to - # - # if headers['Set-Cookie'] - # headers['cookie'] = headers.delete('Set-Cookie').split("\n") - # end - # - module ActionController - class CGIHandler - def self.dispatch_cgi(app, cgi, out = $stdout) - env = cgi.__send__(:env_table) - env.delete "HTTP_CONTENT_LENGTH" - - cgi.stdinput.extend ProperStream - - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" - - env.update({ - "rack.version" => [0,1], - "rack.input" => cgi.stdinput, - "rack.errors" => $stderr, - "rack.multithread" => false, - "rack.multiprocess" => true, - "rack.run_once" => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http" - }) - - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" - env.delete "PATH_INFO" if env["PATH_INFO"] == "" - - status, headers, body = app.call(env) - begin - out.binmode if out.respond_to?(:binmode) - out.sync = false if out.respond_to?(:sync=) - - headers['Status'] = status.to_s - - if headers['Set-Cookie'] - headers['cookie'] = headers.delete('Set-Cookie').split("\n") - end - - out.write(cgi.header(headers)) - - body.each { |part| - out.write part - out.flush if out.respond_to?(:flush) - } - ensure - body.close if body.respond_to?(:close) - end - end - end - end -end diff --git a/backup.rails2.3/new_rails_defaults.rb b/backup.rails2.3/new_rails_defaults.rb deleted file mode 100644 index c94db0a6..00000000 --- a/backup.rails2.3/new_rails_defaults.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# These settings change the behavior of Rails 2 apps and will be defaults -# for Rails 3. You can remove this initializer when Rails 3 is released. - -if defined?(ActiveRecord) - # Include Active Record class name as root for JSON serialized output. - ActiveRecord::Base.include_root_in_json = true - - # Store the full class name (including module namespace) in STI type column. - ActiveRecord::Base.store_full_sti_class = true -end - -ActionController::Routing.generate_best_match = false - -# Use ISO 8601 format for JSON serialized times and dates. -ActiveSupport.use_standard_json_time_format = true - -# Don't escape HTML entities in JSON, leave that for the #json_escape helper. -# if you're including raw json in an HTML page. -ActiveSupport.escape_html_entities_in_json = false \ No newline at end of file diff --git a/backup.rails2.3/plugins/extra_validations/init.rb b/backup.rails2.3/plugins/extra_validations/init.rb deleted file mode 100644 index 17709ad4..00000000 --- a/backup.rails2.3/plugins/extra_validations/init.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'extra_validations' -ActiveRecord::Base.extend ExtraValidations \ No newline at end of file diff --git a/backup.rails2.3/plugins/extra_validations/lib/extra_validations.rb b/backup.rails2.3/plugins/extra_validations/lib/extra_validations.rb deleted file mode 100644 index be50b659..00000000 --- a/backup.rails2.3/plugins/extra_validations/lib/extra_validations.rb +++ /dev/null @@ -1,29 +0,0 @@ -module ExtraValidations - - # Validates the value of the specified attribute by checking for a forbidden string - # - # class Person < ActiveRecord::Base - # validates_does_not_contain :first_name, :string => ',' - # end - # - # A string must be provided or else an exception will be raised. - # - # Configuration options: - # * message - A custom error message (default is: "is invalid") - # * string - The string to verify is not included (note: must be supplied!) - # * on Specifies when this validation is active (default is :save, other options :create, :update) - # * if - Specifies a method, proc or string to call to determine if the validation should - # occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The - # method, proc or string should return or evaluate to a true or false value. - def validates_does_not_contain(*attr_names) - configuration = { :message => I18n.translate('activerecord.errors.messages')[:invalid], :on => :save, :string => nil } - configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash) - - raise(ArgumentError, "A string must be supplied as the :string option of the configuration hash") unless configuration[:string].is_a?(String) - - validates_each(attr_names, configuration) do |record, attr_name, value| - record.errors.add(attr_name, configuration[:message]) if value.to_s =~ Regexp.new(Regexp.escape(configuration[:string])) - end - end - -end diff --git a/backup.rails2.3/plugins/open_id_authentication/CHANGELOG b/backup.rails2.3/plugins/open_id_authentication/CHANGELOG deleted file mode 100644 index 7349bd3c..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/CHANGELOG +++ /dev/null @@ -1,35 +0,0 @@ -* Fake HTTP method from OpenID server since they only support a GET. Eliminates the need to set an extra route to match the server's reply. [Josh Peek] - -* OpenID 2.0 recommends that forms should use the field name "openid_identifier" rather than "openid_url" [Josh Peek] - -* Return open_id_response.display_identifier to the application instead of .endpoints.claimed_id. [nbibler] - -* Add Timeout protection [Rick] - -* An invalid identity url passed through authenticate_with_open_id will no longer raise an InvalidOpenId exception. Instead it will return Result[:missing] to the completion block. - -* Allow a return_to option to be used instead of the requested url [Josh Peek] - -* Updated plugin to use Ruby OpenID 2.x.x [Josh Peek] - -* Tied plugin to ruby-openid 1.1.4 gem until we can make it compatible with 2.x [DHH] - -* Use URI instead of regexps to normalize the URL and gain free, better matching #8136 [dkubb] - -* Allow -'s in #normalize_url [Rick] - -* remove instance of mattr_accessor, it was breaking tests since they don't load ActiveSupport. Fix Timeout test [Rick] - -* Throw a InvalidOpenId exception instead of just a RuntimeError when the URL can't be normalized [DHH] - -* Just use the path for the return URL, so extra query parameters don't interfere [DHH] - -* Added a new default database-backed store after experiencing trouble with the filestore on NFS. The file store is still available as an option [DHH] - -* Added normalize_url and applied it to all operations going through the plugin [DHH] - -* Removed open_id? as the idea of using the same input box for both OpenID and username has died -- use using_open_id? instead (which checks for the presence of params[:openid_url] by default) [DHH] - -* Added OpenIdAuthentication::Result to make it easier to deal with default situations where you don't care to do something particular for each error state [DHH] - -* Stop relying on root_url being defined, we can just grab the current url instead [DHH] \ No newline at end of file diff --git a/backup.rails2.3/plugins/open_id_authentication/README b/backup.rails2.3/plugins/open_id_authentication/README deleted file mode 100644 index 807cdc75..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/README +++ /dev/null @@ -1,231 +0,0 @@ -OpenIdAuthentication -==================== - -Provides a thin wrapper around the excellent ruby-openid gem from JanRan. Be sure to install that first: - - gem install ruby-openid - -To understand what OpenID is about and how it works, it helps to read the documentation for lib/openid/consumer.rb -from that gem. - -The specification used is http://openid.net/specs/openid-authentication-2_0.html. - - -Prerequisites -============= - -OpenID authentication uses the session, so be sure that you haven't turned that off. It also relies on a number of -database tables to store the authentication keys. So you'll have to run the migration to create these before you get started: - - rake open_id_authentication:db:create - -Or, use the included generators to install or upgrade: - - ./script/generate open_id_authentication_tables MigrationName - ./script/generate upgrade_open_id_authentication_tables MigrationName - -Alternatively, you can use the file-based store, which just relies on on tmp/openids being present in RAILS_ROOT. But be aware that this store only works if you have a single application server. And it's not safe to use across NFS. It's recommended that you use the database store if at all possible. To use the file-based store, you'll also have to add this line to your config/environment.rb: - - OpenIdAuthentication.store = :file - -This particular plugin also relies on the fact that the authentication action allows for both POST and GET operations. -If you're using RESTful authentication, you'll need to explicitly allow for this in your routes.rb. - -The plugin also expects to find a root_url method that points to the home page of your site. You can accomplish this by using a root route in config/routes.rb: - - map.root :controller => 'articles' - -This plugin relies on Rails Edge revision 6317 or newer. - - -Example -======= - -This example is just to meant to demonstrate how you could use OpenID authentication. You might well want to add -salted hash logins instead of plain text passwords and other requirements on top of this. Treat it as a starting point, -not a destination. - -Note that the User model referenced in the simple example below has an 'identity_url' attribute. You will want to add the same or similar field to whatever -model you are using for authentication. - -Also of note is the following code block used in the example below: - - authenticate_with_open_id do |result, identity_url| - ... - end - -In the above code block, 'identity_url' will need to match user.identity_url exactly. 'identity_url' will be a string in the form of 'http://example.com' - -If you are storing just 'example.com' with your user, the lookup will fail. - -There is a handy method in this plugin called 'normalize_url' that will help with validating OpenID URLs. - - OpenIdAuthentication.normalize_url(user.identity_url) - -The above will return a standardized version of the OpenID URL - the above called with 'example.com' will return 'http://example.com/' -It will also raise an InvalidOpenId exception if the URL is determined to not be valid. -Use the above code in your User model and validate OpenID URLs before saving them. - -config/routes.rb - - map.root :controller => 'articles' - map.resource :session - - -app/views/sessions/new.erb - - <% form_tag(session_url) do %> -

- - <%= text_field_tag "name" %> -

- -

- - <%= password_field_tag %> -

- -

- ...or use: -

- -

- - <%= text_field_tag "openid_identifier" %> -

- -

- <%= submit_tag 'Sign in', :disable_with => "Signing in…" %> -

- <% end %> - -app/controllers/sessions_controller.rb - class SessionsController < ApplicationController - def create - if using_open_id? - open_id_authentication - else - password_authentication(params[:name], params[:password]) - end - end - - - protected - def password_authentication(name, password) - if @current_user = @account.users.authenticate(params[:name], params[:password]) - successful_login - else - failed_login "Sorry, that username/password doesn't work" - end - end - - def open_id_authentication - authenticate_with_open_id do |result, identity_url| - if result.successful? - if @current_user = @account.users.find_by_identity_url(identity_url) - successful_login - else - failed_login "Sorry, no user by that identity URL exists (#{identity_url})" - end - else - failed_login result.message - end - end - end - - - private - def successful_login - session[:user_id] = @current_user.id - redirect_to(root_url) - end - - def failed_login(message) - flash[:error] = message - redirect_to(new_session_url) - end - end - - - -If you're fine with the result messages above and don't need individual logic on a per-failure basis, -you can collapse the case into a mere boolean: - - def open_id_authentication - authenticate_with_open_id do |result, identity_url| - if result.successful? && @current_user = @account.users.find_by_identity_url(identity_url) - successful_login - else - failed_login(result.message || "Sorry, no user by that identity URL exists (#{identity_url})") - end - end - end - - -Simple Registration OpenID Extension -==================================== - -Some OpenID Providers support this lightweight profile exchange protocol. See more: http://www.openidenabled.com/openid/simple-registration-extension - -You can support it in your app by changing #open_id_authentication - - def open_id_authentication(identity_url) - # Pass optional :required and :optional keys to specify what sreg fields you want. - # Be sure to yield registration, a third argument in the #authenticate_with_open_id block. - authenticate_with_open_id(identity_url, - :required => [ :nickname, :email ], - :optional => :fullname) do |result, identity_url, registration| - case result.status - when :missing - failed_login "Sorry, the OpenID server couldn't be found" - when :invalid - failed_login "Sorry, but this does not appear to be a valid OpenID" - when :canceled - failed_login "OpenID verification was canceled" - when :failed - failed_login "Sorry, the OpenID verification failed" - when :successful - if @current_user = @account.users.find_by_identity_url(identity_url) - assign_registration_attributes!(registration) - - if current_user.save - successful_login - else - failed_login "Your OpenID profile registration failed: " + - @current_user.errors.full_messages.to_sentence - end - else - failed_login "Sorry, no user by that identity URL exists" - end - end - end - end - - # registration is a hash containing the valid sreg keys given above - # use this to map them to fields of your user model - def assign_registration_attributes!(registration) - model_to_registration_mapping.each do |model_attribute, registration_attribute| - unless registration[registration_attribute].blank? - @current_user.send("#{model_attribute}=", registration[registration_attribute]) - end - end - end - - def model_to_registration_mapping - { :login => 'nickname', :email => 'email', :display_name => 'fullname' } - end - -Attribute Exchange OpenID Extension -=================================== - -Some OpenID providers also support the OpenID AX (attribute exchange) protocol for exchanging identity information between endpoints. See more: http://openid.net/specs/openid-attribute-exchange-1_0.html - -Accessing AX data is very similar to the Simple Registration process, described above -- just add the URI identifier for the AX field to your :optional or :required parameters. For example: - - authenticate_with_open_id(identity_url, - :required => [ :email, 'http://schema.openid.net/birthDate' ]) do |result, identity_url, registration| - -This would provide the sreg data for :email, and the AX data for 'http://schema.openid.net/birthDate' - - - -Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license \ No newline at end of file diff --git a/backup.rails2.3/plugins/open_id_authentication/Rakefile b/backup.rails2.3/plugins/open_id_authentication/Rakefile deleted file mode 100644 index 31074b85..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/Rakefile +++ /dev/null @@ -1,22 +0,0 @@ -require 'rake' -require 'rake/testtask' -require 'rake/rdoctask' - -desc 'Default: run unit tests.' -task :default => :test - -desc 'Test the open_id_authentication plugin.' -Rake::TestTask.new(:test) do |t| - t.libs << 'lib' - t.pattern = 'test/**/*_test.rb' - t.verbose = true -end - -desc 'Generate documentation for the open_id_authentication plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'OpenIdAuthentication' - rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README') - rdoc.rdoc_files.include('lib/**/*.rb') -end diff --git a/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/open_id_authentication_tables_generator.rb b/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/open_id_authentication_tables_generator.rb deleted file mode 100644 index 6f78afc7..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/open_id_authentication_tables_generator.rb +++ /dev/null @@ -1,11 +0,0 @@ -class OpenIdAuthenticationTablesGenerator < Rails::Generator::NamedBase - def initialize(runtime_args, runtime_options = {}) - super - end - - def manifest - record do |m| - m.migration_template 'migration.rb', 'db/migrate' - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/migration.rb b/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/migration.rb deleted file mode 100644 index ef2a0cfb..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/migration.rb +++ /dev/null @@ -1,20 +0,0 @@ -class <%= class_name %> < ActiveRecord::Migration - def self.up - create_table :open_id_authentication_associations, :force => true do |t| - t.integer :issued, :lifetime - t.string :handle, :assoc_type - t.binary :server_url, :secret - end - - create_table :open_id_authentication_nonces, :force => true do |t| - t.integer :timestamp, :null => false - t.string :server_url, :null => true - t.string :salt, :null => false - end - end - - def self.down - drop_table :open_id_authentication_associations - drop_table :open_id_authentication_nonces - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/migration.rb b/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/migration.rb deleted file mode 100644 index d13bbab2..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/migration.rb +++ /dev/null @@ -1,26 +0,0 @@ -class <%= class_name %> < ActiveRecord::Migration - def self.up - drop_table :open_id_authentication_settings - drop_table :open_id_authentication_nonces - - create_table :open_id_authentication_nonces, :force => true do |t| - t.integer :timestamp, :null => false - t.string :server_url, :null => true - t.string :salt, :null => false - end - end - - def self.down - drop_table :open_id_authentication_nonces - - create_table :open_id_authentication_nonces, :force => true do |t| - t.integer :created - t.string :nonce - end - - create_table :open_id_authentication_settings, :force => true do |t| - t.string :setting - t.binary :value - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/upgrade_open_id_authentication_tables_generator.rb b/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/upgrade_open_id_authentication_tables_generator.rb deleted file mode 100644 index 02fddd7f..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/upgrade_open_id_authentication_tables_generator.rb +++ /dev/null @@ -1,11 +0,0 @@ -class UpgradeOpenIdAuthenticationTablesGenerator < Rails::Generator::NamedBase - def initialize(runtime_args, runtime_options = {}) - super - end - - def manifest - record do |m| - m.migration_template 'migration.rb', 'db/migrate' - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/init.rb b/backup.rails2.3/plugins/open_id_authentication/init.rb deleted file mode 100644 index 808c7bdb..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/init.rb +++ /dev/null @@ -1,18 +0,0 @@ -if config.respond_to?(:gems) - config.gem 'ruby-openid', :lib => 'openid', :version => '>=2.0.4' -else - begin - require 'openid' - rescue LoadError - begin - gem 'ruby-openid', '>=2.0.4' - rescue Gem::LoadError - puts "Install the ruby-openid gem to enable OpenID support" - end - end -end - -config.to_prepare do - OpenID::Util.logger = Rails.logger - ActionController::Base.send :include, OpenIdAuthentication -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication.rb deleted file mode 100644 index b485c5fe..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication.rb +++ /dev/null @@ -1,240 +0,0 @@ -require 'uri' -require 'openid/extensions/sreg' -require 'openid/extensions/ax' -require 'openid/store/filesystem' - -require File.dirname(__FILE__) + '/open_id_authentication/association' -require File.dirname(__FILE__) + '/open_id_authentication/nonce' -require File.dirname(__FILE__) + '/open_id_authentication/db_store' -require File.dirname(__FILE__) + '/open_id_authentication/request' -require File.dirname(__FILE__) + '/open_id_authentication/timeout_fixes' if OpenID::VERSION == "2.0.4" - -module OpenIdAuthentication - OPEN_ID_AUTHENTICATION_DIR = RAILS_ROOT + "/tmp/openids" - - def self.store - @@store - end - - def self.store=(*store_option) - store, *parameters = *([ store_option ].flatten) - - @@store = case store - when :db - OpenIdAuthentication::DbStore.new - when :file - OpenID::Store::Filesystem.new(OPEN_ID_AUTHENTICATION_DIR) - else - store - end - end - - self.store = :db - - class InvalidOpenId < StandardError - end - - class Result - ERROR_MESSAGES = { - :missing => "Sorry, the OpenID server couldn't be found", - :invalid => "Sorry, but this does not appear to be a valid OpenID", - :canceled => "OpenID verification was canceled", - :failed => "OpenID verification failed", - :setup_needed => "OpenID verification needs setup" - } - - def self.[](code) - new(code) - end - - def initialize(code) - @code = code - end - - def status - @code - end - - ERROR_MESSAGES.keys.each { |state| define_method("#{state}?") { @code == state } } - - def successful? - @code == :successful - end - - def unsuccessful? - ERROR_MESSAGES.keys.include?(@code) - end - - def message - ERROR_MESSAGES[@code] - end - end - - # normalizes an OpenID according to http://openid.net/specs/openid-authentication-2_0.html#normalization - def self.normalize_identifier(identifier) - # clean up whitespace - identifier = identifier.to_s.strip - - # if an XRI has a prefix, strip it. - identifier.gsub!(/xri:\/\//i, '') - - # dodge XRIs -- TODO: validate, don't just skip. - unless ['=', '@', '+', '$', '!', '('].include?(identifier.at(0)) - # does it begin with http? if not, add it. - identifier = "http://#{identifier}" unless identifier =~ /^http/i - - # strip any fragments - identifier.gsub!(/\#(.*)$/, '') - - begin - uri = URI.parse(identifier) - uri.scheme = uri.scheme.downcase # URI should do this - identifier = uri.normalize.to_s - rescue URI::InvalidURIError - raise InvalidOpenId.new("#{identifier} is not an OpenID identifier") - end - end - - return identifier - end - - # deprecated for OpenID 2.0, where not all OpenIDs are URLs - def self.normalize_url(url) - ActiveSupport::Deprecation.warn "normalize_url has been deprecated, use normalize_identifier instead" - self.normalize_identifier(url) - end - - protected - def normalize_url(url) - OpenIdAuthentication.normalize_url(url) - end - - def normalize_identifier(url) - OpenIdAuthentication.normalize_identifier(url) - end - - # The parameter name of "openid_identifier" is used rather than the Rails convention "open_id_identifier" - # because that's what the specification dictates in order to get browser auto-complete working across sites - def using_open_id?(identity_url = nil) #:doc: - identity_url ||= params[:openid_identifier] || params[:openid_url] - !identity_url.blank? || params[:open_id_complete] - end - - def authenticate_with_open_id(identity_url = nil, options = {}, &block) #:doc: - identity_url ||= params[:openid_identifier] || params[:openid_url] - - if params[:open_id_complete].nil? - begin_open_id_authentication(identity_url, options, &block) - else - complete_open_id_authentication(&block) - end - end - - private - def begin_open_id_authentication(identity_url, options = {}) - identity_url = normalize_identifier(identity_url) - return_to = options.delete(:return_to) - method = options.delete(:method) - - options[:required] ||= [] # reduces validation later - options[:optional] ||= [] - - open_id_request = open_id_consumer.begin(identity_url) - add_simple_registration_fields(open_id_request, options) - add_ax_fields(open_id_request, options) - redirect_to(open_id_redirect_url(open_id_request, return_to, method)) - rescue OpenIdAuthentication::InvalidOpenId => e - yield Result[:invalid], identity_url, nil - rescue OpenID::OpenIDError, Timeout::Error => e - logger.error("[OPENID] #{e}") - yield Result[:missing], identity_url, nil - end - - def complete_open_id_authentication - params_with_path = params.reject { |key, value| request.path_parameters[key] } - params_with_path.delete(:format) - open_id_response = timeout_protection_from_identity_server { open_id_consumer.complete(params_with_path, requested_url) } - identity_url = normalize_identifier(open_id_response.display_identifier) if open_id_response.display_identifier - - case open_id_response.status - when OpenID::Consumer::SUCCESS - profile_data = {} - - # merge the SReg data and the AX data into a single hash of profile data - [ OpenID::SReg::Response, OpenID::AX::FetchResponse ].each do |data_response| - if data_response.from_success_response( open_id_response ) - profile_data.merge! data_response.from_success_response( open_id_response ).data - end - end - - yield Result[:successful], identity_url, profile_data - when OpenID::Consumer::CANCEL - yield Result[:canceled], identity_url, nil - when OpenID::Consumer::FAILURE - yield Result[:failed], identity_url, nil - when OpenID::Consumer::SETUP_NEEDED - yield Result[:setup_needed], open_id_response.setup_url, nil - end - end - - def open_id_consumer - OpenID::Consumer.new(session, OpenIdAuthentication.store) - end - - def add_simple_registration_fields(open_id_request, fields) - sreg_request = OpenID::SReg::Request.new - - # filter out AX identifiers (URIs) - required_fields = fields[:required].collect { |f| f.to_s unless f =~ /^https?:\/\// }.compact - optional_fields = fields[:optional].collect { |f| f.to_s unless f =~ /^https?:\/\// }.compact - - sreg_request.request_fields(required_fields, true) unless required_fields.blank? - sreg_request.request_fields(optional_fields, false) unless optional_fields.blank? - sreg_request.policy_url = fields[:policy_url] if fields[:policy_url] - open_id_request.add_extension(sreg_request) - end - - def add_ax_fields( open_id_request, fields ) - ax_request = OpenID::AX::FetchRequest.new - - # look through the :required and :optional fields for URIs (AX identifiers) - fields[:required].each do |f| - next unless f =~ /^https?:\/\// - ax_request.add( OpenID::AX::AttrInfo.new( f, nil, true ) ) - end - - fields[:optional].each do |f| - next unless f =~ /^https?:\/\// - ax_request.add( OpenID::AX::AttrInfo.new( f, nil, false ) ) - end - - open_id_request.add_extension( ax_request ) - end - - def open_id_redirect_url(open_id_request, return_to = nil, method = nil) - open_id_request.return_to_args['_method'] = (method || request.method).to_s - open_id_request.return_to_args['open_id_complete'] = '1' - open_id_request.redirect_url(root_url, return_to || requested_url) - end - - def requested_url - relative_url_root = self.class.respond_to?(:relative_url_root) ? - self.class.relative_url_root.to_s : - request.relative_url_root - "#{request.protocol}#{request.host_with_port}#{ActionController::Base.relative_url_root}#{request.path}" - end - - def timeout_protection_from_identity_server - yield - rescue Timeout::Error - Class.new do - def status - OpenID::FAILURE - end - - def msg - "Identity server timed out" - end - end.new - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/association.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/association.rb deleted file mode 100644 index 9654eaeb..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/association.rb +++ /dev/null @@ -1,9 +0,0 @@ -module OpenIdAuthentication - class Association < ActiveRecord::Base - set_table_name :open_id_authentication_associations - - def from_record - OpenID::Association.new(handle, secret, issued, lifetime, assoc_type) - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/db_store.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/db_store.rb deleted file mode 100644 index 780fb6ad..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/db_store.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'openid/store/interface' - -module OpenIdAuthentication - class DbStore < OpenID::Store::Interface - def self.cleanup_nonces - now = Time.now.to_i - Nonce.delete_all(["timestamp > ? OR timestamp < ?", now + OpenID::Nonce.skew, now - OpenID::Nonce.skew]) - end - - def self.cleanup_associations - now = Time.now.to_i - Association.delete_all(['issued + lifetime > ?',now]) - end - - def store_association(server_url, assoc) - remove_association(server_url, assoc.handle) - Association.create(:server_url => server_url, - :handle => assoc.handle, - :secret => assoc.secret, - :issued => assoc.issued, - :lifetime => assoc.lifetime, - :assoc_type => assoc.assoc_type) - end - - def get_association(server_url, handle = nil) - assocs = if handle.blank? - Association.find_all_by_server_url(server_url) - else - Association.find_all_by_server_url_and_handle(server_url, handle) - end - - assocs.reverse.each do |assoc| - a = assoc.from_record - if a.expires_in == 0 - assoc.destroy - else - return a - end - end if assocs.any? - - return nil - end - - def remove_association(server_url, handle) - Association.delete_all(['server_url = ? AND handle = ?', server_url, handle]) > 0 - end - - def use_nonce(server_url, timestamp, salt) - return false if Nonce.find_by_server_url_and_timestamp_and_salt(server_url, timestamp, salt) - return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew - Nonce.create(:server_url => server_url, :timestamp => timestamp, :salt => salt) - return true - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/nonce.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/nonce.rb deleted file mode 100644 index c52f6c50..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/nonce.rb +++ /dev/null @@ -1,5 +0,0 @@ -module OpenIdAuthentication - class Nonce < ActiveRecord::Base - set_table_name :open_id_authentication_nonces - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/request.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/request.rb deleted file mode 100644 index e0cc8e3f..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/request.rb +++ /dev/null @@ -1,23 +0,0 @@ -module OpenIdAuthentication - module Request - def self.included(base) - base.alias_method_chain :request_method, :openid - end - - def request_method_with_openid - if !parameters[:_method].blank? && parameters[:open_id_complete] == '1' - parameters[:_method].to_sym - else - request_method_without_openid - end - end - end -end - -# In Rails 2.3, the request object has been renamed -# from AbstractRequest to Request -if defined? ActionController::Request - ActionController::Request.send :include, OpenIdAuthentication::Request -else - ActionController::AbstractRequest.send :include, OpenIdAuthentication::Request -end diff --git a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/timeout_fixes.rb b/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/timeout_fixes.rb deleted file mode 100644 index cc711c9a..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/lib/open_id_authentication/timeout_fixes.rb +++ /dev/null @@ -1,20 +0,0 @@ -# http://trac.openidenabled.com/trac/ticket/156 -module OpenID - @@timeout_threshold = 20 - - def self.timeout_threshold - @@timeout_threshold - end - - def self.timeout_threshold=(value) - @@timeout_threshold = value - end - - class StandardFetcher - def make_http(uri) - http = @proxy.new(uri.host, uri.port) - http.read_timeout = http.open_timeout = OpenID.timeout_threshold - http - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake b/backup.rails2.3/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake deleted file mode 100644 index c71434a5..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake +++ /dev/null @@ -1,30 +0,0 @@ -namespace :open_id_authentication do - namespace :db do - desc "Creates authentication tables for use with OpenIdAuthentication" - task :create => :environment do - generate_migration(["open_id_authentication_tables", "add_open_id_authentication_tables"]) - end - - desc "Upgrade authentication tables from ruby-openid 1.x.x to 2.x.x" - task :upgrade => :environment do - generate_migration(["upgrade_open_id_authentication_tables", "upgrade_open_id_authentication_tables"]) - end - - def generate_migration(args) - require 'rails_generator' - require 'rails_generator/scripts/generate' - - if ActiveRecord::Base.connection.supports_migrations? - Rails::Generator::Scripts::Generate.new.run(args) - else - raise "Task unavailable to this database (no migration support)" - end - end - - desc "Clear the authentication tables" - task :clear => :environment do - OpenIdAuthentication::DbStore.cleanup_nonces - OpenIdAuthentication::DbStore.cleanup_associations - end - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/test/normalize_test.rb b/backup.rails2.3/plugins/open_id_authentication/test/normalize_test.rb deleted file mode 100644 index 635d3abc..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/test/normalize_test.rb +++ /dev/null @@ -1,32 +0,0 @@ -require File.dirname(__FILE__) + '/test_helper' - -class NormalizeTest < Test::Unit::TestCase - include OpenIdAuthentication - - NORMALIZATIONS = { - "openid.aol.com/nextangler" => "http://openid.aol.com/nextangler", - "http://openid.aol.com/nextangler" => "http://openid.aol.com/nextangler", - "https://openid.aol.com/nextangler" => "https://openid.aol.com/nextangler", - "HTTP://OPENID.AOL.COM/NEXTANGLER" => "http://openid.aol.com/NEXTANGLER", - "HTTPS://OPENID.AOL.COM/NEXTANGLER" => "https://openid.aol.com/NEXTANGLER", - "loudthinking.com" => "http://loudthinking.com/", - "http://loudthinking.com" => "http://loudthinking.com/", - "http://loudthinking.com:80" => "http://loudthinking.com/", - "https://loudthinking.com:443" => "https://loudthinking.com/", - "http://loudthinking.com:8080" => "http://loudthinking.com:8080/", - "techno-weenie.net" => "http://techno-weenie.net/", - "http://techno-weenie.net" => "http://techno-weenie.net/", - "http://techno-weenie.net " => "http://techno-weenie.net/", - "=name" => "=name" - } - - def test_normalizations - NORMALIZATIONS.each do |from, to| - assert_equal to, normalize_identifier(from) - end - end - - def test_broken_open_id - assert_raises(InvalidOpenId) { normalize_identifier(nil) } - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/test/open_id_authentication_test.rb b/backup.rails2.3/plugins/open_id_authentication/test/open_id_authentication_test.rb deleted file mode 100644 index ddcc17b9..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/test/open_id_authentication_test.rb +++ /dev/null @@ -1,46 +0,0 @@ -require File.dirname(__FILE__) + '/test_helper' - -class OpenIdAuthenticationTest < Test::Unit::TestCase - def setup - @controller = Class.new do - include OpenIdAuthentication - def params() {} end - end.new - end - - def test_authentication_should_fail_when_the_identity_server_is_missing - open_id_consumer = mock() - open_id_consumer.expects(:begin).raises(OpenID::OpenIDError) - @controller.expects(:open_id_consumer).returns(open_id_consumer) - @controller.expects(:logger).returns(mock(:error => true)) - - @controller.send(:authenticate_with_open_id, "http://someone.example.com") do |result, identity_url| - assert result.missing? - assert_equal "Sorry, the OpenID server couldn't be found", result.message - end - end - - def test_authentication_should_be_invalid_when_the_identity_url_is_invalid - @controller.send(:authenticate_with_open_id, "!") do |result, identity_url| - assert result.invalid?, "Result expected to be invalid but was not" - assert_equal "Sorry, but this does not appear to be a valid OpenID", result.message - end - end - - def test_authentication_should_fail_when_the_identity_server_times_out - open_id_consumer = mock() - open_id_consumer.expects(:begin).raises(Timeout::Error, "Identity Server took too long.") - @controller.expects(:open_id_consumer).returns(open_id_consumer) - @controller.expects(:logger).returns(mock(:error => true)) - - @controller.send(:authenticate_with_open_id, "http://someone.example.com") do |result, identity_url| - assert result.missing? - assert_equal "Sorry, the OpenID server couldn't be found", result.message - end - end - - def test_authentication_should_begin_when_the_identity_server_is_present - @controller.expects(:begin_open_id_authentication) - @controller.send(:authenticate_with_open_id, "http://someone.example.com") - end -end diff --git a/backup.rails2.3/plugins/open_id_authentication/test/status_test.rb b/backup.rails2.3/plugins/open_id_authentication/test/status_test.rb deleted file mode 100644 index b1d5e093..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/test/status_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/test_helper' - -class StatusTest < Test::Unit::TestCase - include OpenIdAuthentication - - def test_state_conditional - assert Result[:missing].missing? - assert Result[:missing].unsuccessful? - assert !Result[:missing].successful? - - assert Result[:successful].successful? - assert !Result[:successful].unsuccessful? - end -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/open_id_authentication/test/test_helper.rb b/backup.rails2.3/plugins/open_id_authentication/test/test_helper.rb deleted file mode 100644 index 43216e1e..00000000 --- a/backup.rails2.3/plugins/open_id_authentication/test/test_helper.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'test/unit' -require 'rubygems' - -gem 'activesupport' -require 'active_support' - -gem 'actionpack' -require 'action_controller' - -gem 'mocha' -require 'mocha' - -gem 'ruby-openid' -require 'openid' - -RAILS_ROOT = File.dirname(__FILE__) unless defined? RAILS_ROOT -require File.dirname(__FILE__) + "/../lib/open_id_authentication" diff --git a/backup.rails2.3/plugins/resource_feeder/README b/backup.rails2.3/plugins/resource_feeder/README deleted file mode 100644 index 5502be25..00000000 --- a/backup.rails2.3/plugins/resource_feeder/README +++ /dev/null @@ -1,7 +0,0 @@ -ResourceFeeder -============== - -Simple feeds for resources - -NOTE: This plugin depends on the latest version of simply_helpful, available here: -http://dev.rubyonrails.org/svn/rails/plugins/simply_helpful/ diff --git a/backup.rails2.3/plugins/resource_feeder/Rakefile b/backup.rails2.3/plugins/resource_feeder/Rakefile deleted file mode 100644 index 51fce7b3..00000000 --- a/backup.rails2.3/plugins/resource_feeder/Rakefile +++ /dev/null @@ -1,22 +0,0 @@ -require 'rake' -require 'rake/testtask' -require 'rake/rdoctask' - -desc 'Default: run unit tests.' -task :default => :test - -desc 'Test the resource_feed plugin.' -Rake::TestTask.new(:test) do |t| - t.libs << 'lib' - t.pattern = 'test/**/*_test.rb' - t.verbose = true -end - -desc 'Generate documentation for the resource_feed plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'ResourceFeed' - rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README') - rdoc.rdoc_files.include('lib/**/*.rb') -end diff --git a/backup.rails2.3/plugins/resource_feeder/init.rb b/backup.rails2.3/plugins/resource_feeder/init.rb deleted file mode 100644 index 7b55d76f..00000000 --- a/backup.rails2.3/plugins/resource_feeder/init.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'resource_feeder' -ActionController::Base.send(:include, ResourceFeeder::Rss, ResourceFeeder::Atom) \ No newline at end of file diff --git a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder.rb b/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder.rb deleted file mode 100644 index b5003419..00000000 --- a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'resource_feeder/rss' -require 'resource_feeder/atom' diff --git a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/atom.rb b/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/atom.rb deleted file mode 100644 index 40af87df..00000000 --- a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/atom.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'resource_feeder/common' - -module ResourceFeeder - module Atom - include ResourceFeeder::Common - include ActionController::Routing - extend self - - def render_atom_feed_for(resources, options = {}) - render :text => atom_feed_for(resources, options), :content_type => Mime::ATOM - end - - def atom_feed_for(resources, options = {}) - xml = Builder::XmlMarkup.new(:indent => 2) - - options[:feed] ||= {} - options[:item] ||= {} - options[:url_writer] ||= self - - if options[:class] || resources.first - klass = options[:class] || resources.first.class - new_record = klass.new - else - options[:feed] = { :title => "Empty", :link => "http://example.com" } - end - - options[:feed][:title] ||= klass.name.pluralize - options[:feed][:id] ||= "tag:#{request.host_with_port}:#{klass.name.pluralize}" - options[:feed][:link] ||= polymorphic_url(new_record, :controller => options[:url_writer].controller_name) - - options[:item][:title] ||= [ :title, :subject, :headline, :name ] - options[:item][:description] ||= [ :description, :body, :content ] - options[:item][:pub_date] ||= [ :updated_at, :updated_on, :created_at, :created_on ] - options[:item][:author] ||= [ :author, :creator ] - - resource_link = lambda { |r| polymorphic_url(r, :controller => options[:url_writer].controller_name) } - - xml.instruct! - xml.feed "xml:lang" => "en-US", "xmlns" => 'http://www.w3.org/2005/Atom' do - xml.title(options[:feed][:title]) - xml.id(options[:feed][:id]) - xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:feed][:link]) - xml.link(:rel => 'self', :type => 'application/atom+xml', :href => options[:feed][:self]) if options[:feed][:self] - xml.subtitle(options[:feed][:description]) if options[:feed][:description] - - for resource in resources - published_at = call_or_read(options[:item][:pub_date], resource) - - xml.entry do - xml.title(call_or_read(options[:item][:title], resource)) - xml.content(call_or_read(options[:item][:description], resource), :type => 'html') - xml.id("tag:#{request.host_with_port},#{published_at.xmlschema}:#{call_or_read(options[:item][:guid] || options[:item][:link] || resource_link, resource)}") - xml.published(published_at.xmlschema) - xml.updated((resource.respond_to?(:updated_at) ? call_or_read(options[:item][:pub_date] || :updated_at, resource) : published_at).xmlschema) - xml.link(:rel => 'alternate', :type => 'text/html', :href => call_or_read(options[:item][:link] || options[:item][:guid] || resource_link, resource)) - - if author = call_or_read(options[:item][:author], resource) - xml.author do - xml.name() - end - end - end - end - end - end - end -end diff --git a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/common.rb b/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/common.rb deleted file mode 100644 index 383b965e..00000000 --- a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/common.rb +++ /dev/null @@ -1,24 +0,0 @@ -module ResourceFeeder - module Common - private - def call_or_read(procedure_or_attributes, resource) - case procedure_or_attributes - when nil - raise ArgumentError, "WTF is nil here? #{resource.inspect}" - when Array - attributes = procedure_or_attributes - if attr = attributes.select { |a| resource.respond_to?(a) }.first - resource.send attr - end - when Symbol - attribute = procedure_or_attributes - resource.send(attribute) - when Proc - procedure = procedure_or_attributes - procedure.call(resource) - else - raise ArgumentError, "WTF is #{procedure_or_attributes.inspect} here? #{resource.inspect}" - end - end - end -end diff --git a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/rss.rb b/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/rss.rb deleted file mode 100644 index d3fa56d7..00000000 --- a/backup.rails2.3/plugins/resource_feeder/lib/resource_feeder/rss.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'resource_feeder/common' - -module ResourceFeeder - module Rss - include ResourceFeeder::Common - include ActionController::Routing - extend self - - def render_rss_feed_for(resources, options = {}) - render :text => rss_feed_for(resources, options), :content_type => Mime::RSS - end - - def rss_feed_for(resources, options = {}) - xml = Builder::XmlMarkup.new(:indent => 2) - - options[:feed] ||= {} - options[:item] ||= {} - options[:url_writer] ||= self - - if options[:class] || resources.first - klass = options[:class] || resources.first.class - new_record = klass.new - else - options[:feed] = { :title => "Empty", :link => "http://example.com" } - end - use_content_encoded = options[:item].has_key?(:content_encoded) - - options[:feed][:title] ||= klass.name.pluralize - options[:feed][:link] ||= polymorphic_url(new_record, :controller => options[:url_writer].controller_name) - options[:feed][:language] ||= "en-us" - options[:feed][:ttl] ||= "40" - - options[:item][:title] ||= [ :title, :subject, :headline, :name ] - options[:item][:description] ||= [ :description, :body, :content ] - options[:item][:pub_date] ||= [ :updated_at, :updated_on, :created_at, :created_on ] - - resource_link = lambda { |r| polymorphic_url(r, :controller => options[:url_writer].controller_name) } - - rss_root_attributes = { :version => 2.0 } - rss_root_attributes.merge!("xmlns:content" => "http://purl.org/rss/1.0/modules/content/") if use_content_encoded - - xml.instruct! - - xml.rss(rss_root_attributes) do - xml.channel do - xml.title(options[:feed][:title]) - xml.link(options[:feed][:link]) - xml.description(options[:feed][:description]) if options[:feed][:description] - xml.language(options[:feed][:language]) - xml.ttl(options[:feed][:ttl]) - - for resource in resources - xml.item do - xml.title(call_or_read(options[:item][:title], resource)) - xml.description(call_or_read(options[:item][:description], resource)) - if use_content_encoded then - xml.content(:encoded) { xml.cdata!(call_or_read(options[:item][:content_encoded], resource)) } - end - xml.pubDate(call_or_read(options[:item][:pub_date], resource).to_s(:rfc822)) - xml.guid(call_or_read(options[:item][:guid] || options[:item][:link] || resource_link, resource)) - xml.link(call_or_read(options[:item][:link] || options[:item][:guid] || resource_link, resource)) - end - end - end - end - end - end -end diff --git a/backup.rails2.3/plugins/resource_feeder/test/atom_feed_test.rb b/backup.rails2.3/plugins/resource_feeder/test/atom_feed_test.rb deleted file mode 100644 index 3112da47..00000000 --- a/backup.rails2.3/plugins/resource_feeder/test/atom_feed_test.rb +++ /dev/null @@ -1,85 +0,0 @@ -require File.dirname(__FILE__) + '/test_helper' -class AtomFeedTest < Test::Unit::TestCase - attr_reader :request - - def setup - @request = OpenStruct.new - @request.host_with_port = 'example.com' - @records = Array.new(5).fill(Post.new) - @records.each &:save - end - - def test_default_atom_feed - atom_feed_for @records - - assert_select 'feed' do - assert_select '>title', 'Posts' - assert_select '>id', "tag:#{request.host_with_port}:Posts" - assert_select '>link' do - assert_select "[rel='alternate']" - assert_select "[type='text/html']" - assert_select "[href='http://example.com/posts']" - end - assert_select 'entry', 5 do - assert_select 'title', :text => 'feed title (title)' - assert_select "content[type='html']", '<p>feed description (description)</p>' - assert_select 'id', "tag:#{request.host_with_port},#{@records.first.created_at.xmlschema}:#{'http://example.com/posts/1'}" - assert_select 'published', @records.first.created_at.xmlschema - assert_select 'updated', @records.first.created_at.xmlschema - assert_select 'link' do - assert_select "[rel='alternate']" - assert_select "[type='text/html']" - assert_select "[href='http://example.com/posts/1']" - end - end - end - end - - def test_should_allow_custom_feed_options - atom_feed_for @records, :feed => { :title => 'Custom Posts', :link => '/posts', :description => 'stuff', :self => '/posts.atom' } - - assert_select 'feed>title', 'Custom Posts' - assert_select "feed>link[href='/posts']" - assert_select 'feed>subtitle', 'stuff' - assert_select 'feed>link' do - assert_select "[rel='self']" - assert_select "[type='application/atom+xml']" - assert_select "[href='/posts.atom']" - end - end - - def test_should_allow_custom_item_attributes - atom_feed_for @records, :item => { :title => :name, :description => :body, :pub_date => :create_date, :link => :id } - - assert_select 'entry', 5 do - assert_select 'title', :text => 'feed title (name)' - assert_select "content[type='html']", '<p>feed description (body)</p>' - assert_select 'published', (@records.first.created_at - 5.minutes).xmlschema - assert_select 'updated', (@records.first.created_at - 5.minutes).xmlschema - assert_select 'id', "tag:#{request.host_with_port},#{(@records.first.created_at - 5.minutes).xmlschema}:1" - assert_select 'link' do - assert_select "[rel='alternate']" - assert_select "[type='text/html']" - assert_select "[href='1']" - end - end - end - - def test_should_allow_custom_item_attribute_blocks - atom_feed_for @records, :item => { :title => lambda { |r| r.name }, :description => lambda { |r| r.body }, :pub_date => lambda { |r| r.create_date }, - :link => lambda { |r| "/#{r.created_at.to_i}" }, :guid => lambda { |r| r.created_at.to_i } } - - assert_select 'entry', 5 do - assert_select 'title', :text => 'feed title (name)' - assert_select "content[type='html']", '<p>feed description (body)</p>' - assert_select 'published', (@records.first.created_at - 5.minutes).xmlschema - assert_select 'updated', (@records.first.created_at - 5.minutes).xmlschema - assert_select 'id', /:\d+$/ - assert_select 'link' do - assert_select "[rel='alternate']" - assert_select "[type='text/html']" - assert_select "[href=?]", /^\/\d+$/ - end - end - end -end diff --git a/backup.rails2.3/plugins/resource_feeder/test/rss_feed_test.rb b/backup.rails2.3/plugins/resource_feeder/test/rss_feed_test.rb deleted file mode 100644 index 90525baf..00000000 --- a/backup.rails2.3/plugins/resource_feeder/test/rss_feed_test.rb +++ /dev/null @@ -1,86 +0,0 @@ -require File.dirname(__FILE__) + '/test_helper' -class RssFeedTest < Test::Unit::TestCase - def setup - @records = Array.new(5).fill(Post.new) - @records.each &:save - end - - def test_default_rss_feed - rss_feed_for @records - - assert_select 'rss[version="2.0"]' do - assert_select 'channel' do - assert_select '>title', 'Posts' - assert_select '>link', 'http://example.com/posts' - assert_select 'language', 'en-us' - assert_select 'ttl', '40' - end - assert_select 'item', 5 do - assert_select 'title', :text => 'feed title (title)' - assert_select 'description', '<p>feed description (description)</p>' - %w(guid link).each do |node| - assert_select node, 'http://example.com/posts/1' - end - assert_select 'pubDate', @records.first.created_at.to_s(:rfc822) - end - end - end - - def test_should_allow_custom_feed_options - rss_feed_for @records, :feed => { :title => 'Custom Posts', :link => '/posts', :description => 'stuff', :language => 'en-gb', :ttl => '80' } - - assert_select 'channel>title', 'Custom Posts' - assert_select 'channel>link', '/posts' - assert_select 'channel>description', 'stuff' - assert_select 'channel>language', 'en-gb' - assert_select 'channel>ttl', '80' - end - - def test_should_allow_custom_item_attributes - rss_feed_for @records, :item => { :title => :name, :description => :body, :pub_date => :create_date, :link => :id } - - assert_select 'item', 5 do - assert_select 'title', :text => 'feed title (name)' - assert_select 'description', '<p>feed description (body)</p>' - assert_select 'pubDate', (@records.first.created_at - 5.minutes).to_s(:rfc822) - assert_select 'link', '1' - assert_select 'guid', '1' - end - end - - def test_should_allow_custom_item_attribute_blocks - rss_feed_for @records, :item => { :title => lambda { |r| r.name }, :description => lambda { |r| r.body }, :pub_date => lambda { |r| r.create_date }, - :link => lambda { |r| "/#{r.created_at.to_i}" }, :guid => lambda { |r| r.created_at.to_i } } - - assert_select 'item', 5 do - assert_select 'title', :text => 'feed title (name)' - assert_select 'description', '<p>feed description (body)</p>' - assert_select 'pubDate', (@records.first.created_at - 5.minutes).to_s(:rfc822) - end - end - - # note that assert_select isnt easily able to get elements that have xml namespaces (as it thinks they are - # invalid html psuedo children), so we do some manual testing with the response body - def test_should_allow_content_encoded_for_items - rss_feed_for @records, :item => { :content_encoded => :full_html_body } - - html_content = "Here is some full content, with out any excerpts" - assert_equal 5, @response.body.scan("").size - assert_select 'item', 5 do - assert_select 'description + *', " { :content_encoded => :full_html_body } - assert_equal %[\n], - @response.body.grep(/\n], - @response.body.grep(/feed description (#{attr_name})

" - end - end - - def full_html_body - "Here is some full content, with out any excerpts" - end - - def create_date - @created_at - 5.minutes - end -end - -class Test::Unit::TestCase - include ResourceFeeder::Rss, ResourceFeeder::Atom - - def render_feed(xml) - @response = OpenStruct.new - @response.headers = {'Content-Type' => 'text/xml'} - @response.body = xml - end - - def rss_feed_for_with_ostruct(resources, options = {}) - render_feed rss_feed_for_without_ostruct(resources, options) - end - - def atom_feed_for_with_ostruct(resources, options = {}) - render_feed atom_feed_for_without_ostruct(resources, options) - end - - alias_method_chain :rss_feed_for, :ostruct - alias_method_chain :atom_feed_for, :ostruct - - def html_document - @html_document ||= HTML::Document.new(@response.body, false, true) - end - - def posts_url - "http://example.com/posts" - end - - def post_url(post) - "http://example.com/posts/#{post.id}" - end -end diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/README b/backup.rails2.3/plugins/simple_ldap_authenticator/README deleted file mode 100644 index dc8ca509..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/README +++ /dev/null @@ -1,5 +0,0 @@ -SimpleLdapAuthenticator -======================= - -Allows for simple authentication to an LDAP server with a minimum of -configuration. See the RDoc for details. diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/Rakefile b/backup.rails2.3/plugins/simple_ldap_authenticator/Rakefile deleted file mode 100644 index f7c3459e..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/Rakefile +++ /dev/null @@ -1,22 +0,0 @@ -require 'rake' -require 'rake/testtask' -require 'rake/rdoctask' - -desc 'Default: run unit tests.' -task :default => :test - -desc 'Test the simple_ldap_authenticator plugin.' -Rake::TestTask.new(:test) do |t| - t.libs << 'lib' - t.pattern = 'test/**/*_test.rb' - t.verbose = true -end - -desc 'Generate documentation for the simple_ldap_authenticator plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'SimpleLdapAuthenticator' - rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README') - rdoc.rdoc_files.include('lib/**/*.rb') -end diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/init.rb b/backup.rails2.3/plugins/simple_ldap_authenticator/init.rb deleted file mode 100644 index 85917669..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/init.rb +++ /dev/null @@ -1,2 +0,0 @@ -# Include hook code here -#require 'simple_ldap_authenticator' diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/install.rb b/backup.rails2.3/plugins/simple_ldap_authenticator/install.rb deleted file mode 100644 index f7732d37..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/install.rb +++ /dev/null @@ -1 +0,0 @@ -# Install hook code here diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/lib/simple_ldap_authenticator.rb b/backup.rails2.3/plugins/simple_ldap_authenticator/lib/simple_ldap_authenticator.rb deleted file mode 100644 index 2992d892..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/lib/simple_ldap_authenticator.rb +++ /dev/null @@ -1,127 +0,0 @@ -# SimpleLdapAuthenticator -# -# This plugin supports both Ruby/LDAP and Net::LDAP, defaulting to Ruby/LDAP -# if it is available. If both are installed and you want to force the use of -# Net::LDAP, set SimpleLdapAuthenticator.ldap_library = 'net/ldap'. - -# Allows for easily authenticating users via LDAP (or LDAPS). If authenticating -# via LDAP to a server running on localhost, you should only have to configure -# the login_format. -# -# Can be configured using the following accessors (with examples): -# * login_format = '%s@domain.com' # Active Directory, OR -# * login_format = 'cn=%s,cn=users,o=organization,c=us' # Other LDAP servers -# * servers = ['dc1.domain.com', 'dc2.domain.com'] # names/addresses of LDAP servers to use -# * use_ssl = true # for logging in via LDAPS -# * port = 3289 # instead of 389 for LDAP or 636 for LDAPS -# * logger = RAILS_DEFAULT_LOGGER # for logging authentication successes/failures -# -# The class is used as a global variable, you are not supposed to create an -# instance of it. For example: -# -# require 'simple_ldap_authenticator' -# SimpleLdapAuthenticator.servers = %w'dc1.domain.com dc2.domain.com' -# SimpleLdapAuthenticator.use_ssl = true -# SimpleLdapAuthenticator.login_format = '%s@domain.com' -# SimpleLdapAuthenticator.logger = RAILS_DEFAULT_LOGGER -# class LoginController < ApplicationController -# def login -# return redirect_to(:action=>'try_again') unless SimpleLdapAuthenticator.valid?(params[:username], params[:password]) -# session[:username] = params[:username] -# end -# end -class SimpleLdapAuthenticator - class << self - @servers = ['127.0.0.1'] - @use_ssl = false - @login_format = '%s' - attr_accessor :servers, :use_ssl, :port, :login_format, :logger, :connection, :ldap_library - - # Load the required LDAP library, either 'ldap' or 'net/ldap' - def load_ldap_library - return if @ldap_library_loaded - if ldap_library - if ldap_library == 'net/ldap' - require 'net/ldap' - else - require 'ldap' - require 'ldap/control' - end - else - begin - require 'ldap' - require 'ldap/control' - ldap_library = 'ldap' - rescue LoadError - require 'net/ldap' - ldap_library = 'net/ldap' - end - end - @ldap_library_loaded = true - end - - # The next LDAP server to which to connect - def server - servers[0] - end - - # The connection to the LDAP server. A single connection is made and the - # connection is only changed if a server returns an error other than - # invalid password. - def connection - return @connection if @connection - load_ldap_library - @connection = if ldap_library == 'net/ldap' - Net::LDAP.new(:host=>server, :port=>(port), :encryption=>(:simple_tls if use_ssl)) - else - (use_ssl ? LDAP::SSLConn : LDAP::Conn).new(server, port) - end - end - - # The port to use. Defaults to 389 for LDAP and 636 for LDAPS. - def port - @port ||= use_ssl ? 636 : 389 - end - - # Disconnect from current LDAP server and use a different LDAP server on the - # next authentication attempt - def switch_server - self.connection = nil - servers << servers.shift - end - - # Check the validity of a login/password combination - def valid?(login, password) - if ldap_library == 'net/ldap' - connection.authenticate(login_format % login.to_s, password.to_s) - begin - if connection.bind - logger.info("Authenticated #{login.to_s} by #{server}") if logger - true - else - logger.info("Error attempting to authenticate #{login.to_s} by #{server}: #{connection.get_operation_result.code} #{connection.get_operation_result.message}") if logger - switch_server unless connection.get_operation_result.code == 49 - false - end - rescue Net::LDAP::LdapError => error - logger.info("Error attempting to authenticate #{login.to_s} by #{server}: #{error.message}") if logger - switch_server - false - end - else - connection.unbind if connection.bound? - begin - connection.bind(login_format % login.to_s, password.to_s) - connection.unbind - logger.info("Authenticated #{login.to_s} by #{server}") if logger - true - rescue LDAP::ResultError => error - connection.unbind if connection.bound? - logger.info("Error attempting to authenticate #{login.to_s} by #{server}: #{error.message}") if logger - switch_server unless error.message == 'Invalid credentials' - false - end - end - end - end -end diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/tasks/simple_ldap_authenticator_tasks.rake b/backup.rails2.3/plugins/simple_ldap_authenticator/tasks/simple_ldap_authenticator_tasks.rake deleted file mode 100644 index 1916c233..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/tasks/simple_ldap_authenticator_tasks.rake +++ /dev/null @@ -1,4 +0,0 @@ -# desc "Explaining what the task does" -# task :simple_ldap_authenticator do -# # Task goes here -# end \ No newline at end of file diff --git a/backup.rails2.3/plugins/simple_ldap_authenticator/test/simple_ldap_authenticator_test.rb b/backup.rails2.3/plugins/simple_ldap_authenticator/test/simple_ldap_authenticator_test.rb deleted file mode 100644 index dfd92dae..00000000 --- a/backup.rails2.3/plugins/simple_ldap_authenticator/test/simple_ldap_authenticator_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test/unit' - -class SimpleLdapAuthenticatorTest < Test::Unit::TestCase - # Replace this with your real tests. - def test_this_plugin - flunk - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/.gitignore b/backup.rails2.3/plugins/skinny_spec/.gitignore deleted file mode 100644 index 28f7b7da..00000000 --- a/backup.rails2.3/plugins/skinny_spec/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store -doc \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/README.rdoc b/backup.rails2.3/plugins/skinny_spec/README.rdoc deleted file mode 100644 index 118b58e1..00000000 --- a/backup.rails2.3/plugins/skinny_spec/README.rdoc +++ /dev/null @@ -1,270 +0,0 @@ -= Skinny Spec - -Skinny Spec is a collection of spec helper methods designed to help trim the fat and DRY up -some of the bloat that sometimes results from properly specing your classes and templates. - -== Requirements and Recommendations - -Obviously you'll need to be using RSpec[http://github.com/dchelimsky/rspec/tree/master] and -Rspec-Rails[http://github.com/dchelimsky/rspec-rails/tree/master] as your testing framework. - -Skinny Spec was originally designed [and best enjoyed] if you're using -Haml[http://github.com/nex3/haml/tree/master] and -make_resourceful[http://github.com/rsl/make_resourceful/tree/master] but will default to -ERb and a facsimile of Rails' default scaffolding [for the views and controllers, respectively] -if Haml and/or make_resourceful are not available. I recommend using them though. :) - -In addition, Skinny Spec uses Ruby2Ruby to make nicer expectation messages and you'll want to -have that installed as well. It's not a dependency or anything but it is highly -recommended. - -== Setup - -Once you've installed the plugin in your app's vendor/plugins folder, you're ready to rock! -Skinny Spec includes itself into the proper RSpec classes so there's no configuration on your -part. Sweet! - -== Usage - -The simplest way to use Skinny Specs is to generate a resource scaffold: - - script/generate skinny_scaffold User - -This command takes the usual complement of attribute definitions like -script/generate scaffold. Then have a look at the generated files (particularly the -specs) to see what's new and different with Skinny Spec. - -=== Controller Specs - -Let's look at the controller specs. - - describe UsersController do - describe "GET :index" do - before(:each) do - @users = stub_index(User) - end - - it_should_find_and_assign :users - it_should_render :template, "index" - end - - # ... - - describe "POST :create" do - describe "when successful" do - before(:each) do - @user = stub_create(User) - end - - it_should_initialize_and_save :user - it_should_redirect_to { user_url(@user) } - end - - # ... - -First thing you should see is an example group for GET :index. That stub_index method there -does a lot of work behind the curtain. I'll leave it up to you to check the documentation for it -(and its brothers and sister methods like stub_new) but I will point out that the -methods named stub_controller_method should only be used for stubbing and -mocking the main object of the method. To create mocks for other ancillary objects, please -use stub_find_all, stub_find_one, and stub_initialize. The reason -for this is because the former methods actually save us a step by defining an implicit -controller method request. If you add a new method to your resource routing, you'll want to -use the helper method define_request in those example groups to define an explicit -request, like so: - - describe "PUT :demote" do - define_request { put :demote } - - # ... - end - -You can also define a method called shared_request to "share" a -define_request across nested describe blocks, like so: - - describe "POST :create" do - def shared_request - post :create - end - - describe "when successful" do - # ... - end - - describe "when unsuccessful" do - # ... - end - end - -Note: When you're adding longer, more complicated controller specs you can still leverage -implicit and explicit requests by calling do_request in your spec as in the following -example: - - # Note this controller is UsersController and _not_ CategoriesController - # and that loading the categories isn't part of the default actions - # and cannot use the stub_controller_method helpers - # [which create implicit requests based on the controller method in the name] - # but uses stub_find_all instead - describe "GET :new" do - before(:each) do - @user = stub_new(User) - @categories = stub_find_all(Category) - end - - # ... - - it "should preload categories" do - Category.should_receive(:find).with(:all) - do_request - end - - it "should assign @categories" do - do_request - assigns[:categories].should == @categories - end - end - -Finally we get to the meat of the spec and of Skinny Specs itself: the actual expectations. -The first thing you'll notice is the use of example group (read: "describe" block) level methods -instead of the usual example (read: "it") blocks. Using this helper at the example group level -saves us three lines over using an example block. (If this isn't significant to you, this is -probably the wrong plugin for you as well. Sorry.) Note that none of these methods use the -instance variables defined in the "before" block because they are all nil at the example block -level. Let's look at a sample method to see how it works: - - it_should_find_and_assign :users - -This actually wraps two different expectations: one that User.should_receive(:find).with(:all) -and another that the instance variable @users is assigned with the return value from that finder call. -If you need to add more detailed arguments to the find, you can easily break this into two different -expectations like: - - it_should_find :users, :limit => 2 - it_should_assign :users - -See the documentation for the it_should_find for more information. You might have guessed that -it_should_initialize_assign and it_should_render_template work in a similar -fashion and you'd be right. Again, see the documentation for these individual methods for more -information. Lots of information in those docs. - -A useful helper method that doesn't appear in any of the scaffolding is with_default_restful_actions -which takes a block and evaluates it for each of the RESTful controller actions. Very useful for -spec'ing that these methods redirect to the login page when the user isn't logged in, for example. This -method is designed to be used inside an example like so: - - describe "when not logged in" do - it "should redirect all requests to the login page" do - with_default_restful_actions do - response.should redirect_to(login_url) - end - end - end - -Before we're through with the controller specs, let me point out one more important detail. In -order to use it_should_redirect_to we have to send the routing inside a block argument -there so it can be evaluated in the example context instead of the example group, where it -completely blows up. This methodology is used anywhere routing is referred to in a "skinny", -example group level spec. - -=== View Specs - -Now let's move to the view specs! - - describe "/users/form.html.haml" do - before(:each) do - @user = mock_and_assign(User, :stub => { - :name => "foo", - :birthday => 1.week.ago, - :adult => false - }) - end - - it_should_have_form_for :user - - it_should_allow_editing :user, :name - it_should_allow_editing :user, :birthday - it_should_allow_editing :user, :adult - - it_should_link_to_show :user - it_should_link_to { users_path } - end - -Like the special stub_index methods in the controller -specs, the view specs have a shorthand mock and stub helpers: mock_and_assign and -mock_and_assign_collection. These are well documented so please check them out. - -There are also some really nice helper methods that I'd like point out. First is -it_should_have_form_for. This is a really good convenience wrapper that basically wraps -the much longer: - - it "should use form_for to generate the proper form action and options" do - template.should_receive(:form_for).with(@user) - do_render - end - -Next up is the it_should_allow_editing helper. I love this method the most because it -really helps DRY up that view spec while at the same time being amazingly unbrittle. Instead of -creating an expectation for a specific form element, this method creates a generalized expectation -that there's a form element with the name attribute set in such away that it will -generate the proper params to use in the controller to edit or create the instance. -Check out the docs and the source for more information on this. Also check out -it_should_have_form_element_for which is roughly equivalent for those times when you use -form_tag instead. - -Finally let's look at those it_should_link_to_controller_method helpers. -These methods (and there's one each for the controller methods -new, edit, show, and delete) point to instance variables -which you should be created in the "before" blocks with mock_and_assign. The other is -it_should_allow_editing which is likewise covered extensively in the documentation and -I will just point out here that, like it_should_link_to_edit and such, it takes a -symbol for the name of the instance variable it refers to and additionally takes -a symbol for the name of the attribute to be edited. - -Also note that, when constructing a long form example, instead of defining an instance variable -for the name of the template and calling render @that_template you can simply call -do_render which takes the name of the template from the outermost example group where -it is customarily stated. - -=== Model Specs - -Skinny Spec adds a matcher for the various ActiveRecord associations. On the example group level -you call them like: - - it_should_belong_to :manager - it_should_have_many :clients - -Within an example you can call them on either the class or the instance setup in the -"before" block. These are equivalent: - - @user.should belong_to(:group) - User.should belong_to(:group) - -I've also added some very basic validation helpers like it_should_validate_presence_of, -it_should_validate_uniqueness_of, it_should_not_mass_assign. Please consult -the documentation for more information. - -== Miscellaneous Notes - -In the scaffolding, I have used my own idiomatic Rails usage: - -* All controller actions which use HTML forms [new, edit, etc] use a shared - form and leverage form_for to its fullest by letting it create the appropriate - action and options. -* Some instances where you might expect link_to are button_to. This is to provide a common - interface element which can be styled the same instead of a mishmash of links and buttons and - inputs everywhere. To take full advantage of this, I usually override many of Rails' default - helpers with custom ones that all use actual HTML BUTTON elements which are much - easier to style than "button" typed INPUT. I've provided a text file in the - "additional" folder of this plugin which you can use in your ApplicationHelper. (I also - provide an optional override helper for the label method which uses - #titleize instead of humanize for stylistic reasons). -* Probably more that I can't think of. - -== Credits and Thanks - -Sections of this code were taken from or inspired by Rick Olsen's -rspec_on_rails_on_crack[http://github.com/technoweenie/rspec_on_rails_on_crack/tree/master]. -Also thanks and props to Hampton Catlin and Nathan Weizenbaum for the lovely and imminently useable -Haml and make_resourceful. Also also praises and glory to David Chelimsky and the Rspec crew. - -Also thanks to Don Petersen, Nicolas Mérouze, Mikkel Malmberg, and Brandan Lennox for their suggestions and fixes. \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/Rakefile b/backup.rails2.3/plugins/skinny_spec/Rakefile deleted file mode 100644 index b0adbc43..00000000 --- a/backup.rails2.3/plugins/skinny_spec/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -require 'rake' -require 'rake/rdoctask' - -desc 'Generate documentation for the Skinny Spec plugin' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'doc' - rdoc.title = 'Skinny Spec' - rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README.rdoc') - rdoc.rdoc_files.include('lib/**/*.rb') -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/additional/helper_overrides.txt b/backup.rails2.3/plugins/skinny_spec/additional/helper_overrides.txt deleted file mode 100644 index 7717e079..00000000 --- a/backup.rails2.3/plugins/skinny_spec/additional/helper_overrides.txt +++ /dev/null @@ -1,58 +0,0 @@ -# Please insert these into your ApplicationHelper - -# Replacement for Rails' default submit_tag helper -# using HTML button element rather than HTML input element -def submit_tag(text, options = {}) - content_tag :button, text, options.merge(:type => :submit) -end - -# Replacement for Rails' default button_to helper -# using HTML button element rather than HTML input element -def button_to(name, options = {}, html_options = {}) - html_options = html_options.stringify_keys - convert_boolean_attributes!(html_options, %w( disabled )) - - method_tag = '' - if (method = html_options.delete('method')) && %w{put delete}.include?(method.to_s) - method_tag = tag('input', :type => 'hidden', :name => '_method', :value => method.to_s) - end - - form_method = method.to_s == 'get' ? 'get' : 'post' - - request_token_tag = '' - if form_method == 'post' && protect_against_forgery? - request_token_tag = tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) - end - - if confirm = html_options.delete("confirm") - html_options["onclick"] = "return #{confirm_javascript_function(confirm)};" - end - - url = options.is_a?(String) ? options : self.url_for(options) - name ||= url - - html_options.merge!("type" => "submit", "value" => name) - - "
" + - method_tag + content_tag("button", name, html_options) + request_token_tag + "
" -end - -# Replacement for Rails' default button_to_function helper -# using HTML button element rather than HTML input element -def button_to_function(name, *args, &block) - html_options = args.extract_options! - function = args[0] || '' - - html_options.symbolize_keys! - function = update_page(&block) if block_given? - content_tag(:button, name, html_options.merge({ - :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};" - })) -end - -# Replacement for Rails' default label helper -# using String#titleize rather than String#humanize -def label(object_name, method, text = nil, options = {}) - text ||= method.to_s[].titleize - super -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/skinny_scaffold_generator.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/skinny_scaffold_generator.rb deleted file mode 100644 index 3cde3564..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/skinny_scaffold_generator.rb +++ /dev/null @@ -1,102 +0,0 @@ -class SkinnyScaffoldGenerator < Rails::Generator::NamedBase - attr_reader :controller_class_path, :controller_file_path, :controller_class_nesting, - :controller_class_nesting_depth, :controller_class_name, :controller_underscore_name, - :controller_plural_name, :template_language - alias_method :controller_file_name, :controller_underscore_name - alias_method :controller_singular_name, :controller_file_name - alias_method :controller_table_name, :controller_plural_name - - default_options :skip_migration => false - - def initialize(runtime_args, runtime_options = {}) - super - - base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@name.pluralize) - @controller_class_name_without_nesting, @controller_underscore_name, @controller_plural_name = inflect_names(base_name) - - if @controller_class_nesting.empty? - @controller_class_name = @controller_class_name_without_nesting - else - @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}" - end - end - - def manifest - record do |m| - # Check for class naming collisions - m.class_collisions controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper" - m.class_collisions class_path, "#{class_name}" - - # # Controller, helper, and views directories - m.directory File.join('app', 'views', controller_class_path, controller_file_name) - m.directory File.join('spec', 'views', controller_class_path, controller_file_name) - m.directory File.join('app', 'helpers', controller_class_path) - m.directory File.join('spec', 'helpers', controller_class_path) - m.directory File.join('app', 'controllers', controller_class_path) - m.directory File.join('spec', 'controllers', controller_class_path) - m.directory File.join('app', 'models', class_path) - m.directory File.join('spec', 'models', class_path) - - # Views - @template_language = defined?(Haml) ? "haml" : "erb" - %w{index show form}.each do |action| - m.template "#{action}.html.#{template_language}", - File.join('app/views', controller_class_path, controller_file_name, "#{action}.html.#{template_language}") - m.template "#{action}.html_spec.rb", - File.join('spec/views', controller_class_path, controller_file_name, "#{action}.html.#{template_language}_spec.rb") - end - m.template "index_partial.html.#{template_language}", - File.join('app/views', controller_class_path, controller_file_name, "_#{file_name}.html.#{template_language}") - m.template 'index_partial.html_spec.rb', - File.join('spec/views', controller_class_path, controller_file_name, "_#{file_name}.html.#{template_language}_spec.rb") - - # Helper - m.template 'helper.rb', - File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb") - m.template 'helper_spec.rb', - File.join('spec/helpers', controller_class_path, "#{controller_file_name}_helper_spec.rb") - - # Controller - m.template 'controller.rb', - File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb") - m.template 'controller_spec.rb', - File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb") - - # Model - m.template 'model.rb', - File.join('app/models', class_path, "#{file_name}.rb") - m.template 'model_spec.rb', - File.join('spec/models', class_path, "#{file_name}_spec.rb") - - # Routing - m.route_resources controller_file_name - - unless options[:skip_migration] - m.migration_template( - 'migration.rb', 'db/migrate', - :assigns => { - :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}", - :attributes => attributes - }, - :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}" - ) - end - end - end - -protected - def banner - "Usage: #{$0} skinny_scaffold ModelName [field:type, field:type]" - end - - def add_options!(opt) - opt.separator '' - opt.separator 'Options:' - opt.on("--skip-migration", - "Don't generate a migration file for this model") { |v| options[:skip_migration] = v } - end - - def model_name - class_name.demodulize - end -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller.rb deleted file mode 100644 index ea9b617d..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller.rb +++ /dev/null @@ -1,105 +0,0 @@ -class <%= controller_class_name %>Controller < ApplicationController - <%- if defined?(Resourceful::Maker) -%> - make_resourceful do - actions :all - - # Let's get the most use from form_for and share a single form here! - response_for :new, :edit do - render :template => "<%= plural_name %>/form" - end - - response_for :create_fails, :update_fails do - flash[:error] = "There was a problem!" - render :template => "<%= plural_name %>/form" - end - end - <%- else -%> - # GET /<%= table_name %> - # GET /<%= table_name %>.xml - def index - @<%= table_name %> = <%= class_name %>.find(:all) - - respond_to do |format| - format.html # index.html.erb - format.xml { render :xml => @<%= table_name %> } - end - end - - # GET /<%= table_name %>/1 - # GET /<%= table_name %>/1.xml - def show - @<%= file_name %> = <%= class_name %>.find(params[:id]) - - respond_to do |format| - format.html # show.html.erb - format.xml { render :xml => @<%= file_name %> } - end - end - - # GET /<%= table_name %>/new - # GET /<%= table_name %>/new.xml - def new - @<%= file_name %> = <%= class_name %>.new - - respond_to do |format| - format.html { render :template => "<%= plural_name %>/form" } - format.xml { render :xml => @<%= file_name %> } - end - end - - # GET /<%= table_name %>/1/edit - def edit - @<%= file_name %> = <%= class_name %>.find(params[:id]) - render :template => "<%= plural_name %>/form" - end - - # POST /<%= table_name %> - # POST /<%= table_name %>.xml - def create - @<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>]) - - respond_to do |format| - if @<%= file_name %>.save - flash[:notice] = '<%= class_name %> was successfully created.' - format.html { redirect_to(@<%= file_name %>) } - format.xml { render :xml => @<%= file_name %>, :status => :created, :location => @<%= file_name %> } - else - flash.now[:error] = '<%= class_name %> could not be created.' - format.html { render :template => "<%= plural_name %>/form" } - format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity } - end - end - end - - # PUT /<%= table_name %>/1 - # PUT /<%= table_name %>/1.xml - def update - @<%= file_name %> = <%= class_name %>.find(params[:id]) - - respond_to do |format| - if @<%= file_name %>.update_attributes(params[:<%= file_name %>]) - flash[:notice] = '<%= class_name %> was successfully updated.' - format.html { redirect_to(@<%= file_name %>) } - format.xml { head :ok } - else - flash.now[:error] = '<%= class_name %> could not be created.' - format.html { render :template => "<%= plural_name %>/form" } - format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity } - end - end - end - - # DELETE /<%= table_name %>/1 - # DELETE /<%= table_name %>/1.xml - def destroy - @<%= file_name %> = <%= class_name %>.find(params[:id]) - @<%= file_name %>.destroy - - respond_to do |format| - flash[:notice] = '<%= class_name %> was successfully deleted.' - format.html { redirect_to(<%= table_name %>_url) } - format.xml { head :ok } - end - end - <%- end -%> -end diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller_spec.rb deleted file mode 100644 index ff1b6b29..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/controller_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe <%= controller_class_name %>Controller do - describe "GET :index" do - before(:each) do - @<%= plural_name %> = stub_index(<%= class_name %>) - end - - it_should_find_and_assign :<%= plural_name %> - it_should_render_template "index" - end - - describe "GET :new" do - before(:each) do - @<%= singular_name %> = stub_new(<%= class_name %>) - end - - it_should_initialize_and_assign :<%= singular_name %> - it_should_render_template "form" - end - - describe "POST :create" do - describe "when successful" do - before(:each) do - @<%= singular_name %> = stub_create(<%= class_name %>) - end - - it_should_initialize_and_save :<%= singular_name %> - it_should_set_flash :notice - it_should_redirect_to { <%= singular_name %>_url(@<%= singular_name %>) } - end - - describe "when unsuccessful" do - before(:each) do - @<%= singular_name %> = stub_create(<%= class_name %>, :return => :false) - end - - it_should_initialize_and_assign :<%= singular_name %> - it_should_set_flash :error - it_should_render_template "form" - end - end - - describe "GET :show" do - before(:each) do - @<%= singular_name %> = stub_show(<%= class_name %>) - end - - it_should_find_and_assign :<%= singular_name %> - it_should_render_template "show" - end - - describe "GET :edit" do - before(:each) do - @<%= singular_name %> = stub_edit(<%= class_name %>) - end - - it_should_find_and_assign :<%= singular_name %> - it_should_render_template "form" - end - - describe "PUT :update" do - describe "when successful" do - before(:each) do - @<%= singular_name %> = stub_update(<%= class_name %>) - end - - it_should_find_and_update :<%= singular_name %> - it_should_set_flash :notice - it_should_redirect_to { <%= singular_name %>_url(@<%= singular_name %>) } - end - - describe "when unsuccessful" do - before(:each) do - @<%= singular_name %> = stub_update(<%= class_name %>, :return => :false) - end - - it_should_find_and_assign :<%= singular_name %> - it_should_set_flash :error - it_should_render_template "form" - end - end - - describe "DELETE :destroy" do - before(:each) do - @<%= singular_name %> = stub_destroy(<%= class_name %>) - end - - it_should_find_and_destroy :<%= singular_name %> - it_should_set_flash :notice - it_should_redirect_to { <%= plural_name %>_url } - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.erb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.erb deleted file mode 100644 index ac30dc1b..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -

<%= singular_name %>.new_record? ? "New" : "Edit" %> <%= model_name %>

-<%% form_for(@<%= singular_name %>) do |f| %> -
- <%%= f.error_messages %> -
- <%- if attributes.blank? -%> -

Add your form elements here, please!

- <%- else -%> - <%- attributes.each do |attribute| -%> -

- <%%= f.label :<%= attribute.name %> %>
- <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %> -

- <%- end -%> - <%- end -%> -
- <%%= submit_tag "Save" %> - -
-<%% end -%> \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.haml b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.haml deleted file mode 100644 index d97eabb9..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -%h1== #{@<%= singular_name %>.new_record? ? "New" : "Edit"} #{<%= model_name %>} -- form_for @<%= singular_name %> do |f| - #form_errors= f.error_messages -<% if attributes.blank? -%> - %p Add your form elements here, please! -<% else -%> - <%- attributes.each do |attribute| -%> - %p - = f.label :<%= attribute.name %> - = f.<%= attribute.field_type %> :<%= attribute.name %> - <%- end -%> -<% end -%> - #commands - = submit_tag "Save" -#navigation_commands - - unless @<%= singular_name %>.new_record? - = button_to "Show", <%= singular_name %>_path(@<%= singular_name %>), :method => "get", :title => "Show <%= singular_name %>. Unsaved changes will be lost." - = button_to "Back to List", <%= plural_name %>_path, :class => "cancel", :method => "get", :title => "Return to <%= singular_name %> list without saving changes" \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html_spec.rb deleted file mode 100644 index bc6f6f24..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/form.html_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../../spec_helper' - -describe "<%= File.join(controller_class_path, controller_singular_name) %>/form.html.<%= template_language %>" do - before(:each) do - @<%= singular_name %> = mock_and_assign(<%= model_name %>, :stub => { -<% if attributes.blank? -%> - # Add your stub attributes and return values here like: - # :name => "Foo", :address => "815 Oceanic Drive" -<% else -%> - <%- attributes.each_with_index do |attribute, index| -%> - <%- case attribute.type when :string, :text -%> - :<%= attribute.name %> => "foo"<%= index < attributes.size - 1 ? "," : "" %> - <%- when :integer, :float, :decimal -%> - :<%= attribute.name %> => 815<%= index < attributes.size - 1 ? "," : "" %> - <%- when :boolean -%> - :<%= attribute.name %> => false<%= index < attributes.size - 1 ? "," : "" %> - <%- when :date, :datetime, :time, :timestamp -%> - :<%= attribute.name %> => 1.week.ago<%= index < attributes.size - 1 ? "," : "" %> - <%- else -%> - :<%= attribute.name %> => nil<%= index < attributes.size - 1 ? "," : "" %> # Could not determine valid attribute - <%- end -%> - <%- end -%> -<% end -%> - }) - end - - it_should_have_form_for :<%= singular_name %> -<% if attributes.blank? -%> - # Add specs for editing attributes here, please! Like this: - # - # it_should_allow_editing :<%= singular_name %>, :foo -<% else -%> - <%- attributes.each do |attribute| -%> - it_should_allow_editing :<%= singular_name %>, :<%= attribute.name %> - <%- end -%> -<% end -%> - - it_should_link_to_show :<%= singular_name %> - it_should_link_to { <%= plural_name %>_path } -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper.rb deleted file mode 100644 index 9bd821b1..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module <%= controller_class_name %>Helper -end diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper_spec.rb deleted file mode 100644 index 6a34ca2a..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/helper_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../spec_helper' - -describe <%= controller_class_name %>Helper do - # Add your specs here or remove this file completely, please! -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.erb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.erb deleted file mode 100644 index 318f94e3..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -

<%= model_name %> List

- - <%%- if @<%= plural_name %>.empty? -%> - - - - - - <%%- else -%> - - - <%- if attributes.blank? -%> - - <%- else -%> - <%- attributes.each do |attribute| -%> - - <%- end -%> - <%- end -%> - - - - - - - <%%= render :partial => @<%= plural_name %> %> - - <%%- end -%> -
There are no <%= plural_name.humanize.downcase %>
<%= attribute.name.titleize %>
-
- <%%= button_to "New <%= singular_name.titleize %>", new_<%= singular_name %>_path, :method => "get" %> -
\ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.haml b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.haml deleted file mode 100644 index b0c78b28..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -%h1 <%= model_name %> List -%table - - if @<%= plural_name %>.empty? - %tbody - %tr.empty - %td== There are no <%= plural_name.humanize.downcase %> - - else - %thead - %tr -<% if attributes.blank? -%> - %th= # Generic display column -<% else -%> - <%- attributes.each do |attribute| -%> - %th <%= attribute.name.titleize %> - <%- end -%> -<% end -%> - %th.show= # 'Show' link column - %th.edit= # 'Edit' link column - %th.delete= # 'Delete' link column - %tbody - = render :partial => @<%= plural_name %> -#commands - = button_to "New <%= singular_name.titleize %>", new_<%= singular_name %>_path, :method => "get" \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html_spec.rb deleted file mode 100644 index cfe213f5..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index.html_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../../spec_helper' - -describe "<%= File.join(controller_class_path, controller_singular_name) %>/index.html.<%= template_language %>" do - before(:each) do - @<%= plural_name %> = mock_and_assign_collection(<%= model_name %>) - template.stub! :render - end - - it "should render :partial => @<%= plural_name %>" do - template.should_receive(:render).with(:partial => @<%= plural_name %>) - do_render - end - - it_should_link_to_new :<%= singular_name %> -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.erb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.erb deleted file mode 100644 index ecdca836..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -"> -<% if attributes.blank? -%> - <%= model_name %> #<%%= <%= singular_name %>.id %> -<% else -%> - <%- attributes.each do |attribute| -%> - <%%=h <%= singular_name %>.<%= attribute.name %> %> - <%- end %> -<% end -%> - <%%= button_to "Show", <%= singular_name %>, :method => "get" %> - <%%= button_to "Edit", edit_<%= singular_name %>_path(<%= singular_name %>), :method => "get" %> - <%%= button_to "Delete", <%= singular_name %>, :method => "delete" %> - \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.haml b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.haml deleted file mode 100644 index 08b3b383..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -%tr{:class => cycle("odd", "even")} -<% if attributes.blank? -%> - %td== <%= model_name %> #{<%= singular_name %>.id} -<% else -%> - <%- attributes.each do |attribute| -%> - %td=h <%= singular_name %>.<%= attribute.name %> - <%- end -%> -<% end -%> - %td.show= button_to "Show", <%= singular_name %>_path(<%= singular_name %>), :method => "get" - %td.edit= button_to "Edit", edit_<%= singular_name %>_path(<%= singular_name %>), :method => "get" - %td.delete= button_to "Delete", <%= singular_name %>, :method => "delete" \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html_spec.rb deleted file mode 100644 index 2a10afb1..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/index_partial.html_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../../spec_helper' - -describe "<%= File.join(controller_class_path, controller_singular_name) %>/_<%= singular_name %>.html.<%= template_language %>" do - before(:each) do - @<%= singular_name %> = mock_and_assign(<%= model_name %>, :stub => { -<% if attributes.blank? -%> - # Add your stub attributes and return values here like: - # :name => "Foo", :created_at => 1.week.ago, :updated_at => nil -<% else -%> - <%- attributes.each_with_index do |attribute, index| -%> - <%- case attribute.type when :string, :text -%> - :<%= attribute.name %> => "foo"<%= index < attributes.size - 1 ? "," : "" %> - <%- when :integer, :float, :decimal -%> - :<%= attribute.name %> => 815<%= index < attributes.size - 1 ? "," : "" %> - <%- when :boolean -%> - :<%= attribute.name %> => false<%= index < attributes.size - 1 ? "," : "" %> - <%- when :date, :datetime, :time, :timestamp -%> - :<%= attribute.name %> => 1.week.ago<%= index < attributes.size - 1 ? "," : "" %> - <%- else -%> - :<%= attribute.name %> => nil<%= index < attributes.size - 1 ? "," : "" %> - <%- end -%> - <%- end -%> -<% end -%> - }) - template.stub!(:<%= singular_name %>).and_return(@<%= singular_name %>) - end - - it_should_link_to_show :<%= singular_name %> - it_should_link_to_edit :<%= singular_name %> - it_should_link_to_delete :<%= singular_name %> -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/migration.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/migration.rb deleted file mode 100644 index 2e4c29c8..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/migration.rb +++ /dev/null @@ -1,14 +0,0 @@ -class <%= migration_name %> < ActiveRecord::Migration - def self.up - create_table :<%= table_name %>, :force => true do |t| -<% attributes.each do |attribute| -%> - t.column :<%= attribute.name %>, :<%= attribute.type %> -<% end -%> - t.timestamps - end - end - - def self.down - drop_table :<%= table_name %> - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model.rb deleted file mode 100644 index 202f8b30..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model.rb +++ /dev/null @@ -1,2 +0,0 @@ -class <%= class_name %> < ActiveRecord::Base -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model_spec.rb deleted file mode 100644 index ed6a1945..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/model_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper' - -describe <%= class_name %> do - def valid_attributes(args = {}) - { - # Add valid attributes for building your model instances here! - }.merge(args) - end - - before(:each) do - @<%= singular_name %> = <%= class_name %>.new - end - - after(:each) do - @<%= singular_name %>.destroy - end - - # Add your model specs here, please! - # And don't forget about the association matchers built-in to skinny_spec like: - # - # it_should_have_many :foos - # it_should_validate_presence_of :bar - # - # Check out the docs for more information. -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.erb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.erb deleted file mode 100644 index 5db36d56..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -

Show <%= model_name %>

-<% if attributes.blank? -%> -

Add your customized markup here, please!

-<% else -%> - <%- attributes.each do |attribute| -%> -

- - <%%=h @<%= singular_name %>.<%= attribute.name %> %> -

- <%- end -%> -<% end -%> -
- <%%= button_to "Edit", edit_<%= singular_name %>_path(@<%= singular_name %>), :method => "get" %> - <%%= button_to "Back to List", <%= plural_name %>_path, :method => "get" %> -
diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.haml b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.haml deleted file mode 100644 index d8afe80a..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%h1== Show #{<%= model_name %>} -<% if attributes.blank? -%> -%p Add your customized markup here, please! -<% else -%> - <%- attributes.each do |attribute| -%> -%p - %label <%= attribute.name.titleize %>: - =h @<%= singular_name %>.<%= attribute.name %> - <%- end -%> -<% end -%> -#commands - = button_to "Edit", edit_<%= singular_name %>_path(@<%= singular_name %>), :method => "get" - = button_to "Back to List", <%= plural_name %>_path, :method => "get" \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html_spec.rb b/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html_spec.rb deleted file mode 100644 index aefbbe17..00000000 --- a/backup.rails2.3/plugins/skinny_spec/generators/skinny_scaffold/templates/show.html_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../../spec_helper' - -describe "<%= File.join(controller_class_path, controller_singular_name) %>/show.html.<%= template_language %>" do - before(:each) do -<% if attributes.blank? -%> - @<%= singular_name %> = mock_and_assign(<%= model_name %>) -<% else -%> - @<%= singular_name %> = mock_and_assign(<%= model_name %>, :stub => { - <%- attributes.each_with_index do |attribute, index| -%> - <%- case attribute.type when :string, :text -%> - :<%= attribute.name %> => "foo"<%= index < attributes.size - 1 ? "," : "" %> - <%- when :integer, :float, :decimal -%> - :<%= attribute.name %> => 815<%= index < attributes.size - 1 ? "," : "" %> - <%- when :boolean -%> - :<%= attribute.name %> => false<%= index < attributes.size - 1 ? "," : "" %> - <%- when :date, :datetime, :time, :timestamp -%> - :<%= attribute.name %> => 1.week.ago<%= index < attributes.size - 1 ? "," : "" %> - <%- else -%> - :<%= attribute.name %> => nil<%= index < attributes.size - 1 ? "," : "" %> - <%- end -%> - <%- end -%> - }) -<% end -%> - end - - # Add your specs here, please! But remember not to make them brittle - # by specing specing specific HTML elements and classes. - - it_should_link_to_edit :<%= singular_name %> - it_should_link_to { <%= plural_name %>_path } -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/common_spec_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/common_spec_helpers.rb deleted file mode 100644 index 0a7acff3..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/common_spec_helpers.rb +++ /dev/null @@ -1,83 +0,0 @@ -module LuckySneaks - # These methods are mostly just called internally by various other spec helper - # methods but you're welcome to use them as needed in your own specs. - module CommonSpecHelpers - # Stubs out Time.now and returns value to use when comparing it. Example: - # - # time_now = stub_time_now - # @foo.some_method_that_resets_updated_at - # @foo.updated_at.should == time_now - def stub_time_now - returning Time.now do |now| - Time.stub!(:now).and_return(now) - end - end - - # Returns class for the specified name. Example: - # - # class_for("foo") # => Foo - def class_for(name) - name.to_s.constantize - rescue NameError - name.to_s.pluralize.classify.constantize - # Let any other error rise! - end - - # Returns instance variable for the specified name. Example: - # - # instance_for("foo") # => @foo - def instance_for(name) - instance_variable_get("@#{name.to_s.underscore}") - end - - # Wraps a matcher that checks if the receiver contains an A element (link) - # whose href attribute is set to the specified path. - def have_link_to(path) - have_tag("a[href='#{path}']") - end - - # Returns dummy value for specified attribute based on the datatype expected for that - # attribute. - def dummy_value_for(instance, attribute) - if datatype = instance.column_for_attribute(attribute) - actual = instance.send(attribute) - case datatype.type - when :string, :text - actual == "foo" ? "bar" : "food" - when :integer, :float, :decimal - actual == 108 ? 815 : 108 - when :boolean - actual ? false : true - when :date, :datetime, :time, :timestamp - actual == 1.week.ago ? 2.years.ago : 1.week.ago - end - end - end - - # Returns class description text - def class_description_text - if self.class.respond_to?(:description_text) - # Old school - self.class.description_text - else - # New school - self.class.description - end - end - - # Returns description text - def self_description_text - if respond_to?(:description_text) - # Old school - description_text - else - # New school - description - end - end - - def described_type - self.class.described_type - end - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_request_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_request_helpers.rb deleted file mode 100644 index 4aeffaf4..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_request_helpers.rb +++ /dev/null @@ -1,67 +0,0 @@ -module LuckySneaks - module ControllerRequestHelpers # :nodoc: - def self.included(base) - base.extend ExampleGroupMethods - end - - private - def define_implicit_request(method) - @controller_method = method - @implicit_request = case method - when :index, :new, :show, :edit - proc { get method, params } - when :create - proc { post :create, params } - when :update - proc { put :update, params } - when :destroy - proc { put :destroy, params } - end - end - - def eval_request - instance_eval &self.class.instance_variable_get("@the_request") - rescue ArgumentError # missing block - try_shared_request_definition - end - alias do_request eval_request - - def try_shared_request_definition - if defined?(shared_request) == "method" - shared_request - elsif @implicit_request - try_implicit_request - else - error_message = "Could not determine request definition for 'describe' context. " - error_message << "Please use define_request or define a shared_request." - raise ArgumentError, error_message - end - end - - def try_implicit_request - @implicit_request.call - end - - def get_response(&block) - eval_request - block.call(response) if block_given? - response - end - - module ExampleGroupMethods - # Defines a request at the example group ("describe") level to be evaluated in the examples. Example: - # - # define_request { get :index, params } - # - # Note: The following methods all define implicit requests: stub_index, stub_new, - # stub_create, stub_show, stub_edit, stub_update, and - # stub_destroy. Using them in your before blocks will allow you to forego - # defining explicit requests using define_request. See - # LuckySneaks::ControllerStubHelpers for information on these methods. - def define_request(&block) - raise ArgumentError, "Must provide a block to define a request!" unless block_given? - @the_request = block - end - end - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_spec_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_spec_helpers.rb deleted file mode 100644 index 20bca87e..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_spec_helpers.rb +++ /dev/null @@ -1,571 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), "..") -require "skinny_spec" - -module LuckySneaks - module ControllerSpecHelpers # :nodoc: - include LuckySneaks::CommonSpecHelpers - include LuckySneaks::ControllerRequestHelpers - include LuckySneaks::ControllerStubHelpers - - def self.included(base) - base.extend ExampleGroupMethods - base.extend ControllerRequestHelpers::ExampleGroupMethods - end - - # Evaluates the specified block for each of the RESTful controller methods. - # This is useful to spec that all controller methods redirect when no user is - # logged in. - def with_default_restful_actions(params = {}, &block) - { - :get => :index, - :get => :new, - :post => :create - }.each do |method_id, message| - self.send method_id, message, params - block.call - end - { - :get => :edit, - :put => :update, - :delete => :destroy - }.each do |method_id, message| - if params[:before] - params.delete(:before).call - end - # Presuming any id will do - self.send method_id, message, params.merge(:id => 1) - block.call - end - end - - private - def create_ar_class_expectation(name, method, argument = nil, options = {}) - args = [] - unless options.delete(:only_method) - args << argument unless argument.nil? - args << hash_including(options) unless options.empty? - end - method = options.delete(:find_method) if options[:find_method] - if args.empty? - class_for(name).should_receive(method).and_return(instance_for(name)) - else - class_for(name).should_receive(method).with(*args).and_return(instance_for(name)) - end - end - - def create_positive_ar_instance_expectation(name, method, *args) - instance = instance_for(name) - if args.empty? - instance.should_receive(method).and_return(true) - else - instance.should_receive(method).with(*args).and_return(true) - end - end - - # These methods are designed to be used at the example group [read: "describe"] level - # to simplify and DRY up common expectations. - module ExampleGroupMethods - # Creates an expectation that the controller method calls ActiveRecord::Base.find. - # Examples: - # - # it_should_find :foos # => Foo.should_receive(:find).with(:all) - # it_should_find :foos, :all # An explicit version of the above - # it_should_find :foos, :conditions => {:foo => "bar"} # => Foo.should_receive(:find).with(:all, :conditions => {"foo" => "bar"} - # it_should_find :foos, "joe", :method => :find_all_by_name # Foo.should_receive(:find_all_by_name).with("joe") - # it_should_find :foo # => Foo.should_recieve(:find).with(@foo.id.to_s) - # it_should_find :foo, :params => "id" # => Foo.should_receive(:find).with(params[:id].to_s) - # it_should_find :foo, 2 # => Foo.should_receive(:find).with("2") - # it_should_find :foo, "joe", :method => :find_by_name # => Foo.should_recieve(:find_by_name).with("joe") - # - # Note: All params (key and value) will be strings if they come from a form element and are handled - # internally with this expectation. - def it_should_find(name, *args) - name_string = name.to_s - name_message = if name_string == name_string.singularize - "a #{name}" - else - name - end - it "should find #{name_message}" do - options = args.extract_options! - # Blech! - argument = if param = params[options.delete(:params)] - param.to_s - else - if args.first - args.first - elsif (instance = instance_variable_get("@#{name}")).is_a?(ActiveRecord::Base) - instance.id.to_s - else - :all - end - end - find_method = options.delete(:method) || :find - create_ar_class_expectation name, find_method, argument, options - eval_request - end - end - - # Negative version of it_should_find. This creates an expectation that - # the class never receives find at all. - def it_should_not_find(name) - name_string = name.to_s - name_message = if name_string == name_string.singularize - "a #{name}" - else - name - end - it "should not find #{name_message}" do - if name_string == name_string.singularize - class_for(name).should_not_receive(:find) - else - class_for(name).should_not_receive(:find).with(:all) - end - eval_request - end - end - - # Creates an expectation that the controller method calls ActiveRecord::Base.new. - # Takes optional params for the initialization arguments. Example - # - # it_should_initialize :foo # => Foo.should_receive(:new) - # it_should_initialize :foo, :params => :bar # => Foo.should_receive(:new).with(params[:bar]) - # it_should_initialize :foo, :bar => "baz" # => Foo.should_receive(:new).with(:bar => "baz") - def it_should_initialize(name, options = {}) - it "should initialize a #{name}" do - create_ar_class_expectation name, :new, params[options.delete(:params)], options - eval_request - end - end - - # Negative version of it_should_initialize. This creates an expectation - # that the class never recieves new at all. - def it_should_not_initialize(name) - it "should initialize a #{name}" do - class_for(name).should_not_receive(:new) - eval_request - end - end - - # Creates an expectation that the controller method calls ActiveRecord::Base#save on the - # named instance. Example: - # - # it_should_save :foo # => @foo.should_receive(:save).and_return(true) - # - # Note: This helper should not be used to spec a failed save call. Use it_should_assign - # instead, to verify that the instance is captured in an instance variable for the inevitable re-rendering - # of the form template. - def it_should_save(name) - it "should save the #{name}" do - create_positive_ar_instance_expectation name, :save - eval_request - end - end - - # Negative version of it_should_update. This creates an expectation - # that the instance never receives save at all. - def it_should_not_save(name) - it "should not save the #{name}" do - instance_for(name).should_not_receive(:save) - eval_request - end - end - - # Creates an expectation that the controller method calls ActiveRecord::Base#update_attributes - # on the named instance. Takes optional argument for params to specify in the - # expectation. Examples: - # - # it_should_update :foo # => @foo.should_receive(:update_attributes).and_return(true) - # it_should_update :foo, :params => :bar # => @foo.should_receive(:update_attributes).with(params[:bar]).and_return(true) - # - # Note: This helper should not be used to spec a failed update_attributes call. Use - # it_should_assign instead, to verify that the instance is captured in an instance variable - # for the inevitable re-rendering of the form template. - def it_should_update(name, options = {}) - it "should update the #{name}" do - create_positive_ar_instance_expectation name, :update_attributes, params[name] - eval_request - end - end - - # Negative version of it_should_update. This creates an expectation - # that the instance never receives update_attributes at all. - def it_should_not_update(name) - it "should not update the #{name}" do - instance_for(name).should_not_receive(:update_attributes) - eval_request - end - end - - # Creates an expectation that the controller method calls ActiveRecord::Base#destroy on the named - # instance. Example: - # - # it_should_destroy :foo # => @foo.should_receive(:destroy).and_return(true) - # - # Note: This helper should not be used to spec a failed destroy call. Use - # it_should_assign instead, if you need to verify that the instance is captured in an instance - # variable if it is re-rendered somehow. This is probably a really edge use case. - def it_should_destroy(name, options = {}) - it "should delete the #{name}" do - create_positive_ar_instance_expectation name, :destroy - eval_request - end - end - - # Negative version of it_should_destroy. This creates an expectation - # that the instance never receives destroy at all. - def it_should_not_destroy(name) - it "should not destroy the #{name}" do - instance_for(name).should_not_receive(:destroy) - eval_request - end - end - - # Creates expectation[s] that the controller method should assign the specified - # instance variables along with any specified values. Examples: - # - # it_should_assign :foo # => assigns[:foo].should == @foo - # it_should_assign :foo => "bar" # => assigns[:foo].should == "bar" - # it_should_assign :foo => :nil # => assigns[:foo].should be_nil - # it_should_assign :foo => :not_nil # => assigns[:foo].should_not be_nil - # it_should_assign :foo => :undefined # => controller.send(:instance_variables).should_not include("@foo") - # - # Very special thanks to Rick Olsen for the basis of this code. The only reason I even - # redefine it at all is purely an aesthetic choice for specs like "it should foo" - # over ones like "it foos". - def it_should_assign(*names) - names.each do |name| - if name.is_a?(Symbol) - it_should_assign name => name - elsif name.is_a?(Hash) - name.each do |key, value| - it_should_assign_instance_variable key, value - end - end - end - end - - # Essentially shorthand for it_should_assign name => :nil. This method can take multiple - # instance variable names, creating this shorthand for each name. See the docs for - # it_should_assign for more information. - def it_should_not_assign(*names) - names.each do |name| - # Assuming name is a symbol - it_should_assign name => :nil - end - end - - # Wraps the separate expectations it_should_find and it_should_assign - # for simple cases. If you need more control over the parameters of the find, this - # isn't the right helper method and you should write out the two expectations separately. - def it_should_find_and_assign(*names) - names.each do |name| - it_should_find name, :only_method => true - it_should_assign name - end - end - - # Negative version of it_should_find_and_assign. This creates an - # expectation that the class never receives find at all and that - # no matching instance variable is ever created. - def it_should_not_find_and_assign(*names) - names.each do |name| - it_should_not_find name - it_should_assign name => :nil - end - end - - # Wraps the separate expectations it_should_initialize and it_should_assign - # for simple cases. If you need more control over the parameters of the initialization, this - # isn't the right helper method and you should write out the two expectations separately. - # - # Note: This method is used for controller methods like new, where the instance - # is initialized without being saved (this includes failed create requests). - # If you want to spec that the controller method successfully saves the instance, - # please use it_should_initialize_and_save. - def it_should_initialize_and_assign(*names) - names.each do |name| - it_should_initialize name, :only_method => true - it_should_assign name - end - end - - # Negative version of it_should_initialize_and_assign. This creates an - # expectation that the class never receives new at all and that - # no matching instance variable is ever created. - def it_should_not_initialize_and_assign(*names) - names.each do |name| - it_should_not_initialize name - it_should_assign name => :nil - end - end - - # Wraps the separate expectations it_should_initialize and it_should_save - # for simple cases. If you need more control over the parameters of the initialization, this - # isn't the right helper method and you should write out the two expectations separately. - # - # Note: This method is used for controller methods like create, where the instance - # is initialized and successfully saved. If you want to spec that the instance is created - # but not saved, just use it_should_initialize_and_assign. - def it_should_initialize_and_save(*names) - names.each do |name| - it_should_initialize name, :only_method => true - it_should_save name - end - end - - # Wraps the separate expectations it_should_find and it_should_update - # for simple cases. If you need more control over the parameters of the find, this - # isn't the right helper method and you should write out the two expectations separately. - # - # Note: This method is used for controller methods like update, where the - # instance is loaded from the database and successfully saved. If you want to spec that the - # instance is found but not saved, just use it_should_find_and_assign. - def it_should_find_and_update(*names) - names.each do |name| - it_should_find name, :only_method => true - it_should_update name - end - end - - # Wraps the separate expectations it_should_find and it_should_destroy - # for simple cases. If you need more control over the parameters of the find, this - # isn't the right helper method and you should write out the two expectations separately. - def it_should_find_and_destroy(*names) - names.each do |name| - it_should_find name, :only_method => true - it_should_destroy name - end - end - - # Creates an expectation that the specified collection (flash, session, - # params, cookies) contains the specified key and value. To specify that - # the collection should be set to nil, specify the value as :nil instead. - def it_should_set(collection, key, value = nil, &block) - it "should set #{collection}[:#{key}]#{' with ' + value.inspect if value}" do - # Allow flash.now[:foo] to remain in the flash - flash.stub!(:sweep) if collection == :flash - eval_request - if value - if value == :nil - self.send(collection)[key].should be_nil - else - self.send(collection)[key].should == value - end - elsif block_given? - self.send(collection)[key].should == instance_eval(&block) - else - self.send(collection)[key].should_not be_nil - end - end - end - - # Wraps it_should_set :flash. To specify that the collection should be set - # to nil, specify the value as :nil instead. - def it_should_set_flash(name, value = nil, &block) - it_should_set :flash, name, value, &block - end - - # Wraps it_should_set :flash, :nil. - def it_should_not_set_flash(name) - it_should_set :flash, name, :nil - end - - # Wraps it_should_set :session. To specify that the collection should be set - # to nil, specify the value as :nil instead. - def it_should_set_session(name, value = nil, &block) - it_should_set :session, name, value, &block - end - - # Wraps it_should_set :session, :nil. - def it_should_not_set_session(name) - it_should_set :session, name, :nil - end - - # Wraps it_should_set :params. To specify that the collection should be set - # to nil, specify the value as :nil instead. - def it_should_set_params(name, value = nil, &block) - it_should_set :params, name, value, &block - end - - # Wraps it_should_set :params, :nil. - def it_should_not_set_params(name) - it_should_set :params, name, :nil - end - - # Wraps it_should_set :cookies. To specify that the collection should be set - # to nil, specify the value as :nil instead. - def it_should_set_cookies(name, value = nil, &block) - it_should_set :cookies, name, value, &block - end - - # Wraps it_should_set :cookies, :nil. - def it_should_not_set_cookies(name) - it_should_set :cookies, name, :nil - end - - # Wraps the various it_should_render_foo methods: - # it_should_render_template, it_should_render_partial, - # it_should_render_xml, it_should_render_json, - # it_should_render_formatted, and it_should_render_nothing. - def it_should_render(render_method, *args) - send "it_should_render_#{render_method}", *args - end - - # Creates an expectation that the controller method renders the specified template. - # Accepts the following options which create additional expectations. - # - # :content_type:: Creates an expectation that the Content-Type header for the response - # matches the one specified - # :status:: Creates an expectation that the HTTP status for the response - # matches the one specified - def it_should_render_template(name, options = {}) - create_status_expectation options[:status] if options[:status] - it "should render '#{name}' template" do - eval_request - response.should render_template(name) - end - create_content_type_expectation(options[:content_type]) if options[:content_type] - end - - # Creates an expectation that the controller method renders the specified partial. - # Accepts the following options which create additional expectations. - # - # :content_type:: Creates an expectation that the Content-Type header for the response - # matches the one specified - # :status:: Creates an expectation that the HTTP status for the response - # matches the one specified - def it_should_render_partial(name, options = {}) - create_status_expectation options[:status] if options[:status] - it "should render '#{name}' partial" do - controller.expect_render(:partial => name) - eval_request - end - create_content_type_expectation(options[:content_type]) if options[:content_type] - end - - # Creates an expectation that the controller method renders the specified record via to_xml. - # Accepts the following options which create additional expectations. - # - # :content_type:: Creates an expectation that the Content-Type header for the response - # matches the one specified - # :status:: Creates an expectation that the HTTP status for the response - # matches the one specified - def it_should_render_xml(record = nil, options = {}, &block) - it_should_render_formatted :xml, record, options, &block - end - - # Creates an expectation that the controller method renders the specified record via to_json. - # Accepts the following options which create additional expectations. - # - # :content_type:: Creates an expectation that the Content-Type header for the response - # matches the one specified - # :status:: Creates an expectation that the HTTP status for the response - # matches the one specified - def it_should_render_json(record = nil, options = {}, &block) - it_should_render_formatted :json, record, options, &block - end - - # Called internally by it_should_render_xml and it_should_render_json - # but should not really be called much externally unless you have defined your own - # formats with a matching to_foo method on the record. - # - # Which is probably never. - def it_should_render_formatted(format, record = nil, options = {}, &block) - create_status_expectation options[:status] if options[:status] - it "should render #{format.inspect}" do - if record.is_a?(Hash) - options = record - record = nil - end - if record.nil? && !block_given? - raise ArgumentError, "it_should_render must be called with either a record or a block and neither was given." - else - if record - pieces = record.to_s.split(".") - record = instance_variable_get("@#{pieces.shift}") - record = record.send(pieces.shift) until pieces.empty? - end - block ||= proc { record.send("to_#{format}") } - get_response do |response| - response.should have_text(block.call) - end - end - end - create_content_type_expectation(options[:content_type]) if options[:content_type] - end - - # Creates an expectation that the controller method returns a blank page. You'd already - # know when and why to use this so I'm not typing it out. - def it_should_render_nothing(options = {}) - create_status_expectation options[:status] if options[:status] - it "should render :nothing" do - get_response do |response| - response.body.strip.should be_blank - end - end - end - - # Creates an expectation that the controller method redirects to the specified destination. Example: - # - # it_should_redirect_to { foos_url } - # - # Note: This method takes a block to evaluate the route in the example - # context rather than the example group context. - def it_should_redirect_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should redirect to #{(hint || route)}" do - eval_request - response.should redirect_to(instance_eval(&route)) - end - end - - # Negative version of it_should_redirect_to. - def it_should_not_redirect_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should not redirect to #{(hint || route)}" do - eval_request - response.should_not redirect_to(instance_eval(&route)) - end - end - - # Creates an expectation that the controller method redirects back to the previous page - def it_should_redirect_to_referer - it "should redirect to the referring page" do - request.env["HTTP_REFERER"] = "http://test.host/referer" - eval_request - response.should redirect_to("http://test.host/referer") - end - end - alias it_should_redirect_to_referrer it_should_redirect_to_referer - - private - def it_should_assign_instance_variable(name, value) - expectation_proc = case value - when :nil - proc { assigns[name].should be_nil } - when :not_nil - proc { assigns[name].should_not be_nil } - when :undefined - proc { controller.send(:instance_variables).should_not include("@{name}") } - when Symbol - if (instance_variable = instance_variable_get("@#{name}")).nil? - proc { assigns[name].should_not be_nil } - else - proc { assigns[name].should == instance_variable } - end - else - proc { assigns[name].should == value } - end - it "should #{value == :nil ? 'not ' : ''}assign @#{name}" do - eval_request - instance_eval &expectation_proc - end - end - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_stub_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_stub_helpers.rb deleted file mode 100644 index 6d78ce54..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/controller_stub_helpers.rb +++ /dev/null @@ -1,238 +0,0 @@ -module LuckySneaks # :nodoc: - # These methods are designed to be used in your example before blocks to accomplish - # a whole lot of functionality with just a tiny bit of effort. The methods which correspond - # to the controller methods perform the most duties as they create the mock_model instances, - # stub out all the necessary methods, and also create implicit requests to DRY up your spec - # file even more. You are encouraged to use these methods to setup the basic calls for your - # resources and only resort to the other methods when mocking and stubbing secondary objects - # and calls. - module ControllerStubHelpers - # Stubs out find :all and returns a collection of mock_model - # instances of that class. Accepts the following options: - # - # :find_method:: Method to use as finder call. Default is :find. - # Note: When specifying the method, the call is stubbed - # to accept any arguments. Caveat programmer. - # :format:: Format of the request. Used to only add to_xml and - # to_json when actually needed. - # :size:: Number of instances to return in the result. Default is 3. - # :stub:: Additional methods to stub on the instances - # - # Any additional options will be passed as arguments to the class find. - # You will want to make sure to pass those arguments to the it_should_find spec as well. - def stub_find_all(klass, options = {}) - returning(Array.new(options[:size] || 3){mock_model(klass)}) do |collection| - stub_out klass, options.delete(:stub) - if format = options.delete(:format) - stub_formatted collection, format - params[:format] = format - end - if find_method = options[:find_method] - # Not stubbing specific arguments here - # If you need more specificity, write a custom example - klass.stub!(find_method).and_return(collection) - else - klass.stub!(:find).with(:all).and_return(collection) - klass.stub!(:find).with(:all, hash_including(options)).and_return(collection) - end - end - end - - # Alias for stub_find_all but additionally defines an implicit request get :index. - def stub_index(klass, options = {}) - define_implicit_request :index - stub_find_all klass, options - end - - # Stubs out new method and returns a mock_model instance marked as a new record. - # Accepts the following options: - # - # :format:: Format of the request. Used to only add to_xml and - # to_json when actually needed. - # :stub:: Additional methods to stub on the instances - # - # It also accepts some options used to stub out save with a specified true - # or false but you should be using stub_create in that case. - def stub_initialize(klass, options = {}) - returning mock_model(klass) do |member| - stub_out member, options.delete(:stub) - if format = options[:format] - stub_formatted member, format - params[:format] = format - end - klass.stub!(:new).and_return(member) - if options[:params] - klass.stub!(:new).with(hash_including(options[:params])).and_return(member) - end - if options[:stub_save] - stub_ar_method member, :save, options[:return] - else - member.stub!(:new_record?).and_return(true) - member.stub!(:id).and_return(nil) - end - end - end - - # Alias for stub_initialize which additionally defines an implicit request get :new. - def stub_new(klass, options = {}) - define_implicit_request :new - stub_initialize klass, options - end - - # Alias for stub_initialize which additionally defines an implicit request post :create. - # - # Note: If stub_create is provided an optional :params hash, - # those params will be added to the example's params object. - def stub_create(klass, options = {}) - define_implicit_request :create - class_name = klass.name.underscore - options[:params] ||= params[class_name] - stub_initialize klass, options.merge(:stub_save => true) - end - - # Stubs out find and returns a single mock_model - # instances of that class. Accepts the following options: - # - # :find_method:: Method to use as finder call. Default is :find. - # :format:: Format of the request. Used to only add to_xml and - # to_json when actually needed. - # :stub:: Additional methods to stub on the instances - # :current_object:: If set to true, find will set params[:id] - # using the id of the mock_model instance - # and use that value as an argument when stubbing find - # - # Any additional options will be passed as arguments to find.You will want - # to make sure to pass those arguments to the it_should_find spec as well. - # - # Note: The option :stub_ar is used internally by stub_update - # and stub_destroy. If you need to stub update_attributes or - # destroy you should be using the aforementioned methods instead. - def stub_find_one(klass, options = {}) - returning mock_model(klass) do |member| - stub_out member, options.delete(:stub) - if format = options.delete(:format) - stub_formatted member, format - params[:format] = format - end - if options.delete(:current_object) - params[:id] = member.id - if ar_stub = options.delete(:stub_ar) - stub_ar_method member, ar_stub, options.delete(:return), options.delete(:update_params) - end - end - if find_method = options.delete(:find_method) - klass.stub!(find_method).and_return(member) - else - # Stubbing string and non-string just to be safe - klass.stub!(:find).with(member.id).and_return(member) - klass.stub!(:find).with(member.id.to_s).and_return(member) - unless options.empty? - klass.stub!(:find).with(member.id, hash_including(options)).and_return(member) - klass.stub!(:find).with(member.id.to_s, hash_including(options)).and_return(member) - end - end - end - end - - # Note: Use of this method with :child options (to mock - # association) is deprecated. Please use stub_association. - # - # Same as stub_find_one but setups the instance as the parent - # of the specified association. Example: - # - # stub_parent(Document, :child => :comments) - # - # This stubs Document.find, @document.comments (which - # will return Comment class), as well as params[:document_id]. - # This method is meant to be used in the controller for the specified child - # (CommentsController in this instance) in situations like: - # - # def index - # @document = Document.find(params[:document_id]) - # @comments = @document.comments.find(:all) - # end - def stub_parent(klass, options = {}) - returning stub_find_one(klass, options) do |member| - params[klass.name.foreign_key] = member.id - if offspring = options.delete(:child) - puts "stub_parent with :child option has been marked for deprecation" - puts "please use stub_association to create the mock instead" - member.stub!(offspring).and_return(class_for(offspring)) - end - end - end - - # Alias for stub_find_one which additionally defines an implicit request get :show. - def stub_show(klass, options = {}) - define_implicit_request :show - stub_find_one klass, options.merge(:current_object => true) - end - - # Alias for stub_find_one which additionally defines an implicit request get :edit. - def stub_edit(klass, options = {}) - define_implicit_request :edit - stub_find_one klass, options.merge(:current_object => true) - end - - # Alias for stub_find_one which additionally defines an implicit request put :update - # and stubs out the update_attribute method on the instance as well. - # - # Note: If stub_update is provided an optional :params hash, - # those params will be added to the example's params object. - def stub_update(klass, options = {}) - define_implicit_request :update - stub_find_one klass, options.merge(:current_object => true, :stub_ar => :update_attributes) - end - - # Alias for stub_find_one which additionally defines an implicit request delete :destroy - # and stubs out the destroy method on the instance as well. - def stub_destroy(klass, options = {}) - define_implicit_request :destroy - stub_find_one klass, options.merge(:current_object => true, :stub_ar => :destroy) - end - - # Stubs to_xml or to_json respectively based on format argument. - def stub_formatted(object, format) - return unless format - object.stub!("to_#{format}").and_return("#{object.class} formatted as #{format}") - end - - # Creates a mock object representing an association proxy, stubs the appropriate - # method on the parent object and returns that association proxy. - # Accepts the following option: - # - # :stub:: Additional methods to stub on the mock proxy object - def stub_association(object, association, options = {}) - # I know options isn't implemented anywhere - object_name = instance_variables.select{|name| instance_variable_get(name) == object} - returning mock("Association proxy for #{object_name}.#{association}") do |proxy| - stub_out proxy, options[:stub] if options[:stub] - object.stub!(association).and_return(proxy) - end - end - - private - # Stubs out multiple methods. You shouldn't be calling this yourself and if you do - # you should be able to understand the code yourself, right? - def stub_out(object, stubs = {}) - return if stubs.nil? - stubs.each do |method, value| - if value - object.stub!(method).and_return(value) - else - object.stub!(method) - end - end - end - - # Stubs out ActiveRecord::Base methods like #save, #update_attributes, etc - # that may be called on a found or instantiated mock_model instance. - def stub_ar_method(object, method, return_value, params = {}) - if params.blank? - object.stub!(method).and_return(return_value ? false : true) - else - object.stub!(method).with(hash_including(params)).and_return(return_value ? false : true) - end - end - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/model_spec_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/model_spec_helpers.rb deleted file mode 100644 index 4119acc6..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/model_spec_helpers.rb +++ /dev/null @@ -1,496 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), "..") -require "skinny_spec" - -module LuckySneaks - # These methods are designed to be used in your example [read: "it"] blocks - # to make your model specs a little more DRY. You might also be interested - # in checking out the example block [read: "describe"] level versions in of these - # methods which can DRY things up even more: - # LuckySneaks::ModelSpecHelpers::ExampleGroupLevelMethods. - # - # Also check out the methods in LuckySneaks::ModelSpecHelpers::AssociationMatcher - # for some helpful matcher helper methods to use with these methods if you want to spec - # options on your association setups. - module ModelSpecHelpers - include LuckySneaks::CommonSpecHelpers - - def self.included(base) # :nodoc: - base.extend ExampleGroupLevelMethods - end - - # These methods cannot be used alone but are used in compliment with the association - # matchers in LuckySneaks::ModelSpecHelpers like have_many. Example: - # - # describe User do - # it "should have many memberships" do - # User.should have_many(:memberships) - # end - # - # it "should have many sites through memberships" do - # User.should have_many(:sites).through(:memberships) - # end - # - # it "should belong to a manager" do - # User.should belong_to(:manager).with_counter_cache - # end - # end - # - # Note: To spec these sorts of options using the example block helpers like - # it_should_have_many, just add them as options directly. This will use - # with_options rather than any specific matcher helpers but will have the same - # effects. Example: - # - # describe User do - # it_should_have_many :sites, :through => :memberships - # end - class AssociationMatcher - def initialize(associated, macro) # :nodoc: - @associated = associated - @macro = macro - @options = {} - end - - def matches?(main_model) # :nodoc: - unless main_model.respond_to?(:reflect_on_association) - if main_model.class.respond_to?(:reflect_on_association) - main_model = main_model.class - else - @not_model = main_model - return false - end - end - if @association = main_model.reflect_on_association(@associated) - @options.all?{|k, v| @association.options[k] == v || - [@association.options[k]] == v} # Stupid to_a being obsoleted! - end - end - - def failure_message # :nodoc: - if @not_model - " expected: #{@not_model} to be a subclass of ActiveRecord::Base class, but was not" - elsif @association - " expected: #{association_with(@options)}\n got: #{association_with(@association.options)}" - else - " expected: #{association_with(@options)}, but the association does not exist" - end - end - - def negative_failure_message # :nodoc: - if @association - " expected: #{association_with(@options)}\n got: #{association_with(@association.options)}" - else - " expected: #{association_with(@options)} to not occur but it does" - end - end - - # The following public methods are chainable extensions on the main matcher - # Examples: - # - # Foo.should have_many(:bars).through(:foobars).with_dependent(:destroy) - # Bar.should belong_to(:baz).with_class_name("Unbaz") - def through(through_model) - @options[:through] = through_model - self - end - - def and_includes(included_models) - @options[:include] = included_models - self - end - - def and_extends(*modules) - @options[:extends] = modules - self - end - - def with_counter_cache(counter_cache = true) - if counter_cache - @options[:counter_cache] = counter_cache - end - self - end - - def uniq(*irrelevant_args) - @options[:uniq] = true - self - end - alias and_is_unique uniq - alias with_unique uniq - - def polymorphic(*irrelevant_args) - @options[:polymorphic] = true - self - end - alias and_is_polymorphic polymorphic - alias with_polymorphic polymorphic - - def as(interface) - @options[:as] = interface - end - - # Use this to just specify the options as a hash. - # Note: It will completely override any previously set options - def with_options(options = {}) - options.each{|k, v| @options[k] = v} - self - end - - private - # Takes care of methods like with_dependent(:destroy) - def method_missing(method_id, *args, &block) - method_name = method_id.to_s - if method_name =~ /^with_(.*)/ - @options[$1.to_sym] = args - self - else - super method_id, *args, &block - end - end - - def association_with(options) - option_string = (options.nil? || options.empty?) ? "" : options.inspect - unless option_string.blank? - option_string.sub! /^\{(.*)\}$/, ', \1' - option_string.gsub! /\=\>/, ' => ' - end - "#{@macro} :#{@associated}#{option_string}" - end - end - - # Creates matcher that checks if the receiver has a belongs_to association - # with the specified model. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def belong_to(model) - AssociationMatcher.new model, :belongs_to - end - - # Creates matcher that checks if the receiver has a have_one association - # with the specified model. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def have_one(model) - AssociationMatcher.new model, :has_one - end - - # Creates matcher that checks if the receiver has a have_many association - # with the specified model. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def have_many(models) - AssociationMatcher.new models, :has_many - end - - # Creates matcher that checks if the receiver has a have_and_belong_to_many association - # with the specified model. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def have_and_belong_to_many(models) - AssociationMatcher.new models, :has_and_belongs_to_many - end - - private - def class_or_instance - @model_spec_class_or_instance ||= class_for(described_type) || instance - end - - def instance - @model_spec_instance ||= instance_for(described_type) - end - - # These methods are designed to be used at the example group [read: "describe"] level - # to simplify and DRY up common expectations. Some of these methods are wrappers for - # matchers which can also be used on the example level [read: within an "it" block]. See - # LuckySneaks::ModelSpecHelpers for more information. - # - # Note: The validation matchers are only meant to be used for simple validation checking - # not as a one-size-fits-all solution. - module ExampleGroupLevelMethods - # Creates an expectation that the current model being spec'd has a belong_to - # association with the specified model. Accepts optional arguments which are appended to - # the belong_to spec like this: - # - # it_should_belong_to :document, :counter_cache => true - # - # which is the same as writing out: - # - # it "should belong to document" do - # Comment.should belong_to(:document).with_options(:counter_cache => true) - # end - # - # If you want a more detailed spec description text, feel free to write this out in the long - # form and use belong_to and its related matcher helpers. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def it_should_belong_to(model, options = {}) - it "should belong to a #{model}" do - if options.empty? - class_or_instance.should belong_to(model) - else - class_or_instance.should belong_to(model).with_options(options) - end - end - end - - # Creates an expectation that the current model being spec'd has a have_one - # association with the specified model. Accepts optional arguments which are appended to - # the have_one spec like this: - # - # it_should_have_one :last_comment, :class_name => "Comment", :order => "created_at DESC" - # - # which is the same as writing out: - # - # it "should have one document" do - # Document.should have_one(:last_comment).with_options(:class_name => "Comment", :order => "created_at DESC") - # end - # - # If you want a more detailed spec description text, feel free to write this out in the long - # form and use have_one and its related matcher helpers. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def it_should_have_one(model, options = {}) - it "should have one #{model}" do - if options.empty? - class_or_instance.should have_one(model) - else - class_or_instance.should have_one(model).with_options(options) - end - end - end - - # Creates an expectation that the current model being spec'd has a have_many - # association with the specified model. Accepts optional arguments which are appended to - # the have_many spec like this: - # - # it_should_have_many :memberships, :through => :sites - # - # which is the same as writing out: - # - # it "should have many memberships" do - # User.should have_many(:memberships).with_options(:through => :sites) - # end - # - # If you want a more detailed spec description text, feel free to write this out in the long - # form and use have_many and its related matcher helpers. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def it_should_have_many(models, options = {}) - it "should have many #{models}" do - if options.empty? - class_or_instance.should have_many(models) - else - class_or_instance.should have_many(models).with_options(options) - end - end - end - - # Creates an expectation that the current model being spec'd has a have_and_belong_to_many - # association with the specified model. Accepts optional arguments which are appended to - # the have_and_belong_to_many spec like this: - # - # it_should_have_and_belong_to_many :documents, :include => :attachments - # - # which is the same as writing out: - # - # it "should belong to document" do - # User.should have_and_belong_to_many(:documents).with_options(:include => :attachments) - # end - # - # If you want a more detailed spec description text, feel free to write this out in the long - # form and use have_and_belong_to_many and its related matcher helpers. - # - # Note: The argument should be a symbol as in the model's association definition - # and not the model's class name. - def it_should_have_and_belong_to_many(models, options = {}) - it "should have and belong to many #{models}" do - if options.empty? - class_or_instance.should have_and_belong_to_many(models) - else - class_or_instance.should have_and_belong_to_many(models).with_options(options) - end - end - end - - # Creates an expectation that new instances of the model being spec'd - # should initialise the specified attributes with a default value. - # - # it_should_default_attributes :status => 'new' - # - def it_should_default_attributes(hash_attribute_values) - hash_attribute_values.each_pair do |a,v| - it "should default #{a} attribute to #{v}" do - class_or_instance.new.send(a).should == v - end - end - end - - # Creates an expectation that the current model being spec'd validates_presence_of - # the specified attribute. Takes an optional custom message to match the one in the model's - # validation. - def it_should_validate_presence_of(attribute, message = default_error_message(:blank)) - it "should not be valid if #{attribute} is blank" do - instance.send "#{attribute}=", nil - instance.errors_on(attribute).should include(message) - end - end - - # Negative version of it_should_validate_presence_of. See that method for more - # details. You'd probably only be using this in a nested example block to compare that - # one scenario validates presence and another does not (because of conditions in - # :if/:unless). - def it_should_not_validate_presence_of(attribute, message = default_error_message(:blank)) - it "should be valid if #{attribute} is blank" do - instance.send "#{attribute}=", nil - instance.errors_on(attribute).should_not include(message) - end - end - - # Creates an expectation that the current model being spec'd validates_inclusion_of - # the specified attribute. Takes an optional custom message to match the one in the model's - # validation. - def it_should_validate_inclusion_of(attribute, options = {}, message = default_error_message(:inclusion)) - it "should validate #{attribute} is in #{options[:in].to_s}" do - # We specifically do not try to go below the range on String and character ranges because that problem set is unpredictable. - lower = options[:in].first.respond_to?(:-) ? options[:in].first - 0.0001 : nil - higher = options[:in].last.succ - - instance.send "#{attribute}=", lower - instance.errors_on(attribute).should include(message) - - instance.send "#{attribute}=", higher - instance.errors_on(attribute).should include(message) - - instance.send "#{attribute}=", (lower+higher)/2 - instance.errors_on(attribute).should_not include(message) - end - end - - # Creates an expectation that the current model being spec'd validates_numericality_of - # the specified attribute. Takes an optional custom message to match the one in the model's - # validation. - def it_should_validate_numericality_of(attribute, message = default_error_message(:not_a_number)) - it "should validate #{attribute} is a numeric" do - instance.send "#{attribute}=", "NaN" - instance.errors_on(attribute).should include(message) - end - end - - # Negative version of it_should_validate_numericality_of. See that method for more - # details. You'd probably only be using this in a nested example block to compare that - # one scenario validates presence and another does not (because of conditions in - # :if/:unless). - def it_should_not_validate_numericality_of(attribute, message = default_error_message(:not_a_number)) - it "should not validate #{attribute} is a numeric" do - instance.send "#{attribute}=", "NaN" - instance.errors_on(attribute).should_not include(message) - end - end - - # Creates an expectation that the current model being spec'd validates_confirmation_of - # the specified attribute. Takes an optional custom message to match the one in the model's - # validation. - def it_should_validate_confirmation_of(attribute, message = default_error_message(:confirmation)) - it "should validate confirmation of #{attribute}" do - dummy_value = dummy_value_for(instance, attribute) || "try a string" - instance.send "#{attribute}=", dummy_value - instance.send "#{attribute}_confirmation=", dummy_value.succ - instance.errors_on(attribute).should include(message) - end - end - - # Creates an expectation that the current model being spec'd validates_uniqueness_of - # the specified attribute. Takes an optional custom message to match the one in the model's - # validation. - # - # Note: This method will fail completely if valid_attributes - # does not provide all the attributes needed to create a valid record. - def it_should_validate_uniqueness_of(attribute, message = default_error_message(:taken)) - it "should validate uniqueness of #{attribute}" do - previous_instance = instance.class.create!(valid_attributes) - instance.attributes = valid_attributes - instance.errors_on(attribute).should include(message) - previous_instance.destroy - end - end - - # Negative version of it_should_validate_uniqueness_of. See that method for more - # details. You'd probably only be using this in a nested example block to compare that - # one scenario validates presence and another does not (because of conditions in - # :if/:unless). - def it_should_not_validate_uniqueness_of(attribute, message = default_error_message(:taken)) - it "should not validate uniqueness of #{attribute}" do - previous_instance = instance.class.create!(valid_attributes) - instance.attributes = valid_attributes - instance.errors_on(attribute).should_not include(message) - previous_instance.destroy - end - end - - # Creates an expectation that the current model being spec'd accepts the specified values as - # valid for the specified attribute. This is most likely used with validates_format_of - # but there's nothing saying it couldn't be another validation. - def it_should_accept_as_valid(attribute, *values) - values.flatten.each do |value| - value_inspect = case value - when String : "'#{value}'" - when NilClass : "nil" - else value - end - it "should accept #{value_inspect} as a valid #{attribute}" do - instance.send "#{attribute}=", value - instance.errors_on(attribute).should == [] - end - end - end - - # Creates an expectation that the current model being spec'd does not accept the specified - # values as valid for the specified attribute. This is most likely used with - # validates_format_of but there's nothing saying it couldn't be another validation. - # Takes an optional argument :message => "some custom error messsage" for - # spec'ing the actual error message. - def it_should_not_accept_as_valid(attribute, *values) - options = values.extract_options! - values.flatten.each do |value| - value_inspect = case value - when String : "'#{value}'" - when NilClass : "nil" - else value - end - it "should not accept #{value_inspect} as a valid #{attribute}" do - instance.send "#{attribute}=", value - if options[:message] - instance.errors_on(attribute).should include(options[:message]) - else - instance.should have_at_least(1).errors_on(attribute) - end - end - end - end - - # Creates an expectation that the current model being spec'd doesn't allow mass-assignment - # of the specified attribute. - def it_should_not_mass_assign(attribute) - it "should not allow mass-assignment of #{attribute}" do - lambda { - instance.send :attributes=, {attribute => dummy_value_for(instance, attribute)} - }.should_not change(instance, attribute) - end - end - - def default_error_message(attribute) - if defined?(I18n) - I18n.translate attribute, :scope => "activerecord.errors.messages" - else - ActiveRecord::Errors.default_error_messages[attribute] - end - end - end - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_spec_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_spec_helpers.rb deleted file mode 100644 index fb8775a1..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_spec_helpers.rb +++ /dev/null @@ -1,577 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), "..") -require "skinny_spec" - -module LuckySneaks - # These methods are designed to be used in your example [read: "it"] blocks - # to make your view specs less brittle and more DRY. You might also be interested - # in checking out the example block [read: "describe"] level versions in of these - # methods which can DRY things up even more: - # LuckySneaks::ViewSpecHelpers::ExampleGroupLevelMethods. - module ViewSpecHelpers - include LuckySneaks::CommonSpecHelpers - include LuckySneaks::ViewStubHelpers - include ActionController::PolymorphicRoutes - - def self.included(base) # :nodoc: - base.extend ExampleGroupLevelMethods - end - - # Wraps a matcher that checks if the receiver contains a FORM element with - # its action attribute set to the specified path. - def submit_to(path) - have_tag("form[action=#{path}]") - end - - # Wraps a matcher that checks if the receiver contains any of several form elements - # that would return sufficient named parameters to allow editing of the specified - # attribute on the specified instance. Example: - # - # response.should allow_editing(@foo, "bar") - # - # can be satisfied by any of the following HTML elements: - # - # - # - # - # - # - def allow_editing(instance, attribute) - instance_name = instance.class.name.underscore.downcase - column = instance.column_for_attribute(attribute) - if column && [Date, Time].include?(column.klass) - have_tag( - "input[name='#{instance_name}[#{attribute}]'], - select[name=?]", /#{instance_name}\[#{attribute}\(.*\)\]/ - ) - else - have_tag( - "input[type='text'][name='#{instance_name}[#{attribute}]'], - input[type='password'][name='#{instance_name}[#{attribute}]'], - select[name='#{instance_name}[#{attribute}]'], - textarea[name='#{instance_name}[#{attribute}]'], - input[type='checkbox'][name='#{instance_name}[#{attribute}]'], - input[type='checkbox'][name='#{instance_name}[#{attribute.to_s.tableize.singularize}_ids][]'], - input[type='radio'][name='#{instance_name}[#{attribute}]']" - ) - end - end - - # Wraps a matcher that checks if the receiver contains a FORM element - # whose enctype attribute is set to "multipart/form-data" - # and contains an INPUT element whose name attribute correlates - # with the provided instance and attribute. - def allow_uploading(instance, attribute) - instance_name = instance.class.name.underscore.downcase - have_tag("form[enctype='multipart/form-data'] input[type='file'][name='#{instance_name}[#{attribute}]']") - end - - # Wraps a matcher that checks if the receiver contains an A element (link) - # whose href attribute is set to the specified path or a FORM - # element whose action attribute is set to the specified path. - def have_link_or_button_to(path) - have_tag( - "a[href='#{path}'], - form[action='#{path}'] input, - form[action='#{path}'] button" - ) - end - alias have_link_to have_link_or_button_to - alias have_button_to have_link_or_button_to - - # Wraps have_link_or_button_to new_polymorphic_path for the specified class which - # corresponds with the new method of the controller. - # - # Note: This method may takes a string or symbol representing the model's name - # to send to have_link_or_button_to_show or the model's name itself. - def have_link_or_button_to_new(name) - have_link_or_button_to new_polymorphic_path(name.is_a?(ActiveRecord::Base) ? name : class_for(name)) - end - - # Wraps have_link_or_button_to polymorphic_path(instance) which - # corresponds with the show method of the controller. - def have_link_or_button_to_show(instance) - path = polymorphic_path(instance) - have_tag( - "a[href='#{path}'], - form[action='#{path}'][method='get'] input, - form[action='#{path}'][method='get'] button, - form[action='#{path}'] input[name='_method'][value='get'] + input, - form[action='#{path}'] input[name='_method'][value='get'] + button" - ) - end - alias have_link_to_show have_link_or_button_to_show - alias have_button_to_show have_link_or_button_to_show - - # Wraps have_link_or_button_to edit_polymorphic_path(instance) which - # corresponds with the edit method of the controller. - def have_link_or_button_to_edit(instance) - have_link_or_button_to edit_polymorphic_path(instance) - end - alias have_link_to_edit have_link_or_button_to_edit - alias have_button_to_edit have_link_or_button_to_edit - - # Wraps a matcher that checks if the receiver contains the HTML created by Rails' - # button_to helper: to wit, a FORM element whose action - # attribute is pointed at the polymorphic_path of the instance - # and contains an INPUT named "_method" with a value of "delete". - def have_button_to_delete(instance) - path = polymorphic_path(instance) - have_tag( - "form[action='#{path}'] input[name='_method'][value='delete'] + input, - form[action='#{path}'] input[name='_method'][value='delete'] + button, - a[href=\"#{path}\"][onclick*=\"f.method = 'POST'\"][onclick*=\"m.setAttribute('name', '_method'); m.setAttribute('value', 'delete')\"]" - ) - end - - # Creates a mock_model instance and adds it to the assigns collection - # using either the name passed as the first argument or the underscore version - # of its class name. Accepts optional arguments to stub out additional methods - # (and their return values) on the mock_model instance. Example: - # - # mock_and_assign(Foo, :stub => {:bar => "bar"}) - # - # is the same as running assigns[:foo] = mock_model(Foo, :bar => "bar"). - # - # mock_and_assign(Foo, "special_foo", :stub => {:bar => "baz"}) - # - # is the same as running assigns[:special_foo] = mock_model(Foo, :bar => "baz"). - # - # Note: Adding to the assigns collection returns the object added, so this can - # be chained a la @foo = mock_and_assign(Foo). - def mock_and_assign(klass, *args) - options = args.extract_options! - mocked = if options[:stub] - self.respond_to?(:stub_model) ? stub_model(klass, options[:stub]) : mock_model(klass, options[:stub]) - else - self.respond_to?(:stub_model) ? stub_model(klass) : mock_model(klass) - end - yield mocked if block_given? - self.assigns[args.first || "#{klass}".underscore] = mocked - end - - # Creates an array of mock_model instances in the manner of - # mock_and_assign. Accepts option[:size] which sets the size - # of the array (default is 3). - def mock_and_assign_collection(klass, *args) - options = args.extract_options! - return_me = Array.new(options[:size] || 3) do - mocked = if options[:stub] - self.respond_to?(:stub_model) ? stub_model(klass, options[:stub]) : mock_model(klass, options[:stub]) - else - self.respond_to?(:stub_model) ? stub_model(klass) : mock_model(klass) - end - yield mocked if block_given? - mocked - end - self.assigns[args.first || "#{klass}".tableize] = return_me - end - - private - def do_render - if @the_template - render @the_template - elsif File.exists?(File.join(RAILS_ROOT, "app/views", class_description_text)) - render class_description_text - else - error_message = "Cannot determine template for render. " - error_message << "Please define @the_template in the before block " - error_message << "or name your describe block so that it indicates the correct template." - raise NameError, error_message - end - end - - # These methods are designed to be used at the example group [read: "describe"] level - # to simplify and DRY up common expectations. Most of these methods are wrappers for - # matchers which can also be used on the example level [read: within an "it" block]. See - # LuckySneaks::ViewSpecHelpers for more information. - module ExampleGroupLevelMethods - include LuckySneaks::CommonSpecHelpers - - # Creates an expectation which calls submit_to on the response - # from rendering the template. See that method for more details. - # - # Note: This method takes a Proc to evaluate the route not simply a named route - # helper, which would be undefined in the scope of the example block. - def it_should_submit_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should submit to #{(hint || route)}" do - do_render - response.should submit_to(instance_eval(&route)) - end - end - - # Negative version of it_should_submit_to. See that method for more - # details. - def it_should_not_submit_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should not submit to #{(hint || route)}" do - do_render - response.should_not submit_to(instance_eval(&route)) - end - end - - # Creates an expectation that the template uses Rails' form_for to generate - # the proper form action and method to create or update the specified object. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to create the expectation for form_for - # not an instance variable, which would be nil in the scope of the example block. - # If you use namespacing for your form_for, you'll have to manually write out - # a similar spec. - def it_should_have_form_for(name, options = {}) - it "should have a form_for(@#{name})" do - if options.empty? - template.should_receive(:form_for).with(instance_for(name)) - else - template.should_receive(:form_for).with(instance_for(name), hash_including(options)) - end - do_render - end - end - - # Negative version of it_should_have_form_for. See that method for more - # details. - def it_should_not_have_form_for(name, options = {}) - it "should not have a form_for(@#{name})" do - if options.empty? - template.should_not_receive(:form_for).with(instance_for(name)) - else - template.should_not_receive(:form_for).with(instance_for(name), hash_including(options)) - end - do_render - end - end - - # Creates an expectation which calls allow_editing on the rendered - # template for each attribute specified. See the docs for allow_editing - # for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to send to allow_editing - # not an instance variable, which would be nil in the scope of the example block. - def it_should_allow_editing(instance_name, *attributes) - attributes.flatten! - attributes.each do |attribute| - it "should allow editing of @#{instance_name}##{attribute}" do - do_render - response.should allow_editing(instance_for(instance_name), attribute) - end - end - end - - # Negative version of it_should_allow_editing. See that method for more - # details. - def it_should_not_allow_editing(instance_name, *attributes) - attributes.flatten! - attributes.each do |attribute| - it "should not allow editing of @#{instance_name}##{attribute}" do - do_render - response.should_not allow_editing(instance_for(instance_name), attribute) - end - end - end - - # Creates an expectation which calls allow_uploading on the rendered - # template for each attribute specified. See the docs for allow_uploading - # for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to send to allow_uploading - # not an instance variable, which would be nil in the scope of the example block. - def it_should_allow_uploading(instance_name, *attributes) - attributes.flatten! - attributes.each do |attribute| - it "should allow editing of @#{instance_name}##{attribute}" do - do_render - response.should allow_uploading(instance_for(instance_name), attribute) - end - end - end - - # Negative version of it_should_allow_uploading. See that method for more - # details. - def it_should_not_allow_uploading(instance_name, *attributes) - attributes.flatten! - attributes.each do |attribute| - it "should not allow editing of @#{instance_name}##{attribute}" do - do_render - response.should_not allow_uploading(instance_for(instance_name), attribute) - end - end - end - - # Creates an expectation that the rendered template contains a FORM element - # (INPUT, TEXTAREA, or SELECT) with the specified name. - def it_should_have_form_element_for(name) - it "should have a form element named '#{name}'" do - do_render - response.should have_tag( - "form input[name='#{name}'], - form textarea[name='#{name}'], - form select[name='#{name}']" - ) - end - end - - # Negative version of it_should_have_form_element_for. See that method - # for more details. - def it_should_not_have_form_element_for(name) - it "should not have a form element named '#{name}'" do - do_render - response.should_not have_tag( - "form input[name='#{name}'], - form textarea[name='#{name}'], - form select[name='#{name}']" - ) - end - end - - # Creates an expectation which calls have_link_or_button_to on the response - # from rendering the template. See that method for more details. - # - # Note: This method takes a block to evaluate the route in the example context - # instead of the example group context. - def it_should_link_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should have a link/button to #{(hint || route)}" do - do_render - response.should have_link_or_button_to(instance_eval(&route)) - end - end - alias it_should_have_link_to it_should_link_to - alias it_should_have_button_to it_should_link_to - alias it_should_have_button_or_link_to it_should_link_to - - # Negative version of it_should_link_to. See that method - # for more details. - def it_should_not_link_to(hint = nil, &route) - if hint.nil? && route.respond_to?(:to_ruby) - hint = route.to_ruby.gsub(/(^proc \{)|(\}$)/, '').strip - end - it "should have a link/button to #{(hint || route)}" do - do_render - response.should_not have_link_or_button_to(instance_eval(&route)) - end - end - alias it_should_not_have_link_to it_should_not_link_to - alias it_should_not_have_button_to it_should_not_link_to - alias it_should_not_have_button_or_link_to it_should_not_link_to - - # Creates an expectation which calls have_link_or_button_to_new on the response - # from rendering the template. See that method for more details. - # - # Note: This method may takes a string or symbol representing the model's name - # to send to have_link_or_button_to_show or the model's name itself. - def it_should_link_to_new(name) - it "should have a link/button to create a new #{name}" do - do_render - response.should have_link_or_button_to_new(name) - end - end - alias it_should_have_link_to_new it_should_link_to_new - alias it_should_have_button_to_new it_should_link_to_new - alias it_should_have_button_or_link_to_new it_should_link_to_new - - # Negative version of it_should_link_to_show. See that method - # for more details. - def it_should_not_link_to_new(name) - it "should have a link/button to create a new #{name}" do - do_render - response.should_not have_link_or_button_to_new(name) - end - end - alias it_should_not_have_link_to_new it_should_not_link_to_new - alias it_should_not_have_button_to_new it_should_not_link_to_new - alias it_should_not_have_button_or_link_to_new it_should_not_link_to_new - - # Creates an expectation which calls have_link_or_button_to_show on the response - # from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to send to have_link_or_button_to_show - # not an instance variable, which would be nil in the scope of the example block. - def it_should_link_to_show(name) - it "should have a link/button to show @#{name}" do - do_render - response.should have_link_or_button_to_show(instance_for(name)) - end - end - alias it_should_have_link_to_show it_should_link_to_show - alias it_should_have_button_to_show it_should_link_to_show - alias it_should_have_button_or_link_to_show it_should_link_to_show - - # Negative version of it_should_link_to_show. See that method - # for more details. - def it_should_not_link_to_show(name) - it "should have a link/button to show @#{name}" do - do_render - response.should_not have_link_or_button_to_show(instance_for(name)) - end - end - alias it_should_not_have_link_to_show it_should_not_link_to_show - alias it_should_not_have_button_to_show it_should_not_link_to_show - alias it_should_not_have_button_or_link_to_show it_should_not_link_to_show - - # Creates an expectation which calls have_link_or_button_to_show - # for each member of the instance variable matching the specified name - # on the response from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name and not an instance variable, which would be nil - # in the scope of the example block. - def it_should_link_to_show_each(name) - it "should have a link/button to show each member of @#{name}" do - do_render - instance_for(name).each do |member| - response.should have_link_or_button_to_show(member) - end - end - end - alias it_should_have_link_to_show_each it_should_link_to_show_each - alias it_should_have_button_to_show_each it_should_link_to_show_each - alias it_should_have_button_or_link_to_show_each it_should_link_to_show_each - - # Creates an expectation which calls have_link_or_button_to_edit on the response - # from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to send to have_link_or_button_to_edit - # not an instance variable, which would be nil in the scope of the example block. - def it_should_link_to_edit(name) - it "should have a link/button to edit @#{name}" do - do_render - response.should have_link_or_button_to_edit(instance_for(name)) - end - end - alias it_should_have_link_to_edit it_should_link_to_edit - alias it_should_have_button_to_edit it_should_link_to_edit - alias it_should_have_button_or_link_to_edit it_should_link_to_edit - - # Negative version of it_should_link_to_edit. See that method - # for more details. - def it_should_not_link_to_edit(name) - it "should have a link/button to edit @#{name}" do - do_render - response.should_not have_link_or_button_to_edit(instance_for(name)) - end - end - alias it_should_not_have_link_to_edit it_should_not_link_to_edit - alias it_should_not_have_button_to_edit it_should_not_link_to_edit - alias it_should_not_have_button_or_link_to_edit it_should_not_link_to_edit - - - # Creates an expectation which calls have_link_or_button_to_edit - # for each member of the instance variable matching the specified name - # on the response from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name and not an instance variable, which would be nil - # in the scope of the example block. - def it_should_link_to_edit_each(name) - it "should have a link/button to edit each member of @#{name}" do - do_render - instance_for(name).each do |member| - response.should have_link_or_button_to_edit(member) - end - end - end - alias it_should_have_link_to_edit_each it_should_link_to_edit_each - alias it_should_have_button_to_edit_each it_should_link_to_edit_each - alias it_should_have_button_or_link_to_edit_each it_should_link_to_edit_each - - # Creates an expectation which calls have_link_or_button_to_delete on the response - # from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name to send to have_link_or_button_to_delete - # not an instance variable, which would be nil in the scope of the example block. - def it_should_link_to_delete(name) - it "should have a link/button to delete @#{name}" do - do_render - response.should have_button_to_delete(instance_for(name)) - end - end - alias it_should_have_link_to_delete it_should_link_to_delete - alias it_should_have_button_to_delete it_should_link_to_delete - alias it_should_have_button_or_link_to_delete it_should_link_to_delete - - # Negative version of it_should_link_to_delete. See that method - # for more details. - def it_should_not_link_to_delete(name) - it "should not have a link/button to delete @#{name}" do - do_render - response.should_not have_button_to_delete(instance_for(name)) - end - end - alias it_should_not_have_link_to_delete it_should_not_link_to_delete - alias it_should_not_have_button_to_delete it_should_not_link_to_delete - alias it_should_not_have_button_or_link_to_delete it_should_not_link_to_delete - - # Creates an expectation which calls have_link_or_button_to_delete - # for each member of the instance variable matching the specified name - # on the response from rendering the template. See that method for more details. - # - # Note: This method takes a string or symbol representing the instance - # variable's name and not an instance variable, which would be nil - # in the scope of the example block. - def it_should_link_to_delete_each(name) - it "should have a link/button to delete each member of @#{name}" do - do_render - instance_for(name).each do |member| - response.should have_button_to_delete(member) - end - end - end - alias it_should_have_link_to_delete_each it_should_link_to_delete_each - alias it_should_have_button_to_delete_each it_should_link_to_delete_each - alias it_should_have_button_or_link_to_delete_each it_should_link_to_delete_each - - # Creates an expectation that the template should call render :partial - # with the specified template. - def it_should_render_partial(name) - it "should render :partial => '#{name}'" do - template.should_receive(:render).with(hash_including(:partial => name)) - do_render - end - end - - # Negative version of it_should_render_partial. See that method - # for more details. - def it_should_not_render_partial(name) - it "should not render :partial => '#{name}'" do - template.should_not_receive(:render).with(hash_including(:partial => name)) - do_render - end - end - - # Sets @the_template (for use in do_render) using the current - # example group description. Example: - # - # describe "users/index.haml.erb" do - # use_describe_for_template! - # # ... - # end - # - # This is equivalent to setting @the_template = "users/index.haml.erb" - # in a before block. - def use_describe_for_template! - template = self_description_text - if File.exists?(File.join(RAILS_ROOT, "app/views", template)) - before(:each) do - @the_template = template - end - else - error_message = "You called use_describe_for_template! " - error_message << "but 'app/views/#{template}' does not exist. " - raise NameError, error_message - end - end - end - end -end diff --git a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_stub_helpers.rb b/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_stub_helpers.rb deleted file mode 100644 index 2dde384e..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/lucky_sneaks/view_stub_helpers.rb +++ /dev/null @@ -1,15 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), "..") -require "skinny_spec" - -module LuckySneaks - # These methods are designed to be used in your example before blocks to accomplish - # a whole lot of functionality with just a tiny bit of effort. - module ViewStubHelpers - # Shorthand for the following stub: - # - # template.stub!(:render).with(hash_including(:partial => anything)) - def stub_partial_rendering! - template.stub!(:render).with(hash_including(:partial => anything)) - end - end -end \ No newline at end of file diff --git a/backup.rails2.3/plugins/skinny_spec/lib/skinny_spec.rb b/backup.rails2.3/plugins/skinny_spec/lib/skinny_spec.rb deleted file mode 100644 index 3c366ce1..00000000 --- a/backup.rails2.3/plugins/skinny_spec/lib/skinny_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Let's make sure everyone else is loaded -require File.expand_path(RAILS_ROOT + "/config/environment") -require 'spec' -require 'spec/rails' -begin - require 'ruby2ruby' -rescue LoadError - puts "-----" - puts "Attention: skinny_spec requires ruby2ruby for nicer route descriptions" - puts "It is highly recommended that you install it: sudo gem install ruby2ruby" - puts "-----" -end - -# Let's load our family now -require "lucky_sneaks/common_spec_helpers" -require "lucky_sneaks/controller_request_helpers" -require "lucky_sneaks/controller_spec_helpers" -require "lucky_sneaks/controller_stub_helpers" -require "lucky_sneaks/model_spec_helpers" -require "lucky_sneaks/view_spec_helpers" - -# Let's all come together -Spec::Rails::Example::ViewExampleGroup.send :include, LuckySneaks::ViewSpecHelpers -Spec::Rails::Example::HelperExampleGroup.send :include, LuckySneaks::CommonSpecHelpers -Spec::Rails::Example::ControllerExampleGroup.send :include, LuckySneaks::ControllerSpecHelpers -Spec::Rails::Example::ModelExampleGroup.send :include, LuckySneaks::ModelSpecHelpers \ No newline at end of file diff --git a/backup.rails2.3/plugins/swf_fu/CHANGELOG.rdoc b/backup.rails2.3/plugins/swf_fu/CHANGELOG.rdoc deleted file mode 100644 index 7b99496e..00000000 --- a/backup.rails2.3/plugins/swf_fu/CHANGELOG.rdoc +++ /dev/null @@ -1,46 +0,0 @@ -= swf_fu --- History - -== Version 1.4.0 - May 8, 2010 - -* Any option can be a block, in which case it is called (with the source swf passed as argument) - -== Version 1.3.1 - February 5, 2010 - -* Improved compatibility with Rails 3.0: swf_tag now outputs html_safe content. - -* Got rid of deprecation warning in Rails 2.2+ when using swf_tag in block form. - -== Version 1.3.0 - June 20, 2009 - -* Updated to swf_object v2.2. Change should not be noticeable to users, except compatibility improvements and better auto install. Added the option +switch_off_auto_hide_show+. - -== Version 1.2.0 - January 14, 2009 - -* flashvars[:id] will now default to the DOM id of the object. I didn't want to have any extra defaults than the very basic ones, but there is no easy way to get this from Flash (see http://www.actionscript.org/forums/showthread.php3?t=136044 ) and no easy way to specify that using +swf_default_options+. -* If flashvars is a string (e.g. "myVar=myValue") it will be parsed into a hash so that the behaviour for default values apply to strings or hashes. swf_default_options[:flashvars] can also be a string and will also be parsed before being merged. -* Small bug fix: the options passed as hashes (:flashvars, :parameters and :html_options) were changed if swf_default_options[:flashvars, ...] existed. They are now left unchanged. - -== Version 1.1.0 - January 3, 2009 - -* Improved the way to specify alternate content - -== Version 1.0.3 - January 3, 2009 - -* Improved javascript initialization - - :initialize => [1, 2, 3] # produces in javascript: obj.initialize(1,2,3) instead of ([1,2,3]) - # no :initialize produces in javascript: obj.initialize() instead of (null) - :initialize => nil # stil produces obj.initialize(null) - -== Version 1.0.2 - January 3, 2009 - -* Bug fix for flashvars in dynamic method - -== Version 1.0.1 - January 2, 2009 - -* File reorganization -* Bug fix for default options - -== Version 1.0 - X-mas, 2008 - -=== Initial release. diff --git a/backup.rails2.3/plugins/swf_fu/FLASH_OBJECT.rdoc b/backup.rails2.3/plugins/swf_fu/FLASH_OBJECT.rdoc deleted file mode 100644 index 87a0e72f..00000000 --- a/backup.rails2.3/plugins/swf_fu/FLASH_OBJECT.rdoc +++ /dev/null @@ -1,31 +0,0 @@ -== Compatibility with FlashObject - -This document is intended for users of FlashObject, a (much older) swf embedding plugin that inspired swf_fu. - -You can choose to: - -1) keep both. They won't interfere and +flashobject_tag+ will continue to use the older SWFObject 1.5 library. - -2) remove FlashObject: - - script/plugin remove flashobject_helper - -You can also manually remove javascripts/flashobject.js - -+swf_fu+ will take over the +flashobject_tag+ and will use the new SWFObject 2.2 library. -This should not have impacts as long as: -* your swf path is absolute (e.g. "/path/to/my_flash.swf"). If it is relative, move your swf file from 'public/' to the new 'public/swfs/' asset folder -* you include the default javascripts (otherwise you need to include 'swfobject' explicitely and stop including 'flashobject') -* you don't use the javascript object before the page is loaded. SWFObject 2.2 makes the changes to the web page later -* you don't rely on the +verify_file_exists+ option (it doesn't do anything anymore) - -In either case 1 or 2, you change existing calls to +flashobject_tag+ for +swf_tag+ at your leisure. -The interface is similar and the main differences are some options name changes: - :flash_id => :id - :variables => :flashvars - :background_color => options[:parameters][:bgcolor] - -Moreover, the following defaults are gone: - :flashvars[:lzproxied] - :parameters[:scale] - :parameters[:bgcolor] diff --git a/backup.rails2.3/plugins/swf_fu/LICENSE b/backup.rails2.3/plugins/swf_fu/LICENSE deleted file mode 100644 index efd683ff..00000000 --- a/backup.rails2.3/plugins/swf_fu/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -# swf_fu plugin for rails -# Copyright (c) 2010, Marc-André Lafortune. -# All rights reserved. -# Inspired by FlashObject by Davide D'Agostino aka DAddYE (http://www.lipsiasoft.com) -# Uses SWFObject.js 2.1 (http://code.google.com/p/swfobject) -# -# Licensed under the terms of the (modified) BSD License below: -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backup.rails2.3/plugins/swf_fu/README.rdoc b/backup.rails2.3/plugins/swf_fu/README.rdoc deleted file mode 100644 index 1791f1ff..00000000 --- a/backup.rails2.3/plugins/swf_fu/README.rdoc +++ /dev/null @@ -1,92 +0,0 @@ -= +swf_fu+ - -With the +swf_fu+ plugin, rails treats your swf files like any other asset (images, javascripts, etc...). - -+swf_fu+ (pronounced "swif-fu", bonus joke for french speakers) uses SWFObject 2.2 to embed swf objects in HTML and supports all its options. -SWFObject 2 is such a nice library that Adobe now uses it as the official way to embed swf! -SWFObject's project can be found at http://code.google.com/p/swfobject - -+swf_fu+ has been tested with rails v2.0 up to v3.0b and has decent test coverage so rake test:plugins should reveal any incompatibility. Comments and pull requests welcome: http://github.com/marcandre/swf_fu - -== Install - -Assuming you have git[http://git-scm.com/] installed (check with git version), it is easy to install from your applications directory: - - rails plugin install git://github.com/marcandre/swf_fu.git # rails 3 - - script/plugin install git://github.com/marcandre/swf_fu.git # rails 2 (starting at 2.0.2) - -For older versions of +rails+ or without +git+, you can always download -+swf_fu+ from github[http://github.com/marcandre/swf_fu/archives/master] and then install it manually: - - rails plugin install ~/Download/swf_fu # rails 3 - - script/plugin install ~/Downloads/swf_fu # rails 2.x - -== Usage - -=== Embedding in HTML - -To embed a swf file, use +swf_tag+: - <%= swf_tag "i_like_flashing" %> - -Exactly like images and javascripts, +swf_tag+ will use +swf_path+ -to determine the path of the swf file; it will assume it is in /public/swfs/ -unless specified otherwise and it will add the ".swf" extension automatically. - -You can specify alternate content either with the options :alt => "Get Flash!" or you can use +swf_tag+ as a block: - - <% swf_tag "i_like_flashing" do %> - Get Flash - <% end %> - -=== Options - -* :id - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+ -* :width, :height - the width & height of the Flash object. Defaults to "100%". These could also specified using :size -* :size - the size of the Flash object, in the form "400x300". -* :mode - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?] -* :flashvars - a Hash of variables that are passed to the swf. Can also be a string like "foo=bar&hello=world". Defaults to {:id => the DOM id} -* :parameters - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional] -* :html_options - a Hash of extra html options for the object tag. -* :alt - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page. This can also be specified as a block (see embedding section). In Rails 3, this text is _assumed_ to be HTML, so there is no need to call +html_safe+ on it. -* :flash_version - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0") -* :auto_install - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by +swf_fu+) -* :javascript_class - specify a javascript class (e.g. "MyFlash") for your flash object. If it exists, the initialize method will be called. -* :initialize - arguments to pass to the initialization method of your javascript class. -* :div_id - the DOM +id+ of the containing div itself. Defaults to "#{option[:id]}_div" -* :switch_off_auto_hide_show - switch off SWFObject's default hide/show behavior. SWFObject temporarily hides your SWF or alternative content until the library has decided which content to display. Defaults to nil. - -You can override these default options with a global setting: - - ActionView::Base.swf_default_options = {:mode => :static} # All swf_tag will use the static mode by default - -Any of these options can be a +Proc+, in which case it will be called each time swf_tag is called. - -For example, the following will generate unique IDs: - - my_swf_counter = 0 - ActionView::Base.swf_default_options[:id] = Proc.new{"swf_unique_id_#{my_swf_counter+=1}"} - -=== Javascript - -+swf_fu+ will add 'swfobject' to the list of default javascript files. If you don't include -the default javascripts, a simple javascript_include "swfobject" is needed. - -=== swf_path - -+swf_tag+ implements and relies on +swf_path+ which behaves in a similar fashion to +image_path+, +javascript_path+, etc...: - - swf_path("example") => "/swfs/example.swf" - swf_path("example.swf") => "/swfs/example.swf" - swf_path("fonts/optima") => "/swfs/fonts/optima.swf" - swf_path("/fonts/optima") => "/fonts/optima.swf" - swf_path("http://www.example.com/game.swf") => "http://www.example.com/game.swf" - -It takes into account the global setting +asset_host+, like any other asset: - - ActionController::Base.asset_host = "http://assets.example.com" - image_path("logo.jpg") => "http://assets.example.com/images/logo.jpg" - swf_path("fonts/optima") => "http://assets.example.com/swfs/fonts/optima.swf"" - -Copyright (c) 2010 Marc-André Lafortune, released under the BSD license diff --git a/backup.rails2.3/plugins/swf_fu/Rakefile b/backup.rails2.3/plugins/swf_fu/Rakefile deleted file mode 100644 index 9898dadb..00000000 --- a/backup.rails2.3/plugins/swf_fu/Rakefile +++ /dev/null @@ -1,22 +0,0 @@ -require 'rake' -require 'rake/testtask' -require 'rake/rdoctask' - -desc 'Default: run unit tests.' -task :default => :test - -desc 'Test the swf_fu plugin.' -Rake::TestTask.new(:test) do |t| - t.libs << 'lib' - t.pattern = 'test/**/*_test.rb' - t.verbose = true -end - -desc 'Generate documentation for the swf_fu plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'Swf Fu' - rdoc.options << '--line-numbers' << '--inline-source' << '-m README.rdoc' - rdoc.rdoc_files.include('*.rdoc') - rdoc.rdoc_files.include('lib/**/*.rb') -end diff --git a/backup.rails2.3/plugins/swf_fu/assets/javascripts/swfobject.js b/backup.rails2.3/plugins/swf_fu/assets/javascripts/swfobject.js deleted file mode 100644 index 8eafe9dd..00000000 --- a/backup.rails2.3/plugins/swf_fu/assets/javascripts/swfobject.js +++ /dev/null @@ -1,4 +0,0 @@ -/* SWFObject v2.2 - is released under the MIT License -*/ -var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;abM9VaMwSB_o5%t)!o>)g&X)EAYjgEPLcl5K%kkuIK}@4lZ{BkGMYAU20z( zNRb@8AZ~RNT{i-oQ>63S3q@bamddC&V#&}IBHXmBea0RPhMY!G_6yWA-{&u00bI?EPCUrE(n7GhyT+_4sC3vIfO8o*Hw?~a z;QV28jGXsc=C?Kce^ve?K|~w@>bMSCq>Q(O#T42y^Mv*pwUSN?9aMQms*Ld$rD0~q zQhI{Tv*fb=mqG|Gjsr39Bp7Dejr)q)1J&t=YBY?2Llv85=!N{vRx3=YEoRTjX+)n# zs ["swfobject"] -rescue NoMethodError # I think this might fail in Rails 2.1.x - ActionView::Helpers::AssetTagHelper.register_javascript_include_default 'swfobject' -end diff --git a/backup.rails2.3/plugins/swf_fu/install.rb b/backup.rails2.3/plugins/swf_fu/install.rb deleted file mode 100644 index fda481b0..00000000 --- a/backup.rails2.3/plugins/swf_fu/install.rb +++ /dev/null @@ -1,24 +0,0 @@ -require "fileutils" - -# Some paths -src = File.dirname(__FILE__)+"/assets" -dest = File.dirname(__FILE__)+"/../../../public" - -filename = "#{dest}/javascripts/swfobject.js" -unless File.exist?(filename) - FileUtils.cp "#{src}/javascripts/swfobject.js", filename - puts "Copying 'swfobject.js'" -end - -unless File.exist?("#{dest}/swfs/") - FileUtils.mkdir "#{dest}/swfs/" - puts "Creating new 'swfs' directory for swf assets" -end - -filename = "#{dest}/swfs/expressInstall.swf" -unless File.exist?(filename) - FileUtils.cp "#{src}/swfs/expressInstall.swf", filename - puts "Copying 'expressInstall.swf', the default flash auto-installer." -end - -puts "Installation done." diff --git a/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/asset_tag_helper/swf_asset.rb b/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/asset_tag_helper/swf_asset.rb deleted file mode 100644 index 2fe6e5bd..00000000 --- a/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/asset_tag_helper/swf_asset.rb +++ /dev/null @@ -1,61 +0,0 @@ -module ActionView #:nodoc: - - # ActionView::Base.swf_default_options is a hash that - # will be used to specify defaults in priority to the standard - # defaults. - class Base - @@swf_default_options = {} - cattr_accessor :swf_default_options - end - - module Helpers # :nodoc: - module AssetTagHelper - - # Computes the path to an swf asset in the public 'swfs' directory. - # Full paths from the document root will be passed through. - # Used internally by +swf_tag+ to build the swf path. - # - # ==== Examples - # swf_path("example") # => /swfs/example.swf - # swf_path("example.swf") # => /swfs/example.swf - # swf_path("fonts/optima") # => /swfs/fonts/optima.swf - # swf_path("/fonts/optima") # => /fonts/optima.swf - # swf_path("http://www.example.com/game.swf") # => http://www.example.com/game.swf - # - # It takes into account the global setting +asset_host+, like any other asset: - # - # ActionController::Base.asset_host = "http://assets.example.com" - # image_path("logo.jpg") # => http://assets.example.com/images/logo.jpg - # swf_path("fonts/optima") # => http://assets.example.com/swfs/fonts/optima.swf - # - def swf_path(source) - if defined? SwfTag - SwfTag.new(self, @controller, source).public_path - else - compute_public_path(source, SwfAsset::DIRECTORY, SwfAsset::EXTENSION) - end - end - alias_method :path_to_swf, :swf_path # aliased to avoid conflicts with a swf_path named route - - private - module SwfAsset # :nodoc: - DIRECTORY = 'swfs'.freeze - EXTENSION = 'swf'.freeze - - def directory - DIRECTORY - end - - def extension - EXTENSION - end - end - - # AssetTag is available since 2.1.1 (http://github.com/rails/rails/commit/900fd6eca9dd97d2341e89bcb27d7a82d62965bf ) - class SwfTag < AssetTag # :nodoc: - include SwfAsset - end if defined? AssetTag - end - end -end - diff --git a/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/swf_fu_helper.rb b/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/swf_fu_helper.rb deleted file mode 100644 index 3c05807c..00000000 --- a/backup.rails2.3/plugins/swf_fu/lib/action_view/helpers/swf_fu_helper.rb +++ /dev/null @@ -1,197 +0,0 @@ -module ActionView #:nodoc: - module Helpers # :nodoc: - module SwfFuHelper - # Returns a set of tags that display a Flash object within an - # HTML page. - # - # Options: - # * :id - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+ - # * :width, :height - the width & height of the Flash object. Defaults to "100%". These could also specified using :size - # * :size - the size of the Flash object, in the form "400x300". - # * :mode - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?] - # * :flashvars - a Hash of variables that are passed to the swf. Can also be a string like "foo=bar&hello=world" - # * :parameters - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional] - # * :alt - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page. - # * :flash_version - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0") - # * :auto_install - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by swf_fu) - # * :javascript_class - specify a javascript class (e.g. "MyFlash") for your flash object. The initialize method will be called when the flash object is ready. - # * :initialize - arguments to pass to the initialization method of your javascript class. - # * :div_id - the DOM +id+ of the containing div itself. Defaults to "#{option[:id]}"_div - # - def swf_tag(source, options={}, &block) - Generator.new(source, options, self).generate(&block) - end - - # For compatibility with the older FlashObject. - # It modifies the given options before calling +swf_tag+. - # See FLASH_OBJECT.rdoc - def flashobject_tag_for_compatibility(source, options={}) - options = options.reverse_merge( - :auto_install => nil, - :parameters => {:scale => "noscale"}, - :variables => {:lzproxied => false}, - :flash_id => "flashcontent_#{rand(1_100)}", - :background_color => "#ffffff" - ) - { :variables => :flashvars, :flash_id => :id }.each{|from, to| options[to] ||= options.delete(from) } - options[:parameters][:bgcolor] ||= options.delete(:background_color) - swf_tag(source, options) - end - - alias_method :flashobject_tag, :flashobject_tag_for_compatibility unless defined? flashobject_tag - - private - DEFAULTS = { - :width => "100%", - :height => "100%", - :flash_version => 7, - :mode => :dynamic, - :auto_install => "expressInstall", - :alt => <<-"EOS".squeeze(" ").strip.freeze - - Get Adobe Flash player - - EOS - }.freeze - - class Generator # :nodoc: - VALID_MODES = [:static, :dynamic] - def initialize(source, options, view) - @view = view - @source = view.swf_path(source) - options = ActionView::Base.swf_default_options.merge(options) - options.each do |key, value| - options[key] = value.call(source) if value.respond_to?(:call) - end - [:html_options, :parameters, :flashvars].each do |k| - options[k] = convert_to_hash(options[k]).reverse_merge convert_to_hash(ActionView::Base.swf_default_options[k]) - end - options.reverse_merge!(DEFAULTS) - options[:id] ||= source.gsub(/^.*\//, '').gsub(/\.swf$/,'') - options[:id] = force_to_valid_id(options[:id]) - options[:div_id] ||= options[:id]+"_div" - options[:div_id] = force_to_valid_id(options[:div_id]) - options[:width], options[:height] = options[:size].scan(/^(\d*%?)x(\d*%?)$/).first if options[:size] - options[:auto_install] &&= @view.swf_path(options[:auto_install]) - options[:flashvars][:id] ||= options[:id] - @mode = options.delete(:mode) - @options = options - unless VALID_MODES.include? @mode - raise ArgumentError, "options[:mode] should be either #{VALID_MODES.join(' or ')}" - end - end - - def force_to_valid_id(id) - id = id.gsub /[^A-Za-z0-9\-_]/, "_" # HTML id can only contain these characters - id = "swf_" + id unless id =~ /^[A-Z]/i # HTML id must start with alpha - id - end - - def generate(&block) - if block_given? - @options[:alt] = @view.capture(&block) - if Rails::VERSION::STRING >= "3.0" - send(@mode) - elsif Rails::VERSION::STRING < "2.2" - @view.concat(send(@mode), block.binding) - else - @view.concat(send(@mode)) - end - else - send(@mode) - end - end - - private - CONCAT = ActiveSupport.const_defined?(:SafeBuffer) ? :safe_concat : :concat - def convert_to_hash(s) - case s - when Hash - s - when nil - {} - when String - s.split("&").inject({}) do |h, kvp| - key, value = kvp.split("=") - h[key.to_sym] = CGI::unescape(value) - h - end - else - raise ArgumentError, "#{s} should be a Hash, a String or nil" - end - end - - def convert_to_string(h) - h.map do |key_value| - key_value.map{|val| CGI::escape(val.to_s)}.join("=") - end.join("&") - end - - def static - param_list = @options[:parameters].map{|k,v| %() }.join("\n") - param_list += %(\n) unless @options[:flashvars].empty? - html_options = @options[:html_options].map{|k,v| %(#{k}="#{v}")}.join(" ") - r = @view.javascript_tag( - %(swfobject.registerObject("#{@options[:id]}_container", "#{@options[:flash_version]}", #{@options[:auto_install].to_json});) - ) - r.send CONCAT, <<-"EOS".strip -
- - #{param_list} - - - #{param_list} - - #{@options[:alt]} - - - -
- EOS - r << @view.javascript_tag(extend_js) if @options[:javascript_class] - r.send CONCAT, library_check - r - end - - def dynamic - @options[:html_options] = @options[:html_options].merge(:id => @options[:id]) - @options[:parameters] = @options[:parameters].dup # don't modify the original parameters - args = (([@source] + @options.values_at(:div_id,:width,:height,:flash_version)).map(&:to_s) + - @options.values_at(:auto_install,:flashvars,:parameters,:html_options) - ).map(&:to_json).join(",") - preambule = @options[:switch_off_auto_hide_show] ? "swfobject.switchOffAutoHideShow();" : "" - r = @view.javascript_tag(preambule + "swfobject.embedSWF(#{args})") - r.send CONCAT, <<-"EOS".strip -
- #{@options[:alt]} -
- EOS - r << @view.javascript_tag("swfobject.addDomLoadEvent(function(){#{extend_js}})") if @options[:javascript_class] - r.send CONCAT, library_check - r - end - - def extend_js - arglist = case - when @options[:initialize].instance_of?(Array) - @options[:initialize].map(&:to_json).join(",") - when @options.has_key?(:initialize) - @options[:initialize].to_json - else - "" - end - "Object.extend($('#{@options[:id]}'), #{@options[:javascript_class]}.prototype).initialize(#{arglist})" - end - - def library_check - return "" unless 'development' == ENV['RAILS_ENV'] - @view.javascript_tag(<<-"EOS") - if (typeof swfobject == 'undefined') { - document.getElementById('#{@options[:div_id]}').innerHTML = 'Warning: SWFObject.js was not loaded properly. Make sure you <%= javascript_include_tag :defaults %> or <%= javascript_include_tag :swfobject %>'; - } - EOS - end - end #class Generator - end - end -end diff --git a/backup.rails2.3/plugins/swf_fu/test/results.rb b/backup.rails2.3/plugins/swf_fu/test/results.rb deleted file mode 100644 index a7306b0d..00000000 --- a/backup.rails2.3/plugins/swf_fu/test/results.rb +++ /dev/null @@ -1,42 +0,0 @@ -DYNAMIC_RESULT = <<'EOS' -
- -Get Adobe Flash player - -
-EOS - -STATIC_RESULT = <<'EOS' -
- - - - - - - - - -Get Adobe Flash player - - - - -
-EOS \ No newline at end of file diff --git a/backup.rails2.3/plugins/swf_fu/test/swf_fu_test.rb b/backup.rails2.3/plugins/swf_fu/test/swf_fu_test.rb deleted file mode 100644 index 64a2a8bf..00000000 --- a/backup.rails2.3/plugins/swf_fu/test/swf_fu_test.rb +++ /dev/null @@ -1,159 +0,0 @@ -require File.expand_path(File.dirname(__FILE__)+'/test_helper') -require File.expand_path(File.dirname(__FILE__)+'/results') - -class SwfFuTest < ActionView::TestCase - def assert_same_stripped(expect, test) - expect, test = [expect, test].map{|s| s.split("\n").map(&:strip)} - same = expect & test - delta_expect, delta_test = [expect, test].map{|a| a-same} - STDOUT << "\n\n---- Actual result: ----\n" << test.join("\n") << "\n---------\n" unless delta_expect == delta_test - assert_equal delta_expect, delta_test - end - - context "swf_path" do - context "with no special asset host" do - should "deduce the extension" do - assert_equal swf_path("example.swf"), swf_path("example") - assert_starts_with "/swfs/example.swf", swf_path("example.swf") - end - - should "accept relative paths" do - assert_starts_with "/swfs/whatever/example.swf", swf_path("whatever/example.swf") - end - - should "leave full paths alone" do - ["/full/path.swf", "http://www.example.com/whatever.swf"].each do |p| - assert_starts_with p, swf_path(p) - end - end - end - - context "with custom asset host" do - HOST = "http://assets.example.com" - setup do - ActionController::Base.asset_host = HOST - end - - teardown do - ActionController::Base.asset_host = nil - end - - should "take it into account" do - assert_equal "#{HOST}/swfs/whatever.swf", swf_path("whatever") - end - end - end - - context "swf_tag" do - COMPLEX_OPTIONS = { :width => "456", :height => 123, - :flashvars => {:myVar => "value 1 > 2"}.freeze, - :javascript_class => "SomeClass", - :initialize => {:be => "good"}.freeze, - :parameters => {:play => true}.freeze - }.freeze - - should "understand size" do - assert_equal swf_tag("hello", :size => "123x456"), - swf_tag("hello", :width => 123, :height => "456") - end - - should "only accept valid modes" do - assert_raise(ArgumentError) { swf_tag("xyz", :mode => :xyz) } - end - - context "with custom defaults" do - setup do - test = {:flashvars=> {:xyz => "abc", :hello => "world"}.freeze, :mode => :static, :size => "400x300"}.freeze - @expect = swf_tag("test", test) - @expect_with_hello = swf_tag("test", :flashvars => {:xyz => "abc", :hello => "my friend"}, :mode => :static, :size => "400x300") - ActionView::Base.swf_default_options = test - end - - should "respect them" do - assert_equal @expect, swf_tag("test") - end - - should "merge suboptions" do - assert_equal @expect_with_hello, swf_tag("test", :flashvars => {:hello => "my friend"}.freeze) - end - - teardown { ActionView::Base.swf_default_options = {} } - end - - context "with proc options" do - should "call them" do - expect = swf_tag("test", :id => "generated_id_for_test") - assert_equal expect, swf_tag("test", :id => Proc.new{|arg| "generated_id_for_#{arg}"}) - end - - should "call global default's everytime" do - expect1 = swf_tag("test", :id => "call_number_1") - expect2 = swf_tag("test", :id => "call_number_2") - cnt = 0 - ActionView::Base.swf_default_options = { :id => Proc.new{ "call_number_#{cnt+=1}" }} - assert_equal expect1, swf_tag("test") - assert_equal expect2, swf_tag("test") - end - end - - context "with static mode" do - setup { ActionView::Base.swf_default_options = {:mode => :static} } - - should "deal with string flashvars" do - assert_equal swf_tag("hello", :flashvars => "xyz=abc", :mode => :static), - swf_tag("hello", :flashvars => {:xyz => "abc"}, :mode => :static) - end - - should "produce the expected code" do - assert_same_stripped STATIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS.merge(:html_options => {:class => "lots"}.freeze).freeze) - end - - teardown { ActionView::Base.swf_default_options = {} } - end - - context "with dynamic mode" do - should "produce the expected code" do - assert_same_stripped DYNAMIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS) - end - - end - - should "enforce HTML id validity" do - div_result = '
' - assert_match /#{div_result}/, swf_tag("123-456_ok$!+X") - obj_result = '"id":"swf_123-456_ok___X"' - assert_match /#{obj_result}/, swf_tag("123-456_ok$!+X") - end - - should "treat initialize arrays as list of parameters" do - assert_match 'initialize("hello","world")', swf_tag("mySwf", :initialize => ["hello", "world"], :javascript_class => "SomeClass") - end - - if ActiveSupport.const_defined?(:SafeBuffer) - should "be html safe" do - assert swf_tag("test").html_safe? - end - end - end - - context "flashobject_tag" do - should "be the same as swf_tag with different defaults" do - assert_same_stripped swf_tag("mySwf", - :auto_install => nil, - :parameters => {:scale => "noscale", :bgcolor => "#ffffff"}, - :flashvars => {:lzproxied => false}, - :id => "myFlash" - ), flashobject_tag("mySwf", :flash_id => "myFlash") - end - - should "be the same with custom settings" do - assert_same_stripped swf_tag("mySwf", - :auto_install => nil, - :parameters => {:scale => "noborder", :bgcolor => "#ffffff"}, - :flashvars => {:answer_is => 42}, - :id => "myFlash" - ), flashobject_tag("mySwf", :flash_id => "myFlash", :parameters => {:scale => "noborder"}, :variables => {:answer_is => 42}) - end - end -end - diff --git a/backup.rails2.3/plugins/swf_fu/test/test_helper.rb b/backup.rails2.3/plugins/swf_fu/test/test_helper.rb deleted file mode 100644 index 58d113f8..00000000 --- a/backup.rails2.3/plugins/swf_fu/test/test_helper.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'test/unit' -require 'rubygems' -gem 'activesupport', '~> 2.3' -require 'active_support' -gem 'activerecord', '~> 2.3' -require 'active_record' -gem 'actionpack', '~> 2.3' -require 'active_support' -require 'action_view' -require 'action_controller' - -#require File.dirname(__FILE__)+'/../../../../config/environment.rb' -require 'action_view/test_case' -require "action_controller/test_process" -require 'shoulda' -require File.dirname(__FILE__) + '/../init' - -def assert_starts_with(start, what) - assert what.starts_with?(start), "#{what} does not start with #{start}" -end diff --git a/backup.rails2.3/plugins/swf_fu/uninstall.rb b/backup.rails2.3/plugins/swf_fu/uninstall.rb deleted file mode 100644 index bc3c1b57..00000000 --- a/backup.rails2.3/plugins/swf_fu/uninstall.rb +++ /dev/null @@ -1,6 +0,0 @@ -require "fileutils" - -dest = File.dirname(__FILE__) + "/../../../public" -FileUtils.rm "#{dest}/javascripts/swfobject.js" rescue puts "Warning: swfobject.js could not be deleted" -FileUtils.rm "#{dest}/swfs/expressInstall.swf" rescue puts "Warning: expressInstall.swf could not be deleted" -Dir.rmdir "#{dest}/swfs/" rescue "don't worry if directory is not empty" \ No newline at end of file diff --git a/backup.rails2.3/plugins/translate/MIT-LICENSE b/backup.rails2.3/plugins/translate/MIT-LICENSE deleted file mode 100644 index 9376605b..00000000 --- a/backup.rails2.3/plugins/translate/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 [name of plugin creator] - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backup.rails2.3/plugins/translate/README b/backup.rails2.3/plugins/translate/README deleted file mode 100644 index e2732dc9..00000000 --- a/backup.rails2.3/plugins/translate/README +++ /dev/null @@ -1,63 +0,0 @@ -Translate -========= - -This plugin provides a web interface for translating Rails I18n texts (requires Rails 2.2 or higher) from one locale to another. The plugin has been tested only with the simple I18n backend that ships with Rails. I18n texts are read from and written to YAML files under config/locales. - -To translate to a new locale you need to add a YAML file for that locale that contains the locale as the top key and at least one translation. - -Please note that there are certain I18n keys that map to Array objects rather than strings and those are currently not dealt with by the translation UI. This means that Rails built in keys such as date.day_names need to be translated manually directly in the YAML file. - -To get the translation UI to write the YAML files in UTF8 you need to install the ya2yaml gem. - -The translation UI finds all I18n keys by extracting them from I18n lookups in your application source code. In addition it adds all :en and default locale keys from the I18n backend. - -- Updated: Each string in the UI now has an "Auto Translate" link which will send the original text to Google Translate and will input the returned translation into the form field for further clean up and review prior to saving. - - -Rake Tasks -========= - -In addition to the web UI this plugin adds the following rake tasks: - -translate:untranslated -translate:missing -translate:remove_obsolete_keys -translate:merge_keys -translate:google -translate:changed - -The missing task shows you any I18n keys in your code that do not have translations in the YAML file for your default locale, i.e. config/locales/sv.yml. - -The merge_keys task is supposed to be used in conjunction with Sven Fuch's Rails I18n TextMate bundle (http://github.com/svenfuchs/rails-i18n/tree/master). Texts and keys extracted with the TextMate bundle end up in the temporary file log/translations.yml. When you run the merge_keys rake task the keys are moved over to the corresponding I18n locale file, i.e. config/locales/sv.yml. The merge_keys task also checks for overwrites of existing keys by warning you that one of your extracted keys already exists with a different translation. - -The google task is used for auto translating from one locale to another using Google Translate. - -The changed rake task can show you between one YAML file to another which keys have had their texts changed. - -Installation -========= -Obtain the source with: - -./script/plugin install git://github.com/newsdesk/translate.git - -To mount the plugin, add the following to your config/routes.rb file: - -Translate::Routes.translation_ui(map) if RAILS_ENV != "production" - -Now visit /translate in your web browser to start translating. - -Dependencies -========= - -- Rails 2.2 or higher -- The ya2yaml gem if you want your YAML files written in UTF8 encoding. - -Authors -========= - -- Peter Marklund (programming) -- Joakim Westerlund (web design) - -Many thanks to http://newsdesk.se for sponsoring the development of this plugin. - -Copyright (c) 2009 Peter Marklund, released under the MIT license diff --git a/backup.rails2.3/plugins/translate/Rakefile b/backup.rails2.3/plugins/translate/Rakefile deleted file mode 100644 index 7e1954b7..00000000 --- a/backup.rails2.3/plugins/translate/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -require 'rake' -require 'spec/rake/spectask' - -desc 'Default: run specs.' -task :default => :spec - -desc 'Run the specs' -Spec::Rake::SpecTask.new(:spec) do |t| - t.spec_opts = ['--colour --format progress --loadby mtime --reverse'] - t.spec_files = FileList['spec/**/*_spec.rb'] -end diff --git a/backup.rails2.3/plugins/translate/init.rb b/backup.rails2.3/plugins/translate/init.rb deleted file mode 100644 index 18707f83..00000000 --- a/backup.rails2.3/plugins/translate/init.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'translate' - -# TODO: Use new method available_locales once Rails is upgraded, see: -# http://github.com/svenfuchs/i18n/commit/411f8fe7c8f3f89e9b6b921fa62ed66cb92f3af4 -def I18n.valid_locales - I18n.backend.send(:init_translations) unless I18n.backend.initialized? - backend.send(:translations).keys.reject { |locale| locale == :root } -end diff --git a/backup.rails2.3/plugins/translate/lib/translate.rb b/backup.rails2.3/plugins/translate/lib/translate.rb deleted file mode 100644 index 39629bf4..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Translate -end - -require File.join(File.dirname(__FILE__), "translate_controller") -require File.join(File.dirname(__FILE__), "translate_helper") -Dir[File.join(File.dirname(__FILE__), "translate", "*.rb")].each do |file| - require file -end diff --git a/backup.rails2.3/plugins/translate/lib/translate/file.rb b/backup.rails2.3/plugins/translate/lib/translate/file.rb deleted file mode 100644 index c8ae93b0..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate/file.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'fileutils' - -class Translate::File - attr_accessor :path - - def initialize(path) - self.path = path - end - - def write(keys) - FileUtils.mkdir_p File.dirname(path) - File.open(path, "w") do |file| - file.puts keys_to_yaml(Translate::File.deep_stringify_keys(keys)) - end - end - - def read - File.exists?(path) ? YAML::load(IO.read(path)) : {} - end - - # Stringifying keys for prettier YAML - def self.deep_stringify_keys(hash) - hash.inject({}) { |result, (key, value)| - value = deep_stringify_keys(value) if value.is_a? Hash - result[(key.to_s rescue key) || key] = value - result - } - end - - private - def keys_to_yaml(keys) - # Using ya2yaml, if available, for UTF8 support - keys.respond_to?(:ya2yaml) ? keys.ya2yaml(:escape_as_utf8 => true) : keys.to_yaml - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate/keys.rb b/backup.rails2.3/plugins/translate/lib/translate/keys.rb deleted file mode 100644 index 3bee3c41..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate/keys.rb +++ /dev/null @@ -1,152 +0,0 @@ -require 'pathname' - -class Translate::Keys - # Allows keys extracted from lookups in files to be cached - def self.files - @@files ||= Translate::Keys.new.files - end - - # Allows flushing of the files cache - def self.files=(files) - @@files = files - end - - def files - @files ||= extract_files - end - alias_method :to_hash, :files - - def keys - files.keys - end - alias_method :to_a, :keys - - def i18n_keys(locale) - I18n.backend.send(:init_translations) unless I18n.backend.initialized? - Translate::Keys.to_shallow_hash(I18n.backend.send(:translations)[locale.to_sym]).keys.sort - end - - def untranslated_keys - Translate::Keys.translated_locales.inject({}) do |missing, locale| - missing[locale] = i18n_keys(I18n.default_locale).map do |key| - I18n.backend.send(:lookup, locale, key).nil? ? key : nil - end.compact - missing - end - end - - def missing_keys - locale = I18n.default_locale; yaml_keys = {} - yaml_keys = Translate::Storage.file_paths(locale).inject({}) do |keys, path| - keys = keys.deep_merge(Translate::File.new(path).read[locale.to_s]) - end - files.reject { |key, file| self.class.contains_key?(yaml_keys, key) } - end - - def self.translated_locales - I18n.available_locales.reject { |locale| [:root, I18n.default_locale.to_sym].include?(locale) } - end - - # Checks if a nested hash contains the keys in dot separated I18n key. - # - # Example: - # - # hash = { - # :foo => { - # :bar => { - # :baz => 1 - # } - # } - # } - # - # contains_key?("foo", key) # => true - # contains_key?("foo.bar", key) # => true - # contains_key?("foo.bar.baz", key) # => true - # contains_key?("foo.bar.baz.bla", key) # => false - # - def self.contains_key?(hash, key) - keys = key.to_s.split(".") - return false if keys.empty? - !keys.inject(HashWithIndifferentAccess.new(hash)) do |memo, key| - memo.is_a?(Hash) ? memo.try(:[], key) : nil - end.nil? - end - - # Convert something like: - # - # { - # :pressrelease => { - # :label => { - # :one => "Pressmeddelande" - # } - # } - # } - # - # to: - # - # {'pressrelease.label.one' => "Pressmeddelande"} - # - def self.to_shallow_hash(hash) - hash.inject({}) do |shallow_hash, (key, value)| - if value.is_a?(Hash) - to_shallow_hash(value).each do |sub_key, sub_value| - shallow_hash[[key, sub_key].join(".")] = sub_value - end - else - shallow_hash[key.to_s] = value - end - shallow_hash - end - end - - # Convert something like: - # - # {'pressrelease.label.one' => "Pressmeddelande"} - # - # to: - # - # { - # :pressrelease => { - # :label => { - # :one => "Pressmeddelande" - # } - # } - # } - def self.to_deep_hash(hash) - hash.inject({}) do |deep_hash, (key, value)| - keys = key.to_s.split('.').reverse - leaf_key = keys.shift - key_hash = keys.inject({leaf_key.to_sym => value}) { |hash, key| {key.to_sym => hash} } - deep_merge!(deep_hash, key_hash) - deep_hash - end - end - - # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 - def self.deep_merge!(hash1, hash2) - merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } - hash1.merge!(hash2, &merger) - end - - private - - def extract_files - files_to_scan.inject(HashWithIndifferentAccess.new) do |files, file| - IO.read(file).scan(i18n_lookup_pattern).flatten.map(&:to_sym).each do |key| - files[key] ||= [] - path = Pathname.new(File.expand_path(file)).relative_path_from(Pathname.new(Rails.root)).to_s - files[key] << path if !files[key].include?(path) - end - files - end - end - - def i18n_lookup_pattern - /\b(?:I18n\.t|I18n\.translate|t)(?:\s|\():?'([a-z0-9_]+.[a-z0-9_.]+)'\)?/ - end - - def files_to_scan - Dir.glob(File.join(Translate::Storage.root_dir, "{app,config,lib}", "**","*.{rb,erb,rhtml}")) + - Dir.glob(File.join(Translate::Storage.root_dir, "public", "javascripts", "**","*.js")) - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate/log.rb b/backup.rails2.3/plugins/translate/lib/translate/log.rb deleted file mode 100644 index 9b5b3148..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate/log.rb +++ /dev/null @@ -1,35 +0,0 @@ -class Translate::Log - attr_accessor :from_locale, :to_locale, :keys - - def initialize(from_locale, to_locale, keys) - self.from_locale = from_locale - self.to_locale = to_locale - self.keys = keys - end - - def write_to_file - current_texts = File.exists?(file_path) ? file.read : {} - current_texts.merge!(from_texts) - file.write(current_texts) - end - - def read - file.read - end - - private - def file - @file ||= Translate::File.new(file_path) - end - - def from_texts - Translate::File.deep_stringify_keys(Translate::Keys.to_deep_hash(keys.inject({}) do |hash, key| - hash[key] = I18n.backend.send(:lookup, from_locale, key) - hash - end)) - end - - def file_path - File.join(Rails.root, "config", "locales", "log", "from_#{from_locale}_to_#{to_locale}.yml") - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate/routes.rb b/backup.rails2.3/plugins/translate/lib/translate/routes.rb deleted file mode 100644 index 8d02c869..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate/routes.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Translate - class Routes - def self.translation_ui(map) - map.with_options(:controller => 'translate') do |t| - t.translate_list 'translate' - t.translate 'translate/translate', :action => 'translate' - t.translate_reload 'translate/reload', :action => 'reload' - end - end - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate/storage.rb b/backup.rails2.3/plugins/translate/lib/translate/storage.rb deleted file mode 100644 index 2b9a3858..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate/storage.rb +++ /dev/null @@ -1,28 +0,0 @@ -class Translate::Storage - attr_accessor :locale - - def initialize(locale) - self.locale = locale.to_sym - end - - def write_to_file - Translate::File.new(file_path).write(keys) - end - - def self.file_paths(locale) - Dir.glob(File.join(root_dir, "config", "locales", "**","#{locale}.yml")) - end - - def self.root_dir - Rails.root - end - - private - def keys - {locale => I18n.backend.send(:translations)[locale]} - end - - def file_path - File.join(Translate::Storage.root_dir, "config", "locales", "#{locale}.yml") - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate_controller.rb b/backup.rails2.3/plugins/translate/lib/translate_controller.rb deleted file mode 100644 index d06e171e..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate_controller.rb +++ /dev/null @@ -1,165 +0,0 @@ -class TranslateController < ActionController::Base - # It seems users with active_record_store may get a "no :secret given" error if we don't disable csrf protection, - skip_before_filter :verify_authenticity_token - - prepend_view_path(File.join(File.dirname(__FILE__), "..", "views")) - layout 'translate' - - before_filter :init_translations - before_filter :set_locale - - def index - initialize_keys - filter_by_key_pattern - filter_by_text_pattern - filter_by_translated_or_changed - sort_keys - paginate_keys - @total_entries = @keys.size - end - - def translate - I18n.backend.store_translations(@to_locale, Translate::Keys.to_deep_hash(params[:key])) - Translate::Storage.new(@to_locale).write_to_file - Translate::Log.new(@from_locale, @to_locale, params[:key].keys).write_to_file - force_init_translations # Force reload from YAML file - flash[:notice] = "Translations stored" - redirect_to params.slice(:filter, :sort_by, :key_type, :key_pattern, :text_type, :text_pattern).merge({:action => :index}) - end - - def reload - Translate::Keys.files = nil - redirect_to :action => 'index' - end - - private - def initialize_keys - @files = Translate::Keys.files - @keys = (@files.keys.map(&:to_s) + Translate::Keys.new.i18n_keys(@from_locale)).uniq - @keys.reject! do |key| - from_text = lookup(@from_locale, key) - # When translating from one language to another, make sure there is a text to translate from. - # Always exclude non string translation objects as we don't support editing them in the UI. - (@from_locale != @to_locale && !from_text.present?) || (from_text.present? && !from_text.is_a?(String)) - end - end - - def lookup(locale, key) - I18n.backend.send(:lookup, locale, key) - end - helper_method :lookup - - def filter_by_translated_or_changed - params[:filter] ||= 'all' - return if params[:filter] == 'all' - @keys.reject! do |key| - case params[:filter] - when 'untranslated' - lookup(@to_locale, key).present? - when 'translated' - lookup(@to_locale, key).blank? - when 'changed' - old_from_text(key).blank? || lookup(@from_locale, key) == old_from_text(key) - else - raise "Unknown filter '#{params[:filter]}'" - end - end - end - - def filter_by_key_pattern - return if params[:key_pattern].blank? - @keys.reject! do |key| - case params[:key_type] - when "starts_with" - !key.starts_with?(params[:key_pattern]) - when "contains" - key.index(params[:key_pattern]).nil? - else - raise "Unknown key_type '#{params[:key_type]}'" - end - end - end - - def filter_by_text_pattern - return if params[:text_pattern].blank? - @keys.reject! do |key| - case params[:text_type] - when 'contains' - !lookup(@from_locale, key).present? || !lookup(@from_locale, key).to_s.downcase.index(params[:text_pattern].downcase) - when 'equals' - !lookup(@from_locale, key).present? || lookup(@from_locale, key).to_s.downcase != params[:text_pattern].downcase - else - raise "Unknown text_type '#{params[:text_type]}'" - end - end - end - - def sort_keys - params[:sort_by] ||= "key" - case params[:sort_by] - when "key" - @keys.sort! - when "text" - @keys.sort! do |key1, key2| - if lookup(@from_locale, key1).present? && lookup(@from_locale, key2).present? - lookup(@from_locale, key1).to_s.downcase <=> lookup(@from_locale, key2).to_s.downcase - elsif lookup(@from_locale, key1).present? - -1 - else - 1 - end - end - else - raise "Unknown sort_by '#{params[:sort_by]}'" - end - end - - def paginate_keys - params[:page] ||= 1 - @paginated_keys = @keys[offset, per_page] - end - - def offset - (params[:page].to_i - 1) * per_page - end - - def per_page - 50 - end - helper_method :per_page - - def init_translations - I18n.backend.send(:init_translations) unless I18n.backend.initialized? - end - - def force_init_translations - I18n.backend.send(:init_translations) - end - - def default_locale - I18n.default_locale - end - - def set_locale - session[:from_locale] ||= default_locale - session[:to_locale] ||= :en - session[:from_locale] = params[:from_locale] if params[:from_locale].present? - session[:to_locale] = params[:to_locale] if params[:to_locale].present? - @from_locale = session[:from_locale].to_sym - @to_locale = session[:to_locale].to_sym - end - - def old_from_text(key) - return @old_from_text[key] if @old_from_text && @old_from_text[key] - @old_from_text = {} - text = key.split(".").inject(log_hash) do |hash, k| - hash ? hash[k] : nil - end - @old_from_text[key] = text - end - helper_method :old_from_text - - def log_hash - @log_hash ||= Translate::Log.new(@from_locale, @to_locale, {}).read - end -end diff --git a/backup.rails2.3/plugins/translate/lib/translate_helper.rb b/backup.rails2.3/plugins/translate/lib/translate_helper.rb deleted file mode 100644 index cb4c400f..00000000 --- a/backup.rails2.3/plugins/translate/lib/translate_helper.rb +++ /dev/null @@ -1,45 +0,0 @@ -module TranslateHelper - def simple_filter(labels, param_name = 'filter', selected_value = nil) - selected_value ||= params[param_name] - filter = [] - labels.each do |item| - if item.is_a?(Array) - type, label = item - else - type = label = item - end - if type.to_s == selected_value.to_s - filter << "#{label}" - else - link_params = params.merge({param_name.to_s => type}) - link_params.merge!({"page" => nil}) if param_name.to_s != "page" - filter << link_to(label, link_params) - end - end - filter.join(" | ") - end - - def n_lines(text, line_size) - n_lines = 1 - if text.present? - n_lines = text.split("\n").size - if n_lines == 1 && text.length > line_size - n_lines = text.length / line_size + 1 - end - end - n_lines - end - - def translate_javascript_includes - sources = [] - if File.exists?(File.join(Rails.root, "public", "javascripts", "prototype.js")) - sources << "/javascripts/prototype.js" - else - sources << "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js" - end - sources << "http://www.google.com/jsapi" - sources.map do |src| - %Q{} - end.join("\n") - end -end diff --git a/backup.rails2.3/plugins/translate/spec/controllers/translate_controller_spec.rb b/backup.rails2.3/plugins/translate/spec/controllers/translate_controller_spec.rb deleted file mode 100644 index e384811b..00000000 --- a/backup.rails2.3/plugins/translate/spec/controllers/translate_controller_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') - -describe TranslateController do - describe "index" do - before(:each) do - controller.stub!(:per_page).and_return(1) - I18n.backend.stub!(:translations).and_return(i18n_translations) - I18n.backend.instance_eval { @initialized = true } - keys = mock(:keys) - keys.stub!(:i18n_keys).and_return(['vendor.foobar']) - Translate::Keys.should_receive(:new).and_return(keys) - Translate::Keys.should_receive(:files).and_return(files) - I18n.stub!(:valid_locales).and_return([:en, :sv]) - I18n.stub!(:default_locale).and_return(:sv) - end - - it "shows sorted paginated keys from the translate from locale and extracted keys by default" do - get_page :index - assigns(:from_locale).should == :sv - assigns(:to_locale).should == :en - assigns(:files).should == files - assigns(:keys).sort.should == ['articles.new.page_title', 'home.page_title', 'vendor.foobar'] - assigns(:paginated_keys).should == ['articles.new.page_title'] - end - - it "can be paginated with the page param" do - get_page :index, :page => 2 - assigns(:files).should == files - assigns(:paginated_keys).should == ['home.page_title'] - end - - it "accepts a key_pattern param with key_type=starts_with" do - get_page :index, :key_pattern => 'articles', :key_type => 'starts_with' - assigns(:files).should == files - assigns(:paginated_keys).should == ['articles.new.page_title'] - assigns(:total_entries).should == 1 - end - - it "accepts a key_pattern param with key_type=contains" do - get_page :index, :key_pattern => 'page_', :key_type => 'contains' - assigns(:files).should == files - assigns(:total_entries).should == 2 - assigns(:paginated_keys).should == ['articles.new.page_title'] - end - - it "accepts a filter=untranslated param" do - get_page :index, :filter => 'untranslated' - assigns(:total_entries).should == 2 - assigns(:paginated_keys).should == ['articles.new.page_title'] - end - - it "accepts a filter=translated param" do - get_page :index, :filter => 'translated' - assigns(:total_entries).should == 1 - assigns(:paginated_keys).should == ['vendor.foobar'] - end - - it "accepts a filter=changed param" do - log = mock(:log) - old_translations = {:home => {:page_title => "Skapar ny artikel"}} - log.should_receive(:read).and_return(Translate::File.deep_stringify_keys(old_translations)) - Translate::Log.should_receive(:new).with(:sv, :en, {}).and_return(log) - get_page :index, :filter => 'changed' - assigns(:total_entries).should == 1 - assigns(:keys).should == ["home.page_title"] - end - - def i18n_translations - HashWithIndifferentAccess.new({ - :en => { - :vendor => { - :foobar => "Foo Baar" - } - }, - :sv => { - :articles => { - :new => { - :page_title => "Skapa ny artikel" - } - }, - :home => { - :page_title => "Välkommen till I18n" - }, - :vendor => { - :foobar => "Fobar" - } - } - }) - end - - def files - HashWithIndifferentAccess.new({ - :'home.page_title' => ["app/views/home/index.rhtml"], - :'general.back' => ["app/views/articles/new.rhtml", "app/views/categories/new.rhtml"], - :'articles.new.page_title' => ["app/views/articles/new.rhtml"] - }) - end - end - - describe "translate" do - it "should store translations to I18n backend and then write them to a YAML file" do - session[:from_locale] = :sv - session[:to_locale] = :en - translations = { - :articles => { - :new => { - :title => "New Article" - } - }, - :category => "Category" - } - key_param = {'articles.new.title' => "New Article", "category" => "Category"} - I18n.backend.should_receive(:store_translations).with(:en, translations) - storage = mock(:storage) - storage.should_receive(:write_to_file) - Translate::Storage.should_receive(:new).with(:en).and_return(storage) - log = mock(:log) - log.should_receive(:write_to_file) - Translate::Log.should_receive(:new).with(:sv, :en, key_param.keys).and_return(log) - post :translate, "key" => key_param - response.should be_redirect - end - end - - def get_page(*args) - get(*args) - response.should be_success - end -end diff --git a/backup.rails2.3/plugins/translate/spec/file_spec.rb b/backup.rails2.3/plugins/translate/spec/file_spec.rb deleted file mode 100644 index 5f94f5a9..00000000 --- a/backup.rails2.3/plugins/translate/spec/file_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'fileutils' -require File.dirname(__FILE__) + '/spec_helper' - -describe Translate::File do - describe "write" do - before(:each) do - @file = Translate::File.new(file_path) - end - - after(:each) do - FileUtils.rm(file_path) - end - - it "writes all I18n messages for a locale to YAML file" do - @file.write(translations) - @file.read.should == Translate::File.deep_stringify_keys(translations) - end - - def translations - { - :en => { - :article => { - :title => "One Article" - }, - :category => "Category" - } - } - end - end - - describe "deep_stringify_keys" do - it "should convert all keys in a hash to strings" do - Translate::File.deep_stringify_keys({ - :en => { - :article => { - :title => "One Article" - }, - :category => "Category" - } - }).should == { - "en" => { - "article" => { - "title" => "One Article" - }, - "category" => "Category" - } - } - end - end - - def file_path - File.join(File.dirname(__FILE__), "files", "en.yml") - end -end diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/app/models/article.rb b/backup.rails2.3/plugins/translate/spec/files/translate/app/models/article.rb deleted file mode 100644 index d151e316..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/app/models/article.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Article < ActiveRecord::Base - def validate - # t('li') - errors.add_to_base([t(:'article.key1') + "#{t('article.key2')}"]) - I18n.t 'article.key3' - I18n.t 'article.key3' - I18n.t :'article.key4' - I18n.translate :'article.key5' - 'bla bla t' + "blubba bla" + ' foobar' - 'bla bla t ' + "blubba bla" + ' foobar' - end -end diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.erb b/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.erb deleted file mode 100644 index 2146f874..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t(:'category_erb.key1') %> diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html b/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html deleted file mode 100644 index 0947d174..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html +++ /dev/null @@ -1 +0,0 @@ -t(:'category_html.key1') diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html.erb b/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html.erb deleted file mode 100644 index a226ccff..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t(:'category_html_erb.key1') %> diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.rhtml b/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.rhtml deleted file mode 100644 index 235e5173..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/app/views/category.rhtml +++ /dev/null @@ -1,5 +0,0 @@ - - -<%= t(:'category_rhtml.key1') %> diff --git a/backup.rails2.3/plugins/translate/spec/files/translate/public/javascripts/application.js b/backup.rails2.3/plugins/translate/spec/files/translate/public/javascripts/application.js deleted file mode 100644 index a673ca02..00000000 --- a/backup.rails2.3/plugins/translate/spec/files/translate/public/javascripts/application.js +++ /dev/null @@ -1 +0,0 @@ -I18n.t('js.alert') \ No newline at end of file diff --git a/backup.rails2.3/plugins/translate/spec/keys_spec.rb b/backup.rails2.3/plugins/translate/spec/keys_spec.rb deleted file mode 100644 index 3b0bd629..00000000 --- a/backup.rails2.3/plugins/translate/spec/keys_spec.rb +++ /dev/null @@ -1,179 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require 'fileutils' - -describe Translate::Keys do - before(:each) do - I18n.stub!(:default_locale).and_return(:en) - @keys = Translate::Keys.new - Translate::Storage.stub!(:root_dir).and_return(i18n_files_dir) - end - - describe "to_a" do - it "extracts keys from I18n lookups in .rb, .html.erb, and .rhtml files" do - @keys.to_a.map(&:to_s).sort.should == ['article.key1', 'article.key2', 'article.key3', 'article.key4', 'article.key5', - 'category_erb.key1', 'category_html_erb.key1', 'category_rhtml.key1', 'js.alert'] - end - end - - describe "to_hash" do - it "return a hash with I18n keys and file lists" do - @keys.to_hash[:'article.key3'].should == ["vendor/plugins/translate/spec/files/translate/app/models/article.rb"] - end - end - - describe "i18n_keys" do - before(:each) do - I18n.backend.send(:init_translations) unless I18n.backend.initialized? - end - - it "should return all keys in the I18n backend translations hash" do - I18n.backend.should_receive(:translations).and_return(translations) - @keys.i18n_keys(:en).should == ['articles.new.page_title', 'categories.flash.created', 'empty', 'home.about'] - end - - describe "untranslated_keys" do - before(:each) do - I18n.backend.stub!(:translations).and_return(translations) - end - - it "should return a hash with keys with missing translations in each locale" do - @keys.untranslated_keys.should == { - :sv => ['articles.new.page_title', 'categories.flash.created', 'empty'] - } - end - end - - describe "missing_keys" do - before(:each) do - @file_path = File.join(i18n_files_dir, "config", "locales", "en.yml") - Translate::File.new(@file_path).write({ - :en => { - :home => { - :page_title => false, - :intro => { - :one => "intro one", - :other => "intro other" - } - } - } - }) - end - - after(:each) do - FileUtils.rm(@file_path) - end - - it "should return a hash with keys that are not in the locale file" do - @keys.stub!(:files).and_return({ - :'home.page_title' => "app/views/home/index.rhtml", - :'home.intro' => 'app/views/home/index.rhtml', - :'home.signup' => "app/views/home/_signup.rhtml", - :'about.index.page_title' => "app/views/about/index.rhtml" - }) - @keys.missing_keys.should == { - :'home.signup' => "app/views/home/_signup.rhtml", - :'about.index.page_title' => "app/views/about/index.rhtml" - } - end - end - - describe "contains_key?" do - it "works" do - hash = { - :foo => { - :bar => { - :baz => false - } - } - } - Translate::Keys.contains_key?(hash, "").should be_false - Translate::Keys.contains_key?(hash, "foo").should be_true - Translate::Keys.contains_key?(hash, "foo.bar").should be_true - Translate::Keys.contains_key?(hash, "foo.bar.baz").should be_true - Translate::Keys.contains_key?(hash, :"foo.bar.baz").should be_true - Translate::Keys.contains_key?(hash, "foo.bar.baz.bla").should be_false - end - end - - describe "translated_locales" do - before(:each) do - I18n.stub!(:default_locale).and_return(:en) - I18n.stub!(:available_locales).and_return([:sv, :no, :en, :root]) - end - - it "returns all avaiable except :root and the default" do - Translate::Keys.translated_locales.should == [:sv, :no] - end - end - - describe "to_deep_hash" do - it "convert shallow hash with dot separated keys to deep hash" do - Translate::Keys.to_deep_hash(shallow_hash).should == deep_hash - end - end - - describe "to_shallow_hash" do - it "converts a deep hash to a shallow one" do - Translate::Keys.to_shallow_hash(deep_hash).should == shallow_hash - end - end - - ########################################################################## - # - # Helper Methods - # - ########################################################################## - - def translations - { - :en => { - :home => { - :about => "This site is about making money" - }, - :articles => { - :new => { - :page_title => "New Article" - } - }, - :categories => { - :flash => { - :created => "Category created" - } - }, - :empty => nil - }, - :sv => { - :home => { - :about => false - } - } - } - end - end - - def shallow_hash - { - 'pressrelease.label.one' => "Pressmeddelande", - 'pressrelease.label.other' => "Pressmeddelanden", - 'article' => "Artikel", - 'category' => '' - } - end - - def deep_hash - { - :pressrelease => { - :label => { - :one => "Pressmeddelande", - :other => "Pressmeddelanden" - } - }, - :article => "Artikel", - :category => '' - } - end - - def i18n_files_dir - File.join(ENV['PWD'], "spec", "files", "translate") - end -end diff --git a/backup.rails2.3/plugins/translate/spec/log_spec.rb b/backup.rails2.3/plugins/translate/spec/log_spec.rb deleted file mode 100644 index 7dc9f542..00000000 --- a/backup.rails2.3/plugins/translate/spec/log_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'fileutils' -require File.dirname(__FILE__) + '/spec_helper' - -describe Translate::Log do - describe "write_to_file" do - before(:each) do - I18n.locale = :sv - I18n.backend.store_translations(:sv, from_texts) - keys = Translate::Keys.new - @log = Translate::Log.new(:sv, :en, Translate::Keys.to_shallow_hash(from_texts).keys) - @log.stub!(:file_path).and_return(file_path) - FileUtils.rm_f file_path - end - - after(:each) do - FileUtils.rm_f file_path - end - - it "writes new log file with from texts" do - File.exists?(file_path).should be_false - @log.write_to_file - File.exists?(file_path).should be_true - Translate::File.new(file_path).read.should == Translate::File.deep_stringify_keys(from_texts) - end - - it "merges from texts with current texts in log file and re-writes the log file" do - @log.write_to_file - I18n.backend.store_translations(:sv, {:category => "Kategori ny"}) - @log.keys = ['category'] - @log.write_to_file - Translate::File.new(file_path).read['category'].should == "Kategori ny" - end - - def file_path - File.join(File.dirname(__FILE__), "files", "from_sv_to_en.yml") - end - - def from_texts - { - :article => { - :title => "En artikel" - }, - :category => "Kategori" - } - end - end -end diff --git a/backup.rails2.3/plugins/translate/spec/spec_helper.rb b/backup.rails2.3/plugins/translate/spec/spec_helper.rb deleted file mode 100644 index 5a919082..00000000 --- a/backup.rails2.3/plugins/translate/spec/spec_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -begin - # Using PWD here instead of File.dirname(__FILE__) to be able to symlink to plugin - # from within a Rails app. - require File.expand_path(ENV['PWD'] + '/../../../spec/spec_helper') -rescue LoadError => e - puts "You need to install rspec in your base app\n#{e.message}: #{e.backtrace.join("\n")}" - exit -end - -plugin_spec_dir = File.dirname(__FILE__) -ActiveRecord::Base.logger = Logger.new(plugin_spec_dir + "/debug.log") diff --git a/backup.rails2.3/plugins/translate/spec/storage_spec.rb b/backup.rails2.3/plugins/translate/spec/storage_spec.rb deleted file mode 100644 index e6110c3d..00000000 --- a/backup.rails2.3/plugins/translate/spec/storage_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe Translate::Storage do - describe "write_to_file" do - before(:each) do - @storage = Translate::Storage.new(:en) - end - - it "writes all I18n messages for a locale to YAML file" do - I18n.backend.should_receive(:translations).and_return(translations) - @storage.stub!(:file_path).and_return(file_path) - file = mock(:file) - file.should_receive(:write).with(translations) - Translate::File.should_receive(:new).with(file_path).and_return(file) - @storage.write_to_file - end - - def file_path - File.join(File.dirname(__FILE__), "files", "en.yml") - end - - def translations - { - :en => { - :article => { - :title => "One Article" - }, - :category => "Category" - } - } - end - end -end diff --git a/backup.rails2.3/plugins/translate/tasks/translate.rake b/backup.rails2.3/plugins/translate/tasks/translate.rake deleted file mode 100644 index a70b934c..00000000 --- a/backup.rails2.3/plugins/translate/tasks/translate.rake +++ /dev/null @@ -1,178 +0,0 @@ -require 'yaml' - -class Hash - def deep_merge(other) - # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 - merger = proc { |key, v1, v2| (Hash === v1 && Hash === v2) ? v1.merge(v2, &merger) : v2 } - merge(other, &merger) - end - - def set(keys, value) - key = keys.shift - if keys.empty? - self[key] = value - else - self[key] ||= {} - self[key].set keys, value - end - end - - if ENV['SORT'] - # copy of ruby's to_yaml method, prepending sort. - # before each so we get an ordered yaml file - def to_yaml( opts = {} ) - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, to_yaml_style ) do |map| - sort.each do |k, v| #<- Adding sort. - map.add( k, v ) - end - end - end - end - end -end - -namespace :translate do - desc "Show untranslated keys for locale LOCALE" - task :untranslated => :environment do - from_locale = I18n.default_locale - untranslated = Translate::Keys.new.untranslated_keys - - messages = [] - untranslated.each do |locale, keys| - keys.each do |key| - from_text = I18n.backend.send(:lookup, from_locale, key) - messages << "#{locale}.#{key} (#{from_locale}.#{key}='#{from_text}')" - end - end - - if messages.present? - messages.each { |m| puts m } - else - puts "No untranslated keys" - end - end - - desc "Show I18n keys that are missing in the config/locales/default_locale.yml YAML file" - task :missing => :environment do - missing = Translate::Keys.new.missing_keys.inject([]) do |keys, (key, filename)| - keys << "#{key} in \t #{filename} is missing" - end - puts missing.present? ? missing.join("\n") : "No missing translations in the default locale file" - end - - desc "Remove all translation texts that are no longer present in the locale they were translated from" - task :remove_obsolete_keys => :environment do - I18n.backend.send(:init_translations) - master_locale = ENV['LOCALE'] || I18n.default_locale - Translate::Keys.translated_locales.each do |locale| - texts = {} - Translate::Keys.new.i18n_keys(locale).each do |key| - if I18n.backend.send(:lookup, master_locale, key).to_s.present? - texts[key] = I18n.backend.send(:lookup, locale, key) - end - end - I18n.backend.send(:translations)[locale] = nil # Clear out all current translations - I18n.backend.store_translations(locale, Translate::Keys.to_deep_hash(texts)) - Translate::Storage.new(locale).write_to_file - end - end - - desc "Merge I18n keys from log/translations.yml into config/locales/*.yml (for use with the Rails I18n TextMate bundle)" - task :merge_keys => :environment do - I18n.backend.send(:init_translations) - new_translations = YAML::load(IO.read(File.join(Rails.root, "log", "translations.yml"))) - raise("Can only merge in translations in single locale") if new_translations.keys.size > 1 - locale = new_translations.keys.first - - overwrites = false - Translate::Keys.to_shallow_hash(new_translations[locale]).keys.each do |key| - new_text = key.split(".").inject(new_translations[locale]) { |hash, sub_key| hash[sub_key] } - existing_text = I18n.backend.send(:lookup, locale.to_sym, key) - if existing_text && new_text != existing_text - puts "ERROR: key #{key} already exists with text '#{existing_text.inspect}' and would be overwritten by new text '#{new_text}'. " + - "Set environment variable OVERWRITE=1 if you really want to do this." - overwrites = true - end - end - - if !overwrites || ENV['OVERWRITE'] - I18n.backend.store_translations(locale, new_translations[locale]) - Translate::Storage.new(locale).write_to_file - end - end - - desc "Apply Google translate to auto translate all texts in locale ENV['FROM'] to locale ENV['TO']" - task :google => :environment do - raise "Please specify FROM and TO locales as environment variables" if ENV['FROM'].blank? || ENV['TO'].blank? - - # Depends on httparty gem - # http://www.robbyonrails.com/articles/2009/03/16/httparty-goes-foreign - class GoogleApi - include HTTParty - base_uri 'ajax.googleapis.com' - def self.translate(string, to, from) - tries = 0 - begin - get("/ajax/services/language/translate", - :query => {:langpair => "#{from}|#{to}", :q => string, :v => 1.0}, - :format => :json) - rescue - tries += 1 - puts("SLEEPING - retrying in 5...") - sleep(5) - retry if tries < 10 - end - end - end - - I18n.backend.send(:init_translations) - - start_at = Time.now - translations = {} - Translate::Keys.new.i18n_keys(ENV['FROM']).each do |key| - from_text = I18n.backend.send(:lookup, ENV['FROM'], key).to_s - to_text = I18n.backend.send(:lookup, ENV['TO'], key) - if !from_text.blank? && to_text.blank? - print "#{key}: '#{from_text[0, 40]}' => " - if !translations[from_text] - response = GoogleApi.translate(from_text, ENV['TO'], ENV['FROM']) - translations[from_text] = response["responseData"] && response["responseData"]["translatedText"] - end - if !(translation = translations[from_text]).blank? - translation.gsub!(/\(\(([a-z_.]+)\)\)/i, '{{\1}}') - # Google translate sometimes replaces {{foobar}} with (()) foobar. We skip these - if translation !~ /\(\(\)\)/ - puts "'#{translation[0, 40]}'" - I18n.backend.store_translations(ENV['TO'].to_sym, Translate::Keys.to_deep_hash({key => translation})) - else - puts "SKIPPING since interpolations were messed up: '#{translation[0,40]}'" - end - else - puts "NO TRANSLATION - #{response.inspect}" - end - end - end - - puts "\nTime elapsed: #{(((Time.now - start_at) / 60) * 10).to_i / 10.to_f} minutes" - Translate::Storage.new(ENV['TO'].to_sym).write_to_file - end - - desc "List keys that have changed I18n texts between YAML file ENV['FROM_FILE'] and YAML file ENV['TO_FILE']. Set ENV['VERBOSE'] to see changes" - task :changed => :environment do - from_hash = Translate::Keys.to_shallow_hash(Translate::File.new(ENV['FROM_FILE']).read) - to_hash = Translate::Keys.to_shallow_hash(Translate::File.new(ENV['TO_FILE']).read) - from_hash.each do |key, from_value| - if (to_value = to_hash[key]) && to_value != from_value - key_without_locale = key[/^[^.]+\.(.+)$/, 1] - if ENV['VERBOSE'] - puts "KEY: #{key_without_locale}" - puts "FROM VALUE: '#{from_value}'" - puts "TO VALUE: '#{to_value}'" - else - puts key_without_locale - end - end - end - end -end diff --git a/backup.rails2.3/plugins/translate/views/layouts/translate.rhtml b/backup.rails2.3/plugins/translate/views/layouts/translate.rhtml deleted file mode 100644 index 58dbc5c3..00000000 --- a/backup.rails2.3/plugins/translate/views/layouts/translate.rhtml +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - <%= h(@page_title) %> - - <%= translate_javascript_includes %> - - - - - - - -
- <% if @page_title -%>

<%=h @page_title %>

<% end -%> - <% [:notice, :error].each do |message| %> - <%if flash[message] %> -
- <%= h(flash[message]) if flash[message] %> -
- <% end %> - <% end %> - <%= yield %> -
- - diff --git a/backup.rails2.3/plugins/translate/views/translate/_pagination.rhtml b/backup.rails2.3/plugins/translate/views/translate/_pagination.rhtml deleted file mode 100644 index 64f4d690..00000000 --- a/backup.rails2.3/plugins/translate/views/translate/_pagination.rhtml +++ /dev/null @@ -1,24 +0,0 @@ -<% - # Expects locals: - # - # total_entries - # per_page - - n_pages = total_entries/per_page + (total_entries % per_page > 0 ? 1 : 0) - current_page = (params[:page] || 1).to_i -%> - -<% if n_pages > 1 %> -

Pages:

-
-
    - <% (1..n_pages).each do |page_number| %> - <% if current_page == page_number %> -
  • <%= link_to(page_number, params.merge(:page => page_number), :title => "Page #{page_number}" ) %>
  • - <% else %> -
  • <%= link_to(page_number, params.merge(:page => page_number), :title => "Page #{page_number}") %>
  • - <% end %> - <% end %> -
-
-<% end %> \ No newline at end of file diff --git a/backup.rails2.3/plugins/translate/views/translate/index.rhtml b/backup.rails2.3/plugins/translate/views/translate/index.rhtml deleted file mode 100644 index a057659d..00000000 --- a/backup.rails2.3/plugins/translate/views/translate/index.rhtml +++ /dev/null @@ -1,114 +0,0 @@ -<% - @page_title = "Translate" - show_filters = ["all", "untranslated", "translated"] - show_filters << "changed" if @from_locale != @to_locale -%> - -
- Search filter -
-

- <%= simple_filter(show_filters) %> -

-

- <%= simple_filter(["key", "text"], 'sort_by') %> -

-
- <% form_tag(params, :method => :get) do %> -
-

- <%= hidden_field_tag(:filter, params[:filter]) %> - <%= hidden_field_tag(:sort_by, params[:sort_by]) %> - - <%= select_tag(:from_locale, options_for_select(I18n.valid_locales, @from_locale.to_sym)) %> to - <%= select_tag(:to_locale, options_for_select(I18n.valid_locales, @to_locale.to_sym)) %> - <%= submit_tag "Display" %> -

-
-
-

- - <%= select_tag(:key_type, options_for_select([["contains", 'contains'], ["starts with", 'starts_with']], params[:key_type])) %> - <%= text_field_tag(:key_pattern, params[:key_pattern], :size => 50, :id => "key_pattern_value", :class => "text-default") %> -

-

- - <%= select_tag(:text_type, options_for_select(['contains', 'equals'], params[:text_type])) %> - <%= text_field_tag(:text_pattern, params[:text_pattern], :size => 50, :id => "text_pattern_value", :class => "text-default") %> -

-

- <%= submit_tag "Search" %> - <%= link_to "clear", params.merge({:text_pattern => nil, :key_pattern => nil}) %> -

-
- <% end %> -

- Found <%= @total_entries %> messages -

-

- <%= link_to "Reload messages", translate_reload_path %> -

-
- - -
- <%= render :partial => 'pagination', :locals => {:total_entries => @total_entries, :per_page => per_page} %> -
- -<% if @total_entries > 0 %> -<% form_tag(translate_path) do %> -
- <%= hidden_field_tag(:filter, params[:filter], :id => "hid_filter") %> - <%= hidden_field_tag(:sort_by, params[:sort_by], :id => "hid_sort_by") %> - <%= hidden_field_tag(:key_type, params[:key_type], :id => "hid_key_type") %> - <%= hidden_field_tag(:key_pattern, params[:key_pattern], :id => "hid_key_pattern") %> - <%= hidden_field_tag(:text_type, params[:text_type], :id => "hid_text_type") %> - <%= hidden_field_tag(:text_pattern, params[:text_pattern], :id => "hid_text_pattern") %> -
-
-

Translations from <%= @from_locale %> to <%= @to_locale %>

-

- <%= submit_tag "Save Translations" %> -

- <% @paginated_keys.each do |key| - from_text = lookup(@from_locale, key) - to_text = lookup(@to_locale, key) - line_size = 100 - n_lines = n_lines(from_text, line_size) - field_name = "key[#{key}]" - %> -
- <% if from_text.present? %> -

- <%= simple_format(h(from_text)) %> -

- <% end %> -

- <% if n_lines > 1 %> - <%= text_area_tag(field_name, to_text, :size => "#{line_size}x#{n_lines}", :id => key) %> - <% else %> - <%= text_field_tag(field_name, to_text, :size => line_size, :id => key) %> - <% end %> -

-

- - <%= link_to_function 'Auto Translate', "getGoogleTranslation('#{key}', \"#{escape_javascript(from_text)}\", '#{@from_locale}', '#{@to_locale}')", :style => 'padding: 0; margin: 0;' %> -
- Key:<%=h key %>
- <% if @files[key] %> - File:<%= @files[key].join("
") %> - <% end %> -
-

-
-<% end %> -

- <%= submit_tag "Save Translations" %> -

-
-<% end %> -<% end %> - -
- <%= render :partial => 'pagination', :locals => {:total_entries => @total_entries, :per_page => per_page} %> -
\ No newline at end of file diff --git a/backup.rails2.3/production.rb.rails2 b/backup.rails2.3/production.rb.rails2 deleted file mode 100644 index 56470f47..00000000 --- a/backup.rails2.3/production.rb.rails2 +++ /dev/null @@ -1,17 +0,0 @@ -# The production environment is meant for finished, "live" apps. -# Code is not reloaded between requests -config.cache_classes = true - -# Use a different logger for distributed setups -# config.logger = SyslogLogger.new - - -# Full error reports are disabled and caching is turned on -config.action_controller.consider_all_requests_local = false -config.action_controller.perform_caching = true - -# Enable serving of images, stylesheets, and javascripts from an asset server -# config.action_controller.asset_host = "http://assets.example.com" - -# Disable delivery errors if you bad email addresses should just be ignored -# config.action_mailer.raise_delivery_errors = false \ No newline at end of file diff --git a/backup.rails2.3/routes.rb.rails2 b/backup.rails2.3/routes.rb.rails2 deleted file mode 100644 index ec0ed738..00000000 --- a/backup.rails2.3/routes.rb.rails2 +++ /dev/null @@ -1,113 +0,0 @@ -ActionController::Routing::Routes.draw do |map| - map.resources :users, - :member => {:change_password => :get, :update_password => :post, - :change_auth_type => :get, :update_auth_type => :post, :complete => :get, - :refresh_token => :post } - - map.with_options :controller => :users do |users| - users.signup 'signup', :action => "new" - end - - map.resources :contexts, :collection => {:order => :post, :done => :get}, :member => {:done_todos => :get, :all_done_todos => :get} do |contexts| - contexts.resources :todos, :name_prefix => "context_" - end - - map.resources :projects, - :collection => {:order => :post, :alphabetize => :post, :actionize => :post, :done => :get}, - :member => {:done_todos => :get, :all_done_todos => :get, :set_reviewed => :get} do |projects| - projects.resources :todos, :name_prefix => "project_" - end - - map.with_options :controller => :projects do |projects| - projects.review 'review', :action => :review - end - - map.resources :notes - - map.resources :todos, - :member => {:toggle_check => :put, :toggle_star => :put, :defer => :put}, - :collection => {:check_deferred => :post, :filter_to_context => :post, :filter_to_project => :post, :done => :get, :all_done => :get - } - - map.with_options :controller => :todos do |todos| - todos.home '', :action => "index" - todos.tickler 'tickler.:format', :action => "list_deferred" - todos.mobile_tickler 'tickler.m', :action => "list_deferred", :format => 'm' - - # This route works for tags with dots like /todos/tag/version1.5 - # please note that this pattern consumes everything after /todos/tag - # so /todos/tag/version1.5.xml will result in :name => 'version1.5.xml' - # UPDATE: added support for mobile view. All tags ending on .m will be - # routed to mobile view of tags. - todos.mobile_tag 'todos/tag/:name.m', :action => "tag", :format => 'm' - todos.text_tag 'todos/tag/:name.txt', :action => "tag", :format => 'txt' - todos.tag 'todos/tag/:name', :action => "tag", :name => /.*/ - todos.done_tag 'todos/done/tag/:name', :action => "done_tag" - todos.all_done_tag 'todos/all_done/tag/:name', :action => "all_done_tag" - - todos.tags 'tags.autocomplete', :action => "tags", :format => 'autocomplete' - todos.auto_complete_for_predecessor 'auto_complete_for_predecessor', :action => 'auto_complete_for_predecessor' - - todos.calendar 'calendar.ics', :action => "calendar", :format => 'ics' - todos.calendar 'calendar.xml', :action => "calendar", :format => 'xml' - todos.calendar 'calendar', :action => "calendar" - - todos.hidden 'hidden.xml', :action => "list_hidden", :format => 'xml' - - todos.mobile 'mobile', :action => "index", :format => 'm' - todos.mobile_abbrev 'm', :action => "index", :format => 'm' - todos.mobile_abbrev_new 'm/new', :action => "new", :format => 'm' - - todos.mobile_todo_show_notes 'todos/notes/:id.m', :action => "show_notes", :format => 'm' - todos.todo_show_notes 'todos/notes/:id', :action => "show_notes" - todos.done_todos 'todos/done', :action => :done - todos.all_done_todos 'todos/all_done', :action => :all_done - end - map.root :controller => 'todos' # Make OpenID happy because it needs #root_url defined - - map.resources :recurring_todos, :collection => {:done => :get}, - :member => {:toggle_check => :put, :toggle_star => :put} - map.with_options :controller => :recurring_todos do |rt| - rt.recurring_todos 'recurring_todos', :action => 'index' - end - - map.with_options :controller => :login do |login| - login.login 'login', :action => 'login' - login.login_cas 'login_cas', :action => 'login_cas' - login.formatted_login 'login.:format', :action => 'login' - login.logout 'logout', :action => 'logout' - login.formatted_logout 'logout.:format', :action => 'logout' - end - - map.with_options :controller => :feedlist do |fl| - fl.mobile_feeds 'feeds.m', :action => 'index', :format => 'm' - fl.feeds 'feeds', :action => 'index' - end - - map.with_options :controller => :integrations do |i| - i.integrations 'integrations', :action => 'index' - i.rest_api_docs 'integrations/rest_api', :action => "rest_api" - i.search_plugin 'integrations/search_plugin.xml', :action => 'search_plugin', :format => 'xml' - i.google_gadget 'integrations/google_gadget.xml', :action => 'google_gadget', :format => 'xml' - i.cloudmailin 'integrations/cloudmailin', :action => 'cloudmailin' - end - - map.with_options :controller => :preferences do |p| - p.preferences 'preferences', :action => 'index' - p.preferences_date_format 'preferences/render_date_format', :action => 'render_date_format' - end - - map.with_options :controller => :stats do |stats| - stats.stats 'stats', :action => 'index' - stats.done_overview 'done', :action => 'done' - end - - map.search 'search', :controller => 'search', :action => 'index' - map.data 'data', :controller => 'data', :action => 'index' - - Translate::Routes.translation_ui(map) if Rails.env != "production" - - # Install the default route as the lowest priority. - map.connect ':controller/:action/:id' - -end diff --git a/backup.rails2.3/slider.js b/backup.rails2.3/slider.js deleted file mode 100644 index c0f1fc01..00000000 --- a/backup.rails2.3/slider.js +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) 2005 Marty Haught, Thomas Fuchs -// -// See http://script.aculo.us for more info -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -if(!Control) var Control = {}; -Control.Slider = Class.create(); - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider.prototype = { - initialize: function(handle, track, options) { - var slider = this; - - if(handle instanceof Array) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || {}; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth; - - this.active = false; - this.dragging = false; - this.disabled = false; - - if(this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if(this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (slider.options.sliderValue instanceof Array ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - Element.makePositioned(h); // fix IE - Event.observe(h, "mousedown", slider.eventMouseDown); - }); - - Event.observe(this.track, "mousedown", this.eventMouseDown); - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if(this.allowedValues){ - if(value >= this.allowedValues.max()) return(this.allowedValues.max()); - if(value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if(currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if(value > this.range.end) return this.range.end; - if(value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if(!this.active) { - this.activeHandle = this.handles[handleIdx]; - this.activeHandleIdx = handleIdx; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if(this.initialized && this.restricted) { - if((handleIdx>0) && (sliderValuethis.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if(!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if(this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if(this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if(this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if(this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start + this.range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start + this.range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if(Event.isLeftClick(event)) { - if(!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - if(handle==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - Event.stop(event); - } - }, - update: function(event) { - if(this.active) { - if(!this.dragging) this.dragging = true; - this.draw(event); - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if(this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if(this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if(this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -} \ No newline at end of file diff --git a/backup.rails2.3/spec/controllers/projects_controller_spec.rb b/backup.rails2.3/spec/controllers/projects_controller_spec.rb deleted file mode 100644 index 3ee3b81b..00000000 --- a/backup.rails2.3/spec/controllers/projects_controller_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe ProjectsController do - it "should save default tags" do - project = Project.new - - projects = mock(:project_list, :build => project, - :active => mock(:meh, :count => 0), :size => 0) - - user = mock_model(User, :projects => projects, :prefs => mock(:locale => :en), - :contexts => mock(:context_list, :find => [])) - controller.stub!(:current_user).and_return(user) - controller.stub!(:login_required).and_return(true) - controller.stub!(:set_time_zone).and_return(true) - controller.stub!(:mobile?).and_return(true) - - get 'create', :project => {:name => "fooproject", :default_tags => "a,b"} - - project.default_tags.should == 'a,b' - end -end diff --git a/backup.rails2.3/spec/controllers/todos_controller_spec.rb b/backup.rails2.3/spec/controllers/todos_controller_spec.rb deleted file mode 100644 index 0bd0870c..00000000 --- a/backup.rails2.3/spec/controllers/todos_controller_spec.rb +++ /dev/null @@ -1,4 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe TodosController do -end diff --git a/backup.rails2.3/spec/factories/factories.rb b/backup.rails2.3/spec/factories/factories.rb deleted file mode 100644 index 8a2c550f..00000000 --- a/backup.rails2.3/spec/factories/factories.rb +++ /dev/null @@ -1,26 +0,0 @@ -begin - Factory.define :user do |u| - u.sequence(:login) { |n| "testuser#{n}" } - u.password "secret" - u.password_confirmation { |user| user.password } - u.is_admin false - end - - Factory.define :context do |c| - c.sequence(:name) { |n| "testcontext#{n}" } - c.hide false - c.created_at Time.now.utc - end - - Factory.define :project do |p| - p.sequence(:name) { |n| "testproject#{n}" } - end - - Factory.define :todo do |t| - t.sequence(:description) { |n| "testtodo#{n}" } - t.association :context - end - -rescue FactoryGirl::DuplicateDefinitionError - # No problem, apparently this file was included already. -end diff --git a/backup.rails2.3/spec/fixtures/contexts.yml b/backup.rails2.3/spec/fixtures/contexts.yml deleted file mode 100644 index a0513ccc..00000000 --- a/backup.rails2.3/spec/fixtures/contexts.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -agenda: - id: 2 - name: agenda - position: 2 - hide: false - user: admin_user - -call: - id: 3 - name: call - position: 3 - hide: true - user: admin_user - -email: - id: 4 - name: email - position: 4 - hide: false - user: admin_user diff --git a/backup.rails2.3/spec/fixtures/preferences.yml b/backup.rails2.3/spec/fixtures/preferences.yml deleted file mode 100644 index 66d41ee8..00000000 --- a/backup.rails2.3/spec/fixtures/preferences.yml +++ /dev/null @@ -1,34 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -admin_user_prefs: - user: admin_user - staleness_starts: 7 - date_format: "%d/%m/%Y" - title_date_format: "%A, %d %B %Y" - show_number_completed: 5 - show_completed_projects_in_sidebar: true - show_hidden_contexts_in_sidebar: true - show_hidden_projects_in_sidebar: true - admin_email: butshesagirl@rousette.org.uk - week_starts: 1 - due_style: 0 - refresh: 0 - time_zone: "London" - verbose_action_descriptors: true - show_project_on_todo_done: false - -other_user_prefs: - user: jane - staleness_starts: 7 - date_format: "%d/%m/%Y" - title_date_format: "%A, %d %B %Y" - show_number_completed: 5 - show_completed_projects_in_sidebar: true - show_hidden_contexts_in_sidebar: true - show_hidden_projects_in_sidebar: true - admin_email: butshesagirl@rousette.org.uk - week_starts: 1 - due_style: 0 - refresh: 0 - time_zone: "London" - verbose_action_descriptors: false - show_project_on_todo_done: true diff --git a/backup.rails2.3/spec/fixtures/todos.yml b/backup.rails2.3/spec/fixtures/todos.yml deleted file mode 100644 index b8af3088..00000000 --- a/backup.rails2.3/spec/fixtures/todos.yml +++ /dev/null @@ -1,68 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -<% - -def today - Time.zone.now.beginning_of_day.to_s(:db) -end - -def next_week - 1.week.from_now.beginning_of_day.to_s(:db) -end - -def last_week - 1.week.ago.beginning_of_day.to_s(:db) -end - -def two_weeks_ago - 2.weeks.ago.beginning_of_day.to_s(:db) -end - -def two_weeks_hence - 2.weeks.from_now.beginning_of_day.to_s(:db) -end - -%> - -billgates: - id: 2 - context_id: 2 - project_id: 2 - description: Call Bill Gates to find out how much he makes per day - notes: ~ - state: active - due: <%= two_weeks_hence %> - completed_at: ~ - user: admin_user - -dinoexterm: - id: 3 - context_id: 2 - project_id: 3 - description: Call dinosaur exterminator - notes: Ask him if I need to hire a skip for the corpses. - state: active - due: <%= two_weeks_hence %> - completed_at: ~ - user: admin_user - -buymilk: - id: 4 - context_id: 2 - project_id: ~ - description: Buy milk - notes: ~ - state: completed - due: ~ - completed_at: <%= today %> - user: admin_user - -callmom: - id: 5 - context_id: 3 # call - project_id: ~ - description: Call mom - notes: Remember her birthday - state: active - due: ~ - completed_at: ~ - user: admin_user diff --git a/backup.rails2.3/spec/fixtures/users.yml b/backup.rails2.3/spec/fixtures/users.yml deleted file mode 100644 index cdd9a914..00000000 --- a/backup.rails2.3/spec/fixtures/users.yml +++ /dev/null @@ -1,27 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -admin_user: - login: admin - crypted_password: <%= BCrypt::Password.create("abracadabra") %> - token: <%= Digest::SHA1.hexdigest("adminSat Feb 25 17:14:00 GMT 20060.236961325863376") %> - is_admin: true - first_name: Admin - last_name: Schmadmin - auth_type: database - -other_user: - login: jane - crypted_password: <%= BCrypt::Password.create("sesame") %> - token: <%= Digest::SHA1.hexdigest("janeSun Feb 19 14:42:45 GMT 20060.408173979260027") %> - is_admin: false - first_name: Jane - last_name: Doe - auth_type: database - -ldap_user: - login: john - crypted_password: test - token: <%= Digest::SHA1.hexdigest("johnSun Feb 19 14:42:45 GMT 20060.408173979260027") %> - is_admin: false - first_name: John - last_name: Deere - auth_type: ldap diff --git a/backup.rails2.3/spec/models/context_spec.rb b/backup.rails2.3/spec/models/context_spec.rb deleted file mode 100644 index 562f285f..00000000 --- a/backup.rails2.3/spec/models/context_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') - -describe Context do - def valid_attributes - {:name => 'Errands'} - end - - before(:each) do - @context = Context.new - end - - it 'has many users' do - Context.should have_many(:todos). - with_order('todos.due IS NULL, todos.due ASC, todos.created_at ASC'). - with_dependent(:delete_all). - with_include(:project) - end - - it_should_belong_to :user - - it_should_validate_presence_of :name, 'context must have a name' - it_should_validate_length_of :name, :maximum => 255, - :message_too_long => 'context name must be less than 256 characters' - it_should_validate_uniqueness_of :name, 'already exists' # TODO: scope user_id - it_should_not_accept_as_valid :name, ',', - :message => "cannot contain the comma (',') character" - - it 'is hidden when hide is true' do - Context.new(:hide => false).should_not be_hidden - Context.new(:hide => true).should be_hidden - end - - it 'returns name as title' do - Context.new(:name => 'foo').title.should == 'foo' - end - - it 'returns an instance NullContext for null_object' do - Context.null_object.should be_an_instance_of(NullContext) - end - - it "returns feed options with description containing user's name" do - user = mock_model(User, :display_name => 'simon') - feed_options_for_user = Context.feed_options(user) - feed_options_for_user[:title].should == 'Tracks Contexts' - feed_options_for_user[:description].should == 'Lists all the contexts for simon' - end - - describe 'when finding by namepart' do - fixtures :todos, :contexts - - it 'finds with exact match' do - Context.find_by_namepart('agenda').should == contexts(:agenda) - end - - it 'finds with partial match' do - Context.find_by_namepart('age').should == contexts(:agenda) - end - - it 'deletes todos within context when context deleted' do - contexts(:agenda).should have(3).todos - call_todos = contexts(:agenda).todos - contexts(:agenda).destroy - Todo.find(:all).should_not include(call_todos) - end - end - - describe 'when counting todos' do - fixtures :todos, :contexts, :users, :preferences - - it 'returns correct number of completed todos' do - contexts(:call).done_todos.should_not have(:any).items - contexts(:call).todos.first.complete! - Context.find(contexts(:call).id).done_todos.should have(1).items - end - - it 'returns correct number of not done todos' do - contexts(:agenda).todos.not_completed.should have(2).items - contexts(:agenda).todos.last.complete! - contexts(:agenda).todos.not_completed.should have(1).items - end - end -end - -describe NullContext do - before(:each) do - @context = NullContext.new - end - - it 'is nil' do - @context.should be_nil - end - - it 'has no id' do - @context.id.should be_nil - end - - it 'has a blank name' do - @context.name.should be_blank - end -end diff --git a/backup.rails2.3/spec/models/message_gateway_spec.rb b/backup.rails2.3/spec/models/message_gateway_spec.rb deleted file mode 100644 index 188093ee..00000000 --- a/backup.rails2.3/spec/models/message_gateway_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe MessageGateway do - before :each do - todo = mock_model(Todo, :description= => nil, :raw_notes= => nil, :context_id= => nil, :save! => nil) - - @user = mock_model(User, - :prefs => mock_model(Preference, :sms_context => mock_model(Context)), - :todos => mock('Todo collection', :find => nil, :build => todo), - :contexts => mock('Context collection', :exists? => true, :find => nil)) - - User.stub!(:find).and_return(@user) - end - - def load_message(filename) - MessageGateway.receive(File.read(File.join(RAILS_ROOT, 'test', 'fixtures', filename))) - end - - - it "should dispatch on From: or To: according to site.yml" do - SITE_CONFIG['email_dispatch'] = 'from' - User.should_receive(:find).with(:first, :include => [:preference], :conditions => ["preferences.sms_email = ?", '5555555555@tmomail.net']) - load_message('sample_email.txt') - - SITE_CONFIG['email_dispatch'] = 'to' - User.should_receive(:find).with(:first, :include => [:preference], :conditions => ["preferences.sms_email = ?", 'gtd@tracks.com']) - load_message('sample_email.txt') - end -end diff --git a/backup.rails2.3/spec/models/todo_spec.rb b/backup.rails2.3/spec/models/todo_spec.rb deleted file mode 100644 index b31ab7a2..00000000 --- a/backup.rails2.3/spec/models/todo_spec.rb +++ /dev/null @@ -1,182 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') - -describe Todo do - def valid_attributes(attributes={}) - { - :description => "don't forget the milk", - :context => mock_model(Context, :name => 'errands', :destroyed? => false) - }.merge(attributes) - end - - def create_todo(attributes={}) - todo = Todo.new(valid_attributes(attributes)) - todo.stub!(:user).and_return(mock_model(User, :date => Time.zone.now)) - todo.save! - todo - end - - before(:each) do - @todo = Todo.new - end - - it_should_belong_to :context - it_should_belong_to :project - it_should_belong_to :user - - it_should_validate_presence_of :description - it_should_validate_presence_of :context - it_should_validate_length_of :description, :maximum => 100 - it_should_validate_length_of :notes, :maximum => 60_000 - - it 'validates presence of show_from when deferred' - - it 'ensures that show_from is a date in the future' do - todo = Todo.new(valid_attributes) - todo.stub!(:user).and_return(mock_model(User, :date => Time.zone.now)) - todo.show_from = 3.days.ago - todo.should have(1).error_on(:show_from) - end - - it 'allows show_from to be blank' do - todo = Todo.new(valid_attributes(:show_from => '')) - todo.should_not have(:any).error_on(:show_from) - end - - describe 'states' do - it 'is active on initializing' do - create_todo.should be_active - end - - it 'is deferred when show from is in the future' do - todo = create_todo - todo.show_from = 1.week.from_now - todo.should be_deferred - end - - describe 'active' do - %w(project_hidden completed deferred).each do |from_state| - it "is activable from `#{from_state}'" do - todo = create_todo - todo.state = from_state - todo.send("#{from_state}?").should be_true - todo.activate! - todo.should be_active - end - end - - it 'clears show_from when entering active state' do - todo = create_todo - todo.show_from = 3.days.from_now - todo.should be_deferred - todo.activate! - todo.should be_active - todo.show_from.should be_nil - end - - it 'clears completed_at when entering active state' do - todo = create_todo - todo.complete! - todo.should be_completed - todo.activate! - todo.should be_active - todo.completed_at.should be_nil - end - end - - describe 'completed' do - %w(active project_hidden deferred).each do |from_state| - it "is completable from `#{from_state}'" do - todo = create_todo - todo.state = from_state - todo.send("#{from_state}?").should be_true - todo.complete! - todo.should be_completed - end - end - - it 'sets complated_at' do - todo = create_todo - todo.complete! - todo.completed_at.should_not be_nil - end - end - - describe 'project_hidden' do - %w(active deferred).each do |from_state| - it "is hiddable from `#{from_state}'" do - todo = create_todo - todo.state = from_state - todo.send("#{from_state}?").should be_true - todo.hide! - todo.should be_project_hidden - end - end - - it 'unhides to active when not show_from' do - todo = create_todo(:show_from => '') - todo.hide! - todo.should be_project_hidden - todo.unhide! - todo.should be_active - end - end - end - - describe 'when toggling completion' do - it 'toggles to active when completed' do - todo = create_todo - todo.complete! - todo.should be_completed - todo.toggle_completion! - todo.should be_active - end - - it 'toggles to completed when not completed' do - todo = create_todo - todo.should_not be_completed - todo.toggle_completion! - todo.should be_completed - end - end - - describe 'when retrieving project' do - it 'returns project if set' do - project = mock_model(Project) - todo = Todo.new(:project => project) - todo.project.should == project - end - - it 'returns a NullProject if not set' do - Todo.new.project.should be_an_instance_of(NullProject) - end - end - - describe('when setting show_from') { it 'is speced' } - - it 'is starred if tag is "starred"' do - todo = create_todo - todo.should_not be_starred - todo._add_tags('starred') - todo.reload - todo.should be_starred - end - - describe 'when toggling star flag' do - it 'toggles to not starred when starred' do - todo = create_todo - todo._add_tags('starred') - todo.should be_starred - todo.toggle_star! - todo.reload - todo.should_not be_starred - end - - it 'toggles to starred when not starred' do - todo = create_todo - todo.should_not be_starred - todo.toggle_star! - todo.reload - todo.should be_starred - end - end -end diff --git a/backup.rails2.3/spec/models/user_spec.rb b/backup.rails2.3/spec/models/user_spec.rb deleted file mode 100644 index 035960ad..00000000 --- a/backup.rails2.3/spec/models/user_spec.rb +++ /dev/null @@ -1,168 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') - -describe User do - def valid_attributes(attributes={}) - { - :login => 'simon', - :password => 'foobarspam', - :password_confirmation => 'foobarspam' - }.merge(attributes) - end - - before(:each) do - @user = User.new - end - - describe 'associations' do - it 'has many contexts' do - User.should have_many(:contexts). - with_order('position ASC'). - with_dependent(:delete_all) - end - - it 'has many projects' do - User.should have_many(:projects). - with_order('projects.position ASC'). - with_dependent(:delete_all) - end - - it 'has many todos' do - User.should have_many(:todos). - with_order('todos.completed_at DESC, todos.created_at DESC'). - with_dependent(:delete_all) - end - - it 'has many deferred todos' do - User.should have_many(:deferred_todos). - with_order('show_from ASC, todos.created_at DESC'). - with_conditions('state = ?', 'deferred'). - with_class_name('Todo') - end - - it 'has many notes' do - User.should have_many(:notes). - with_order('created_at DESC'). - with_dependent(:delete_all) - end - - it 'has one preference' do - User.should have_one(:preference) - end - end - - it_should_validate_presence_of :login - it_should_validate_presence_of :password - it_should_validate_presence_of :password_confirmation - - it_should_validate_length_of :password, :within => 5..40 - it_should_validate_length_of :login, :within => 3..80 - - it_should_validate_uniqueness_of :login - it_should_validate_confirmation_of :password - - it 'validates presence of password only when password is required' - it 'validates presence of password_confirmation only when password is required' - it 'validates confirmation of password only when password is required' - it 'validates presence of open_id_url only when using openid' - - it 'accepts only allow auth_type authorized by the admin' do - Tracks::Config.should_receive(:auth_schemes).exactly(3).times.and_return(%w(database open_id)) - User.new(valid_attributes(:auth_type => 'database')).should_not have(:any).error_on(:auth_type) - User.new(valid_attributes(:auth_type => 'open_id')).should_not have(:any).error_on(:auth_type) - User.new(valid_attributes(:auth_type => 'ldap')).should have(1).error_on(:auth_type) - end - - it 'returns login for #to_param' do - @user.login = 'john' - @user.to_param.should == 'john' - end - - it 'has a custom finder to find admin' do - User.should_receive(:find).with(:first, :conditions => ['is_admin = ?', true]) - User.find_admin - end - - it 'has a custom finder to find by openid url' - it 'knows if there is any user through #no_users_yet? (TODO: better description)' - - describe 'when choosing what do display as a name' do - it 'displays login when no first name and last name' do - User.new(valid_attributes).display_name.should == 'simon' - end - - it 'displays last name when no first name' do - User.new(valid_attributes(:last_name => 'foo')).display_name.should == 'foo' - end - - it 'displays first name when no last name' do - User.new(valid_attributes(:first_name => 'bar')).display_name.should == 'bar' - end - - it 'displays first name and last name when both specified' do - User.new(valid_attributes(:first_name => 'foo', :last_name => 'bar')).display_name.should == 'foo bar' - end - end - - describe 'authentication' do - before(:each) do - @user = User.create!(valid_attributes) - end - - it 'authenticates user' do - User.authenticate('simon', 'foobarspam').id.should be @user.id - end - - it 'resets password' do - @user.update_attributes( - :password => 'new password', - :password_confirmation => 'new password' - ) - User.authenticate('simon', 'foobarspam').should be_nil - User.authenticate('simon', 'new password').id.should be @user.id - end - - it 'does not rehash password after update of login' do - @user.update_attribute(:login, 'foobar') - User.authenticate('foobar', 'foobarspam').id.should be @user.id - end - - it 'sets remember token' do - @user.remember_me - @user.remember_token.should_not be_nil - @user.remember_token_expires_at.should_not be_nil - end - - it 'unsets remember token' do - @user.remember_me - @user.remember_token.should_not be_nil - @user.forget_me - @user.remember_token.should be_nil - end - - it 'remembers me default two weeks' do - before = 2.weeks.from_now.utc - @user.remember_me - after = 2.weeks.from_now.utc - @user.remember_token.should_not be_nil - @user.remember_token_expires_at.should_not be_nil - @user.remember_token_expires_at.should be_between(before, after) - end - end - - it "should not activate todos that are showing when UTC is tomorrow" do - context = Context.create(:name => 'a context') - user = User.create(:login => 'user7', :password => 'foobar', :password_confirmation => 'foobar') - user.save! - user.create_preference - user.preference.update_attribute('time_zone', 'Pacific Time (US & Canada)') -# Time.zone = 'Pacific Time (US & Canada)' - Time.stub!(:now).and_return(Time.new.end_of_day - 20.minutes) - todo = user.todos.build(:description => 'test task', :context => context) - todo.show_from = user.date + 1.days - todo.save! - - user.deferred_todos.find_and_activate_ready - user = User.find(user.id) - user.deferred_todos.should include(todo) - end -end diff --git a/backup.rails2.3/spec/rcov.opts b/backup.rails2.3/spec/rcov.opts deleted file mode 100644 index 274ed51a..00000000 --- a/backup.rails2.3/spec/rcov.opts +++ /dev/null @@ -1,2 +0,0 @@ ---exclude "spec/*,gems/*" ---rails \ No newline at end of file diff --git a/backup.rails2.3/spec/spec.opts b/backup.rails2.3/spec/spec.opts deleted file mode 100644 index 391705bf..00000000 --- a/backup.rails2.3/spec/spec.opts +++ /dev/null @@ -1,4 +0,0 @@ ---colour ---format progress ---loadby mtime ---reverse diff --git a/backup.rails2.3/spec/spec_helper.rb b/backup.rails2.3/spec/spec_helper.rb deleted file mode 100644 index e83f9daa..00000000 --- a/backup.rails2.3/spec/spec_helper.rb +++ /dev/null @@ -1,52 +0,0 @@ -# This file is copied to ~/spec when you run 'ruby script/generate rspec' -# from the project root directory. -ENV["RAILS_ENV"] ||= 'test' -require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment')) -require 'spec/autorun' -require 'spec/rails' -require 'skinny_spec' - -# Requires supporting files with custom matchers and macros, etc, -# in ./support/ and its subdirectories. -Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f} - -Spec::Runner.configure do |config| - # If you're not using ActiveRecord you should remove these - # lines, delete config/database.yml and disable :active_record - # in your config/boot.rb - config.use_transactional_fixtures = true - config.use_instantiated_fixtures = false - config.fixture_path = RAILS_ROOT + '/spec/fixtures/' - - # == Fixtures - # - # You can declare fixtures for each example_group like this: - # describe "...." do - # fixtures :table_a, :table_b - # - # Alternatively, if you prefer to declare them only once, you can - # do so right here. Just uncomment the next line and replace the fixture - # names with your fixtures. - # - # config.global_fixtures = :table_a, :table_b - # - # If you declare global fixtures, be aware that they will be declared - # for all of your examples, even those that don't use them. - # - # You can also declare which fixtures to use (for example fixtures for test/fixtures): - # - # config.fixture_path = RAILS_ROOT + '/spec/fixtures/' - # - # == Mock Framework - # - # RSpec uses it's own mocking framework by default. If you prefer to - # use mocha, flexmock or RR, uncomment the appropriate line: - # - # config.mock_with :mocha - # config.mock_with :flexmock - # config.mock_with :rr - # - # == Notes - # - # For more information take a look at Spec::Runner::Configuration and Spec::Runner -end diff --git a/backup.rails2.3/spec/support/should_validate_length_of.rb b/backup.rails2.3/spec/support/should_validate_length_of.rb deleted file mode 100644 index ae7b5a1a..00000000 --- a/backup.rails2.3/spec/support/should_validate_length_of.rb +++ /dev/null @@ -1,25 +0,0 @@ -module LuckySneaks - module ModelSpecHelpers - module ExampleGroupLevelMethods - def it_should_validate_length_of(attribute, options={}) - maximum = options[:maximum] || (options[:within] || []).last || false - minimum = options[:minimum] || (options[:within] || []).first || false - raise ArgumentError unless maximum || minimum - - it "should not be valid if #{attribute} length is more than #{maximum}" do - instance.send "#{attribute}=", 'x'*(maximum+1) - instance.errors_on(attribute).should include( - options[:message_too_long] || I18n.t('activerecord.errors.messages.too_long', :count => maximum) - ) - end if maximum - - it "should not be valid if #{attribute} length is less than #{minimum}" do - instance.send "#{attribute}=", 'x'*(minimum-1) - instance.errors_on(attribute).should include( - options[:message_to_short] || I18n.t('activerecord.errors.messages.too_short', :count => minimum) - ) - end if minimum - end - end - end -end diff --git a/backup.rails2.3/spec/views/login/login_mobile.html.erb_spec.rb b/backup.rails2.3/spec/views/login/login_mobile.html.erb_spec.rb deleted file mode 100644 index b3bce82d..00000000 --- a/backup.rails2.3/spec/views/login/login_mobile.html.erb_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -describe "/login/login_mobile.html.erb" do - it "should render without an error" do - @controller.template.stub!(:set_default_external!) - render :action => 'login/login_mobile.html.erb', :layout => 'mobile.m.erb' - response.should_not have_tag("div#Application-Trace") - end -end diff --git a/backup.rails2.3/spec/views/notes/_notes.rhtml_spec.rb b/backup.rails2.3/spec/views/notes/_notes.rhtml_spec.rb deleted file mode 100644 index 477e66b5..00000000 --- a/backup.rails2.3/spec/views/notes/_notes.rhtml_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -describe "/notes/_notes.rhtml" do - before :each do - @project = mock_model(Project, :name => "a project") - @note = mock_model(Note, :body => "this is a note", :project => @project, :project_id => @project.id, - :created_at => Time.now, :updated_at? => false) - @controller.template.stub!(:format_date) - # @controller.template.stub!(:render) - # @controller.template.stub!(:form_remote_tag) - end - - it "should render" do - pending "figure out how to mock or work with with UJS" - render :partial => "/notes/notes", :object => @note - response.should have_tag("div.note_footer") - end - - it "should auto-link URLs" do - pending "figure out how to mock or work with with UJS" - @note.stub!(:body).and_return("http://www.google.com/") - render :partial => "/notes/notes", :object => @note - response.should have_tag("a[href=\"http://www.google.com/\"]") - end - - it "should auto-link embedded URLs" do - pending "figure out how to mock or work with with UJS" - @note.stub!(:body).and_return("this is cool: http://www.google.com/") - render :partial => "/notes/notes", :object => @note - response.should have_tag("a[href=\"http://www.google.com/\"]") - end - - it "should parse Textile links correctly" do - pending "figure out how to mock or work with with UJS" - @note.stub!(:body).and_return("\"link\":http://www.google.com/") - render :partial => "/notes/notes", :locals => {:notes => @note} - response.should have_tag("a[href=\"http://www.google.com/\"]") - end -end diff --git a/backup.rails2.3/test_helper.rb.rails2 b/backup.rails2.3/test_helper.rb.rails2 deleted file mode 100644 index 40d8a464..00000000 --- a/backup.rails2.3/test_helper.rb.rails2 +++ /dev/null @@ -1,152 +0,0 @@ -ENV["RAILS_ENV"] = "test" -require 'thread' -require File.expand_path(File.dirname(__FILE__) + "/../config/environment") -require File.expand_path(File.dirname(__FILE__) + "/../app/controllers/application_controller") -require 'test_help' -require 'flexmock/test_unit' #and the flexmock gem, too! -require 'action_web_service/test_invoke' - -module Tracks - class Config - def self.salt - "change-me" - end - def self.auth_schemes - return ["database","open_id"] - end - end -end - -class Test::Unit::TestCase - include AuthenticatedTestHelper - - def xml_document - @xml_document ||= HTML::Document.new(@response.body, false, true) - end - - def assert_xml_select(*args, &block) - @html_document = xml_document - assert_select(*args, &block) - end - - def assert_error_on(model_instance, attribute, expected_error) - actual_error = model_instance.errors.on attribute.to_sym - assert_equal expected_error, actual_error - end - - alias_method :assert_errors_on, :assert_error_on - - def assert_value_changed(object, method = nil) - initial_value = object.send(method) - yield - assert_not_equal initial_value, object.send(method), "#{object}##{method}" - end - -end - -class ActiveSupport::TestCase - - # Generates a random string of ascii characters (a-z, "1 0") - # of a given length for testing assignment to fields - # for validation purposes - # - def generate_random_string(length) - string = "" - characters = %w(a b c d e f g h i j k l m n o p q r s t u v w z y z 1\ 0) - length.times do - pick = characters[rand(26)] - string << pick - end - return string - end - - def next_week - 1.week.from_now.utc - end - - # Courtesy of http://habtm.com/articles/2006/02/20/assert-yourself-man-redirecting-with-rjs - def assert_js_redirected_to(options={}, message=nil) - clean_backtrace do - assert_response(:success, message) - assert_equal 'text/javascript', @response.content_type, 'Response should be Javascript content-type'; - js_regexp = %r{(\w+://)?.*?(/|$|\\\?)(.*)} - url_regexp = %r{^window\.location\.href [=] ['"]#{js_regexp}['"][;]$} - redirected_to = @response.body.match(url_regexp) - assert_not_nil(redirected_to, message) - redirected_to = redirected_to[3] - msg = build_message(message, "expected a JS redirect to , found one to ", options, redirected_to) - - if options.is_a?(String) - assert_equal(options.gsub(/^\//, ''), redirected_to, message) - elsif options.is_a?(Regexp) - assert(options =~ redirected_to, "#{message} #{options} #{redirected_to}") - else - msg = build_message(message, "response is not a redirection to all of the options supplied (redirection is )", redirected_to) - assert_equal(@controller.url_for(options).match(js_regexp)[3], redirected_to, msg) - end - end - end - - def set_user_to_current_time_zone(user) - jan_offset = Time.now.beginning_of_year.utc_offset - jul_offset = Time.now.beginning_of_year.change(:month => 7).utc_offset - offset = jan_offset < jul_offset ? jan_offset : jul_offset - offset = if offset.to_s.match(/(\+|-)?(\d+):(\d+)/) - sign = $1 == '-' ? -1 : 1 - hours, minutes = $2.to_f, $3.to_f - ((hours * 3600) + (minutes.to_f * 60)) * sign - elsif offset.to_f.abs <= 13 - offset.to_f * 3600 - else - offset.to_f - end - zone = ActiveSupport::TimeZone.all.find{|t| t.utc_offset == offset} - user.prefs.update_attribute(:time_zone, zone.name) - end -end - -class ActionController::IntegrationTest - Tag #avoid errors in integration tests - - def assert_test_environment_ok - assert_equal "test", ENV['RAILS_ENV'] - assert_equal "change-me", Tracks::Config.salt - end - - def authenticated_post_xml(url, username, password, parameters, headers = {}) - post url, - parameters, - {'AUTHORIZATION' => "Basic " + Base64.encode64("#{username}:#{password}"), - 'ACCEPT' => 'application/xml', - 'CONTENT_TYPE' => 'application/xml' - }.merge(headers) - end - - def authenticated_get_xml(url, username, password, parameters, headers = {}) - get url, - parameters, - {'AUTHORIZATION' => "Basic " + Base64.encode64("#{username}:#{password}"), - 'ACCEPT' => 'application/xml', - 'CONTENT_TYPE' => 'application/xml' - }.merge(headers) - end - - def assert_response_and_body(type, body, message = nil) - assert_equal body, @response.body, message - assert_response type, message - end - - def assert_response_and_body_matches(type, body_regex, message = nil) - assert_response type, message - assert_match body_regex, @response.body, message - end - - def assert_401_unauthorized - assert_response_and_body 401, "401 Unauthorized: You are not authorized to interact with Tracks." - end - - def assert_401_unauthorized_admin - assert_response_and_body 401, "401 Unauthorized: Only admin users are allowed access to this function." - end - -end diff --git a/backup.rails2.3/test_views/views/context_helper_test.rb b/backup.rails2.3/test_views/views/context_helper_test.rb deleted file mode 100644 index 8aa0bd4b..00000000 --- a/backup.rails2.3/test_views/views/context_helper_test.rb +++ /dev/null @@ -1,7 +0,0 @@ - def test_summary - undone_todo_count = '5 actions' - assert_equal "

#{undone_todo_count}. Context is Active.

", @agenda.summary(undone_todo_count) - @agenda.hide = true - @agenda.save! - assert_equal "

#{undone_todo_count}. Context is Hidden.

", @agenda.summary(undone_todo_count) - end diff --git a/backup.rails2.3/test_views/views/todos_helper_test.rb b/backup.rails2.3/test_views/views/todos_helper_test.rb deleted file mode 100644 index 441ec2b5..00000000 --- a/backup.rails2.3/test_views/views/todos_helper_test.rb +++ /dev/null @@ -1,98 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class TodosHelperTest < ActiveSupport::HelperTestCase - fixtures :users - - def setup - super - end - - include ActionView::Helpers::DateHelper - include ApplicationHelper - include TodosHelper - - def current_user - if @user.nil? - @user = users(:admin_user) - class << @user - def prefs - Preference.new - end - end - end - @user - end - - def format_date(date) - if date - date_format = "%d/%m/%Y" - date.strftime("#{date_format}") - else - '' - end - end - - def test_show_date_in_past - date = 3.days.ago - html = show_date(date) - formatted_date = format_date(date) - assert_equal %Q{Scheduled to show 3 days ago }, html - end - - def test_show_date_today - date = Time.zone.now - html = show_date(date) - formatted_date = format_date(date) - assert_equal %Q{Show Today }, html - end - - def test_show_date_tomorrow - date = 1.day.from_now - html = show_date(date) - formatted_date = format_date(date) - assert_equal %Q{Show Tomorrow }, html - end - - def test_show_date_future - date = 10.days.from_now - html = show_date(date) - formatted_date = format_date(date) - assert_equal %Q{Show in 10 days }, html - end - - def test_remote_star_icon_unstarred - @todo = flexmock(:id => 1, :to_param => 1, :description => 'Get gas', :starred? => false) - # added dot (.) to regexp because somehouw the extra dot is added in the tests while its not in the rendered html - assert_remote_star_icon_helper_matches %r{Blank} - assert_behavior_registered - end - - def test_remote_star_icon_starred - @todo = flexmock(:id => 1, :to_param => 1, :description => 'Get gas', :starred? => true) - # added dot (.) to regexp because somehouw the extra dot is added in the tests while its not in the rendered html - assert_remote_star_icon_helper_matches %r{Blank} - assert_behavior_registered - end - - def assert_remote_star_icon_helper_matches(regex) - @controller.send :initialise_js_behaviours #simulate before filter - output = remote_star_icon - # puts output - assert output =~ regex - @controller.send :store_js_behaviours #simulate after filter - end - - def assert_behavior_registered - behaviors = @controller.session[:js_behaviours] - assert behaviors[:options][:reapply_after_ajax] - assert_equal 1, behaviors[:rules].length - rule = behaviors[:rules][0] - assert_equal ".item-container a.star_item:click", rule[0] - assert_equal "new Ajax.Request(this.href, {asynchronous:true, evalScripts:true, method:'put', parameters:{ _source_view : '' }})\n; return false;", - rule[1] - end - - def protect_against_forgery? - false - end -end From 7d0c716366a0e38fc01f89b793ec886c35766e18 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Fri, 13 Jul 2012 20:55:40 -0500 Subject: [PATCH 26/41] Fix a few typos in the comment --- app/controllers/application_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 88f4174b..34513f9c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -127,8 +127,8 @@ class ApplicationController < ActionController::Base # Here's the concept behind this "mobile content negotiation" hack: In # addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature - # 'mobile' version designed to be suitablef or use from a phone or PDA. It - # makes some sense that tne pages of that mobile version are simply alternate + # 'mobile' version designed to be suitable for use from a phone or PDA. It + # makes some sense that the pages of that mobile version are simply alternate # representations of the same Todo resources. The implementation goal was to # treat mobile as another format and be able to use respond_to to render both # versions. Unfortunately, I ran into a lot of trouble simply registering a From 82bb67f518b5c5b5d244c9fa66cc6040251ab83a Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Thu, 12 Jul 2012 13:14:21 +0200 Subject: [PATCH 27/41] small refactorings --- app/controllers/integrations_controller.rb | 53 +++++----------- app/helpers/application_helper.rb | 71 ++++++++-------------- app/helpers/contexts_helper.rb | 12 +--- app/helpers/projects_helper.rb | 25 +------- app/models/message_gateway.rb | 2 +- lib/is_taggable.rb | 28 +++++---- 6 files changed, 61 insertions(+), 130 deletions(-) diff --git a/app/controllers/integrations_controller.rb b/app/controllers/integrations_controller.rb index 219068f5..dcc86187 100644 --- a/app/controllers/integrations_controller.rb +++ b/app/controllers/integrations_controller.rb @@ -10,20 +10,17 @@ class IntegrationsController < ApplicationController def rest_api @page_title = 'TRACKS::REST API Documentation' end - + def get_quicksilver_applescript - context = current_user.contexts.find params[:context_id] - render :partial => 'quicksilver_applescript', :locals => { :context => context } + get_applescript('quicksilver_applescript') end def get_applescript1 - context = current_user.contexts.find params[:context_id] - render :partial => 'applescript1', :locals => { :context => context } + get_applescript('applescript1') end def get_applescript2 - context = current_user.contexts.find params[:context_id] - render :partial => 'applescript2', :locals => { :context => context } + get_applescript('applescript2') end def search_plugin @@ -46,38 +43,18 @@ class IntegrationsController < ApplicationController return false end - # parse message - message = Mail.new(params[:message]) - - # find user - user = User.where("preferences.sms_email = ?", message.from).includes(:preference).first - if user.nil? - render :text => "No user found", :status => 404 - return false - end - - # load user settings - context = user.prefs.sms_context - - # prepare body - if message.body.multipart? - body = message.body.preamble + if MessageGateway::receive(Mail.new(params[:message])) + render :text => 'success', :status => 200 else - body = message.body.to_s + render :text => "No user found or other error", :status => 404 end - - # parse mail - if message.subject.to_s.empty? - description = body - notes = nil - else - description = message.subject.to_s - notes = body - end - - # create todo - todo = Todo.from_rich_message(user, context.id, description, notes) - todo.save! - render :text => 'success', :status => 200 end + + private + + def get_applescript(partial_name) + context = current_user.contexts.find params[:context_id] + render :partial => partial_name, :locals => { :context => context } + end + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index b03d773e..ea28e310 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2,27 +2,12 @@ # application. module ApplicationHelper - # Replicates the link_to method but also checks request.request_uri to find - # current page. If that matches the url, the link is marked id = "current" - # def navigation_link(name, options = {}, html_options = nil, *parameters_for_method_reference) link_to name, options, html_options - # TODO: check if this needs to be converted - # if html_options - # html_options = html_options.stringify_keys - # convert_options_to_javascript!(html_options) - # tag_options = tag_options(html_options) - # else - # tag_options = nil - # end - # url = options.is_a?(String) ? options : self.url_for(options, *parameters_for_method_reference) - # id_tag = (request.request_uri == url) ? " id=\"current\"" : "" - # - # "#{name || url}" end def days_from_today(date) - Integer (date.in_time_zone.to_date - current_user.time.to_date) + (date.in_time_zone.to_date - current_user.time.to_date).to_i end # Check due date in comparison to today's date Flag up date appropriately with @@ -123,8 +108,7 @@ module ApplicationHelper end def link_to_edit_note (note, descriptor = sanitize(note.id.to_s)) - link_to(descriptor, - url_for({:controller => 'notes', :action => 'edit', :id => note.id}), + link_to(descriptor, edit_notes_path(note), {:id => "link_edit_#{dom_id(note)}", :class => "note_edit_settings"}) end @@ -133,30 +117,30 @@ module ApplicationHelper end def item_link_to_context(item) - descriptor = "[C]" - descriptor = "[#{item.context.name}]" if prefs.verbose_action_descriptors - link_to_context( item.context, descriptor ) + link_to_context( item.context, prefs.verbose_action_descriptors ? "[#{item.context.name}]" : "[C]" ) end def item_link_to_project(item) - descriptor = "[P]" - descriptor = "[#{item.project.name}]" if prefs.verbose_action_descriptors - link_to_project( item.project, descriptor ) + link_to_project( item.project, prefs.verbose_action_descriptors ? "[#{item.project.name}]" : "[P]" ) end def render_flash render :partial => 'shared/flash', :object => flash end + def time_span_text(date, i18n_text) + return (date ? "#{i18n_text} #{format_date(date)}" : "").html_safe + end + def recurrence_time_span(rt) case rt.ends_on when "no_end_date" - return rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from) + return time_span_text(rt.start_from, I18n.t("todos.recurrence.pattern.from")) when "ends_on_number_of_times" return I18n.t("todos.recurrence.pattern.times", :number => rt.number_of_occurences) when "ends_on_end_date" - starts = rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from) - ends = rt.end_date.nil? ? "" : " " + I18n.t("todos.recurrence.pattern.until") + " " + format_date(rt.end_date) + starts = time_span_text(rt.start_from, I18n.t("todos.recurrence.pattern.from")) + ends = time_span_text(rt.end_date, I18n.t("todos.recurrence.pattern.until")) return starts+ends else raise Exception.new, "unknown recurrence time span selection (#{rt.ends_on})" @@ -166,17 +150,15 @@ module ApplicationHelper def recurrence_pattern_as_text(recurring_todo) rt = recurring_todo.recurring_target_as_text rp = recurring_todo.recurrence_pattern - # only add space if recurrence_pattern has content - rp = " " + rp if !rp.nil? + rp = " " + rp unless rp.nil? rts = recurrence_time_span(recurring_todo) # only add space if recurrence_time_span has content - rts = " " + rts if !(rts == "") + rts = " " + rts unless rts == "" return rt+rp+rts end def date_format_for_date_picker() - standard_format = current_user.prefs.date_format - translations = [ + [ ['%m', 'mm'], ['%b', 'M'], ['%B', 'MM'], @@ -185,25 +167,24 @@ module ApplicationHelper ['%A', 'DD'], ['%y', 'y'], ['%Y', 'yy'] - ] - translations.inject(standard_format) do |str, translation| - str.gsub(*translation) - end + ].inject(current_user.prefs.date_format) { |str, translation| str.gsub(*translation) } end def sidebar_html_for_titled_list (list, title) return content_tag(:h3, title+" (#{list.size})") + content_tag(:ul, sidebar_html_for_list(list)) end + def link_to_sidebar_item(item) + item.is_a?(Project) ? link_to_project( item ) : link_to_context( item ) + end + + def sidebar_html_for_item(item) + content_tag(:li, link_to_sidebar_item(item) + " (" + count_undone_todos_phrase(item)+")") + end + def sidebar_html_for_list(list) - if list.empty? - return content_tag(:li, t('sidebar.list_empty')).html_safe - else - return list.inject("") do |html, item| - link = item.is_a?(Project) ? link_to_project( item ) : link_to_context(item) - html << content_tag(:li, link + " (" + count_undone_todos_phrase(item)+")") - end.html_safe - end + return content_tag(:li, t('sidebar.list_empty')).html_safe if list.empty? + return list.inject("") { |html, item| html << sidebar_html_for_item(item) }.html_safe end def generate_i18n_strings @@ -230,7 +211,7 @@ module ApplicationHelper def javascript_tag_for_i18n_datepicker locale = I18n.locale # do not include en as locale since this the available by default - if locale and locale != :en + if locale && locale != :en javascript_include_tag("i18n/jquery.ui.datepicker-#{locale}.js") end end diff --git a/app/helpers/contexts_helper.rb b/app/helpers/contexts_helper.rb index 423d18ad..0ec1793a 100644 --- a/app/helpers/contexts_helper.rb +++ b/app/helpers/contexts_helper.rb @@ -1,14 +1,5 @@ module ContextsHelper - def get_listing_sortable_options - { - :tag => 'div', - :handle => 'handle', - :complete => visual_effect(:highlight, 'list-contexts'), - :url => order_contexts_path - } - end - def link_to_delete_context(context, descriptor = sanitize(context.name)) link_to(descriptor, context_path(context, :format => 'js'), @@ -21,8 +12,7 @@ module ContextsHelper end def link_to_edit_context (context, descriptor = sanitize(context.name)) - link_to(descriptor, - url_for({:controller => 'contexts', :action => 'edit', :id => context.id}), + link_to(descriptor, edit_context_path(context), { :id => "link_edit_#{dom_id(context)}", :class => "context_edit_settings icon" diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 44b7609c..15364485 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -1,22 +1,5 @@ module ProjectsHelper - def get_listing_sortable_options(list_container_id) - { - :tag => 'div', - :handle => 'handle', - :complete => visual_effect(:highlight, list_container_id), - :url => order_projects_path - } - end - - def set_element_visible(id,test) - if (test) - page.show id - else - page.hide id - end - end - def project_next_prev html = "" if @previous_project @@ -33,11 +16,11 @@ module ProjectsHelper def project_next_prev_mobile prev_project,next_project= "", "" - unless @previous_project.nil? + if @previous_project project_name = truncate(@previous_project.name, :length => 40, :omission => "...") prev_project = content_tag(:li, link_to_project_mobile(@previous_project, "5", project_name), :class=>"prev") end - unless @next_project.nil? + if @next_project project_name = truncate(@next_project.name, :length => 40, :omission => "...") next_project = content_tag(:li, link_to_project_mobile(@next_project, "6", project_name), :class=>"next") end @@ -58,8 +41,7 @@ module ProjectsHelper end def link_to_edit_project (project, descriptor = sanitize(project.name)) - link_to(descriptor, - url_for({:controller => 'projects', :action => 'edit', :id => project.id}), + link_to(descriptor, edit_project_path(project), { :id => "link_edit_#{dom_id(project)}", :class => "project_edit_settings icon" @@ -72,7 +54,6 @@ module ProjectsHelper project_description += content_tag(:p, "#{count_undone_todos_phrase(p)}. #{t('projects.project_state', :state => project.state)}".html_safe ) - raw project_description end def needsreview_class(item) diff --git a/app/models/message_gateway.rb b/app/models/message_gateway.rb index eaea3818..43248afc 100644 --- a/app/models/message_gateway.rb +++ b/app/models/message_gateway.rb @@ -4,7 +4,7 @@ class MessageGateway < ActionMailer::Base def receive(email) user = get_user_from_email_address(email) - return if user.nil? + return false if user.nil? context = user.prefs.sms_context description = nil diff --git a/lib/is_taggable.rb b/lib/is_taggable.rb index 2308a0b6..73caf339 100644 --- a/lib/is_taggable.rb +++ b/lib/is_taggable.rb @@ -62,24 +62,26 @@ module IsTaggable outgoing = tag_cast_to_string(outgoing) tags.delete(*(tags.select{|tag| outgoing.include? tag.name})) end + + def get_tag_name_from_item(item) + case item + # removed next line as it prevents using numbers as tags + # when /^\d+$/, Fixnum then Tag.find(item).name # This will be slow if you use ids a lot. + when Tag + item.name + when String + item + else + raise "Invalid type" + end + end def tag_cast_to_string obj case obj when Array - obj.map! do |item| - case item - # removed next line as it prevents using numbers as tags - # when /^\d+$/, Fixnum then Tag.find(item).name # This will be slow if you use ids a lot. - when Tag then item.name - when String then item - else - raise "Invalid type" - end - end + obj.map! { |item| get_tag_name_from_item(item) } when String - obj = obj.split(Tag::DELIMITER).map do |tag_name| - tag_name.strip.squeeze(" ") - end + obj.split(Tag::DELIMITER).map { |tag_name| tag_name.strip.squeeze(" ") } else raise "Invalid object of class #{obj.class} as tagging method parameter" end.flatten.compact.map(&:downcase).uniq From e03c52131421da6b6e29e4653d6f274e8eb9558d Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Thu, 12 Jul 2012 23:33:36 +0200 Subject: [PATCH 28/41] fix regressions in cucumber tests. Add basis test for notes page --- app/helpers/application_helper.rb | 2 +- features/mobile_edit_a_todo.feature | 3 +-- test/functional/notes_controller_test.rb | 16 ++++++---------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ea28e310..40a7e01f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -108,7 +108,7 @@ module ApplicationHelper end def link_to_edit_note (note, descriptor = sanitize(note.id.to_s)) - link_to(descriptor, edit_notes_path(note), + link_to(descriptor, edit_note_path(note), {:id => "link_edit_#{dom_id(note)}", :class => "note_edit_settings"}) end diff --git a/features/mobile_edit_a_todo.feature b/features/mobile_edit_a_todo.feature index 46a6cf42..7bc29910 100644 --- a/features/mobile_edit_a_todo.feature +++ b/features/mobile_edit_a_todo.feature @@ -14,14 +14,13 @@ Feature: Edit a next action from the mobile view | context | description | | @mobile | test action | - Scenario: I can edit an action on the mobile page When I am on the home page Then the badge should show 1 And I should see "test action" When I follow "test action" Then I should see "Actions" - When I press "Edit this action" + When I press "Edit action" Then I should see "Description" And I fill in "Description" with "changed action" And I press "Update" diff --git a/test/functional/notes_controller_test.rb b/test/functional/notes_controller_test.rb index f03eb896..84882665 100644 --- a/test/functional/notes_controller_test.rb +++ b/test/functional/notes_controller_test.rb @@ -1,18 +1,14 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper') -require 'notes_controller' - -# Re-raise errors caught by the controller. -class NotesController; def rescue_action(e) raise e end; end class NotesControllerTest < ActionController::TestCase + def setup - @controller = NotesController.new - request = ActionController::TestRequest.new - response = ActionController::TestResponse.new end - # Replace this with your real tests. - def test_truth - assert true + def test_get_notes_page + login_as :admin_user + get :index + assert_response 200 end + end From 80e47b94b09c62707b9463b6b0f59cb3929bbbc7 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Fri, 13 Jul 2012 00:28:06 +0200 Subject: [PATCH 29/41] fix timezone issue try testing at 00:30 --- test/functional/preferences_controller_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/preferences_controller_test.rb b/test/functional/preferences_controller_test.rb index f8b7f3bb..46063bdc 100644 --- a/test/functional/preferences_controller_test.rb +++ b/test/functional/preferences_controller_test.rb @@ -18,11 +18,11 @@ class PreferencesControllerTest < ActionController::TestCase get :render_date_format assert_response :success - assert_equal I18n.l(Time.zone.now, :format => "%Y-%m-%d"), @response.body + assert_equal I18n.l(Date.today, :format => "%Y-%m-%d"), @response.body get(:render_date_format, {:date_format => "%A %Y"}) assert_response :success - assert_equal I18n.l(Time.zone.now, :format => "%A %Y"), @response.body + assert_equal I18n.l(Date.today, :format => "%A %Y"), @response.body end test "index page requires login" do From 885ee7d1d16cb68d71a19e6c15eb5933722ae101 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Fri, 13 Jul 2012 00:31:11 +0200 Subject: [PATCH 30/41] refactorings for recurring todo model --- app/models/recurring_todo.rb | 230 +++++++++++++++-------------------- app/models/todo.rb | 4 - lib/is_taggable.rb | 4 + 3 files changed, 101 insertions(+), 137 deletions(-) diff --git a/app/models/recurring_todo.rb b/app/models/recurring_todo.rb index 88f328a2..def17a7a 100644 --- a/app/models/recurring_todo.rb +++ b/app/models/recurring_todo.rb @@ -1,17 +1,16 @@ class RecurringTodo < ActiveRecord::Base + attr_protected :user belongs_to :context belongs_to :project belongs_to :user has_many :todos - - include IsTaggable scope :active, :conditions => { :state => 'active'} scope :completed, :conditions => { :state => 'completed'} - attr_protected :user + include IsTaggable include AASM aasm_column :state @@ -50,31 +49,29 @@ class RecurringTodo < ActiveRecord::Base end def validate_daily - if (!only_work_days) && (daily_every_x_days.nil? || daily_every_x_days.blank?) + if (!only_work_days) && daily_every_x_days.blank? errors[:base] << "Every other nth day may not be empty for recurrence setting" end end def validate_weekly - if weekly_every_x_week.nil? || weekly_every_x_week.blank? + if weekly_every_x_week.blank? errors[:base] << "Every other nth week may not be empty for recurrence setting" end something_set = false - %w{sunday monday tuesday wednesday thursday friday saturday}.each do |day| - something_set ||= self.send("on_#{day}") - end - errors[:base] << "You must specify at least one day on which the todo recurs" if !something_set + %w{sunday monday tuesday wednesday thursday friday saturday}.each { |day| something_set ||= self.send("on_#{day}") } + errors[:base] << "You must specify at least one day on which the todo recurs" unless something_set end def validate_monthly case recurrence_selector when 0 # 'monthly_every_x_day' - errors[:base] << "The day of the month may not be empty for recurrence setting" if monthly_every_x_day.nil? || monthly_every_x_day.blank? - errors[:base] << "Every other nth month may not be empty for recurrence setting" if monthly_every_x_month.nil? || monthly_every_x_month.blank? + errors[:base] << "The day of the month may not be empty for recurrence setting" if monthly_every_x_day.blank? + errors[:base] << "Every other nth month may not be empty for recurrence setting" if monthly_every_x_month.blank? when 1 # 'monthly_every_xth_day' - errors[:base] <<"Every other nth month may not be empty for recurrence setting" if monthly_every_x_month2.nil? || monthly_every_x_month2.blank? - errors[:base] <<"The nth day of the month may not be empty for recurrence setting" if monthly_every_xth_day.nil? || monthly_every_xth_day.blank? - errors[:base] <<"The day of the month may not be empty for recurrence setting" if monthly_day_of_week.nil? || monthly_day_of_week.blank? + errors[:base] <<"Every other nth month may not be empty for recurrence setting" if monthly_every_x_month2.blank? + errors[:base] <<"The nth day of the month may not be empty for recurrence setting" if monthly_every_xth_day.blank? + errors[:base] <<"The day of the month may not be empty for recurrence setting" if monthly_day_of_week.blank? else raise Exception.new, "unexpected value of recurrence selector '#{self.recurrence_selector}'" end @@ -83,24 +80,24 @@ class RecurringTodo < ActiveRecord::Base def validate_yearly case recurrence_selector when 0 # 'yearly_every_x_day' - errors[:base] << "The month of the year may not be empty for recurrence setting" if yearly_month_of_year.nil? || yearly_month_of_year.blank? - errors[:base] << "The day of the month may not be empty for recurrence setting" if yearly_every_x_day.nil? || yearly_every_x_day.blank? + errors[:base] << "The month of the year may not be empty for recurrence setting" if yearly_month_of_year.blank? + errors[:base] << "The day of the month may not be empty for recurrence setting" if yearly_every_x_day.blank? when 1 # 'yearly_every_xth_day' - errors[:base] << "The month of the year may not be empty for recurrence setting" if yearly_month_of_year2.nil? || yearly_month_of_year2.blank? - errors[:base] << "The nth day of the month may not be empty for recurrence setting" if yearly_every_xth_day.nil? || yearly_every_xth_day.blank? - errors[:base] << "The day of the week may not be empty for recurrence setting" if yearly_day_of_week.nil? || yearly_day_of_week.blank? + errors[:base] << "The month of the year may not be empty for recurrence setting" if yearly_month_of_year2.blank? + errors[:base] << "The nth day of the month may not be empty for recurrence setting" if yearly_every_xth_day.blank? + errors[:base] << "The day of the week may not be empty for recurrence setting" if yearly_day_of_week.blank? else raise Exception.new, "unexpected value of recurrence selector '#{self.recurrence_selector}'" end end def starts_and_ends_on_validations - errors[:base] << "The start date needs to be filled in" if start_from.nil? || start_from.blank? + errors[:base] << "The start date needs to be filled in" if start_from.blank? case self.ends_on when 'ends_on_number_of_times' - errors[:base] << "The number of recurrences needs to be filled in for 'Ends on'" if number_of_occurences.nil? || number_of_occurences.blank? + errors[:base] << "The number of recurrences needs to be filled in for 'Ends on'" if number_of_occurences.blank? when "ends_on_end_date" - errors[:base] << "The end date needs to be filled in for 'Ends on'" if end_date.nil? || end_date.blank? + errors[:base] << "The end date needs to be filled in for 'Ends on'" if end_date.blank? else errors[:base] << "The end of the recurrence is not selected" unless ends_on == "no_end_date" end @@ -114,7 +111,7 @@ class RecurringTodo < ActiveRecord::Base when 'due_date' errors[:base] << "Please select when to show the action" if show_always.nil? unless show_always - errors[:base] << "Please fill in the number of days to show the todo before the due date" if show_from_delta.nil? || show_from_delta.blank? + errors[:base] << "Please fill in the number of days to show the todo before the due date" if show_from_delta.blank? end else raise Exception.new, "unexpected value of recurrence target selector '#{self.recurrence_target}'" @@ -157,9 +154,7 @@ class RecurringTodo < ActiveRecord::Base end def daily_every_x_days=(x) - if recurring_period=='daily' - self.every_other1 = x - end + self.every_other1 = x if recurring_period=='daily' end def daily_every_x_days @@ -177,9 +172,7 @@ class RecurringTodo < ActiveRecord::Base end def switch_week_day (day, position) - if self.every_day.nil? - self.every_day=' ' - end + self.every_day = ' ' if self.every_day.nil? self.every_day = self.every_day[0,position] + day + self.every_day[position+1,self.every_day.length] end @@ -250,9 +243,7 @@ class RecurringTodo < ActiveRecord::Base # MONTHLY def monthly_selector=(selector) - if recurring_period=='monthly' - self.recurrence_selector= (selector=='monthly_every_x_day')? 0 : 1 - end + self.recurrence_selector = ( (selector=='monthly_every_x_day') ? 0 : 1) if recurring_period=='monthly' end def monthly_every_x_day=(x) @@ -280,11 +271,7 @@ class RecurringTodo < ActiveRecord::Base def monthly_every_x_month # in case monthly pattern is every day x, return every_other2 otherwise # return a default value - if self.recurrence_selector == 0 - return self.every_other2 - else - return 1 - end + return self.recurrence_selector == 0 ? self.every_other2 : 1 end def monthly_every_x_month2=(x) @@ -294,11 +281,7 @@ class RecurringTodo < ActiveRecord::Base def monthly_every_x_month2 # in case monthly pattern is every xth day, return every_other2 otherwise # return a default value - if self.recurrence_selector == 1 - return self.every_other2 - else - return 1 - end + return self.recurrence_selector == 1 ? self.every_other2 : 1 end def monthly_every_xth_day=(x) @@ -321,9 +304,7 @@ class RecurringTodo < ActiveRecord::Base # YEARLY def yearly_selector=(selector) - if recurring_period=='yearly' - self.recurrence_selector = (selector=='yearly_every_x_day') ? 0 : 1 - end + self.recurrence_selector = ( (selector=='yearly_every_x_day') ? 0 : 1) if recurring_period=='yearly' end def yearly_month_of_year=(moy) @@ -333,11 +314,7 @@ class RecurringTodo < ActiveRecord::Base def yearly_month_of_year # if recurrence pattern is every x day in a month, return month otherwise # return a default value - if self.recurrence_selector == 0 - return self.every_other2 - else - return Time.zone.now.month - end + return self.recurrence_selector == 0 ? self.every_other2 : Time.zone.now.month end def yearly_month_of_year2=(moy) @@ -347,11 +324,7 @@ class RecurringTodo < ActiveRecord::Base def yearly_month_of_year2 # if recurrence pattern is every xth day in a month, return month otherwise # return a default value - if self.recurrence_selector == 1 - return self.every_other2 - else - return Time.zone.now.month - end + return self.recurrence_selector == 1 ? self.every_other2 : Time.zone.now.month end def yearly_every_x_day=(x) @@ -403,51 +376,60 @@ class RecurringTodo < ActiveRecord::Base self.show_always=value end + def daily_recurrence_pattern + return I18n.t("todos.recurrence.pattern.on_work_days") if only_work_days + if every_other1 > 1 + return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.days_midsentence.other") + else + return I18n.t("todos.recurrence.pattern.every_day") + end + end + + def weekly_recurrence_pattern + if every_other1 > 1 + return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.weeks") + else + return I18n.t('todos.recurrence.pattern.weekly') + end + end + + def monthly_recurrence_pattern + return "invalid repeat pattern" if every_other2.nil? + if self.recurrence_selector == 0 + on_day = " #{I18n.t('todos.recurrence.pattern.on_day_n', :n => self.every_other1)}" + if self.every_other2>1 + return I18n.t("todos.recurrence.pattern.every_n", :n => self.every_other2) + " " + I18n.t('common.months') + on_day + else + return I18n.t("todos.recurrence.pattern.every_month") + on_day + end + else + if self.every_other2>1 + n_months = "#{self.every_other2} #{I18n.t('common.months')}" + else + n_months = I18n.t('common.month') + end + return I18n.t('todos.recurrence.pattern.every_xth_day_of_every_n_months', + :x => self.xth, :day => self.day_of_week, :n_months => n_months) + end + end + + def yearly_recurrence_pattern + if self.recurrence_selector == 0 + return I18n.t("todos.recurrence.pattern.every_year_on", + :date => I18n.l(DateTime.new(Time.zone.now.year, self.every_other2, self.every_other1), :format => :month_day)) + else + return I18n.t("todos.recurrence.pattern.every_year_on", + :date => I18n.t("todos.recurrence.pattern.the_xth_day_of_month", :x => self.xth, :day => self.day_of_week, :month => self.month_of_year)) + end + end + def recurrence_pattern return "invalid repeat pattern" if every_other1.nil? case recurring_period - when 'daily' - if only_work_days - return I18n.t("todos.recurrence.pattern.on_work_days") - else - if every_other1 > 1 - return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.days_midsentence.other") - else - return I18n.t("todos.recurrence.pattern.every_day") - end - end - when 'weekly' - if every_other1 > 1 - return I18n.t("todos.recurrence.pattern.every_n", :n => every_other1) + " " + I18n.t("common.weeks") - else - return I18n.t('todos.recurrence.pattern.weekly') - end - when 'monthly' - return "invalid repeat pattern" if every_other2.nil? - if self.recurrence_selector == 0 - on_day = " " + I18n.t('todos.recurrence.pattern.on_day_n', :n => self.every_other1) - if self.every_other2>1 - return I18n.t("todos.recurrence.pattern.every_n", :n => self.every_other2) + " " + I18n.t('common.months') + on_day - else - return I18n.t("todos.recurrence.pattern.every_month") + on_day - end - else - if self.every_other2>1 - n_months = "#{self.every_other2} #{I18n.t('common.months')}" - else - n_months = I18n.t('common.month') - end - return I18n.t('todos.recurrence.pattern.every_xth_day_of_every_n_months', - :x => self.xth, :day => self.day_of_week, :n_months => n_months) - end - when 'yearly' - if self.recurrence_selector == 0 - return I18n.t("todos.recurrence.pattern.every_year_on", - :date => I18n.l(DateTime.new(Time.zone.now.year, self.every_other2, self.every_other1), :format => :month_day)) - else - return I18n.t("todos.recurrence.pattern.every_year_on", - :date => I18n.t("todos.recurrence.pattern.the_xth_day_of_month", :x => self.xth, :day => self.day_of_week, :month => self.month_of_year)) - end + when 'daily' then daily_recurrence_pattern + when 'weekly' then weekly_recurrence_pattern + when 'monthly' then monthly_recurrence_pattern + when 'yearly' then yearly_recurrence_pattern else return 'unknown recurrence pattern: period unknown' end @@ -461,7 +443,7 @@ class RecurringTodo < ActiveRecord::Base end def day_of_week - return (self.every_count.nil? ? '??' : I18n.t('todos.recurrence.pattern.day_names')[self.every_count]) + return self.every_count.nil? ? '??' : I18n.t('todos.recurrence.pattern.day_names')[self.every_count] end def month_of_year @@ -472,10 +454,6 @@ class RecurringTodo < ActiveRecord::Base return has_tag?(Todo::STARRED_TAG_NAME) end - def has_tag?(tag_name) - return self.tags.any? {|tag| tag.name == tag_name} - end - def get_due_date(previous) case self.target when 'due_date' @@ -492,14 +470,10 @@ class RecurringTodo < ActiveRecord::Base case self.target when 'due_date' # so set show from date relative to due date unless show_always is true or show_from_delta is nil - if self.show_always? or self.show_from_delta.nil? - nil - else - get_due_date(previous) - self.show_from_delta.days - end + (self.show_always? || self.show_from_delta.nil?) ? nil : get_due_date(previous) - self.show_from_delta.days when 'show_from_date' # Leave due date empty - return get_next_date(previous) + get_next_date(previous) else raise Exception.new, "unexpected value of recurrence target '#{self.target}'" end @@ -507,14 +481,10 @@ class RecurringTodo < ActiveRecord::Base def get_next_date(previous) case self.recurring_period - when 'daily' - return get_daily_date(previous) - when 'weekly' - return get_weekly_date(previous) - when 'monthly' - return get_monthly_date(previous) - when 'yearly' - return get_yearly_date(previous) + when 'daily' then get_daily_date(previous) + when 'weekly' then get_weekly_date(previous) + when 'monthly' then get_monthly_date(previous) + when 'yearly' then get_yearly_date(previous) else raise Exception.new, "unknown recurrence pattern: '#{self.recurring_period}'" end @@ -689,21 +659,16 @@ class RecurringTodo < ActiveRecord::Base end def has_next_todo(previous) - unless self.number_of_occurences.nil? - return self.occurences_count < self.number_of_occurences + return self.occurences_count < self.number_of_occurences unless self.number_of_occurences.nil? + return true if self.end_date.nil? || self.ends_on == 'no_end_date' + + case self.target + when 'due_date' + return get_due_date(previous) <= self.end_date + when 'show_from_date' + return get_show_from_date(previous) <= self.end_date else - if self.end_date.nil? || self.ends_on == 'no_end_date' - return true - else - case self.target - when 'due_date' - return get_due_date(previous) <= self.end_date - when 'show_from_date' - return get_show_from_date(previous) <= self.end_date - else - raise Exception.new, "unexpected value of recurrence target '#{self.target}'" - end - end + raise Exception.new, "unexpected value of recurrence target '#{self.target}'" end end @@ -713,12 +678,11 @@ class RecurringTodo < ActiveRecord::Base def toggle_star! if starred? - _remove_tags Todo::STARRED_TAG_NAME - tags.reload + _remove_tags(Todo::STARRED_TAG_NAME) else _add_tags(Todo::STARRED_TAG_NAME) - tags.reload end + tags.reload starred? end diff --git a/app/models/todo.rb b/app/models/todo.rb index e43d8842..53cc99a9 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -204,10 +204,6 @@ class Todo < ActiveRecord::Base return !pending_successors.empty? end - def has_tag?(tag_name) - return self.tags.any? {|tag| tag.name == tag_name} - end - def hidden? return self.state == 'project_hidden' || ( self.context.hidden? && (self.state == 'active' || self.state == 'deferred')) end diff --git a/lib/is_taggable.rb b/lib/is_taggable.rb index 73caf339..6e82dc5a 100644 --- a/lib/is_taggable.rb +++ b/lib/is_taggable.rb @@ -39,6 +39,10 @@ module IsTaggable self end + def has_tag?(tag_name) + return tags.any? {|tag| tag.name == tag_name} + end + # Add tags to self. Accepts a string of tagnames, an array of tagnames, or an array of Tags. # # We need to avoid name conflicts with the built-in ActiveRecord association methods, thus the underscores. From 0d854efbbb2e4559363fe1c9aeee353de636d912 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Fri, 13 Jul 2012 01:53:30 +0200 Subject: [PATCH 31/41] fix #1288. Drag and drop should work on touch screens. Also upgrade jquery-ui --- app/assets/javascripts/application.js | 3 +- .../jquery-ui-1.8.17.custom.min.js | 356 ------------------ .../jquery-ui-1.8.21.custom.min.js | 125 ++++++ .../javascripts/jquery.ui.touch-punch.min.js | 11 + .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 180 -> 211 bytes .../ui-bg_gloss-wave_70_ffdd57_500x100.png | Bin 3830 -> 3122 bytes .../images/ui-icons_3d3d3d_256x240.png | Bin 5355 -> 4369 bytes .../images/ui-icons_d19405_256x240.png | Bin 5355 -> 4369 bytes .../images/ui-icons_ed9f26_256x240.png | Bin 5355 -> 4369 bytes ...custom.css => jquery-ui-1.8.21.custom.css} | 76 ++-- 10 files changed, 176 insertions(+), 395 deletions(-) delete mode 100644 vendor/assets/javascripts/jquery-ui-1.8.17.custom.min.js create mode 100644 vendor/assets/javascripts/jquery-ui-1.8.21.custom.min.js create mode 100644 vendor/assets/javascripts/jquery.ui.touch-punch.min.js rename vendor/assets/stylesheets/{jquery-ui-1.8.17.custom.css => jquery-ui-1.8.21.custom.css} (96%) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index be027979..74bb0e45 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -17,7 +17,8 @@ //= require tracks.js // Stuff in vendor/assets -//= require jquery-ui-1.8.17.custom.min +//= require jquery-ui-1.8.21.custom.min +//= require jquery.ui.touch-punch.min //= require jquery.blockUI //= require jquery.cookie //= require jquery.form diff --git a/vendor/assets/javascripts/jquery-ui-1.8.17.custom.min.js b/vendor/assets/javascripts/jquery-ui-1.8.17.custom.min.js deleted file mode 100644 index 991cb8d0..00000000 --- a/vendor/assets/javascripts/jquery-ui-1.8.17.custom.min.js +++ /dev/null @@ -1,356 +0,0 @@ -/*! - * jQuery UI 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.17",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/* - * jQuery UI Position 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Position - */(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1];return this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]!==e){var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0}},top:function(b,c){if(c.at[1]!==e){var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];if(!c||!c.ownerDocument)return null;if(b)return this.each(function(){a.offset.setOffset(this,b)});return h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&jQuery.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);/* - * jQuery UI Draggable 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!!this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy();return this}},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();droppablesLoop:for(var g=0;g
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e
');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),a.browser.opera&&/relative/.test(f.css("position"))&&f.css({position:"relative",top:"auto",left:"auto"}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d
');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.17"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10),position:b.css("position")})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,e){a(b).each(function(){var b=a(this),f=a(this).data("resizable-alsoresize"),g={},i=e&&e.length?e:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(i,function(a,b){var c=(f[b]||0)+(h[b]||0);c&&c>=0&&(g[b]=c||null)}),a.browser.opera&&/relative/.test(b.css("position"))&&(d._revertToRelativePosition=!0,b.css({position:"absolute",top:"auto",left:"auto"})),b.css(g)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.css({position:b.data("resizable-alsoresize").position})})};d._revertToRelativePosition&&(d._revertToRelativePosition=!1,typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)),a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);/* - * jQuery UI Selectable 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy();return this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(!this.options.disabled){var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element});return!1}})}},_mouseDrag:function(b){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!!i&&i.element!=c.element[0]){var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");(b.autoHeight||b.fillHeight)&&c.css("height","");return a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(!(this.options.disabled||b.altKey||b.ctrlKey)){var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}if(f){a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus();return!1}return!0}},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];this._clickHandler({target:b},b);return this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(!d.disabled){if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return}},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!!g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;this.running||(this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data))}}),a.extend(a.ui.accordion,{version:"1.8.17",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size())b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);else{if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})}},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);/* - * jQuery UI Autocomplete 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!b.options.disabled&&!b.element.propAttr("readOnly")){d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._move("previous",c),c.preventDefault();break;case e.DOWN:b._move("next",c),c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){b.options.disabled||(b.selectedItem=null,b.previous=b.element.val())}).bind("blur.autocomplete",function(a){b.options.disabled||(clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150))}),this._initSource(),this.response=function(){return b._response.apply(b,arguments)},this.menu=a("
    ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,d,e;a.isArray(this.options.source)?(d=this.options.source,this.source=function(b,c){c(a.ui.autocomplete.filter(d,b.term))}):typeof this.options.source=="string"?(e=this.options.source,this.source=function(d,f){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:e,data:d,dataType:"json",autocompleteRequest:++c,success:function(a,b){this.autocompleteRequest===c&&f(a)},error:function(){this.autocompleteRequest===c&&f([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible"))this.search(null,b);else{if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)}},widget:function(){return this.menu.element}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){!a(c.target).closest(".ui-menu-item a").length||(c.preventDefault(),b.select(c))}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){!this.active||(this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null)},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active)this.activate(c,this.element.children(b));else{var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))}},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10}),result.length||(result=this.element.children(".ui-menu-item:first")),this.activate(b,result)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);/* - * jQuery UI Dialog 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
    ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){b.close(a);return!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1!==c._trigger("beforeClose",b)){c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d);return c}},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;if(e.modal&&!b||!e.stack&&!e.modal)return d._trigger("focus",c);e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c);return d},open:function(){if(!this._isOpen){var b=this,c=b.options,d=b.uiDialog;b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode===a.ui.keyCode.TAB){var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey){d.focus(1);return!1}if(b.target===d[0]&&b.shiftKey){e.focus(1);return!1}}}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open");return b}},_createButtons:function(b){var c=this,d=!1,e=a("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("
    ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){a!=="click"&&(a in f?e[a](b):e.attr(a,b))}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.17",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");b||(this.uuid+=1,b=this.uuid);return"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()
    ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});a.fn.bgiframe&&c.bgiframe(),this.instances.push(c);return c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;if(a.browser.msie&&a.browser.version<7){b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i);if(j===!1)return!1;this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0;return!0},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);this._slide(a,this._handleIndex,c);return!1},_mouseStop:function(a){this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1;return!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e;return this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values());return this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1)this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);else{if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;Math.abs(c)*2>=b&&(d+=c>0?b:-b);return parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.17"})})(jQuery);/* - * jQuery UI Tabs 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */(function(a,b){function f(){return++d}function e(){return++c}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash){e.selected=a;return!1}}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1){this.blur();return!1}e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected")){e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur();return!1}if(!f.length){e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur();return!1}}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$="+a+"]")));return a},destroy:function(){var b=this.options;this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie);return this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0]));return this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a])));return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup();return this},url:function(a,b){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.17"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}$.extend($.ui,{datepicker:{version:"1.8.17"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
    ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);c.hasClass(this.markerClassName)||(this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a))},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){$.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._showDatepicker(a[0]);return!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);c.hasClass(this.markerClassName)||(c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block"))},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f);return this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(a){$.datepicker.log(a)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if(!$.datepicker._isDisabledDatepicker(a)&&$.datepicker._lastInput!=a){var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){e|=$(this).css("position")=="fixed";return!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0);return b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=$.data(a,PROP_NAME))&&this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=this,f=function(){$.datepicker._tidyDialog(b),e._curInst=null};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,f):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,f),c||f(),this._datepickerShowing=!1;var g=this._get(b,"onClose");g&&g.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!!$.datepicker._curInst){var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);this._isDisabledDatepicker(d[0])||(this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e))},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if(!$(d).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(e[0])){var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();b.setMonth(0),b.setDate(1);return Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;for(;;){var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
    '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
    ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
    '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
    '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
    "+(j?""+(g[0]>0&&N==g[1]-1?'
    ':""):""),M+=Q}K+=M}K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1;return K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this -._get(a,"showMonthAfterYear"),l='
    ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
    ";return l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e;return e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth()));return this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)})},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.17",window["DP_jQuery_"+dpuuid]=$})(jQuery);/* - * jQuery UI Progressbar 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
    ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===b)return this._value();this._setOption("value",a);return this},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;typeof a!="number"&&(a=0);return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.17"})})(jQuery);/* - * jQuery UI Effects 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */jQuery.effects||function(a,b){function l(b){if(!b||typeof b=="number"||a.fx.speeds[b])return!0;if(typeof b=="string"&&!a.effects[b])return!0;return!1}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete;return[b,c,d,e]}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function c(b){var c;if(b&&b.constructor==Array&&b.length==3)return b;if(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)];if(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55];if(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)];if(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];if(c=/rgba\(0, 0, 0, 0\)/.exec(b))return e.transparent;return e[a.trim(b).toLowerCase()]}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){a.isFunction(d)&&(e=d,d=null);return this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class");a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.17",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"}));return d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;if(b.parent().is(".ui-effects-wrapper")){c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus();return c}return b},setTransition:function(b,c,d,e){e=e||{},a.each(c,function(a,c){unit=b.cssUnit(c),unit[0]>0&&(e[c]=unit[0]*d+unit[1])});return e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];if(a.fx.off||!i)return h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)});return i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="show";return this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="hide";return this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);c[1].mode="toggle";return this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])});return d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b+c;return-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b+c;return d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b+c;return-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b*b+c;return d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){if(b==0)return c;if(b==e)return c+d;if((b/=e/2)<1)return d/2*Math.pow(2,10*(b-1))+c;return d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){if((b/=e/2)<1)return-d/2*(Math.sqrt(1-b*b)-1)+c;return d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);/* - * jQuery UI Effects Fade 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fade - * - * Depends: - * jquery.effects.core.js - */(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/* - * jQuery UI Effects Fold 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/* - * jQuery UI Effects Highlight 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/* - * jQuery UI Effects Pulsate 1.8.17 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show");times=(b.options.times||5)*2-1,duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=c.is(":visible"),animateTo=0,isVisible||(c.css("opacity",0).show(),animateTo=1),(d=="hide"&&isVisible||d=="show"&&!isVisible)&×--;for(var e=0;e').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery); \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery-ui-1.8.21.custom.min.js b/vendor/assets/javascripts/jquery-ui-1.8.21.custom.min.js new file mode 100644 index 00000000..3fe9ccb7 --- /dev/null +++ b/vendor/assets/javascripts/jquery-ui-1.8.21.custom.min.js @@ -0,0 +1,125 @@ +/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.21",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.position.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.draggable.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.21"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.selectable.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
    ")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.21",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.autocomplete.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("
      ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.dialog.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
      ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("
      ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){if(a==="click")return;a in f?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.21",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.21"})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.tabs.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
    • #{label}
    • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.21"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.21"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
      ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
      '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
      ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
      '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
      '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
      "+(j?""+(g[0]>0&&N==g[1]-1?'
      ':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
      ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
      ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.21",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.progressbar.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
      ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.21"})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.21",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fade.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fold.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.highlight.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.pulsate.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery.ui.touch-punch.min.js b/vendor/assets/javascripts/jquery.ui.touch-punch.min.js new file mode 100644 index 00000000..bfbd04db --- /dev/null +++ b/vendor/assets/javascripts/jquery.ui.touch-punch.min.js @@ -0,0 +1,11 @@ +/* + * jQuery UI Touch Punch 0.2.2 + * + * Copyright 2011, Dave Furfero + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Depends: + * jquery.ui.widget.js + * jquery.ui.mouse.js + */ +(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery); diff --git a/vendor/assets/stylesheets/images/ui-bg_flat_50_5c5c5c_40x100.png b/vendor/assets/stylesheets/images/ui-bg_flat_50_5c5c5c_40x100.png index 5950a8db9e64e8d00bb28726cb869947abfdc7fc..2d53a676296f807d23a002af13776044ca1341c4 100644 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!N$PA*qrS22FRJ^>EalY(fIbdAz!nB$bk!& zil6t=nF^;h1YL=xP@>}$#YJ+SeqKhTv7p00i_>zopr E00qoW)Bpeg literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7&<)v zy**H+1h`CGN$!$uf#*GY+I+?j3lA z2A4^%*@%b>iq$;6x+Uw=qQ*)cBaNn5EoECv}2yho@42eV^mXt9PgVxBQ>Hvr7McI-cE zx^;?uV>|F1h#FW2>;blT0lLoQ zxuJQ8gTrEDu3D0M%RdwoH-wI7z|y8zsSx2&0!24`cW`KjDo)@S_tttn`gJH z=npt{}i-uO5);7k{w=(h z>OsLqxPZ=%l#@5tVz)I-UF6`JX*ksQlPRy;47FQjDb?)Uko*dL{Mk4++F}#g3S!mZ z)6hwuZID*&4JV_a-Y7??7==Z`8$6}@mv%^57rn7t)yl_bBu8Ohdnp=H40s|x@CC>9 zX=BvNfYu{Uf)FeZrw=xC-3rdx!LE)(r%d5Ju*g4HS971>wO=R2Bd zeSSzEx?7F@7?j;19hg@zwK}IY4{cfEI^g-PYuvxXBhO)j2~3%{KSAnw1X;Jlky%St zYwz88A_M7}4>Uzt5%+5Gkn1W&?6Uuy^F1XrodzfP9Dt0?rwmimD?^3Hb7r)<%gMw- zV&@#5P#PSexzj%GZG&JXiTNjsGw+7CdoAVV?34QvfI0Z#c1BmqiY8S;f3Ay$~cWN(NYsa;+GHSCK@lu zShM|eyhK}4A%yK^hJcfuh-!!hYvpKI?XV_K8k_12vgLegy~L+&Gdt0LDp2Y zc2FlVO6hy`2k*m%J0Uh+?j3EAO2o6l4m3A0#+>I$u?iIO!J9ngpE?Ha0uCAW{XynYhHraoZPm>9p0pNLi z2t7CVA>ytBp-f?&+KP(K-8s_wjv3pb-skjq#Ok=>NiwXF(j~d7_Z?zZHp9wvqF(tg zsD2u`sLS<0XpViI+pYO zyt=IEnlUq>+1wrM{m^IO`txkS@3#l8Os#p6Z z`ecom{6O2haM7s6UVq!V0{z*1x8VAL%wk}9HAFifJ>DF9kfv;UvK~u^$dU)t;|CQs zde^-bi{%Jz>H1D3BT3XMWhdW2yO5POJWWH27F#%S76QwkVT=-_0&u zdxDnwf^Hu{Ea`eiMY=2oCSqCACh z$U|-W|PI8OKgX6=p=rzo>yGi+^mgP#p_;kz)B1?!~$WdR(MHD zkp%ZR+CnIdh9B z)H>*xzOzWAiS*jY{R7-x(_Lkkna`$>h9KLHP;;=Cw@uxKvhW45;DL@S=!GT&qSeMDY-XbyR$cb374QqTms5q(@61!)Kz+kgtKh|Nkv%`QHy zxCw0(wNK0H^b`eruFqC8rtP-fw@DLqMH;C1k#YSX_^8BY!7Lg|rBkBYJ*IRkN zv|r*py6+H)3nmP)L>=e*SZqVcbjph7DS0+WPFIX&(<-xZ^6{O5n}^u-?$e9=D%6Gt zrzhXvtSS(Q<*l~wE9b3>v&7vyQ8?%71wxxHwgdY;A*_@vj?+?Iui_j4yct`NI+zOgjkR^ynK{a65!3N!T`R$yB@WTGQk-RCl#aI3N^vX3^n3JP+1x$T_jEV!?PJpjI2~}-zwy+i G8~*{uZE~Xk literal 3830 zcmZ{mdpy(o|G+=xob)>t->xSK9i-D?L`-2@-xDoA;iQ@~E0n9FzmLZUH6D7TGKSXtA9g|9&yLP+Ek}7BhFA+I^TwokAd| zPDKrV+B)1V%hWrd_xHZxKM@Tl(|^U9>@vm~i7wo4*lHZ{`c*}0K*7ec4fkJ#^U@ZW zj@|Onj^}0GCRr*GT$t`GTVcn)(7m94GCF2$;hUJ9g@-qbhLRdBoe7OB?c4ryql*rq zpRa$|{n#&aHfcxPU{1cDd%!(dijMNTYlAs?e(sm=!LI8lAH@q>kg)SQN@FZ&b=S#v z-U37F=KJy7k=L@%kutX&k3VIiT5ra${9)TW?PSbOE_XI&pC#tu8*lE-Zb}t&-f48+amAf!w=2%Y5qA>u;ous z1Y>`~FgN+d82l|X3fK=2HtjeDoV%I0$+uKvd!kiOt&9av4=d^qJQ+41nE&!pJ*T>= zn(PR+#K%0JvDSeYFp7#@j-YgT%}<9>jS=>C=D~Pe+hyFGBbQ8gFZPmPCOZXOEDDhj z51o(vyrqhv7hZ~V=O*MDsMsDsqk6X0j$GviWKIQjIL3)^@1!;#AuE&yRDIyk zm|aeMrWt_>`{mO1r#<|&rPTQAO3A#keqH!w9s zPLR6kgdqXl&~#!}_%c?1t@VOU?bgK<;8+8uR;a*sjdGBg_bHDjd zz-MFY1c$6%XR4yQ;AyC9=uwyH$nUq$q;&R2x!|#Qmq1gfMI}+Y7y*NSunY>%Rp3@S zpN;fx^e8J9@CxV5g@QQ8$%2^4^c3ral_U6@iFX&rlX%W>ee2xAF4^+&1&_+}Ec8>> ztjwvzf=l_|LCA<=Z?Mi)r?Rzl^ww=vlwUhN~Yzt!xMnm!DX$t)*%5gGX?k+J~1VXwsGXpoha_mO|kJtz*DAeBU15L(zh*Ex>2M zGI7%*I2CBK&@9h=EZdn66Ugai%kA*~aP-C4g0vFv^B)(I4~ zcS)%oEq|l+Uh)fdqeYvf<#y25tz<@zKTaD>X)>#Yv*dDlD?>Jv3IPjKnc?rc?xn!V zbont|U-WvqPTGNok7=hmOTSaTg^R7Y+&AOlj`aF%fB(J6)^;c*sR26g~6HPt{cMZ1a)FV4nq(Or4ab* zF?O(_p8YW0f=uuDH^oYp(&@1&%AVHr!LQYC1>yAltukUH#-x#7DLGwEwrS~iQ!>_r zpf!&-w?dU_+G{WY>{3f#0m&ipe0?B~(S+ng9E&aF-(3OkOU7n^aQIvazA>mBhxl9f$J}s2hSq7)*^%13zoTAgW zK^|ogQRr6Sc145ht!=gCV=GOCBjp4drr3gO+ZrX3Bn(5M|id)&AR^>I!od?`J)|r<&2^nvGw$hPd_=U zT#Y3(Ju!W8RoJ~aTa3RMy-(I;cF5k`c=`xB!_1?AbLLXGakd-6RO)TcEzX|_vgR!q z%0jtuZk@(xdelu_OPvRw4yQfW4kU#n%or{NTfSA?W(hxRJ_hu8+a3a1#$QRiz--Jp z^P3Z2zkFif0-Ss0sCmKxtp9f4D>p5!5bzW7>?=XwVRby-K?YD z|9L)Z;fd$Sft7)}^IRsg%<4R%v_bjifHtl@k6(F&KyfV(-GOQA^Ir3x{shjtO{10j z{?mvTuI6d|5gq+%JJ_9fbwG>eaqx!vU-7H@-WLGJE$!V+07yKNH0cJu3JwBMQ{YcC zQO^zlS~mG6X#v0=z~B>&|IZZNdHk#6=yp8-7zIB6a0!g1(W3Kh_apkdCFLeC9Q4&+ zic$NoNBy5UV&dC6FzNU=weS4QNmaBnr~blPirUoS}|w4WzKi{raC z`kTJ2UQd^x$i)UkbBgGICS(I2l+HkLyuy{;p4H7pP>N;M8h^D`%w9!at(|j>?-BeS z|7n_WH6<4VjU7LmeOMBv=F{Gnlmh%iG^-<(tj(sVC(cPmaaLsb8FC zn`4-Hv96WowekTg@A`YBzEtF5J)cRe9?HX_Re{)WKq{E|Q%Hl^^(8w@k1a+WJg2E@>&1V5*1ru`!c3aNC`p zw?%5>)MSavFmK0rjdcT@Y&spMU97rZm(>E0e{Pm*@fWN zf}$k;gwAb8V99XOEW4Q{nU8v&Yh2{r&9u-u)y-sR?2-QKyU{!OBXGB17nxaU(evOV z92Fy2{R@6UFNSCj+{|{GP$!P_LLu%9<p894Dv@$x0r1NTKLlE9sx>|FwL z@}yVAY!H~#E!r(MV-t!h0Dx@vJl7yD-w@7aQE#4!Pk9UTxXjZE{0r{9+OMc5I3;*Jqb6OJsP5}Q|=^y_7EBlp?9dr+ZUewMHvDw;R-Ql|}kRa93gcsU>L0@*_ z8`U8=(5g9_>*y#ma~8KFIu>ahi`ooFi}TTXSvLdoH~zEtqdtu`>q0z!B5nrz%f zp6eL8rdyv2Uk{GTYiQs|0?S2oG%F1B&aK9kK^3>fxAk&HZ$w1CraJ@8IR; zwVtb3lCSm1m`7Z0uq~DHVXsh%e>xl1-p0PA7gOkCl@ic#(&ZN|BvC3MG9{5{RBc@t zKhLV5i>8ju?Y1X)iU1qBg@Ksk?&HT%tXWsEg9Oc?SHMn|sR`fNp=y1Yua^?4)dg1`{cTVfYp3_8Gdsb2@ev1^OOFkx)%rnt)! z)QMgeS?Pi+@m%pF#zZoSv*^gu6-=(7M?1bJ(;s%(C~; zTZ0kK4f?EVIMsPE5U15YldO*DA~X=Ya4O+YbLJbH{t{U7JJM4h%)|s``U@#gD6P?- z%dhrkOAhFz+b{d(H$^TX*rUH$+URc4Hh`0$`~P%J{d`QDXlA&Cv#uq8wrpwe@c5hM9q?ykQ!~2 z4kbq87BgukVSL7F>T=ybMJJ!~k&Dz03=~tJe4j50->3MPojGCg%kD2n1@P=`3z4SX zqG)owCr@~vtVuMd&E0_UHrBcRdStK*PuXs0zODS&yloHf4%mKxvy+=6^;h42{2NFz B(Ifx> diff --git a/vendor/assets/stylesheets/images/ui-icons_3d3d3d_256x240.png b/vendor/assets/stylesheets/images/ui-icons_3d3d3d_256x240.png index c216ba1d591ed0381cf681ad70bd0f0c59574bb3..12b7518052c1fd0d317153b011d82781b08a90f6 100644 GIT binary patch delta 4043 zcmXw*c|6mPAICRia~pHyUXI*Xu1XlGh~`LAk&zDNK61`y2z%%*`;@ukZKw`#t}A{quf2-mk~&@qWJ+l%B{umS6)BEiUZT9K8$%_+l;0OzcBm zEIOySP1f^6d(F#cW1gyod(f|0p1QOC)bswBcSVlcn~^|^u}$)!9~8&xXN*Lit(BYH zcDFQQky|p7YBvC7JnQS}AwmRg=+|QNUV?}L&>s#}xVuLMv%r@^n`1QjSRrRWXkyJ9 zmDE;*DRaVsT=#K{K8I64nWZmZ2CJZxwB5j90TQ>YE)IWoHc6kou#GbZu9V5G>|hYN zVRMW8lgBiqT0nUXp=u}>7WWEfCP@4Ui-9jfUP?*4MKVF17iwB3mm$LqK*1}l_(_B`9~^*~GUu$qmn-^aeh}Y>05iSV908MyziiVl>p& zj6~f1+CKsSC#VDGYM*~fdr1-dUBzMNK#Lyw4WLYPoxcz})!ixTGcfkrhx_9t z?S~vP21SEgu)b_~6a8De8+J+{PiDHB1J0K@t`zPj_oVf;F!)uM^iS&fV0bX;WAZ;V zr>s4n?qP9_e?fMWA+IPgmPhPSzB#eyTyFX6!7n@*DlKK1Veq!gc+Hb5-d;~WPQE@vX$1JW2dd+>ea>3#CNb?R4k~RU!qW{HFL!Xx5c*m>p<;i za15`C5GqH-{Q~y|0+R9DnMzaWw{F0>zjW=J-ufAHZ->bT731?p zOD7gOc%3;Mu<5ZiZ__FhJu{2k%`iI&aQlp!2 zws3}z=_8(`W2Xf-GOVt1m3$_nZ>lF{S9H`*c^Dq)z<{V=TU3I3bk%zv&aXh6MQNwH zMfpOLCxKm*p9K!VI0aI!pGLCIpON+mEYvx{N7&KnRf9tO31IHjG!+7C|Lu1~`jZ-H zwCQ8q8B^quk#Eq8=209Tg2gfTBO9S0ZZI}0ZqkU*`_(_Bcr}5v{~6&M5w>k$N}zV9 z2^q||)dW=~`LiVN<8QK*0+vzrc;*qEzyheW_(mAviI!yC`ACU^+Jk9+Oln#jF{fh( zLbIgwA|g2YGmO}nt&@edRn~F@;^7K?J(7j9-o!^Kv54iBrf*mnXDb#Y;Q_7N&jRg^ z@M8>2%m|I+yL(e!C%jL!-@MH`VIqJE&~IuNSYeaGXIV+pwwi!65E&_PtpKW_u1;t! zUBS`rp7`!_AW-dZ3>M*;;ORVq?xvnhUez|87Z?_g^l>4Q!3r1xJLo4E;RD3rmVB+% zvcB+~VrhWcpBG*dDn)2F!a^0+U#M%7Eo!L0UmtxLWa zB|!K$Qks0`00}CNJr>CQdhNr~zzwZOKNPI}*8L$0gyS~lUkl4#3#)t%lTZz`xT2sC zaZAGc`@z3qH|&0QXLZf4-wTm-9lch6X(w>YGCY?#oZwYUnkA+?8F)wWQq9^%QTSQO;d%xhGZJU&9tTHxV z#U9_!QwzZ{)0^youAN0kuA4F{%6M+{W6upddRLJ3?#;GyfxPjj(JBUN*m+{IW8nBR zIRN*nqu|Dizr!A+#-%7PPDc_H&JtWGRZQJaP};Coy5Cx102Qo^w_}^ckgW%vGV)LI zZ$e~4bVem~K1GSwoSc^}SY&H?J9scn$-ZJfnHEPMmRfnnytYr`Q*zeiYrshPwx2F| zKb_YumV++);&U~8T4z{4FIq3VyAhHF7!f8jk5M{zMBh9J#M+zS59izMa|?Da)Om`Dvx zzol*neb#I_^7I2I4tZ5zW0z$*M*|$2gYWR&?%-RIwEN9Z1|p#vHwfcXy`HVH;@-Yg zp1gkjz+UmR+%8QqUKa$kp|zY}bF^Em$P=Lh;gU+hGkX?XpofgYdACwNO`+b4R|a0+ z8<+N4qbiPZKCP9z|F-yWXUGp;0_Ai~j4VDNqAkWJeB zsDyemKZfg`Zwo{2jLcF&A)7#5&v|z`x^HNH{{s{lj-FNeg zkhy>WFa^D`>3d=VqrhIrr^(Pb4e2__DJ}{qT7EMPU{~4I`5|+t?$XJChx!8_OROjH z4ogroCKKnXiyw4N6$L#IpW1MyG>T?zGFQHPX=QJNRY(vTepnmyt7AWOUTm%a>b>l{4NXv2z-nnXbomY24 zJ^x4mzV6f2fNrg2GVHcyhryl#yuVZk`WlgS_2AB*#N1Ee>8O(;+Z2xNp;3(M8O796 zLwPq^ln>>2f4`w*MI71t#agk}HpjgeK)jSG{;5xC>m@m1Z?PRJMK&)_=&M&chy=+J zWEy(BplP-vZuU(qmx!d0dJcw$NggLV8QAYW(iXAfyd0&Zok~BdeSD7d8t96=dIuw( zT`}PcF?P;5Y|?2ZB#ra-yK#n$vrqMyLXg1Fuk!bKfrLmX#a=2I|o2(d8vNfEf;U`~@5SZV&BHqANdeF(9+ubidb=Pzu4CHO}^oRf`AV5!>;=Kl3~k3a(E#?QOjkNRyKt zT>tj75Y5(uY|fT`+#qz=o(5R^+!r<&dwGP;JzkI5>=3qN$*D!(2@k6aZDBbI%Cuw& zsbzmz%m3jwn-|^KL|hU4V7ut@aAb1zfESw;K@o%S(Kzb8b_gr3_TqC)#HsyVZWolA zw*|ibkqd`(?+%VKBzRMC|DJ)}l&6162x;1B!J}P(kc+L2-Zs{@Akkg$6s?*fr;wk_wTMQ$?=^$HLA) z6(IW~YSVFurhHNlYBnmAhoRF_F%h($dBB}gf^nEkhXupIjPh@ZvRnIMHYnRH9<nvYnh8=^CXSVnqn%IVIv^OEyTR8~P^xXqk5pWH0HEVp(!h zI00>FYWYNp)RvgJWM?xeSvaBBwY<3#3aH?72LI`{j^cYexQu=g+Y05X338J^=f5)Z z+yCXAp&3unY>i^4%QxP)2F=QC1M6VvJ@AVNFSm{b2k+;@6KlbF+)fUyv(gbe@nnXO z*_W@0Xb1G{9Q+_O{s=)Ilt<@%IWbOIxPRKGjZxaX%6b@eIzECf{ z@;D2Y z0a}-6vBn5hu>2xvjIC{io;sP}HQn{2HKkIyq-GIyn}oV|`DBV$eCPYDg=VKf~M%DmHInYm5VrC|mvFLsd_w#VWx9wYm{82OabMS@_M%nwj&Diq{T=+C> zYO5LbPeuJ(QeWFn<(nfLIR(l_MVf@^hmb{W&SyhG94y;AA1^X|K0z8WLWT~>Qr?^Io)Lp;@!HxKxPZ0x4pxn qSjY#HREPziBU_jER_>FU-`mE$a{&_4r-N)jf3Y}=HmfwnME?hjxyfn( delta 5037 zcmV;e6H@GvBI_xT90dWdPI_;#Ayol?6JJS0K~#90?Oh9F+qMw~$x2$Nn4pts2rkicqs$`0#`RooLep(~$=Dh)P5Z%?UHqR&Q(6DAs zo2i7L)F=(Hpn)7PCAh>RawtSt6Ie?Yrcr}TvtCM@0~9J5v`du%z{CZO%CUM>n6g2^ zw6M16e*bx7EmR#$X=U>lQ>#;dC`*9q#fTgllsq8o>tccY+nmiFk0xM;t zjqt1(`8g^%#{U^g8Y<;hMEalMZ}XMTz)NcBWE( zQ<#bcNToJ+-(PmY4PzZu%YrqQd6z(b8TV4xsvnKbBhdy*Iqd8rfBp|4>W;qoO3MX0 z&SaG&hb|4oGeB-uWp|zAC7E~QJ|h#C0nm29v49Xw7ev4s@o%39j}Xv&`_f(^ZbuPHbYz#BobCFnnASABo5Nn(idW!4EEoTfEF{r zQZ$&?ZS&}F(B+p^=wY6u=X3paLtQt2JP>6!EWErl38&i9 z$=}Ma))`e54v*Eu99I{dr!ATK%|pKy^vHHMqQiAmdnGErv^n|GBG2W&R)p-+dj8>0 z#73NlRk;Wh1vuf+j41$Fe!MFg;3eW%tu*gbRAE;{-BS)%)5v9Nbq19YUenQ&Nf__V zO%G=;Um6Zgy>DfIBH1RYei>~bgD2t&bNWw{h|^b+H}oxqvwz^%JB2eI;du3C684e^ zH+iFSh#J%*L%E&gD>-9pO&47*^*C`^j2L7iQoZqDko^F^ui5vi=WAhAUTda=_9Of+ zP(Lblt|Z2Oj|j5QWeipgN@dox8~pofF0j|UVP@-8ytf91JLkd+k1Rr z!7M*(zJNt9cE!Mhg=+&$w#+}-1^}aPJv(IAcx)Tk9Rm*)z(vk`6TkRDIzM5MO)|eE zM{$NiE0t&y0f$2cK6H>}Urzxz!LjhbWcZD!Fn3UFwndO&zzy|5LCJ#0!&~VtpTL@t zdJ$x`VE|Tt#DLQyPvkTv^9L5{(`)oU)9C!hRs^wgfa~S*p9~QvkUT+lhRkLM9WnT}$o|QtOM$r4oO| zwhTcR4^;G1jM43v^lfK4EG|zT(0kbcDTL<%D{3tReK+VaqV`hYaOw^ zsErW<9q)@TzAzkuSKz`cKcnmC720vIB1c!tsG6GPV0X==`|DS~LF3`O=jTS|EzJ;M zVbklY0A;IPoo*t~7@1;CLS4LYD>bFwzX5-o{S7mmM_p6HjxI3+Sz&mo%PH~R!-EHi z)m!|3<-0thzN9PYKJv#4b8Wv7-{@40))&}@DzkIRw4L(AEKA$Auw1H$_1kG`U>{}R z-yH*TS-!#>5das;IeB5)(5VWjOrv}T&z>m;Ok1!FR5wSX2&U@)6~MRmQv4IZ^-#VL zP`ZvJ(yDt1%*+;mq)ro2N%!`lFV=DRNjGCI*2m1uPEOq7k#KN{6I8aqC0 zJW)4B;^=nX%|RJJY|X%f2Z$ey49lP!RRivh7{IyS^uil#Mg}O<{d9mffV)2cyz6sQ z>4sbm0Pn#I`TJH+!??et6Rz-fSAe+z2lBxplTXypqYbz-1>JR|yzTzM(8Lv#Ch1sz zdZY#T?x)vyb_O#C3|x0Vz;{1A1~LN4R$SE&jMw+XKqaBWaj2NvKt>!}s|P!##2@~? zRVWI7zEao(UO2dfYnDHBONHP3ig!vVw(q9C1Om;Abm22pnEMSIOJHk^-uaY~k%G4l zB0@cY-2uIs9w>nC!dbWcpnIjX(Zq2vf$oOzS zm7j~?HS@4h8!uiQPY*l;Yc2ixMPxbY6uP>+It^>Zgd zR)Fy>$YxZ=;GXorea%NQb_RO|*(`imK^UaW^4K;8L5EIR$+$wX{oZ=7*}8!h#qZ#9 z1|nA1Q$U-*Cc#Q7wCS1@4IO2^UcmGcY@*F7U;a}ZH%md6G zwF=n1EvP@!{(u`01##z~cdClVkJVWO(nkd}joMTzP8wT~J_HN&W?5tagx>rH;5Nyr z*c04+ds=Dt?2L75pwR{1M4y}TO4FYj{L%5FQ(Rtp3`_+qbw;}U5_G(O%S(A^f)Mo+ zeQM*`WO8OC<;^qPJV7xqhsU3L3=|k~KA-D|*E&OFpqeh1##Odov{Ef5M90p%~n*GpK%NTU)M(lmCEBez;i_; zT6eh50P|tj8qUp+7TZRDRf62JP@31uJ%N7Uvq{8|`yqTNn_e3Rt_=g%hJlv!`^HbNPG-HZy~9*+dSUtn@EQxofL1_HFE76q z^3YT5&s|f0-Or7ycX+>4Zrj>{52{*6<0A-8{vz21z`xC5U2}ndwTji8=(hG)Hww#O z#{HuX*75pBdv@&j!nB3yKfYG3>9kj0!Hv#FSa&1~R2fe=6Mx=SE6X1WbznCBbBw*X_#_TN38IHRRGI5Q8cxl1%^@OB2U?h*f{9C^SKX{CG_ zKz1-=P8EfN%=Y{5*#i%owW-E-E6k}e6^2)u(&f8yO54qUJUvmJoo%$^TRq{?7zXYr z1C~KEOc;>Brrk=_;7lIjg&9~02#?IjNCO+orpduJI@PTjp&xo_O8sM|4=0rWW+s7& zkLgU?-E^6p%?AL?c6~9!?lsd4%zTBz#wDBEwv8p=GSKnwZ$rSAZ6M>`@n3kVT!8J~ zW3(w&{{vxvMzb?KZVyI$cLtkb4fvpy9v>{1g?^a6(93fGOY?9&?DF+OV%Cawra3W- zwr(Y3(c|t8@8SJU^UGKpI3M8dJAfbh+*Gqz0x@#}=Ykw~$1*Yn@c3bWdWbS`BjQin<9t9>RJymF$DQ&2 zVEj|=9Zk<%0lo`2X5PVo^8xODH{hny4Y?T^A@KfS;Idio-WpL*5HcYA{XzR<;Jzi0 zkr5!>)(-SkS-=36d#I<{3>`tL>nlI!*P)D08t$K{`9T+>)oVX zsMpAU7GC6oN<{8pqUAv_@+cs9xRQl>5x5@V$-@GI$U%vFge;1m$=WM`n1FgK7z&_= zfx`=61oqnncoRH$7s$xS$mqx3mEirVJU$L^TbmJ)2t2xPC;bW)VRn6HwNOi(hm#3F zbmYULcxGzEIG_-I0zZ6c*ltdnaIn+XVdy@C|}q z8GSiGkRx!4$M4TQ@+>E?Ku83d3`2fc0!RhM${!JfRWN+ZVo&0TfP4mH$@{O+a0xwu zk@Rb0+YI)bzIO#GBO~LXqu`S_(SJ)m5)g^pZ^ymR1Op^o(D~R1g~rcDhv$a{(p3J8M3{1|`y3Putzj(Y_VM$Y4ajEs*Od+ou2nPOTg zEL^52Ji8KLfaAb0^XYG}jNTW%C5)ASO5VU$K|S~XBTCkv--ZnLnFUM>GysB#yOaQ) zY)=aTFWjqQ#Hxo3^@%80fQhsKCV;So?A)&T1DRl*p4}K3SjQh)@);U;^beadGBS=1 z;k(v8Dnw@%zTzo^2^*jP@#ipy72UDi5rx<)vTt=tC_S^}*-hz|UJf8QNd;DaAbl*Y zW`qEO`2GTgKCLSu0KPtfl|PyWAcnd?w7rw~W&CPFfJ}hv!we3S7nMVDdLN;pSjgF{$MP zg!RN@Km=xlPA`MWs>i=(o|lM!9#G1IR$VG+nxfRe47%&#mv=6a5&-CzqJw)kx@iGO z>ves?@wrNFGn~Nb#r)?$1t5=hW%cFt59}1NV!i-m^*?vvQ2G*uf_cbS;T6k*tN_8q z#YMUWz;fBOqN#aFyeha-e^vl8enkZERHlCV6g^Jm>3_92Wz``GDtqXEEJpAxx$mI_ z@C!OFS+tMA9cL2=ASmyd0+aZ}ULh`kYN>!61~kZCHU;mB)V1vbHI{D=7zr5qLVbLG z`da`E*Ilj=J402q3R}EV+9`mM(P696R6g@J0u$kCRe^4tLu6VTF=z%p}mb%QIek@ z4zPj#bHjk^0&+o#uP<08bKm?~&CoZ0Le{6wcm23ew zH{I-miZ?{J z2Rf^(ZQ0WGjqkgE-+K|xycCBOfU7Vqyq^a$+f-G5_e|T?0#L+;@9|h4Kp^SYj(klc zu|$OMt1ouY1$q`A4uK!!SQOsX~wpa2fs1^7Ve-n&3X z#)HRygML43+0AU>$A;W5tebaikyHZp(!xxY78}yXhEl$6@yABIqPLS*7h>k$K_!c- zlk-XUXV&loLk;li#Vgw8 z)i9uG$UUdXSyLGq8J`IFeSjhQ7U|o~=yl6~+m;>zzYp*MERa?&Lc2Beor2z%%*`;@ukZKw`#t}A{quf2-mk~&@qWJ+l%B{umS6)BEiUZT9K8$%_+l;0OzcBm zEIOySP1f^6d(F#cW1gyod(f|0p1QOC)bswBcSVlcn~^|^u}$)!9~8&xXN*Lit(BYH zcDFQQky|p7YBvC7JnQS}AwmRg=+|QNUV?}L&>s#}xVuLMv%r@^n`1QjSRrRWXkyJ9 zmDE;*DRaVsT=#K{K8I64nWZmZ2CJZxwB5j90TQ>YE)IWoHc6kou#GbZu9V5G>|hYN zVRMW8lgBiqT0nUXp=u}>7WWEfCP@4Ui-9jfUP?*4MKVF17iwB3mm$LqK*1}l_(_B`9~^*~GUu$qmn-^aeh}Y>05iSV908MyziiVl>p& zj6~f1+CKsSC#VDGYM*~fdr1-dUBzMNK#Lyw4WLYPoxcz})!ixTGcfkrhx_9t z?S~vP21SEgu)b_~6a8De8+J+{PiDHB1J0K@t`zPj_oVf;F!)uM^iS&fV0bX;WAZ;V zr>s4n?qP9_e?fMWA+IPgmPhPSzB#eyTyFX6!7n@*DlKK1Veq!gc+Hb5-d;~WPQE@vX$1JW2dd+>ea>3#CNb?R4k~RU!qW{HFL!Xx5c*m>p<;i za15`C5GqH-{Q~y|0+R9DnMzaWw{F0>zjW=J-ufAHZ->bT731?p zOD7gOc%3;Mu<5ZiZ__FhJu{2k%`iI&aQlp!2 zws3}z=_8(`W2Xf-GOVt1m3$_nZ>lF{S9H`*c^Dq)z<{V=TU3I3bk%zv&aXh6MQNwH zMfpOLCxKm*p9K!VI0aI!pGLCIpON+mEYvx{N7&KnRf9tO31IHjG!+7C|Lu1~`jZ-H zwCQ8q8B^quk#Eq8=209Tg2gfTBO9S0ZZI}0ZqkU*`_(_Bcr}5v{~6&M5w>k$N}zV9 z2^q||)dW=~`LiVN<8QK*0+vzrc;*qEzyheW_(mAviI!yC`ACU^+Jk9+Oln#jF{fh( zLbIgwA|g2YGmO}nt&@edRn~F@;^7K?J(7j9-o!^Kv54iBrf*mnXDb#Y;Q_7N&jRg^ z@M8>2%m|I+yL(e!C%jL!-@MH`VIqJE&~IuNSYeaGXIV+pwwi!65E&_PtpKW_u1;t! zUBS`rp7`!_AW-dZ3>M*;;ORVq?xvnhUez|87Z?_g^l>4Q!3r1xJLo4E;RD3rmVB+% zvcB+~VrhWcpBG*dDn)2F!a^0+U#M%7Eo!L0UmtxLWa zB|!K$Qks0`00}CNJr>CQdhNr~zzwZOKNPI}*8L$0gyS~lUkl4#3#)t%lTZz`xT2sC zaZAGc`@z3qH|&0QXLZf4-wTm-9lch6X(w>YGCY?#oZwYUnkA+?8F)wWQq9^%QTSQO;d%xhGZJU&9tTHxV z#U9_!QwzZ{)0^youAN0kuA4F{%6M+{W6upddRLJ3?#;GyfxPjj(JBUN*m+{IW8nBR zIRN*nqu|Dizr!A+#-%7PPDc_H&JtWGRZQJaP};Coy5Cx102Qo^w_}^ckgW%vGV)LI zZ$e~4bVem~K1GSwoSc^}SY&H?J9scn$-ZJfnHEPMmRfnnytYr`Q*zeiYrshPwx2F| zKb_YumV++);&U~8T4z{4FIq3VyAhHF7!f8jk5M{zMBh9J#M+zS59izMa|?Da)Om`Dvx zzol*neb#I_^7I2I4tZ5zW0z$*M*|$2gYWR&?%-RIwEN9Z1|p#vHwfcXy`HVH;@-Yg zp1gkjz+UmR+%8QqUKa$kp|zY}bF^Em$P=Lh;gU+hGkX?XpofgYdACwNO`+b4R|a0+ z8<+N4qbiPZKCP9z|F-yWXUGp;0_Ai~j4VDNqAkWJeB zsDyemKZfg`Zwo{2jLcF&A)7#5&v|z`x^HNH{{s{lj-FNeg zkhy>WFa^D`>3d=VqrhIrr^(Pb4e2__DJ}{qT7EMPU{~4I`5|+t?$XJChx!8_OROjH z4ogroCKKnXiyw4N6$L#IpW1MyG>T?zGFQHPX=QJNRY(vTepnmyt7AWOUTm%a>b>l{4NXv2z-nnXbomY24 zJ^x4mzV6f2fNrg2GVHcyhryl#yuVZk`WlgS_2AB*#N1Ee>8O(;+Z2xNp;3(M8O796 zLwPq^ln>>2f4`w*MI71t#agk}HpjgeK)jSG{;5xC>m@m1Z?PRJMK&)_=&M&chy=+J zWEy(BplP-vZuU(qmx!d0dJcw$NggLV8QAYW(iXAfyd0&Zok~BdeSD7d8t96=dIuw( zT`}PcF?P;5Y|?2ZB#ra-yK#n$vrqMyLXg1Fuk!bKfrLmX#a=2I|o2(d8vNfEf;U`~@5SZV&BHqANdeF(9+ubidb=Pzu4CHO}^oRf`AV5!>;=Kl3~k3a(E#?QOjkNRyKt zT>tj75Y5(uY|fT`+#qz=o(5R^+!r<&dwGP;JzkI5>=3qN$*D!(2@k6aZDBbI%Cuw& zsbzmz%m3jwn-|^KL|hU4V7ut@aAb1zfESw;K@o%S(Kzb8b_gr3_TqC)#HsyVZWolA zw*|ibkqd`(?+%VKBzRMC|DJ)}l&6162x;1B!J}P(kc+L2-Zs{@Akkg$6s?*fr;wk_wTMQ$?=^$HLA) z6(IW~YSVFurhHNlYBnmAhoRF_F%h($dBB}gf^nEkhXupIjPh@ZvRnIMHYnRH9<nvYnh8=^CXSVnqn%IVIv^OEyTR8~P^xXqk5pWH0HEVp(!h zI00>FYWYNp)RvgJWM?xeSvaBBwY<3#3aH?72LI`{j^cYexQu=g+Y05X338J^=f5)Z z+yCXAp&3unY>i^4%QxP)2F=QC1M6VvJ@AVNFSm{b2k+;@6KlbF+)fUyv(gbe@nnXO z*_W@0Xb1G{9Q+_O{s=)Ilt<@%IWbOIxPRKGjZxaX%6b@eIzECf{ z@;D2Y z0a}-6vBn5hu>2xvjIC{io;sP}HQn{2HKkIyq-GIyn}oV|`DBV$eCPYDg=VKf~M%DmHInYm5VrC|mvFLsd_w#VWx9wYm{82OabMS@_M%nwj&Diq{T=+C> zYO5LbPeuJ(QeWFn<(nfLIR(l_MVf@^hmb{W&SyhG94y;AA1^X|K0z8WLWT~>Qr?^Io)Lp;@!HxKxPZ0x4pxn qSjY#HREPziBU_jER_>FU-`mE$a{&_4r-N)jf3Y}=HmfwnME?hjxyfn( delta 5037 zcmV;e6H@GvBI_xT90dWdPI_;#Ayol?6JJS0K~#90?Oh9F+qMw~$x2$Nn4pts2rkicqs$`0#`RooLep(~$=Dh)P5Z%?UHqR&Q(6DAs zo2i7L)F=(Hpn)7PCAh>RawtSt6Ie?Yrcr}TvtCM@0~9J5v`du%z{CZO%CUM>n6g2^ zw6M16e*bx7EmR#$X=U>lQ>#;dC`*9q#fTgllsq8o>tccY+nmiFk0xM;t zjqt1(`8g^%#{U^g8Y<;hMEalMZ}XMTz)NcBWE( zQ<#bcNToJ+-(PmY4PzZu%YrqQd6z(b8TV4xsvnKbBhdy*Iqd8rfBp|4>W;qoO3MX0 z&SaG&hb|4oGeB-uWp|zAC7E~QJ|h#C0nm29v49Xw7ev4s@o%39j}Xv&`_f(^ZbuPHbYz#BobCFnnASABo5Nn(idW!4EEoTfEF{r zQZ$&?ZS&}F(B+p^=wY6u=X3paLtQt2JP>6!EWErl38&i9 z$=}Ma))`e54v*Eu99I{dr!ATK%|pKy^vHHMqQiAmdnGErv^n|GBG2W&R)p-+dj8>0 z#73NlRk;Wh1vuf+j41$Fe!MFg;3eW%tu*gbRAE;{-BS)%)5v9Nbq19YUenQ&Nf__V zO%G=;Um6Zgy>DfIBH1RYei>~bgD2t&bNWw{h|^b+H}oxqvwz^%JB2eI;du3C684e^ zH+iFSh#J%*L%E&gD>-9pO&47*^*C`^j2L7iQoZqDko^F^ui5vi=WAhAUTda=_9Of+ zP(Lblt|Z2Oj|j5QWeipgN@dox8~pofF0j|UVP@-8ytf91JLkd+k1Rr z!7M*(zJNt9cE!Mhg=+&$w#+}-1^}aPJv(IAcx)Tk9Rm*)z(vk`6TkRDIzM5MO)|eE zM{$NiE0t&y0f$2cK6H>}Urzxz!LjhbWcZD!Fn3UFwndO&zzy|5LCJ#0!&~VtpTL@t zdJ$x`VE|Tt#DLQyPvkTv^9L5{(`)oU)9C!hRs^wgfa~S*p9~QvkUT+lhRkLM9WnT}$o|QtOM$r4oO| zwhTcR4^;G1jM43v^lfK4EG|zT(0kbcDTL<%D{3tReK+VaqV`hYaOw^ zsErW<9q)@TzAzkuSKz`cKcnmC720vIB1c!tsG6GPV0X==`|DS~LF3`O=jTS|EzJ;M zVbklY0A;IPoo*t~7@1;CLS4LYD>bFwzX5-o{S7mmM_p6HjxI3+Sz&mo%PH~R!-EHi z)m!|3<-0thzN9PYKJv#4b8Wv7-{@40))&}@DzkIRw4L(AEKA$Auw1H$_1kG`U>{}R z-yH*TS-!#>5das;IeB5)(5VWjOrv}T&z>m;Ok1!FR5wSX2&U@)6~MRmQv4IZ^-#VL zP`ZvJ(yDt1%*+;mq)ro2N%!`lFV=DRNjGCI*2m1uPEOq7k#KN{6I8aqC0 zJW)4B;^=nX%|RJJY|X%f2Z$ey49lP!RRivh7{IyS^uil#Mg}O<{d9mffV)2cyz6sQ z>4sbm0Pn#I`TJH+!??et6Rz-fSAe+z2lBxplTXypqYbz-1>JR|yzTzM(8Lv#Ch1sz zdZY#T?x)vyb_O#C3|x0Vz;{1A1~LN4R$SE&jMw+XKqaBWaj2NvKt>!}s|P!##2@~? zRVWI7zEao(UO2dfYnDHBONHP3ig!vVw(q9C1Om;Abm22pnEMSIOJHk^-uaY~k%G4l zB0@cY-2uIs9w>nC!dbWcpnIjX(Zq2vf$oOzS zm7j~?HS@4h8!uiQPY*l;Yc2ixMPxbY6uP>+It^>Zgd zR)Fy>$YxZ=;GXorea%NQb_RO|*(`imK^UaW^4K;8L5EIR$+$wX{oZ=7*}8!h#qZ#9 z1|nA1Q$U-*Cc#Q7wCS1@4IO2^UcmGcY@*F7U;a}ZH%md6G zwF=n1EvP@!{(u`01##z~cdClVkJVWO(nkd}joMTzP8wT~J_HN&W?5tagx>rH;5Nyr z*c04+ds=Dt?2L75pwR{1M4y}TO4FYj{L%5FQ(Rtp3`_+qbw;}U5_G(O%S(A^f)Mo+ zeQM*`WO8OC<;^qPJV7xqhsU3L3=|k~KA-D|*E&OFpqeh1##Odov{Ef5M90p%~n*GpK%NTU)M(lmCEBez;i_; zT6eh50P|tj8qUp+7TZRDRf62JP@31uJ%N7Uvq{8|`yqTNn_e3Rt_=g%hJlv!`^HbNPG-HZy~9*+dSUtn@EQxofL1_HFE76q z^3YT5&s|f0-Or7ycX+>4Zrj>{52{*6<0A-8{vz21z`xC5U2}ndwTji8=(hG)Hww#O z#{HuX*75pBdv@&j!nB3yKfYG3>9kj0!Hv#FSa&1~R2fe=6Mx=SE6X1WbznCBbBw*X_#_TN38IHRRGI5Q8cxl1%^@OB2U?h*f{9C^SKX{CG_ zKz1-=P8EfN%=Y{5*#i%owW-E-E6k}e6^2)u(&f8yO54qUJUvmJoo%$^TRq{?7zXYr z1C~KEOc;>Brrk=_;7lIjg&9~02#?IjNCO+orpduJI@PTjp&xo_O8sM|4=0rWW+s7& zkLgU?-E^6p%?AL?c6~9!?lsd4%zTBz#wDBEwv8p=GSKnwZ$rSAZ6M>`@n3kVT!8J~ zW3(w&{{vxvMzb?KZVyI$cLtkb4fvpy9v>{1g?^a6(93fGOY?9&?DF+OV%Cawra3W- zwr(Y3(c|t8@8SJU^UGKpI3M8dJAfbh+*Gqz0x@#}=Ykw~$1*Yn@c3bWdWbS`BjQin<9t9>RJymF$DQ&2 zVEj|=9Zk<%0lo`2X5PVo^8xODH{hny4Y?T^A@KfS;Idio-WpL*5HcYA{XzR<;Jzi0 zkr5!>)(-SkS-=36d#I<{3>`tL>nlI!*P)D08t$K{`9T+>)oVX zsMpAU7GC6oN<{8pqUAv_@+cs9xRQl>5x5@V$-@GI$U%vFge;1m$=WM`n1FgK7z&_= zfx`=61oqnncoRH$7s$xS$mqx3mEirVJU$L^TbmJ)2t2xPC;bW)VRn6HwNOi(hm#3F zbmYULcxGzEIG_-I0zZ6c*ltdnaIn+XVdy@C|}q z8GSiGkRx!4$M4TQ@+>E?Ku83d3`2fc0!RhM${!JfRWN+ZVo&0TfP4mH$@{O+a0xwu zk@Rb0+YI)bzIO#GBO~LXqu`S_(SJ)m5)g^pZ^ymR1Op^o(D~R1g~rcDhv$a{(p3J8M3{1|`y3Putzj(Y_VM$Y4ajEs*Od+ou2nPOTg zEL^52Ji8KLfaAb0^XYG}jNTW%C5)ASO5VU$K|S~XBTCkv--ZnLnFUM>GysB#yOaQ) zY)=aTFWjqQ#Hxo3^@%80fQhsKCV;So?A)&T1DRl*p4}K3SjQh)@);U;^beadGBS=1 z;k(v8Dnw@%zTzo^2^*jP@#ipy72UDi5rx<)vTt=tC_S^}*-hz|UJf8QNd;DaAbl*Y zW`qEO`2GTgKCLSu0KPtfl|PyWAcnd?w7rw~W&CPFfJ}hv!we3S7nMVDdLN;pSjgF{$MP zg!RN@Km=xlPA`MWs>i=(o|lM!9#G1IR$VG+nxfRe47%&#mv=6a5&-CzqJw)kx@iGO z>ves?@wrNFGn~Nb#r)?$1t5=hW%cFt59}1NV!i-m^*?vvQ2G*uf_cbS;T6k*tN_8q z#YMUWz;fBOqN#aFyeha-e^vl8enkZERHlCV6g^Jm>3_92Wz``GDtqXEEJpAxx$mI_ z@C!OFS+tMA9cL2=ASmyd0+aZ}ULh`kYN>!61~kZCHU;mB)V1vbHI{D=7zr5qLVbLG z`da`E*Ilj=J402q3R}EV+9`mM(P696R6g@J0u$kCRe^4tLu6VTF=z%p}mb%QIek@ z4zPj#bHjk^0&+o#uP<08bKm?~&CoZ0Le{6wcm23ew zH{I-miZ?{J z2Rf^(ZQ0WGjqkgE-+K|xycCBOfU7Vqyq^a$+f-G5_e|T?0#L+;@9|h4Kp^SYj(klc zu|$OMt1ouY1$q`A4uK!!SQOsX~wpa2fs1^7Ve-n&3X z#)HRygML43+0AU>$A;W5tebaikyHZp(!xxY78}yXhEl$6@yABIqPLS*7h>k$K_!c- zlk-XUXV&loLk;li#Vgw8 z)i9uG$UUdXSyLGq8J`IFeSjhQ7U|o~=yl6~+m;>zzYp*MERa?&Lc2Beor2z%%*`;@ukZKw`#t}A{quf2-mk~&@qWJ+l%B{umS6)BEiUZT9K8$%_+l;0OzcBm zEIOySP1f^6d(F#cW1gyod(f|0p1QOC)bswBcSVlcn~^|^u}$)!9~8&xXN*Lit(BYH zcDFQQky|p7YBvC7JnQS}AwmRg=+|QNUV?}L&>s#}xVuLMv%r@^n`1QjSRrRWXkyJ9 zmDE;*DRaVsT=#K{K8I64nWZmZ2CJZxwB5j90TQ>YE)IWoHc6kou#GbZu9V5G>|hYN zVRMW8lgBiqT0nUXp=u}>7WWEfCP@4Ui-9jfUP?*4MKVF17iwB3mm$LqK*1}l_(_B`9~^*~GUu$qmn-^aeh}Y>05iSV908MyziiVl>p& zj6~f1+CKsSC#VDGYM*~fdr1-dUBzMNK#Lyw4WLYPoxcz})!ixTGcfkrhx_9t z?S~vP21SEgu)b_~6a8De8+J+{PiDHB1J0K@t`zPj_oVf;F!)uM^iS&fV0bX;WAZ;V zr>s4n?qP9_e?fMWA+IPgmPhPSzB#eyTyFX6!7n@*DlKK1Veq!gc+Hb5-d;~WPQE@vX$1JW2dd+>ea>3#CNb?R4k~RU!qW{HFL!Xx5c*m>p<;i za15`C5GqH-{Q~y|0+R9DnMzaWw{F0>zjW=J-ufAHZ->bT731?p zOD7gOc%3;Mu<5ZiZ__FhJu{2k%`iI&aQlp!2 zws3}z=_8(`W2Xf-GOVt1m3$_nZ>lF{S9H`*c^Dq)z<{V=TU3I3bk%zv&aXh6MQNwH zMfpOLCxKm*p9K!VI0aI!pGLCIpON+mEYvx{N7&KnRf9tO31IHjG!+7C|Lu1~`jZ-H zwCQ8q8B^quk#Eq8=209Tg2gfTBO9S0ZZI}0ZqkU*`_(_Bcr}5v{~6&M5w>k$N}zV9 z2^q||)dW=~`LiVN<8QK*0+vzrc;*qEzyheW_(mAviI!yC`ACU^+Jk9+Oln#jF{fh( zLbIgwA|g2YGmO}nt&@edRn~F@;^7K?J(7j9-o!^Kv54iBrf*mnXDb#Y;Q_7N&jRg^ z@M8>2%m|I+yL(e!C%jL!-@MH`VIqJE&~IuNSYeaGXIV+pwwi!65E&_PtpKW_u1;t! zUBS`rp7`!_AW-dZ3>M*;;ORVq?xvnhUez|87Z?_g^l>4Q!3r1xJLo4E;RD3rmVB+% zvcB+~VrhWcpBG*dDn)2F!a^0+U#M%7Eo!L0UmtxLWa zB|!K$Qks0`00}CNJr>CQdhNr~zzwZOKNPI}*8L$0gyS~lUkl4#3#)t%lTZz`xT2sC zaZAGc`@z3qH|&0QXLZf4-wTm-9lch6X(w>YGCY?#oZwYUnkA+?8F)wWQq9^%QTSQO;d%xhGZJU&9tTHxV z#U9_!QwzZ{)0^youAN0kuA4F{%6M+{W6upddRLJ3?#;GyfxPjj(JBUN*m+{IW8nBR zIRN*nqu|Dizr!A+#-%7PPDc_H&JtWGRZQJaP};Coy5Cx102Qo^w_}^ckgW%vGV)LI zZ$e~4bVem~K1GSwoSc^}SY&H?J9scn$-ZJfnHEPMmRfnnytYr`Q*zeiYrshPwx2F| zKb_YumV++);&U~8T4z{4FIq3VyAhHF7!f8jk5M{zMBh9J#M+zS59izMa|?Da)Om`Dvx zzol*neb#I_^7I2I4tZ5zW0z$*M*|$2gYWR&?%-RIwEN9Z1|p#vHwfcXy`HVH;@-Yg zp1gkjz+UmR+%8QqUKa$kp|zY}bF^Em$P=Lh;gU+hGkX?XpofgYdACwNO`+b4R|a0+ z8<+N4qbiPZKCP9z|F-yWXUGp;0_Ai~j4VDNqAkWJeB zsDyemKZfg`Zwo{2jLcF&A)7#5&v|z`x^HNH{{s{lj-FNeg zkhy>WFa^D`>3d=VqrhIrr^(Pb4e2__DJ}{qT7EMPU{~4I`5|+t?$XJChx!8_OROjH z4ogroCKKnXiyw4N6$L#IpW1MyG>T?zGFQHPX=QJNRY(vTepnmyt7AWOUTm%a>b>l{4NXv2z-nnXbomY24 zJ^x4mzV6f2fNrg2GVHcyhryl#yuVZk`WlgS_2AB*#N1Ee>8O(;+Z2xNp;3(M8O796 zLwPq^ln>>2f4`w*MI71t#agk}HpjgeK)jSG{;5xC>m@m1Z?PRJMK&)_=&M&chy=+J zWEy(BplP-vZuU(qmx!d0dJcw$NggLV8QAYW(iXAfyd0&Zok~BdeSD7d8t96=dIuw( zT`}PcF?P;5Y|?2ZB#ra-yK#n$vrqMyLXg1Fuk!bKfrLmX#a=2I|o2(d8vNfEf;U`~@5SZV&BHqANdeF(9+ubidb=Pzu4CHO}^oRf`AV5!>;=Kl3~k3a(E#?QOjkNRyKt zT>tj75Y5(uY|fT`+#qz=o(5R^+!r<&dwGP;JzkI5>=3qN$*D!(2@k6aZDBbI%Cuw& zsbzmz%m3jwn-|^KL|hU4V7ut@aAb1zfESw;K@o%S(Kzb8b_gr3_TqC)#HsyVZWolA zw*|ibkqd`(?+%VKBzRMC|DJ)}l&6162x;1B!J}P(kc+L2-Zs{@Akkg$6s?*fr;wk_wTMQ$?=^$HLA) z6(IW~YSVFurhHNlYBnmAhoRF_F%h($dBB}gf^nEkhXupIjPh@ZvRnIMHYnRH9<nvYnh8=^CXSVnqn%IVIv^OEyTR8~P^xXqk5pWH0HEVp(!h zI00>FYWYNp)RvgJWM?xeSvaBBwY<3#3aH?72LI`{j^cYexQu=g+Y05X338J^=f5)Z z+yCXAp&3unY>i^4%QxP)2F=QC1M6VvJ@AVNFSm{b2k+;@6KlbF+)fUyv(gbe@nnXO z*_W@0Xb1G{9Q+_O{s=)Ilt<@%IWbOIxPRKGjZxaX%6b@eIzECf{ z@;D2Y z0a}-6vBn5hu>2xvjIC{io;sP}HQn{2HKkIyq-GIyn}oV|`DBV$eCPYDg=VKf~M%DmHInYm5VrC|mvFLsd_w#VWx9wYm{82OabMS@_M%nwj&Diq{T=+C> zYO5LbPeuJ(QeWFn<(nfLIR(l_MVf@^hmb{W&SyhG94y;AA1^X|K0z8WLWT~>Qr?^Io)Lp;@!HxKxPZ0x4pxn qSjY#HREPziBU_jER_>FU-`mE$a{&_4r-N)jf3Y}=HmfwnME?hjxyfn( delta 5037 zcmV;e6H@GvBI_xT90dWdPI_;#Ayol?6JJS0K~#90?Oh9F+qMw~$x2$Nn4pts2rkicqs$`0#`RooLep(~$=Dh)P5Z%?UHqR&Q(6DAs zo2i7L)F=(Hpn)7PCAh>RawtSt6Ie?Yrcr}TvtCM@0~9J5v`du%z{CZO%CUM>n6g2^ zw6M16e*bx7EmR#$X=U>lQ>#;dC`*9q#fTgllsq8o>tccY+nmiFk0xM;t zjqt1(`8g^%#{U^g8Y<;hMEalMZ}XMTz)NcBWE( zQ<#bcNToJ+-(PmY4PzZu%YrqQd6z(b8TV4xsvnKbBhdy*Iqd8rfBp|4>W;qoO3MX0 z&SaG&hb|4oGeB-uWp|zAC7E~QJ|h#C0nm29v49Xw7ev4s@o%39j}Xv&`_f(^ZbuPHbYz#BobCFnnASABo5Nn(idW!4EEoTfEF{r zQZ$&?ZS&}F(B+p^=wY6u=X3paLtQt2JP>6!EWErl38&i9 z$=}Ma))`e54v*Eu99I{dr!ATK%|pKy^vHHMqQiAmdnGErv^n|GBG2W&R)p-+dj8>0 z#73NlRk;Wh1vuf+j41$Fe!MFg;3eW%tu*gbRAE;{-BS)%)5v9Nbq19YUenQ&Nf__V zO%G=;Um6Zgy>DfIBH1RYei>~bgD2t&bNWw{h|^b+H}oxqvwz^%JB2eI;du3C684e^ zH+iFSh#J%*L%E&gD>-9pO&47*^*C`^j2L7iQoZqDko^F^ui5vi=WAhAUTda=_9Of+ zP(Lblt|Z2Oj|j5QWeipgN@dox8~pofF0j|UVP@-8ytf91JLkd+k1Rr z!7M*(zJNt9cE!Mhg=+&$w#+}-1^}aPJv(IAcx)Tk9Rm*)z(vk`6TkRDIzM5MO)|eE zM{$NiE0t&y0f$2cK6H>}Urzxz!LjhbWcZD!Fn3UFwndO&zzy|5LCJ#0!&~VtpTL@t zdJ$x`VE|Tt#DLQyPvkTv^9L5{(`)oU)9C!hRs^wgfa~S*p9~QvkUT+lhRkLM9WnT}$o|QtOM$r4oO| zwhTcR4^;G1jM43v^lfK4EG|zT(0kbcDTL<%D{3tReK+VaqV`hYaOw^ zsErW<9q)@TzAzkuSKz`cKcnmC720vIB1c!tsG6GPV0X==`|DS~LF3`O=jTS|EzJ;M zVbklY0A;IPoo*t~7@1;CLS4LYD>bFwzX5-o{S7mmM_p6HjxI3+Sz&mo%PH~R!-EHi z)m!|3<-0thzN9PYKJv#4b8Wv7-{@40))&}@DzkIRw4L(AEKA$Auw1H$_1kG`U>{}R z-yH*TS-!#>5das;IeB5)(5VWjOrv}T&z>m;Ok1!FR5wSX2&U@)6~MRmQv4IZ^-#VL zP`ZvJ(yDt1%*+;mq)ro2N%!`lFV=DRNjGCI*2m1uPEOq7k#KN{6I8aqC0 zJW)4B;^=nX%|RJJY|X%f2Z$ey49lP!RRivh7{IyS^uil#Mg}O<{d9mffV)2cyz6sQ z>4sbm0Pn#I`TJH+!??et6Rz-fSAe+z2lBxplTXypqYbz-1>JR|yzTzM(8Lv#Ch1sz zdZY#T?x)vyb_O#C3|x0Vz;{1A1~LN4R$SE&jMw+XKqaBWaj2NvKt>!}s|P!##2@~? zRVWI7zEao(UO2dfYnDHBONHP3ig!vVw(q9C1Om;Abm22pnEMSIOJHk^-uaY~k%G4l zB0@cY-2uIs9w>nC!dbWcpnIjX(Zq2vf$oOzS zm7j~?HS@4h8!uiQPY*l;Yc2ixMPxbY6uP>+It^>Zgd zR)Fy>$YxZ=;GXorea%NQb_RO|*(`imK^UaW^4K;8L5EIR$+$wX{oZ=7*}8!h#qZ#9 z1|nA1Q$U-*Cc#Q7wCS1@4IO2^UcmGcY@*F7U;a}ZH%md6G zwF=n1EvP@!{(u`01##z~cdClVkJVWO(nkd}joMTzP8wT~J_HN&W?5tagx>rH;5Nyr z*c04+ds=Dt?2L75pwR{1M4y}TO4FYj{L%5FQ(Rtp3`_+qbw;}U5_G(O%S(A^f)Mo+ zeQM*`WO8OC<;^qPJV7xqhsU3L3=|k~KA-D|*E&OFpqeh1##Odov{Ef5M90p%~n*GpK%NTU)M(lmCEBez;i_; zT6eh50P|tj8qUp+7TZRDRf62JP@31uJ%N7Uvq{8|`yqTNn_e3Rt_=g%hJlv!`^HbNPG-HZy~9*+dSUtn@EQxofL1_HFE76q z^3YT5&s|f0-Or7ycX+>4Zrj>{52{*6<0A-8{vz21z`xC5U2}ndwTji8=(hG)Hww#O z#{HuX*75pBdv@&j!nB3yKfYG3>9kj0!Hv#FSa&1~R2fe=6Mx=SE6X1WbznCBbBw*X_#_TN38IHRRGI5Q8cxl1%^@OB2U?h*f{9C^SKX{CG_ zKz1-=P8EfN%=Y{5*#i%owW-E-E6k}e6^2)u(&f8yO54qUJUvmJoo%$^TRq{?7zXYr z1C~KEOc;>Brrk=_;7lIjg&9~02#?IjNCO+orpduJI@PTjp&xo_O8sM|4=0rWW+s7& zkLgU?-E^6p%?AL?c6~9!?lsd4%zTBz#wDBEwv8p=GSKnwZ$rSAZ6M>`@n3kVT!8J~ zW3(w&{{vxvMzb?KZVyI$cLtkb4fvpy9v>{1g?^a6(93fGOY?9&?DF+OV%Cawra3W- zwr(Y3(c|t8@8SJU^UGKpI3M8dJAfbh+*Gqz0x@#}=Ykw~$1*Yn@c3bWdWbS`BjQin<9t9>RJymF$DQ&2 zVEj|=9Zk<%0lo`2X5PVo^8xODH{hny4Y?T^A@KfS;Idio-WpL*5HcYA{XzR<;Jzi0 zkr5!>)(-SkS-=36d#I<{3>`tL>nlI!*P)D08t$K{`9T+>)oVX zsMpAU7GC6oN<{8pqUAv_@+cs9xRQl>5x5@V$-@GI$U%vFge;1m$=WM`n1FgK7z&_= zfx`=61oqnncoRH$7s$xS$mqx3mEirVJU$L^TbmJ)2t2xPC;bW)VRn6HwNOi(hm#3F zbmYULcxGzEIG_-I0zZ6c*ltdnaIn+XVdy@C|}q z8GSiGkRx!4$M4TQ@+>E?Ku83d3`2fc0!RhM${!JfRWN+ZVo&0TfP4mH$@{O+a0xwu zk@Rb0+YI)bzIO#GBO~LXqu`S_(SJ)m5)g^pZ^ymR1Op^o(D~R1g~rcDhv$a{(p3J8M3{1|`y3Putzj(Y_VM$Y4ajEs*Od+ou2nPOTg zEL^52Ji8KLfaAb0^XYG}jNTW%C5)ASO5VU$K|S~XBTCkv--ZnLnFUM>GysB#yOaQ) zY)=aTFWjqQ#Hxo3^@%80fQhsKCV;So?A)&T1DRl*p4}K3SjQh)@);U;^beadGBS=1 z;k(v8Dnw@%zTzo^2^*jP@#ipy72UDi5rx<)vTt=tC_S^}*-hz|UJf8QNd;DaAbl*Y zW`qEO`2GTgKCLSu0KPtfl|PyWAcnd?w7rw~W&CPFfJ}hv!we3S7nMVDdLN;pSjgF{$MP zg!RN@Km=xlPA`MWs>i=(o|lM!9#G1IR$VG+nxfRe47%&#mv=6a5&-CzqJw)kx@iGO z>ves?@wrNFGn~Nb#r)?$1t5=hW%cFt59}1NV!i-m^*?vvQ2G*uf_cbS;T6k*tN_8q z#YMUWz;fBOqN#aFyeha-e^vl8enkZERHlCV6g^Jm>3_92Wz``GDtqXEEJpAxx$mI_ z@C!OFS+tMA9cL2=ASmyd0+aZ}ULh`kYN>!61~kZCHU;mB)V1vbHI{D=7zr5qLVbLG z`da`E*Ilj=J402q3R}EV+9`mM(P696R6g@J0u$kCRe^4tLu6VTF=z%p}mb%QIek@ z4zPj#bHjk^0&+o#uP<08bKm?~&CoZ0Le{6wcm23ew zH{I-miZ?{J z2Rf^(ZQ0WGjqkgE-+K|xycCBOfU7Vqyq^a$+f-G5_e|T?0#L+;@9|h4Kp^SYj(klc zu|$OMt1ouY1$q`A4uK!!SQOsX~wpa2fs1^7Ve-n&3X z#)HRygML43+0AU>$A;W5tebaikyHZp(!xxY78}yXhEl$6@yABIqPLS*7h>k$K_!c- zlk-XUXV&loLk;li#Vgw8 z)i9uG$UUdXSyLGq8J`IFeSjhQ7U|o~=yl6~+m;>zzYp*MERa?&Lc2Beor Date: Sun, 15 Jul 2012 20:11:07 +0200 Subject: [PATCH 32/41] fix small timing issue --- features/step_definitions/todo_edit_steps.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/features/step_definitions/todo_edit_steps.rb b/features/step_definitions/todo_edit_steps.rb index 3d905495..320df3e2 100644 --- a/features/step_definitions/todo_edit_steps.rb +++ b/features/step_definitions/todo_edit_steps.rb @@ -70,6 +70,7 @@ When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field_name, todo fill_in "#{field_name}", :with => new_value end submit_edit_todo_form(todo) + wait_for_ajax end When /^I edit the context of "([^"]*)" to "([^"]*)"$/ do |todo_name, context_new_name| From 5a24644aadeefd01f3a55d53f3296141f904e417 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sun, 15 Jul 2012 20:45:37 +0200 Subject: [PATCH 33/41] fix #1307 and add basic test --- app/views/search/results.html.erb | 2 +- config/routes.rb | 176 +--------------------- test/functional/search_controller_test.rb | 21 +++ 3 files changed, 26 insertions(+), 173 deletions(-) create mode 100644 test/functional/search_controller_test.rb diff --git a/app/views/search/results.html.erb b/app/views/search/results.html.erb index f057a040..c73d9761 100644 --- a/app/views/search/results.html.erb +++ b/app/views/search/results.html.erb @@ -20,7 +20,7 @@ <%= render :layout => 'show_results_collection', :object => @found_tags, :locals => { :collection_name => "found-tags", :collection_title => t('search.tags_matching_query')} do %> <% @found_tags.each do |tag| -%> - <%= link_to tag.name, {:controller => "todos", :action => "tag", :id => tag.name} -%> + <%= link_to tag.name, tag_path(tag.name) -%> <% end %>

      <% end -%> diff --git a/config/routes.rb b/config/routes.rb index 1093319e..360a8371 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,61 +1,4 @@ Tracksapp::Application.routes.draw do - # The priority is based upon order of creation: - # first created -> highest priority. - - # Sample of regular route: - # match 'products/:id' => 'catalog#view' - # Keep in mind you can assign values other than :controller and :action - - # Sample of named route: - # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase - # This route can be invoked with purchase_url(:id => product.id) - - # Sample resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Sample resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Sample resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Sample resource route with more complex sub-resources - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', :on => :collection - # end - # end - - # Sample resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end - - # You can have the root of your site routed with "root" - # just remember to delete public/index.html. - # root :to => 'welcome#index' - - # See how all your routes lay out with "rake routes" - - # This is a legacy wild controller route that's not recommended for RESTful applications. - # Note: This route will make all actions in every controller accessible via GET requests. - # match ':controller(/:action(/:id))(.:format)' - root :to => 'todos#index' match 'login' => 'login#login' @@ -67,6 +10,9 @@ Tracksapp::Application.routes.draw do match 'review' => "projects#review" match 'calendar' => "todos#calendar" match 'done' => "stats#done", :as => 'done_overview' + + match 'search' => 'search#index' + match 'search/results' => 'search#results', :via => 'post' match 'data' => "data#index" match 'data/csv_notes' => 'data#csv_notes' @@ -184,119 +130,5 @@ Tracksapp::Application.routes.draw do resources :notes resources :preferences - - match 'search' => 'search#index' - match 'search/results' => 'search#results', :via => 'post' - - # map.resources :users, - # :member => {:change_password => :get, :update_password => :post, - # :change_auth_type => :get, :update_auth_type => :post, :complete => :get, - # :refresh_token => :post } - # - # map.with_options :controller => :users do |users| - # users.signup 'signup', :action => "new" - # end - # - # map.resources :contexts, :collection => {:order => :post, :done => :get}, :member => {:done_todos => :get, :all_done_todos => :get} do |contexts| - # contexts.resources :todos, :name_prefix => "context_" - # end - # - # map.resources :projects, - # :collection => {:order => :post, :alphabetize => :post, :actionize => :post, :done => :get}, - # :member => {:done_todos => :get, :all_done_todos => :get, :set_reviewed => :get} do |projects| - # projects.resources :todos, :name_prefix => "project_" - # end - # - # map.with_options :controller => :projects do |projects| - # projects.review 'review', :action => :review - # end - # - # map.resources :notes - # - # map.resources :todos, - # :member => {:toggle_check => :put, :toggle_star => :put, :defer => :put}, - # :collection => {:check_deferred => :post, :filter_to_context => :post, :filter_to_project => :post, :done => :get, :all_done => :get - # } - # - # map.with_options :controller => :todos do |todos| - # todos.home '', :action => "index" - # todos.tickler 'tickler.:format', :action => "list_deferred" - # todos.mobile_tickler 'tickler.m', :action => "list_deferred", :format => 'm' - # - # # This route works for tags with dots like /todos/tag/version1.5 - # # please note that this pattern consumes everything after /todos/tag - # # so /todos/tag/version1.5.xml will result in :name => 'version1.5.xml' - # # UPDATE: added support for mobile view. All tags ending on .m will be - # # routed to mobile view of tags. - # todos.mobile_tag 'todos/tag/:name.m', :action => "tag", :format => 'm' - # todos.text_tag 'todos/tag/:name.txt', :action => "tag", :format => 'txt' - # todos.tag 'todos/tag/:name', :action => "tag", :name => /.*/ - # todos.done_tag 'todos/done/tag/:name', :action => "done_tag" - # todos.all_done_tag 'todos/all_done/tag/:name', :action => "all_done_tag" - # - # todos.auto_complete_for_predecessor 'auto_complete_for_predecessor', :action => 'auto_complete_for_predecessor' - # - # todos.calendar 'calendar.ics', :action => "calendar", :format => 'ics' - # todos.calendar 'calendar.xml', :action => "calendar", :format => 'xml' - # todos.calendar 'calendar', :action => "calendar" - # - # todos.hidden 'hidden.xml', :action => "list_hidden", :format => 'xml' - # - # todos.mobile 'mobile', :action => "index", :format => 'm' - # todos.mobile_abbrev 'm', :action => "index", :format => 'm' - # todos.mobile_abbrev_new 'm/new', :action => "new", :format => 'm' - # - # todos.mobile_todo_show_notes 'todos/notes/:id.m', :action => "show_notes", :format => 'm' - # todos.todo_show_notes 'todos/notes/:id', :action => "show_notes" - # todos.done_todos 'todos/done', :action => :done - # todos.all_done_todos 'todos/all_done', :action => :all_done - # end - # map.root :controller => 'todos' # Make OpenID happy because it needs #root_url defined - # - # map.resources :recurring_todos, :collection => {:done => :get}, - # :member => {:toggle_check => :put, :toggle_star => :put} - # map.with_options :controller => :recurring_todos do |rt| - # rt.recurring_todos 'recurring_todos', :action => 'index' - # end - # - # map.with_options :controller => :login do |login| - # login.login 'login', :action => 'login' - # login.login_cas 'login_cas', :action => 'login_cas' - # login.formatted_login 'login.:format', :action => 'login' - # login.logout 'logout', :action => 'logout' - # login.formatted_logout 'logout.:format', :action => 'logout' - # end - # - # map.with_options :controller => :feedlist do |fl| - # fl.mobile_feeds 'feeds.m', :action => 'index', :format => 'm' - # fl.feeds 'feeds', :action => 'index' - # end - # - # map.with_options :controller => :integrations do |i| - # i.integrations 'integrations', :action => 'index' - # i.rest_api_docs 'integrations/rest_api', :action => "rest_api" - # i.search_plugin 'integrations/search_plugin.xml', :action => 'search_plugin', :format => 'xml' - # i.google_gadget 'integrations/google_gadget.xml', :action => 'google_gadget', :format => 'xml' - # i.cloudmailin 'integrations/cloudmailin', :action => 'cloudmailin' - # end - # - # map.with_options :controller => :preferences do |p| - # p.preferences 'preferences', :action => 'index' - # p.preferences_date_format 'preferences/render_date_format', :action => 'render_date_format' - # end - # - # map.with_options :controller => :stats do |stats| - # stats.stats 'stats', :action => 'index' - # stats.done_overview 'done', :action => 'done' - # end - # - # map.search 'search', :controller => 'search', :action => 'index' - # map.data 'data', :controller => 'data', :action => 'index' - # - # Translate::Routes.translation_ui(map) if Rails.env != "production" - # - # # Install the default route as the lowest priority. - # map.connect ':controller/:action/:id' - # - + end diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb new file mode 100644 index 00000000..7d99c59d --- /dev/null +++ b/test/functional/search_controller_test.rb @@ -0,0 +1,21 @@ +require File.expand_path(File.dirname(__FILE__) + '/../test_helper') + +class SearchControllerTest < ActionController::TestCase + + def setup + end + + def test_get_search_page + login_as :admin_user + get :index + assert_response 200 + end + + def test_search_for_todo_with_tag + login_as :admin_user + post :results, :search => "gates" + assert_response 200 + assert_equal 3, assigns['count'], "should have found 3 todos" + end + +end From 7c1cd2a144d22d157dc0f005e476caa6bc57a919 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sun, 15 Jul 2012 21:28:42 +0200 Subject: [PATCH 34/41] fix #1310. Add test for this Found that I had a lot of tests commented out. They have some regressions I will fix later --- app/assets/javascripts/tracks.js | 4 +- app/controllers/todos_controller.rb | 8 +- app/models/todo.rb | 10 +- app/views/todos/index.rss.builder | 2 +- config/routes.rb | 1 + test/functional/todos_controller_test.rb | 1365 +++++++++++----------- 6 files changed, 696 insertions(+), 694 deletions(-) diff --git a/app/assets/javascripts/tracks.js b/app/assets/javascripts/tracks.js index 8bb7e154..7f34644a 100644 --- a/app/assets/javascripts/tracks.js +++ b/app/assets/javascripts/tracks.js @@ -518,8 +518,8 @@ var TodoItems = { ui.draggable.remove(); $('.drop_target').hide(); - ajax_options = default_ajax_options_for_scripts('POST', relative_to_root('todos/change_context'), target); - ajax_options.data += "&todo[id]="+dragged_todo + "&todo[context_id]="+context_id + ajax_options = default_ajax_options_for_scripts('POST', relative_to_root('todos/'+dragged_todo + '/change_context'), target); + ajax_options.data += "&todo[context_id]="+context_id $.ajax(ajax_options); }, setup_drag_and_drop: function() { diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index fca3a6e6..77977baf 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -343,7 +343,7 @@ class TodosController < ApplicationController def remove_predecessor @source_view = params['_source_view'] || 'todo' - @todo = current_user.todos.find_by_id(params['id']).includes(Todo::DEFAULT_INCLUDES) + @todo = current_user.todos.includes(Todo::DEFAULT_INCLUDES).find_by_id(params['id']) @predecessor = current_user.todos.find_by_id(params['predecessor']) @predecessors = @predecessor.predecessors @successor = @todo @@ -449,8 +449,8 @@ class TodosController < ApplicationController end def change_context - # TODO: is this method used? - @todo = Todo.find_by_id(params[:todo][:id]) + # change context if you drag a todo to another context + @todo = Todo.find_by_id(params[:id]) @original_item_context_id = @todo.context_id @context = Context.find_by_id(params[:todo][:context_id]) @todo.context = @context @@ -1225,7 +1225,7 @@ class TodosController < ApplicationController end def update_todo_state_if_project_changed - if ( @project_changed ) then + if @project_changed @todo.update_state_from_project @remaining_undone_in_project = current_user.projects.find_by_id(@original_item_project_id).todos.active.count if source_view_is :project end diff --git a/app/models/todo.rb b/app/models/todo.rb index 53cc99a9..aaebce79 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -209,14 +209,14 @@ class Todo < ActiveRecord::Base end def update_state_from_project - if self.state == 'project_hidden' and !self.project.hidden? + if self.state == 'project_hidden' && !self.project.hidden? if self.uncompleted_predecessors.empty? - self.state = 'active' + self.activate! else - self.state = 'pending' + self.block! end - elsif self.state == 'active' and self.project.hidden? - self.state = 'project_hidden' + elsif self.state == 'active' && self.project.hidden? + self.hide! end self.save! end diff --git a/app/views/todos/index.rss.builder b/app/views/todos/index.rss.builder index 423239a5..e6e61a39 100644 --- a/app/views/todos/index.rss.builder +++ b/app/views/todos/index.rss.builder @@ -12,7 +12,7 @@ xml.rss :version => "2.0" do xml.title h(todo.description) xml.description feed_content_for_todo(todo) xml.pubDate todo.created_at.to_s(:rfc822) - xml.link todo.project ? project_url(todo.project) : context_url(todo.context) + xml.link (todo.project && !todo.project.is_a?(NullProject)) ? project_url(todo.project) : context_url(todo.context) xml.guid todo_url(todo) end end diff --git a/config/routes.rb b/config/routes.rb index 360a8371..f34faf80 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -88,6 +88,7 @@ Tracksapp::Application.routes.draw do get 'show_notes' get 'convert_to_project' # TODO: convert to PUT/POST get 'remove_predecessor' # TODO: convert to PUT/POST + post 'change_context' end collection do get 'done' diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index a9ffd45e..d9c7f4f4 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -150,687 +150,688 @@ class TodosControllerTest < ActionController::TestCase assert_xml_select "error", "Context can't be blank" end end - # - # def test_create_deferred_todo - # original_todo_count = Todo.count - # login_as(:admin_user) - # put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2026", 'show_from' => '30/10/2026'}, "tag_list"=>"foo bar" - # assert_equal original_todo_count + 1, Todo.count - # end - # - # def test_update_todo_project - # t = Todo.find(1) - # login_as(:admin_user) - # xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" - # t = Todo.find(1) - # assert_equal 1, t.project_id - # end - # - # def test_update_todo_project_to_none - # t = Todo.find(1) - # login_as(:admin_user) - # xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"None", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" - # t = Todo.find(1) - # assert_nil t.project_id - # end - # - # def test_update_todo_to_deferred_is_reflected_in_badge_count - # login_as(:admin_user) - # get :index - # assert_equal 11, assigns['count'] - # xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Make more money than Billy Gates", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006", "show_from"=>"30/11/2030"}, "tag_list"=>"foo bar" - # assert_equal 10, assigns['down_count'] - # end - # - # def test_update_todo - # t = Todo.find(1) - # login_as(:admin_user) - # xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" - # t = Todo.find(1) - # assert_equal "Call Warren Buffet to find out how much he makes per day", t.description - # assert_equal "bar, foo", t.tag_list - # expected = Date.new(2006,11,30) - # actual = t.due.to_date - # assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" - # end - # - # def test_update_todos_with_blank_project_name - # t = Todo.find(1) - # login_as(:admin_user) - # xhr :post, :update, :id => 1, :_source_view => 'todo', :project_name => '', "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" - # t.reload - # assert t.project.nil? - # end - # - # def test_update_todo_tags_to_none - # t = Todo.find(1) - # login_as(:admin_user) - # xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"" - # t = Todo.find(1) - # assert_equal true, t.tag_list.empty? - # end - # - # def test_update_todo_tags_with_whitespace_and_dots - # t = Todo.find(1) - # login_as(:admin_user) - # taglist = " one , two,three ,four, 8.1.2, version1.5" - # xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>taglist - # t = Todo.find(1) - # assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list - # end - # - # def test_add_multiple_todos - # login_as(:admin_user) - # - # start_count = Todo.count - # put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - # :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'"} - # - # assert_equal start_count+3, Todo.count, "two todos should have been added" - # end - # - # def test_add_multiple_todos_with_validation_error - # login_as(:admin_user) - # - # long_string = "a" * 500 - # - # start_count = Todo.count - # put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - # :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'\n#{long_string}"} - # - # assert_equal start_count, Todo.count, "no todos should have been added" - # end - # - # def test_add_multiple_dependent_todos - # login_as(:admin_user) - # - # start_count = Todo.count - # put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - # :multiple_todos=>"a\nb"}, :todos_sequential => 'true' - # put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - # :multiple_todos=>"c\nd"}, :todos_sequential => 'false' - # - # assert_equal start_count+4, Todo.count, "four todos should have been added" - # - # # find a,b,c and d - # %w{a b c d}.each do |todo| - # eval "@#{todo} = Todo.find_by_description('#{todo}')" - # eval "assert !@#{todo}.nil?, 'a todo with description \"#{todo}\" should just have been added'" - # end - # - # assert @b.predecessors.include?(@a), "a should be a predeccesor of b" - # assert !@d.predecessors.include?(@c), "c should not be a predecessor of d" - # end - # - # def test_find_tagged_with - # login_as(:admin_user) - # @user = User.find(@request.session['user_id']) - # tag = Tag.find_by_name('foo').taggings - # @tagged = tag.count - # get :tag, :name => 'foo' - # assert_response :success - # assert_equal 3, @tagged - # end - # - # def test_rss_feed - # login_as(:admin_user) - # get :index, { :format => "rss" } - # assert_equal 'application/rss+xml', @response.content_type - # # puts @response.body - # - # assert_xml_select 'rss[version="2.0"]' do - # assert_select 'channel' do - # assert_select '>title', 'Actions' - # assert_select '>description', "Actions for #{users(:admin_user).display_name}" - # assert_select 'language', 'en-us' - # assert_select 'ttl', '40' - # assert_select 'item', 11 do - # assert_select 'title', /.+/ - # assert_select 'description', /.*/ - # assert_select 'link', %r{http://test.host/contexts/.+} - # assert_select 'guid', %r{http://test.host/todos/.+} - # assert_select 'pubDate', todos(:book).updated_at.to_s(:rfc822) - # end - # end - # end - # end - # - # def test_rss_feed_with_limit - # login_as(:admin_user) - # get :index, { :format => "rss", :limit => '5' } - # - # assert_xml_select 'rss[version="2.0"]' do - # assert_select 'channel' do - # assert_select '>title', 'Actions' - # assert_select '>description', "Actions for #{users(:admin_user).display_name}" - # assert_select 'item', 5 do - # assert_select 'title', /.+/ - # assert_select 'description', /.*/ - # end - # end - # end - # end - # - # def test_rss_feed_not_accessible_to_anonymous_user_without_token - # login_as nil - # get :index, { :format => "rss" } - # assert_response 401 - # end - # - # def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token - # login_as nil - # get :index, { :format => "rss", :token => 'foo' } - # assert_response 401 - # end - # - # def test_rss_feed_accessible_to_anonymous_user_with_valid_token - # login_as nil - # get :index, { :format => "rss", :token => users(:admin_user).token } - # assert_response :ok - # end - # - # def test_atom_feed_content - # login_as :admin_user - # get :index, { :format => "atom" } - # assert_equal 'application/atom+xml', @response.content_type - # # #puts @response.body - # - # assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do - # assert_xml_select '>title', 'Actions' - # assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" - # assert_xml_select 'entry', 11 do - # assert_xml_select 'title', /.+/ - # assert_xml_select 'content[type="html"]', /.*/ - # assert_xml_select 'published', /(#{Regexp.escape(todos(:book).updated_at.xmlschema)}|#{Regexp.escape(projects(:moremoney).updated_at.xmlschema)})/ - # end - # end - # end - # - # def test_atom_feed_not_accessible_to_anonymous_user_without_token - # login_as nil - # get :index, { :format => "atom" } - # assert_response 401 - # end - # - # def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token - # login_as nil - # get :index, { :format => "atom", :token => 'foo' } - # assert_response 401 - # end - # - # def test_atom_feed_accessible_to_anonymous_user_with_valid_token - # login_as nil - # get :index, { :format => "atom", :token => users(:admin_user).token } - # assert_response :ok - # end - # - # def test_text_feed_content - # login_as(:admin_user) - # get :index, { :format => "txt" } - # assert_equal 'text/plain', @response.content_type - # assert !(/ /.match(@response.body)) - # # #puts @response.body - # end - # - # def test_text_feed_not_accessible_to_anonymous_user_without_token - # login_as nil - # get :index, { :format => "txt" } - # assert_response 401 - # end - # - # def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token - # login_as nil - # get :index, { :format => "txt", :token => 'foo' } - # assert_response 401 - # end - # - # def test_text_feed_accessible_to_anonymous_user_with_valid_token - # login_as nil - # get :index, { :format => "txt", :token => users(:admin_user).token } - # assert_response :ok - # end - # - # def test_ical_feed_content - # login_as :admin_user - # get :index, { :format => "ics" } - # assert_equal 'text/calendar', @response.content_type - # assert !(/ /.match(@response.body)) - # # #puts @response.body - # end - # - # def test_mobile_index_uses_text_html_content_type - # login_as(:admin_user) - # get :index, { :format => "m" } - # assert_equal 'text/html', @response.content_type - # end - # - # def test_mobile_index_assigns_down_count - # login_as(:admin_user) - # get :index, { :format => "m" } - # assert_equal 11, assigns['down_count'] - # end - # - # def test_mobile_create_action_creates_a_new_todo - # login_as(:admin_user) - # post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - # "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - # "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - # "project_id"=>"1", - # "notes"=>"test notes", "description"=>"test_mobile_create_action"}} - # t = Todo.find_by_description("test_mobile_create_action") - # assert_not_nil t - # assert_equal 2, t.context_id - # assert_equal 1, t.project_id - # assert t.active? - # assert_equal 'test notes', t.notes - # assert_nil t.show_from - # assert_equal Date.new(2007,1,2), t.due.to_date - # end - # - # def test_mobile_create_action_redirects_to_mobile_home_page_when_successful - # login_as(:admin_user) - # post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - # "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - # "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - # "project_id"=>"1", - # "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} - # assert_redirected_to '/mobile' - # end - # - # def test_mobile_create_action_renders_new_template_when_save_fails - # login_as(:admin_user) - # post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - # "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - # "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - # "project_id"=>"1", - # "notes"=>"test notes"}, "tag_list"=>"test, test2"} - # assert_template 'todos/new' - # end - # - # def test_toggle_check_on_recurring_todo - # login_as(:admin_user) - # - # # link todo_1 and recurring_todo_1 - # recurring_todo_1 = RecurringTodo.find(1) - # todo_1 = Todo.find_by_recurring_todo_id(1) - # - # # mark todo_1 as complete by toggle_check - # xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' - # todo_1.reload - # assert todo_1.completed? - # - # # check that there is only one active todo belonging to recurring_todo - # count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) - # assert_equal 1, count - # - # # check there is a new todo linked to the recurring pattern - # next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) - # assert_equal "Call Bill Gates every day", next_todo.description - # # check that the new todo is not the same as todo_1 - # assert_not_equal todo_1.id, next_todo.id - # - # # change recurrence pattern to monthly and set show_from 2 days before due - # # date this forces the next todo to be put in the tickler - # recurring_todo_1.show_from_delta = 2 - # recurring_todo_1.show_always = 0 - # recurring_todo_1.target = 'due_date' - # recurring_todo_1.recurring_period = 'monthly' - # recurring_todo_1.recurrence_selector = 0 - # recurring_todo_1.every_other1 = 1 - # recurring_todo_1.every_other2 = 2 - # recurring_todo_1.every_other3 = 5 - # # use assert to catch validation errors if present. we need to replace - # # this with a good factory implementation - # assert recurring_todo_1.save - # - # # mark next_todo as complete by toggle_check - # xhr :post, :toggle_check, :id => next_todo.id, :_source_view => 'todo' - # next_todo.reload - # assert next_todo.completed? - # - # # check that there are three todos belonging to recurring_todo: two - # # completed and one deferred - # count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id}) - # assert_equal 3, count - # - # # check there is a new todo linked to the recurring pattern in the tickler - # next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) - # assert !next_todo.nil? - # assert_equal "Call Bill Gates every day", next_todo.description - # # check that the todo is in the tickler - # assert !next_todo.show_from.nil? - # end - # - # def test_toggle_check_on_rec_todo_show_from_today - # login_as(:admin_user) - # - # # link todo_1 and recurring_todo_1 - # recurring_todo_1 = RecurringTodo.find(1) - # set_user_to_current_time_zone(recurring_todo_1.user) - # todo_1 = Todo.find_by_recurring_todo_id(1) - # today = Time.zone.now.at_midnight - # - # # change recurrence pattern to monthly and set show_from to today - # recurring_todo_1.target = 'show_from_date' - # recurring_todo_1.recurring_period = 'monthly' - # recurring_todo_1.recurrence_selector = 0 - # recurring_todo_1.every_other1 = today.day - # recurring_todo_1.every_other2 = 1 - # assert recurring_todo_1.save - # - # # mark todo_1 as complete by toggle_check, this gets rid of todo_1 that was - # # not correctly created from the adjusted recurring pattern we defined - # # above. - # xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' - # todo_1.reload - # assert todo_1.completed? - # - # # locate the new todo. This todo is created from the adjusted recurring - # # pattern defined in this test - # new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) - # assert !new_todo.nil? - # - # # mark new_todo as complete by toggle_check - # xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo' - # new_todo.reload - # assert todo_1.completed? - # - # # locate the new todo in tickler - # new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) - # assert !new_todo.nil? - # - # assert_equal "Call Bill Gates every day", new_todo.description - # # check that the new todo is not the same as todo_1 - # assert_not_equal todo_1.id, new_todo.id - # - # # check that the new_todo is in the tickler to show next month - # assert !new_todo.show_from.nil? - # - # # do not use today here. It somehow gets messed up with the timezone calculation. - # next_month = (Time.zone.now + 1.month).at_midnight - # - # assert_equal next_month.utc.to_date.to_s(:db), new_todo.show_from.utc.to_date.to_s(:db) - # end - # - # def test_check_for_next_todo - # login_as :admin_user - # - # recurring_todo_1 = RecurringTodo.find(5) - # @todo = Todo.find_by_recurring_todo_id(1) - # assert @todo.from_recurring_todo? - # # rewire @todo to yearly recurring todo - # @todo.recurring_todo_id = 5 - # - # # make todo due tomorrow and change recurring date also to tomorrow - # @todo.due = Time.zone.now + 1.day - # @todo.save - # recurring_todo_1.every_other1 = @todo.due.day - # recurring_todo_1.every_other2 = @todo.due.month - # recurring_todo_1.save - # - # # mark todo complete - # xhr :post, :toggle_check, :id => @todo.id, :_source_view => 'todo' - # @todo.reload - # assert @todo.completed? - # - # # check that there is no active todo - # next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) - # assert next_todo.nil? - # - # # check for new deferred todo - # next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) - # assert !next_todo.nil? - # # check that the due date of the new todo is later than tomorrow - # assert next_todo.due > @todo.due - # end - # - # def test_removing_hidden_project_activates_todo - # login_as(:admin_user) - # - # # get a project and hide it, todos in the project should be hidden - # p = projects(:timemachine) - # p.hide! - # assert p.reload().hidden? - # todo = p.todos.first - # assert_equal "project_hidden", todo.state - # - # # clear project from todo: the todo should be unhidden - # xhr :post, :update, :id => 5, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} - # todo.reload() - # assert_equal "active", todo.state - # end - # - # def test_url_with_slash_in_query_string_are_parsed_correctly - # # See http://blog.swivel.com/code/2009/06/rails-auto_link-and-certain-query-strings.html - # login_as(:admin_user) - # user = users(:admin_user) - # todo = user.todos.first - # url = "http://example.com/foo?bar=/baz" - # todo.notes = "foo #{url} bar" - # todo.save! - # get :index - # assert_select("a[href=#{url}]") - # end - # - # def test_format_note_normal - # login_as(:admin_user) - # todo = users(:admin_user).todos.first - # todo.notes = "A normal description." - # todo.save! - # get :index - # assert_select("div#notes_todo_#{todo.id}", "A normal description.") - # end - # - # def test_format_note_markdown - # login_as(:admin_user) - # todo = users(:admin_user).todos.first - # todo.notes = "A *bold description*." - # todo.save! - # get :index - # assert_select("div#notes_todo_#{todo.id}", "A bold description.") - # assert_select("div#notes_todo_#{todo.id} strong", "bold description") - # end - # - # def test_format_note_link - # login_as(:admin_user) - # todo = users(:admin_user).todos.first - # todo.notes = "A link to http://github.com/." - # todo.save! - # get :index - # assert_select("div#notes_todo_#{todo.id}", 'A link to http://github.com/.') - # assert_select("div#notes_todo_#{todo.id} a[href=http://github.com/]", 'http://github.com/') - # end - # - # def test_format_note_link_message - # login_as(:admin_user) - # todo = users(:admin_user).todos.first - # todo.raw_notes = "A Mail.app message:// link" - # todo.save! - # get :index - # assert_select("div#notes_todo_#{todo.id}", 'A Mail.app message://<ABCDEF-GHADB-123455-FOO-BAR@example.com> link') - # assert_select("div#notes_todo_#{todo.id} a", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>') - # assert_select("div#notes_todo_#{todo.id} a[href=message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>]", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>') - # end - # - # def test_format_note_link_onenote - # login_as(:admin_user) - # todo = users(:admin_user).todos.first - # todo.notes = ' "link me to onenote":onenote:///E:\OneNote\dir\notes.one#PAGE§ion-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end' - # todo.save! - # get :index - # assert_select("div#notes_todo_#{todo.id}", 'link me to onenote') - # assert_select("div#notes_todo_#{todo.id} a", 'link me to onenote') - # assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:\\OneNote\\dir\\notes.one#PAGE&section-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end]", 'link me to onenote') - # end - # - # def test_get_boolean_expression_from_parameters_of_tag_view_single_tag - # login_as(:admin_user) - # get :tag, :name => "single" - # assert_equal true, assigns['single_tag'], "should recognize it is a single tag name" - # assert_equal "single", assigns['tag_expr'][0][0], "should store the single tag" - # assert_equal "single", assigns['tag_name'], "should store the single tag name" - # end - # - # def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags - # login_as(:admin_user) - # get :tag, :name => "multiple", :and => "tags", :and1 => "present", :and2 => "here" - # assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - # assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" - # end - # - # def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags_without_digitless_and - # login_as(:admin_user) - # get :tag, :name => "multiple", :and1 => "tags", :and2 => "present", :and3 => "here" - # assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - # assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" - # end - # - # def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs - # login_as(:admin_user) - # get :tag, :name => "multiple,tags,present" - # assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - # assert_equal 1, assigns['tag_expr'].size, "should have 1 expressions" - # assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" - # end - # - # def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs_and_ANDS - # login_as(:admin_user) - # get :tag, :name => "multiple,tags,present", :and => "here,is,two", :and1=>"and,three" - # assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - # assert_equal 3, assigns['tag_expr'].size, "should have 3 expressions" - # assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" - # assert_equal 3, assigns['tag_expr'][1].size, "should have 3 ORs in 2nd expression" - # assert_equal 2, assigns['tag_expr'][2].size, "should have 2 ORs in 3rd expression" - # end - # - # def test_set_right_title - # login_as(:admin_user) - # - # get :tag, :name => "foo" - # assert_equal "foo", assigns['tag_title'] - # get :tag, :name => "foo,bar", :and => "baz" - # assert_equal "foo,bar AND baz", assigns['tag_title'] - # end - # - # def test_set_default_tag - # login_as(:admin_user) - # - # get :tag, :name => "foo" - # assert_equal "foo", assigns['initial_tags'] - # get :tag, :name => "foo,bar", :and => "baz" - # assert_equal "foo", assigns['initial_tags'] - # end - # - # def test_tag_text_feed_not_accessible_to_anonymous_user_without_token - # login_as nil - # get :tag, {:name => "foo", :format => "txt" } - # assert_response 401 - # end - # - # def test_make_todo_dependent - # login_as(:admin_user) - # - # predecessor = todos(:call_bill) - # successor = todos(:call_dino_ext) - # - # # no predecessors yet - # assert_equal 0, successor.predecessors.size - # - # # add predecessor - # put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id - # - # assert_equal 1, successor.predecessors.count - # assert_equal predecessor.id, successor.predecessors.first.id - # end - # - # def test_make_todo_with_dependencies_dependent - # login_as(:admin_user) - # - # predecessor = todos(:call_bill) - # successor = todos(:call_dino_ext) - # other_todo = todos(:phone_grandfather) - # - # # predecessor -> successor - # put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id - # - # # other_todo -> predecessor -> successor - # put :add_predecessor, :predecessor=>other_todo.id, :successor=>predecessor.id - # - # assert_equal 1, successor.predecessors(true).count - # assert_equal 0, other_todo.predecessors(true).count - # assert_equal 1, predecessor.predecessors(true).count - # assert_equal predecessor.id, successor.predecessors.first.id - # assert_equal other_todo.id, predecessor.predecessors.first.id - # end - # - # def test_mingle_dependent_todos_leave - # # based on #1271 - # login_as(:admin_user) - # - # t1 = todos(:call_bill) - # t2 = todos(:call_dino_ext) - # t3 = todos(:phone_grandfather) - # t4 = todos(:construct_dilation_device) - # - # # t1 -> t2 - # put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id - # # t3 -> t4 - # put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id - # - # # t2 -> t4 - # put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id - # - # # should be: t1 -> t2 -> t4 and t3 -> t4 - # assert t4.predecessors.map(&:id).include?(t2.id) - # assert t4.predecessors.map(&:id).include?(t3.id) - # assert t2.predecessors.map(&:id).include?(t1.id) - # end - # - # def test_mingle_dependent_todos_root - # # based on #1271 - # login_as(:admin_user) - # - # t1 = todos(:call_bill) - # t2 = todos(:call_dino_ext) - # t3 = todos(:phone_grandfather) - # t4 = todos(:construct_dilation_device) - # - # # t1 -> t2 - # put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id - # # t3 -> t4 - # put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id - # - # # t3 -> t2 - # put :add_predecessor, :predecessor=>t3.id, :successor=>t2.id - # - # # should be: t1 -> t2 and t3 -> t4 & t2 - # assert t3.successors.map(&:id).include?(t4.id) - # assert t3.successors.map(&:id).include?(t2.id) - # assert t2.predecessors.map(&:id).include?(t1.id) - # assert t2.predecessors.map(&:id).include?(t3.id) - # end - # - # def test_unmingle_dependent_todos - # # based on #1271 - # login_as(:admin_user) - # - # t1 = todos(:call_bill) - # t2 = todos(:call_dino_ext) - # t3 = todos(:phone_grandfather) - # t4 = todos(:construct_dilation_device) - # - # # create same dependency tree as previous test - # # should be: t1 -> t2 -> t4 and t3 -> t4 - # put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id - # put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id - # put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id - # - # # removing t4 as successor of t2 should leave t4 blocked with t3 as predecessor - # put :remove_predecessor, :predecessor=>t2.id, :id=>t4.id - # - # t4.reload - # assert t4.pending?, "t4 should remain pending" - # assert t4.predecessors.map(&:id).include?(t3.id) - # end + + def test_create_deferred_todo + original_todo_count = Todo.count + login_as(:admin_user) + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2026", 'show_from' => '30/10/2026'}, "tag_list"=>"foo bar" + assert_equal original_todo_count + 1, Todo.count + end + + def test_update_todo_project + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" + t = Todo.find(1) + assert_equal 1, t.project_id + end + + def test_update_todo_project_to_none + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"None", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" + t = Todo.find(1) + assert_nil t.project_id + end + + def test_update_todo_to_deferred_is_reflected_in_badge_count + login_as(:admin_user) + get :index + assert_equal 11, assigns['count'] + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Make more money than Billy Gates", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006", "show_from"=>"30/11/2030"}, "tag_list"=>"foo bar" + assert_equal 10, assigns['down_count'] + end + + def test_update_todo + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" + t = Todo.find(1) + assert_equal "Call Warren Buffet to find out how much he makes per day", t.description + assert_equal "bar, foo", t.tag_list + expected = Date.new(2006,11,30) + actual = t.due.to_date + assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" + end + + def test_update_todos_with_blank_project_name + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', :project_name => '', "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" + t.reload + assert t.project.nil? + end + + def test_update_todo_tags_to_none + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"" + t = Todo.find(1) + assert_equal true, t.tag_list.empty? + end + + def test_update_todo_tags_with_whitespace_and_dots + t = Todo.find(1) + login_as(:admin_user) + taglist = " one , two,three ,four, 8.1.2, version1.5" + xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>taglist + t = Todo.find(1) + assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list + end + + def test_add_multiple_todos + login_as(:admin_user) + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'"} + + assert_equal start_count+3, Todo.count, "two todos should have been added" + end + + def test_add_multiple_todos_with_validation_error + login_as(:admin_user) + + long_string = "a" * 500 + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'\n#{long_string}"} + + assert_equal start_count, Todo.count, "no todos should have been added" + end + + def test_add_multiple_dependent_todos + login_as(:admin_user) + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb"}, :todos_sequential => 'true' + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"c\nd"}, :todos_sequential => 'false' + + assert_equal start_count+4, Todo.count, "four todos should have been added" + + # find a,b,c and d + %w{a b c d}.each do |todo| + eval "@#{todo} = Todo.find_by_description('#{todo}')" + eval "assert !@#{todo}.nil?, 'a todo with description \"#{todo}\" should just have been added'" + end + + assert @b.predecessors.include?(@a), "a should be a predeccesor of b" + assert !@d.predecessors.include?(@c), "c should not be a predecessor of d" + end + + def test_find_tagged_with + login_as(:admin_user) + @user = User.find(@request.session['user_id']) + tag = Tag.find_by_name('foo').taggings + @tagged = tag.count + get :tag, :name => 'foo' + assert_response :success + assert_equal 3, @tagged + end + + def test_rss_feed + login_as(:admin_user) + get :index, { :format => "rss" } + assert_equal 'application/rss+xml', @response.content_type + # puts @response.body + + assert_xml_select 'rss[version="2.0"]' do + assert_select 'channel' do + assert_select '>title', 'Tracks Actions' + assert_select '>description', "Actions for #{users(:admin_user).display_name}" + assert_select 'language', 'en-us' + assert_select 'ttl', '40' + assert_select 'item', 17 do + assert_select 'title', /.+/ + assert_select 'description', /.*/ + assert_select 'link', %r{http://test.host/contexts/.+} + assert_select 'guid', %r{http://test.host/todos/.+} + assert_select 'pubDate', todos(:book).updated_at.to_s(:rfc822) + end + end + end + end + + def test_rss_feed_with_limit + login_as(:admin_user) + get :index, { :format => "rss", :limit => '5' } + + assert_xml_select 'rss[version="2.0"]' do + assert_select 'channel' do + assert_select '>title', 'Tracks Actions' + assert_select '>description', "Actions for #{users(:admin_user).display_name}" + assert_select 'item', 5 do + assert_select 'title', /.+/ + assert_select 'description', /.*/ + end + end + end + end + + def test_rss_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "rss" } + assert_response 401 + end + + def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "rss", :token => 'foo' } + assert_response 401 + end + + def test_rss_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "rss", :token => users(:admin_user).token } + assert_response :ok + end + + def test_atom_feed_content + login_as :admin_user + get :index, { :format => "atom" } + assert_equal 'application/atom+xml', @response.content_type + # #puts @response.body + + assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do + assert_xml_select '>title', 'Tracks Actions' + assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" + assert_xml_select 'entry', 11 do + assert_xml_select 'title', /.+/ + assert_xml_select 'content[type="html"]', /.*/ + assert_xml_select 'published', /(#{Regexp.escape(todos(:book).updated_at.xmlschema)}|#{Regexp.escape(projects(:moremoney).updated_at.xmlschema)})/ + end + end + end + + def test_atom_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "atom" } + assert_response 401 + end + + def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "atom", :token => 'foo' } + assert_response 401 + end + + def test_atom_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "atom", :token => users(:admin_user).token } + assert_response :ok + end + + def test_text_feed_content + login_as(:admin_user) + get :index, { :format => "txt" } + assert_equal 'text/plain', @response.content_type + assert !(/ /.match(@response.body)) + # #puts @response.body + end + + def test_text_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "txt" } + assert_response 401 + end + + def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "txt", :token => 'foo' } + assert_response 401 + end + + def test_text_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "txt", :token => users(:admin_user).token } + assert_response :ok + end + + def test_ical_feed_content + login_as :admin_user + get :index, { :format => "ics" } + assert_equal 'text/calendar', @response.content_type + assert !(/ /.match(@response.body)) + # #puts @response.body + end + + def test_mobile_index_uses_text_html_content_type + login_as(:admin_user) + get :index, { :format => "m" } + assert_equal 'text/html', @response.content_type + end + + def test_mobile_index_assigns_down_count + login_as(:admin_user) + get :index, { :format => "m" } + assert_equal 11, assigns['down_count'] + end + + def test_mobile_create_action_creates_a_new_todo + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes", "description"=>"test_mobile_create_action"}} + t = Todo.find_by_description("test_mobile_create_action") + assert_not_nil t + assert_equal 2, t.context_id + assert_equal 1, t.project_id + assert t.active? + assert_equal 'test notes', t.notes + assert_nil t.show_from + assert_equal Date.new(2007,1,2), t.due.to_date + end + + def test_mobile_create_action_redirects_to_mobile_home_page_when_successful + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} + assert_redirected_to '/mobile' + end + + def test_mobile_create_action_renders_new_template_when_save_fails + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes"}, "tag_list"=>"test, test2"} + assert_template 'todos/new' + end + + def test_toggle_check_on_recurring_todo + login_as(:admin_user) + + # link todo_1 and recurring_todo_1 + recurring_todo_1 = RecurringTodo.find(1) + todo_1 = Todo.find_by_recurring_todo_id(1) + + # mark todo_1 as complete by toggle_check + xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' + todo_1.reload + assert todo_1.completed? + + # check that there is only one active todo belonging to recurring_todo + count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) + assert_equal 1, count + + # check there is a new todo linked to the recurring pattern + next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) + assert_equal "Call Bill Gates every day", next_todo.description + # check that the new todo is not the same as todo_1 + assert_not_equal todo_1.id, next_todo.id + + # change recurrence pattern to monthly and set show_from 2 days before due + # date this forces the next todo to be put in the tickler + recurring_todo_1.show_from_delta = 2 + recurring_todo_1.show_always = 0 + recurring_todo_1.target = 'due_date' + recurring_todo_1.recurring_period = 'monthly' + recurring_todo_1.recurrence_selector = 0 + recurring_todo_1.every_other1 = 1 + recurring_todo_1.every_other2 = 2 + recurring_todo_1.every_other3 = 5 + # use assert to catch validation errors if present. we need to replace + # this with a good factory implementation + assert recurring_todo_1.save + + # mark next_todo as complete by toggle_check + xhr :post, :toggle_check, :id => next_todo.id, :_source_view => 'todo' + next_todo.reload + assert next_todo.completed? + + # check that there are three todos belonging to recurring_todo: two + # completed and one deferred + count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id}) + assert_equal 3, count + + # check there is a new todo linked to the recurring pattern in the tickler + next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) + assert !next_todo.nil? + assert_equal "Call Bill Gates every day", next_todo.description + # check that the todo is in the tickler + assert !next_todo.show_from.nil? + end + + def test_toggle_check_on_rec_todo_show_from_today + login_as(:admin_user) + + # link todo_1 and recurring_todo_1 + recurring_todo_1 = RecurringTodo.find(1) + set_user_to_current_time_zone(recurring_todo_1.user) + todo_1 = Todo.find_by_recurring_todo_id(1) + today = Time.zone.now.at_midnight + + # change recurrence pattern to monthly and set show_from to today + recurring_todo_1.target = 'show_from_date' + recurring_todo_1.recurring_period = 'monthly' + recurring_todo_1.recurrence_selector = 0 + recurring_todo_1.every_other1 = today.day + recurring_todo_1.every_other2 = 1 + assert recurring_todo_1.save + + # mark todo_1 as complete by toggle_check, this gets rid of todo_1 that was + # not correctly created from the adjusted recurring pattern we defined + # above. + xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' + todo_1.reload + assert todo_1.completed? + + # locate the new todo. This todo is created from the adjusted recurring + # pattern defined in this test + new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) + assert !new_todo.nil? + + # mark new_todo as complete by toggle_check + xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo' + new_todo.reload + assert todo_1.completed? + + # locate the new todo in tickler + new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) + assert !new_todo.nil? + + assert_equal "Call Bill Gates every day", new_todo.description + # check that the new todo is not the same as todo_1 + assert_not_equal todo_1.id, new_todo.id + + # check that the new_todo is in the tickler to show next month + assert !new_todo.show_from.nil? + + # do not use today here. It somehow gets messed up with the timezone calculation. + next_month = (Time.zone.now + 1.month).at_midnight + + assert_equal next_month.utc.to_date.to_s(:db), new_todo.show_from.utc.to_date.to_s(:db) + end + + def test_check_for_next_todo + login_as :admin_user + + recurring_todo_1 = RecurringTodo.find(5) + @todo = Todo.find_by_recurring_todo_id(1) + assert @todo.from_recurring_todo? + # rewire @todo to yearly recurring todo + @todo.recurring_todo_id = 5 + + # make todo due tomorrow and change recurring date also to tomorrow + @todo.due = Time.zone.now + 1.day + @todo.save + recurring_todo_1.every_other1 = @todo.due.day + recurring_todo_1.every_other2 = @todo.due.month + recurring_todo_1.save + + # mark todo complete + xhr :post, :toggle_check, :id => @todo.id, :_source_view => 'todo' + @todo.reload + assert @todo.completed? + + # check that there is no active todo + next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) + assert next_todo.nil? + + # check for new deferred todo + next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) + assert !next_todo.nil? + # check that the due date of the new todo is later than tomorrow + assert next_todo.due > @todo.due + end + + def test_removing_hidden_project_activates_todo + login_as(:admin_user) + + # get a project and hide it, todos in the project should be hidden + p = projects(:timemachine) + p.hide! + assert p.reload().hidden? + todo = p.todos.first + assert_equal "project_hidden", todo.state + + # clear project from todo: the todo should be unhidden + xhr :post, :update, :id => 5, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} + todo.reload() + assert assigns['project_changed'] + assert_equal "active", todo.state + end + + def test_url_with_slash_in_query_string_are_parsed_correctly + # See http://blog.swivel.com/code/2009/06/rails-auto_link-and-certain-query-strings.html + login_as(:admin_user) + user = users(:admin_user) + todo = user.todos.first + url = "http://example.com/foo?bar=/baz" + todo.notes = "foo #{url} bar" + todo.save! + get :index + assert_select("a[href=#{url}]") + end + + def test_format_note_normal + login_as(:admin_user) + todo = users(:admin_user).todos.first + todo.notes = "A normal description." + todo.save! + get :index + assert_select("div#notes_todo_#{todo.id}", "A normal description.") + end + + def test_format_note_markdown + login_as(:admin_user) + todo = users(:admin_user).todos.first + todo.notes = "A *bold description*." + todo.save! + get :index + assert_select("div#notes_todo_#{todo.id}", "A bold description.") + assert_select("div#notes_todo_#{todo.id} strong", "bold description") + end + + def test_format_note_link + login_as(:admin_user) + todo = users(:admin_user).todos.first + todo.notes = "A link to http://github.com/." + todo.save! + get :index + assert_select("div#notes_todo_#{todo.id}", 'A link to http://github.com/.') + assert_select("div#notes_todo_#{todo.id} a[href=http://github.com/]", 'http://github.com/') + end + + def test_format_note_link_message + login_as(:admin_user) + todo = users(:admin_user).todos.first + todo.raw_notes = "A Mail.app message:// link" + todo.save! + get :index + assert_select("div#notes_todo_#{todo.id}", 'A Mail.app message://<ABCDEF-GHADB-123455-FOO-BAR@example.com> link') + assert_select("div#notes_todo_#{todo.id} a", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>') + assert_select("div#notes_todo_#{todo.id} a[href=message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>]", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>') + end + + def test_format_note_link_onenote + login_as(:admin_user) + todo = users(:admin_user).todos.first + todo.notes = ' "link me to onenote":onenote:///E:\OneNote\dir\notes.one#PAGE§ion-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end' + todo.save! + get :index + assert_select("div#notes_todo_#{todo.id}", 'link me to onenote') + assert_select("div#notes_todo_#{todo.id} a", 'link me to onenote') + assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:\\OneNote\\dir\\notes.one#PAGE&section-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end]", 'link me to onenote') + end + + def test_get_boolean_expression_from_parameters_of_tag_view_single_tag + login_as(:admin_user) + get :tag, :name => "single" + assert_equal true, assigns['single_tag'], "should recognize it is a single tag name" + assert_equal "single", assigns['tag_expr'][0][0], "should store the single tag" + assert_equal "single", assigns['tag_name'], "should store the single tag name" + end + + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags + login_as(:admin_user) + get :tag, :name => "multiple", :and => "tags", :and1 => "present", :and2 => "here" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" + end + + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags_without_digitless_and + login_as(:admin_user) + get :tag, :name => "multiple", :and1 => "tags", :and2 => "present", :and3 => "here" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" + end + + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs + login_as(:admin_user) + get :tag, :name => "multiple,tags,present" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 1, assigns['tag_expr'].size, "should have 1 expressions" + assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" + end + + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs_and_ANDS + login_as(:admin_user) + get :tag, :name => "multiple,tags,present", :and => "here,is,two", :and1=>"and,three" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 3, assigns['tag_expr'].size, "should have 3 expressions" + assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" + assert_equal 3, assigns['tag_expr'][1].size, "should have 3 ORs in 2nd expression" + assert_equal 2, assigns['tag_expr'][2].size, "should have 2 ORs in 3rd expression" + end + + def test_set_right_title + login_as(:admin_user) + + get :tag, :name => "foo" + assert_equal "foo", assigns['tag_title'] + get :tag, :name => "foo,bar", :and => "baz" + assert_equal "foo,bar AND baz", assigns['tag_title'] + end + + def test_set_default_tag + login_as(:admin_user) + + get :tag, :name => "foo" + assert_equal "foo", assigns['initial_tags'] + get :tag, :name => "foo,bar", :and => "baz" + assert_equal "foo", assigns['initial_tags'] + end + + def test_tag_text_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :tag, {:name => "foo", :format => "txt" } + assert_response 401 + end + + def test_make_todo_dependent + login_as(:admin_user) + + predecessor = todos(:call_bill) + successor = todos(:call_dino_ext) + + # no predecessors yet + assert_equal 0, successor.predecessors.size + + # add predecessor + put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id + + assert_equal 1, successor.predecessors.count + assert_equal predecessor.id, successor.predecessors.first.id + end + + def test_make_todo_with_dependencies_dependent + login_as(:admin_user) + + predecessor = todos(:call_bill) + successor = todos(:call_dino_ext) + other_todo = todos(:phone_grandfather) + + # predecessor -> successor + put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id + + # other_todo -> predecessor -> successor + put :add_predecessor, :predecessor=>other_todo.id, :successor=>predecessor.id + + assert_equal 1, successor.predecessors(true).count + assert_equal 0, other_todo.predecessors(true).count + assert_equal 1, predecessor.predecessors(true).count + assert_equal predecessor.id, successor.predecessors.first.id + assert_equal other_todo.id, predecessor.predecessors.first.id + end + + def test_mingle_dependent_todos_leave + # based on #1271 + login_as(:admin_user) + + t1 = todos(:call_bill) + t2 = todos(:call_dino_ext) + t3 = todos(:phone_grandfather) + t4 = todos(:construct_dilation_device) + + # t1 -> t2 + put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id + # t3 -> t4 + put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id + + # t2 -> t4 + put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id + + # should be: t1 -> t2 -> t4 and t3 -> t4 + assert t4.predecessors.map(&:id).include?(t2.id) + assert t4.predecessors.map(&:id).include?(t3.id) + assert t2.predecessors.map(&:id).include?(t1.id) + end + + def test_mingle_dependent_todos_root + # based on #1271 + login_as(:admin_user) + + t1 = todos(:call_bill) + t2 = todos(:call_dino_ext) + t3 = todos(:phone_grandfather) + t4 = todos(:construct_dilation_device) + + # t1 -> t2 + put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id + # t3 -> t4 + put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id + + # t3 -> t2 + put :add_predecessor, :predecessor=>t3.id, :successor=>t2.id + + # should be: t1 -> t2 and t3 -> t4 & t2 + assert t3.successors.map(&:id).include?(t4.id) + assert t3.successors.map(&:id).include?(t2.id) + assert t2.predecessors.map(&:id).include?(t1.id) + assert t2.predecessors.map(&:id).include?(t3.id) + end + + def test_unmingle_dependent_todos + # based on #1271 + login_as(:admin_user) + + t1 = todos(:call_bill) + t2 = todos(:call_dino_ext) + t3 = todos(:phone_grandfather) + t4 = todos(:construct_dilation_device) + + # create same dependency tree as previous test + # should be: t1 -> t2 -> t4 and t3 -> t4 + put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id + put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id + put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id + + # removing t4 as successor of t2 should leave t4 blocked with t3 as predecessor + put :remove_predecessor, :predecessor=>t2.id, :id=>t4.id + + t4.reload + assert t4.pending?, "t4 should remain pending" + assert t4.predecessors.map(&:id).include?(t3.id) + end end From 22e166c3703cd56b13191910f4a723d0a6952d22 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Mon, 16 Jul 2012 17:38:44 +0200 Subject: [PATCH 35/41] add swf to asset pipeline. Fixes #1311 --- app/assets/javascripts/application.js | 2 +- {public => app/assets}/swfs/expressInstall.swf | Bin {public => app/assets}/swfs/open-flash-chart.swf | Bin app/views/stats/_chart.html.erb | 2 +- config/application.rb | 3 +++ 5 files changed, 5 insertions(+), 2 deletions(-) rename {public => app/assets}/swfs/expressInstall.swf (100%) mode change 100755 => 100644 rename {public => app/assets}/swfs/open-flash-chart.swf (100%) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 74bb0e45..4d064b6c 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -28,4 +28,4 @@ //= require niftycube //= require superfish //= require supersubs -//= require swfobject \ No newline at end of file +//= require swf_fu \ No newline at end of file diff --git a/public/swfs/expressInstall.swf b/app/assets/swfs/expressInstall.swf old mode 100755 new mode 100644 similarity index 100% rename from public/swfs/expressInstall.swf rename to app/assets/swfs/expressInstall.swf diff --git a/public/swfs/open-flash-chart.swf b/app/assets/swfs/open-flash-chart.swf similarity index 100% rename from public/swfs/open-flash-chart.swf rename to app/assets/swfs/open-flash-chart.swf diff --git a/app/views/stats/_chart.html.erb b/app/views/stats/_chart.html.erb index a627a69f..d8f859d6 100755 --- a/app/views/stats/_chart.html.erb +++ b/app/views/stats/_chart.html.erb @@ -1,5 +1,5 @@ <% @swf_count ||= 0 -%> -
      <%= swf_tag "open-flash-chart.swf", +
      <%= swf_tag asset_path("open-flash-chart"), :flashvars => { 'width' => width, 'height' => height, 'data' => data}, :parameters => { 'allowScriptAccess' => 'sameDomain', 'wmode' => 'transparent'}, :div_id => "chart_#{@swf_count+=1}", diff --git a/config/application.rb b/config/application.rb index 7de490b3..a772d67a 100644 --- a/config/application.rb +++ b/config/application.rb @@ -63,6 +63,9 @@ module Tracksapp # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0' + + # add /app/assets/swfs to asset pipeline for charts + config.assets.paths << Rails.root.join("app", "assets", "swfs") # configure Tracks to handle deployment in a subdir config.action_controller.relative_url_root = SITE_CONFIG['subdir'] if SITE_CONFIG['subdir'] From 3a3a1ac22e5ba19e1cf2218ba7abc46bf4e40b05 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Mon, 16 Jul 2012 17:47:30 +0200 Subject: [PATCH 36/41] production needs extension of swf --- app/views/stats/_chart.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/stats/_chart.html.erb b/app/views/stats/_chart.html.erb index d8f859d6..48d1beef 100755 --- a/app/views/stats/_chart.html.erb +++ b/app/views/stats/_chart.html.erb @@ -1,5 +1,5 @@ <% @swf_count ||= 0 -%> -
      <%= swf_tag asset_path("open-flash-chart"), +
      <%= swf_tag asset_path("open-flash-chart.swf"), :flashvars => { 'width' => width, 'height' => height, 'data' => data}, :parameters => { 'allowScriptAccess' => 'sameDomain', 'wmode' => 'transparent'}, :div_id => "chart_#{@swf_count+=1}", From e8c3ba2e284203846c2adee6fed613294784e763 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 18 Jul 2012 10:37:59 +0200 Subject: [PATCH 37/41] fix #1313 by checking on NullProject too --- app/helpers/todos_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index 684193e1..daad4fff 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -170,7 +170,7 @@ module TodosHelper if (['project', 'tag', 'stats', 'search'].include?(parent_container_type)) str << item_link_to_context( todo ) end - if (['context', 'tickler', 'tag', 'stats', 'search'].include?(parent_container_type)) && todo.project_id + if (['context', 'tickler', 'tag', 'stats', 'search'].include?(parent_container_type)) && !todo.project_id.nil? && !todo.project.is_a?(NullProject) str << item_link_to_project( todo ) end end From 4e29bf69f709356e4b5d2f1ae8d5069f914232e4 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 18 Jul 2012 11:42:26 +0200 Subject: [PATCH 38/41] fix failing tests and small refactorings --- .../application_controller.rb.rails2 | 324 ------------------ app/controllers/todos_controller.rb | 6 +- app/helpers/feedlist_helper.rb | 15 +- app/helpers/projects_helper.rb | 24 +- app/models/message_gateway.rb | 33 +- app/models/project.rb | 3 + app/models/todo.rb | 4 +- test/functional/todos_controller_test.rb | 20 +- 8 files changed, 53 insertions(+), 376 deletions(-) delete mode 100644 app/controllers/application_controller.rb.rails2 diff --git a/app/controllers/application_controller.rb.rails2 b/app/controllers/application_controller.rb.rails2 deleted file mode 100644 index 761be1d9..00000000 --- a/app/controllers/application_controller.rb.rails2 +++ /dev/null @@ -1,324 +0,0 @@ -# The filters added to this controller will be run for all controllers in the -# application. Likewise will all the methods added be available for all -# controllers. - -require_dependency "login_system" -require_dependency "tracks/source_view" - -class ApplicationController < ActionController::Base - - protect_from_forgery - - helper :application - include LoginSystem - helper_method :current_user, :prefs, :format_date - - layout proc{ |controller| controller.mobile? ? "mobile" : "standard" } - exempt_from_layout /\.js\.erb$/ - - before_filter :check_for_deprecated_password_hash - before_filter :set_session_expiration - before_filter :set_time_zone - before_filter :set_zindex_counter - before_filter :set_locale - prepend_before_filter :login_required - prepend_before_filter :enable_mobile_content_negotiation - after_filter :set_charset - - # By default, sets the charset to UTF-8 if it isn't already set - def set_charset - headers["Content-Type"] ||= "text/html; charset=UTF-8" - end - - def set_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 = locale.nil? ? I18n.default_locale : (I18n::available_locales.include?(locale.to_sym) ? locale : I18n.default_locale) - logger.debug("Selected '#{I18n.locale}' as locale") - end - - def set_session_expiration - # http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions - unless session == nil - return if self.controller_name == 'feed' or session['noexpiry'] == "on" - # If the method is called by the feed controller (which we don't have - # under session control) or if we checked the box to keep logged in on - # login don't set the session expiry time. - if session - # Get expiry time (allow ten seconds window for the case where we have - # none) - expiry_time = session['expiry_time'] || Time.now + 10 - if expiry_time < Time.now - # Too late, matey... bang goes your session! - reset_session - else - # Okay, you get another hour - session['expiry_time'] = Time.now + (60*60) - end - end - end - end - - # Redirects to change_password_user_path if the current user uses a - # deprecated password hashing algorithm. - def check_for_deprecated_password_hash - if current_user and current_user.uses_deprecated_password? - notify :warning, t('users.you_have_to_reset_your_password') - redirect_to change_password_user_path current_user - end - end - - def render_failure message, status = 404 - render :text => message, :status => status - end - - # def rescue_action(exception) - # log_error(exception) if logger - # respond_to do |format| - # format.html do - # notify :warning, "An error occurred on the server." - # render :action => "index" - # end - # format.js { render :action => 'error' } - # format.xml { render :text => 'An error occurred on the server.' + $! } - # end - # end - - # Returns a count of next actions in the given context or project The result - # is count and a string descriptor, correctly pluralised if there are no - # actions or multiple actions - # - def count_undone_todos_phrase(todos_parent) - count = count_undone_todos(todos_parent) - deferred_count = count_deferred_todos(todos_parent) - if count == 0 && deferred_count > 0 - word = I18n.t('common.actions_midsentence', :count => deferred_count) - word = I18n.t('common.deferred') + " " + word - return deferred_count.to_s + " " + word - else - word = I18n.t('common.actions_midsentence', :count => count) - return count.to_s + " " + word - end - end - - def count_undone_todos(todos_parent) - if todos_parent.nil? - count = 0 - elsif (todos_parent.is_a?(Project) && todos_parent.hidden?) - count = eval "@project_project_hidden_todo_counts[#{todos_parent.id}]" - else - count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]" - end - count || 0 - end - - def count_deferred_todos(todos_parent) - if todos_parent.nil? - count = 0 - else - count = todos_parent.todos.deferred.count - end - end - - # Convert a date object to the format specified in the user's preferences in - # config/settings.yml - # - def format_date(date) - return date ? date.in_time_zone(prefs.time_zone).strftime("#{prefs.date_format}") : '' - end - - def for_autocomplete(coll, substr) - if substr # protect agains empty request - filtered = coll.find_all{|item| item.name.downcase.include? substr.downcase} - json_elems = Array[*filtered.map{ |e| {:id => e.id.to_s, :value => e.name} }].to_json - return json_elems - else - return "" - end - end - - def format_dependencies_as_json_for_auto_complete(entries) - json_elems = Array[*entries.map{ |e| {:value => e.id.to_s, :label => e.specification} }].to_json - return json_elems - end - - # Here's the concept behind this "mobile content negotiation" hack: In - # addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature - # 'mobile' version designed to be suitablef or use from a phone or PDA. It - # makes some sense that tne pages of that mobile version are simply alternate - # representations of the same Todo resources. The implementation goal was to - # treat mobile as another format and be able to use respond_to to render both - # versions. Unfortunately, I ran into a lot of trouble simply registering a - # new mime type 'text/html' with format :m because :html already is linked to - # that mime type and the new registration was forcing all html requests to be - # rendered in the mobile view. The before_filter and after_filter hackery - # below accomplishs that implementation goal by using a 'fake' mime type - # during the processing and then setting it to 'text/html' in an - # 'after_filter' -LKM 2007-04-01 - def mobile? - return params[:format] == 'm' - end - - def enable_mobile_content_negotiation - if mobile? - request.format = :m - end - end - - def create_todo_from_recurring_todo(rt, date=nil) - # create todo and initialize with data from recurring_todo rt - todo = current_user.todos.build( { :description => rt.description, :notes => rt.notes, :project_id => rt.project_id, :context_id => rt.context_id}) - todo.recurring_todo_id = rt.id - - # set dates - todo.due = rt.get_due_date(date) - - show_from_date = rt.get_show_from_date(date) - if show_from_date.nil? - todo.show_from=nil - else - # make sure that show_from is not in the past - todo.show_from = show_from_date < Time.zone.now ? nil : show_from_date - end - - saved = todo.save - if saved - todo.tag_with(rt.tag_list) - todo.tags.reload - end - - # increate number of occurences created from recurring todo - rt.inc_occurences - - # mark recurring todo complete if there are no next actions left - checkdate = todo.due.nil? ? todo.show_from : todo.due - rt.toggle_completion! unless rt.has_next_todo(checkdate) - - return saved ? todo : nil - end - - def handle_unverified_request - unless request.format=="application/xml" - super # handle xml http auth via our own login code - end - end - - protected - - def admin_login_required - unless User.find_by_id_and_is_admin(session['user_id'], true) - render :text => t('errors.user_unauthorized'), :status => 401 - return false - end - end - - def redirect_back_or_home - respond_to do |format| - format.html { redirect_back_or_default home_url } - format.m { redirect_back_or_default mobile_url } - end - end - - def boolean_param(param_name) - return false if param_name.blank? - s = params[param_name] - return false if s.blank? || s == false || s =~ /^false$/i - return true if s == true || s =~ /^true$/i - raise ArgumentError.new("invalid value for Boolean: \"#{s}\"") - end - - def self.openid_enabled? - Tracks::Config.openid_enabled? - end - - def openid_enabled? - self.class.openid_enabled? - end - - def self.cas_enabled? - Tracks::Config.cas_enabled? - end - - def cas_enabled? - self.class.cas_enabled? - end - - def self.prefered_auth? - Tracks::Config.prefered_auth? - end - - def prefered_auth? - self.class.prefered_auth? - end - - # all completed todos [today@00:00, today@now] - def get_done_today(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES}) - start_of_this_day = Time.zone.now.beginning_of_day - completed_todos.completed_after(start_of_this_day).all(includes) - end - - # all completed todos [begin_of_week, start_of_today] - def get_done_this_week(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES}) - start_of_this_week = Time.zone.now.beginning_of_week - start_of_this_day = Time.zone.now.beginning_of_day - completed_todos.completed_before(start_of_this_day).completed_after(start_of_this_week).all(includes) - end - - # all completed todos [begin_of_month, begin_of_week] - def get_done_this_month(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES}) - start_of_this_month = Time.zone.now.beginning_of_month - start_of_this_week = Time.zone.now.beginning_of_week - completed_todos.completed_before(start_of_this_week).completed_after(start_of_this_month).all(includes) - end - - private - - def parse_date_per_user_prefs( s ) - prefs.parse_date(s) - end - - def init_data_for_sidebar - @completed_projects = current_user.projects.completed - @hidden_projects = current_user.projects.hidden - @active_projects = current_user.projects.active - - @active_contexts = current_user.contexts.active - @hidden_contexts = current_user.contexts.hidden - - init_not_done_counts - if prefs.show_hidden_projects_in_sidebar - init_project_hidden_todo_counts(['project']) - end - end - - def init_not_done_counts(parents = ['project','context']) - parents.each do |parent| - eval("@#{parent}_not_done_counts = @#{parent}_not_done_counts || current_user.todos.active.count(:group => :#{parent}_id)") - end - end - - def init_project_hidden_todo_counts(parents = ['project','context']) - parents.each do |parent| - eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)") - end - end - - # Set the contents of the flash message from a controller Usage: notify - # :warning, "This is the message" Sets the flash of type 'warning' to "This is - # the message" - def notify(type, message) - flash[type] = message - logger.error("ERROR: #{message}") if type == :error - end - - def set_time_zone - Time.zone = current_user.prefs.time_zone if logged_in? - end - - def set_zindex_counter - # this counter can be used to handle the IE z-index bug - @z_index_counter = 500 - end - -end diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 77977baf..852c5d41 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -27,7 +27,11 @@ class TodosController < ApplicationController @not_done_todos = @not_done_todos. reorder("todos.due IS NULL, todos.due ASC, todos.created_at ASC"). includes(Todo::DEFAULT_INCLUDES) - @not_done_todos = @not_done_todos.limit(sanitize(params[:limit])) if params[:limit] + + if params[:limit] + @not_done_todos = @not_done_todos.limit(sanitize(params[:limit])) + @todos = @todos.limit(sanitize(params[:limit])) + end if params[:due] due_within_when = Time.zone.now + params['due'].to_i.days diff --git a/app/helpers/feedlist_helper.rb b/app/helpers/feedlist_helper.rb index d6b086f4..1cb0da32 100644 --- a/app/helpers/feedlist_helper.rb +++ b/app/helpers/feedlist_helper.rb @@ -1,25 +1,26 @@ module FeedlistHelper + def linkoptions(format, options) + merge_hashes( {:format => format}, options, user_token_hash) + end + def rss_formatted_link(options = {}) image_tag = image_tag("feed-icon.png", :size => "16X16", :border => 0, :class => "rss-icon") - linkoptions = merge_hashes( {:format => 'rss'}, user_token_hash, options) - link_to(image_tag, linkoptions, :title => "RSS feed") + link_to(image_tag, linkoptions('rss', options), :title => "RSS feed") end def text_formatted_link(options = {}) - linkoptions = merge_hashes( {:format => 'txt'}, user_token_hash, options) - link_to(content_tag(:span, 'TXT', {:class => 'feed', :title => "Plain text feed"}), linkoptions) + link_to(content_tag(:span, 'TXT', {:class => 'feed', :title => "Plain text feed"}), linkoptions('txt', options)) end def ical_formatted_link(options = {}) - linkoptions = merge_hashes( {:format => 'ics'}, user_token_hash, options) - link_to(content_tag(:span, 'iCal', {:class=>"feed", :title => "iCal feed"}), linkoptions) + link_to(content_tag(:span, 'iCal', {:class=>"feed", :title => "iCal feed"}), linkoptions('ics', options)) end def feed_links(feeds, link_options, title) space = " " html = "" - html << rss_formatted_link(link_options)+space if feeds.include?(:rss) + html << rss_formatted_link(link_options) +space if feeds.include?(:rss) html << text_formatted_link(link_options)+space if feeds.include?(:txt) html << ical_formatted_link(link_options)+space if feeds.include?(:ical) html << title diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 15364485..c68268ca 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -2,29 +2,17 @@ module ProjectsHelper def project_next_prev html = "" - if @previous_project - project_name = truncate(@previous_project.name, :length => 40, :omission => "...") - html << link_to_project(@previous_project, "« #{project_name}".html_safe) - end + html << link_to_project(@previous_project, "« #{@previous_project.shortened_name}".html_safe) if @previous_project html << " | " if @previous_project && @next_project - if @next_project - project_name = truncate(@next_project.name, :length => 40, :omission => "...") - html << link_to_project(@next_project, "#{project_name} »".html_safe) - end - html.html_safe + html << link_to_project(@next_project, "#{@next_project.shortened_name} »".html_safe) if @next_project + return html.html_safe end def project_next_prev_mobile prev_project,next_project= "", "" - if @previous_project - project_name = truncate(@previous_project.name, :length => 40, :omission => "...") - prev_project = content_tag(:li, link_to_project_mobile(@previous_project, "5", project_name), :class=>"prev") - end - if @next_project - project_name = truncate(@next_project.name, :length => 40, :omission => "...") - next_project = content_tag(:li, link_to_project_mobile(@next_project, "6", project_name), :class=>"next") - end - return content_tag(:ul, "#{prev_project}#{next_project}".html_safe, :class=>"next-prev-project").html_safe + prev_project = content_tag(:li, link_to_project_mobile(@previous_project, "5", @previous_project.shortened_name), :class=>"prev") if @previous_project + next_project = content_tag(:li, link_to_project_mobile(@next_project, "6", @next_project.shortened_name), :class=>"next") if @next_project + return content_tag(:ul, "#{prev_project}#{next_project}".html_safe, :class=>"next-prev-project") end def link_to_delete_project(project, descriptor = sanitize(project.name)) diff --git a/app/models/message_gateway.rb b/app/models/message_gateway.rb index 43248afc..ed275b44 100644 --- a/app/models/message_gateway.rb +++ b/app/models/message_gateway.rb @@ -34,22 +34,27 @@ class MessageGateway < ActionMailer::Base return SITE_CONFIG['email_dispatch'] == 'to' ? email.to[0] : email.from[0] end - def get_user_from_email_address(email) - if SITE_CONFIG['email_dispatch'] == 'single_user' - Rails.logger.info "All received email goes to #{ENV['TRACKS_MAIL_RECEIVER']}" - user = User.find_by_login(ENV['TRACKS_MAIL_RECEIVER']) - Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil? - else - address = get_address(email) - Rails.logger.info "Looking for user with email #{address}" - user = User.where("preferences.sms_email" => address.strip).includes(:preference).first - if user.nil? - user = User.where("preferences.sms_email" => address.strip[1.100]).includes(:preference).first - end - Rails.logger.info(!user.nil? ? "Email belongs to #{user.login}" : "User unknown") - end + def get_user_from_env_setting + Rails.logger.info "All received email goes to #{ENV['TRACKS_MAIL_RECEIVER']}" + user = User.find_by_login(ENV['TRACKS_MAIL_RECEIVER']) + Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil? return user end + + def get_user_from_mail_header(email) + address = get_address(email) + Rails.logger.info "Looking for user with email #{address}" + user = User.where("preferences.sms_email" => address.strip).includes(:preference).first + if user.nil? + user = User.where("preferences.sms_email" => address.strip[1.100]).includes(:preference).first + end + Rails.logger.info(!user.nil? ? "Email belongs to #{user.login}" : "User unknown") + return user + end + + def get_user_from_email_address(email) + SITE_CONFIG['email_dispatch'] == 'single_user' ? get_user_from_env_setting : get_user_from_mail_header(email) + end def get_text_or_nil(text) return text ? sanitize(text.strip) : nil diff --git a/app/models/project.rb b/app/models/project.rb index 0ce8b151..32681008 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -118,6 +118,9 @@ class Project < ActiveRecord::Base return self.todos.deferred_or_blocked.empty? && self.todos.not_deferred_or_blocked.empty? end + def shortened_name(length=40) + name.truncate(length, :omission => "...").html_safe + end def name=(value) self[:name] = value.gsub(/\s{2,}/, " ").strip diff --git a/app/models/todo.rb b/app/models/todo.rb index aaebce79..18219a34 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -209,13 +209,13 @@ class Todo < ActiveRecord::Base end def update_state_from_project - if self.state == 'project_hidden' && !self.project.hidden? + if self.project_hidden? && (!self.project.hidden?) if self.uncompleted_predecessors.empty? self.activate! else self.block! end - elsif self.state == 'active' && self.project.hidden? + elsif self.active? && self.project.hidden? self.hide! end self.save! diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index d9c7f4f4..3eb3666f 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -338,7 +338,7 @@ class TodosControllerTest < ActionController::TestCase assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do assert_xml_select '>title', 'Tracks Actions' assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" - assert_xml_select 'entry', 11 do + assert_xml_select 'entry', 17 do assert_xml_select 'title', /.+/ assert_xml_select 'content[type="html"]', /.*/ assert_xml_select 'published', /(#{Regexp.escape(todos(:book).updated_at.xmlschema)}|#{Regexp.escape(projects(:moremoney).updated_at.xmlschema)})/ @@ -506,7 +506,7 @@ class TodosControllerTest < ActionController::TestCase # link todo_1 and recurring_todo_1 recurring_todo_1 = RecurringTodo.find(1) - set_user_to_current_time_zone(recurring_todo_1.user) + #set_user_to_current_time_zone(recurring_todo_1.user) todo_1 = Todo.find_by_recurring_todo_id(1) today = Time.zone.now.at_midnight @@ -592,20 +592,20 @@ class TodosControllerTest < ActionController::TestCase p.hide! assert p.reload().hidden? todo = p.todos.first - assert_equal "project_hidden", todo.state + + assert todo.project_hidden?, "todo should be project_hidden" # clear project from todo: the todo should be unhidden - xhr :post, :update, :id => 5, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} - todo.reload() - assert assigns['project_changed'] - assert_equal "active", todo.state + xhr :post, :update, :id => todo.id, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} + + assert assigns['project_changed'], "the project of the todo should be changed" + assert todo.reload().active?, "todo should be active" end def test_url_with_slash_in_query_string_are_parsed_correctly # See http://blog.swivel.com/code/2009/06/rails-auto_link-and-certain-query-strings.html login_as(:admin_user) - user = users(:admin_user) - todo = user.todos.first + todo = users(:admin_user).todos.first url = "http://example.com/foo?bar=/baz" todo.notes = "foo #{url} bar" todo.save! @@ -661,7 +661,7 @@ class TodosControllerTest < ActionController::TestCase get :index assert_select("div#notes_todo_#{todo.id}", 'link me to onenote') assert_select("div#notes_todo_#{todo.id} a", 'link me to onenote') - assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:\\OneNote\\dir\\notes.one#PAGE&section-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end]", 'link me to onenote') + assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:%5COneNote%5Cdir%5Cnotes.one#PAGE&section-id=%7BFD597D3A-3793-495F-8345-23D34A00DD3B%7D&page-id=%7B1C95A1C7-6408-4804-B3B5-96C28426022B%7D&end]", 'link me to onenote') end def test_get_boolean_expression_from_parameters_of_tag_view_single_tag From 881c83292b4df74f19dd39295add2ba678a349f6 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 18 Jul 2012 11:59:17 +0200 Subject: [PATCH 39/41] reorder tests --- test/functional/todos_controller_test.rb | 374 +++++++++++++---------- 1 file changed, 209 insertions(+), 165 deletions(-) diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index 3eb3666f..112d8cfe 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -7,6 +7,10 @@ class TodosControllerTest < ActionController::TestCase assert_redirected_to login_url end + ############################ + # not done / deferred counts + ############################ + def test_not_done_counts login_as(:admin_user) get :index @@ -34,6 +38,42 @@ class TodosControllerTest < ActionController::TestCase assert_equal nil, assigns['context_not_done_counts'][contexts(:lab).id] end + def test_not_done_counts_after_hiding_project + p = Project.find(1) + p.hide! + p.save! + login_as(:admin_user) + get :index + assert_equal 0, projects(:timemachine).todos.active.count + assert_equal 2, contexts(:call).todos.active.count + assert_equal 0, contexts(:lab).todos.active.count + end + + def test_not_done_counts_after_hiding_and_unhiding_project + p = Project.find(1) + p.hide! + p.save! + p.activate! + p.save! + login_as(:admin_user) + get :index + assert_equal 2, projects(:timemachine).todos.active.count + assert_equal 3, contexts(:call).todos.not_completed.count + assert_equal 1, contexts(:lab).todos.not_completed.count + end + + def test_deferred_count_for_project_source_view + login_as(:admin_user) + xhr :post, :toggle_check, :id => 5, :_source_view => 'project' + assert_equal 1, assigns['remaining_deferred_or_pending_count'] + xhr :post, :toggle_check, :id => 15, :_source_view => 'project' + assert_equal 0, assigns['remaining_deferred_or_pending_count'] + end + + ######### + # tagging + ######### + def test_tag_is_retrieved_properly login_as(:admin_user) get :index @@ -70,46 +110,79 @@ class TodosControllerTest < ActionController::TestCase assert_equal t.description, "test tags" assert_equal 2, t.tags.count end - - def test_not_done_counts_after_hiding_project - p = Project.find(1) - p.hide! - p.save! + + def test_find_tagged_with login_as(:admin_user) - get :index - assert_equal 0, projects(:timemachine).todos.active.count - assert_equal 2, contexts(:call).todos.active.count - assert_equal 0, contexts(:lab).todos.active.count + @user = User.find(@request.session['user_id']) + tag = Tag.find_by_name('foo').taggings + @tagged = tag.count + get :tag, :name => 'foo' + assert_response :success + assert_equal 3, @tagged end - def test_not_done_counts_after_hiding_and_unhiding_project - p = Project.find(1) - p.hide! - p.save! - p.activate! - p.save! + def test_get_boolean_expression_from_parameters_of_tag_view_single_tag login_as(:admin_user) - get :index - assert_equal 2, projects(:timemachine).todos.active.count - assert_equal 3, contexts(:call).todos.not_completed.count - assert_equal 1, contexts(:lab).todos.not_completed.count + get :tag, :name => "single" + assert_equal true, assigns['single_tag'], "should recognize it is a single tag name" + assert_equal "single", assigns['tag_expr'][0][0], "should store the single tag" + assert_equal "single", assigns['tag_name'], "should store the single tag name" end - def test_deferred_count_for_project_source_view + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags login_as(:admin_user) - xhr :post, :toggle_check, :id => 5, :_source_view => 'project' - assert_equal 1, assigns['remaining_deferred_or_pending_count'] - xhr :post, :toggle_check, :id => 15, :_source_view => 'project' - assert_equal 0, assigns['remaining_deferred_or_pending_count'] + get :tag, :name => "multiple", :and => "tags", :and1 => "present", :and2 => "here" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" end - def test_destroy_todo + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags_without_digitless_and login_as(:admin_user) - xhr :post, :destroy, :id => 1, :_source_view => 'todo' - todo = Todo.find_by_id(1) - assert_nil todo + get :tag, :name => "multiple", :and1 => "tags", :and2 => "present", :and3 => "here" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" end + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs + login_as(:admin_user) + get :tag, :name => "multiple,tags,present" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 1, assigns['tag_expr'].size, "should have 1 expressions" + assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" + end + + def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs_and_ANDS + login_as(:admin_user) + get :tag, :name => "multiple,tags,present", :and => "here,is,two", :and1=>"and,three" + assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" + assert_equal 3, assigns['tag_expr'].size, "should have 3 expressions" + assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" + assert_equal 3, assigns['tag_expr'][1].size, "should have 3 ORs in 2nd expression" + assert_equal 2, assigns['tag_expr'][2].size, "should have 2 ORs in 3rd expression" + end + + def test_set_right_title_tag_page + login_as(:admin_user) + + get :tag, :name => "foo" + assert_equal "foo", assigns['tag_title'] + get :tag, :name => "foo,bar", :and => "baz" + assert_equal "foo,bar AND baz", assigns['tag_title'] + end + + def test_set_default_tag + login_as(:admin_user) + + get :tag, :name => "foo" + assert_equal "foo", assigns['initial_tags'] + get :tag, :name => "foo,bar", :and => "baz" + assert_equal "foo", assigns['initial_tags'] + end + + ############### + # creating todo + ############### + def test_create_todo assert_difference 'Todo.count' do login_as(:admin_user) @@ -133,12 +206,6 @@ class TodosControllerTest < ActionController::TestCase end end - def test_get_edit_form_using_xhr - login_as(:admin_user) - xhr :get, :edit, :id => todos(:call_bill).id - assert_response 200 - end - def test_fail_to_create_todo_via_xml login_as(:admin_user) # try to create with no context, which is not valid @@ -158,6 +225,70 @@ class TodosControllerTest < ActionController::TestCase assert_equal original_todo_count + 1, Todo.count end + def test_add_multiple_todos + login_as(:admin_user) + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'"} + + assert_equal start_count+3, Todo.count, "two todos should have been added" + end + + def test_add_multiple_todos_with_validation_error + login_as(:admin_user) + + long_string = "a" * 500 + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'\n#{long_string}"} + + assert_equal start_count, Todo.count, "no todos should have been added" + end + + def test_add_multiple_dependent_todos + login_as(:admin_user) + + start_count = Todo.count + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"a\nb"}, :todos_sequential => 'true' + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ + :multiple_todos=>"c\nd"}, :todos_sequential => 'false' + + assert_equal start_count+4, Todo.count, "four todos should have been added" + + # find a,b,c and d + %w{a b c d}.each do |todo| + eval "@#{todo} = Todo.find_by_description('#{todo}')" + eval "assert !@#{todo}.nil?, 'a todo with description \"#{todo}\" should just have been added'" + end + + assert @b.predecessors.include?(@a), "a should be a predeccesor of b" + assert !@d.predecessors.include?(@c), "c should not be a predecessor of d" + end + + ######### + # destroy + ######### + + def test_destroy_todo + login_as(:admin_user) + xhr :post, :destroy, :id => 1, :_source_view => 'todo' + todo = Todo.find_by_id(1) + assert_nil todo + end + + ############### + # edit / update + ############### + + def test_get_edit_form_using_xhr + login_as(:admin_user) + xhr :get, :edit, :id => todos(:call_bill).id + assert_response 200 + end + def test_update_todo_project t = Todo.find(1) login_as(:admin_user) @@ -219,58 +350,27 @@ class TodosControllerTest < ActionController::TestCase assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list end - def test_add_multiple_todos + def test_removing_hidden_project_activates_todo login_as(:admin_user) - start_count = Todo.count - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'"} + # get a project and hide it, todos in the project should be hidden + p = projects(:timemachine) + p.hide! + assert p.reload().hidden? + todo = p.todos.first + + assert todo.project_hidden?, "todo should be project_hidden" - assert_equal start_count+3, Todo.count, "two todos should have been added" - end - - def test_add_multiple_todos_with_validation_error - login_as(:admin_user) - - long_string = "a" * 500 - - start_count = Todo.count - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - :multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'\n#{long_string}"} - - assert_equal start_count, Todo.count, "no todos should have been added" - end - - def test_add_multiple_dependent_todos - login_as(:admin_user) - - start_count = Todo.count - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - :multiple_todos=>"a\nb"}, :todos_sequential => 'true' - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{ - :multiple_todos=>"c\nd"}, :todos_sequential => 'false' - - assert_equal start_count+4, Todo.count, "four todos should have been added" - - # find a,b,c and d - %w{a b c d}.each do |todo| - eval "@#{todo} = Todo.find_by_description('#{todo}')" - eval "assert !@#{todo}.nil?, 'a todo with description \"#{todo}\" should just have been added'" - end - - assert @b.predecessors.include?(@a), "a should be a predeccesor of b" - assert !@d.predecessors.include?(@c), "c should not be a predecessor of d" - end - - def test_find_tagged_with - login_as(:admin_user) - @user = User.find(@request.session['user_id']) - tag = Tag.find_by_name('foo').taggings - @tagged = tag.count - get :tag, :name => 'foo' - assert_response :success - assert_equal 3, @tagged + # clear project from todo: the todo should be unhidden + xhr :post, :update, :id => todo.id, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} + + assert assigns['project_changed'], "the project of the todo should be changed" + assert todo.reload().active?, "todo should be active" end + + ####### + # feeds + ####### def test_rss_feed login_as(:admin_user) @@ -398,6 +498,16 @@ class TodosControllerTest < ActionController::TestCase # #puts @response.body end + def test_tag_text_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :tag, {:name => "foo", :format => "txt" } + assert_response 401 + end + + ############## + # mobile index + ############## + def test_mobile_index_uses_text_html_content_type login_as(:admin_user) get :index, { :format => "m" } @@ -410,6 +520,10 @@ class TodosControllerTest < ActionController::TestCase assert_equal 11, assigns['down_count'] end + ############### + # mobile create + ############### + def test_mobile_create_action_creates_a_new_todo login_as(:admin_user) post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", @@ -447,6 +561,10 @@ class TodosControllerTest < ActionController::TestCase assert_template 'todos/new' end + ################ + # recurring todo + ################ + def test_toggle_check_on_recurring_todo login_as(:admin_user) @@ -583,24 +701,10 @@ class TodosControllerTest < ActionController::TestCase # check that the due date of the new todo is later than tomorrow assert next_todo.due > @todo.due end - - def test_removing_hidden_project_activates_todo - login_as(:admin_user) - - # get a project and hide it, todos in the project should be hidden - p = projects(:timemachine) - p.hide! - assert p.reload().hidden? - todo = p.todos.first - - assert todo.project_hidden?, "todo should be project_hidden" - - # clear project from todo: the todo should be unhidden - xhr :post, :update, :id => todo.id, :_source_view => 'todo', "project_name"=>"None", "todo"=>{} - - assert assigns['project_changed'], "the project of the todo should be changed" - assert todo.reload().active?, "todo should be active" - end + + ############ + # todo notes + ############ def test_url_with_slash_in_query_string_are_parsed_correctly # See http://blog.swivel.com/code/2009/06/rails-auto_link-and-certain-query-strings.html @@ -663,71 +767,11 @@ class TodosControllerTest < ActionController::TestCase assert_select("div#notes_todo_#{todo.id} a", 'link me to onenote') assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:%5COneNote%5Cdir%5Cnotes.one#PAGE&section-id=%7BFD597D3A-3793-495F-8345-23D34A00DD3B%7D&page-id=%7B1C95A1C7-6408-4804-B3B5-96C28426022B%7D&end]", 'link me to onenote') end - - def test_get_boolean_expression_from_parameters_of_tag_view_single_tag - login_as(:admin_user) - get :tag, :name => "single" - assert_equal true, assigns['single_tag'], "should recognize it is a single tag name" - assert_equal "single", assigns['tag_expr'][0][0], "should store the single tag" - assert_equal "single", assigns['tag_name'], "should store the single tag name" - end - - def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags - login_as(:admin_user) - get :tag, :name => "multiple", :and => "tags", :and1 => "present", :and2 => "here" - assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" - end - - def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags_without_digitless_and - login_as(:admin_user) - get :tag, :name => "multiple", :and1 => "tags", :and2 => "present", :and3 => "here" - assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions" - end - - def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs - login_as(:admin_user) - get :tag, :name => "multiple,tags,present" - assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - assert_equal 1, assigns['tag_expr'].size, "should have 1 expressions" - assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" - end - - def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs_and_ANDS - login_as(:admin_user) - get :tag, :name => "multiple,tags,present", :and => "here,is,two", :and1=>"and,three" - assert_equal false, assigns['single_tag'], "should recognize it has multiple tags" - assert_equal 3, assigns['tag_expr'].size, "should have 3 expressions" - assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression" - assert_equal 3, assigns['tag_expr'][1].size, "should have 3 ORs in 2nd expression" - assert_equal 2, assigns['tag_expr'][2].size, "should have 2 ORs in 3rd expression" - end - - def test_set_right_title - login_as(:admin_user) - - get :tag, :name => "foo" - assert_equal "foo", assigns['tag_title'] - get :tag, :name => "foo,bar", :and => "baz" - assert_equal "foo,bar AND baz", assigns['tag_title'] - end - - def test_set_default_tag - login_as(:admin_user) - - get :tag, :name => "foo" - assert_equal "foo", assigns['initial_tags'] - get :tag, :name => "foo,bar", :and => "baz" - assert_equal "foo", assigns['initial_tags'] - end - - def test_tag_text_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :tag, {:name => "foo", :format => "txt" } - assert_response 401 - end - + + ############## + # dependencies + ############## + def test_make_todo_dependent login_as(:admin_user) From a37d10f57ac61452a796a4f51c918028882070b5 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 18 Jul 2012 12:26:46 +0200 Subject: [PATCH 40/41] fix #1314. Fixed security issue too --- app/controllers/todos_controller.rb | 4 ++-- test/functional/todos_controller_test.rb | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 852c5d41..3f3c7f65 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -454,9 +454,9 @@ class TodosController < ApplicationController def change_context # change context if you drag a todo to another context - @todo = Todo.find_by_id(params[:id]) + @todo = current_user.todos.find_by_id(params[:id]) @original_item_context_id = @todo.context_id - @context = Context.find_by_id(params[:todo][:context_id]) + @context = current_user.contexts.find_by_id(params[:todo][:context_id]) @todo.context = @context @saved = @todo.save diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index 112d8cfe..ec36eb76 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -368,6 +368,21 @@ class TodosControllerTest < ActionController::TestCase assert todo.reload().active?, "todo should be active" end + def test_change_context_of_todo + # called by dragging a todo to another context container + login_as(:admin_user) + + todo = users(:admin_user).todos.active.first + context = users(:admin_user).contexts.first + + assert_not_equal todo.context.id, context.id + + xhr :post, :change_context, :id => todo.id, :todo=>{:context_id => context.id}, :_source_view=>"todo" + assert assigns['context_changed'], "context should have changed" + assert_equal todo.id, assigns['todo'].id, 'correct todo should have been found' + assert_equal context.id, todo.reload.context.id, 'context of todo should be changed' + end + ####### # feeds ####### From 702c89e754fed0a5a333453c1486c0a1cc4ec43a Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 18 Jul 2012 14:58:24 +0200 Subject: [PATCH 41/41] add tolk to Tracks for easy management of translations. Limited to development environment only. Need migration. Signed-off-by: Reinier Balt --- Gemfile | 20 +- Gemfile.lock | 37 +- config/initializers/tolk.rb | 14 + config/locales/cz.yml | 1883 ++++++++-------- config/locales/de.yml | 1887 ++++++++-------- config/locales/es.yml | 1899 ++++++++-------- config/locales/fr.yml | 1860 ++++++++------- config/locales/he.yml | 1809 ++++++++------- config/locales/nl.yml | 1993 +++++++++-------- config/routes.rb | 2 + .../20120718110127_create_tolk_tables.rb | 38 + 11 files changed, 5731 insertions(+), 5711 deletions(-) create mode 100644 config/initializers/tolk.rb create mode 100644 db/migrate/20120718110127_create_tolk_tables.rb diff --git a/Gemfile b/Gemfile index b8d58828..62c90b40 100644 --- a/Gemfile +++ b/Gemfile @@ -24,19 +24,19 @@ gem "rails_autolink" # Gems used only for assets and not required # in production environments by default. group :assets do - gem 'sass-rails', '~> 3.2.3' - gem 'coffee-rails', '~> 3.2.1' + gem 'sass-rails' + gem 'coffee-rails' # See https://github.com/sstephenson/execjs#readme for more supported runtimes gem 'therubyracer', :platform => :ruby - gem 'uglifier', '>= 1.0.3' + gem 'uglifier' end gem 'jquery-rails' # To use ActiveModel has_secure_password -gem 'bcrypt-ruby', '~> 3.0.0' +gem 'bcrypt-ruby' # To use Jbuilder templates for JSON # gem 'jbuilder' @@ -50,22 +50,16 @@ gem 'bcrypt-ruby', '~> 3.0.0' group :development do if RUBY_VERSION.to_f >= 1.9 # gem "ruby-debug19", :require => 'ruby-debug' - gem "mongrel", "1.2.0.pre2" + gem "mongrel", ">=1.2.0.pre2" else gem "ruby-debug" gem "mongrel" end gem "yard" + gem "tolk" end group :test do -# gem "test-unit", "1.2.3" -# gem "flexmock" -# gem "ZenTest", ">=4.0.0" -# gem "hpricot" -# gem "hoe" -# gem "rspec-rails", "~>1.3.3" -# gem 'memory_test_fix', '~>0.1.3' gem "factory_girl_rails" gem "capybara" gem "selenium-webdriver" # Note that > 2.14 has problems: https://code.google.com/p/selenium/issues/detail?id=3075 @@ -79,4 +73,4 @@ group :test do # uncomment to be able to make screenshots from scenarios #gem "capybara-screenshot" #gem "launchy" -end +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 1c036aa4..5807ec3c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -94,7 +94,7 @@ GEM thor (~> 0.14) json (1.7.3) libv8 (3.3.10.4) - libwebsocket (0.1.3) + libwebsocket (0.1.4) addressable mail (2.4.4) i18n (>= 0.4.0) @@ -135,18 +135,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) - rspec (2.10.0) - rspec-core (~> 2.10.0) - rspec-expectations (~> 2.10.0) - rspec-mocks (~> 2.10.0) - rspec-core (2.10.1) - rspec-expectations (2.10.0) + rspec (2.11.0) + rspec-core (~> 2.11.0) + rspec-expectations (~> 2.11.0) + rspec-mocks (~> 2.11.0) + rspec-core (2.11.0) + rspec-expectations (2.11.1) diff-lcs (~> 1.1.3) - rspec-mocks (2.10.1) + rspec-mocks (2.11.1) rubyzip (0.9.9) sanitize (2.0.3) nokogiri (>= 1.4.4, < 1.6) - sass (3.1.19) + sass (3.1.20) sass-rails (3.2.5) railties (~> 3.2.0) sass (>= 3.1.10) @@ -166,18 +166,22 @@ GEM rails (>= 3.1) therubyracer (0.10.1) libv8 (~> 3.3.10) - thor (0.15.3) + thor (0.15.4) tilt (1.3.3) + tolk (1.3.1) + will_paginate + ya2yaml (~> 0.26) treetop (1.4.10) polyglot polyglot (>= 0.3.1) tzinfo (0.3.33) - uglifier (1.2.5) + uglifier (1.2.6) execjs (>= 0.3.0) multi_json (~> 1.3) will_paginate (3.0.3) xpath (0.1.4) nokogiri (~> 1.3) + ya2yaml (0.31) yard (0.8.2.1) PLATFORMS @@ -188,25 +192,26 @@ DEPENDENCIES aasm acts_as_list aruba - bcrypt-ruby (~> 3.0.0) + bcrypt-ruby capybara - coffee-rails (~> 3.2.1) + coffee-rails cucumber-rails database_cleaner factory_girl_rails formatize htmlentities jquery-rails - mongrel (= 1.2.0.pre2) + mongrel (>= 1.2.0.pre2) mysql2 rails rails_autolink sanitize - sass-rails (~> 3.2.3) + sass-rails selenium-webdriver sqlite3 swf_fu therubyracer - uglifier (>= 1.0.3) + tolk + uglifier will_paginate yard diff --git a/config/initializers/tolk.rb b/config/initializers/tolk.rb new file mode 100644 index 00000000..5c3fa780 --- /dev/null +++ b/config/initializers/tolk.rb @@ -0,0 +1,14 @@ +# encoding: utf-8 + +# Tolk config file. Generated on July 18, 2012 13:01 +# See github.com/tolk/tolk for more informations + +if Rails.env==:development + Tolk.config do |config| + + # If you need to add a mapping do it like this : + # May we suggest you use http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + # config.mapping["fr-ES"] = 'Frañol !' + + end +end \ No newline at end of file diff --git a/config/locales/cz.yml b/config/locales/cz.yml index 3930a903..c961a15b 100755 --- a/config/locales/cz.yml +++ b/config/locales/cz.yml @@ -1,999 +1,986 @@ --- cz: - layouts: - toggle_contexts_title: "Zobrazí/skryje sbalené kontexty" - toggle_contexts: "Přepnout sbalené kontexty" - toggle_notes: "Zobrazit/skrýt poznámky" - next_actions_rss_feed: "RSS feed aktuálních úkolů" - toggle_notes_title: "Zobrazí/skryje všechny poznámky" - mobile_navigation: - new_action: "0-Nový úkol" - logout: "Odhlásit" - feeds: Feedy - starred: "4-Hvězdičky" - projects: 3-Projekty - tickler: Tickler - contexts: 2-Kontexty - home: "1-Domů" - navigation: - manage_users_title: "Přidat nebo smazat uživatele" - recurring_todos: "Opakující se úkoly" - api_docs: REST API Dokumenty - help: "?" - feeds: Feedy - starred: "S hvězdou" - stats: Statistiky - notes_title: "Zobrazit všechny poznámky" - manage_users: "Správa uživatelů" - tickler_title: Tickler - admin: n/d - preferences: "Nastavení" - integrations_: Integrovat Tracks - export_title: Import a export dat - calendar_title: "Kalendář datovaných úkolů" - feeds_title: "Seznam dostupných feedů" - stats_title: "Zobrazí statistiky úkolů" - tickler: Tickler - home_title: "Domů" - starred_title: "Zobrazí úkoly s hvězdičkou" - recurring_todos_title: "Správa opakovaných úkolů" - completed_tasks: "Hotové" - view: "Ukázat" - organize: "Správa" - completed_tasks_title: "Hotové úkoly" - home: "Domů" - export: Export - contexts_title: Kontexty - preferences_title: "Zobrazí možnosti nastavení" - search: Hledat - review_title: "Provést revizi" - projects_title: Projekty - calendar: "Kalendář" - number: - format: - separator: . - precision: 3 - delimiter: "," - human: - format: - precision: 1 - delimiter: "" - storage_units: - format: "%n %u" - units: - kb: KB - tb: TB - gb: GB - byte: - one: Byte - other: "Bytů" - mb: MB - percentage: - format: - delimiter: "" - precision: - format: - delimiter: "" - currency: - format: - format: "%u%n" - unit: $ - separator: . - precision: 2 - delimiter: "," - common: - recurring_todos: "Opakované úkoly" - back: "Zpět" - actions: "Úkoly" - third: "Třetí" - add: "Přidat" - previous: "Předchozí" - go_back: "Zpět" - logout: "Odhlásit" - second: "Druhý" - none: "Žádný" - week: "týden" - optional: "volitelné" - deferred: "odložené" - show_all: "Zobrazit všechny" - cancel: "Zrušit" - month: "měsíc" - actions_midsentence: - one: "úkolů" - other: "Úkoly" - zero: "Úkoly" - notes: "Poznámky" - server_error: Nastala chyba na serveru. - forum: "Fórum" - projects: Projekty - last: "Poslední" - review: Revize - action: "Úkol" - days_midsentence: - one: den - other: "dní" - zero: "dní" - project: Projekt - contribute: "Přispět" - ok: Ok - website: "Webová stránka" - first: "První" - note: - one: "1 na vědomí" - other: "%{count} na vědomy" - zero: "0 na vědomí" - numbered_step: Krok %{number} - create: "Vytvořit" - sort: - by_task_count_title: "Řadit podle počtu úkolů" - by_task_count_title_confirm: "Určitě chcete řadit tyto projekty podle počtu úkolů? Stávající pořadí bude ztraceno." - alphabetically: "Abecedně" - sort: "Řadit" - alphabetically_title: "Seřadit projekty abecedně" - alphabetically_confirm: "Určitě chcete řadit tyto projekty abecedně? Stávající pořadí bude ztraceno." - by_task_count: "Podle počtu úkolů" - todo: "úkol" - months: "měsíce" - errors_with_fields: "Nastaly potíže s následujícími políčky:" - description: Popis - next: "Další" - fourth: "Čtvrtý" - drag_handle: "CHYŤ MĚ" - context: Kontext - contexts: Kontexty - bugs: Chyby - update: "Uložit" - weeks: "týdny" - forth: "Čtvrtý" - wiki: Wiki - email: Email - ajaxError: "Chyba čtení ze serveru" - search: Hledat - not_available_abbr: n/a - integrations: - opensearch_description: Prohledat Tracks - applescript_next_action_prompt: "Popis úkolu:" - gmail_description: Gadget pro Tracks do Gmailu - applescript_success_after_id: "vytvořen" - applescript_success_before_id: "Nový úkol s ID" activerecord: attributes: - project: - name: "Název" - default_tags: "Výchozí štítky" - default_context_name: "Výchozí kontext" - description: Popis note: - created_at: "Vytvořeno:" - updated_at: "Aktualizován" - todo: - show_from: Zobrazovat od - predecessors: "Závisí na" - notes: "Poznámky" - tags: Tagy - project: Projekt - description: Popis - context: Kontext - due: "Plánováno na" + created_at: "Vytvo?eno:" + updated_at: Aktualizován preference: - show_hidden_projects_in_sidebar: "Zobrazovat skryté projekty v sidebaru" - show_hidden_contexts_in_sidebar: "Zobrazovat skryté kontexty v sidebaru" date_format: "Formát data" - sms_context: "Výchozí emailový kontext" - verbose_action_descriptors: "Ukecané popisovače úkolů" - staleness_starts: "Jako prošlé označit projekty starší než" - mobile_todos_per_page: "Úkolů na stránku (mobilní zobrazení)" - show_number_completed: "Počet hotových úkolů k zobrazení" - title_date_format: "Formát data nadpisu" + due_style: "Zobrazení datovaných úkol?" + first_name: Jméno + last_name: P?íjmení + locale: Lokále + mobile_todos_per_page: "Úkol? na stránku (mobilní zobrazení)" refresh: "Interval obnovení stránky (v minutách)" - week_starts: "Začátek týdne" - last_name: "Příjmení" - due_style: "Zobrazení datovaných úkolů" - locale: "Lokále" - time_zone: "Časové pásmo" - sms_email: SMS email - show_project_on_todo_done: "Po splnění úkolu přejít na projekt" + review_period: "Interval revize projekt?" show_completed_projects_in_sidebar: "Zobrazovat hotové projekty v sidebaru" - first_name: "Jméno" - review_period: "Interval revize projektů" + show_hidden_contexts_in_sidebar: "Zobrazovat skryté kontexty v sidebaru" + show_hidden_projects_in_sidebar: "Zobrazovat skryté projekty v sidebaru" + show_number_completed: "Po?et hotových úkol? k zobrazení" + show_project_on_todo_done: "Po spln?ní úkolu p?ejít na projekt" + sms_context: "Výchozí emailový kontext" + sms_email: "SMS email" + staleness_starts: "Jako prošlé ozna?it projekty starší než" + time_zone: "?asové pásmo" + title_date_format: "Formát data nadpisu" + verbose_action_descriptors: "Ukecané popisova?e úkol?" + week_starts: "Za?átek týdne" + project: + default_context_name: "Výchozí kontext" + default_tags: "Výchozí štítky" + description: Popis + name: Název + todo: + context: Kontext + description: Popis + due: "Plánováno na" + notes: Poznámky + predecessors: "Závisí na" + project: Projekt + show_from: "Zobrazovat od" + tags: Tagy user: - last_name: "Jméno" - first_name: "Příjmení" + first_name: P?íjmení + last_name: Jméno errors: + full_messages: + format: "%{attribute} %{message}" + messages: + accepted: "musí být akceptováno" + blank: "nesmí být prázdné" + confirmation: "se neshoduje s ov??ením" + empty: "nesmí být prázdné" + equal_to: "se musí rovnat %{count}" + even: "must be even" + exclusion: "je rezervované" + greater_than: "musí být v?tší než %{count}" + greater_than_or_equal_to: "musí být v?tší nebo rovno %{count}" + inclusion: "není na seznamu" + invalid: "nesmí obsahovat ?árku (',')" + less_than: "musí být menší než %{count}" + less_than_or_equal_to: "musí být menší nebo rovno %{count}" + not_a_number: "není ?íslo" + odd: "must be odd" + record_invalid: "Problém s daty: %{errors}" + taken: "už bylo zabráno" + too_long: "je p?íliš dlouhé (maximum je %{count} znak?)" + too_short: "je p?íliš krátké (minimum je %{count} znak?)" + wrong_length: "nemá správnou délku (má mít %{count} znak?)" models: project: attributes: name: blank: "projekt musí mít název" - too_long: "název projektu musí být kratší než 256 znaků" taken: "už existuje" - messages: - record_invalid: "Problém s daty: %{errors}" - greater_than_or_equal_to: "musí být větší nebo rovno %{count}" - confirmation: "se neshoduje s ověřením" - less_than_or_equal_to: "musí být menší nebo rovno %{count}" - blank: "nesmí být prázdné" - exclusion: "je rezervované" - invalid: "nesmí obsahovat čárku (',')" - odd: must be odd - even: must be even - empty: "nesmí být prázdné" - too_short: "je příliš krátké (minimum je %{count} znaků)" - wrong_length: "nemá správnou délku (má mít %{count} znaků)" - less_than: "musí být menší než %{count}" - greater_than: "musí být větší než %{count}" - equal_to: "se musí rovnat %{count}" - accepted: "musí být akceptováno" - too_long: "je příliš dlouhé (maximum je %{count} znaků)" - taken: "už bylo zabráno" - inclusion: "není na seznamu" - not_a_number: "není číslo" - full_messages: - format: "%{attribute} %{message}" + too_long: "název projektu musí být kratší než 256 znak?" template: - body: "Nastaly potíže s následujícími políčky:" + body: "Nastaly potíže s následujícími polí?ky:" header: one: "jedna chyba brání uložení tohoto objektu %{model}" other: "%{count} chyb brání uložení tohoto objektu %{model}" + common: + action: Úkol + actions: Úkoly + actions_midsentence: + one: úkol? + other: Úkoly + zero: Úkoly + add: P?idat + ajaxError: "Chyba ?tení ze serveru" + back: Zp?t + bugs: Chyby + cancel: Zrušit + context: Kontext + contexts: Kontexty + contribute: P?isp?t + create: Vytvo?it + days_midsentence: + one: den + other: dní + zero: dní + deferred: odložené + description: Popis + drag_handle: "CHY? M?" + email: Email + errors_with_fields: "Nastaly potíže s následujícími polí?ky:" + first: První + forth: "?tvrtý" + forum: Fórum + fourth: "?tvrtý" + go_back: Zp?t + last: Poslední + logout: Odhlásit + month: m?síc + months: m?síce + next: Další + none: Žádný + not_available_abbr: n/a + note: + one: "1 na v?domí" + other: "%{count} na v?domy" + zero: "0 na v?domí" + notes: Poznámky + numbered_step: "Krok %{number}" + ok: Ok + optional: volitelné + previous: P?edchozí + project: Projekt + projects: Projekty + recurring_todos: "Opakované úkoly" + review: Revize + search: Hledat + second: Druhý + server_error: "Nastala chyba na serveru." + show_all: "Zobrazit všechny" + sort: + alphabetically: Abecedn? + alphabetically_confirm: "Ur?it? chcete ?adit tyto projekty abecedn?? Stávající po?adí bude ztraceno." + alphabetically_title: "Se?adit projekty abecedn?" + by_task_count: "Podle po?tu úkol?" + by_task_count_title: "?adit podle po?tu úkol?" + by_task_count_title_confirm: "Ur?it? chcete ?adit tyto projekty podle po?tu úkol?? Stávající po?adí bude ztraceno." + sort: "?adit" + third: T?etí + todo: úkol + update: Uložit + website: "Webová stránka" + week: týden + weeks: týdny + wiki: Wiki + contexts: + add_context: "Vytvo?it kontext" + all_completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" + completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" + context_deleted: "Kontext byl odstran?n '%{name}'" + context_hide: "Schovat z úvodní stránky?" + context_name: "Náev kontextu" + delete_context: "Smazat kontext" + delete_context_confirmation: "Opravdu chcete smazat kontext '%{name}'? Dojde ke smazání všech (opakovaných) úkol? z daného kontextu!" + delete_context_title: "Smazat kontext" + edit_context: "Upravit kontext" + hidden_contexts: "Schovat kontexty" + hide_form: "Schovat formulá?" + hide_form_title: "Schovat formulá?" + last_completed_in_context: "v tomto kontextu (posledních %{number})" + new_context_post: "' bude také vytvo?en. Opravdu?" + new_context_pre: "Nový kontext '" + no_actions: "Žádné aktivní úkoly v tomto kontextu" + no_contexts_active: "Žádné aktivní kontexty" + no_contexts_hidden: "Žádné skryté kontexty" + save_status_message: "Kontext uložen" + show_form: "Nový kontext" + show_form_title: "Nový kontext" + status_active: "Kontext je aktivní" + status_hidden: "kontext je skrytý" + todos_append: "v této souvislosti" + update_status_message: "Název kontextu byl zm?n?n" + visible_contexts: "Viditelné kontexty" data: - import_successful: "Import byl úspěšný." - import_errors: "Při importu došlo k chybám" + import_errors: "P?i importu došlo k chybám" + import_successful: "Import byl úsp?šný." + date: + abbr_day_names: + - Ne + - Po + - Út + - St + - "?t" + - Pá + - So + abbr_month_names: + - ~ + - Led + - Úno + - B?e + - Dub + - Kv? + - "?er" + - "?ec" + - Srp + - Zá? + - "?íj" + - Lis + - Pro + day_names: + - Ned?le + - Pon?lí + - Úterý + - St?eda + - "?tvrtek" + - Pátek + - Sobota + formats: + default: "%Y-%m-%d" + long: "%B %d, %Y" + longer: "%A %B %d, %Y" + short: "%b %d" + month_names: + - ~ + - Leden + - Únor + - B?ezen + - Duben + - Kv?ten + - "?erven" + - "?ervenec" + - Srpen + - Zá?í + - "?íjen" + - Listopad + - Prosinec + order: + - !ruby/symbol rok + - ":m?síc" + - !ruby/symbol den + datetime: + distance_in_words: + about_x_hours: + one: "about 1 hodina" + other: "p?ibližn? %{count} hodin" + about_x_months: + one: "about 1 m?síc" + other: "p?ibližn? %{count} m?síc?" + about_x_years: + one: "about 1 rok" + other: "p?ibližn? %{count} let" + almost_x_years: + one: "almost 1 rok" + other: "skoro %{count} let" + half_a_minute: "p?l minuty" + less_than_x_minutes: + one: "mén? než minuta" + other: "mén? než %{count} minut" + zero: "mén? než minuta" + less_than_x_seconds: + one: "mén? než 1 sekunda" + other: "mén než %{count} sekund" + zero: "mén? než 1 sekunda" + over_x_years: + one: "p?es rok" + other: "p?es %{count} let" + x_days: + one: "1 den" + other: "%{count} dní" + x_minutes: + one: "1 minuta" + other: "%{count} minut" + x_months: + one: "1 m?síc" + other: "%{count} m?síc?" + x_seconds: + one: "1 sekunda" + other: "%{count} sekund" + prompts: + day: Den + hour: Hodina + minute: Minuta + month: M?síc + second: Sekunda + year: Rok + errors: + user_unauthorized: "401 Neautorizováno: Jen administráto?i smí používat tuto funkci." + feedlist: + actions_completed_last_week: "Úkoly dokon?ené v posledních sedmi dnech" + actions_due_next_week: "Úkoly plánované na p?íštích sedm dní" + actions_due_today: "Akce plánované na dnes" + active_projects_wo_next: "Aktivni projekty bez úkol?" + active_starred_actions: "Všechny aktivní úkoly s hv?zdi?kou" + all_actions: "Všechny úkoly" + all_contexts: "Všechny kontexty" + all_projects: "Všechny projekty" + choose_context: "Vyberte kontext jehož feed si p?ejete" + choose_project: "Vyberte projekt jehož feed si p?ejete" + context_centric_actions: "Feedy s aktivními úkoly podle kontext?" + context_needed: "Musíte nejd?íve založit aspo? jeden kontext" + ical_feed: "iCal feed" + last_fixed_number: "Posledních %{number} úkol?" + legend: "Legenda:" + notice_incomplete_only: "Poznámka: všechny feedy obsahují jen nehotové úkoly." + plain_text_feed: "Prostý text" + project_centric: "Feedy s aktivními úkoly podle projektu" + project_needed: "Musíte nejd?íve založit aspo? jeden projekt" + projects_and_actions: "Aktivní projekty a jejich úkoly" + rss_feed: "RSS Feed" + select_feed_for_context: "Select the feed for this context" + select_feed_for_project: "Vyberte feed pro tento projekt" + footer: + send_feedback: "Poslat zp?tnou vazbu na %{version}" + integrations: + applescript_next_action_prompt: "Popis úkolu:" + applescript_success_after_id: vytvo?en + applescript_success_before_id: "Nový úkol s ID" + gmail_description: "Gadget pro Tracks do Gmailu" + opensearch_description: "Prohledat Tracks" + layouts: + mobile_navigation: + contexts: 2-Kontexty + feeds: Feedy + home: 1-Dom? + logout: Odhlásit + new_action: "0-Nový úkol" + projects: 3-Projekty + starred: 4-Hv?zdi?ky + tickler: Tickler + navigation: + admin: n/d + api_docs: "REST API Dokumenty" + calendar: Kalendá? + calendar_title: "Kalendá? datovaných úkol?" + completed_tasks: Hotové + completed_tasks_title: "Hotové úkoly" + contexts_title: Kontexty + export: Export + export_title: "Import a export dat" + feeds: Feedy + feeds_title: "Seznam dostupných feed?" + help: "?" + home: Dom? + home_title: Dom? + integrations_: "Integrovat Tracks" + manage_users: "Správa uživatel?" + manage_users_title: "P?idat nebo smazat uživatele" + notes_title: "Zobrazit všechny poznámky" + organize: Správa + preferences: Nastavení + preferences_title: "Zobrazí možnosti nastavení" + projects_title: Projekty + recurring_todos: "Opakující se úkoly" + recurring_todos_title: "Správa opakovaných úkol?" + review_title: "Provést revizi" + search: Hledat + starred: "S hv?zdou" + starred_title: "Zobrazí úkoly s hv?zdi?kou" + stats: Statistiky + stats_title: "Zobrazí statistiky úkol?" + tickler: Tickler + tickler_title: Tickler + view: Ukázat + next_actions_rss_feed: "RSS feed aktuálních úkol?" + toggle_contexts: "P?epnout sbalené kontexty" + toggle_contexts_title: "Zobrazí/skryje sbalené kontexty" + toggle_notes: "Zobrazit/skrýt poznámky" + toggle_notes_title: "Zobrazí/skryje všechny poznámky" + login: + account_login: "P?ihlášení uživatele" + cas_create_account: "Pro vytvo?ení ú?tu v CASu prosím pokra?ujte sem %{signup_link}" + cas_logged_in_greeting: "Zdraví?ko, %{username}! Byl jste autorizován." + cas_login: "P?ihlášení p?es CAS" + cas_no_user_found: "Nazdar, %{username}! Nemáte ú?et na Tracks." + cas_signup_link: "Vyžádat ú?et" + cas_username_not_found: "Bohužel neexistuje uživatel v CASu se jménem (%{username})" + log_in_again: "p?ihlašte se znovu." + logged_out: "You have been logged out of Tracks." + login_cas: "p?ejít na CAS" + login_standard: "vra?te se ke standardnímu p?ihlášení" + login_with_openid: "p?ihlašte se se svým OpenID" + mobile_use_openid: "…nebo p?ihlášení s OpenID" + openid_identity_url_not_found: "Je nám líto, neexistuje uživatel s touto identitou (%{identity_url})" + option_separator: nebo + please_login: "Pro pokra?ování se prosím p?ihlšte do Tracks" + session_time_out: "Sezení vypršelo. Prosím %{link}" + session_will_expire: "sezen vyprší za %{hours} hodin neaktivity." + session_will_not_expire: "sezení bylo nastaveno jako trvalé." + sign_in: "P?ihlásit se" + successful: "P?ihlášení úsp?šné. Vítejte zp?t!" + successful_with_session_info: "P?ihlášení bylo úsp?šné:" + unsuccessful: "P?ihlášení bylo úsp?šné." + user_no_expiry: Neodhlšovat models: + preference: + due_in: "Plánováno za %{days} dní" + due_on: "Plánováno na %{date}" + due_styles: + - "Plánováno za ___ dní" + - "Plánováno na _______" project: - feed_title: Projekty feed_description: "Všechny projekty uživatele %{username}" + feed_title: Projekty todo: error_date_must_be_future: "datum musí být v budoucnosti" - preference: - due_on: "Plánováno na %{date}" - due_in: "Plánováno za %{days} dní" - due_styles: - - "Plánováno za ___ dní" - - "Plánováno na _______" user: - error_context_not_associated: "Kontext %{context} nepatří uživateli %{user}." - error_project_not_associated: "Projekt %{project} nepatří uživateli %{user}." - stats: - actions_min_max_completion_days: "Maximum/minimum dní na dokončení je %{min}/%{max}." - totals_hidden_context_count: "a %{count} skrytých kontextů." - actions_avg_created: "Za posledních 12 měsíců bylo vytvořeno průměrně %{count} úkolů" - totals_actions_completed: "%{count} z nich je hotových." - tag_cloud_title: "Mrak štítků pro všechny úkly" - actions_actions_avg_created_30days: "Za posledních 30 dní bylo vytvořeno průměrně %{count} úkolů" - actions_avg_completed: "a uzavřeno průměrně %{count} úkolů za měsíc." - top5_visible_contexts_with_incomplete_actions: "Top 5 viditelných kontextů s nehotovými úkoly" - actions: "Úkoly" - time_of_day_legend: - number_of_actions: "Počet úkolů" - time_of_day: "Denní doba" - totals_incomplete_actions: "Máte %{count} nehotových úkolů" - totals_deferred_actions: "z nichž %{count} jsou odložené úkoly v Ticlkeru" - running_time_legend: - actions: "Úkoly" - percentage: "Podíl" - weeks: "Čas běhu úkolu (týdny). Klepněte na sloupec pro další info" - totals_action_count: "máte celkem %{count} úkolů" - tag_cloud_90days_title: "Značky úkolů z posledních 90-ti dní" - actions_avg_completion_time: "Pro všechny vaše hotové úkoly je průměrný čas dokončení %{count} dní." - tod30: "Denní doba (posledních 30 dní)" - tags: "Štítky" - projects: Projekty - totals_completed_project_count: "a %{count} je hotových projektů." - labels: - month_avg_completed: "%{months} měsíční průměr hotových" - completed: Completed - month_avg_created: "%{months} měsíční průměr vytvořených" - avg_created: "průměrně vytvořeno" - avg_completed: "průměrně uzavřeno" - created: "Vytvořeno" - actions_selected_from_week: "Úkoly vybrané z týdne " - actions_day_of_week_title: "Den v týdnu (všechny úkoly)" - actions_lastyear_title: "Úkoly za posledních 12 měsíců" - open_per_week: "Aktivní (viditelné i skryté) další akce za týden" - action_selection_title: "TRACKS::výběr úkolů" - totals_project_count: "Máte %{count} projektů." - legend: - number_of_days: "Před kolika dny" - actions: "Úkoly" - number_of_actions: "Počet úkolů" - day_of_week: "Den v týdnu" - running_time: "Čas k dokončení úkolu (týdny)" - percentage: "Podíl" - months_ago: "měsíců zpět" - current_running_time_of_incomplete_visible_actions: "Aktuální čas běhu nedokončených viditelných úkolů" - tod30_legend: - number_of_actions: "Počet úkolů" - time_of_day: "Denní doba" - totals_context_count: "Máte %{count} kontextů." - open_per_week_legend: - actions: "Akcí" - weeks: "Týdny" - actions_last_year_legend: - number_of_actions: "Počet úklolů" - months_ago: "měsíců zpět" - top5_contexts: "Top 5 kontextů" - top10_projects: "Top 10 projektů" - contexts: Kontexty - totals: Celkem - click_to_return: "Klepněte %{link} pro návrat ke statistikám." - tag_cloud_90days_description: "Tento mrak zahrnuje štítky úkolů, které byly vytvořeny nebo dokončeny v posledních 90-ti dnech." - totals_visible_context_count: "Z nich je %{count} viditelných kontextů" - top10_projects_30days: "Top 10 projektů za posledních 30 dní" - running_time_all: "Aktuální čas běhu všech nehotových úkolů" - actions_min_completion_time: "Minimální čas k dokončení je %{time}." - action_completion_time_title: "Čas dokončení (všechny hotové úkoly)" - click_to_show_actions_from_week: "Klepněte %{link} pro zobrazení úkolů z týdne %{week} a dalších." - top10_longrunning: "10 nejdéle běžících projektů" - no_actions_selected: "Nejsou vybrány žádné úkoly." - totals_tag_count: "Na akcích je umístěno %{count} štítků." - actions_further: " a dále" - actions_dow_30days_legend: - number_of_actions: "Počet akcí" - day_of_week: "Den v týdnu" - totals_first_action: "Od vašeho prvního úkolu %{date}" - tag_cloud_description: "Tento mrak zahrnuje štítky všech úkolů (hotových, nehotových, viditelných i skrytých)" - spread_of_actions_for_all_context: "Distribuce všech úkolů do kontextů" - click_to_update_actions: "Klepněte na sloupec v grafu pro zobrazení detailů níže." - click_to_return_link: zde - more_stats_will_appear: "Další statistiky se zobrazí až přibyde více úkolů." - actions_avg_completed_30days: "a dokončeno průměrně %{count} úkolů za den." - actions_30days_title: "Úkoly za posledních 30 dní" - no_tags_available: "žádné štítky nejsou definovány" - index_title: TRACKS::Statistika - actions_dow_30days_title: "Dny v týdnu (posleních 30 dní)" - actions_day_of_week_legend: - number_of_actions: "Počet akcí" - day_of_week: "Den v týdnu" - within_one: "V rámci 1." - spread_of_running_actions_for_visible_contexts: "Distribuce běžících úkolů do viditelných kontextů" - actions_last_year: "Úkoly v posledním roce" - totals_blocked_actions: "%{count} je závislých na dokončení jiných akcí." - totals_unique_tags: "Z těchto štítků je %{count} unikátních." - totals_active_project_count: "Znich %{count} je aktivních projeků" - running_time_all_legend: - actions: "Úkoly" - running_time: "Čas běhu úkolů (týdny). Klepněte na sloupec pro další info" - percentage: "Podíl" - other_actions_label: "(ostatní)" - totals_hidden_project_count: "%{count} je skrytých" - time_of_day: "Denní doba (všechny úkoly)" - todos: - recurring_action_deleted: "Úkol byl smazán. Protože jde o opakovaný úkol, byl vložen nový úkol" - show_from: Zobrazovat od - error_starring_recurring: "Nebylo možno ohvězdičkovat opakovaný úkol \\'%{description}\\'" - completed_actions: "Hotové úkoly" - added_new_next_action: "Přidán nový úkol" - completed_recurring: "Hotové opakované úkoly" - completed_rest_of_previous_month: "Uzavřeno ve zbytku minulého měsíce" - blocked_by: "Čeká na %{predecessors}" - star_action: "Oznařit hvězdičkou" - completed_recurrence_completed: "Bylo smazáno poslední opakování opakovaného úkolu. Opakování dokončeno" - defer_date_after_due_date: "Datum zobrazení je až po plánovaném datu úkolu. Upravte datum úkolu před dalším pokusem o odpložení zobrazení." - unable_to_add_dependency: "Nepodařilo se přidat závislost" - done: Hotovo? - star_action_with_description: "ohvězdičkovat úkol '%{description}'" - tagged_with: "označeno štítkem ‘%{tag_name}’" - completed: Hotovo - no_deferred_actions_with: "Žádné odložené úkoly se štítkem '%{tag_name}'" - no_hidden_actions: "Žádné skryté úkoly" - edit_action_with_description: "Upravit úkol '%{description}'" - action_due_on: "(úkol plánován na %{date})" - list_incomplete_next_actions: "Zabrazí nehotové úkoly" - archived_tasks_title: "TRACKS::Archiv hotových úkolů" - remove_dependency: "Odstranit závislost (nesmaže úkol)" - action_deleted_success: "Úkol byl úspěšně smazán" - tags: "Štítky (oddělené čárkami)" - delete_recurring_action_title: "Smazat opakovaný úkol" - context_changed: "Kontext byl změněn na %{name}" - new_related_todo_created: "Byl vytvořen nový úkol patřící do tohoto opakovaného úkolu" - mobile_todos_page_title: "Všechny úkoly" - add_another_dependency: "Přidat další závislost" - removed_predecessor: "Byl odstraněn %{successor} jako závislost pro %{predecessor}." - recurring_actions_title: "TRACKS::Opakované úkoly" - next_action_needed: "Je potřeba zadat aspoň jeden úkol" - action_saved: "Úkol uložen" - scheduled_overdue: "Naplánováno zobrazení před %{days} dny" - action_deleted_error: "Nepodařilo se smazat úkol" - edit_action: "Upravit úkol" - added_new_context: "Přidán nový kontext" - next_actions_description: "Filtr:" - list_incomplete_next_actions_with_limit: "Zobrazuje posledních %{count} nedokončených úkolů" - set_to_pending: "%{task} nastaven jako čekající" - added_new_project: "Přidán nový projekt" - next_actions_title_additions: - completed: "hotové úkoly" - due_today: dnes - due_within_a_week: "během týdne" - older_completed_items: "" - no_actions_due_this_week: "Žádné úkoly plánovány na tento týden" - all_completed_here: zde - append_in_this_project: v tomto projektu - edit_recurring_todo: "Upravit opakovaný úkol" - error_deleting_item: "Nepodařilo se smazat položku %{description}" - task_list_title: "TRACKS::Úkoly" - no_recurring_todos: "Žádné opakované úkoly" - error_completing_todo: "Nepodařilo se ukončit / aktivovat opakovaný úkol %{description}" - recurring_pattern_removed: "Vzor opakování byl odstraněn z %{count}" - convert_to_project: "Vytvořit projekt" - no_deferred_pending_actions: "Žádné odložené ani čekající úkoly" - delete_recurring_action_confirm: "Opravdu chcete smazat opakovaný úkol '%{description}'?" - completed_last_day: "Ukončené v posledních 24 hodinách" - feed_title_in_context: v kontextu '%{context}' - no_project: "--Žádný projekt--" - show_in_days: "Zobrazit za %{days} dní" - error_saving_recurring: "Nepodařilo se uložit opakovaný úkol \\'%{description}\\'" - completed_more_than_x_days_ago: "" - new_related_todo_created_short: "vytvořen nový úkol" - all_completed: "Všechny hotové úkoly" - edit: Upravit - completed_actions_with: "Hotové úkoly se štítkem '%{tag_name}'" - older_than_days: "" - completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem '%{tag_name}'" - pending: "Čekající" - completed_tasks_title: "TRACKS::Hotové úkoly" - deleted_success: "Úkol byl úspěšně smazán." - feed_title_in_project: v projektu '%{project}' - clear_due_date: "Smazat plánované datum úkolu" - error_removing_dependency: "Nepodařilo se odstranit závislost" - hidden_actions: "Skryté úkoly" - was_due_on_date: "bylo plánováno na %{date}" - show_on_date: "Ukázat %{date}" - recurrence_period: "Interval opakování" - deferred_actions_with: "Odložené úkoly se štítkem '%{tag_name}'" - confirm_delete: "Opravdu chcete smazat úkol '%{description}'?" - recurring_deleted_success: "Opakovaný úkol byl úspěšně smazán." - no_completed_actions_with: "Žádné hotové úkoly se štítkem '%{tag_name}'" - next_actions_title: "Tracks - Úkoly" - next_action_description: "Popis úkolu" - deferred_tasks_title: TRACKS::Tickler - clear_show_from_date: "Odstranit datum zobrazení" - in_hidden_state: "(skrytý)" - see_all_completed: "Můžete vidět všechny dokončené akce %{link}" - calendar_page_title: "TRACKS::Kalendář" - unresolved_dependency: "Hodnota v poli 'závisí na' neodpovídá žádnému existujícímu úkolu. Hodnota bude ignorována. Pokračovat?" - no_actions_found_title: "Nenalezeny žádné úkoly" - show_today: Zobrazit Dnes - next_actions_due_date: - overdue_by: "Prošlé %{days} den" - due_in_x_days: "Za %{days} dní" - due_today: Dnes - overdue_by_plural: "Prošlé %{days} dní" - due_tomorrow: "Zítra" - completed_last_x_days: "Uzavřené za posledních %{count} dní" - no_actions_with: "Žádné úkoly se štítkem '%{tag_name}'" - defer_x_days: - one: "Ukázat zítra" - other: "Ukázat za %{count} dní" - added_new_next_action_singular: "Přidán nový úkol" - no_completed_actions: "Žádné hotové úkoly." - deferred_pending_actions: "Odložené/čekající úkoly" - has_x_pending: - one: "Jeden čekající úkol" - other: "%{count} čekajících úkolů" - feeds: - completed: "Hotové: %{date}" - due: "Plánováno na: %{date}" - recurring_todos: "Opakované úkoly" - error_deleting_recurring: "Nepodařilo se smazat opakovaný úkol \\'%{description}\\'" - delete_action: "Smazat úkol" - delete: Smazat - no_last_completed_actions: "Žádné hotové úkoly" - drag_action_title: "Přetáhnout na jiný úkol pro vytvoření závislosti" - cannot_add_dependency_to_completed_todo: "Nelze přidat úkol jako závislost k hotovému úkolu!" - depends_on: "Závisí na" - tickler_items_due: - one: "Jeden úkol v Tickleru je plánován dnes - obnovte stránku pro zobrazení." - other: "%{count} položek v Tickleru je plánováno na dnes tickler items are now due - obnovte stránku pro zobrazení." - action_marked_complete: "Úkol '%{description}' byl označen jako %{completed}" - completed_today: "Dokončené dnes" - added_new_next_action_plural: "Úkoly byly přidány" - new_related_todo_not_created_short: "úkol nebyl vytvořen" - completed_rest_of_week: "Dokončené ve zbytku týdne" - show_tomorrow: "Zobrazit zítra" - error_starring: "Nepodařilo se označit úkol hvězdičkou '%{description}'" - calendar: - get_in_ical_format: "Kalendář ve formátu iCal" - due_next_week: "Plánované příští týden" - no_actions_due_next_week: "Na příští týden nejsou plánované žádné úkoly" - due_this_week: "Plánované ve zbytku týdne" - no_actions_due_today: "Na dnešek nejsou plánované žádné úkoly" - due_today: "Plánované dnes" - due_next_month_and_later: "Plánováno na %{month} a dále" - no_actions_due_after_this_month: "Na příští měsíc a dále nejsou plánované žádné úkoly" - no_actions_due_this_month: "Na zbytek tohoto měsíce nejsou žádné úkoly" - due_this_month: "Plánováno na %{month}" - no_completed_recurring: "Žádné hotové opakované úkoly" - recurrence: - ends_on_date: "Končí %{date}" - every_work_day: "Každý pracovní den" - ends_on_number_times: "Končí po %{number} opakováních" - recurrence_on_due_date: "datum na které je úkol plánován" - weekly_options: "Nastavení pro týdenní opakované úkoly" - weekly: "Týdně" - monthly_options: "Nastavení pro měsíční opakované úkoly" - daily_options: "Nastavení pro denní opakované úkoly" - monthly: "Měsíčně" - starts_on: "Začíná" - daily: "Denně" - show_option_always: "stále" - pattern: - third: "třetí" - month_names: - - - - Leden - - "Únor" - - "Březen" - - Duben - - "Květen" - - "Červen" - - "Červenec" - - Srpen - - "Září" - - "Říjen" - - Listopad - - Prosinec - every_n: "každé %{n}" - second: "druhý" - every_xth_day_of_every_n_months: "každý %{x} %{day} každých %{n_months}" - on_day_n: "%{n}. den" - weekly: "každý týden" - from: od - last: "poslední" - every_day: "každý den" - the_xth_day_of_month: "%{x} %{day} měsíce %{month}" - times: "(%{number} opakování)" - show: "ukázat" - first: "první" - every_year_on: "každý rok %{date}" - day_names: - - "neděle" - - "pondělí" - - "úterý" - - "středa" - - "čtvrtek" - - "pátek" - - sobota - on_work_days: "v pracovní dny" - fourth: "čtvrtý" - due: "plánováno na" - every_month: "každý měsíc" - until: do - yearly_every_x_day: "Každý %{month} %{day}" - recurrence_on_options: "Nastavit opakování na" - daily_every_number_day: "Každých %{number} dní" - show_options: "Úkázat úkol" - weekly_every_number_week: "Každých %{number} týdnů" - ends_on: "Končí" - show_days_before: "%{days} dní před plánovaným datem" - from_tickler: "datum kdy úkol vypadne z Tickleru (není nastaveno plánované datum)" - no_end_date: Nikdy - day_x_on_every_x_month: "%{day}. den každý %{month}. měsíc" - yearly_every_xth_day: "%{day} %{day_of_week} měsíce %{month}" - yearly_options: "Nastavení pro roční opakované úkoly" - yearly: "Ročně" - monthly_every_xth_day: "%{day} %{day_of_week} každý %{month}. měsíc" - action_deferred: "Úkol '%{description}' byl oldožen" - tagged_page_title: "TRACKS::Se štítkem '%{tag_name}'" - added_dependency: "Přidáno %{dependency} jako závislost." - completed_rest_of_month: "Ukončené ve zbytku tohoto měsíce" - all_completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem %{tag_name}" - no_deferred_actions: "Žádné odložené úkoly." - recurrence_completed: "Poslední opakování úkolu bylo označeno jako hotové. Opakovaný úkol je dokončený" - action_marked_complete_error: "Úkol '%{description}' NEBYL označen jako %{completed} kvůli chybě na serveru." - no_actions_found: "Žádné běžící úkoly." - in_pending_state: "ve stavu čekající" - error_toggle_complete: "Nepodařilo se označit úkol jako hotový" - due: "Plánováno na" - no_incomplete_actions: "Žádné nehotové úkoly" - action_saved_to_tickler: "Úkol byl uložen do Tickleru" - recurring_action_saved: "Opakovaný úkol byl uložen" - depends_on_separate_with_commas: "Závisí na (odděleno čárkami)" - completed_in_archive: - one: "V archivu je hotový úkol." - other: "V archivu je %{count} hotových úkolů." - to_tickler: do Tickleru - next_actions_description_additions: - completed: "v posledních %{count} dnech" - due_date: "plánovano na %{due_date} nebo dříve" - overdue: "Spožděné úkoly" - add_new_recurring: "Vytvořit opakovaný úkol" + error_context_not_associated: "Kontext %{context} nepat?í uživateli %{user}." + error_project_not_associated: "Projekt %{project} nepat?í uživateli %{user}." notes: - delete_note_title: "Smazat poznámku '%{id}'" delete_confirmation: "Opravdu chcete smazat poznámku '%{id}'?" - in_project: "V:" delete_item_title: "Smazat položku" - deleted_note: "Smazat poznámku '%{id}'" - note_link_title: "Zobrazit poznámku %{id}" - show_note_title: "Zobrazit poznámku" - edit_item_title: "Upravit položku" - note_location_link: "V:" - no_notes_available: "Žádné poznámky: přidejte poznámky ze stránek jednotlivých projektů." - note_header: "Poznámka %{id}" delete_note_confirm: "Opravdu chcete smazat poznámku '%{id}'?" - projects: - default_context_set: "Výchozí kontext %{default_context} byl nastaven" - no_actions_in_project: "Žádné aktivní úkoly" - deferred_actions: "Odložené úkoly projektu" - was_marked_hidden: "byl označen jako skrytý" - edit_project_title: Upravit projekt - default_tags_removed_notice: "Výchozí štítky byly odstraněny" - page_title: "TRACKS::Projekt: %{project}" - all_completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" - hide_form: "Skrýt formulář" - list_completed_projects: "TRACKS::Hotové projekty" - no_notes_attached: "Žádné poznámky" - to_new_project_page: "přejít k novému projektu" - show_form_title: "Nový projekt" - deferred_actions_empty: "Žádné odložené úkoly" - project_state: Projekt je %{state}. - this_project: Tento projekt - no_last_completed_projects: "Žádné hotové projekty" - no_last_completed_recurring_todos: "Žádné hotové opakované úkoly" - notes: "Poznámky" - todos_append: v tomto projektu - list_reviews: TRACKS::Revize - notes_empty: "Žádné poznámky" - no_projects: "Žádné projekty" - hide_form_title: "Schovat formulář založení projektu" - delete_project: Smazat projekt - completed_actions_empty: "V tomto projektu nejsou žádné hotové úkoly" - with_no_default_context: "bez výchozího kontextu" - delete_project_confirmation: Opravdu chcete smazat projekt '%{name}'? - with_default_context: "s výchozím kontextem '%{context_name}'" - show_form: "Nový projekt" - actions_in_project_title: "Úkoly v tomto projetku" - completed_projects: "Hotové projetky" - is_active: "je aktivní" - add_note: "Nová poznámka" - set_default_tags_notice: "Nastavit výchozí šítky úkolů v tomto projektu %{default_tags}" - add_project: "Přidat projekt" - settings: "Nastavení" - project_saved_status: "Projekt byl uložen" - list_projects: TRACKS::Projekty - with_default_tags: "a s '%{tags}' jako výchozí štítky" - completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" - hidden_projects: "Skryté projekty" - delete_project_title: "Smaže projekt" - default_context_removed: "Výchozí kontext byl odstraněn" - add_note_submit: "Nová poznámka" - completed_actions: "Hotové úkoly tohoto projektu" - was_marked_complete: "byl označen jako hotový" - no_default_context: "Tento projekt nemá výchozí kontext" - with_no_default_tags: "a nemá žádné výchozí značky" - default_context: "Výchozí kontext pro tento projekt je %{context}" - edit_project_settings: Upravit vlastnosti projektu - status_project_name_changed: "Jméno projektu bylo změněno" - state: Tento projekt je %{state} - active_projects: "Aktivní projekty" - states: - hidden_plural: "Skryté" - stalled: "Opuštěný" - review_plural: "Nerevidované" - completed: "Hotový" - current: "Aktuální" - review: "Nerevidovaný" - completed_plural: "Hotové" - blocked: "Blokovaný" - blocked_plural: "Blokované" - stalled_plural: "Opuštěné" - visible_plural: "Viditelné" - active_plural: "Aktivní" - visible: "Viditelný" - hidden: "Skrytý" - active: "Aktivní" - current_plural: "Aktuální" - errors: - user_unauthorized: "401 Neautorizováno: Jen administrátoři smí používat tuto funkci." + delete_note_title: "Smazat poznámku '%{id}'" + deleted_note: "Smazat poznámku '%{id}'" + edit_item_title: "Upravit položku" + in_project: "V:" + no_notes_available: "Žádné poznámky: p?idejte poznámky ze stránek jednotlivých projekt?." + note_header: "Poznámka %{id}" + note_link_title: "Zobrazit poznámku %{id}" + note_location_link: "V:" + show_note_title: "Zobrazit poznámku" + number: + currency: + format: + delimiter: "," + format: "%u%n" + precision: 2 + separator: "." + unit: $ + format: + delimiter: "," + precision: 3 + separator: "." + human: + format: + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: Byte + other: Byt? + gb: GB + kb: KB + mb: MB + tb: TB preferences: - open_id_url: "Vaše OpenID URL je" - change_identity_url: "Změna URL identity" - staleness_starts_after: "Zastarání nastává po %{days} dnech" - page_title: "TRACKS::Nastavení" - change_password: "Změna hesla" - token_description: "Pešek (feedy a použití API)" - title: "Vaše nastavení" - is_false: ne - show_number_completed: "Zobrazit %{number} hotových položek" - password_changed: "Heslo bylo změněno. Prosím znovu se přihlašte." - edit_preferences: "Editace nastavení" - page_title_edit: "TRACKS::Editace nastavení" - is_true: ano - sms_context_none: "žádný" - generate_new_token: "Generovat nového peška" - token_header: "Váš pešek" authentication_header: "Vaše autentizace" - updated: "Nastavení bylo uloženo" + change_authentication_type: "Zm?na typu autentizace" + change_identity_url: "Zm?na URL identity" + change_password: "Zm?na hesla" current_authentication_type: "Používáte autentizaci %{auth_type}" - change_authentication_type: "Změna typu autentizace" - generate_new_token_confirm: "Opravdu? Nový pešek nahradí ten původní a způsobí nefunkčnost ve všech aplikacích, kde jej používáte." + edit_preferences: "Editace nastavení" + generate_new_token: "Generovat nového peška" + generate_new_token_confirm: "Opravdu? Nový pešek nahradí ten p?vodní a zp?sobí nefunk?nost ve všech aplikacích, kde jej používáte." + is_false: ne + is_true: ano + open_id_url: "Vaše OpenID URL je" + page_title: "TRACKS::Nastavení" + page_title_edit: "TRACKS::Editace nastavení" + password_changed: "Heslo bylo zm?n?no. Prosím znovu se p?ihlašte." + show_number_completed: "Zobrazit %{number} hotových položek" + sms_context_none: žádný + staleness_starts_after: "Zastarání nastává po %{days} dnech" tabs: authentication: Autentizace - tracks_behavior: "Chování Tracks" + date_and_time: "Datum a ?as" profile: Profil - date_and_time: "Datum a čas" + tracks_behavior: "Chování Tracks" + title: "Vaše nastavení" + token_description: "Pešek (feedy a použití API)" + token_header: "Váš pešek" + updated: "Nastavení bylo uloženo" + projects: + actions_in_project_title: "Úkoly v tomto projetku" + active_projects: "Aktivní projekty" + add_note: "Nová poznámka" + add_note_submit: "Nová poznámka" + add_project: "P?idat projekt" + all_completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" + completed_actions: "Hotové úkoly tohoto projektu" + completed_actions_empty: "V tomto projektu nejsou žádné hotové úkoly" + completed_projects: "Hotové projetky" + completed_tasks_title: "TRACKS::Hotové úkoly projektu '%{project_name}'" + default_context: "Výchozí kontext pro tento projekt je %{context}" + default_context_removed: "Výchozí kontext byl odstran?n" + default_context_set: "Výchozí kontext %{default_context} byl nastaven" + default_tags_removed_notice: "Výchozí štítky byly odstran?ny" + deferred_actions: "Odložené úkoly projektu" + deferred_actions_empty: "Žádné odložené úkoly" + delete_project: "Smazat projekt" + delete_project_confirmation: "Opravdu chcete smazat projekt '%{name}'?" + delete_project_title: "Smaže projekt" + edit_project_settings: "Upravit vlastnosti projektu" + edit_project_title: "Upravit projekt" + hidden_projects: "Skryté projekty" + hide_form: "Skrýt formulá?" + hide_form_title: "Schovat formulá? založení projektu" + is_active: "je aktivní" + list_completed_projects: "TRACKS::Hotové projekty" + list_projects: "TRACKS::Projekty" + list_reviews: "TRACKS::Revize" + no_actions_in_project: "Žádné aktivní úkoly" + no_default_context: "Tento projekt nemá výchozí kontext" + no_last_completed_projects: "Žádné hotové projekty" + no_last_completed_recurring_todos: "Žádné hotové opakované úkoly" + no_notes_attached: "Žádné poznámky" + no_projects: "Žádné projekty" + notes: Poznámky + notes_empty: "Žádné poznámky" + page_title: "TRACKS::Projekt: %{project}" + project_saved_status: "Projekt byl uložen" + project_state: "Projekt je %{state}." + set_default_tags_notice: "Nastavit výchozí šítky úkol? v tomto projektu %{default_tags}" + settings: Nastavení + show_form: "Nový projekt" + show_form_title: "Nový projekt" + state: "Tento projekt je %{state}" + status_project_name_changed: "Jméno projektu bylo zm?n?no" + this_project: "Tento projekt" + to_new_project_page: "p?ejít k novému projektu" + todos_append: "v tomto projektu" + was_marked_complete: "byl ozna?en jako hotový" + was_marked_hidden: "byl ozna?en jako skrytý" + with_default_context: "s výchozím kontextem '%{context_name}'" + with_default_tags: "a s '%{tags}' jako výchozí štítky" + with_no_default_context: "bez výchozího kontextu" + with_no_default_tags: "a nemá žádné výchozí zna?ky" + search: + contexts_matching_query: "Nalezené kontexty" + no_results: "Na váš dotaz nebylo nic nalezeno." + notes_matching_query: "Nalezené poznámky" + projects_matching_query: "Nalezené projekty" + tags_matching_query: "Nalezené štítky" + todos_matching_query: "Nalezené úkoly" + shared: + add_action: "P?idat úkol" + add_actions: "P?idat úkoly" + add_context: "P?idejte kontext" + context_for_all_actions: "Kontext (pro všechny)" + hide_action_form_title: "Skrýt formulá? pro založení nového úkolu" + hide_form: "Schovat formulá?" + make_actions_dependent: "Akce budou vzájemn? závislé" + multiple_next_actions: "Úkoly (jeden na každém ?ádku)" + project_for_all_actions: "Projekt (pro všechny)" + separate_tags_with_commas: "odd?lené ?árkami" + tags_for_all_actions: "Zna?ky (odd?lené ?árkami)" + toggle_multi: "P?idat více úkol?" + toggle_multi_title: "P?epnout formulá? zakládání jedoho/více úkol?" + toggle_single: "P?idat úkol" + toggle_single_title: "P?idat jeden nový úkol" + sidebar: + list_empty: Nic + list_name_active_contexts: "Aktivní kontexty" + list_name_active_projects: "Aktivní projekty" + list_name_completed_projects: "Hotové projekty" + list_name_hidden_contexts: "Skryté kontexty" + list_name_hidden_projects: "Skryté projekty" + states: + active: Aktivní + active_plural: Aktivní + blocked: Blokovaný + blocked_plural: Blokované + completed: Hotový + completed_plural: Hotové + current: Aktuální + current_plural: Aktuální + hidden: Skrytý + hidden_plural: Skryté + review: Nerevidovaný + review_plural: Nerevidované + stalled: Opušt?ný + stalled_plural: Opušt?né + visible: Viditelný + visible_plural: Viditelné + stats: + action_completion_time_title: "?as dokon?ení (všechny hotové úkoly)" + action_selection_title: "TRACKS::výb?r úkol?" + actions: Úkoly + actions_30days_title: "Úkoly za posledních 30 dní" + actions_actions_avg_created_30days: "Za posledních 30 dní bylo vytvo?eno pr?m?rn? %{count} úkol?" + actions_avg_completed: "a uzav?eno pr?m?rn? %{count} úkol? za m?síc." + actions_avg_completed_30days: "a dokon?eno pr?m?rn? %{count} úkol? za den." + actions_avg_completion_time: "Pro všechny vaše hotové úkoly je pr?m?rný ?as dokon?ení %{count} dní." + actions_avg_created: "Za posledních 12 m?síc? bylo vytvo?eno pr?m?rn? %{count} úkol?" + actions_day_of_week_legend: + day_of_week: "Den v týdnu" + number_of_actions: "Po?et akcí" + actions_day_of_week_title: "Den v týdnu (všechny úkoly)" + actions_dow_30days_legend: + day_of_week: "Den v týdnu" + number_of_actions: "Po?et akcí" + actions_dow_30days_title: "Dny v týdnu (posleních 30 dní)" + actions_further: " a dále" + actions_last_year: "Úkoly v posledním roce" + actions_last_year_legend: + months_ago: "m?síc? zp?t" + number_of_actions: "Po?et úklol?" + actions_lastyear_title: "Úkoly za posledních 12 m?síc?" + actions_min_completion_time: "Minimální ?as k dokon?ení je %{time}." + actions_min_max_completion_days: "Maximum/minimum dní na dokon?ení je %{min}/%{max}." + actions_selected_from_week: "Úkoly vybrané z týdne " + click_to_return: "Klepn?te %{link} pro návrat ke statistikám." + click_to_return_link: zde + click_to_show_actions_from_week: "Klepn?te %{link} pro zobrazení úkol? z týdne %{week} a dalších." + click_to_update_actions: "Klepn?te na sloupec v grafu pro zobrazení detail? níže." + contexts: Kontexty + current_running_time_of_incomplete_visible_actions: "Aktuální ?as b?hu nedokon?ených viditelných úkol?" + index_title: "TRACKS::Statistika" + labels: + avg_completed: "pr?m?rn? uzav?eno" + avg_created: "pr?m?rn? vytvo?eno" + completed: Completed + created: Vytvo?eno + month_avg_completed: "%{months} m?sí?ní pr?m?r hotových" + month_avg_created: "%{months} m?sí?ní pr?m?r vytvo?ených" + legend: + actions: Úkoly + day_of_week: "Den v týdnu" + months_ago: "m?síc? zp?t" + number_of_actions: "Po?et úkol?" + number_of_days: "P?ed kolika dny" + percentage: Podíl + running_time: "?as k dokon?ení úkolu (týdny)" + more_stats_will_appear: "Další statistiky se zobrazí až p?ibyde více úkol?." + no_actions_selected: "Nejsou vybrány žádné úkoly." + no_tags_available: "žádné štítky nejsou definovány" + open_per_week: "Aktivní (viditelné i skryté) další akce za týden" + open_per_week_legend: + actions: Akcí + weeks: Týdny + other_actions_label: (ostatní) + projects: Projekty + running_time_all: "Aktuální ?as b?hu všech nehotových úkol?" + running_time_all_legend: + actions: Úkoly + percentage: Podíl + running_time: "?as b?hu úkol? (týdny). Klepn?te na sloupec pro další info" + running_time_legend: + actions: Úkoly + percentage: Podíl + weeks: "?as b?hu úkolu (týdny). Klepn?te na sloupec pro další info" + spread_of_actions_for_all_context: "Distribuce všech úkol? do kontext?" + spread_of_running_actions_for_visible_contexts: "Distribuce b?žících úkol? do viditelných kontext?" + tag_cloud_90days_description: "Tento mrak zahrnuje štítky úkol?, které byly vytvo?eny nebo dokon?eny v posledních 90-ti dnech." + tag_cloud_90days_title: "Zna?ky úkol? z posledních 90-ti dní" + tag_cloud_description: "Tento mrak zahrnuje štítky všech úkol? (hotových, nehotových, viditelných i skrytých)" + tag_cloud_title: "Mrak štítk? pro všechny úkly" + tags: Štítky + time_of_day: "Denní doba (všechny úkoly)" + time_of_day_legend: + number_of_actions: "Po?et úkol?" + time_of_day: "Denní doba" + tod30: "Denní doba (posledních 30 dní)" + tod30_legend: + number_of_actions: "Po?et úkol?" + time_of_day: "Denní doba" + top10_longrunning: "10 nejdéle b?žících projekt?" + top10_projects: "Top 10 projekt?" + top10_projects_30days: "Top 10 projekt? za posledních 30 dní" + top5_contexts: "Top 5 kontext?" + top5_visible_contexts_with_incomplete_actions: "Top 5 viditelných kontext? s nehotovými úkoly" + totals: Celkem + totals_action_count: "máte celkem %{count} úkol?" + totals_actions_completed: "%{count} z nich je hotových." + totals_active_project_count: "Znich %{count} je aktivních projek?" + totals_blocked_actions: "%{count} je závislých na dokon?ení jiných akcí." + totals_completed_project_count: "a %{count} je hotových projekt?." + totals_context_count: "Máte %{count} kontext?." + totals_deferred_actions: "z nichž %{count} jsou odložené úkoly v Ticlkeru" + totals_first_action: "Od vašeho prvního úkolu %{date}" + totals_hidden_context_count: "a %{count} skrytých kontext?." + totals_hidden_project_count: "%{count} je skrytých" + totals_incomplete_actions: "Máte %{count} nehotových úkol?" + totals_project_count: "Máte %{count} projekt?." + totals_tag_count: "Na akcích je umíst?no %{count} štítk?." + totals_unique_tags: "Z t?chto štítk? je %{count} unikátních." + totals_visible_context_count: "Z nich je %{count} viditelných kontext?" + within_one: "V rámci 1." + support: + array: + last_word_connector: ", a " + two_words_connector: " a " + words_connector: ", " + select: + prompt: "Prosím vyberte" time: am: am formats: - stats: "%a %d-%m" default: "%a, %d %b %Y %H:%M:%S %z" - time: "" - short: "%d %b %H:%M" - month_day: "%B %d" long: "%B %d, %Y %H:%M" + month_day: "%B %d" + short: "%d %b %H:%M" + stats: "%a %d-%m" pm: pm - date: - month_names: - - - - Leden - - "Únor" - - "Březen" - - Duben - - "Květen" - - "Červen" - - "Červenec" - - Srpen - - "Září" - - "Říjen" - - Listopad - - Prosinec - abbr_day_names: - - Ne - - Po - - "Út" - - St - - "Čt" - - "Pá" - - So - order: - - :rok - - ":měsíc" - - :den - formats: - only_day: "" - longer: "%A %B %d, %Y" - default: "%Y-%m-%d" - short: "%b %d" - month_day: "" - long: "%B %d, %Y" - day_names: - - "Neděle" - - "Ponělí" - - "Úterý" - - "Středa" - - "Čtvrtek" - - "Pátek" - - Sobota - abbr_month_names: - - - - Led - - "Úno" - - "Bře" - - Dub - - "Kvě" - - "Čer" - - "Čec" - - Srp - - "Zář" - - "Říj" - - Lis - - Pro + todos: + action_deferred: "Úkol '%{description}' byl oldožen" + action_deleted_error: "Nepoda?ilo se smazat úkol" + action_deleted_success: "Úkol byl úsp?šn? smazán" + action_due_on: "(úkol plánován na %{date})" + action_marked_complete: "Úkol '%{description}' byl ozna?en jako %{completed}" + action_marked_complete_error: "Úkol '%{description}' NEBYL ozna?en jako %{completed} kv?li chyb? na serveru." + action_saved: "Úkol uložen" + action_saved_to_tickler: "Úkol byl uložen do Tickleru" + add_another_dependency: "P?idat další závislost" + add_new_recurring: "Vytvo?it opakovaný úkol" + added_dependency: "P?idáno %{dependency} jako závislost." + added_new_context: "P?idán nový kontext" + added_new_next_action: "P?idán nový úkol" + added_new_next_action_plural: "Úkoly byly p?idány" + added_new_next_action_singular: "P?idán nový úkol" + added_new_project: "P?idán nový projekt" + all_completed: "Všechny hotové úkoly" + all_completed_here: zde + all_completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem %{tag_name}" + append_in_this_project: "v tomto projektu" + archived_tasks_title: "TRACKS::Archiv hotových úkol?" + blocked_by: "?eká na %{predecessors}" + calendar: + due_next_month_and_later: "Plánováno na %{month} a dále" + due_next_week: "Plánované p?íští týden" + due_this_month: "Plánováno na %{month}" + due_this_week: "Plánované ve zbytku týdne" + due_today: "Plánované dnes" + get_in_ical_format: "Kalendá? ve formátu iCal" + no_actions_due_after_this_month: "Na p?íští m?síc a dále nejsou plánované žádné úkoly" + no_actions_due_next_week: "Na p?íští týden nejsou plánované žádné úkoly" + no_actions_due_this_month: "Na zbytek tohoto m?síce nejsou žádné úkoly" + no_actions_due_today: "Na dnešek nejsou plánované žádné úkoly" + calendar_page_title: "TRACKS::Kalendá?" + cannot_add_dependency_to_completed_todo: "Nelze p?idat úkol jako závislost k hotovému úkolu!" + clear_due_date: "Smazat plánované datum úkolu" + clear_show_from_date: "Odstranit datum zobrazení" + completed: Hotovo + completed_actions: "Hotové úkoly" + completed_actions_with: "Hotové úkoly se štítkem '%{tag_name}'" + completed_in_archive: + one: "V archivu je hotový úkol." + other: "V archivu je %{count} hotových úkol?." + completed_last_day: "Ukon?ené v posledních 24 hodinách" + completed_last_x_days: "Uzav?ené za posledních %{count} dní" + completed_recurrence_completed: "Bylo smazáno poslední opakování opakovaného úkolu. Opakování dokon?eno" + completed_recurring: "Hotové opakované úkoly" + completed_rest_of_month: "Ukon?ené ve zbytku tohoto m?síce" + completed_rest_of_previous_month: "Uzav?eno ve zbytku minulého m?síce" + completed_rest_of_week: "Dokon?ené ve zbytku týdne" + completed_tagged_page_title: "TRACKS::Hotové úkoly se štítkem '%{tag_name}'" + completed_tasks_title: "TRACKS::Hotové úkoly" + completed_today: "Dokon?ené dnes" + confirm_delete: "Opravdu chcete smazat úkol '%{description}'?" + context_changed: "Kontext byl zm?n?n na %{name}" + convert_to_project: "Vytvo?it projekt" + defer_date_after_due_date: "Datum zobrazení je až po plánovaném datu úkolu. Upravte datum úkolu p?ed dalším pokusem o odpložení zobrazení." + defer_x_days: + one: "Ukázat zítra" + other: "Ukázat za %{count} dní" + deferred_actions_with: "Odložené úkoly se štítkem '%{tag_name}'" + deferred_pending_actions: "Odložené/?ekající úkoly" + deferred_tasks_title: "TRACKS::Tickler" + delete: Smazat + delete_action: "Smazat úkol" + delete_recurring_action_confirm: "Opravdu chcete smazat opakovaný úkol '%{description}'?" + delete_recurring_action_title: "Smazat opakovaný úkol" + deleted_success: "Úkol byl úsp?šn? smazán." + depends_on: "Závisí na" + depends_on_separate_with_commas: "Závisí na (odd?leno ?árkami)" + done: Hotovo? + drag_action_title: "P?etáhnout na jiný úkol pro vytvo?ení závislosti" + due: "Plánováno na" + edit: Upravit + edit_action: "Upravit úkol" + edit_action_with_description: "Upravit úkol '%{description}'" + edit_recurring_todo: "Upravit opakovaný úkol" + error_completing_todo: "Nepoda?ilo se ukon?it / aktivovat opakovaný úkol %{description}" + error_deleting_item: "Nepoda?ilo se smazat položku %{description}" + error_deleting_recurring: "Nepoda?ilo se smazat opakovaný úkol \\'%{description}\\'" + error_removing_dependency: "Nepoda?ilo se odstranit závislost" + error_saving_recurring: "Nepoda?ilo se uložit opakovaný úkol \\'%{description}\\'" + error_starring: "Nepoda?ilo se ozna?it úkol hv?zdi?kou '%{description}'" + error_starring_recurring: "Nebylo možno ohv?zdi?kovat opakovaný úkol \\'%{description}\\'" + error_toggle_complete: "Nepoda?ilo se ozna?it úkol jako hotový" + feed_title_in_context: "v kontextu '%{context}'" + feed_title_in_project: "v projektu '%{project}'" + feeds: + completed: "Hotové: %{date}" + due: "Plánováno na: %{date}" + has_x_pending: + one: "Jeden ?ekající úkol" + other: "%{count} ?ekajících úkol?" + hidden_actions: "Skryté úkoly" + in_hidden_state: (skrytý) + in_pending_state: "ve stavu ?ekající" + list_incomplete_next_actions: "Zabrazí nehotové úkoly" + list_incomplete_next_actions_with_limit: "Zobrazuje posledních %{count} nedokon?ených úkol?" + mobile_todos_page_title: "Všechny úkoly" + new_related_todo_created: "Byl vytvo?en nový úkol pat?ící do tohoto opakovaného úkolu" + new_related_todo_created_short: "vytvo?en nový úkol" + new_related_todo_not_created_short: "úkol nebyl vytvo?en" + next_action_description: "Popis úkolu" + next_action_needed: "Je pot?eba zadat aspo? jeden úkol" + next_actions_description: "Filtr:" + next_actions_description_additions: + completed: "v posledních %{count} dnech" + due_date: "plánovano na %{due_date} nebo d?íve" + next_actions_due_date: + due_in_x_days: "Za %{days} dní" + due_today: Dnes + due_tomorrow: Zítra + overdue_by: "Prošlé %{days} den" + overdue_by_plural: "Prošlé %{days} dní" + next_actions_title: "Tracks - Úkoly" + next_actions_title_additions: + completed: "hotové úkoly" + due_today: dnes + due_within_a_week: "b?hem týdne" + no_actions_due_this_week: "Žádné úkoly plánovány na tento týden" + no_actions_found: "Žádné b?žící úkoly." + no_actions_found_title: "Nenalezeny žádné úkoly" + no_actions_with: "Žádné úkoly se štítkem '%{tag_name}'" + no_completed_actions: "Žádné hotové úkoly." + no_completed_actions_with: "Žádné hotové úkoly se štítkem '%{tag_name}'" + no_completed_recurring: "Žádné hotové opakované úkoly" + no_deferred_actions: "Žádné odložené úkoly." + no_deferred_actions_with: "Žádné odložené úkoly se štítkem '%{tag_name}'" + no_deferred_pending_actions: "Žádné odložené ani ?ekající úkoly" + no_hidden_actions: "Žádné skryté úkoly" + no_incomplete_actions: "Žádné nehotové úkoly" + no_last_completed_actions: "Žádné hotové úkoly" + no_project: "--Žádný projekt--" + no_recurring_todos: "Žádné opakované úkoly" + overdue: "Spožd?né úkoly" + pending: "?ekající" + recurrence: + daily: Denn? + daily_every_number_day: "Každých %{number} dní" + daily_options: "Nastavení pro denní opakované úkoly" + day_x_on_every_x_month: "%{day}. den každý %{month}. m?síc" + ends_on: Kon?í + ends_on_date: "Kon?í %{date}" + ends_on_number_times: "Kon?í po %{number} opakováních" + every_work_day: "Každý pracovní den" + from_tickler: "datum kdy úkol vypadne z Tickleru (není nastaveno plánované datum)" + monthly: M?sí?n? + monthly_every_xth_day: "%{day} %{day_of_week} každý %{month}. m?síc" + monthly_options: "Nastavení pro m?sí?ní opakované úkoly" + no_end_date: Nikdy + pattern: + day_names: + - ned?le + - pond?lí + - úterý + - st?eda + - "?tvrtek" + - pátek + - sobota + due: "plánováno na" + every_day: "každý den" + every_month: "každý m?síc" + every_n: "každé %{n}" + every_xth_day_of_every_n_months: "každý %{x} %{day} každých %{n_months}" + every_year_on: "každý rok %{date}" + first: první + fourth: "?tvrtý" + from: od + last: poslední + month_names: + - ~ + - Leden + - Únor + - B?ezen + - Duben + - Kv?ten + - "?erven" + - "?ervenec" + - Srpen + - Zá?í + - "?íjen" + - Listopad + - Prosinec + on_day_n: "%{n}. den" + on_work_days: "v pracovní dny" + second: druhý + show: ukázat + the_xth_day_of_month: "%{x} %{day} m?síce %{month}" + third: t?etí + times: "(%{number} opakování)" + until: do + weekly: "každý týden" + recurrence_on_due_date: "datum na které je úkol plánován" + recurrence_on_options: "Nastavit opakování na" + show_days_before: "%{days} dní p?ed plánovaným datem" + show_option_always: stále + show_options: "Úkázat úkol" + starts_on: Za?íná + weekly: Týdn? + weekly_every_number_week: "Každých %{number} týdn?" + weekly_options: "Nastavení pro týdenní opakované úkoly" + yearly: Ro?n? + yearly_every_x_day: "Každý %{month} %{day}" + yearly_every_xth_day: "%{day} %{day_of_week} m?síce %{month}" + yearly_options: "Nastavení pro ro?ní opakované úkoly" + recurrence_completed: "Poslední opakování úkolu bylo ozna?eno jako hotové. Opakovaný úkol je dokon?ený" + recurrence_period: "Interval opakování" + recurring_action_deleted: "Úkol byl smazán. Protože jde o opakovaný úkol, byl vložen nový úkol" + recurring_action_saved: "Opakovaný úkol byl uložen" + recurring_actions_title: "TRACKS::Opakované úkoly" + recurring_deleted_success: "Opakovaný úkol byl úsp?šn? smazán." + recurring_pattern_removed: "Vzor opakování byl odstran?n z %{count}" + recurring_todos: "Opakované úkoly" + remove_dependency: "Odstranit závislost (nesmaže úkol)" + removed_predecessor: "Byl odstran?n %{successor} jako závislost pro %{predecessor}." + scheduled_overdue: "Naplánováno zobrazení p?ed %{days} dny" + see_all_completed: "M?žete vid?t všechny dokon?ené akce %{link}" + set_to_pending: "%{task} nastaven jako ?ekající" + show_from: "Zobrazovat od" + show_in_days: "Zobrazit za %{days} dní" + show_on_date: "Ukázat %{date}" + show_today: "Zobrazit Dnes" + show_tomorrow: "Zobrazit zítra" + star_action: "Ozna?it hv?zdi?kou" + star_action_with_description: "ohv?zdi?kovat úkol '%{description}'" + tagged_page_title: "TRACKS::Se štítkem '%{tag_name}'" + tagged_with: "ozna?eno štítkem ‘%{tag_name}’" + tags: "Štítky (odd?lené ?árkami)" + task_list_title: "TRACKS::Úkoly" + tickler_items_due: + one: "Jeden úkol v Tickleru je plánován dnes - obnovte stránku pro zobrazení." + other: "%{count} položek v Tickleru je plánováno na dnes tickler items are now due - obnovte stránku pro zobrazení." + to_tickler: "do Tickleru" + unable_to_add_dependency: "Nepoda?ilo se p?idat závislost" + unresolved_dependency: "Hodnota v poli 'závisí na' neodpovídá žádnému existujícímu úkolu. Hodnota bude ignorována. Pokra?ovat?" + was_due_on_date: "bylo plánováno na %{date}" + users: + account_signup: "Registrace uživatele" + auth_change_submit: "Zm?nit zp?sob p?ihlašování" + auth_type_update_error: "Nepoda?ilo se zm?nit typ autentizace: %{error_messages}" + auth_type_updated: "Typ autentizace byl zm?n?n." + change_auth_type_title: "TRACKS::Zm?na z?sobu autentizace" + change_authentication_type: "Zm?na zp?sobu p?ihlašování" + change_password_prompt: "Pro zm?nu hesla zadejte nové hestlo do polí níže a stiskn?te 'Zm?na hesla'." + change_password_submit: "Zm?nit heslo" + change_password_title: "TRACKS::Zm?na hesla" + choose_password: "Zvolte heslo" + confirm_password: "Potvrzení hesla" + desired_login: "Uživatelské jméno" + destroy_confirmation: "Varování: tato akce smaže uživatele '%{login}', všechny jeho úkoly, kontexty, projekty i poznámky. Opravdu chcete pokra?ovat?" + destroy_error: "Nepoda?ilo se smazat uživatele %{login}" + destroy_successful: "Uživatel %{login} byl úsp?šn? zni?en" + destroy_user: "Zni?it uživatele" + failed_to_delete_user: "Nepoda?ilo se smazat uživatele %{username}" + first_user_heading: "Vítejte v TRACKS. Nejd?íve je nutné vytvo?it administrátorský ú?et:" + identity_url: "URL identity" + label_auth_type: "Zp?sob autentizace" + manage_users: "Správa uživatel?" + new_password_label: "Nové heslo" + new_token_generated: "Nový pešek byl úsp?šn? vygenerován" + new_user_heading: "Registrace nového uživatele:" + new_user_title: "TRACKS::P?ihlášení jako administrátor" + no_signups_title: "TRACKS::Registrace není povolena" + openid_ok_pref_failed: "Vaše identitní URL %{url} bylo úsp?šn? ov??eno, ale došlo k problému p?i ukládání nastavení." + openid_url_verified: "Identitní url %{url} bylo úsp?šn? ov??eno a nastavena autentizace pomocí OpenID." + password_confirmation_label: "Potvrzení hesla" + password_updated: "Heslo bylo zm?n?no." + register_with_cas: "S vaším uživatelským jménem z CASu" + select_authentication_type: "Vyberte nový zp?sob autentizace a stiskn?te 'Zm?nit zp?sob p?ihlašování'." + signup: Registrace + signup_new_user: "Registrace nového uživatele" + signup_successful: "Registrace uživatele %{username} byla úsp?šná." + successfully_deleted_user: "Uživatel %{username} byl úsp?šn? smazán" + total_actions: "Úkol? celkem" + total_contexts: "Kontext? celkem" + total_notes: "Poznámek celkem" + total_projects: "Projekt? celkem" + total_users_count: "Máte celkem %{count} uživatel?" + user_created: "Uživatel byl vytvo?en." + you_have_to_reset_your_password: "Je nutné zm?nit heslo" will_paginate: - previous_label: "« předchozí" + next_label: "další »" page_entries_info: - multi_page: Zobrazuji %{model} %{from} - %{to} o %{count} celkem + multi_page: "Zobrazuji %{model} %{from} - %{to} o %{count} celkem" + multi_page_html: "Zobrazuji %{model} %{from} - %{to} of %{count} celkem" + single_page: + one: "Zobrazuji 1 %{model}" + other: "Zobrazení všech %{count} %{model}" + zero: "Žádné %{model} nalézt" single_page_html: one: "Zobrazení 1 %{model}" other: "Zobrazení vše %{count} %{model}" zero: "Žádné %{model} nalézt" - single_page: - one: Zobrazuji 1 %{model} - other: "Zobrazení všech %{count} %{model}" - zero: "Žádné %{model} nalézt" - multi_page_html: Zobrazuji %{model} %{from} - %{to} of %{count} celkem page_gap: "…" - next_label: "další »" - support: - array: - words_connector: ", " - last_word_connector: ", a " - two_words_connector: " a " - select: - prompt: "Prosím vyberte" - footer: - send_feedback: "Poslat zpětnou vazbu na %{version}" - shared: - multiple_next_actions: "Úkoly (jeden na každém řádku)" - make_actions_dependent: "Akce budou vzájemně závislé" - toggle_single: "Přidat úkol" - hide_form: "Schovat formulář" - add_actions: "Přidat úkoly" - add_action: "Přidat úkol" - tags_for_all_actions: "Značky (oddělené čárkami)" - toggle_single_title: "Přidat jeden nový úkol" - project_for_all_actions: "Projekt (pro všechny)" - context_for_all_actions: "Kontext (pro všechny)" - toggle_multi: "Přidat více úkolů" - separate_tags_with_commas: "oddělené čárkami" - add_context: "Přidejte kontext" - toggle_multi_title: "Přepnout formulář zakládání jedoho/více úkolů" - hide_action_form_title: "Skrýt formulář pro založení nového úkolu" - feedlist: - choose_context: "Vyberte kontext jehož feed si přejete" - actions_due_today: "Akce plánované na dnes" - ical_feed: iCal feed - legend: "Legenda:" - all_contexts: "Všechny kontexty" - rss_feed: RSS Feed - choose_project: "Vyberte projekt jehož feed si přejete" - all_projects: "Všechny projekty" - project_needed: "Musíte nejdříve založit aspoň jeden projekt" - select_feed_for_project: Vyberte feed pro tento projekt - active_projects_wo_next: "Aktivni projekty bez úkolů" - active_starred_actions: "Všechny aktivní úkoly s hvězdičkou" - context_needed: "Musíte nejdříve založit aspoň jeden kontext" - select_feed_for_context: Select the feed for this context - projects_and_actions: "Aktivní projekty a jejich úkoly" - notice_incomplete_only: "Poznámka: všechny feedy obsahují jen nehotové úkoly." - actions_due_next_week: "Úkoly plánované na příštích sedm dní" - actions_completed_last_week: "Úkoly dokončené v posledních sedmi dnech" - context_centric_actions: "Feedy s aktivními úkoly podle kontextů" - plain_text_feed: "Prostý text" - last_fixed_number: "Posledních %{number} úkolů" - all_actions: "Všechny úkoly" - project_centric: "Feedy s aktivními úkoly podle projektu" - sidebar: - list_name_active_contexts: "Aktivní kontexty" - list_name_active_projects: "Aktivní projekty" - list_empty: Nic - list_name_completed_projects: "Hotové projekty" - list_name_hidden_projects: "Skryté projekty" - list_name_hidden_contexts: "Skryté kontexty" - users: - openid_url_verified: "Identitní url %{url} bylo úspěšně ověřeno a nastavena autentizace pomocí OpenID." - auth_type_update_error: "Nepodařilo se změnit typ autentizace: %{error_messages}" - failed_to_delete_user: "Nepodařilo se smazat uživatele %{username}" - destroy_successful: "Uživatel %{login} byl úspěšně zničen" - first_user_heading: "Vítejte v TRACKS. Nejdříve je nutné vytvořit administrátorský účet:" - total_contexts: "Kontextů celkem" - successfully_deleted_user: "Uživatel %{username} byl úspěšně smazán" - signup_successful: "Registrace uživatele %{username} byla úspěšná." - new_token_generated: "Nový pešek byl úspěšně vygenerován" - total_projects: "Projektů celkem" - change_password_submit: "Změnit heslo" - no_signups_title: "TRACKS::Registrace není povolena" - user_created: "Uživatel byl vytvořen." - account_signup: "Registrace uživatele" - manage_users: "Správa uživatelů" - password_updated: "Heslo bylo změněno." - auth_type_updated: "Typ autentizace byl změněn." - total_actions: "Úkolů celkem" - desired_login: "Uživatelské jméno" - signup: Registrace - confirm_password: "Potvrzení hesla" - new_user_heading: "Registrace nového uživatele:" - password_confirmation_label: "Potvrzení hesla" - destroy_error: "Nepodařilo se smazat uživatele %{login}" - choose_password: Zvolte heslo - change_password_title: "TRACKS::Změna hesla" - change_auth_type_title: "TRACKS::Změna zůsobu autentizace" - change_password_prompt: "Pro změnu hesla zadejte nové hestlo do polí níže a stiskněte 'Změna hesla'." - new_password_label: "Nové heslo" - register_with_cas: "S vaším uživatelským jménem z CASu" - label_auth_type: "Způsob autentizace" - total_users_count: "Máte celkem %{count} uživatelů" - new_user_title: "TRACKS::Přihlášení jako administrátor" - destroy_user: "Zničit uživatele" - destroy_confirmation: "Varování: tato akce smaže uživatele '%{login}', všechny jeho úkoly, kontexty, projekty i poznámky. Opravdu chcete pokračovat?" - you_have_to_reset_your_password: "Je nutné změnit heslo" - signup_new_user: "Registrace nového uživatele" - identity_url: URL identity - openid_ok_pref_failed: "Vaše identitní URL %{url} bylo úspěšně ověřeno, ale došlo k problému při ukládání nastavení." - auth_change_submit: "Změnit způsob přihlašování" - change_authentication_type: "Změna způsobu přihlašování" - total_notes: "Poznámek celkem" - select_authentication_type: "Vyberte nový způsob autentizace a stiskněte 'Změnit způsob přihlašování'." - contexts: - delete_context_title: Smazat kontext - all_completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" - hide_form: "Schovat formulář" - show_form_title: "Nový kontext" - delete_context_confirmation: "Opravdu chcete smazat kontext '%{name}'? Dojde ke smazání všech (opakovaných) úkolů z daného kontextu!" - todos_append: "v této souvislosti" - delete_context: Smazat kontext - edit_context: Upravit kontext - hide_form_title: "Schovat formulář" - hidden_contexts: Schovat kontexty - no_contexts_active: "Žádné aktivní kontexty" - context_hide: "Schovat z úvodní stránky?" - add_context: "Vytvořit kontext" - show_form: "Nový kontext" - save_status_message: "Kontext uložen" - visible_contexts: "Viditelné kontexty" - update_status_message: "Název kontextu byl změněn" - context_name: "Náev kontextu" - status_active: "Kontext je aktivní" - completed_tasks_title: "TRACKS::Hotové úkoly v kontextu '%{context_name}'" - new_context_post: "' bude také vytvořen. Opravdu?" - new_context_pre: "Nový kontext '" - no_actions: "Žádné aktivní úkoly v tomto kontextu" - last_completed_in_context: "v tomto kontextu (posledních %{number})" - context_deleted: "Kontext byl odstraněn '%{name}'" - no_contexts_hidden: "Žádné skryté kontexty" - status_hidden: "kontext je skrytý" - login: - openid_identity_url_not_found: "Je nám líto, neexistuje uživatel s touto identitou (%{identity_url})" - user_no_expiry: "Neodhlšovat" - sign_in: "Přihlásit se" - login_cas: "přejít na CAS" - cas_no_user_found: "Nazdar, %{username}! Nemáte účet na Tracks." - cas_login: "Přihlášení přes CAS" - successful_with_session_info: "Přihlášení bylo úspěšné:" - please_login: "Pro pokračování se prosím přihlšte do Tracks" - cas_logged_in_greeting: "Zdravíčko, %{username}! Byl jste autorizován." - cas_username_not_found: "Bohužel neexistuje uživatel v CASu se jménem (%{username})" - cas_create_account: "Pro vytvoření účtu v CASu prosím pokračujte sem %{signup_link}" - mobile_use_openid: "…nebo přihlášení s OpenID" - cas_signup_link: "Vyžádat účet" - account_login: "Přihlášení uživatele" - successful: "Přihlášení úspěšné. Vítejte zpět!" - session_will_not_expire: "sezení bylo nastaveno jako trvalé." - option_separator: nebo - session_time_out: "Sezení vypršelo. Prosím %{link}" - session_will_expire: "sezen vyprší za %{hours} hodin neaktivity." - login_standard: "vraťte se ke standardnímu přihlášení" - login_with_openid: "přihlašte se se svým OpenID" - unsuccessful: "Přihlášení bylo úspěšné." - log_in_again: "přihlašte se znovu." - logged_out: You have been logged out of Tracks. - datetime: - prompts: - minute: Minuta - second: Sekunda - month: "Měsíc" - hour: Hodina - day: Den - year: Rok - distance_in_words: - less_than_x_minutes: - one: "méně než minuta" - other: "méně než %{count} minut" - zero: "méně než minuta" - almost_x_years: - one: almost 1 rok - other: skoro %{count} let - x_days: - one: 1 den - other: "%{count} dní" - x_seconds: - one: 1 sekunda - other: "%{count} sekund" - about_x_hours: - one: about 1 hodina - other: "přibližně %{count} hodin" - less_than_x_seconds: - one: "méně než 1 sekunda" - other: "mén než %{count} sekund" - zero: "méně než 1 sekunda" - x_months: - one: "1 měsíc" - other: "%{count} měsíců" - x_minutes: - one: 1 minuta - other: "%{count} minut" - about_x_years: - one: about 1 rok - other: "přibližně %{count} let" - about_x_months: - one: "about 1 měsíc" - other: "přibližně %{count} měsíců" - over_x_years: - one: "přes rok" - other: "přes %{count} let" - half_a_minute: "půl minuty" - search: - contexts_matching_query: "Nalezené kontexty" - tags_matching_query: "Nalezené štítky" - no_results: "Na váš dotaz nebylo nic nalezeno." - todos_matching_query: "Nalezené úkoly" - projects_matching_query: "Nalezené projekty" - notes_matching_query: "Nalezené poznámky" + previous_label: "« p?edchozí" diff --git a/config/locales/de.yml b/config/locales/de.yml index e71de0b1..7cf448f6 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,999 +1,986 @@ --- de: - layouts: - toggle_contexts_title: Kontextanzeige umschalten - toggle_contexts: Kontexte umschalten - toggle_notes: Notizen umschalten - next_actions_rss_feed: RSS-Feed kommende Aufgaben - toggle_notes_title: Alle Notizen umschalten - mobile_navigation: - new_action: Neue Aufgabe - logout: Abmelden - feeds: Feeds - starred: Markiert - projects: Projekte - tickler: Notizbuch - contexts: Kontexte - home: Home - navigation: - manage_users_title: "Benutzer hinzufügen oder entfernen" - recurring_todos: Wiederkehrende Aufgaben - api_docs: REST API Docs - help: "?" - feeds: Feeds - starred: Markiert - stats: Statistiken - notes_title: Alle Notizen anzeigen - manage_users: Benutzer verwalten - tickler_title: Notizbuch - admin: Admin - preferences: Einstellungen - integrations_: Tracks integrieren - export_title: Daten importieren und exportieren - calendar_title: "Kalender mit überfälligen Aufgaben" - feeds_title: "Liste der verfügbaren Feeds anzeigen" - stats_title: Statistiken anzeigen - tickler: Notizbuch - home_title: Start - starred_title: Markierte Aufgaben betrachten - recurring_todos_title: Wiederkehrende Aufgaben verwalten - completed_tasks: Erledigt - view: Betrachten - organize: Organisieren - completed_tasks_title: "Erledigt" - home: Start - export: Export - contexts_title: Kontexte - preferences_title: Meine Einstellungen - search: "Alle Einträge durchsuchen" - review_title: "Überprüfung" - projects_title: Projekte - calendar: Kalender - number: - format: - separator: "," - precision: 2 - delimiter: . - human: - format: - precision: 1 - delimiter: "" - storage_units: - format: "%n %u" - units: - kb: KB - tb: TB - gb: GB - byte: - one: Byte - other: Bytes - mb: MB - percentage: - format: - delimiter: "" - precision: - format: - delimiter: "" - currency: - format: - format: "%n%u" - unit: "€" - separator: . - precision: - delimiter: "," - common: - recurring_todos: Wiederkehrende Aufgaben - back: "Zurück" - actions: Aufgaben - third: Dritte - add: "Hinzufügen" - go_back: "Zurück" - previous: Vorherige - logout: Abmelden - second: Zweite - none: Keine - week: Woche - optional: optional - deferred: aufgeschobene - cancel: Abbrechen - show_all: Alle anzeigen - month: Monat - actions_midsentence: - one: Aufgabe - other: Aufgaben - zero: Aufgaben - forum: Forum - server_error: Auf dem Server ist ein Fehler aufgetreten. - notes: Notizen - projects: Projekte - last: Letzte - review: "Überprüfung" - action: Aufgabe - days_midsentence: - one: Tag - other: Tagen - zero: Tagen - project: Projekt - contribute: Mitwirken - ok: Ok - website: Website - first: Erste - note: - one: 1 Notiz - other: "%{count} Notizen" - zero: keine Notizen - numbered_step: Schritt %{number} - sort: - by_task_count_title: Nach Anzahl der Aufgaben sortieren - by_task_count_title_confirm: Sollen diese Projekte wirklich nach Anzahl der Aufgaben sortiert werden? Die bisherige Sortier-Reihenfolge wird damit überschrieben. - alphabetically: Alphabetisch - sort: Sortieren - alphabetically_title: Projekte alphabetisch sortieren - alphabetically_confirm: Sollen diese Projekte wirklich alphabetisch sortiert werden? Die bisherige Sortier-Reihenfolge wird damit überschrieben. - by_task_count: Nach Anzahl der Aufgaben - create: Erstellen - todo: Aufgabe - months: Monate - description: Beschreibung - errors_with_fields: "Mit folgenden Feldern sind Probleme aufgetreten:" - drag_handle: Verschieben - next: "Nächste" - fourth: Vierte - context: Kontext - contexts: Kontexte - bugs: Bugs - update: Aktualisieren - forth: Vierte - weeks: Woche - wiki: Wiki - email: E-Mail - search: Suchen - ajaxError: Fehler beim Empfangen vom Server - not_available_abbr: n/b - integrations: - opensearch_description: In Tracks suchen - applescript_next_action_prompt: "Beschreibung der nächsten Aufgabe:" - gmail_description: "Gadget, um Tracks als Gadget zu Googlemail hinzuzufügen" - applescript_success_after_id: erstellt - applescript_success_before_id: "Nächste neue Aufgabe mit ID" activerecord: attributes: - project: - name: Name - default_tags: Standard Tags - default_context_name: Standard Kontext - description: Beschreibung note: - created_at: Erstellt am - updated_at: Aktualisiert am - todo: - show_from: Zeige ab dem - predecessors: "Hängt ab von" - notes: Notizen - tags: Tags - project: Projekt - description: Beschreibung - context: Kontext - due: Fällig + created_at: "Erstellt am" + updated_at: "Aktualisiert am" preference: - show_hidden_projects_in_sidebar: Zeige Versteckte Projekte in der Sidebar - show_hidden_contexts_in_sidebar: "Zeige Versteckte Kontexte in der Sidebar" - date_format: Datum Format - sms_context: Standard-E-Mail-Kontext - verbose_action_descriptors: "Ausführliche Aufgabenbeschreibungen" - staleness_starts: Veraltet ab - mobile_todos_per_page: Aufgaben pro Seite (Mobile Version) - show_number_completed: "Zeige Anzahl der erledigten Aufgaben" - title_date_format: Titel Datumsformat - refresh: Aktualisierungsintverall (in Minuten) - week_starts: Woche startet am - last_name: Nachname - due_style: "Fälligkeits-Stil" - locale: Lokalisierung - time_zone: Zeitzone - sms_email: Per E-Mail - show_project_on_todo_done: Zur Projektseite wechseln wenn Aufgabe erledigt - show_completed_projects_in_sidebar: Zeige erledigte Projekte in der Sidebar + date_format: "Datum Format" + due_style: Fälligkeits-Stil first_name: Name - review_period: Projekt-Review-Intervall - user: last_name: Nachname + locale: Lokalisierung + mobile_todos_per_page: "Aufgaben pro Seite (Mobile Version)" + refresh: "Aktualisierungsintverall (in Minuten)" + review_period: Projekt-Review-Intervall + show_completed_projects_in_sidebar: "Zeige erledigte Projekte in der Sidebar" + show_hidden_contexts_in_sidebar: "Zeige Versteckte Kontexte in der Sidebar" + show_hidden_projects_in_sidebar: "Zeige Versteckte Projekte in der Sidebar" + show_number_completed: "Zeige Anzahl der erledigten Aufgaben" + show_project_on_todo_done: "Zur Projektseite wechseln wenn Aufgabe erledigt" + sms_context: Standard-E-Mail-Kontext + sms_email: "Per E-Mail" + staleness_starts: "Veraltet ab" + time_zone: Zeitzone + title_date_format: "Titel Datumsformat" + verbose_action_descriptors: "Ausführliche Aufgabenbeschreibungen" + week_starts: "Woche startet am" + project: + default_context_name: "Standard Kontext" + default_tags: "Standard Tags" + description: Beschreibung + name: Name + todo: + context: Kontext + description: Beschreibung + due: Fällig + notes: Notizen + predecessors: "Hängt ab von" + project: Projekt + show_from: "Zeige ab dem" + tags: Tags + user: first_name: Vorname + last_name: Nachname errors: + full_messages: + format: "%{attribute} %{message}" + messages: + accepted: "muss akzeptiert werden" + blank: "muss ausgefüllt werden" + confirmation: "stimmt nicht mit der Bestätigung überein" + empty: "muss ausgefüllt werden" + equal_to: "muss genau %{count} sein" + even: "muss gerade sein" + exclusion: "ist nicht verfügbar" + greater_than: "muss größer als %{count} sein" + greater_than_or_equal_to: "muss größer oder gleich %{count} sein" + inclusion: "ist kein gültiger Wert" + invalid: "ist nicht gültig" + less_than: "muss kleiner als %{count} sein" + less_than_or_equal_to: "muss kleiner oder gleich %{count} sein" + not_a_number: "ist keine Zahl" + odd: "muss ungerade sein" + taken: "ist bereits vergeben" + 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)" models: project: attributes: name: - blank: Projekt muss einen Namen haben - too_long: Projektname muss weniger als 256 Zeichen haben - taken: Projektname existiert bereits - messages: - record_invalid: "Validierung fehlgeschlagen: %{Fehler}" - greater_than_or_equal_to: "muss größer oder gleich %{count} sein" - confirmation: "stimmt nicht mit der Bestätigung überein" - less_than_or_equal_to: muss kleiner oder gleich %{count} sein - blank: "muss ausgefüllt werden" - exclusion: "ist nicht verfügbar" - invalid: "ist nicht gültig" - odd: muss ungerade sein - even: muss gerade sein - empty: "muss ausgefüllt werden" - too_short: ist zu kurz (nicht weniger als %{count} Zeichen) - wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)" - less_than: muss kleiner als %{count} sein - greater_than: "muss größer als %{count} sein" - equal_to: muss genau %{count} sein - accepted: muss akzeptiert werden - too_long: ist zu lang (nicht mehr als %{count} Zeichen) - taken: ist bereits vergeben - inclusion: "ist kein gültiger Wert" - not_a_number: ist keine Zahl + blank: "Projekt muss einen Namen haben" + taken: "Projektname existiert bereits" + too_long: "Projektname muss weniger als 256 Zeichen haben" template: body: "Bitte überprüfen Sie die folgenden Felder:" header: one: "Konnte dieses %{model} Objekt nicht speichern: 1 Fehler." other: "Konnte dieses %{model} Objekt nicht speichern: %{count} Fehler." - full_messages: - format: "%{attribute} %{message}" + common: + action: Aufgabe + actions: Aufgaben + actions_midsentence: + one: Aufgabe + other: Aufgaben + zero: Aufgaben + add: Hinzufügen + ajaxError: "Fehler beim Empfangen vom Server" + back: Zurück + bugs: Bugs + cancel: Abbrechen + context: Kontext + contexts: Kontexte + contribute: Mitwirken + create: Erstellen + days_midsentence: + one: Tag + other: Tagen + zero: Tagen + deferred: aufgeschobene + description: Beschreibung + drag_handle: Verschieben + email: E-Mail + errors_with_fields: "Mit folgenden Feldern sind Probleme aufgetreten:" + first: Erste + forth: Vierte + forum: Forum + fourth: Vierte + go_back: Zurück + last: Letzte + logout: Abmelden + month: Monat + months: Monate + next: Nächste + none: Keine + not_available_abbr: n/b + note: + one: "1 Notiz" + other: "%{count} Notizen" + zero: "keine Notizen" + notes: Notizen + numbered_step: "Schritt %{number}" + ok: Ok + optional: optional + previous: Vorherige + project: Projekt + projects: Projekte + recurring_todos: "Wiederkehrende Aufgaben" + review: Überprüfung + search: Suchen + second: Zweite + server_error: "Auf dem Server ist ein Fehler aufgetreten." + show_all: "Alle anzeigen" + sort: + alphabetically: Alphabetisch + alphabetically_confirm: "Sollen diese Projekte wirklich alphabetisch sortiert werden? Die bisherige Sortier-Reihenfolge wird damit überschrieben." + alphabetically_title: "Projekte alphabetisch sortieren" + by_task_count: "Nach Anzahl der Aufgaben" + by_task_count_title: "Nach Anzahl der Aufgaben sortieren" + by_task_count_title_confirm: "Sollen diese Projekte wirklich nach Anzahl der Aufgaben sortiert werden? Die bisherige Sortier-Reihenfolge wird damit überschrieben." + sort: Sortieren + third: Dritte + todo: Aufgabe + update: Aktualisieren + website: Website + week: Woche + weeks: Woche + wiki: Wiki + contexts: + add_context: "Kontext hinzufügen" + all_completed_tasks_title: "TRACKS:: Alle erledigten Aufgaben im Kontext '%{context_name}'" + completed_tasks_title: "TRACKS:: Erledigte Aufgaben im Kontext '%{context_name}'" + context_deleted: "Gelöschter Kontext '%{name}'" + context_hide: "Auf Startseite ausblenden?" + context_name: Kontextname + delete_context: "Kontext löschen" + delete_context_confirmation: "Soll der Kontext '%{name}' wirklich gelöscht werden? Alle (wiederkehrenden) Aufgaben dieses Kontexts werden hierdurch ebenfalls gelöscht." + delete_context_title: "Kontext löschen" + edit_context: "Kontext bearbeiten" + hidden_contexts: "Versteckte Kontexte" + hide_form: "Formular verstecken" + hide_form_title: "Formular für neuen Kontext verstecken" + last_completed_in_context: "in diesem Kontext (letzte %{number})" + new_context_post: "' wird ebenfalls angelegt. Fortfahren?" + new_context_pre: "Der neue Kontext '" + no_actions: "Momentan gibt es keine unerledigten Aufgaben in diesem Kontext" + no_contexts_active: "Derzeit gibt es keine aktiven Kontexte" + no_contexts_hidden: "Derzeit gibt es keine versteckten Kontexte" + save_status_message: "Kontext gespeichert" + show_form: "Neuen Kontext erstellen" + show_form_title: "Neuen Kontext erstellen" + status_active: "Kontext ist aktiv" + status_hidden: "Kontext ist versteckt" + todos_append: "in diesem Kontext" + update_status_message: "Kontextname wurde geändert" + visible_contexts: "Sichtbare Kontexte" data: - import_successful: Import war erfolgreich. - import_errors: Beim Import sind Fehler aufgetreten. + import_errors: "Beim Import sind Fehler aufgetreten." + import_successful: "Import war erfolgreich." + date: + abbr_day_names: + - So + - Mo + - Di + - Mi + - Do + - Fr + - Sa + abbr_month_names: + - ~ + - Jan + - Feb + - Mär + - Apr + - Mai + - Jun + - Jul + - Aug + - Sep + - Okt + - Nov + - Dez + day_names: + - Sonntag + - Montag + - Dienstag + - Mittwoch + - Donnerstag + - Freitag + - Samstag + formats: + default: "%d.%m.%Y" + long: "%e. %B %Y" + longer: "%A, %d. %B %Y" + month_day: "%d. %B" + only_day: "%e" + short: "%e. %b" + month_names: + - ~ + - Januar + - Februar + - März + - April + - Mai + - Juni + - Juli + - August + - September + - Oktober + - November + - Dezember + order: + - !ruby/symbol day + - !ruby/symbol month + - !ruby/symbol year + datetime: + distance_in_words: + about_x_hours: + one: "etwa 1 Stunde" + other: "etwa %{count} Stunden" + about_x_months: + one: "etwa 1 Monat" + other: "etwa %{count} Monate" + about_x_years: + one: "etwa 1 Jahr" + other: "etwa %{count} Jahre" + almost_x_years: + one: "fast 1 Jahr" + other: "fast %{count} Jahre" + half_a_minute: "eine halbe Minute" + less_than_x_minutes: + one: "weniger als eine Minute" + other: "weniger als %{count} Minuten" + zero: "weniger als 1 Minute" + less_than_x_seconds: + one: "weniger als 1 Sekunde" + other: "weniger als %{count} Sekunden" + zero: "weniger als 1 Sekunde" + over_x_years: + one: "mehr als 1 Jahr" + other: "mehr als %{count} Jahre" + x_days: + one: "1 Tag" + other: "%{count} Tage" + x_minutes: + one: "1 Minute" + other: "%{count} Minuten" + x_months: + one: "1 Monat" + other: "%{count} Monate" + x_seconds: + one: "1 Sekunde" + other: "%{count} Sekunden" + prompts: + day: Tag + hour: Stunden + minute: Minuten + month: Monat + second: Sekunden + year: Jahr + errors: + user_unauthorized: "401 Unauthorized: Nur administrative Benutzer dürfen auf diese Funktion zugreifen." + feedlist: + actions_completed_last_week: "In den letzten 7 Tagen erledigte Aufgaben" + actions_due_next_week: "Nächste Woche fällige Aufgaben" + actions_due_today: "Heute oder früher fällig" + active_projects_wo_next: "Aktive Projekte ohne nächste Aufgabe" + active_starred_actions: "Alle markierten, aktiven Aufgaben" + all_actions: "Alle Aufgaben" + all_contexts: "Alle Kontexte" + all_projects: "Alle Projekte" + choose_context: "Kontext für den Feed wählen" + choose_project: "Projekt für den Feed wählen" + context_centric_actions: "Feeds für unerledigte Aufgaben in einem bestimmten Kontext" + context_needed: "Es muss mindestens ein Kontext existieren, bevor ein Feed abonniert werden kann." + ical_feed: iCal-Feed + last_fixed_number: "Die letzten %{number} Aufgaben" + legend: "Legende:" + notice_incomplete_only: "Hinweis: Alle Feeds zeigen nur Aufgaben, die noch nicht als erledigt markiert wurden." + plain_text_feed: Reintext-Feed + project_centric: "Feeds für unerledigte Aufgaben in einem bestimmten Kontext" + project_needed: "Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann." + projects_and_actions: "Aktive Projekte und deren Aufgaben" + rss_feed: RSS-Feed + select_feed_for_context: "Feed für diesen Kontext auswählen" + select_feed_for_project: "Feed für dieses Projekt auswählen" + footer: + send_feedback: "Senden Sie Feedback zu %{version}" + integrations: + applescript_next_action_prompt: "Beschreibung der nächsten Aufgabe:" + applescript_success_after_id: erstellt + applescript_success_before_id: "Nächste neue Aufgabe mit ID" + gmail_description: "Gadget, um Tracks als Gadget zu Googlemail hinzuzufügen" + opensearch_description: "In Tracks suchen" + layouts: + mobile_navigation: + contexts: Kontexte + feeds: Feeds + home: Home + logout: Abmelden + new_action: "Neue Aufgabe" + projects: Projekte + starred: Markiert + tickler: Notizbuch + navigation: + admin: Admin + api_docs: "REST API Docs" + calendar: Kalender + calendar_title: "Kalender mit überfälligen Aufgaben" + completed_tasks: Erledigt + completed_tasks_title: Erledigt + contexts_title: Kontexte + export: Export + export_title: "Daten importieren und exportieren" + feeds: Feeds + feeds_title: "Liste der verfügbaren Feeds anzeigen" + help: "?" + home: Start + home_title: Start + integrations_: "Tracks integrieren" + manage_users: "Benutzer verwalten" + manage_users_title: "Benutzer hinzufügen oder entfernen" + notes_title: "Alle Notizen anzeigen" + organize: Organisieren + preferences: Einstellungen + preferences_title: "Meine Einstellungen" + projects_title: Projekte + recurring_todos: "Wiederkehrende Aufgaben" + recurring_todos_title: "Wiederkehrende Aufgaben verwalten" + review_title: Überprüfung + search: "Alle Einträge durchsuchen" + starred: Markiert + starred_title: "Markierte Aufgaben betrachten" + stats: Statistiken + stats_title: "Statistiken anzeigen" + tickler: Notizbuch + tickler_title: Notizbuch + view: Betrachten + next_actions_rss_feed: "RSS-Feed kommende Aufgaben" + toggle_contexts: "Kontexte umschalten" + toggle_contexts_title: "Kontextanzeige umschalten" + toggle_notes: "Notizen umschalten" + toggle_notes_title: "Alle Notizen umschalten" + login: + account_login: Account-Anmeldung + cas_create_account: "Wenn du die Anfrage fortsetzen möchtest, klicke bitte hier: %{signup_link}" + cas_logged_in_greeting: "Hallo, %{username}! Du bist authentifiziert." + cas_login: CAS-Anmeldung + cas_no_user_found: "Hallo, %{username}! Du hast leider keinen Tracks-Account." + cas_signup_link: "Account beantragen" + cas_username_not_found: "Sorry, aber es existiert kein Benutzer mit dem CAS-Benutzernamen (%{username})" + log_in_again: "Erneut anmelden." + logged_out: "Sie wurden von Tracks abgemeldet." + login_cas: "zum CAS gehen" + login_standard: "zurück zum Standard-Login" + login_with_openid: "Mit einer OpenID anmelden" + mobile_use_openid: "…oder mit einer OpenID anmelden" + openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identitäts-URL (%{identity_url})" + option_separator: "oder," + please_login: "Bitte melde dich an, um Tracks zu nutzen" + session_time_out: "Sitzung abgelaufen. Bitte %{link}" + session_will_expire: "Sitzung wird nach %{hours} Stunde(n) der Inaktivität ablaufen." + session_will_not_expire: "Sitzung wird nicht ablaufen." + sign_in: Anmeldung + successful: "Anmeldung erfolgreich. Willkommen zurück!" + successful_with_session_info: "Anmeldung erfolgreich:" + unsuccessful: "Anmeldung war nicht erfolgreich." + user_no_expiry: "Angemeldet bleiben" models: - project: - feed_title: Tracks-Projekte - feed_description: "Listet alle Projekte für %{username} auf" - todo: - error_date_must_be_future: muss ein Datum in der Zukunft sein preference: - due_on: "Fällig am %{date}" due_in: "Fällig in %{days} Tagen" + due_on: "Fällig am %{date}" due_styles: - - "Fällig in ___ Tagen" - - "Fällig am _______" + - "Fällig in ___ Tagen" + - "Fällig am _______" + project: + feed_description: "Listet alle Projekte für %{username} auf" + feed_title: Tracks-Projekte + todo: + error_date_must_be_future: "muss ein Datum in der Zukunft sein" user: error_context_not_associated: "Kontext-ID %{context} nicht mit Benutzer-ID %{user} verknüpft." error_project_not_associated: "Projekt-ID %{project} nicht mit User-ID %{user} verknüpft." + notes: + delete_confirmation: "Bist du sicher, dass du die Notiz '%{id}' löschen möchtest?" + delete_item_title: "Eintrag löschen" + delete_note_confirm: "Soll die Notiz '%{id}' wirklich gelöscht werden?" + delete_note_title: "Notiz '%{id}' löschen" + deleted_note: "Notiz '%{id}' löschen" + edit_item_title: "Eintrag bearbeiten" + in_project: "In:" + no_notes_available: "Derzeit gibt es keine Notizen. Füge Notizen auf der jeweiligen Projektseite hinzu." + note_header: "Notiz %{id}" + note_link_title: "Notiz %{id} anzeigen" + note_location_link: "In:" + show_note_title: "Notiz anzeigen" + number: + currency: + format: + delimiter: "," + format: "%n%u" + separator: "." + unit: € + format: + delimiter: "." + precision: 2 + separator: "," + human: + format: + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: Byte + other: Bytes + gb: GB + kb: KB + mb: MB + tb: TB + preferences: + authentication_header: "Deine Authentifizierung" + change_authentication_type: "Authentifzierungsart ändern" + change_identity_url: "Ändere deine Identitäts-URL" + change_password: "Passwort ändern" + current_authentication_type: "Dein Authentifizierungsart ist %{auth_type}" + edit_preferences: "Einstellungen bearbeiten" + 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." + is_false: Nein + is_true: Ja + open_id_url: "Deine OpenID-URL lautet:" + page_title: "TRACKS::Einstellungen" + page_title_edit: "TRACKS::Einstellungen ändern" + password_changed: "Ihr Passwort geändert wurde, melden Sie sich bitte wieder an." + show_number_completed: "Zeige %{number} erledigte Einträge" + sms_context_none: Keine + staleness_starts_after: "Abgestandenheit startet nach %{days} Tagen" + tabs: + authentication: Authentifizierung + date_and_time: "Datum und Uhrzeit" + profile: Profil + tracks_behavior: "Tracks Verhalten" + title: "Deine Einstellungen" + token_description: "Token (für die Verwendung in Feeds und der API)" + token_header: "Dein Token" + updated: "Einstellungen aktualisiert" + projects: + actions_in_project_title: "Aufgaben im Projekt" + active_projects: "Aktive Projekte" + add_note: "Notiz hinzufügen" + add_note_submit: "Notiz hinzufügen" + add_project: "Projekt hinzufügen" + all_completed_tasks_title: "TRACKS:: Alle erledigten Aufgaben im Projekt '%{project_name}'" + completed_actions: "Erledigte Aufgaben für dieses Projekt" + completed_actions_empty: "Es gibt keine erledigten Aufgaben für dieses Projekt" + completed_projects: "Erledigte Projekte" + completed_tasks_title: "TRACKS:: Liste erledigter Aufgaben in Project '%{project_name}'" + default_context: "Der Standard-Kontext dieses Projektes ist %{context}" + default_context_removed: "Standard-Kontext entfernt" + default_context_set: "Standard-Kontext des Projekts auf %{default_context} gesetzt" + default_tags_removed_notice: "Standard-Tags entfernt" + deferred_actions: "Aufgeschobene Aufgaben für dieses Projekt" + deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben für dieses Projekt" + delete_project: "Projekt löschen" + delete_project_confirmation: "Soll das Projekt '%{name}' wirklich gelöscht werden?" + delete_project_title: "Projekt löschen" + edit_project_settings: "Projekteinstellungen bearbeiten" + edit_project_title: "Projekt bearbeiten" + hidden_projects: "Versteckte Projekte" + hide_form: "Fomular verstecken" + hide_form_title: "Formular verstecken" + is_active: "ist aktiv" + list_completed_projects: "TRACKS:: Liste erledigter Projekte" + list_projects: "TRACKS::Projektliste" + list_reviews: "TRACKS::Rückblick" + no_actions_in_project: "Momentan gibt es keine unerledigten Aufgaben in diesem Projekt" + no_default_context: "Dieses Projekt hat keinen Standard-Kontext" + no_last_completed_projects: "Keine erledigten Projekte gefunden" + no_last_completed_recurring_todos: "Keine erledigten wiederkehrenden Aufgaben gefunden" + no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verknüpft." + no_projects: "Keine Projekte vorhanden" + notes: Notizen + notes_empty: "Es gibt keine Notizen für dieses Projekt" + page_title: "TRACKS::Projekt: %{project}" + project_saved_status: "Projekt gespeichert" + project_state: "Projekt ist %{state}" + set_default_tags_notice: "Standard-Tags des Projekts auf %{default_tags} setzen" + settings: Einstellungen + show_form: "Projekt erstellen" + show_form_title: "Neues Projekt anlegen" + state: "Dieses Projekt ist %{state}" + status_project_name_changed: "Projektname geändert" + this_project: "Dieses Projekt" + to_new_project_page: "Zu neuem Projekt weiterleiten" + todos_append: "dieses Projekts" + was_marked_complete: "wurde als erledigt markiert" + was_marked_hidden: "wurde als verborgen markiert" + with_default_context: "mit dem Standard-Kontext '%{context_name}'" + with_default_tags: "und mit '%{tags}' als Standard-Tags" + with_no_default_context: "hat keinen Standard-Kontext" + with_no_default_tags: "und hat keine Standard-Tags" + search: + contexts_matching_query: "Kontexte entsprechen der Suche" + no_results: "Die Suche ergab kein Ergebnis." + notes_matching_query: "Notizen entsprechen der Suche" + projects_matching_query: "Projekte entsprechen der Suche" + tags_matching_query: "Tags entsprechen der Suche" + todos_matching_query: "Todos entsprechen der Suche" + shared: + add_action: "Aufgabe hinzufügen" + add_actions: "Aufgaben hinzufügen" + add_context: "Neuer Kontext" + context_for_all_actions: "Kontext für alle Aufgaben" + hide_action_form_title: "Formular für neue Aufgaben verstecken" + hide_form: "Formular verstecken" + make_actions_dependent: "Aufgaben abhängig machen" + multiple_next_actions: "Mehrere neue Aufgaben (eine pro Zeile)" + project_for_all_actions: "Projekt für alle Aufgaben" + separate_tags_with_commas: "mit Kommas trennen" + tags_for_all_actions: "Tags für alle Aufgaben (kommagetrennt)" + toggle_multi: "Mehrere Aufgaben hinzufügen" + toggle_multi_title: "Zwischen Einzel- und Mehrfachformular für neue Aufgaben umschalten" + toggle_single: "Weitere Aufgabe erstellen" + toggle_single_title: "Eine weitere Aufgabe hinzufügen" + sidebar: + list_empty: Keine + list_name_active_contexts: "Aktive Kontexte" + list_name_active_projects: "Aktive Projekte" + list_name_completed_projects: "Erledigte Projekte" + list_name_hidden_contexts: "Versteckte Kontexte" + list_name_hidden_projects: "Versteckte Projekte" + states: + active: Aktiv + active_plural: Aktive + blocked: Blockiert + blocked_plural: Blockierte + completed: Erledigte + completed_plural: Erledigte + current: Aktuell + current_plural: Aktuelle + hidden: Versteckt + hidden_plural: Versteckte + review: Datiert + review_plural: Verschobene + stalled: Veraltet + stalled_plural: Veraltete + visible: Sichtbar + visible_plural: Sichtbare stats: - totals_hidden_context_count: und %{count} sind versteckte Kontexte. - actions_avg_created: In den letzten 12 Monaten hast du durchschnittlich %{count} Aufgaben erstellt - actions_min_max_completion_days: "Das Minimum/Maximum in Tagen zur Erledigung ist %{min}/%{max}." - totals_actions_completed: "%{count} davon sind erledigt." - tag_cloud_title: Tag-Cloud aller Aufgaben - actions_actions_avg_created_30days: In den letzten 30 Tagen hast du durchschnittlich %{count} Aufgaben erstellt - actions_avg_completed: und davon durchschnittlich %{count} per Monat erledigt. - top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unerledigten Aufgaben" + action_completion_time_title: "Fertigstellungszeit (alle erledigten Aufgaben)" + action_selection_title: "TRACKS::Aufgabenauswahl" actions: Aufgaben - time_of_day_legend: - number_of_actions: Anzahl Aufgaben - time_of_day: Tageszeit - totals_incomplete_actions: "Du hast %{count} unerledigte Aufgaben" - totals_deferred_actions: "von denen %{count} im Notizbuch zurückgestellt sind" + actions_30days_title: "_Aufgaben der letzten 30 Tage" + actions_actions_avg_created_30days: "In den letzten 30 Tagen hast du durchschnittlich %{count} Aufgaben erstellt" + actions_avg_completed: "und davon durchschnittlich %{count} per Monat erledigt." + actions_avg_completed_30days: "und durchschnittlich %{count} davon erledigt." + actions_avg_completion_time: "Durchschnittlich hast du %{count} Tage gebraucht um eine Aufgabe zu erledigen." + actions_avg_created: "In den letzten 12 Monaten hast du durchschnittlich %{count} Aufgaben erstellt" + actions_day_of_week_legend: + day_of_week: "Tag der Woche" + number_of_actions: "Anzahl der Aufgaben" + actions_day_of_week_title: "Wochentag (alle Aufgaben)" + actions_dow_30days_legend: + day_of_week: "Tag der Woche" + number_of_actions: "Anzahl der Aufgaben" + actions_dow_30days_title: "Wochentag (letzte 30 Tage)" + actions_further: "und danach" + actions_last_year: "Aufgaben im letzten Jahr" + actions_last_year_legend: + months_ago: "Monate zuvor" + number_of_actions: "Anzahl Aufgaben" + actions_lastyear_title: "Aufgaben der letzten 12 Monate" + actions_min_completion_time: "Die minimale Zeit beträgt %{time}." + actions_min_max_completion_days: "Das Minimum/Maximum in Tagen zur Erledigung ist %{min}/%{max}." + actions_selected_from_week: "Aufgaben ausgewählt ab Woche" + 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 Aufgaben von Woche %{week} und danach anzuzeigen." + click_to_update_actions: "Klicke auf eine Leiste in der Grafik um die Aufgaben unten zu aktualisieren." + contexts: Kontexte + current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unerledigter sichtbarer Aufgaben" + index_title: "TRACKS::Statistik" + labels: + avg_completed: "Durchschnittlich erledigt" + avg_created: "Durchschnittlich erstellt" + completed: Erledigt + created: Erstellt + month_avg_completed: "%{months} Monat durchschnittlich erledigt" + month_avg_created: "%{months} Monat durchschnittlich erstellt" + legend: + actions: Aufgaben + day_of_week: Wochentag + months_ago: "Monate zuvor" + number_of_actions: "Anzahl Aufgaben" + number_of_days: "Anzahl vergangene Tage" + percentage: Prozentsatz + running_time: "Laufzeit einer Aufgabe (Wochen)" + more_stats_will_appear: "Weitere Statistiken werden verfügbar, wenn einige Aufgaben hinzugefügt wurden." + no_actions_selected: "Es sind keine Aufgaben ausgewählt." + no_tags_available: "keine Tags verfügbar" + open_per_week: "Aktiv (sichtbar und unsichtbar) nächsten Aufgaben pro Woche" + open_per_week_legend: + actions: Aufgaben + weeks: "Wochen her" + other_actions_label: (andere) + projects: Projekte + running_time_all: "Aktuelle Laufzeit aller unerledigter Aufgaben." + running_time_all_legend: + actions: Aufgaben + percentage: Prozentsatz + running_time: "Laufzeit einer Aufgabe (Wochen). Klick auf eine Leiste für mehr Informationen." running_time_legend: actions: Aufgaben percentage: Prozentsatz weeks: "Vergangene Zeit einer Aufgabe (Wochen). Klicke auf eine Leiste für mehr Informationen." - totals_action_count: hattest du insgesamt %{count} Aufgaben - tag_cloud_90days_title: Tag-Cloud-Aufgaben in den letzten 90 Tagen - actions_avg_completion_time: Durchschnittlich hast du %{count} Tage gebraucht um eine Aufgabe zu erledigen. - tod30: Tageszeit (letzte 30 Tage) + spread_of_actions_for_all_context: "Aufgabenverteilung aller Kontexte" + spread_of_running_actions_for_visible_contexts: "Verteilung der laufenden Aufgaben aller sichtbaren Kontexte" + tag_cloud_90days_description: "Diese Tag-Cloud beinhaltet Tags der Aufgaben, die in den letzten 90 Tagen erstellt oder erledigt wurden." + tag_cloud_90days_title: "Tag-Cloud-Aufgaben in den letzten 90 Tagen" + tag_cloud_description: "Diese Tag-Cloud beinhaltet Tags aller Aufgaben (erledigt, unerledigt, sichtbar, unsichtbar)" + tag_cloud_title: "Tag-Cloud aller Aufgaben" tags: Tags - projects: Projekte - totals_completed_project_count: und %{count} sind erledigte Projekte. - labels: - month_avg_completed: "%{months} Monat durchschnittlich erledigt" - completed: Erledigt - month_avg_created: "%{months} Monat durchschnittlich erstellt" - avg_created: Durchschnittlich erstellt - avg_completed: Durchschnittlich erledigt - created: Erstellt - actions_selected_from_week: "Aufgaben ausgewählt ab Woche" - actions_day_of_week_title: Wochentag (alle Aufgaben) - actions_lastyear_title: Aufgaben der letzten 12 Monate - open_per_week: "Aktiv (sichtbar und unsichtbar) nächsten Aufgaben pro Woche" - action_selection_title: TRACKS::Aufgabenauswahl - totals_project_count: Du hast %{count} Projekte. - legend: - number_of_days: Anzahl vergangene Tage - actions: Aufgaben - number_of_actions: Anzahl Aufgaben - day_of_week: Wochentag - running_time: Laufzeit einer Aufgabe (Wochen) - percentage: Prozentsatz - months_ago: Monate zuvor - current_running_time_of_incomplete_visible_actions: "Aktuelle Laufzeit unerledigter sichtbarer Aufgaben" - tod30_legend: - number_of_actions: Anzahl Aufgaben + time_of_day: "Tageszeit (alle Aufgaben)" + time_of_day_legend: + number_of_actions: "Anzahl Aufgaben" + time_of_day: Tageszeit + tod30: "Tageszeit (letzte 30 Tage)" + tod30_legend: + number_of_actions: "Anzahl Aufgaben" time_of_day: Tageszeit - totals_context_count: Du hast %{count} Kontexte. - open_per_week_legend: - actions: Aufgaben - weeks: Wochen her - actions_last_year_legend: - number_of_actions: Anzahl Aufgaben - months_ago: Monate zuvor - top5_contexts: Top 5 aller Kontexte - top10_projects: Top 10 aller Projekte - contexts: Kontexte - totals: Ingesamt - click_to_return: "Klick auf %{link} um zur Statistikseite zurückzukehren." - tag_cloud_90days_description: Diese Tag-Cloud beinhaltet Tags der Aufgaben, die in den letzten 90 Tagen erstellt oder erledigt wurden. - totals_visible_context_count: Von diesen sind %{count} sichtbare Kontexte - top10_projects_30days: Top-10-Projekt der letzten 30 Tage - running_time_all: "Aktuelle Laufzeit aller unerledigter Aufgaben." - actions_min_completion_time: "Die minimale Zeit beträgt %{time}." - action_completion_time_title: Fertigstellungszeit (alle erledigten Aufgaben) - click_to_show_actions_from_week: Klick auf %{link} um die Aufgaben von Woche %{week} und danach anzuzeigen. top10_longrunning: "Top 10 der am längsten laufenden Projekte" - no_actions_selected: "Es sind keine Aufgaben ausgewählt." - totals_tag_count: Du hast %{count} Tags in Aufgaben. - actions_further: und danach - actions_dow_30days_legend: - number_of_actions: Anzahl der Aufgaben - day_of_week: Tag der Woche - totals_first_action: Seit deiner ersten Aufgabe am %{date} - tag_cloud_description: Diese Tag-Cloud beinhaltet Tags aller Aufgaben (erledigt, unerledigt, sichtbar, unsichtbar) - spread_of_actions_for_all_context: Aufgabenverteilung aller Kontexte - click_to_update_actions: Klicke auf eine Leiste in der Grafik um die Aufgaben unten zu aktualisieren. - click_to_return_link: hier - more_stats_will_appear: "Weitere Statistiken werden verfügbar, wenn einige Aufgaben hinzugefügt wurden." - actions_avg_completed_30days: und durchschnittlich %{count} davon erledigt. - index_title: TRACKS::Statistik - actions_30days_title: _Aufgaben der letzten 30 Tage - no_tags_available: "keine Tags verfügbar" - actions_dow_30days_title: Wochentag (letzte 30 Tage) - actions_day_of_week_legend: - number_of_actions: Anzahl der Aufgaben - day_of_week: Tag der Woche - within_one: Innerhalb von 1 - spread_of_running_actions_for_visible_contexts: Verteilung der laufenden Aufgaben aller sichtbaren Kontexte - actions_last_year: Aufgaben im letzten Jahr + top10_projects: "Top 10 aller Projekte" + top10_projects_30days: "Top-10-Projekt der letzten 30 Tage" + top5_contexts: "Top 5 aller Kontexte" + top5_visible_contexts_with_incomplete_actions: "Top 5 der sichtbaren Kontexte mit unerledigten Aufgaben" + totals: Ingesamt + totals_action_count: "hattest du insgesamt %{count} Aufgaben" + totals_actions_completed: "%{count} davon sind erledigt." + totals_active_project_count: "Von diesen sind %{count} aktive Projekte" totals_blocked_actions: "%{count} hängen vom Abschluss anderer Aufgaben ab." - totals_unique_tags: Von diesen Tags sind %{count} einmalig. - totals_active_project_count: Von diesen sind %{count} aktive Projekte - running_time_all_legend: - actions: Aufgaben - running_time: "Laufzeit einer Aufgabe (Wochen). Klick auf eine Leiste für mehr Informationen." - percentage: Prozentsatz - other_actions_label: (andere) + totals_completed_project_count: "und %{count} sind erledigte Projekte." + totals_context_count: "Du hast %{count} Kontexte." + totals_deferred_actions: "von denen %{count} im Notizbuch zurückgestellt sind" + totals_first_action: "Seit deiner ersten Aufgabe am %{date}" + totals_hidden_context_count: "und %{count} sind versteckte Kontexte." totals_hidden_project_count: "%{count} sind versteckt" - time_of_day: Tageszeit (alle Aufgaben) - todos: - recurring_action_deleted: Die Aufgabe wurde gelöscht. Da dies eine wiederkehrende Aufgabe ist, wurde eine neue erstellt. - show_from: Anzeigen ab dem - error_starring_recurring: Konnte die Hervorhebung der wiederkehrenden Aufgabe \'%{description}\' nicht durchführen - completed_actions: Erledigte Aufgaben - added_new_next_action: Neue Aufgabe angelegt - completed_recurring: Erledigte wiederkehrende Aufgaben - completed_rest_of_previous_month: Erledigt im Vormonat - blocked_by: Blockiert durch %{predecessors} - star_action: Aufgabe markieren - completed_recurrence_completed: Es gibt keine weitere Aufgabe nach der soeben gelöschten. Die Wiederholung ist abgeschlossen. - defer_date_after_due_date: "Zurückstellungsdatum nach Ablaufdatum. Bitte passe das Ablaufdatum an, dass es vor dem Zurückstellungsdatum liegt." - unable_to_add_dependency: Abhängigkeit nicht hinzufügbar - done: Erledigt? - star_action_with_description: Aufgabe '%{description}' markieren - tagged_with: getagged mit '%{tag_name}' - completed: Erledigt - no_deferred_actions_with: "Keine zurückgestellten Aufgaben mit dem Tag '%{tag_name}'" - no_hidden_actions: Momentan sind keine versteckten Aufgaben vorhanden - edit_action_with_description: Aufgabe '%{description}' bearbeiten - action_due_on: "(Aufgabe fällig am %{date})" - list_incomplete_next_actions: Unerledigte Folge-Aufgaben anzeigen - archived_tasks_title: TRACKS::Archivierte erledigte Aufgaben - remove_dependency: Abhängigkeit löschen (löscht nicht die Aufgabe) - action_deleted_success: Die nächste Aufgabe erfolgreich gelöscht - tags: Tags (kommagetrennt) - delete_recurring_action_title: "Wiederkehrende Aufgabe '%{description}' löschen" - context_changed: Kontext zu %{name} gewechselt - new_related_todo_created: "Eine neue Aufgabe wurde hinzugefügt, die zu dieser wiederkehrenden Aufgabe gehört" - mobile_todos_page_title: Alle Aufgaben - add_another_dependency: "Neue Abhängigkeit" - removed_predecessor: "%{successor} entfernt als Abhängigkeit von %{predecessor}." - recurring_actions_title: TRACKS::Wiederkehrende Aufgaben - next_action_needed: Es muss mindestens eine folgende Aufgabe angelegt werden - action_saved: Aufgabe gespeichert - scheduled_overdue: "Planmäßig angezeigt vor %{days} Tagen" - action_deleted_error: Fehler beim Löschen der Aufgabe - edit_action: Aufgabe bearbeiten - added_new_context: "Neuer Kontext hinzugefügt" - next_actions_description: "Filter:" - list_incomplete_next_actions_with_limit: Zeige die letzten %{count} unerledigten Folge-Aufgaben - set_to_pending: "%{task} als ausstehend markiert" - added_new_project: "Neues Projekt hinzugefügt" - next_actions_title_additions: - completed: Aufgaben erledigt - due_today: heute fällig - due_within_a_week: diese Woche fällig - older_completed_items: "ältere erledigte Aufgaben" - no_actions_due_this_week: Keine fälligen Aufgaben diese Woche - all_completed_here: hier - append_in_this_project: in diesem Projekt - edit_recurring_todo: Wiederkehrende Aufgabe bearbeiten - error_deleting_item: Beim Löschen von %{description} trat ein Fehler auf - task_list_title: TRACKS::Aufgaben anzeigen - no_recurring_todos: Im Augenblick gibt es keine wiederkehrenden Aufgaben - error_completing_todo: Beim Abschließen/Aktivieren der wiederkehrenden Aufgabe %{description} ist ein Fehler aufgetreten - recurring_pattern_removed: Das Wiederholungsmuster wurde entfernt %{count} - convert_to_project: In Projekt umwandeln - no_deferred_pending_actions: Momentan sind keine aufgeschobenen oder ausstehenden Aufgaben vorhanden. - delete_recurring_action_confirm: Soll die wiederkehrende Aufgabe '%{description}' wirklich gelöscht werden? - completed_last_day: In den letzten 24 Stunden erledigt - feed_title_in_context: im Kontext '%{context}' - no_project: --Kein Projekt-- - show_in_days: Anzeigen in %{days} Tagen - error_saving_recurring: Es gab einen Fehler beim Speichern der wiederkehrenden Aufgabe '%{description}' - completed_more_than_x_days_ago: Vor mehr als %{count} Tagen erledigt - new_related_todo_created_short: hat eine neue Aufgabe - all_completed: Alle erledigten Aufgaben - edit: Bearbeiten - completed_actions_with: Erledigte Aufgaben mit dem Tag %{tag_name} - older_than_days: "älter als %{count} Tage" - completed_tagged_page_title: "TRACKS:: Erledigte Aufgaben mit Tag %{tag_name}" - pending: Ausstehend - completed_tasks_title: TRACKS::Erledigte Aufgaben - deleted_success: "Die Aufgabe wurde erfolgreich gelöscht." - feed_title_in_project: im Projekt '%{project}' - clear_due_date: Fälligkeitsdatum leeren - error_removing_dependency: "Beim Entfernen der Abhängigkeit ist ein Fehler aufgetreten" - hidden_actions: Verstecke Aufgaben - was_due_on_date: war am %{date} fällig - show_on_date: Anzeigen am %{date} - recurrence_period: Wiederholungszeitraum - deferred_actions_with: "Zurückgestellte Aufgaben mit dem Tag '%{tag_name}'" - confirm_delete: "Bist du sicher, dass du die Aufgabe '%{description}' löschen möchtest?" - recurring_deleted_success: "Die wiederkehrende Aufgabe wurde erfolgreich gelöscht." - no_completed_actions_with: Keine erledigten Aufgaben mit dem Tag '%{tag_name}' - next_actions_title: TRACKS::Weitere Aufgaben - next_action_description: "Beschreibung der nächsten Aufgabe" - deferred_tasks_title: TRACKS::Notizbuch - clear_show_from_date: Datum leeren - in_hidden_state: als versteckt markiert - see_all_completed: "Alle erledigten Aufgaben %{link}" - calendar_page_title: TRACKS::Kalender - unresolved_dependency: "Der Wert, den Sie in die Abhängigkeit Feld eingegeben nicht zu einer bestehenden Aufgabe zu lösen. Dieser Wert wird nicht mit dem Rest der Aufgabe gerettet werden. Weiter gehen?" - no_actions_found_title: Keine Aufgaben gefunden - show_today: Heute anzeigen - next_actions_due_date: - overdue_by: "Überfällig mit %{days} Tag" - due_in_x_days: "Fällig in %{days} Tagen" - due_today: "Heute fällig" - overdue_by_plural: "Überfällig mit %{days} Tagen" - due_tomorrow: "Fällig morgen" - completed_last_x_days: In den letzten %{count} Tagen erledigt - no_actions_with: "Im Augenblick gibt es keine unerledigten Aufgaben mit dem Tag '%{tag_name}'" - defer_x_days: - one: "Einen Tag zurückstellen" - other: "%{count} Tage zurückstellen" - added_new_next_action_singular: Neue nächste Aufgabe angelegt - no_completed_actions: Momentan sind keine erledigten Aufgaben vorhanden. - deferred_pending_actions: Aufgeschobene und ausstehende Aufgaben - has_x_pending: - one: Hat eine ausstehende Aufgabe - other: Hat %{count} ausstehende Aufgaben - feeds: - completed: "Erledigt: %{date}" - due: "Fällig: %{date}" - recurring_todos: Wiederkehrende Aufgaben - error_deleting_recurring: "Beim Löschen der wiederkehrenden Aufgabe %{description} ist ein Fehler aufgetreten" - delete_action: "Aufgabe löschen" - delete: "Löschen" - no_last_completed_actions: Keine erledigten Aufgaben gefunden - drag_action_title: "Auf andere Aufgabe ziehen, um sie als Abhängigkeit zu definieren" - cannot_add_dependency_to_completed_todo: "Kann keine Abhängigkeit zu einer erledigten Aufgabe hinzufügen!" - depends_on: "Hängt ab von" - tickler_items_due: - one: Ein Notizbuch-Eintrag ist nun fällig - lade die Seite neu, um sie zu sehen. - other: "%{count} Notizbuch-Einträge sind nun fällig - lade die Seite neu, um sie zu sehen." - action_marked_complete: Die Aufgabe '%{description}' wurde als %{completed} markiert. - completed_today: Heute erledigt - added_new_next_action_plural: Neue weiterführende Aufgaben angelegt - new_related_todo_not_created_short: konnte nicht erstellt werden - completed_rest_of_week: Erledigt diese Woche - show_tomorrow: Morgen anzeigen - error_starring: Konnte die Hervorhebung von \'%{description}\' nicht durchführen - calendar: - get_in_ical_format: Diesen Kalender im iCal Format herunterladen - due_next_week: Nächste Woche fällig - no_actions_due_next_week: Keine Aufgaben für die kommende Woche - due_this_week: Diese Woche fällig - no_actions_due_today: Heute sind keine Aufgaben fällig - due_today: Heute fällig - due_next_month_and_later: Im %{month} und später fällig - no_actions_due_after_this_month: Nach diesem Monat sind keine Aufgaben fällig - no_actions_due_this_month: Keine Aufgaben für den Rest des Monats - due_this_month: Im %{month} fällig - no_completed_recurring: Im Augenblick gibt es keine erledigten wiederkehrenden Aufgaben - recurrence: - ends_on_date: Endet am %{date} - every_work_day: Jeden Arbeitstag - ends_on_number_times: Endet nach %{number} mal - recurrence_on_due_date: Fälligkeitsdatum - weekly_options: "Einstellungen wöchentliche Aufgaben" - weekly: "Wöchentlich" - monthly_options: "Einstellungen für monatliche Aufgaben" - daily_options: "Einstellungen tägliche Aufgaben" - monthly: Monatlich - starts_on: Beginnt am - daily: "Täglich" - show_option_always: immer - pattern: - third: Drittel - month_names: - - - - Januar - - Februar - - "März" - - April - - Mai - - Juni - - Juli - - August - - September - - Oktober - - November - - Dezember - every_n: jeden %{n} - second: zweite - every_xth_day_of_every_n_months: "jedes %{x} %{day} jedes %{n_months} ​" - on_day_n: am Tag %{n} - weekly: "wöchentlich" - from: von - last: zuletzt - every_day: jeden Tag - the_xth_day_of_month: der %{x} %{day} von %{month} - times: "für %{number} Zeiten" - first: erste - show: Show - every_year_on: jedes Jahr in %{date} - on_work_days: an Wochentagen - day_names: - - Sonntag - - Montag - - Dienstag - - Mittwoch - - Donnerstag - - Freitag - - Samstag - fourth: vierte - due: "Fällig" - every_month: jeden Monat - until: bis - yearly_every_x_day: "Jeden %{day}. %{month} " - recurrence_on_options: Setze Wiederholung auf - daily_every_number_day: Alle %{number} Tage - show_options: Aufgabe anzeigen - weekly_every_number_week: Kehrt jede %{number}. Woche wieder am - ends_on: Endet am - show_days_before: "%{days} Tage bevor die Aufgabe fällig ist" - from_tickler: Fälligkeitsdatum kommt vom Notizbuch (keine Fälligkeit setzen) - no_end_date: Kein Enddatum - day_x_on_every_x_month: Tag %{day} in jedem %{month}. Monat - yearly_every_xth_day: Den %{day} %{day_of_week} des %{month} - yearly_options: "Einstellungen jährliche Aufgaben" - yearly: "Jährlich" - monthly_every_xth_day: Der %{day} %{day_of_week} eines jeden %{month}. Monats - action_deferred: Die Aufgabe \'% {description}\' wurde vertagt - tagged_page_title: TRACKS::Als '%{tag_name}' markiert - added_dependency: "%{dependency} als Abhängigkeit hinzugefügt." - completed_rest_of_month: Erledigt diesen Monat - all_completed_tagged_page_title: "TRACKS:: Alle erledigten Aufgaben mit Tag %{tag_name}" - no_deferred_actions: Zur Zeit sind keine zurückgestellten Aufgaben vorhanden. - recurrence_completed: Nach dieser erledigten wiederkehrenden Aufgabe folgt keine mehr. Die Wiederholung endet hiermit. - action_marked_complete_error: Die Aufgabe '%{description}' wurde aufgrund eines Fehlers NICHT als %{completed} markiert. - no_actions_found: "Momentan gibt es keine unerledigten Aufgaben." - in_pending_state: und als ausstehend markiert - error_toggle_complete: "Könnte nicht diese Marke todo komplett" - due: Fällig - no_incomplete_actions: Es gibt keine unerledigten Aufgaben - action_saved_to_tickler: Aufgabe im Notizbuch gespeichert - recurring_action_saved: Wiederkehrende Aufgabe gespeichert - depends_on_separate_with_commas: Hängt ab von (kommagetrennt) - completed_in_archive: - one: Es befindet sich eine erledigte Aufgabe im Archiv. - other: Es befinden sich %{count} erledigte Aufgaben im Archiv. - to_tickler: ", im Notizbuch hinterlegt" - next_actions_description_additions: - completed: In den letzten %{count} Tagen - due_date: mit einem Datum %{due_date} oder früher - overdue: "überfällig" - add_new_recurring: "Neue wiederkehrende Aufgabe" - notes: - delete_note_title: Notiz '%{id}' löschen - delete_confirmation: "Bist du sicher, dass du die Notiz '%{id}' löschen möchtest?" - in_project: "In:" - delete_item_title: Eintrag löschen - deleted_note: "Notiz '%{id}' löschen" - note_link_title: Notiz %{id} anzeigen - show_note_title: Notiz anzeigen - edit_item_title: Eintrag bearbeiten - note_location_link: "In:" - no_notes_available: "Derzeit gibt es keine Notizen. Füge Notizen auf der jeweiligen Projektseite hinzu." - note_header: Notiz %{id} - delete_note_confirm: Soll die Notiz '%{id}' wirklich gelöscht werden? - projects: - default_context_set: Standard-Kontext des Projekts auf %{default_context} gesetzt - no_actions_in_project: "Momentan gibt es keine unerledigten Aufgaben in diesem Projekt" - deferred_actions: "Aufgeschobene Aufgaben für dieses Projekt" - was_marked_hidden: wurde als verborgen markiert - edit_project_title: Projekt bearbeiten - default_tags_removed_notice: Standard-Tags entfernt - page_title: "TRACKS::Projekt: %{project}" - all_completed_tasks_title: "TRACKS:: Alle erledigten Aufgaben im Projekt '%{project_name}'" - hide_form: Fomular verstecken - list_completed_projects: "TRACKS:: Liste erledigter Projekte" - no_notes_attached: "Im Augenblick sind keine Notizen mit diesem Projekt verknüpft." - to_new_project_page: Zu neuem Projekt weiterleiten - show_form_title: Neues Projekt anlegen - deferred_actions_empty: "Es gibt keine aufgeschobenen Aufgaben für dieses Projekt" - project_state: Projekt ist %{state} - this_project: Dieses Projekt - no_last_completed_projects: Keine erledigten Projekte gefunden - no_last_completed_recurring_todos: Keine erledigten wiederkehrenden Aufgaben gefunden - notes: Notizen - todos_append: dieses Projekts - list_reviews: "TRACKS::Rückblick" - notes_empty: "Es gibt keine Notizen für dieses Projekt" - no_projects: Keine Projekte vorhanden - hide_form_title: Formular verstecken - delete_project: Projekt löschen - completed_actions_empty: "Es gibt keine erledigten Aufgaben für dieses Projekt" - with_no_default_context: hat keinen Standard-Kontext - delete_project_confirmation: Soll das Projekt '%{name}' wirklich gelöscht werden? - with_default_context: mit dem Standard-Kontext '%{context_name}' - show_form: Projekt erstellen - actions_in_project_title: Aufgaben im Projekt - completed_projects: Erledigte Projekte - is_active: ist aktiv - add_note: "Notiz hinzufügen" - set_default_tags_notice: Standard-Tags des Projekts auf %{default_tags} setzen - add_project: Projekt hinzufügen - settings: Einstellungen - project_saved_status: Projekt gespeichert - list_projects: TRACKS::Projektliste - with_default_tags: und mit '%{tags}' als Standard-Tags - completed_tasks_title: "TRACKS:: Liste erledigter Aufgaben in Project '%{project_name}'" - hidden_projects: Versteckte Projekte - delete_project_title: Projekt löschen - default_context_removed: Standard-Kontext entfernt - add_note_submit: "Notiz hinzufügen" - completed_actions: "Erledigte Aufgaben für dieses Projekt" - was_marked_complete: wurde als erledigt markiert - no_default_context: Dieses Projekt hat keinen Standard-Kontext - with_no_default_tags: und hat keine Standard-Tags - edit_project_settings: Projekteinstellungen bearbeiten - default_context: Der Standard-Kontext dieses Projektes ist %{context} - status_project_name_changed: "Projektname geändert" - state: Dieses Projekt ist %{state} - active_projects: Aktive Projekte - states: - hidden_plural: Versteckte - stalled: Veraltet - review_plural: Verschobene - completed: Erledigte - current: Aktuell - review: Datiert - completed_plural: Erledigte - blocked: Blockiert - blocked_plural: Blockierte - stalled_plural: Veraltete - visible_plural: Sichtbare - active_plural: Aktive - visible: Sichtbar - hidden: Versteckt - active: Aktiv - current_plural: Aktuelle - errors: - user_unauthorized: "401 Unauthorized: Nur administrative Benutzer dürfen auf diese Funktion zugreifen." - preferences: - open_id_url: "Deine OpenID-URL lautet:" - change_identity_url: "Ändere deine Identitäts-URL" - staleness_starts_after: Abgestandenheit startet nach %{days} Tagen - page_title: TRACKS::Einstellungen - change_password: "Passwort ändern" - token_description: "Token (für die Verwendung in Feeds und der API)" - title: Deine Einstellungen - is_false: Nein - show_number_completed: "Zeige %{number} erledigte Einträge" - password_changed: "Ihr Passwort geändert wurde, melden Sie sich bitte wieder an." - edit_preferences: Einstellungen bearbeiten - page_title_edit: "TRACKS::Einstellungen ändern" - is_true: Ja - sms_context_none: Keine - generate_new_token: Neues Token generieren - token_header: Dein Token - authentication_header: Deine Authentifizierung - updated: Einstellungen aktualisiert - current_authentication_type: Dein Authentifizierungsart ist %{auth_type} - change_authentication_type: "Authentifzierungsart ändern" - 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." - tabs: - authentication: Authentifizierung - tracks_behavior: Tracks Verhalten - profile: Profil - date_and_time: Datum und Uhrzeit + totals_incomplete_actions: "Du hast %{count} unerledigte Aufgaben" + totals_project_count: "Du hast %{count} Projekte." + totals_tag_count: "Du hast %{count} Tags in Aufgaben." + totals_unique_tags: "Von diesen Tags sind %{count} einmalig." + totals_visible_context_count: "Von diesen sind %{count} sichtbare Kontexte" + within_one: "Innerhalb von 1" + support: + array: + last_word_connector: " und " + two_words_connector: " und " + words_connector: ", " + select: + prompt: "Bitte wählen Sie" time: am: vormittags formats: - stats: "%a %d-%m" default: "%A, %d. %B %Y, %H:%M Uhr" - time: "%H:%M" - short: "%d. %B, %H:%M Uhr" - month_day: "%d. %B" long: "%A, %d. %B %Y, %H:%M Uhr" - pm: nachmittags - date: - month_names: - - - - Januar - - Februar - - "März" - - April - - Mai - - Juni - - Juli - - August - - September - - Oktober - - November - - Dezember - abbr_day_names: - - So - - Mo - - Di - - Mi - - Do - - Fr - - Sa - order: - - :day - - :month - - :year - formats: - only_day: "%e" - longer: "%A, %d. %B %Y" - default: "%d.%m.%Y" - short: "%e. %b" month_day: "%d. %B" - long: "%e. %B %Y" - day_names: - - Sonntag - - Montag - - Dienstag - - Mittwoch - - Donnerstag - - Freitag - - Samstag - abbr_month_names: - - - - Jan - - Feb - - "Mär" - - Apr - - Mai - - Jun - - Jul - - Aug - - Sep - - Okt - - Nov - - Dez - will_paginate: - previous_label: "« Zurück" - page_entries_info: - multi_page: Angezeigte %{model} %{from} - %{to} von %{count} insgesamt - single_page_html: - one: Angezeigte 1 %{model} - other: Anzeige aller %{count} %{model} - zero: Kein %{model} gefunden - single_page: - one: Angezeigte 1 %{model} - other: Anzeige aller %{count} %{model} - zero: Kein %{model} gefunden - multi_page_html: Angezeigte %{model} %{from} - %{to} von %{count} insgesamt - page_gap: ... - next_label: "Nächste »" - support: - array: - words_connector: ", " - last_word_connector: " und " - two_words_connector: " und " - select: - prompt: "Bitte wählen Sie" - footer: - send_feedback: Senden Sie Feedback zu %{version} - shared: - multiple_next_actions: Mehrere neue Aufgaben (eine pro Zeile) - make_actions_dependent: "Aufgaben abhängig machen" - toggle_single: Weitere Aufgabe erstellen - hide_form: Formular verstecken - add_actions: "Aufgaben hinzufügen" - add_action: "Aufgabe hinzufügen" - tags_for_all_actions: "Tags für alle Aufgaben (kommagetrennt)" - toggle_single_title: Eine weitere Aufgabe hinzufügen - project_for_all_actions: "Projekt für alle Aufgaben" - context_for_all_actions: "Kontext für alle Aufgaben" - toggle_multi: "Mehrere Aufgaben hinzufügen" - separate_tags_with_commas: mit Kommas trennen - add_context: "Neuer Kontext" - toggle_multi_title: "Zwischen Einzel- und Mehrfachformular für neue Aufgaben umschalten" - hide_action_form_title: "Formular für neue Aufgaben verstecken" - feedlist: - choose_context: "Kontext für den Feed wählen" - actions_due_today: "Heute oder früher fällig" - ical_feed: iCal-Feed - legend: "Legende:" - all_contexts: Alle Kontexte - rss_feed: RSS-Feed - choose_project: "Projekt für den Feed wählen" - all_projects: Alle Projekte - project_needed: Es muss mindestens ein Projekt existieren, bevor ein Feed abonniert werden kann. - select_feed_for_project: "Feed für dieses Projekt auswählen" - active_projects_wo_next: Aktive Projekte ohne nächste Aufgabe - active_starred_actions: Alle markierten, aktiven Aufgaben - context_needed: Es muss mindestens ein Kontext existieren, bevor ein Feed abonniert werden kann. - select_feed_for_context: "Feed für diesen Kontext auswählen" - projects_and_actions: Aktive Projekte und deren Aufgaben - notice_incomplete_only: "Hinweis: Alle Feeds zeigen nur Aufgaben, die noch nicht als erledigt markiert wurden." - actions_due_next_week: "Nächste Woche fällige Aufgaben" - actions_completed_last_week: In den letzten 7 Tagen erledigte Aufgaben - context_centric_actions: "Feeds für unerledigte Aufgaben in einem bestimmten Kontext" - plain_text_feed: Reintext-Feed - last_fixed_number: Die letzten %{number} Aufgaben - all_actions: Alle Aufgaben - project_centric: "Feeds für unerledigte Aufgaben in einem bestimmten Kontext" - sidebar: - list_name_active_contexts: Aktive Kontexte - list_name_active_projects: Aktive Projekte - list_empty: Keine - list_name_completed_projects: Erledigte Projekte - list_name_hidden_projects: Versteckte Projekte - list_name_hidden_contexts: Versteckte Kontexte + short: "%d. %B, %H:%M Uhr" + stats: "%a %d-%m" + time: "%H:%M" + pm: nachmittags + todos: + action_deleted_error: "Fehler beim Löschen der Aufgabe" + action_deleted_success: "Die nächste Aufgabe erfolgreich gelöscht" + action_due_on: "(Aufgabe fällig am %{date})" + action_marked_complete: "Die Aufgabe '%{description}' wurde als %{completed} markiert." + action_marked_complete_error: "Die Aufgabe '%{description}' wurde aufgrund eines Fehlers NICHT als %{completed} markiert." + action_saved: "Aufgabe gespeichert" + action_saved_to_tickler: "Aufgabe im Notizbuch gespeichert" + add_another_dependency: "Neue Abhängigkeit" + add_new_recurring: "Neue wiederkehrende Aufgabe" + added_dependency: "%{dependency} als Abhängigkeit hinzugefügt." + added_new_context: "Neuer Kontext hinzugefügt" + added_new_next_action: "Neue Aufgabe angelegt" + added_new_next_action_plural: "Neue weiterführende Aufgaben angelegt" + added_new_next_action_singular: "Neue nächste Aufgabe angelegt" + added_new_project: "Neues Projekt hinzugefügt" + all_completed: "Alle erledigten Aufgaben" + all_completed_here: hier + all_completed_tagged_page_title: "TRACKS:: Alle erledigten Aufgaben mit Tag %{tag_name}" + append_in_this_project: "in diesem Projekt" + archived_tasks_title: "TRACKS::Archivierte erledigte Aufgaben" + blocked_by: "Blockiert durch %{predecessors}" + calendar: + due_next_month_and_later: "Im %{month} und später fällig" + due_next_week: "Nächste Woche fällig" + due_this_month: "Im %{month} fällig" + due_this_week: "Diese Woche fällig" + due_today: "Heute fällig" + get_in_ical_format: "Diesen Kalender im iCal Format herunterladen" + no_actions_due_after_this_month: "Nach diesem Monat sind keine Aufgaben fällig" + no_actions_due_next_week: "Keine Aufgaben für die kommende Woche" + no_actions_due_this_month: "Keine Aufgaben für den Rest des Monats" + no_actions_due_today: "Heute sind keine Aufgaben fällig" + calendar_page_title: "TRACKS::Kalender" + cannot_add_dependency_to_completed_todo: "Kann keine Abhängigkeit zu einer erledigten Aufgabe hinzufügen!" + clear_due_date: "Fälligkeitsdatum leeren" + clear_show_from_date: "Datum leeren" + completed: Erledigt + completed_actions: "Erledigte Aufgaben" + completed_actions_with: "Erledigte Aufgaben mit dem Tag %{tag_name}" + completed_in_archive: + one: "Es befindet sich eine erledigte Aufgabe im Archiv." + other: "Es befinden sich %{count} erledigte Aufgaben im Archiv." + completed_last_day: "In den letzten 24 Stunden erledigt" + completed_last_x_days: "In den letzten %{count} Tagen erledigt" + completed_recurrence_completed: "Es gibt keine weitere Aufgabe nach der soeben gelöschten. Die Wiederholung ist abgeschlossen." + completed_recurring: "Erledigte wiederkehrende Aufgaben" + completed_rest_of_month: "Erledigt diesen Monat" + completed_rest_of_previous_month: "Erledigt im Vormonat" + completed_rest_of_week: "Erledigt diese Woche" + completed_tagged_page_title: "TRACKS:: Erledigte Aufgaben mit Tag %{tag_name}" + completed_tasks_title: "TRACKS::Erledigte Aufgaben" + completed_today: "Heute erledigt" + confirm_delete: "Bist du sicher, dass du die Aufgabe '%{description}' löschen möchtest?" + context_changed: "Kontext zu %{name} gewechselt" + convert_to_project: "In Projekt umwandeln" + defer_date_after_due_date: "Zurückstellungsdatum nach Ablaufdatum. Bitte passe das Ablaufdatum an, dass es vor dem Zurückstellungsdatum liegt." + defer_x_days: + one: "Einen Tag zurückstellen" + other: "%{count} Tage zurückstellen" + deferred_actions_with: "Zurückgestellte Aufgaben mit dem Tag '%{tag_name}'" + deferred_pending_actions: "Aufgeschobene und ausstehende Aufgaben" + deferred_tasks_title: "TRACKS::Notizbuch" + delete: Löschen + delete_action: "Aufgabe löschen" + delete_recurring_action_confirm: "Soll die wiederkehrende Aufgabe '%{description}' wirklich gelöscht werden?" + deleted_success: "Die Aufgabe wurde erfolgreich gelöscht." + depends_on: "Hängt ab von" + depends_on_separate_with_commas: "Hängt ab von (kommagetrennt)" + done: Erledigt? + drag_action_title: "Auf andere Aufgabe ziehen, um sie als Abhängigkeit zu definieren" + due: Fällig + edit: Bearbeiten + edit_action: "Aufgabe bearbeiten" + edit_action_with_description: "Aufgabe '%{description}' bearbeiten" + edit_recurring_todo: "Wiederkehrende Aufgabe bearbeiten" + error_completing_todo: "Beim Abschließen/Aktivieren der wiederkehrenden Aufgabe %{description} ist ein Fehler aufgetreten" + error_deleting_item: "Beim Löschen von %{description} trat ein Fehler auf" + error_deleting_recurring: "Beim Löschen der wiederkehrenden Aufgabe %{description} ist ein Fehler aufgetreten" + error_removing_dependency: "Beim Entfernen der Abhängigkeit ist ein Fehler aufgetreten" + error_saving_recurring: "Es gab einen Fehler beim Speichern der wiederkehrenden Aufgabe '%{description}'" + error_starring: "Konnte die Hervorhebung von \\'%{description}\\' nicht durchführen" + error_starring_recurring: "Konnte die Hervorhebung der wiederkehrenden Aufgabe \\'%{description}\\' nicht durchführen" + error_toggle_complete: "Könnte nicht diese Marke todo komplett" + feed_title_in_context: "im Kontext '%{context}'" + feed_title_in_project: "im Projekt '%{project}'" + feeds: + completed: "Erledigt: %{date}" + due: "Fällig: %{date}" + has_x_pending: + one: "Hat eine ausstehende Aufgabe" + other: "Hat %{count} ausstehende Aufgaben" + hidden_actions: "Verstecke Aufgaben" + in_hidden_state: "als versteckt markiert" + in_pending_state: "und als ausstehend markiert" + list_incomplete_next_actions: "Unerledigte Folge-Aufgaben anzeigen" + list_incomplete_next_actions_with_limit: "Zeige die letzten %{count} unerledigten Folge-Aufgaben" + mobile_todos_page_title: "Alle Aufgaben" + new_related_todo_created: "Eine neue Aufgabe wurde hinzugefügt, die zu dieser wiederkehrenden Aufgabe gehört" + new_related_todo_created_short: "hat eine neue Aufgabe" + new_related_todo_not_created_short: "konnte nicht erstellt werden" + next_action_description: "Beschreibung der nächsten Aufgabe" + next_action_needed: "Es muss mindestens eine folgende Aufgabe angelegt werden" + next_actions_description: "Filter:" + next_actions_description_additions: + completed: "In den letzten %{count} Tagen" + due_date: "mit einem Datum %{due_date} oder früher" + next_actions_due_date: + due_in_x_days: "Fällig in %{days} Tagen" + due_today: "Heute fällig" + due_tomorrow: "Fällig morgen" + overdue_by: "Überfällig mit %{days} Tag" + overdue_by_plural: "Überfällig mit %{days} Tagen" + next_actions_title: "TRACKS::Weitere Aufgaben" + next_actions_title_additions: + completed: "Aufgaben erledigt" + due_today: "heute fällig" + due_within_a_week: "diese Woche fällig" + no_actions_due_this_week: "Keine fälligen Aufgaben diese Woche" + no_actions_found: "Momentan gibt es keine unerledigten Aufgaben." + no_actions_found_title: "Keine Aufgaben gefunden" + no_actions_with: "Im Augenblick gibt es keine unerledigten Aufgaben mit dem Tag '%{tag_name}'" + no_completed_actions: "Momentan sind keine erledigten Aufgaben vorhanden." + no_completed_actions_with: "Keine erledigten Aufgaben mit dem Tag '%{tag_name}'" + no_completed_recurring: "Im Augenblick gibt es keine erledigten wiederkehrenden Aufgaben" + no_deferred_actions: "Zur Zeit sind keine zurückgestellten Aufgaben vorhanden." + no_deferred_actions_with: "Keine zurückgestellten Aufgaben mit dem Tag '%{tag_name}'" + no_deferred_pending_actions: "Momentan sind keine aufgeschobenen oder ausstehenden Aufgaben vorhanden." + no_hidden_actions: "Momentan sind keine versteckten Aufgaben vorhanden" + no_incomplete_actions: "Es gibt keine unerledigten Aufgaben" + no_last_completed_actions: "Keine erledigten Aufgaben gefunden" + no_project: "--Kein Projekt--" + no_recurring_todos: "Im Augenblick gibt es keine wiederkehrenden Aufgaben" + older_completed_items: "ältere erledigte Aufgaben" + overdue: überfällig + pending: Ausstehend + recurrence: + daily: Täglich + daily_every_number_day: "Alle %{number} Tage" + daily_options: "Einstellungen tägliche Aufgaben" + day_x_on_every_x_month: "Tag %{day} in jedem %{month}. Monat" + ends_on: "Endet am" + ends_on_date: "Endet am %{date}" + ends_on_number_times: "Endet nach %{number} mal" + every_work_day: "Jeden Arbeitstag" + from_tickler: "Fälligkeitsdatum kommt vom Notizbuch (keine Fälligkeit setzen)" + monthly: Monatlich + monthly_every_xth_day: "Der %{day} %{day_of_week} eines jeden %{month}. Monats" + monthly_options: "Einstellungen für monatliche Aufgaben" + no_end_date: "Kein Enddatum" + pattern: + day_names: + - Sonntag + - Montag + - Dienstag + - Mittwoch + - Donnerstag + - Freitag + - Samstag + due: Fällig + every_day: "jeden Tag" + every_month: "jeden Monat" + every_n: "jeden %{n}" + every_xth_day_of_every_n_months: "jedes %{x} %{day} jedes %{n_months} ?" + every_year_on: "jedes Jahr in %{date}" + first: erste + fourth: vierte + from: von + last: zuletzt + month_names: + - ~ + - Januar + - Februar + - März + - April + - Mai + - Juni + - Juli + - August + - September + - Oktober + - November + - Dezember + on_day_n: "am Tag %{n}" + on_work_days: "an Wochentagen" + second: zweite + show: Show + the_xth_day_of_month: "der %{x} %{day} von %{month}" + third: Drittel + times: "für %{number} Zeiten" + until: bis + weekly: wöchentlich + recurrence_on_due_date: Fälligkeitsdatum + recurrence_on_options: "Setze Wiederholung auf" + show_days_before: "%{days} Tage bevor die Aufgabe fällig ist" + show_option_always: immer + show_options: "Aufgabe anzeigen" + starts_on: "Beginnt am" + weekly: Wöchentlich + weekly_every_number_week: "Kehrt jede %{number}. Woche wieder am" + weekly_options: "Einstellungen wöchentliche Aufgaben" + yearly: Jährlich + yearly_every_x_day: "Jeden %{day}. %{month} " + yearly_every_xth_day: "Den %{day} %{day_of_week} des %{month}" + yearly_options: "Einstellungen jährliche Aufgaben" + recurrence_completed: "Nach dieser erledigten wiederkehrenden Aufgabe folgt keine mehr. Die Wiederholung endet hiermit." + recurrence_period: Wiederholungszeitraum + recurring_action_deleted: "Die Aufgabe wurde gelöscht. Da dies eine wiederkehrende Aufgabe ist, wurde eine neue erstellt." + recurring_action_saved: "Wiederkehrende Aufgabe gespeichert" + recurring_actions_title: "TRACKS::Wiederkehrende Aufgaben" + recurring_deleted_success: "Die wiederkehrende Aufgabe wurde erfolgreich gelöscht." + recurring_pattern_removed: "Das Wiederholungsmuster wurde entfernt %{count}" + recurring_todos: "Wiederkehrende Aufgaben" + remove_dependency: "Abhängigkeit löschen (löscht nicht die Aufgabe)" + removed_predecessor: "%{successor} entfernt als Abhängigkeit von %{predecessor}." + scheduled_overdue: "Planmäßig angezeigt vor %{days} Tagen" + see_all_completed: "Alle erledigten Aufgaben %{link}" + set_to_pending: "%{task} als ausstehend markiert" + show_from: "Anzeigen ab dem" + show_in_days: "Anzeigen in %{days} Tagen" + show_on_date: "Anzeigen am %{date}" + show_today: "Heute anzeigen" + show_tomorrow: "Morgen anzeigen" + star_action: "Aufgabe markieren" + star_action_with_description: "Aufgabe '%{description}' markieren" + tagged_page_title: "TRACKS::Als '%{tag_name}' markiert" + tagged_with: "getagged mit '%{tag_name}'" + tags: "Tags (kommagetrennt)" + task_list_title: "TRACKS::Aufgaben anzeigen" + tickler_items_due: + one: "Ein Notizbuch-Eintrag ist nun fällig - lade die Seite neu, um sie zu sehen." + other: "%{count} Notizbuch-Einträge sind nun fällig - lade die Seite neu, um sie zu sehen." + to_tickler: ", im Notizbuch hinterlegt" + unable_to_add_dependency: "Abhängigkeit nicht hinzufügbar" + unresolved_dependency: "Der Wert, den Sie in die Abhängigkeit Feld eingegeben nicht zu einer bestehenden Aufgabe zu lösen. Dieser Wert wird nicht mit dem Rest der Aufgabe gerettet werden. Weiter gehen?" + was_due_on_date: "war am %{date} fällig" users: - openid_url_verified: Die URL %{url} wurde erfolgreich als Identität verifiziert und Deine Authentifizierung auf OpenID umgestellt. - auth_type_update_error: "Beim ändern der Authentifizierung trat ein Fehler auf: %{error_messages}" - failed_to_delete_user: Löschen des Benutzers %{username} fehlgeschlagen - destroy_successful: "Benutzer %{login} wurde erfolgreich gelöscht" - first_user_heading: "Willkommen bei TRACKS. Als erstes legen Sie bitte einen Administrator-Zugang an:" - total_contexts: Alle Kontexte - successfully_deleted_user: Benutzer %{username} erfolgreich gelöscht. - signup_successful: Benutzer %{username} erfolgreich angelegt. - new_token_generated: Neuer Token erfolgreich generiert - total_projects: Alle Projekte - change_password_submit: "Passwort ändern" - no_signups_title: TRACKS::Anmeldung nicht erlaubt - user_created: Benutzer angelegt. account_signup: Accounteinrichtung - manage_users: Benutzer verwalten - password_updated: Passwort aktualisiert. - auth_type_updated: Authentifizierungs-Art erfolgreich geändert. - total_actions: Alle Aufgaben - desired_login: "Gewünschter Benutzername" - signup: Registrieren - confirm_password: "Passwort bestätigen" - new_user_heading: "Einen neuen Benutzer anlegen:" - password_confirmation_label: "Passwort bestätigen" - destroy_error: "Beim Löschen des Benutzers %{login} ist ein Fehler aufgetreten." - choose_password: "Passwort wählen" - change_password_title: TRACKS::Passwort ändern - change_auth_type_title: TRACKS::Authentifizierungstyp ä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 - register_with_cas: Mit deinem CAS-Benutzernamen - label_auth_type: Authentifizierungsart - total_users_count: Derzeit existieren %{count} Benutzer - new_user_title: TRACKS::Als Administrator anmelden - 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?" - you_have_to_reset_your_password: "Sie haben Ihr Passwort zurücksetzen" - signup_new_user: Neuen Benutzer anlegen - identity_url: Identity-URL - openid_ok_pref_failed: Die URL %{url} wurde erfolgreich als Identität verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf. auth_change_submit: "Authentifizierungsart ändern" + auth_type_update_error: "Beim ändern der Authentifizierung trat ein Fehler auf: %{error_messages}" + auth_type_updated: "Authentifizierungs-Art erfolgreich geändert." + change_auth_type_title: "TRACKS::Authentifizierungstyp ändern" change_authentication_type: "Authentifizierungsart ändern" - total_notes: Alle Notizen + 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." + change_password_submit: "Passwort ändern" + change_password_title: "TRACKS::Passwort ändern" + choose_password: "Passwort wählen" + confirm_password: "Passwort bestätigen" + desired_login: "Gewünschter Benutzername" + 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?" + destroy_error: "Beim Löschen des Benutzers %{login} ist ein Fehler aufgetreten." + destroy_successful: "Benutzer %{login} wurde erfolgreich gelöscht" + destroy_user: "Benutzer löschen" + failed_to_delete_user: "Löschen des Benutzers %{username} fehlgeschlagen" + first_user_heading: "Willkommen bei TRACKS. Als erstes legen Sie bitte einen Administrator-Zugang an:" + identity_url: Identity-URL + label_auth_type: Authentifizierungsart + manage_users: "Benutzer verwalten" + new_password_label: "Neues Passwort" + new_token_generated: "Neuer Token erfolgreich generiert" + new_user_heading: "Einen neuen Benutzer anlegen:" + new_user_title: "TRACKS::Als Administrator anmelden" + no_signups_title: "TRACKS::Anmeldung nicht erlaubt" + openid_ok_pref_failed: "Die URL %{url} wurde erfolgreich als Identität verifiziert, beim Speichern der Einstellungen trat jedoch ein Fehler auf." + openid_url_verified: "Die URL %{url} wurde erfolgreich als Identität verifiziert und Deine Authentifizierung auf OpenID umgestellt." + password_confirmation_label: "Passwort bestätigen" + password_updated: "Passwort aktualisiert." + register_with_cas: "Mit deinem CAS-Benutzernamen" select_authentication_type: "Wähle deine neue Authentifizierungsart und klicke 'Authentifizierungsart ändern' an, um deine aktuellen Einstellungen zu überschreiben." - contexts: - delete_context_title: Kontext löschen - all_completed_tasks_title: "TRACKS:: Alle erledigten Aufgaben im Kontext '%{context_name}'" - hide_form: Formular verstecken - show_form_title: Neuen Kontext erstellen - todos_append: in diesem Kontext - delete_context_confirmation: Soll der Kontext '%{name}' wirklich gelöscht werden? Alle (wiederkehrenden) Aufgaben dieses Kontexts werden hierdurch ebenfalls gelöscht. - delete_context: Kontext löschen - edit_context: Kontext bearbeiten - hide_form_title: Formular für neuen Kontext verstecken - hidden_contexts: Versteckte Kontexte - no_contexts_active: Derzeit gibt es keine aktiven Kontexte - context_hide: Auf Startseite ausblenden? - add_context: "Kontext hinzufügen" - show_form: Neuen Kontext erstellen - save_status_message: Kontext gespeichert - visible_contexts: Sichtbare Kontexte - update_status_message: "Kontextname wurde geändert" - context_name: Kontextname - status_active: Kontext ist aktiv - completed_tasks_title: "TRACKS:: Erledigte Aufgaben im Kontext '%{context_name}'" - new_context_post: "' wird ebenfalls angelegt. Fortfahren?" - new_context_pre: Der neue Kontext ' - no_actions: "Momentan gibt es keine unerledigten Aufgaben in diesem Kontext" - last_completed_in_context: in diesem Kontext (letzte %{number}) - context_deleted: "Gelöschter Kontext '%{name}'" - no_contexts_hidden: Derzeit gibt es keine versteckten Kontexte - status_hidden: Kontext ist versteckt - login: - openid_identity_url_not_found: "Sorry, aber es existiert kein Benutzer mit der Identitäts-URL (%{identity_url})" - user_no_expiry: Angemeldet bleiben - sign_in: Anmeldung - login_cas: zum CAS gehen - cas_no_user_found: Hallo, %{username}! Du hast leider keinen Tracks-Account. - cas_login: CAS-Anmeldung - successful_with_session_info: "Anmeldung erfolgreich:" - please_login: Bitte melde dich an, um Tracks zu nutzen - cas_logged_in_greeting: Hallo, %{username}! Du bist authentifiziert. - cas_username_not_found: Sorry, aber es existiert kein Benutzer mit dem CAS-Benutzernamen (%{username}) - cas_create_account: "Wenn du die Anfrage fortsetzen möchtest, klicke bitte hier: %{signup_link}" - mobile_use_openid: "…oder mit einer OpenID anmelden" - cas_signup_link: Account beantragen - account_login: Account-Anmeldung - successful: "Anmeldung erfolgreich. Willkommen zurück!" - session_will_not_expire: Sitzung wird nicht ablaufen. - option_separator: oder, - session_time_out: Sitzung abgelaufen. Bitte %{link} - session_will_expire: "Sitzung wird nach %{hours} Stunde(n) der Inaktivität ablaufen." - login_standard: "zurück zum Standard-Login" - login_with_openid: Mit einer OpenID anmelden - unsuccessful: Anmeldung war nicht erfolgreich. - log_in_again: Erneut anmelden. - logged_out: Sie wurden von Tracks abgemeldet. - datetime: - prompts: - minute: Minuten - second: Sekunden - month: Monat - hour: Stunden - day: Tag - year: Jahr - distance_in_words: - less_than_x_minutes: - one: weniger als eine Minute - other: weniger als %{count} Minuten - zero: weniger als 1 Minute - almost_x_years: - one: fast 1 Jahr - other: fast %{count} Jahre - x_days: - one: 1 Tag - other: "%{count} Tage" - x_seconds: - one: 1 Sekunde - other: "%{count} Sekunden" - about_x_hours: - one: etwa 1 Stunde - other: etwa %{count} Stunden - less_than_x_seconds: - one: weniger als 1 Sekunde - other: weniger als %{count} Sekunden - zero: weniger als 1 Sekunde - x_months: - one: 1 Monat - other: "%{count} Monate" - x_minutes: - one: 1 Minute - other: "%{count} Minuten" - about_x_years: - one: etwa 1 Jahr - other: etwa %{count} Jahre - about_x_months: - one: etwa 1 Monat - other: etwa %{count} Monate - over_x_years: - one: mehr als 1 Jahr - other: mehr als %{count} Jahre - half_a_minute: eine halbe Minute - search: - contexts_matching_query: Kontexte entsprechen der Suche - tags_matching_query: Tags entsprechen der Suche - 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 + signup: Registrieren + signup_new_user: "Neuen Benutzer anlegen" + signup_successful: "Benutzer %{username} erfolgreich angelegt." + successfully_deleted_user: "Benutzer %{username} erfolgreich gelöscht." + total_actions: "Alle Aufgaben" + total_contexts: "Alle Kontexte" + total_notes: "Alle Notizen" + total_projects: "Alle Projekte" + total_users_count: "Derzeit existieren %{count} Benutzer" + user_created: "Benutzer angelegt." + you_have_to_reset_your_password: "Sie haben Ihr Passwort zurücksetzen" + will_paginate: + next_label: "Nächste »" + page_entries_info: + multi_page: "Angezeigte %{model} %{from} - %{to} von %{count} insgesamt" + multi_page_html: "Angezeigte %{model} %{from} - %{to} von %{count} insgesamt" + single_page: + one: "Angezeigte 1 %{model}" + other: "Anzeige aller %{count} %{model}" + zero: "Kein %{model} gefunden" + single_page_html: + one: "Angezeigte 1 %{model}" + other: "Anzeige aller %{count} %{model}" + zero: "Kein %{model} gefunden" + page_gap: "..." + previous_label: "« Zurück" diff --git a/config/locales/es.yml b/config/locales/es.yml index 470c2a64..81768727 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1,984 +1,977 @@ --- es: - layouts: - toggle_contexts_title: "Haga contextos se derrumbó (in)visible" - toggle_contexts: "Cambiar los contextos se derrumbó" - toggle_notes: Activar/Desactivar notas - next_actions_rss_feed: RSS feed of next actions - toggle_notes_title: Activar/Desactivar todas las notas - mobile_navigation: - new_action: Nueva tarea - logout: "Cerrar sesión" - feeds: Feeds - starred: avoritos - projects: Proyectos - tickler: Tickler - contexts: Contextos - home: Inicio - navigation: - manage_users_title: "Añadir o eliminar usuarios" - recurring_todos: Tareas repetitivas - api_docs: REST API Docs - help: "?" - feeds: Feeds - starred: Estrellas - stats: "Estadísticas" - notes_title: Mostrar todas las notas - manage_users: Administrar usuarios - tickler_title: Tickler - admin: Admin - preferences: Preferencias - integrations_: Integrar Tracks - export_title: Import and export data - calendar_title: Calendario de las acciones por - feeds_title: See a list of available feeds - stats_title: See your statistics - tickler: Tickler - home_title: Inicio - starred_title: See your starred actions - recurring_todos_title: Manage recurring actions - completed_tasks: Hecho - view: Ver - organize: Organizar - completed_tasks_title: Completed - home: Inicio - export: Export - contexts_title: Contexts - preferences_title: Mostrar mis preferencias - search: Search All Items - review_title: "Posibilidad de una revisión" - projects_title: Proyectos - calendar: Calendario - number: - format: - separator: . - delimiter: "," - human: - storage_units: - format: "%n %u" - units: - kb: KB - tb: Tuberculosis - gb: GB - byte: - one: Byte - other: Bytes - mb: MB - currency: - format: - format: "%u%n" - unit: "€" - separator: . - delimiter: "," - common: - recurring_todos: "Repetición de acciones" - back: "Atrás" - actions: Tareas - third: Tercero - add: "Añadir" - previous: Anterior - go_back: "Volver atrás" - logout: Salir - second: Segundo - optional: opcional - week: semana - none: Ninguno - deferred: pospuestas - show_all: Mostrar todo - cancel: Cancelar - month: mes - actions_midsentence: - one: tarea - other: tareas - zero: tareas - notes: Notas - server_error: Ha ocurrido un error en el servidor. - forum: Foro - projects: Proyectos - last: "Último" - review: "Revisión" - action: Tarea - days_midsentence: - one: "día" - other: "días" - zero: "días" - project: Proyecto - contribute: Contribuir - ok: Ok - website: Website - first: Primero - note: - one: 1 nota - other: "%{count} notas" - zero: 0 notas - numbered_step: Paso %{number} - sort: - by_task_count_title: "Ordenar por número de tareas" - by_task_count_title_confirm: "¿Está seguro que desea ordenar los proyectos por el número de tareas? Esto reemplazará el orden existente." - alphabetically: "Alfabéticamente" - sort: Ordenar - alphabetically_title: "Proyectos de ordenar alfabéticamente" - alphabetically_confirm: "¿Está seguro que desea ordenar los proyectos por orden alfabético? Esto reemplazará el orden existente." - by_task_count: "Por número de tareas" - create: Crear - todo: Todo - months: meses - errors_with_fields: "Ha habido problemas con los siguientes campos:" - description: "Descripción" - fourth: Cuarto - next: "Próximo" - drag_handle: ARRASTRAR - contexts: Contextos - context: Contexto - bugs: Errores - update: Actualizar - weeks: semanas - forth: Siguiente - wiki: Wiki - email: Email - ajaxError: Hubo un error al recuperar desde el servidor - search: Buscar - not_available_abbr: n/e - integrations: - opensearch_description: Buscar en las Tracks - applescript_next_action_prompt: "Descripción de la próxima tarea:" - gmail_description: "Gadget para añadir pistas a Gmail como un gadget" - applescript_success_after_id: creado - applescript_success_before_id: "Nueva acción junto con la identificación" activerecord: attributes: - project: - name: Nombre - default_tags: "Etiquetas estándar" - default_context_name: Default contexto - description: "Descripción" note: - created_at: Creado el - updated_at: actualizado a las - todo: - show_from: Mostrar - predecessors: Depende de la - notes: Notas - tags: Etiquetas - project: Proyecto - description: "Descripción" - context: Contexto - due: "Fecha límite" + created_at: "Creado el" + updated_at: "actualizado a las" preference: - show_hidden_projects_in_sidebar: Mostrar proyectos ocultos en el lateral - show_hidden_contexts_in_sidebar: Mostrar los contextos ocultos en el lateral - date_format: Formato de fecha - sms_context: Contexto por defecto para el email - verbose_action_descriptors: "Descriptores detallado de acción" - staleness_starts: Comienzo de estancamiento - mobile_todos_per_page: "Tareas por página (Vista Móvil)" - show_number_completed: "Mostrar número de tareas completadas" - title_date_format: "Título del formato de fecha" - refresh: "Intervalo de actualización (en minutos)" - week_starts: La semana comienza - last_name: Apellido - due_style: Debido al estilo - locale: Lugar - time_zone: Zona horaria - sms_email: Email origen - show_project_on_todo_done: "Ir a la página del proyecto al completar la tarea" - show_completed_projects_in_sidebar: Show completed projects in sidebar + date_format: "Formato de fecha" + due_style: "Debido al estilo" first_name: Nombre - review_period: "Intervalo de revisión del proyecto" - user: last_name: Apellido - first_name: Primer nombre + locale: Lugar + mobile_todos_per_page: "Tareas por página (Vista Móvil)" + refresh: "Intervalo de actualización (en minutos)" + review_period: "Intervalo de revisión del proyecto" + show_completed_projects_in_sidebar: "Show completed projects in sidebar" + show_hidden_contexts_in_sidebar: "Mostrar los contextos ocultos en el lateral" + show_hidden_projects_in_sidebar: "Mostrar proyectos ocultos en el lateral" + show_number_completed: "Mostrar número de tareas completadas" + show_project_on_todo_done: "Ir a la página del proyecto al completar la tarea" + sms_context: "Contexto por defecto para el email" + sms_email: "Email origen" + staleness_starts: "Comienzo de estancamiento" + time_zone: "Zona horaria" + title_date_format: "Título del formato de fecha" + verbose_action_descriptors: "Descriptores detallado de acción" + week_starts: "La semana comienza" + project: + default_context_name: "Default contexto" + default_tags: "Etiquetas estándar" + description: Descripción + name: Nombre + todo: + context: Contexto + description: Descripción + due: "Fecha límite" + notes: Notas + predecessors: "Depende de la" + project: Proyecto + show_from: Mostrar + tags: Etiquetas + user: + first_name: "Primer nombre" + last_name: Apellido errors: + full_messages: + format: "%{attribute} %{message}" + messages: + accepted: "debe ser aceptada" + blank: "no puede estar en blanco" + confirmation: "no coincide con la confirmación" + empty: "no puede estar vacío" + equal_to: "debe ser igual a %{count}" + even: "debe ser aún" + exclusion: "está reservado" + greater_than: "debe ser mayor que %{count}" + greater_than_or_equal_to: "debe ser mayor que o igual a %{count}" + inclusion: "no está incluido en la lista" + invalid: "no puede contener el carácter de coma (',')" + less_than: "debe ser menor que %{count}" + less_than_or_equal_to: "debe ser menor o igual a %{count}" + not_a_number: "no es un número" + odd: "tiene que ser impar" + taken: "Ya se ha dado" + too_long: "es demasiado largo (el máximo es %{count} caracteres)" + too_short: "es demasiado corto (mínimo %{count} caracteres)" + wrong_length: "es la longitud del mal (debe ser %{count} caracteres)" models: project: attributes: name: - blank: proyecto debe tener un nombre - too_long: El nombre del proyecto tiene que tener menos de 256 caracteres - taken: ya existe - messages: - record_invalid: "La validación ha fallado: %{errores}" - greater_than_or_equal_to: debe ser mayor que o igual a %{count} - confirmation: "no coincide con la confirmación" - less_than_or_equal_to: debe ser menor o igual a %{count} - blank: no puede estar en blanco - exclusion: "está reservado" - invalid: "no puede contener el carácter de coma (',')" - odd: tiene que ser impar - even: "debe ser aún" - empty: "no puede estar vacío" - too_short: "es demasiado corto (mínimo %{count} caracteres)" - wrong_length: es la longitud del mal (debe ser %{count} caracteres) - less_than: debe ser menor que %{count} - greater_than: debe ser mayor que %{count} - equal_to: debe ser igual a %{count} - accepted: debe ser aceptada - too_long: "es demasiado largo (el máximo es %{count} caracteres)" - taken: Ya se ha dado - inclusion: "no está incluido en la lista" - not_a_number: "no es un número" + blank: "proyecto debe tener un nombre" + taken: "ya existe" + too_long: "El nombre del proyecto tiene que tener menos de 256 caracteres" template: body: "Hubo problemas con los campos siguientes:" header: - one: Un error esta prohibido %{model} se guarden + one: "Un error esta prohibido %{model} se guarden" other: "%{count} errores prohíbe este %{model} que se guarden" - full_messages: - format: "%{attribute} %{message}" - data: - import_successful: "Importación se realizó correctamente." - import_errors: "Han ocurrido algunos errores durante la importación" - models: - project: - feed_title: Tracks Projects - feed_description: Lists all the projects for %{username} - todo: - error_date_must_be_future: must be a date in the future - preference: - due_on: Due on %{date} - due_in: Due in %{days} days - due_styles: - - Due in ___ days - - Due on _______ - user: - error_context_not_associated: Context id %{context} not associated with user id %{user}. - error_project_not_associated: Project id %{project} not associated with user id %{user}. - stats: - actions_min_max_completion_days: The Max-/minimum days to complete is %{min}/%{max}. - totals_hidden_context_count: and %{count} are hidden contexts. - actions_avg_created: In the last 12 months you created on average %{count} actions - totals_actions_completed: "%{count} of these are completed." - tag_cloud_title: Tag cloud for all actions - actions_actions_avg_created_30days: In the last 30 days you created on average %{count} actions - actions_avg_completed: and completed an average of %{count} actions per month. - top5_visible_contexts_with_incomplete_actions: Top 5 visible contexts with incomplete actions - actions: Actions - time_of_day_legend: - number_of_actions: "Número de tareas" - time_of_day: Time of day - totals_incomplete_actions: You have %{count} incomplete actions - totals_deferred_actions: of which %{count} are deferred actions in the tickler - running_time_legend: - actions: Tareas - percentage: Percentage - weeks: Running time of an action (weeks). Click on a bar for more info - totals_action_count: you have a total of %{count} actions - tag_cloud_90days_title: Tag cloud actions in past 90 days - actions_avg_completion_time: Of all your completed actions, the average time to complete is %{count} days. - tod30: Time of day (last 30 days) - tags: Tags - projects: Projects - totals_completed_project_count: and %{count} are completed projects. - labels: - month_avg_completed: "%{months} Month avg completed" - completed: Completed - month_avg_created: "%{months} Month avg created" - avg_created: Avg created - avg_completed: Avg completed - created: Created - actions_selected_from_week: "Actions selected from week " - actions_day_of_week_title: Day of week (all actions) - actions_lastyear_title: Actions in the last 12 months - open_per_week: "Próximas acciones activas (visibles y ocultas) a la semana" - action_selection_title: TRACKS::Action selection - totals_project_count: You have %{count} projects. - legend: - number_of_days: Number of days ago - actions: Tareas - number_of_actions: "Número de tareas" - day_of_week: Day of week - running_time: Running time of an action (weeks) - percentage: Percentage - months_ago: Months ago - current_running_time_of_incomplete_visible_actions: Current running time of incomplete visible actions - tod30_legend: - number_of_actions: "Número de tareas" - time_of_day: Time of day - totals_context_count: You have %{count} contexts. - open_per_week_legend: - actions: Acciones - weeks: "Semanas atrás" - actions_last_year_legend: - number_of_actions: Number of actions - months_ago: Months ago - top5_contexts: Top 5 contexts - top10_projects: Top 10 projects - contexts: Contexts - totals: Totals - click_to_return: Click %{link} to return to the statistics page. - tag_cloud_90days_description: This tag cloud includes tags of actions that were created or completed in the past 90 days. - totals_visible_context_count: Of those %{count} are visible contexts - top10_projects_30days: Top 10 project in past 30 days - running_time_all: Current running time of all incomplete actions - actions_min_completion_time: The minimum time to complete is %{time}. - action_completion_time_title: Completion time (all completed actions) - click_to_show_actions_from_week: Click %{link} to show the actions from week %{week} and further. - top10_longrunning: Top 10 longest running projects - no_actions_selected: No hay tareas seleccionadas. - totals_tag_count: You have %{count} tags placed on actions. - actions_further: " and further" - actions_dow_30days_legend: - number_of_actions: "Número de acciones" - day_of_week: "Día de la semana" - totals_first_action: Since your first action on %{date} - tag_cloud_description: This tag cloud includes tags of all actions (completed, not completed, visible and/or hidden) - spread_of_actions_for_all_context: Spread of actions for all context - click_to_update_actions: Click on a bar in the chart to update the actions below. - click_to_return_link: here - more_stats_will_appear: More statistics will appear here once you have added some actions. - actions_avg_completed_30days: and completed an average of %{count} actions per day. - actions_30days_title: Actions in the last 30 days - no_tags_available: no tags available - index_title: "TRACKS::Estadística" - actions_dow_30days_title: Day of week (past 30 days) - actions_day_of_week_legend: - number_of_actions: "Número de acciones" - day_of_week: "Día de la semana" - within_one: Dentro de un - spread_of_running_actions_for_visible_contexts: Spread of running actions for visible contexts - actions_last_year: Actions in the last years - totals_blocked_actions: "%{count} are dependent on the completion of their actions." - totals_unique_tags: Of those tags, %{count} are unique. - totals_active_project_count: Of those %{count} are active projects - running_time_all_legend: - actions: Tareas - running_time: Running time of an action (weeks). Click on a bar for more info - percentage: Percentage - other_actions_label: (otros) - totals_hidden_project_count: "%{count} are hidden" - time_of_day: Time of day (all actions) - todos: - recurring_action_deleted: Action was deleted. Because this action is recurring, a new action was added - show_from: Show from - error_starring_recurring: Could not toggle the star of recurring todo \'%{description}\' - completed_actions: Completed actions - added_new_next_action: Added new next action - completed_recurring: Completed recurring todos - completed_rest_of_previous_month: Completado en el resto del mes anterior - blocked_by: Blocked by %{predecessors} - star_action: Star this action - completed_recurrence_completed: There is no next action after the recurring action you just deleted. The recurrence is completed - defer_date_after_due_date: Defer date is after due date. Please edit and adjust due date before deferring. - unable_to_add_dependency: Unable to add dependency - done: Done? - star_action_with_description: star the action '%{description}' - tagged_with: tagged with ‘%{tag_name}’ - completed: Completed - no_deferred_actions_with: No deferred actions with the tag '%{tag_name}' - no_hidden_actions: Currently there are no hidden actions found - edit_action_with_description: Edit the action '%{description}' - action_due_on: (action due on %{date}) - list_incomplete_next_actions: Lista las siguientes tareas incompletas - archived_tasks_title: TRACKS::Archived completed tasks - remove_dependency: Remove dependency (does not delete the action) - action_deleted_success: Successfully deleted next action - tags: Tags (separate with commas) - delete_recurring_action_title: Delete the recurring action - context_changed: Context changed to %{name} - new_related_todo_created: "Una nueva tarea fue añadida y que pertenece a esta tarea recurrente" - mobile_todos_page_title: Todas las tareas - add_another_dependency: Add another dependency - removed_predecessor: Removed %{successor} as dependency from %{predecessor}. - recurring_actions_title: TRACKS::Recurring Actions - next_action_needed: You need to submit at least one next action - action_saved: Action saved - scheduled_overdue: Scheduled to show %{days} days ago - action_deleted_error: Failed to delete the action - edit_action: Edit action - added_new_context: Added new context - next_actions_description: "Filter:" - list_incomplete_next_actions_with_limit: Lists the last %{count} incomplete next actions - set_to_pending: "%{task} set to pending" - added_new_project: Added new project - next_actions_title_additions: - completed: actions completed - due_today: due today - due_within_a_week: due within a week - older_completed_items: Older completed items - no_actions_due_this_week: No actions due in rest of this week - all_completed_here: "aquí" - append_in_this_project: in this project - edit_recurring_todo: "Editar la acción de repetición" - error_deleting_item: There was an error deleting the item %{description} - task_list_title: TRACKS::List tasks - no_recurring_todos: Currently there are no recurring todos - error_completing_todo: There was an error completing / activating the recurring todo %{description} - recurring_pattern_removed: "El patrón de repetición se retira de %{count}" - convert_to_project: Make project - no_deferred_pending_actions: Currently there are no deferred or pending actions - delete_recurring_action_confirm: Are you sure that you want to delete the recurring action '%{description}'? - completed_last_day: Completed in the last 24 hours - feed_title_in_context: in context '%{context}' - no_project: --No project-- - show_in_days: Show in %{days} days - error_saving_recurring: There was an error saving the recurring todo \'%{description}\' - completed_more_than_x_days_ago: Completed more than %{count} days ago - new_related_todo_created_short: creada una nueva tarea - all_completed: Todas las acciones realizadas - edit: Edit - completed_actions_with: Completed actions with the tag %{tag_name} - older_than_days: Older than %{count} days - completed_tagged_page_title: "TRACKS:: Las tareas completadas con etiqueta %{tag_name}" - pending: Pending - completed_tasks_title: TRACKS::Completed tasks - deleted_success: The action was deleted succesfully. - feed_title_in_project: in project '%{project}' - clear_due_date: Clear due date - error_removing_dependency: There was an error removing the dependency - hidden_actions: Tareas ocultas - was_due_on_date: was due on %{date} - show_on_date: Show on %{date} - recurrence_period: Recurrence period - deferred_actions_with: Deferred actions with the tag '%{tag_name}' - confirm_delete: Are you sure that you want to delete the action '%{description}'? - recurring_deleted_success: The recurring action was deleted succesfully. - no_completed_actions_with: No completed actions with the tag '%{tag_name}' - next_actions_title: Tracks - Next Actions - next_action_description: "Descripción de la nueva tarea" - deferred_tasks_title: TRACKS::Tickler - clear_show_from_date: Clear show from date - in_hidden_state: en estado oculto - see_all_completed: Usted puede ver todas las acciones realizadas %{link} - calendar_page_title: TRACKS::Calendar - unresolved_dependency: The value you entered in the dependency field did not resolve to an existing action. This value will not be saved with the rest of the action. Continue? - no_actions_found_title: No actions found - show_today: Show Today - next_actions_due_date: - overdue_by: Overdue by %{days} day - due_in_x_days: "Vence en %{days} días" - due_today: Vence hoy - overdue_by_plural: Overdue by %{days} days - due_tomorrow: "Vence mañana" - completed_last_x_days: Completed in last %{count} days - no_actions_with: Currently there are no incomplete actions with the tag '%{tag_name}' - defer_x_days: - one: Defer one day - other: Defer %{count} days - added_new_next_action_singular: Added new next action - no_completed_actions: Currently there are no completed actions. - deferred_pending_actions: Deferred/pending actions - has_x_pending: - one: Tiene una tarea pendiente - other: Tiene %{count} tareas pendientes - feeds: - completed: "Completed: %{date}" - due: "Due: %{date}" - recurring_todos: Recurring todos - error_deleting_recurring: There was an error deleting the recurring todo \'%{description}\' - delete_action: Delete action - delete: Delete - no_last_completed_actions: "No encontró las acciones realizadas" - drag_action_title: Drag onto another action to make it depend on that action - cannot_add_dependency_to_completed_todo: Cannot add this action as a dependency to a completed action! - depends_on: Depends on - tickler_items_due: - one: One tickler item is now due - refresh the page to see it. - other: "%{count} tickler items are now due - refresh the page to see them." - action_marked_complete: The action '%{description}' was marked as %{completed} - completed_today: Completed Today - added_new_next_action_plural: Added new next actions - new_related_todo_not_created_short: "no se creó la tarea" - completed_rest_of_week: Completado en el resto de esta semana - show_tomorrow: Show Tomorrow - error_starring: Could not toggle the star of this todo \'%{description}\' - calendar: - get_in_ical_format: Get this calendar in iCal format - due_next_week: Due next week - no_actions_due_next_week: No actions due in next week - due_this_week: Due in rest of this week - no_actions_due_today: No actions due today - due_today: Due today - due_next_month_and_later: Due in %{month} and later - no_actions_due_after_this_month: No actions due after this month - no_actions_due_this_month: No actions due in rest of this month - due_this_month: Due in rest of %{month} - no_completed_recurring: Currently there are no completed recurring todos - recurrence: - ends_on_date: Ends on %{date} - every_work_day: Every work day - ends_on_number_times: Ends after %{number} times - recurrence_on_due_date: the date that the todo is due - weekly_options: Settings for weekly recurring actions - weekly: Weekly - monthly_options: Settings for monthly recurring actions - daily_options: Settings for daily recurring actions - monthly: Monthly - starts_on: Starts on - daily: Daily - show_option_always: always - pattern: - third: third - month_names: - - - - January - - February - - Match - - April - - May - - June - - July - - August - - September - - October - - November - - December - every_n: every %{n} - second: second - every_xth_day_of_every_n_months: every %{x} %{day} of every %{n_months} - on_day_n: on day %{n} - weekly: weekly - from: from - last: last - every_day: every day - the_xth_day_of_month: the %{x} %{day} of %{month} - times: for %{number} times - first: first - show: show - every_year_on: every year on %{date} - on_work_days: on work days - day_names: - - sunday - - monday - - tuesday - - wednesday - - thursday - - friday - - saturday - fourth: fourth - due: due - every_month: every month - until: until - yearly_every_x_day: Every %{month} %{day} - recurrence_on_options: Set recurrence on - daily_every_number_day: Every %{number} day(s) - show_options: Show the todo - weekly_every_number_week: Returns every %{number} week on - ends_on: Ends on - show_days_before: "%{days} days before the todo is due" - from_tickler: the date todo comes from tickler (no due date set) - no_end_date: No end date - day_x_on_every_x_month: Day %{day} on every %{month} month - yearly_every_xth_day: The %{day} %{day_of_week} of %{month} - yearly_options: Settings for yearly recurring actions - yearly: Yearly - monthly_every_xth_day: The %{day} %{day_of_week} of every %{month} month - action_deferred: "La acción \\'%{description}\\' se aplazó" - tagged_page_title: TRACKS::Tagged with '%{tag_name}' - added_dependency: Added %{dependency} as dependency. - completed_rest_of_month: Completado en el resto de este mes - all_completed_tagged_page_title: "TRACKS:: Todas las tareas realizadas con etiqueta %{tag_name}" - no_deferred_actions: Currently there are no deferred actions. - recurrence_completed: There is no next action after the recurring action you just finished. The recurrence is completed - action_marked_complete_error: The action '%{description}' was NOT marked as %{completed} due to an error on the server. - no_actions_found: Currently there are no incomplete actions. - in_pending_state: en estado pendiente - error_toggle_complete: Could not mark this todo complete - due: "Fecha límite" - no_incomplete_actions: There are no incomplete actions - action_saved_to_tickler: Action saved to tickler - recurring_action_saved: Recurring action saved - depends_on_separate_with_commas: Depende de (separar con comas) - completed_in_archive: - one: There is one completed action in the archive. - other: There are %{count} completed actions in the archive. - to_tickler: to tickler - next_actions_description_additions: - completed: in the last %{count} days - due_date: with a due date %{due_date} or earlier - overdue: Overdue - add_new_recurring: Add a new recurring action - notes: - delete_note_title: Delete the note '%{id}' - delete_confirmation: Are you sure that you want to delete the note '%{id}'? - in_project: "En:" - delete_item_title: Delete item - deleted_note: Deleted note '%{id}' - note_link_title: Show note %{id} - show_note_title: Show note - edit_item_title: Edit item - note_location_link: "In:" - no_notes_available: "Currently there are no notes: add notes to projects from individual project pages." - note_header: Note %{id} - delete_note_confirm: Are you sure that you want to delete the note '%{id}'? - projects: - default_context_set: Set project's default context to %{default_context} - no_actions_in_project: Currently there are no incomplete actions in this project - deferred_actions: Tareas pospuestas para este proyecto - was_marked_hidden: has been marked as hidden - edit_project_title: Editar proyecto - default_tags_removed_notice: Removed the default tags - page_title: "TRACKS::Project: %{project}" - all_completed_tasks_title: "TRACKS:: Lista de todas las acciones terminado en '%{project_name}' Proyecto" - hide_form: Esconder formulario - list_completed_projects: "TRACKS:: Lista de Proyectos Realizados" - no_notes_attached: Currently there are no notes attached to this project - to_new_project_page: Take me to the new project page - show_form_title: Create a new project - deferred_actions_empty: There are no deferred actions for this project - project_state: Project is %{state}. - this_project: This project - no_last_completed_projects: No hay proyectos terminados encontrado - no_last_completed_recurring_todos: No se ha completado las acciones repetitivas que se encuentran - notes: Notes - todos_append: in this project - list_reviews: "TRACKS::Revisión" - notes_empty: There are no notes for this project - no_projects: Currently there are no projects - hide_form_title: Hide new project form - delete_project: Delete project - completed_actions_empty: No hay tareas completadas para este proyecto - with_no_default_context: with no default context - delete_project_confirmation: Are you sure that you want to delete the project '%{name}'? - with_default_context: with a default context of '%{context_name}' - show_form: Add a project - actions_in_project_title: Actions in this project - completed_projects: Proyectos completados - is_active: "está activo" - add_note: "Añadir una nota" - set_default_tags_notice: Set project's default tags to %{default_tags} - add_project: "Añadir Proyecto" - settings: Settings - project_saved_status: Project saved - list_projects: TRACKS::Lista de Proyectos - with_default_tags: and with '%{tags}' as the default tags - completed_tasks_title: "TRACKS:: Lista de Acciones completadas en '%{project_name}' Proyecto" - hidden_projects: Proyectos ocultos - delete_project_title: Delete the project - default_context_removed: Eliminado el contexto por defecto - add_note_submit: "Añadir nota" - completed_actions: Tareas completadas para este proyecto - was_marked_complete: has been marked as completed - no_default_context: Este proyecto no tiene un contexto por defecto - with_no_default_tags: and with no default tags - default_context: The default context for this project is %{context} - edit_project_settings: Edit Project Settings - status_project_name_changed: Name of project was changed - state: This project is %{state} - active_projects: Active projects - states: - hidden_plural: Hidden - stalled: Estancado - review_plural: Fechado - completed: Completed - current: "Hasta al día" - review: Fechado - completed_plural: Completed - blocked: Bloqueado - blocked_plural: Bloqueado - stalled_plural: Estancado - visible_plural: Visible - active_plural: Active - visible: Visible - hidden: Hidden - active: Active - current_plural: "Hasta al día" - errors: - user_unauthorized: "401 No autorizado: Solo los usuarios administrativos pueden acceder a esta función." - preferences: - open_id_url: Your OpenID URL is - change_identity_url: Change Your Identity URL - staleness_starts_after: Staleness starts after %{days} days - page_title: TRACKS::Preferences - change_password: Change your password - token_description: Token (for feeds and API use) - title: Your preferences - is_false: "false" - show_number_completed: Show %{number} completed items - password_changed: "Que ha cambiado la contraseña, por favor vuelve a iniciar sesión." - edit_preferences: Edit preferences - page_title_edit: TRACKS::Edit Preferences - is_true: "true" - sms_context_none: None - generate_new_token: Generate a new token - token_header: Your token - authentication_header: Your authentication - updated: "Las preferencias de actualización" - current_authentication_type: Your authentication type is %{auth_type} - change_authentication_type: Change your authentication type - generate_new_token_confirm: Are you sure? Generating a new token will replace the existing one and break any external usages of this token. - tabs: - authentication: "Autenticación" - tracks_behavior: Rastrea el comportamiento de - profile: Perfil - date_and_time: Fecha y hora - time: - am: soy - formats: - stats: "%a %d-%m" - default: "%a, %d %b %Y %H:%M:%S %z" - time: "" - short: "%d %b %H:%M" - month_day: "%B %d" - long: "%B %d, %Y %H:%M" - pm: pm - date: - month_names: - - - - Enero - - Febrero - - Marzo - - Abril - - Mayo - - Junio - - Julio - - Agosto - - Septiembre - - Octubre - - Noviembre - - Diciembre - abbr_day_names: - - Dom - - Lun - - Mar - - Mie - - Jue - - Vie - - Sab - formats: - only_day: "" - longer: "%A, %d %b %Y" - default: "%Y-%m-%d" - short: "%b %d" - month_day: "" - long: "%B %d, %Y" - day_names: - - Domingo - - Lunes - - Martes - - "Miércoles" - - Jueves - - Viernes - - "Sábado" - abbr_month_names: - - - - Ene - - Feb - - Mar - - Abr - - May - - Jun - - Jul - - Ago - - Sep - - Oct - - Nov - - Dic - will_paginate: - previous_label: "« Anterior" - page_entries_info: - multi_page: Viendo %{model} {%from} - %{to} de %{count} en el total de - single_page_html: - one: Viendo del 1 %{model} - other: Viendo todos los %{count} %{model} - zero: No %{model} encontrado - single_page: - one: Viendo del 1 %{model} - other: Viendo todos los %{count} %{model} - zero: No %{model} encontrado - multi_page_html: Viendo %{model} %{from} - %{to} de %{count} en el total de - page_gap: ... - next_label: "Siguiente »" - support: - array: - words_connector: "," - last_word_connector: ", y" - two_words_connector: y - select: - prompt: Por favor seleccione - footer: - send_feedback: "Envía comentarios sobre el %{version}" - shared: - multiple_next_actions: Multiple next actions (one on each line) - make_actions_dependent: "Asegúrese que las acciones dependen unos de otros" - toggle_single: Add a next action - hide_form: Esconder formulario - add_actions: "Añadir tareas" - add_action: "Añadir tarea" - tags_for_all_actions: Tags for all actions (sep. with commas) - toggle_single_title: Add a new next action - project_for_all_actions: Project for all actions - context_for_all_actions: Context for all actions - toggle_multi: Add multiple next actions - separate_tags_with_commas: separar con comas - add_context: Agregue contexto - toggle_multi_title: Toggle single/multi new action form - hide_action_form_title: Hide new action form - feedlist: - choose_context: Elija el contexto en el que desea un canal de - actions_due_today: Acciones pendientes hoy o antes - ical_feed: "iCal alimentación" - legend: "Leyenda:" - all_contexts: Todos los contextos - rss_feed: RSS Feed - choose_project: Elegir el proyecto que quiere un canal de - all_projects: Todos los proyectos - project_needed: Es necesario que haya al menos un proyecto antes de poder solicitar un feed - select_feed_for_project: Seleccione la fuente para este proyecto - active_projects_wo_next: "Proyectos activos, sin las próximas acciones" - active_starred_actions: "Todas las acciones que protagonizó, activa" - context_needed: Es necesario que haya al menos un contexto antes de poder solicitar un feed - select_feed_for_context: "Seleccione la alimentación de este contexto" - projects_and_actions: Proyectos activos con sus acciones - notice_incomplete_only: "Nota: Todos los alimentos muestran sólo las acciones que no han sido marcadas como realizadas, a menos que se indique lo contrario." - actions_due_next_week: "Tareas pendientes en 7 días o menos" - actions_completed_last_week: "Tareas completadas en los últimos 7 días" - context_centric_actions: "Feeds de acciones incompletas en un contexto específico" - plain_text_feed: Canal Texto sin formato - last_fixed_number: "Última %{number} acciones" - all_actions: Todas las tareas - project_centric: "Feeds de acciones incompletas en un proyecto específico" - sidebar: - list_name_active_contexts: Active contexts - list_name_active_projects: Active projects - list_empty: None - list_name_completed_projects: Completed projects - list_name_hidden_projects: Hidden projects - list_name_hidden_contexts: Hidden contexts - users: - openid_url_verified: You have successfully verified %{url} as your identity and set your authentication type to OpenID. - auth_type_update_error: "There was a problem updating your authentication type: %{error_messages}" - failed_to_delete_user: Failed to delete user %{username} - destroy_successful: User %{login} was successfully destroyed - first_user_heading: "Welcome to TRACKS. To get started, please create an admin account:" - total_contexts: Total contexts - successfully_deleted_user: Successfully deleted user %{username} - signup_successful: Signup successful for user %{username}. - new_token_generated: New token successfully generated - total_projects: Total projects - change_password_submit: Change password - no_signups_title: TRACKS::No signups - user_created: User created. - account_signup: Account signup - manage_users: Manage users - password_updated: Password updated. - auth_type_updated: Authentication type updated. - total_actions: Total actions - desired_login: Desired login - signup: Signup - confirm_password: Confirm password - new_user_heading: "Sign up a new user:" - password_confirmation_label: Confirm password - destroy_error: There was an error deleting the user %{login} - choose_password: Choose password - change_password_title: TRACKS::Change password - change_auth_type_title: TRACKS::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 - register_with_cas: With your CAS username - label_auth_type: Authentication type - total_users_count: You have a total of %{count} users - new_user_title: TRACKS::Sign up as the admin user - 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?" - you_have_to_reset_your_password: "Usted tiene que restablecer su contraseña" - signup_new_user: Sign up new user - identity_url: Identity URL - openid_ok_pref_failed: You have successfully verified %{url} as your identity but there was a problem saving your authentication preferences. - auth_change_submit: Change authentication type - change_authentication_type: Change authentication type - total_notes: Total notes - select_authentication_type: Select your new authentication type and click 'Change authentication type' to replace your current settings. + common: + action: Tarea + actions: Tareas + actions_midsentence: + one: tarea + other: tareas + zero: tareas + add: Añadir + ajaxError: "Hubo un error al recuperar desde el servidor" + back: Atrás + bugs: Errores + cancel: Cancelar + context: Contexto + contexts: Contextos + contribute: Contribuir + create: Crear + days_midsentence: + one: día + other: días + zero: días + deferred: pospuestas + description: Descripción + drag_handle: ARRASTRAR + email: Email + errors_with_fields: "Ha habido problemas con los siguientes campos:" + first: Primero + forth: Siguiente + forum: Foro + fourth: Cuarto + go_back: "Volver atrás" + last: Último + logout: Salir + month: mes + months: meses + next: Próximo + none: Ninguno + not_available_abbr: n/e + note: + one: "1 nota" + other: "%{count} notas" + zero: "0 notas" + notes: Notas + numbered_step: "Paso %{number}" + ok: Ok + optional: opcional + previous: Anterior + project: Proyecto + projects: Proyectos + recurring_todos: "Repetición de acciones" + review: Revisión + search: Buscar + second: Segundo + server_error: "Ha ocurrido un error en el servidor." + show_all: "Mostrar todo" + sort: + alphabetically: Alfabéticamente + alphabetically_confirm: "¿Está seguro que desea ordenar los proyectos por orden alfabético? Esto reemplazará el orden existente." + alphabetically_title: "Proyectos de ordenar alfabéticamente" + by_task_count: "Por número de tareas" + by_task_count_title: "Ordenar por número de tareas" + by_task_count_title_confirm: "¿Está seguro que desea ordenar los proyectos por el número de tareas? Esto reemplazará el orden existente." + sort: Ordenar + third: Tercero + todo: Todo + update: Actualizar + website: Website + week: semana + weeks: semanas + wiki: Wiki contexts: - delete_context_title: Eliminar contexto - all_completed_tasks_title: "TRACKS:: Todas las acciones completadas en '%{context_name}' contexto" - hide_form: Esconder formulario - show_form_title: "Añadir un contexto" - delete_context_confirmation: "¿Está seguro que desea eliminar '%{name}' el contexto? Tenga en cuenta que esto también se eliminarán todas las acciones (la repetición) en este contexto!" - todos_append: en este contexto - delete_context: Eliminar contexto - edit_context: Editar contexto - hide_form_title: Ocultar el formulario nuevo contexto - hidden_contexts: Contextos ocultos - no_contexts_active: Actualmente no hay contextos activos - context_hide: "¿Esconder de la página principal?" add_context: "Añadir contexto" - show_form: Crear un nuevo contexto - save_status_message: Contexto guardado - visible_contexts: Contextos visible - update_status_message: Nombre de contexto ha cambiado - context_name: Nombre del contexto - status_active: "El contexto está activo" + all_completed_tasks_title: "TRACKS:: Todas las acciones completadas en '%{context_name}' contexto" completed_tasks_title: "TRACKS:: Las acciones completadas en '%{context_name}' el contexto" - new_context_post: "' También se ha creado. ¿Está seguro?" - new_context_pre: Nuevo contexto ' - no_actions: Actualmente no hay acciones incompletas en este contexto + context_deleted: "Contexto eliminado '%{name}'" + context_hide: "¿Esconder de la página principal?" + context_name: "Nombre del contexto" + delete_context: "Eliminar contexto" + delete_context_confirmation: "¿Está seguro que desea eliminar '%{name}' el contexto? Tenga en cuenta que esto también se eliminarán todas las acciones (la repetición) en este contexto!" + delete_context_title: "Eliminar contexto" + edit_context: "Editar contexto" + hidden_contexts: "Contextos ocultos" + hide_form: "Esconder formulario" + hide_form_title: "Ocultar el formulario nuevo contexto" last_completed_in_context: "en este contexto (últimos %{number})" - context_deleted: Contexto eliminado '%{name}' - no_contexts_hidden: Actualmente no hay contextos ocultos - status_hidden: Contexto se oculta - login: - openid_identity_url_not_found: Sorry, no user by that identity URL exists (%{identity_url}) - user_no_expiry: Stay logged in - sign_in: Entrar - login_cas: go to the CAS - cas_no_user_found: Hello, %{username}! You do not have an account on Tracks. - cas_login: CAS Login - successful_with_session_info: "Login successful:" - please_login: Please log in to use Tracks - cas_logged_in_greeting: Hello, %{username}! You are authenticated. - cas_username_not_found: Sorry, no user by that CAS username exists (%{username}) - cas_create_account: If you like to request on please go here to %{signup_link} - mobile_use_openid: "…or login with an OpenID" - cas_signup_link: Request account - account_login: Acceso a la cuenta - successful: "Has entrado con éxito. Bienvenido!" - session_will_not_expire: session will not expire. - option_separator: or, - session_time_out: Session has timed out. Please %{link} - session_will_expire: session will expire after %{hours} hour(s) of inactivity. - login_standard: go back to the standard login - login_with_openid: login with an OpenID - unsuccessful: Login unsuccessful. - log_in_again: log in again. - logged_out: You have been logged out of Tracks. + new_context_post: "' También se ha creado. ¿Está seguro?" + new_context_pre: "Nuevo contexto '" + no_actions: "Actualmente no hay acciones incompletas en este contexto" + no_contexts_active: "Actualmente no hay contextos activos" + no_contexts_hidden: "Actualmente no hay contextos ocultos" + save_status_message: "Contexto guardado" + show_form: "Crear un nuevo contexto" + show_form_title: "Añadir un contexto" + status_active: "El contexto está activo" + status_hidden: "Contexto se oculta" + todos_append: "en este contexto" + update_status_message: "Nombre de contexto ha cambiado" + visible_contexts: "Contextos visible" + data: + import_errors: "Han ocurrido algunos errores durante la importación" + import_successful: "Importación se realizó correctamente." + date: + abbr_day_names: + - Dom + - Lun + - Mar + - Mie + - Jue + - Vie + - Sab + abbr_month_names: + - ~ + - Ene + - Feb + - Mar + - Abr + - May + - Jun + - Jul + - Ago + - Sep + - Oct + - Nov + - Dic + day_names: + - Domingo + - Lunes + - Martes + - Miércoles + - Jueves + - Viernes + - Sábado + formats: + default: "%Y-%m-%d" + long: "%B %d, %Y" + longer: "%A, %d %b %Y" + short: "%b %d" + month_names: + - ~ + - Enero + - Febrero + - Marzo + - Abril + - Mayo + - Junio + - Julio + - Agosto + - Septiembre + - Octubre + - Noviembre + - Diciembre datetime: - prompts: - minute: Minuto - second: Segundos - month: Mes - hour: Hora - day: "Día" - year: "Año" distance_in_words: - less_than_x_minutes: - one: menos de un minuto - other: menos de %{count} minutos - zero: menos de 1 minuto - almost_x_years: - one: "casi 1 año" - other: "Casi %{count} años" - x_days: - one: "1 día" - other: "%{count} días" - x_seconds: - one: Un segundo - other: "%{count} segundos" about_x_hours: - one: alrededor de 1 hora - other: Acerca de %{count} horas - less_than_x_seconds: - one: menos de 1 segundo - other: menos de %{count} segundos - zero: menos de 1 segundo - x_months: - one: 1 mes - other: "%{count} meses" - x_minutes: - one: 1 minuto - other: "%{count} minutos" + one: "alrededor de 1 hora" + other: "Acerca de %{count} horas" + about_x_months: + one: "alrededor de 1 mes" + other: "Acerca de %{count} meses" about_x_years: one: "alrededor de 1 año" other: "Acerca de %{count} años" - about_x_months: - one: alrededor de 1 mes - other: Acerca de %{count} meses + almost_x_years: + one: "casi 1 año" + other: "Casi %{count} años" + half_a_minute: "medio minuto" + less_than_x_minutes: + one: "menos de un minuto" + other: "menos de %{count} minutos" + zero: "menos de 1 minuto" + less_than_x_seconds: + one: "menos de 1 segundo" + other: "menos de %{count} segundos" + zero: "menos de 1 segundo" over_x_years: one: "más de 1 año" other: "en %{count} años" - half_a_minute: medio minuto + x_days: + one: "1 día" + other: "%{count} días" + x_minutes: + one: "1 minuto" + other: "%{count} minutos" + x_months: + one: "1 mes" + other: "%{count} meses" + x_seconds: + one: "Un segundo" + other: "%{count} segundos" + prompts: + day: Día + hour: Hora + minute: Minuto + month: Mes + second: Segundos + year: Año + errors: + user_unauthorized: "401 No autorizado: Solo los usuarios administrativos pueden acceder a esta función." + feedlist: + actions_completed_last_week: "Tareas completadas en los últimos 7 días" + actions_due_next_week: "Tareas pendientes en 7 días o menos" + actions_due_today: "Acciones pendientes hoy o antes" + active_projects_wo_next: "Proyectos activos, sin las próximas acciones" + active_starred_actions: "Todas las acciones que protagonizó, activa" + all_actions: "Todas las tareas" + all_contexts: "Todos los contextos" + all_projects: "Todos los proyectos" + choose_context: "Elija el contexto en el que desea un canal de" + choose_project: "Elegir el proyecto que quiere un canal de" + context_centric_actions: "Feeds de acciones incompletas en un contexto específico" + context_needed: "Es necesario que haya al menos un contexto antes de poder solicitar un feed" + ical_feed: "iCal alimentación" + last_fixed_number: "Última %{number} acciones" + legend: "Leyenda:" + notice_incomplete_only: "Nota: Todos los alimentos muestran sólo las acciones que no han sido marcadas como realizadas, a menos que se indique lo contrario." + plain_text_feed: "Canal Texto sin formato" + project_centric: "Feeds de acciones incompletas en un proyecto específico" + project_needed: "Es necesario que haya al menos un proyecto antes de poder solicitar un feed" + projects_and_actions: "Proyectos activos con sus acciones" + rss_feed: "RSS Feed" + select_feed_for_context: "Seleccione la alimentación de este contexto" + select_feed_for_project: "Seleccione la fuente para este proyecto" + footer: + send_feedback: "Envía comentarios sobre el %{version}" + integrations: + applescript_next_action_prompt: "Descripción de la próxima tarea:" + applescript_success_after_id: creado + applescript_success_before_id: "Nueva acción junto con la identificación" + gmail_description: "Gadget para añadir pistas a Gmail como un gadget" + opensearch_description: "Buscar en las Tracks" + layouts: + mobile_navigation: + contexts: Contextos + feeds: Feeds + home: Inicio + logout: "Cerrar sesión" + new_action: "Nueva tarea" + projects: Proyectos + starred: avoritos + tickler: Tickler + navigation: + admin: Admin + api_docs: "REST API Docs" + calendar: Calendario + calendar_title: "Calendario de las acciones por" + completed_tasks: Hecho + completed_tasks_title: Completed + contexts_title: Contexts + export: Export + export_title: "Import and export data" + feeds: Feeds + feeds_title: "See a list of available feeds" + help: "?" + home: Inicio + home_title: Inicio + integrations_: "Integrar Tracks" + manage_users: "Administrar usuarios" + manage_users_title: "Añadir o eliminar usuarios" + notes_title: "Mostrar todas las notas" + organize: Organizar + preferences: Preferencias + preferences_title: "Mostrar mis preferencias" + projects_title: Proyectos + recurring_todos: "Tareas repetitivas" + recurring_todos_title: "Manage recurring actions" + review_title: "Posibilidad de una revisión" + search: "Search All Items" + starred: Estrellas + starred_title: "See your starred actions" + stats: Estadísticas + stats_title: "See your statistics" + tickler: Tickler + tickler_title: Tickler + view: Ver + next_actions_rss_feed: "RSS feed of next actions" + toggle_contexts: "Cambiar los contextos se derrumbó" + toggle_contexts_title: "Haga contextos se derrumbó (in)visible" + toggle_notes: "Activar/Desactivar notas" + toggle_notes_title: "Activar/Desactivar todas las notas" + login: + account_login: "Acceso a la cuenta" + cas_create_account: "If you like to request on please go here to %{signup_link}" + cas_logged_in_greeting: "Hello, %{username}! You are authenticated." + cas_login: "CAS Login" + cas_no_user_found: "Hello, %{username}! You do not have an account on Tracks." + cas_signup_link: "Request account" + cas_username_not_found: "Sorry, no user by that CAS username exists (%{username})" + log_in_again: "log in again." + logged_out: "You have been logged out of Tracks." + login_cas: "go to the CAS" + login_standard: "go back to the standard login" + login_with_openid: "login with an OpenID" + mobile_use_openid: "…or login with an OpenID" + openid_identity_url_not_found: "Sorry, no user by that identity URL exists (%{identity_url})" + option_separator: "or," + please_login: "Please log in to use Tracks" + session_time_out: "Session has timed out. Please %{link}" + session_will_expire: "session will expire after %{hours} hour(s) of inactivity." + session_will_not_expire: "session will not expire." + sign_in: Entrar + successful: "Has entrado con éxito. Bienvenido!" + successful_with_session_info: "Login successful:" + unsuccessful: "Login unsuccessful." + user_no_expiry: "Stay logged in" + models: + preference: + due_in: "Due in %{days} days" + due_on: "Due on %{date}" + due_styles: + - "Due in ___ days" + - "Due on _______" + project: + feed_description: "Lists all the projects for %{username}" + feed_title: "Tracks Projects" + todo: + error_date_must_be_future: "must be a date in the future" + user: + error_context_not_associated: "Context id %{context} not associated with user id %{user}." + error_project_not_associated: "Project id %{project} not associated with user id %{user}." + notes: + delete_confirmation: "Are you sure that you want to delete the note '%{id}'?" + delete_item_title: "Delete item" + delete_note_confirm: "Are you sure that you want to delete the note '%{id}'?" + delete_note_title: "Delete the note '%{id}'" + deleted_note: "Deleted note '%{id}'" + edit_item_title: "Edit item" + in_project: "En:" + no_notes_available: "Currently there are no notes: add notes to projects from individual project pages." + note_header: "Note %{id}" + note_link_title: "Show note %{id}" + note_location_link: "In:" + show_note_title: "Show note" + number: + currency: + format: + delimiter: "," + format: "%u%n" + separator: "." + unit: € + format: + delimiter: "," + separator: "." + human: + storage_units: + format: "%n %u" + units: + byte: + one: Byte + other: Bytes + gb: GB + kb: KB + mb: MB + tb: Tuberculosis + preferences: + authentication_header: "Your authentication" + change_authentication_type: "Change your authentication type" + change_identity_url: "Change Your Identity URL" + change_password: "Change your password" + current_authentication_type: "Your authentication type is %{auth_type}" + edit_preferences: "Edit preferences" + generate_new_token: "Generate a new token" + generate_new_token_confirm: "Are you sure? Generating a new token will replace the existing one and break any external usages of this token." + is_false: "false" + is_true: "true" + open_id_url: "Your OpenID URL is" + page_title: "TRACKS::Preferences" + page_title_edit: "TRACKS::Edit Preferences" + password_changed: "Que ha cambiado la contraseña, por favor vuelve a iniciar sesión." + show_number_completed: "Show %{number} completed items" + sms_context_none: None + staleness_starts_after: "Staleness starts after %{days} days" + tabs: + authentication: Autenticación + date_and_time: "Fecha y hora" + profile: Perfil + tracks_behavior: "Rastrea el comportamiento de" + title: "Your preferences" + token_description: "Token (for feeds and API use)" + token_header: "Your token" + updated: "Las preferencias de actualización" + projects: + actions_in_project_title: "Actions in this project" + active_projects: "Active projects" + add_note: "Añadir una nota" + add_note_submit: "Añadir nota" + add_project: "Añadir Proyecto" + all_completed_tasks_title: "TRACKS:: Lista de todas las acciones terminado en '%{project_name}' Proyecto" + completed_actions: "Tareas completadas para este proyecto" + completed_actions_empty: "No hay tareas completadas para este proyecto" + completed_projects: "Proyectos completados" + completed_tasks_title: "TRACKS:: Lista de Acciones completadas en '%{project_name}' Proyecto" + default_context: "The default context for this project is %{context}" + default_context_removed: "Eliminado el contexto por defecto" + default_context_set: "Set project's default context to %{default_context}" + default_tags_removed_notice: "Removed the default tags" + deferred_actions: "Tareas pospuestas para este proyecto" + deferred_actions_empty: "There are no deferred actions for this project" + delete_project: "Delete project" + delete_project_confirmation: "Are you sure that you want to delete the project '%{name}'?" + delete_project_title: "Delete the project" + edit_project_settings: "Edit Project Settings" + edit_project_title: "Editar proyecto" + hidden_projects: "Proyectos ocultos" + hide_form: "Esconder formulario" + hide_form_title: "Hide new project form" + is_active: "está activo" + list_completed_projects: "TRACKS:: Lista de Proyectos Realizados" + list_projects: "TRACKS::Lista de Proyectos" + list_reviews: "TRACKS::Revisión" + no_actions_in_project: "Currently there are no incomplete actions in this project" + no_default_context: "Este proyecto no tiene un contexto por defecto" + no_last_completed_projects: "No hay proyectos terminados encontrado" + no_last_completed_recurring_todos: "No se ha completado las acciones repetitivas que se encuentran" + no_notes_attached: "Currently there are no notes attached to this project" + no_projects: "Currently there are no projects" + notes: Notes + notes_empty: "There are no notes for this project" + page_title: "TRACKS::Project: %{project}" + project_saved_status: "Project saved" + project_state: "Project is %{state}." + set_default_tags_notice: "Set project's default tags to %{default_tags}" + settings: Settings + show_form: "Add a project" + show_form_title: "Create a new project" + state: "This project is %{state}" + status_project_name_changed: "Name of project was changed" + this_project: "This project" + to_new_project_page: "Take me to the new project page" + todos_append: "in this project" + was_marked_complete: "has been marked as completed" + was_marked_hidden: "has been marked as hidden" + with_default_context: "with a default context of '%{context_name}'" + with_default_tags: "and with '%{tags}' as the default tags" + with_no_default_context: "with no default context" + with_no_default_tags: "and with no default tags" search: - contexts_matching_query: Contexts matching query - tags_matching_query: Tags matching query - no_results: Your search yielded no results. - todos_matching_query: Todos matching query - projects_matching_query: Projects matching query - notes_matching_query: Notes matching query + contexts_matching_query: "Contexts matching query" + no_results: "Your search yielded no results." + notes_matching_query: "Notes matching query" + projects_matching_query: "Projects matching query" + tags_matching_query: "Tags matching query" + todos_matching_query: "Todos matching query" + shared: + add_action: "Añadir tarea" + add_actions: "Añadir tareas" + add_context: "Agregue contexto" + context_for_all_actions: "Context for all actions" + hide_action_form_title: "Hide new action form" + hide_form: "Esconder formulario" + make_actions_dependent: "Asegúrese que las acciones dependen unos de otros" + multiple_next_actions: "Multiple next actions (one on each line)" + project_for_all_actions: "Project for all actions" + separate_tags_with_commas: "separar con comas" + tags_for_all_actions: "Tags for all actions (sep. with commas)" + toggle_multi: "Add multiple next actions" + toggle_multi_title: "Toggle single/multi new action form" + toggle_single: "Add a next action" + toggle_single_title: "Add a new next action" + sidebar: + list_empty: None + list_name_active_contexts: "Active contexts" + list_name_active_projects: "Active projects" + list_name_completed_projects: "Completed projects" + list_name_hidden_contexts: "Hidden contexts" + list_name_hidden_projects: "Hidden projects" + states: + active: Active + active_plural: Active + blocked: Bloqueado + blocked_plural: Bloqueado + completed: Completed + completed_plural: Completed + current: "Hasta al día" + current_plural: "Hasta al día" + hidden: Hidden + hidden_plural: Hidden + review: Fechado + review_plural: Fechado + stalled: Estancado + stalled_plural: Estancado + visible: Visible + visible_plural: Visible + stats: + action_completion_time_title: "Completion time (all completed actions)" + action_selection_title: "TRACKS::Action selection" + actions: Actions + actions_30days_title: "Actions in the last 30 days" + actions_actions_avg_created_30days: "In the last 30 days you created on average %{count} actions" + actions_avg_completed: "and completed an average of %{count} actions per month." + actions_avg_completed_30days: "and completed an average of %{count} actions per day." + actions_avg_completion_time: "Of all your completed actions, the average time to complete is %{count} days." + actions_avg_created: "In the last 12 months you created on average %{count} actions" + actions_day_of_week_legend: + day_of_week: "Día de la semana" + number_of_actions: "Número de acciones" + actions_day_of_week_title: "Day of week (all actions)" + actions_dow_30days_legend: + day_of_week: "Día de la semana" + number_of_actions: "Número de acciones" + actions_dow_30days_title: "Day of week (past 30 days)" + actions_further: " and further" + actions_last_year: "Actions in the last years" + actions_last_year_legend: + months_ago: "Months ago" + number_of_actions: "Number of actions" + actions_lastyear_title: "Actions in the last 12 months" + actions_min_completion_time: "The minimum time to complete is %{time}." + actions_min_max_completion_days: "The Max-/minimum days to complete is %{min}/%{max}." + actions_selected_from_week: "Actions selected from week " + click_to_return: "Click %{link} to return to the statistics page." + click_to_return_link: here + click_to_show_actions_from_week: "Click %{link} to show the actions from week %{week} and further." + click_to_update_actions: "Click on a bar in the chart to update the actions below." + contexts: Contexts + current_running_time_of_incomplete_visible_actions: "Current running time of incomplete visible actions" + index_title: "TRACKS::Estadística" + labels: + avg_completed: "Avg completed" + avg_created: "Avg created" + completed: Completed + created: Created + month_avg_completed: "%{months} Month avg completed" + month_avg_created: "%{months} Month avg created" + legend: + actions: Tareas + day_of_week: "Day of week" + months_ago: "Months ago" + number_of_actions: "Número de tareas" + number_of_days: "Number of days ago" + percentage: Percentage + running_time: "Running time of an action (weeks)" + more_stats_will_appear: "More statistics will appear here once you have added some actions." + no_actions_selected: "No hay tareas seleccionadas." + no_tags_available: "no tags available" + open_per_week: "Próximas acciones activas (visibles y ocultas) a la semana" + open_per_week_legend: + actions: Acciones + weeks: "Semanas atrás" + other_actions_label: (otros) + projects: Projects + running_time_all: "Current running time of all incomplete actions" + running_time_all_legend: + actions: Tareas + percentage: Percentage + running_time: "Running time of an action (weeks). Click on a bar for more info" + running_time_legend: + actions: Tareas + percentage: Percentage + weeks: "Running time of an action (weeks). Click on a bar for more info" + spread_of_actions_for_all_context: "Spread of actions for all context" + spread_of_running_actions_for_visible_contexts: "Spread of running actions for visible contexts" + tag_cloud_90days_description: "This tag cloud includes tags of actions that were created or completed in the past 90 days." + tag_cloud_90days_title: "Tag cloud actions in past 90 days" + tag_cloud_description: "This tag cloud includes tags of all actions (completed, not completed, visible and/or hidden)" + tag_cloud_title: "Tag cloud for all actions" + tags: Tags + time_of_day: "Time of day (all actions)" + time_of_day_legend: + number_of_actions: "Número de tareas" + time_of_day: "Time of day" + tod30: "Time of day (last 30 days)" + tod30_legend: + number_of_actions: "Número de tareas" + time_of_day: "Time of day" + top10_longrunning: "Top 10 longest running projects" + top10_projects: "Top 10 projects" + top10_projects_30days: "Top 10 project in past 30 days" + top5_contexts: "Top 5 contexts" + top5_visible_contexts_with_incomplete_actions: "Top 5 visible contexts with incomplete actions" + totals: Totals + totals_action_count: "you have a total of %{count} actions" + totals_actions_completed: "%{count} of these are completed." + totals_active_project_count: "Of those %{count} are active projects" + totals_blocked_actions: "%{count} are dependent on the completion of their actions." + totals_completed_project_count: "and %{count} are completed projects." + totals_context_count: "You have %{count} contexts." + totals_deferred_actions: "of which %{count} are deferred actions in the tickler" + totals_first_action: "Since your first action on %{date}" + totals_hidden_context_count: "and %{count} are hidden contexts." + totals_hidden_project_count: "%{count} are hidden" + totals_incomplete_actions: "You have %{count} incomplete actions" + totals_project_count: "You have %{count} projects." + totals_tag_count: "You have %{count} tags placed on actions." + totals_unique_tags: "Of those tags, %{count} are unique." + totals_visible_context_count: "Of those %{count} are visible contexts" + within_one: "Dentro de un" + support: + array: + last_word_connector: ", y" + two_words_connector: "y" + words_connector: "," + select: + prompt: "Por favor seleccione" + time: + am: soy + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + long: "%B %d, %Y %H:%M" + month_day: "%B %d" + short: "%d %b %H:%M" + stats: "%a %d-%m" + pm: pm + todos: + action_deferred: "La acción \\'%{description}\\' se aplazó" + action_deleted_error: "Failed to delete the action" + action_deleted_success: "Successfully deleted next action" + action_due_on: "(action due on %{date})" + action_marked_complete: "The action '%{description}' was marked as %{completed}" + action_marked_complete_error: "The action '%{description}' was NOT marked as %{completed} due to an error on the server." + action_saved: "Action saved" + action_saved_to_tickler: "Action saved to tickler" + add_another_dependency: "Add another dependency" + add_new_recurring: "Add a new recurring action" + added_dependency: "Added %{dependency} as dependency." + added_new_context: "Added new context" + added_new_next_action: "Added new next action" + added_new_next_action_plural: "Added new next actions" + added_new_next_action_singular: "Added new next action" + added_new_project: "Added new project" + all_completed: "Todas las acciones realizadas" + all_completed_here: aquí + all_completed_tagged_page_title: "TRACKS:: Todas las tareas realizadas con etiqueta %{tag_name}" + append_in_this_project: "in this project" + archived_tasks_title: "TRACKS::Archived completed tasks" + blocked_by: "Blocked by %{predecessors}" + calendar: + due_next_month_and_later: "Due in %{month} and later" + due_next_week: "Due next week" + due_this_month: "Due in rest of %{month}" + due_this_week: "Due in rest of this week" + due_today: "Due today" + get_in_ical_format: "Get this calendar in iCal format" + no_actions_due_after_this_month: "No actions due after this month" + no_actions_due_next_week: "No actions due in next week" + no_actions_due_this_month: "No actions due in rest of this month" + no_actions_due_today: "No actions due today" + calendar_page_title: "TRACKS::Calendar" + cannot_add_dependency_to_completed_todo: "Cannot add this action as a dependency to a completed action!" + clear_due_date: "Clear due date" + clear_show_from_date: "Clear show from date" + completed: Completed + completed_actions: "Completed actions" + completed_actions_with: "Completed actions with the tag %{tag_name}" + completed_in_archive: + one: "There is one completed action in the archive." + other: "There are %{count} completed actions in the archive." + completed_last_day: "Completed in the last 24 hours" + completed_last_x_days: "Completed in last %{count} days" + completed_recurrence_completed: "There is no next action after the recurring action you just deleted. The recurrence is completed" + completed_recurring: "Completed recurring todos" + completed_rest_of_month: "Completado en el resto de este mes" + completed_rest_of_previous_month: "Completado en el resto del mes anterior" + completed_rest_of_week: "Completado en el resto de esta semana" + completed_tagged_page_title: "TRACKS:: Las tareas completadas con etiqueta %{tag_name}" + completed_tasks_title: "TRACKS::Completed tasks" + completed_today: "Completed Today" + confirm_delete: "Are you sure that you want to delete the action '%{description}'?" + context_changed: "Context changed to %{name}" + convert_to_project: "Make project" + defer_date_after_due_date: "Defer date is after due date. Please edit and adjust due date before deferring." + defer_x_days: + one: "Defer one day" + other: "Defer %{count} days" + deferred_actions_with: "Deferred actions with the tag '%{tag_name}'" + deferred_pending_actions: "Deferred/pending actions" + deferred_tasks_title: "TRACKS::Tickler" + delete: Delete + delete_action: "Delete action" + delete_recurring_action_confirm: "Are you sure that you want to delete the recurring action '%{description}'?" + delete_recurring_action_title: "Delete the recurring action" + deleted_success: "The action was deleted succesfully." + depends_on: "Depends on" + depends_on_separate_with_commas: "Depende de (separar con comas)" + done: Done? + drag_action_title: "Drag onto another action to make it depend on that action" + due: "Fecha límite" + edit: Edit + edit_action: "Edit action" + edit_action_with_description: "Edit the action '%{description}'" + edit_recurring_todo: "Editar la acción de repetición" + error_completing_todo: "There was an error completing / activating the recurring todo %{description}" + error_deleting_item: "There was an error deleting the item %{description}" + error_deleting_recurring: "There was an error deleting the recurring todo \\'%{description}\\'" + error_removing_dependency: "There was an error removing the dependency" + error_saving_recurring: "There was an error saving the recurring todo \\'%{description}\\'" + error_starring: "Could not toggle the star of this todo \\'%{description}\\'" + error_starring_recurring: "Could not toggle the star of recurring todo \\'%{description}\\'" + error_toggle_complete: "Could not mark this todo complete" + feed_title_in_context: "in context '%{context}'" + feed_title_in_project: "in project '%{project}'" + feeds: + completed: "Completed: %{date}" + due: "Due: %{date}" + has_x_pending: + one: "Tiene una tarea pendiente" + other: "Tiene %{count} tareas pendientes" + hidden_actions: "Tareas ocultas" + in_hidden_state: "en estado oculto" + in_pending_state: "en estado pendiente" + list_incomplete_next_actions: "Lista las siguientes tareas incompletas" + list_incomplete_next_actions_with_limit: "Lists the last %{count} incomplete next actions" + mobile_todos_page_title: "Todas las tareas" + new_related_todo_created: "Una nueva tarea fue añadida y que pertenece a esta tarea recurrente" + new_related_todo_created_short: "creada una nueva tarea" + new_related_todo_not_created_short: "no se creó la tarea" + next_action_description: "Descripción de la nueva tarea" + next_action_needed: "You need to submit at least one next action" + next_actions_description: "Filter:" + next_actions_description_additions: + completed: "in the last %{count} days" + due_date: "with a due date %{due_date} or earlier" + next_actions_due_date: + due_in_x_days: "Vence en %{days} días" + due_today: "Vence hoy" + due_tomorrow: "Vence mañana" + overdue_by: "Overdue by %{days} day" + overdue_by_plural: "Overdue by %{days} days" + next_actions_title: "Tracks - Next Actions" + next_actions_title_additions: + completed: "actions completed" + due_today: "due today" + due_within_a_week: "due within a week" + no_actions_due_this_week: "No actions due in rest of this week" + no_actions_found: "Currently there are no incomplete actions." + no_actions_found_title: "No actions found" + no_actions_with: "Currently there are no incomplete actions with the tag '%{tag_name}'" + no_completed_actions: "Currently there are no completed actions." + no_completed_actions_with: "No completed actions with the tag '%{tag_name}'" + no_completed_recurring: "Currently there are no completed recurring todos" + no_deferred_actions: "Currently there are no deferred actions." + no_deferred_actions_with: "No deferred actions with the tag '%{tag_name}'" + no_deferred_pending_actions: "Currently there are no deferred or pending actions" + no_hidden_actions: "Currently there are no hidden actions found" + no_incomplete_actions: "There are no incomplete actions" + no_last_completed_actions: "No encontró las acciones realizadas" + no_project: "--No project--" + no_recurring_todos: "Currently there are no recurring todos" + older_completed_items: "Older completed items" + overdue: Overdue + pending: Pending + recurrence: + daily: Daily + daily_every_number_day: "Every %{number} day(s)" + daily_options: "Settings for daily recurring actions" + day_x_on_every_x_month: "Day %{day} on every %{month} month" + ends_on: "Ends on" + ends_on_date: "Ends on %{date}" + ends_on_number_times: "Ends after %{number} times" + every_work_day: "Every work day" + from_tickler: "the date todo comes from tickler (no due date set)" + monthly: Monthly + monthly_every_xth_day: "The %{day} %{day_of_week} of every %{month} month" + monthly_options: "Settings for monthly recurring actions" + no_end_date: "No end date" + pattern: + day_names: + - sunday + - monday + - tuesday + - wednesday + - thursday + - friday + - saturday + due: due + every_day: "every day" + every_month: "every month" + every_n: "every %{n}" + every_xth_day_of_every_n_months: "every %{x} %{day} of every %{n_months}" + every_year_on: "every year on %{date}" + first: first + fourth: fourth + from: from + last: last + month_names: + - ~ + - January + - February + - Match + - April + - May + - June + - July + - August + - September + - October + - November + - December + on_day_n: "on day %{n}" + on_work_days: "on work days" + second: second + show: show + the_xth_day_of_month: "the %{x} %{day} of %{month}" + third: third + times: "for %{number} times" + until: until + weekly: weekly + recurrence_on_due_date: "the date that the todo is due" + recurrence_on_options: "Set recurrence on" + show_days_before: "%{days} days before the todo is due" + show_option_always: always + show_options: "Show the todo" + starts_on: "Starts on" + weekly: Weekly + weekly_every_number_week: "Returns every %{number} week on" + weekly_options: "Settings for weekly recurring actions" + yearly: Yearly + yearly_every_x_day: "Every %{month} %{day}" + yearly_every_xth_day: "The %{day} %{day_of_week} of %{month}" + yearly_options: "Settings for yearly recurring actions" + recurrence_completed: "There is no next action after the recurring action you just finished. The recurrence is completed" + recurrence_period: "Recurrence period" + recurring_action_deleted: "Action was deleted. Because this action is recurring, a new action was added" + recurring_action_saved: "Recurring action saved" + recurring_actions_title: "TRACKS::Recurring Actions" + recurring_deleted_success: "The recurring action was deleted succesfully." + recurring_pattern_removed: "El patrón de repetición se retira de %{count}" + recurring_todos: "Recurring todos" + remove_dependency: "Remove dependency (does not delete the action)" + removed_predecessor: "Removed %{successor} as dependency from %{predecessor}." + scheduled_overdue: "Scheduled to show %{days} days ago" + see_all_completed: "Usted puede ver todas las acciones realizadas %{link}" + set_to_pending: "%{task} set to pending" + show_from: "Show from" + show_in_days: "Show in %{days} days" + show_on_date: "Show on %{date}" + show_today: "Show Today" + show_tomorrow: "Show Tomorrow" + star_action: "Star this action" + star_action_with_description: "star the action '%{description}'" + tagged_page_title: "TRACKS::Tagged with '%{tag_name}'" + tagged_with: "tagged with ‘%{tag_name}’" + tags: "Tags (separate with commas)" + task_list_title: "TRACKS::List tasks" + tickler_items_due: + one: "One tickler item is now due - refresh the page to see it." + other: "%{count} tickler items are now due - refresh the page to see them." + to_tickler: "to tickler" + unable_to_add_dependency: "Unable to add dependency" + unresolved_dependency: "The value you entered in the dependency field did not resolve to an existing action. This value will not be saved with the rest of the action. Continue?" + was_due_on_date: "was due on %{date}" + users: + account_signup: "Account signup" + auth_change_submit: "Change authentication type" + auth_type_update_error: "There was a problem updating your authentication type: %{error_messages}" + auth_type_updated: "Authentication type updated." + change_auth_type_title: "TRACKS::Change authentication type" + change_authentication_type: "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." + change_password_submit: "Change password" + change_password_title: "TRACKS::Change password" + choose_password: "Choose password" + confirm_password: "Confirm password" + desired_login: "Desired login" + destroy_confirmation: "Warning: this will delete user '%{login}', all their actions, contexts, project and notes. Are you sure that you want to continue?" + destroy_error: "There was an error deleting the user %{login}" + destroy_successful: "User %{login} was successfully destroyed" + destroy_user: "Destroy user" + failed_to_delete_user: "Failed to delete user %{username}" + first_user_heading: "Welcome to TRACKS. To get started, please create an admin account:" + identity_url: "Identity URL" + label_auth_type: "Authentication type" + manage_users: "Manage users" + new_password_label: "New password" + new_token_generated: "New token successfully generated" + new_user_heading: "Sign up a new user:" + new_user_title: "TRACKS::Sign up as the admin user" + no_signups_title: "TRACKS::No signups" + openid_ok_pref_failed: "You have successfully verified %{url} as your identity but there was a problem saving your authentication preferences." + openid_url_verified: "You have successfully verified %{url} as your identity and set your authentication type to OpenID." + password_confirmation_label: "Confirm password" + password_updated: "Password updated." + register_with_cas: "With your CAS username" + select_authentication_type: "Select your new authentication type and click 'Change authentication type' to replace your current settings." + signup: Signup + signup_new_user: "Sign up new user" + signup_successful: "Signup successful for user %{username}." + successfully_deleted_user: "Successfully deleted user %{username}" + total_actions: "Total actions" + total_contexts: "Total contexts" + total_notes: "Total notes" + total_projects: "Total projects" + total_users_count: "You have a total of %{count} users" + user_created: "User created." + you_have_to_reset_your_password: "Usted tiene que restablecer su contraseña" + will_paginate: + next_label: "Siguiente »" + page_entries_info: + multi_page_html: "Viendo %{model} %{from} - %{to} de %{count} en el total de" + single_page: + one: "Viendo del 1 %{model}" + other: "Viendo todos los %{count} %{model}" + zero: "No %{model} encontrado" + single_page_html: + one: "Viendo del 1 %{model}" + other: "Viendo todos los %{count} %{model}" + zero: "No %{model} encontrado" + page_gap: "..." + previous_label: "« Anterior" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 68e0f7f1..d55a21b8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1,998 +1,982 @@ --- fr: - layouts: - toggle_contexts_title: "Faire des contextes effondré (in)visibles" - toggle_contexts: "Basculer contextes effondré" - toggle_notes: Afficher/Cacher notes - next_actions_rss_feed: Flux RSS des prochaines actions - toggle_notes_title: Afficher/Cacher toutes les notes - mobile_navigation: - new_action: 0-Nouvelle action - logout: "Déconnexion" - feeds: Flux - starred: "Marqué" - projects: Projets - tickler: Reporteur - contexts: Contextes - home: Accueil - navigation: - manage_users_title: Ajouter ou supprimer des utilisateurs - recurring_todos: "Tâches (todos) répétitives" - api_docs: Doc REST API - help: "?" - feeds: Flux - starred: "Marqué" - stats: Statistiques - notes_title: Voir toutes les notes - manage_users: Gestion des utilisateurs - tickler_title: Reporteur - admin: Admin - preferences: "Préférences" - integrations_: "Intégrer Tracks" - export_title: "Importer et exporter des données" - calendar_title: "Calendrier des actions à échéance" - feeds_title: Voir une liste des flux disponibles - stats_title: Voir vos statistiques - tickler: Reporteur - home_title: Accueil - starred_title: "Voir vos actions préférées" - recurring_todos_title: "Gerer les actions récurrentes" - completed_tasks: "Terminé" - view: Vue - organize: Organiser - completed_tasks_title: "Terminé" - home: Accueil - export: Exporter - contexts_title: Contextes - preferences_title: "Voir mes préférences" - search: Recherches tous les items - review_title: Faire examiner - projects_title: Projets - calendar: Calendrier - number: - format: - separator: . - precision: 2 - delimiter: "," - human: - format: - precision: 1 - delimiter: "" - storage_units: - format: "%n %u" - units: - kb: KB - tb: TB - gb: GB - byte: - one: Octet - other: Octets - mb: MB - percentage: - format: - delimiter: "" - precision: - format: - delimiter: "" - currency: - format: - format: "%u%n" - unit: $ - separator: . - delimiter: "," - common: - recurring_todos: "Répétition d'actions" - back: Retour - actions: Actions - third: "Troisième" - add: Ajouter - go_back: Retour - previous: "Précédente" - logout: "Déconnexion" - second: Seconde - none: Aucun - week: semaine - optional: optionnel - deferred: "reportées" - cancel: Annuler - show_all: Voir tous - month: mois - actions_midsentence: - one: action - other: actions - zero: actions - forum: Forum - server_error: Une erreur s\'est produite sur le serveur - notes: Notes - projects: Projets - last: Dernier - review: Revue - action: Action - days_midsentence: - one: jour - other: jours - zero: jours - project: Projet - contribute: Contribuer - ok: Ok - website: Site Web - first: Premier - note: - one: 1 noter - other: "%{count} notes" - zero: non notes - numbered_step: Etape %{number} - sort: - by_task_count_title: "Trier par nombre de tâches" - by_task_count_title_confirm: "Etes vous sûr de vouloir trier ces projets par nombre de tâches ? L\\'ordre actuel sera remplacé." - alphabetically: "Par ordre alphabétique" - sort: Trier - alphabetically_title: "Trier les projets par ordre alphabétique" - alphabetically_confirm: "Etes vous sûr de vouloir trier ces projets par ordre alphabétique ? L\\'ordre actuel sera remplacé." - by_task_count: "Par nombre de tâches" - create: "Créer" - todo: Action - months: Mois - description: Description - errors_with_fields: "Il y a des problème avec les champs suivants :" - drag_handle: DRAG - next: Suivant - fourth: "Quatrième" - context: Contexte - contexts: Contextes - bugs: Bugs - update: "Mettre à jour" - forth: FORTH - weeks: semaines - wiki: Wiki - email: Email - search: Rechercher - ajaxError: "Une erreur s'est produite en accédant un serveur" - not_available_abbr: n/a - integrations: - opensearch_description: Rechercher dans Tracks - applescript_next_action_prompt: "Description de l'action suivante:" - gmail_description: "Gadget pour ajouter Tracks à Gmail" - applescript_success_after_id: "Créé" - applescript_success_before_id: Nouvelle action suivante avec ID activerecord: attributes: - project: - name: Nom - default_tags: Tags par defaut - default_context_name: Contexte par defaut - description: Description note: created_at: "créée à" updated_at: "Mise à jour à" - todo: - show_from: Afficher depuis - predecessors: "Dépend de" - notes: Note - tags: "Mots-clés" - project: Projet - description: Description - context: Contexte - due: "Echéance" preference: - show_hidden_projects_in_sidebar: "Montrer les projets cachés dans le panneau latéral" - show_hidden_contexts_in_sidebar: "Montrer les contextes cachés dans le panneau latéral" - date_format: Format date - sms_context: Contexte Email par default - verbose_action_descriptors: "Descripteurs d\\'action détaillés" - staleness_starts: "Début de dépassement" - mobile_todos_per_page: Actions par page (Vue Mobile) - show_number_completed: "Montrer le nombre d\\'action complétées" - title_date_format: Format de la date en titre - refresh: Intervalle de rafraichissement (en minutes) - week_starts: Les semaines commencent un - last_name: Nom + date_format: "Format date" due_style: "Style Echéance" - locale: Langue - time_zone: Fuseau horaire - sms_email: De l\'Email - show_project_on_todo_done: "Aller au projet quand la tâche est terminée" - show_completed_projects_in_sidebar: "Montrer les projets complétés dans le panneau latéral" first_name: Nom - review_period: Intervalle de revue de projet - user: last_name: Nom - first_name: "Prénom" + locale: Langue + mobile_todos_per_page: "Actions par page (Vue Mobile)" + refresh: "Intervalle de rafraichissement (en minutes)" + review_period: "Intervalle de revue de projet" + show_completed_projects_in_sidebar: "Montrer les projets complétés dans le panneau latéral" + show_hidden_contexts_in_sidebar: "Montrer les contextes cachés dans le panneau latéral" + show_hidden_projects_in_sidebar: "Montrer les projets cachés dans le panneau latéral" + show_number_completed: "Montrer le nombre d\\'action complétées" + show_project_on_todo_done: "Aller au projet quand la tâche est terminée" + sms_context: "Contexte Email par default" + sms_email: "De l\\'Email" + staleness_starts: "Début de dépassement" + time_zone: "Fuseau horaire" + title_date_format: "Format de la date en titre" + verbose_action_descriptors: "Descripteurs d\\'action détaillés" + week_starts: "Les semaines commencent un" + project: + default_context_name: "Contexte par defaut" + default_tags: "Tags par defaut" + description: Description + name: Nom + todo: + context: Contexte + description: Description + due: Echéance + notes: Note + predecessors: "Dépend de" + project: Projet + show_from: "Afficher depuis" + tags: Mots-clés + user: + first_name: Prénom + last_name: Nom errors: + full_messages: + format: "%{attribute} %{message}" + messages: + accepted: "doit être accepté" + blank: "ne peux être vide" + confirmation: "n\\'est pas identique à la confirmation" + empty: "ne peut être vide" + equal_to: "doit être égal à %{count}" + even: "doit être pair" + exclusion: exclusion? + greater_than: "doit être plus grand que %{count}" + greater_than_or_equal_to: "doit être plus grand ou égal à %{count}" + inclusion: "n\\'est pas inclus dans la liste" + invalid: "ne peut contenir le caractère virgule (\\',\\')" + less_than: "doit être inférieur à %{count}" + less_than_or_equal_to: "doit être inférieur ou égal à %{count}" + not_a_number: "n\\'est pas un nombre" + odd: "doit être impair" + record_invalid: "La validation à échoué : %{errors}" + taken: "est déjà pris" + too_long: "est trop long (maximum de %{count} caractères)" + too_short: "est trop court (minimum de %{count} charactères)" + wrong_length: "est de longueur incorrecte (doit être de %{count} caractères)" models: project: attributes: name: - blank: le projet doit avoir un nom - too_long: "le nom du projet doit faire moins de 256 caractères" + blank: "le projet doit avoir un nom" taken: "Existe déjà" - messages: - record_invalid: "La validation à échoué : %{errors}" - greater_than_or_equal_to: "doit être plus grand ou égal à %{count}" - confirmation: "n\\'est pas identique à la confirmation" - less_than_or_equal_to: "doit être inférieur ou égal à %{count}" - blank: "ne peux être vide" - exclusion: exclusion? - invalid: "ne peut contenir le caractère virgule (\\',\\')" - odd: "doit être impair" - even: "doit être pair" - empty: "ne peut être vide" - too_short: "est trop court (minimum de %{count} charactères)" - wrong_length: "est de longueur incorrecte (doit être de %{count} caractères)" - less_than: "doit être inférieur à %{count}" - greater_than: "doit être plus grand que %{count}" - equal_to: "doit être égal à %{count}" - accepted: "doit être accepté" - too_long: "est trop long (maximum de %{count} caractères)" - taken: "est déjà pris" - inclusion: n\'est pas inclus dans la liste - not_a_number: n\'est pas un nombre - full_messages: - format: "%{attribute} %{message}" + too_long: "le nom du projet doit faire moins de 256 caractères" template: body: "Il y a des problèmes avec les champs suivants :" header: one: "1 erreur a empéché ce %{model} d\\'être sauvegardé" other: "%{count} erreurs ont empéché ce %{model} d\\'être sauvegardé" + common: + action: Action + actions: Actions + actions_midsentence: + one: action + other: actions + zero: actions + add: Ajouter + ajaxError: "Une erreur s'est produite en accédant un serveur" + back: Retour + bugs: Bugs + cancel: Annuler + context: Contexte + contexts: Contextes + contribute: Contribuer + create: Créer + days_midsentence: + one: jour + other: jours + zero: jours + deferred: reportées + description: Description + drag_handle: DRAG + email: Email + errors_with_fields: "Il y a des problème avec les champs suivants :" + first: Premier + forth: FORTH + forum: Forum + fourth: Quatrième + go_back: Retour + last: Dernier + logout: Déconnexion + month: mois + months: Mois + next: Suivant + none: Aucun + not_available_abbr: n/a + note: + one: "1 noter" + other: "%{count} notes" + zero: "non notes" + notes: Notes + numbered_step: "Etape %{number}" + ok: Ok + optional: optionnel + previous: Précédente + project: Projet + projects: Projets + recurring_todos: "Répétition d'actions" + review: Revue + search: Rechercher + second: Seconde + server_error: "Une erreur s\\'est produite sur le serveur" + show_all: "Voir tous" + sort: + alphabetically: "Par ordre alphabétique" + alphabetically_confirm: "Etes vous sûr de vouloir trier ces projets par ordre alphabétique ? L\\'ordre actuel sera remplacé." + alphabetically_title: "Trier les projets par ordre alphabétique" + by_task_count: "Par nombre de tâches" + by_task_count_title: "Trier par nombre de tâches" + by_task_count_title_confirm: "Etes vous sûr de vouloir trier ces projets par nombre de tâches ? L\\'ordre actuel sera remplacé." + sort: Trier + third: Troisième + todo: Action + update: "Mettre à jour" + website: "Site Web" + week: semaine + weeks: semaines + wiki: Wiki + contexts: + add_context: "Ajouter un contexte" + all_completed_tasks_title: "TRACKS::Toutes les actions Achevé en le contexte '%{context_name}'" + completed_tasks_title: "TRACKS::actions Achevé en le contexte '%{context_name}'" + context_deleted: "Contexte \\'%{name}\\' supprimé" + context_hide: "Caché de la première page ?" + context_name: "Nom du Contexte" + delete_context: "Supprimer contexte" + delete_context_confirmation: "Etes vous sûr de vouloir supprimer le contexte %{name}? Toutes les actions (répétitives) de ce contexte seront également supprimées !" + delete_context_title: "Supprimer contexte" + edit_context: "Modifier contexte" + hidden_contexts: "Contextes cachés" + hide_form: "Cacher le formulaire" + hide_form_title: "Cacher le formulaire nouveau contexte" + last_completed_in_context: "dans ce contexte (dernier %{number})" + new_context_post: "'sera aussi créé. Etes-vous sûr ?" + new_context_pre: "Nouveau contexte '" + no_actions: "Actuellement, il n'y pas d'actions incomplètes dans ce contexte" + no_contexts_active: "Actuellement, il n'y a pas de contextes actifs" + no_contexts_hidden: "Actuellement, il n'y a pas de contextes cachés" + save_status_message: "Contexte sauvegardé" + show_form: "Créer un nouveau contexte" + show_form_title: "Ajouter un contexte" + status_active: "Le Contexte est actif" + status_hidden: "Le Contexte est caché" + todos_append: "dans ce contexte" + update_status_message: "Le nom du contexte à été modifié" + visible_contexts: "Contextes visibles" data: + import_errors: "Des erreurs se sont produites durant l'import" import_successful: "L'import a réussi." - import_errors: Des erreurs se sont produites durant l'import + date: + abbr_day_names: + - dim + - lun + - mar + - mer + - jeu + - ven + - sam + abbr_month_names: + - ~ + - jan. + - Fév. + - mar. + - avr. + - mai + - juin + - juil. + - aout + - sept. + - oct. + - nov. + - déc. + day_names: + - dimanche + - lundi + - mardi + - mercredi + - jeudi + - vendredi + - samedi + formats: + default: "%d/%m/%Y" + long: "%e %B %Y" + longer: "%A, %d %b %Y" + month_day: "%d. %B" + only_day: "%e" + short: "%e %b" + month_names: + - ~ + - janvier + - février + - mars + - avril + - mai + - juin + - juillet + - Aout + - septembre + - octobre + - novembre + - décembre + order: + - !ruby/symbol day + - !ruby/symbol month + - !ruby/symbol year + datetime: + distance_in_words: + about_x_hours: + one: "environ 1 heure" + other: "environ %{count} heures" + about_x_months: + one: "environ 1 mois" + other: "environ %{count} mois" + about_x_years: + one: "environ 1 an" + other: "environ %{count} ans" + almost_x_years: + one: "presque 1 an" + other: "presque %{count} ans" + half_a_minute: "une demi-minute" + less_than_x_minutes: + one: "moins d'une minute" + other: "moins de %{count} minutes" + zero: "Moins de 1 minute" + less_than_x_seconds: + one: "moins d'1 seconde" + other: "moins de %{count} secondes" + zero: "Moins de 1 seconde" + over_x_years: + one: "plus d'1 an" + other: "plus de %{count} ans" + x_days: + one: "1 jour" + other: "%{count} jours" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + x_months: + one: "1 mois" + other: "%{count} mois" + x_seconds: + one: "1 seconde" + other: "%{count} secondes" + prompts: + day: Jour + hour: Heure + minute: Minute + month: Mois + second: Secondes + year: Année + errors: + user_unauthorized: "401 Non autorisé: Administrateur seulement." + feedlist: + actions_completed_last_week: "Actions réalisées dans les 7 derniers jours" + actions_due_next_week: "Actions devant se terminer dans les 7 prochains jours ou moins" + actions_due_today: "Actions devant se terminer aujourd'hui ou avant" + active_projects_wo_next: "Projets actifs avec aucune action suivante" + active_starred_actions: "Toutes les actions préferrées actives" + all_actions: "Toutes les actions" + all_contexts: "Tous les contextes" + all_projects: "Tous les projets" + choose_context: "Choisir le contexte dont vous voulez un flux" + choose_project: "Choisir le projet dont vous voulez un flux" + context_centric_actions: "Flux des actions dans un contexte spécifique" + context_needed: "Il faut au moins un contexte pour le flux" + ical_feed: "Flux iCal" + last_fixed_number: "Dernières %{number} actions" + legend: Légende + notice_incomplete_only: "NB: Les flux ne montrent que les actions incomplètes, sauf indication contraire" + plain_text_feed: "Flux texte" + project_centric: "Flux des actions incomplètes d'un projet spécifique" + project_needed: "Il faut au moins un projet pour le flux" + projects_and_actions: "Projets actifs et leurs actions" + rss_feed: "Flux RSS" + select_feed_for_context: "Selectionner un flux pour ce contexte" + select_feed_for_project: "Selectionner le flux pour ce projet" + footer: + send_feedback: "Envoyer un feedback sur %{version}" + integrations: + applescript_next_action_prompt: "Description de l'action suivante:" + applescript_success_after_id: Créé + applescript_success_before_id: "Nouvelle action suivante avec ID" + gmail_description: "Gadget pour ajouter Tracks à Gmail" + opensearch_description: "Rechercher dans Tracks" + layouts: + mobile_navigation: + contexts: Contextes + feeds: Flux + home: Accueil + logout: Déconnexion + new_action: "0-Nouvelle action" + projects: Projets + starred: Marqué + tickler: Reporteur + navigation: + admin: Admin + api_docs: "Doc REST API" + calendar: Calendrier + calendar_title: "Calendrier des actions à échéance" + completed_tasks: Terminé + completed_tasks_title: Terminé + contexts_title: Contextes + export: Exporter + export_title: "Importer et exporter des données" + feeds: Flux + feeds_title: "Voir une liste des flux disponibles" + help: "?" + home: Accueil + home_title: Accueil + integrations_: "Intégrer Tracks" + manage_users: "Gestion des utilisateurs" + manage_users_title: "Ajouter ou supprimer des utilisateurs" + notes_title: "Voir toutes les notes" + organize: Organiser + preferences: Préférences + preferences_title: "Voir mes préférences" + projects_title: Projets + recurring_todos: "Tâches (todos) répétitives" + recurring_todos_title: "Gerer les actions récurrentes" + review_title: "Faire examiner" + search: "Recherches tous les items" + starred: Marqué + starred_title: "Voir vos actions préférées" + stats: Statistiques + stats_title: "Voir vos statistiques" + tickler: Reporteur + tickler_title: Reporteur + view: Vue + next_actions_rss_feed: "Flux RSS des prochaines actions" + toggle_contexts: "Basculer contextes effondré" + toggle_contexts_title: "Faire des contextes effondré (in)visibles" + toggle_notes: "Afficher/Cacher notes" + toggle_notes_title: "Afficher/Cacher toutes les notes" + login: + account_login: "Identifiant du compte" + cas_create_account: "Si vous voulez vous inscrire aller à %{signup_link}" + cas_logged_in_greeting: "Bonjour, %{username}! Vous êtes authentifié." + cas_login: "Login CAS" + cas_no_user_found: "Bonjour, %{username}! Vous n'avez pas de compte sur Tracks." + cas_signup_link: "Demander un compte" + cas_username_not_found: "Désolé, aucun utilisateur avec ce nom CAS n'existe (%{username})" + log_in_again: "Se reconnecter" + logged_out: "Vous avez été déconnecté de Tracks." + login_cas: "Aller au CAS" + login_standard: "retourner à l'écran de connexion standard" + login_with_openid: "se connecter avec un OpenID" + mobile_use_openid: "... ou ce connecter avec un OpenID" + openid_identity_url_not_found: "Désolé, aucun utilisateur avec cette identité URL n'existe (%{identity_url})" + option_separator: "ou," + please_login: "Veuillez vous connecter pour utiliser Tracks" + session_time_out: "La session à expiré. Merci de %{link}" + session_will_expire: "la session expire après %{hours} heure(s) d'inactivité." + session_will_not_expire: "la session n'expire jamais." + sign_in: "Se connecter" + successful: "La connexion à réussi. Bienvenue !" + successful_with_session_info: "La connexion à réussi:" + unsuccessful: "La connexion à échoué." + user_no_expiry: "Rester connecté" models: + preference: + due_in: "Echéance dans %{days} jours" + due_on: "Echéance le %{date}" + due_styles: + - "Echéance dans ____ jours" + - "Echéance le ____" project: - feed_title: Projets Tracks - feed_description: Liste de tous les projets de %{username} + feed_description: "Liste de tous les projets de %{username}" + feed_title: "Projets Tracks" todo: error_date_must_be_future: "doit être une date dans le futur" - preference: - due_on: "Echéance le %{date}" - due_in: "Echéance dans %{days} jours" - due_styles: - - "Echéance dans ____ jours" - - "Echéance le ____" user: error_context_not_associated: "L'identifiant contexte %{context} n'est pas associé à l'identifiant utilisateur %{user}." - error_project_not_associated: "L'identifiant projet %{context} n'est pas associé à l'identifiant utilisateur %{user}." + notes: + delete_confirmation: "Etes-vous sur de vouloir supprimer la note '%{id}' ?" + delete_item_title: "Supprimer l'élément" + delete_note_confirm: "Etes-vous sur de vouloir supprimer la note '%{id}' ?" + delete_note_title: "Supprimer la note '%{id}'" + deleted_note: "Supprimer la note '%{id}'" + edit_item_title: "Modifier l'élément" + in_project: "Dans:" + no_notes_available: "Il n'y a actuellement aucune note: ajouter des notes aux projets sur les pages individuelles des projets." + note_header: "Note %{id}" + note_link_title: "Voir note %{id}" + note_location_link: "ln:" + show_note_title: "Voir note" + number: + currency: + format: + delimiter: "," + format: "%u%n" + separator: "." + unit: $ + format: + delimiter: "," + precision: 2 + separator: "." + human: + format: + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: Octet + other: Octets + gb: GB + kb: KB + mb: MB + tb: TB + preferences: + authentication_header: "Votre authentification" + change_authentication_type: "Modifier votre type d'authentification" + change_identity_url: "Modifier votre URL d'identité" + change_password: "Modifier votre mot de passe" + current_authentication_type: "Votre type d'authentification est %{auth_type}" + edit_preferences: "Editer les préférences" + generate_new_token: "Générer un nouveau jeton" + generate_new_token_confirm: "Etes vous sûr ? Générer un nouveau jeton va remplacer le jeton existant et en interdire les utilisations externes." + is_false: faux + is_true: vrai + open_id_url: "Votre URL OpenID est" + page_title: "TRACKS::Préférences" + page_title_edit: "TRACKS::Editer les préférences" + password_changed: "Votre mot de passe a été changé, s'il vous plaît vous connecter à nouveau." + show_number_completed: "Montrer %{number} items réalisés" + sms_context_none: Aucun + staleness_starts_after: "\"date de fraicher\" dépassée à près %{days} days" + tabs: + authentication: Authentification + date_and_time: "Date et heure" + profile: Profil + tracks_behavior: "Comportements Tracks" + title: "Vos préférences" + token_description: "Jeton (pour flux et utilisation API)" + token_header: "Votre jeton" + updated: "Préférences jour" + projects: + actions_in_project_title: "Actions pour ce projet" + active_projects: "Projets actifs" + add_note: "Ajouter une note" + add_note_submit: "Ajouter note" + add_project: "Ajouter projet" + all_completed_tasks_title: "TRACKS::Tous les Actions Achevé en Projet '%{project_name}'" + completed_actions: "Actions réalisées pour ce projet" + completed_actions_empty: "Il n'y a pas d'actions réalisées pour ce projet" + completed_projects: "Projets réalisés" + completed_tasks_title: "TRACKS::Liste des actions menées à terme dans Projet '%{project_name}'" + default_context: "Le contexte par défaut pour ce projet est %{context}" + default_context_removed: "Contexte par défaut supprimé" + default_context_set: "Définir le contexte par défaut du projet à %{default_context}" + default_tags_removed_notice: "Supprimer les tags par defaut" + deferred_actions: "Actions reportées pour ce projet" + deferred_actions_empty: "Il n'y a pas d'actions reportées pour ce projet" + delete_project: "Supprimer projet" + delete_project_confirmation: "Etes vous sûr de vouloir supprimer le projet '%{name}' ?" + delete_project_title: "Supprimer le projet" + edit_project_settings: "Modifier les paramètres du projet" + edit_project_title: "Editer le projet" + hidden_projects: "Projets cachés" + hide_form: "Cacher le formulaire" + hide_form_title: "Cacher le formulaire nouveau projet" + is_active: "est actif" + list_completed_projects: "TRACKS::Liste des projets achevés" + list_projects: "TRACKS::Liste des Projets" + list_reviews: "TRACKS::Revue" + no_actions_in_project: "Il n'y pas d'action incomplètes pour ce projet" + no_default_context: "Ce projet n'a pas de contexte par defaut" + no_last_completed_projects: "Pas de projets terminés trouvés" + no_last_completed_recurring_todos: "Non terminé actions répétitives trouvées" + no_notes_attached: "Il n'y a actuellement aucune note attachée à ce projet" + no_projects: "Il n'y a actuellement aucun projet" + notes: Notes + notes_empty: "Il n'y a pas de notes pour ce projet" + page_title: "TRACKS::Projet: %{project}" + project_saved_status: "Projet sauvegardé" + project_state: "Le projet est %{state}" + set_default_tags_notice: "Définir les tags par défaut du projet à %{default_tags}" + settings: Paramètres + show_form: "Ajouter un projet" + show_form_title: "Créer un nouveau projet" + state: "Le projet est %{state}" + status_project_name_changed: "Le nom du projet a été modifié" + this_project: "Ce projet" + to_new_project_page: "Aller à la page du nouveau projet" + todos_append: "dans ce projet" + was_marked_complete: "est complété" + was_marked_hidden: "est caché" + with_default_context: "avec '%{context_name}' comme contexte par défaut" + with_no_default_context: "sans contexte par défaut" + with_no_default_tags: "et sans tags par défaut" + search: + contexts_matching_query: "Contextes correspondant à la requête" + no_results: "Aucun résultat à votre recherche." + notes_matching_query: "Notes correspondant à la requête" + projects_matching_query: "Projets correspondant à la requête" + tags_matching_query: "Tags correspondant à la requête" + todos_matching_query: "AFaire (todos) correspondant à la requête" + shared: + add_action: "Ajouter action" + add_actions: "Ajouter actions" + add_context: "Ajouter Contexte" + context_for_all_actions: "Contexte pour toutes les actions" + hide_action_form_title: "Cacher le formulaire nouvelle action" + hide_form: "Cacher le formulaire" + make_actions_dependent: "Faire actions dépendantes les unes des autres" + multiple_next_actions: "Actions suivante multiples (une sur chaque ligne)" + project_for_all_actions: "Projet pour toutes les actions" + separate_tags_with_commas: "séparer avec des virgules" + tags_for_all_actions: "Tags pour toutes les actions (sep. avec des virgules)" + toggle_multi: "Ajouter plusieurs actions suivantes" + toggle_multi_title: "Basculer formulaire action simple/multiple" + toggle_single: "Ajouter action suivante" + toggle_single_title: "Ajouter une nouvelle action suivante" + sidebar: + list_empty: Aucun + list_name_active_contexts: "Contextes actifs" + list_name_active_projects: "Projets actifs" + list_name_completed_projects: "Projets réalisés" + list_name_hidden_contexts: "Contextes cachés" + list_name_hidden_projects: "Projets cachés" + states: + active: Actif + active_plural: Actifs + blocked: Bloquée + blocked_plural: Bloquée + completed: Completé + completed_plural: Completés + current: Up-to-date + current_plural: Up-to-date + hidden: Caché + hidden_plural: Cachés + review: Datée + review_plural: Datée + stalled: Bloqués + stalled_plural: Bloqués + visible: Visible + visible_plural: Visibles stats: - totals_hidden_context_count: "et %{count} sont des contextes cachés." - actions_avg_created: "Dans les 12 derniers mois vous avez créé une moyenne de %{count} actions" - actions_min_max_completion_days: "Le nombre max/min de jours pour réaliser est %{min}/%{max}." - totals_actions_completed: "dont %{count} sont réalisées." - tag_cloud_title: Nuage de tag pour toutes les actions + action_completion_time_title: "Temps de réalisation (toutes les actions réalisées)" + action_selection_title: "TRACKS::Selection action" + actions: Actions + actions_30days_title: "Actions des 30 derniers jours" actions_actions_avg_created_30days: "Dans les 30 jours vous avez créer en moyenne %{count} actions" actions_avg_completed: "et réalisé une moyenne de %{count} actions par mois." - top5_visible_contexts_with_incomplete_actions: Top 5 des contextes visible avec des actions en cours - actions: Actions - time_of_day_legend: - number_of_actions: Nombre d'actions - time_of_day: Heure - totals_incomplete_actions: Vous avez %{count} actions en cours - totals_deferred_actions: "desquels %{count} sont des actions reportés dans le Reporteur" + actions_avg_completed_30days: "et réalisé une moyenne de %{count} actions par jour." + actions_avg_completion_time: "Pour toutes vos actions réalisés, le temps moyen de réalisation est %{count} jours." + actions_avg_created: "Dans les 12 derniers mois vous avez créé une moyenne de %{count} actions" + actions_day_of_week_legend: + day_of_week: "Jour de la semaine" + number_of_actions: "Certain nombre d'actions" + actions_day_of_week_title: "Jour de la semaine (toutes les actions)" + actions_dow_30days_legend: + day_of_week: "Jour de la semaine" + number_of_actions: "Certain nombre d'actions" + actions_dow_30days_title: "Jour de la semaine (les 30 derniers jours)" + actions_further: "et plus" + actions_last_year: "Actions des dernières années" + actions_last_year_legend: + months_ago: "Mois précédents" + number_of_actions: "Nombre d'actions" + actions_lastyear_title: "Actions des 12 derniers mois" + actions_min_completion_time: "Le temps minimum de réalisation est %{time}." + actions_min_max_completion_days: "Le nombre max/min de jours pour réaliser est %{min}/%{max}." + actions_selected_from_week: "Actions selectionnées depuis la semaine" + click_to_return: "Cliquer %{link} pour revenir à la page des statistiques" + click_to_return_link: ici + click_to_show_actions_from_week: "Cliquer %{link} pour voir les actions depuis la semaine %{week}." + click_to_update_actions: "Cliquer sur une barre du graphique pour mettre a jour les actions ci-dessous." + contexts: Contextes + current_running_time_of_incomplete_visible_actions: "Durée en cours des actions incomplètes visibles" + index_title: "TRACKS::Statistiques" + labels: + avg_completed: "Moy. Réalisé" + avg_created: "Moy. Créé" + completed: Complété + created: Créé + legend: + actions: Actions + day_of_week: "Jour de la semaine" + months_ago: "Il y a ... mois" + number_of_actions: "Nombre d'actions" + number_of_days: "Il y a ... jours" + percentage: Pourcentage + running_time: "Temps en cours d'une action (en semaines)" + more_stats_will_appear: "Plus de statistiques apparaitront quand vous aurez ajouter quelques actions." + no_actions_selected: "Il n'y a pas d'actions sélectionnées." + no_tags_available: "pas de tags disponibles" + open_per_week: "Actifs (visibles et cachés) prochaines actions par semaine" + open_per_week_legend: + actions: Actions + weeks: "Semaines Il ya" + other_actions_label: (autres) + projects: Projets + running_time_all: "Temps en cours de toutes les actions incomplètes" + running_time_all_legend: + actions: Actions + percentage: Pourcentage + running_time: "Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info" running_time_legend: actions: Actions percentage: Pourcentage - weeks: Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info - totals_action_count: vous avez un total de %{count} actions - tag_cloud_90days_title: Nuage de tag des actions des 90 derniers jours - actions_avg_completion_time: "Pour toutes vos actions réalisés, le temps moyen de réalisation est %{count} jours." - tod30: Heure (30 derniers jours) - tags: Tags - projects: Projets - totals_completed_project_count: "et %{count} sont des projets réalisés." - labels: - month_avg_completed: "%{month} mois moy. réalisé" - completed: "Complété" - month_avg_created: "%{month} mois moy. créé" - avg_created: "Moy. Créé" - avg_completed: "Moy. Réalisé" - created: "Créé" - actions_selected_from_week: "Actions selectionnées depuis la semaine" - actions_day_of_week_title: Jour de la semaine (toutes les actions) - actions_lastyear_title: Actions des 12 derniers mois - open_per_week: "Actifs (visibles et cachés) prochaines actions par semaine" - action_selection_title: TRACKS::Selection action - totals_project_count: Vous avez %{count} projets - legend: - number_of_days: Il y a ... jours - actions: Actions - number_of_actions: Nombre d'actions - day_of_week: Jour de la semaine - running_time: Temps en cours d'une action (en semaines) - percentage: Pourcentage - months_ago: Il y a ... mois - current_running_time_of_incomplete_visible_actions: "Durée en cours des actions incomplètes visibles" - tod30_legend: - number_of_actions: Nombre d'actions - time_of_day: Heure - totals_context_count: Vous avez %{count} contextes. - open_per_week_legend: - actions: Actions - weeks: Semaines Il ya - actions_last_year_legend: - number_of_actions: Nombre d'actions - months_ago: "Mois précédents" - top5_contexts: Top 5 des contextes - top10_projects: Top 10 des projets - contexts: Contextes - totals: Totaux - click_to_return: "Cliquer %{link} pour revenir à la page des statistiques" + weeks: "Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info" + spread_of_actions_for_all_context: "Vue des actions pour tous les contextes" + spread_of_running_actions_for_visible_contexts: "Vue des actions en cours pour tous les contextes" tag_cloud_90days_description: "Ce nuage de tag contient les tags des actions créées ou réalisées dans les 90 derniers jours." - totals_visible_context_count: De ceux-ci %{count} sont des contextes visibles - top10_projects_30days: Top 10 des projets des 30 derniers jours - running_time_all: "Temps en cours de toutes les actions incomplètes" - actions_min_completion_time: "Le temps minimum de réalisation est %{time}." - action_completion_time_title: "Temps de réalisation (toutes les actions réalisées)" - click_to_show_actions_from_week: Cliquer %{link} pour voir les actions depuis la semaine %{week}. - top10_longrunning: Top 10 des plus long projets en cours - no_actions_selected: "Il n'y a pas d'actions sélectionnées." - totals_tag_count: Vous avez %{count} tags sur des actions. - actions_further: et plus - actions_dow_30days_legend: - number_of_actions: Certain nombre d'actions - day_of_week: Jour de la semaine - totals_first_action: "Depuis votre première action du %{date}" + tag_cloud_90days_title: "Nuage de tag des actions des 90 derniers jours" tag_cloud_description: "Ce nuage de tags contient les tags de toutes les actions (réalisées, en cours, visibles ou cachées)" - spread_of_actions_for_all_context: Vue des actions pour tous les contextes - click_to_update_actions: Cliquer sur une barre du graphique pour mettre a jour les actions ci-dessous. - click_to_return_link: ici - more_stats_will_appear: Plus de statistiques apparaitront quand vous aurez ajouter quelques actions. - actions_avg_completed_30days: "et réalisé une moyenne de %{count} actions par jour." - index_title: TRACKS::Statistiques - actions_30days_title: Actions des 30 derniers jours - no_tags_available: pas de tags disponibles - actions_dow_30days_title: Jour de la semaine (les 30 derniers jours) - actions_day_of_week_legend: - number_of_actions: Certain nombre d'actions - day_of_week: Jour de la semaine - within_one: Moins de 1 - spread_of_running_actions_for_visible_contexts: Vue des actions en cours pour tous les contextes - actions_last_year: "Actions des dernières années" + tag_cloud_title: "Nuage de tag pour toutes les actions" + tags: Tags + time_of_day: "Heure (toutes les actions)" + time_of_day_legend: + number_of_actions: "Nombre d'actions" + time_of_day: Heure + tod30: "Heure (30 derniers jours)" + tod30_legend: + number_of_actions: "Nombre d'actions" + time_of_day: Heure + top10_longrunning: "Top 10 des plus long projets en cours" + top10_projects: "Top 10 des projets" + top10_projects_30days: "Top 10 des projets des 30 derniers jours" + top5_contexts: "Top 5 des contextes" + top5_visible_contexts_with_incomplete_actions: "Top 5 des contextes visible avec des actions en cours" + totals: Totaux + totals_action_count: "vous avez un total de %{count} actions" + totals_actions_completed: "dont %{count} sont réalisées." + totals_active_project_count: "De ceux-ci %{count} sont des projets actifs" totals_blocked_actions: "%{count} dépendent de la réalisation de leurs actions" - totals_unique_tags: De ces tags, %{count} sont uniques. - totals_active_project_count: De ceux-ci %{count} sont des projets actifs - running_time_all_legend: - actions: Actions - running_time: Temps en cours d'une action (en semaines). Cliquer sur une barre pour plus d'info - percentage: Pourcentage - other_actions_label: (autres) + totals_completed_project_count: "et %{count} sont des projets réalisés." + totals_context_count: "Vous avez %{count} contextes." + totals_deferred_actions: "desquels %{count} sont des actions reportés dans le Reporteur" + totals_first_action: "Depuis votre première action du %{date}" + totals_hidden_context_count: "et %{count} sont des contextes cachés." totals_hidden_project_count: "%{count} sont cachés" - time_of_day: Heure (toutes les actions) + totals_incomplete_actions: "Vous avez %{count} actions en cours" + totals_project_count: "Vous avez %{count} projets" + totals_tag_count: "Vous avez %{count} tags sur des actions." + totals_unique_tags: "De ces tags, %{count} sont uniques." + totals_visible_context_count: "De ceux-ci %{count} sont des contextes visibles" + within_one: "Moins de 1" + support: + array: + last_word_connector: ", et" + two_words_connector: et + words_connector: "," + select: + prompt: "Veuillez sélectionner" + time: + am: am + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + long: "%B %d, %Y %H:%M" + month_day: "%B %d" + short: "%d %b %H:%M" + stats: "%a %d-%m" + time: "%H:%M" + pm: pm todos: - recurring_action_deleted: "L'action a été supprimée. Parce que cette action est récurrente, une nouvelle action à été ajoutée" - show_from: Afficher depuis - error_starring_recurring: "Impossible d'actionner l'étoile de la tache récurrente \\'%{description}\\'" - completed_actions: "Action complétées" - added_new_next_action: "Nouvelle action suivante ajoutée" - completed_recurring: "Tâches reccurents complétés" - completed_rest_of_previous_month: "Complété dans le reste du mois précédent" - blocked_by: "Bloqué par %{predecessors}" - star_action: Elire cette action - completed_recurrence_completed: "Il n'y pas d'action suivante après l'action récurrente que vous avez supprimée. La récurrence est terminée" - defer_date_after_due_date: "La date de report est après la date d'échéance. Veuillez ajuster la date d'écheance avant de reporter." - unable_to_add_dependency: "Impossible d'ajouter la dépendance" - done: "Terminé ?" - star_action_with_description: Elire l'action '%{description}' - tagged_with: "taggé avec ‘%{tag_name}’" - completed: "Complété" - no_deferred_actions_with: "Pas d'actions reportées avec le tag '%{tag_name}'" - no_hidden_actions: "Il n'y a pas d'actions cachées actuellement" - edit_action_with_description: Modifier l'action '%{description}' - action_due_on: "(action à terminer avant le %{date})" - list_incomplete_next_actions: "Liste les prochaines actions incomplètes" - archived_tasks_title: "TRACKS::Tâches réalisées archivées" - remove_dependency: "Enlever les dépendances (l'action n'est pas supprimée)" - action_deleted_success: "L'action suivante à été supprimée avec succès" - tags: "Tags (séparés par des virgules)" - delete_recurring_action_title: "Supprimer l'action récurrente" - context_changed: "Contexte changé en %{name}" - new_related_todo_created: "Une nouvelle tâche a été ajoutée qui appartient à cette tâche récurrente" - mobile_todos_page_title: Toutes les actions - add_another_dependency: "Ajouter une autre dépendance" - removed_predecessor: "Suppression de %{successor} comme dépendance de %{predecessor}" - recurring_actions_title: "TRACKS::Actions récurrentes" - next_action_needed: Vous devez soumettre au moins une prochaine action - action_saved: "Action sauvegardée" - scheduled_overdue: "Programmée pour apparaitre il y a %{days} jours" + action_deferred: "L'action '%{description}' a été reporté" action_deleted_error: "La suppression de l'action a échoué" - edit_action: Modifier action + action_deleted_success: "L'action suivante à été supprimée avec succès" + action_due_on: "(action à terminer avant le %{date})" + action_marked_complete: "L'action '%{description}' a été marquée comme %{completed}" + action_marked_complete_error: "L'action '%{description}' n'a PAS été marquée comme %{completed} a cause d'une erreur sur le serveur " + action_saved: "Action sauvegardée" + action_saved_to_tickler: "Action sauvegardée dans le Reporteur" + add_another_dependency: "Ajouter une autre dépendance" + add_new_recurring: "Ajouter une nouvelle action récurrente" + added_dependency: "%{dependency} ajoutée comme dépendance" added_new_context: "Nouveau context ajouté" - next_actions_description: "Filtre:" - list_incomplete_next_actions_with_limit: "Liste les %{count} dernières actions suivantes incomplètes" - set_to_pending: "%{task} mise en attente" + added_new_next_action: "Nouvelle action suivante ajoutée" + added_new_next_action_plural: "Nouvelles actions suivantes ajoutées" + added_new_next_action_singular: "Nouvelle action suivante ajoutée" added_new_project: "Nouveau projet ajouté" + all_completed: "Toutes les actions réalisées" + all_completed_here: ici + all_completed_tagged_page_title: "TRACKS::Toutes les tâches accomplies par marquer %{tag_name}" + append_in_this_project: "dans ce projet" + archived_tasks_title: "TRACKS::Tâches réalisées archivées" + blocked_by: "Bloqué par %{predecessors}" + calendar: + due_next_month_and_later: "A réaliser dans %{month} et plus" + due_next_week: "A réaliser la semaine prochaine" + due_this_month: "A réaliser avant la fin de %{month}" + due_this_week: "A réaliser avant la fin de cette semaine" + due_today: "A réaliser aujourd'hui" + get_in_ical_format: "Obtenir ce calendrier au format iCal" + no_actions_due_after_this_month: "Pas d'actions à réaliser après ce mois" + no_actions_due_next_week: "Pas d'actions à terminer la semaine prochaine" + no_actions_due_this_month: "Pas d'actions à terminer pour ce mois" + no_actions_due_today: "Pas d'action à terminer aujourd'hui" + calendar_page_title: "TRACKS::Calendrier" + cannot_add_dependency_to_completed_todo: "Impossible d'ajouter cette action comme dépendance d'une action complétée !" + clear_due_date: "Effacer la date d'échéance" + clear_show_from_date: "Effacer show from date" + completed: Complété + completed_actions: "Action complétées" + completed_actions_with: "Action complétées avec le tag %{tag_name}" + completed_in_archive: + one: "Il n'y a pas d'action complétée dans l'archive" + other: "Il y a %{count} actions complétées dans l'archive" + completed_last_day: "Complété ces dernières 24 heures" + completed_last_x_days: "Complété ces %{count} jours" + completed_recurrence_completed: "Il n'y pas d'action suivante après l'action récurrente que vous avez supprimée. La récurrence est terminée" + completed_recurring: "Tâches reccurents complétés" + completed_rest_of_month: "Complété dans le reste de ce mois-ci" + completed_rest_of_previous_month: "Complété dans le reste du mois précédent" + completed_rest_of_week: "Complété dans le reste de cette semaine" + completed_tagged_page_title: "TRACKS::Les tâches terminées avec marquer %{tag_name}" + completed_tasks_title: "TRACKS::Tâches complétées" + confirm_delete: "Etes-vous sûr de vouloir supprimer l'action '%{description}' ?" + context_changed: "Contexte changé en %{name}" + convert_to_project: "Faire projet" + defer_date_after_due_date: "La date de report est après la date d'échéance. Veuillez ajuster la date d'écheance avant de reporter." + defer_x_days: + one: "Reporter d'un jour" + other: "Report de %{count} jours" + deferred_actions_with: "Action reportées avec le tag '%{tag_name}'" + deferred_pending_actions: "Actions reportées ou en attente" + deferred_tasks_title: "TRACKS::Reporteur" + delete: Supprimer + delete_action: "Supprimer action" + delete_recurring_action_title: "Supprimer l'action récurrente" + deleted_success: "Action supprimée avec succès." + depends_on: "Dépend de" + depends_on_separate_with_commas: "Dépend de (séparer avec des virgules)" + done: "Terminé ?" + drag_action_title: "Déplacer sur une autre action pour la rendre dépendante de cette action" + due: Echéance + edit: Modifier + edit_action: "Modifier action" + edit_action_with_description: "Modifier l'action '%{description}'" + edit_recurring_todo: "Modifier l'action répétant" + error_completing_todo: "Il s'est produit une erreur lors de l'execution de l'action récurrente %{description}" + error_deleting_item: "Il s'est produit une erreur lors de la suppression de l'élément %{description}" + error_deleting_recurring: "Il s'est produit une erreur lors de la suppression de la tâche récurrente \\'%{description}\\'" + error_removing_dependency: "Il s'est produit une erreur lors de la suppression de la dépendance" + error_saving_recurring: "Il s'est produit une erreur lors de la sauvegarde de la tâche récurrente \\'%{description}\\'" + error_starring: "Impossible d'actionner l'étoile de cette tache \\'%{description}\\'" + error_starring_recurring: "Impossible d'actionner l'étoile de la tache récurrente \\'%{description}\\'" + error_toggle_complete: "Impossible de marquer cette tache comme complétée" + feed_title_in_context: "dans le contexte '%{context}'" + feed_title_in_project: "dans le projet '%{project}'" + feeds: + completed: "Complété : %{date}" + due: "Echéance : %{date}" + has_x_pending: + one: "A une action en attente" + other: "A %{count} actions en attente" + hidden_actions: "Actions cachées" + in_hidden_state: "a l\\'état caché" + in_pending_state: "en attente" + list_incomplete_next_actions: "Liste les prochaines actions incomplètes" + list_incomplete_next_actions_with_limit: "Liste les %{count} dernières actions suivantes incomplètes" + mobile_todos_page_title: "Toutes les actions" + new_related_todo_created: "Une nouvelle tâche a été ajoutée qui appartient à cette tâche récurrente" + new_related_todo_created_short: "à créé une nouvelle tâche" + new_related_todo_not_created_short: "n'a pas créé la tâche" + next_action_description: "Description de la prochaine action" + next_action_needed: "Vous devez soumettre au moins une prochaine action" + next_actions_description: "Filtre:" + next_actions_description_additions: + completed: "dans les %{count} derniers jours" + due_date: "avec au plus la date d'échéance %{due_date}" + next_actions_due_date: + due_in_x_days: "Echéance dans %{days} days" + due_today: "Echéance aujourd'hui" + due_tomorrow: "Echéance demain" + overdue_by: "Dépassée de %{days} jour" + overdue_by_plural: "Dépassée de %{days} jours" + next_actions_title: "Tracks - Prochaines Actions" next_actions_title_additions: completed: "Actions complétées" due_today: "échéance aujourd'hui" due_within_a_week: "échéance dans la semaine" - older_completed_items: "Anciens éléments complétés" no_actions_due_this_week: "Pas actions à faire cette semaine" - all_completed_here: ici - append_in_this_project: dans ce projet - edit_recurring_todo: "Modifier l'action répétant" - error_deleting_item: "Il s'est produit une erreur lors de la suppression de l'élément %{description}" - task_list_title: "TRACKS::Lister les tâches" - no_recurring_todos: "Il n'y a pas de tâches récurrentes actuellement" - error_completing_todo: "Il s'est produit une erreur lors de l'execution de l'action récurrente %{description}" - recurring_pattern_removed: "La périodicité est retiré de %{count}" - convert_to_project: Faire projet - no_deferred_pending_actions: "Il n'y pas d'actions reportées ou en attente actuellement" - delete_recurring_action_confirm: "Etes-vous sûr de vouloir supprimer l'action récurrente '%{description'}?" - completed_last_day: "Complété ces dernières 24 heures" - feed_title_in_context: dans le contexte '%{context}' - no_project: --Pas de projet-- - show_in_days: Afficher dans %{days} jours - error_saving_recurring: "Il s'est produit une erreur lors de la sauvegarde de la tâche récurrente \\'%{description}\\'" - completed_more_than_x_days_ago: "Complété il y a plus de %{count} jours" - new_related_todo_created_short: "à créé une nouvelle tâche" - all_completed: "Toutes les actions réalisées" - edit: Modifier - completed_actions_with: "Action complétées avec le tag %{tag_name}" - older_than_days: Plus ancien que %{count} jours - completed_tagged_page_title: "TRACKS::Les tâches terminées avec marquer %{tag_name}" - pending: En attente - completed_tasks_title: "TRACKS::Tâches complétées" - deleted_success: "Action supprimée avec succès." - feed_title_in_project: dans le projet '%{project}' - clear_due_date: "Effacer la date d'échéance" - error_removing_dependency: "Il s'est produit une erreur lors de la suppression de la dépendance" - hidden_actions: "Actions cachées" - was_due_on_date: "arrivée à échéance le %{date}" - show_on_date: Afficher le %{date} - recurrence_period: "Periode de récurrence" - deferred_actions_with: "Action reportées avec le tag '%{tag_name}'" - confirm_delete: "Etes-vous sûr de vouloir supprimer l'action '%{description}' ?" - recurring_deleted_success: "L'action récurrente a été supprimée avec succès." - no_completed_actions_with: "Pas d'actions complétées avec le tag '%{tag_name}'" - next_actions_title: Tracks - Prochaines Actions - next_action_description: Description de la prochaine action - deferred_tasks_title: TRACKS::Reporteur - clear_show_from_date: Effacer show from date - in_hidden_state: "a l\\'état caché" - see_all_completed: Vous pouvez voir toutes les actions accomplies %{link} - calendar_page_title: TRACKS::Calendrier - unresolved_dependency: "La valeur saisie dans le champ dépendance ne correspond pas à une action existante. Cette valeur ne sera pas sauvegardée avec le reste de l'action. Continuer ?" + no_actions_found: "Il n'y pas d'actions incomplètes actuellement." no_actions_found_title: "Aucune action trouvée" - show_today: Afficher aujourd'hui - next_actions_due_date: - overdue_by: "Dépassée de %{days} jour" - due_in_x_days: "Echéance dans %{days} days" - due_today: "Echéance aujourd'hui" - overdue_by_plural: "Dépassée de %{days} jours" - due_tomorrow: "Echéance demain" - completed_last_x_days: "Complété ces %{count} jours" no_actions_with: "Il n'y pas d'actions incomplètes avec le tag '%{tag_name}' actuellement" - defer_x_days: - one: Reporter d'un jour - other: Report de %{count} jours - added_new_next_action_singular: "Nouvelle action suivante ajoutée" no_completed_actions: "Il n'y a pas d'actions complétées actuellement." - deferred_pending_actions: "Actions reportées ou en attente" - has_x_pending: - one: A une action en attente - other: A %{count} actions en attente - feeds: - completed: "Complété : %{date}" - due: "Echéance : %{date}" - recurring_todos: "Tâches récurrentes" - error_deleting_recurring: "Il s'est produit une erreur lors de la suppression de la tâche récurrente \\'%{description}\\'" - delete_action: Supprimer action - delete: Supprimer + no_completed_actions_with: "Pas d'actions complétées avec le tag '%{tag_name}'" + no_completed_recurring: "Il n'y a pas d'actions récurrentes complétées actuellement" + no_deferred_actions: "Il n'y a pas d'actions reportées actuellement" + no_deferred_actions_with: "Pas d'actions reportées avec le tag '%{tag_name}'" + no_deferred_pending_actions: "Il n'y pas d'actions reportées ou en attente actuellement" + no_hidden_actions: "Il n'y a pas d'actions cachées actuellement" + no_incomplete_actions: "Il n'y a pas d'actions incomplètes" no_last_completed_actions: "Aucune action achevée trouve" - drag_action_title: "Déplacer sur une autre action pour la rendre dépendante de cette action" - cannot_add_dependency_to_completed_todo: "Impossible d'ajouter cette action comme dépendance d'une action complétée !" - depends_on: "Dépend de" + no_project: "--Pas de projet--" + no_recurring_todos: "Il n'y a pas de tâches récurrentes actuellement" + older_completed_items: "Anciens éléments complétés" + overdue: "En retard" + pending: "En attente" + recurrence: + daily: Quotidiennement + daily_every_number_day: "Tous les %{number} jour(s)" + daily_options: "Paramètres des actions récurrentes quotidiennes" + day_x_on_every_x_month: "Le %{day} tous les %{month} mois" + ends_on: "Fini le" + ends_on_date: "Fini le %{date}" + ends_on_number_times: "Fini au bout de %{number} fois" + every_work_day: "Chaque jour ouvré" + from_tickler: "la date de la tâche provient du reporteur (pas de date d\\'échéance définie)" + monthly: Mensuellement + monthly_every_xth_day: "Le %{day} %{day_of_week} tous les %{month} mois" + monthly_options: "Paramètres pour les actions récurrentes mensuelles" + no_end_date: "Pas de date de fin" + pattern: + day_names: + - Dimanche + - Lundi + - Mardi + - Mercredi + - Jeudi + - Vendredi + - Samedi + due: Echéance + every_day: "chaque jour" + every_month: "chaque mois" + every_n: "tous les %{n}" + every_xth_day_of_every_n_months: "tous les %{x} %{day} tous les %{n_months}" + every_year_on: "chaque année le %{date}" + first: premier + fourth: quatrième + from: de + last: dernier + month_names: + - ~ + - Janvier + - Février + - Mars + - Avril + - Mai + - Juin + - Juillet + - Aout + - Septembre + - Octobre + - Novembre + - Décembre + on_day_n: "le %{n}e jour" + on_work_days: "les jours ouvrés" + second: seconde + show: montrer + the_xth_day_of_month: "le %{x} %{day} de %{month}" + third: troisième + times: "pour %{number} fois" + until: jusqu'a + weekly: "Toutes les semaines" + recurrence_on_due_date: "La date d'échéance de la tâche" + recurrence_on_options: "Activer la récurrence" + show_days_before: "%{days} jours avant la date d'échéance de la tâche" + show_option_always: toujours + show_options: "Montrer la tâche" + starts_on: "Démarre le" + weekly: "Toutes les semaines" + weekly_every_number_week: "Returns every %{number} week on" + weekly_options: "Paramètres pour les actions récurrentes hebdomadaires" + yearly: "Tous les ans" + yearly_every_x_day: "Chaque %{month} %{day}" + yearly_every_xth_day: "Chaque %{day} %{day_of_week} de %{month}" + yearly_options: "Paramètres pour les actions récurrentes annuelles" + recurrence_completed: "Il n'y a pas d'action suivante après l'action récurrente que vous venez de terminer. Fin de la récurrence" + recurrence_period: "Periode de récurrence" + recurring_action_deleted: "L'action a été supprimée. Parce que cette action est récurrente, une nouvelle action à été ajoutée" + recurring_action_saved: "Action récurrente sauvée" + recurring_actions_title: "TRACKS::Actions récurrentes" + recurring_deleted_success: "L'action récurrente a été supprimée avec succès." + recurring_pattern_removed: "La périodicité est retiré de %{count}" + recurring_todos: "Tâches récurrentes" + remove_dependency: "Enlever les dépendances (l'action n'est pas supprimée)" + removed_predecessor: "Suppression de %{successor} comme dépendance de %{predecessor}" + scheduled_overdue: "Programmée pour apparaitre il y a %{days} jours" + see_all_completed: "Vous pouvez voir toutes les actions accomplies %{link}" + set_to_pending: "%{task} mise en attente" + show_from: "Afficher depuis" + show_in_days: "Afficher dans %{days} jours" + show_on_date: "Afficher le %{date}" + show_today: "Afficher aujourd'hui" + show_tomorrow: "Afficher demain" + star_action: "Elire cette action" + star_action_with_description: "Elire l'action '%{description}'" + tagged_page_title: "TRACKS::Taggé avec %{tag_name}'" + tagged_with: "taggé avec ‘%{tag_name}’" + tags: "Tags (séparés par des virgules)" + task_list_title: "TRACKS::Lister les tâches" tickler_items_due: one: "Un élément du reporteur est arrivé à échéance - rafraichir la page pour le voir." other: "%{count} éléments du reporteur sont arrivés à échéance - rafraichir la page pour les voir." - action_marked_complete: "L'action '%{description}' a été marquée comme %{completed}" - completed_today: "otherVous avez complété %{count} action aujourd'huioneVous avez complété une action aujourd'hui" - added_new_next_action_plural: "Nouvelles actions suivantes ajoutées" - new_related_todo_not_created_short: "n'a pas créé la tâche" - completed_rest_of_week: "Complété dans le reste de cette semaine" - show_tomorrow: Afficher demain - error_starring: "Impossible d'actionner l'étoile de cette tache \\'%{description}\\'" - calendar: - get_in_ical_format: Obtenir ce calendrier au format iCal - due_next_week: "A réaliser la semaine prochaine" - no_actions_due_next_week: "Pas d'actions à terminer la semaine prochaine" - due_this_week: "A réaliser avant la fin de cette semaine" - no_actions_due_today: "Pas d'action à terminer aujourd'hui" - due_today: "A réaliser aujourd'hui" - due_next_month_and_later: "A réaliser dans %{month} et plus" - no_actions_due_after_this_month: "Pas d'actions à réaliser après ce mois" - no_actions_due_this_month: "Pas d'actions à terminer pour ce mois" - due_this_month: "A réaliser avant la fin de %{month}" - no_completed_recurring: "Il n'y a pas d'actions récurrentes complétées actuellement" - recurrence: - ends_on_date: Fini le %{date} - every_work_day: "Chaque jour ouvré" - ends_on_number_times: Fini au bout de %{number} fois - recurrence_on_due_date: "La date d'échéance de la tâche" - weekly_options: "Paramètres pour les actions récurrentes hebdomadaires" - weekly: Toutes les semaines - monthly_options: "Paramètres pour les actions récurrentes mensuelles" - daily_options: "Paramètres des actions récurrentes quotidiennes" - monthly: Mensuellement - starts_on: "Démarre le" - daily: Quotidiennement - show_option_always: toujours - pattern: - third: "troisième" - month_names: - - - - Janvier - - "Février" - - Mars - - Avril - - Mai - - Juin - - Juillet - - Aout - - Septembre - - Octobre - - Novembre - - "Décembre" - every_n: tous les %{n} - second: seconde - every_xth_day_of_every_n_months: tous les %{x} %{day} tous les %{n_months} - on_day_n: le %{n}e jour - weekly: Toutes les semaines - from: de - last: dernier - every_day: chaque jour - the_xth_day_of_month: le %{x} %{day} de %{month} - times: pour %{number} fois - first: premier - show: montrer - every_year_on: "chaque année le %{date}" - on_work_days: "les jours ouvrés" - day_names: - - Dimanche - - Lundi - - Mardi - - Mercredi - - Jeudi - - Vendredi - - Samedi - fourth: "quatrième" - due: "Echéance" - every_month: chaque mois - until: jusqu'a - yearly_every_x_day: Chaque %{month} %{day} - recurrence_on_options: "Activer la récurrence" - daily_every_number_day: Tous les %{number} jour(s) - show_options: "Montrer la tâche" - weekly_every_number_week: Returns every %{number} week on - ends_on: Fini le - show_days_before: "%{days} jours avant la date d'échéance de la tâche" - from_tickler: "la date de la tâche provient du reporteur (pas de date d\\'échéance définie)" - no_end_date: Pas de date de fin - day_x_on_every_x_month: Le %{day} tous les %{month} mois - yearly_every_xth_day: Chaque %{day} %{day_of_week} de %{month} - yearly_options: "Paramètres pour les actions récurrentes annuelles" - yearly: Tous les ans - monthly_every_xth_day: Le %{day} %{day_of_week} tous les %{month} mois - action_deferred: "L'action '%{description}' a été reporté" - tagged_page_title: "TRACKS::Taggé avec %{tag_name}'" - added_dependency: "%{dependency} ajoutée comme dépendance" - completed_rest_of_month: "Complété dans le reste de ce mois-ci" - all_completed_tagged_page_title: "TRACKS::Toutes les tâches accomplies par marquer %{tag_name}" - no_deferred_actions: "Il n'y a pas d'actions reportées actuellement" - recurrence_completed: "Il n'y a pas d'action suivante après l'action récurrente que vous venez de terminer. Fin de la récurrence" - action_marked_complete_error: "L'action '%{description}' n'a PAS été marquée comme %{completed} a cause d'une erreur sur le serveur " - no_actions_found: "Il n'y pas d'actions incomplètes actuellement." - in_pending_state: en attente - error_toggle_complete: "Impossible de marquer cette tache comme complétée" - due: "Echéance" - no_incomplete_actions: "Il n'y a pas d'actions incomplètes" - action_saved_to_tickler: "Action sauvegardée dans le Reporteur" - recurring_action_saved: "Action récurrente sauvée" - depends_on_separate_with_commas: "Dépend de (séparer avec des virgules)" - completed_in_archive: - one: "Il n'y a pas d'action complétée dans l'archive" - other: "Il y a %{count} actions complétées dans l'archive" - to_tickler: Vers le reporteur - next_actions_description_additions: - completed: dans les %{count} derniers jours - due_date: "avec au plus la date d'échéance %{due_date}" - overdue: En retard - add_new_recurring: "Ajouter une nouvelle action récurrente" - notes: - delete_note_title: Supprimer la note '%{id}' - delete_confirmation: Etes-vous sur de vouloir supprimer la note '%{id}' ? - in_project: "Dans:" - delete_item_title: "Supprimer l'élément" - deleted_note: Supprimer la note '%{id}' - note_link_title: Voir note %{id} - show_note_title: Voir note - edit_item_title: "Modifier l'élément" - note_location_link: "ln:" - no_notes_available: "Il n'y a actuellement aucune note: ajouter des notes aux projets sur les pages individuelles des projets." - note_header: Note %{id} - delete_note_confirm: Etes-vous sur de vouloir supprimer la note '%{id}' ? - projects: - default_context_set: "Définir le contexte par défaut du projet à %{default_context}" - no_actions_in_project: "Il n'y pas d'action incomplètes pour ce projet" - deferred_actions: "Actions reportées pour ce projet" - was_marked_hidden: "est caché" - edit_project_title: Editer le projet - default_tags_removed_notice: Supprimer les tags par defaut - page_title: "TRACKS::Projet: %{project}" - all_completed_tasks_title: "TRACKS::Tous les Actions Achevé en Projet '%{project_name}'" - hide_form: Cacher le formulaire - list_completed_projects: "TRACKS::Liste des projets achevés" - no_notes_attached: "Il n'y a actuellement aucune note attachée à ce projet" - to_new_project_page: "Aller à la page du nouveau projet" - show_form_title: "Créer un nouveau projet" - deferred_actions_empty: "Il n'y a pas d'actions reportées pour ce projet" - project_state: Le projet est %{state} - this_project: Ce projet - no_last_completed_projects: "Pas de projets terminés trouvés" - no_last_completed_recurring_todos: "Non terminé actions répétitives trouvées" - notes: Notes - todos_append: dans ce projet - list_reviews: TRACKS::Revue - notes_empty: Il n'y a pas de notes pour ce projet - no_projects: Il n'y a actuellement aucun projet - hide_form_title: Cacher le formulaire nouveau projet - delete_project: Supprimer projet - completed_actions_empty: "Il n'y a pas d'actions réalisées pour ce projet" - with_no_default_context: "sans contexte par défaut" - delete_project_confirmation: "Etes vous sûr de vouloir supprimer le projet '%{name}' ?" - with_default_context: "avec '%{context_name}' comme contexte par défaut" - show_form: Ajouter un projet - actions_in_project_title: Actions pour ce projet - completed_projects: "Projets réalisés" - is_active: est actif - add_note: Ajouter une note - set_default_tags_notice: "Définir les tags par défaut du projet à %{default_tags}" - add_project: Ajouter projet - settings: "Paramètres" - project_saved_status: "Projet sauvegardé" - list_projects: TRACKS::Liste des Projets - with_default_tags: et avec '%{tags'} comme tags par defaut - completed_tasks_title: "TRACKS::Liste des actions menées à terme dans Projet '%{project_name}'" - hidden_projects: "Projets cachés" - delete_project_title: Supprimer le projet - default_context_removed: "Contexte par défaut supprimé" - add_note_submit: Ajouter note - completed_actions: "Actions réalisées pour ce projet" - was_marked_complete: "est complété" - no_default_context: Ce projet n'a pas de contexte par defaut - with_no_default_tags: "et sans tags par défaut" - default_context: "Le contexte par défaut pour ce projet est %{context}" - edit_project_settings: "Modifier les paramètres du projet" - status_project_name_changed: "Le nom du projet a été modifié" - state: Le projet est %{state} - active_projects: Projets actifs - states: - hidden_plural: "Cachés" - stalled: "Bloqués" - review_plural: "Datée" - completed: "Completé" - current: Up-to-date - review: "Datée" - completed_plural: "Completés" - blocked: "Bloquée" - blocked_plural: "Bloquée" - stalled_plural: "Bloqués" - visible_plural: Visibles - active_plural: Actifs - visible: Visible - hidden: "Caché" - active: Actif - current_plural: Up-to-date - errors: - user_unauthorized: "401 Non autorisé: Administrateur seulement." - preferences: - open_id_url: Votre URL OpenID est - change_identity_url: "Modifier votre URL d'identité" - staleness_starts_after: "\"date de fraicher\" dépassée à près %{days} days" - page_title: "TRACKS::Préférences" - change_password: Modifier votre mot de passe - token_description: Jeton (pour flux et utilisation API) - title: "Vos préférences" - is_false: faux - show_number_completed: "Montrer %{number} items réalisés" - password_changed: "Votre mot de passe a été changé, s'il vous plaît vous connecter à nouveau." - edit_preferences: "Editer les préférences" - page_title_edit: "TRACKS::Editer les préférences" - is_true: vrai - sms_context_none: Aucun - generate_new_token: "Générer un nouveau jeton" - token_header: Votre jeton - authentication_header: Votre authentification - updated: "Préférences jour" - current_authentication_type: Votre type d'authentification est %{auth_type} - change_authentication_type: Modifier votre type d'authentification - generate_new_token_confirm: "Etes vous sûr ? Générer un nouveau jeton va remplacer le jeton existant et en interdire les utilisations externes." - tabs: - authentication: Authentification - tracks_behavior: Comportements Tracks - profile: Profil - date_and_time: Date et heure - time: - am: am - formats: - stats: "%a %d-%m" - default: "%a, %d %b %Y %H:%M:%S %z" - time: "%H:%M" - short: "%d %b %H:%M" - month_day: "%B %d" - long: "%B %d, %Y %H:%M" - pm: pm - date: - month_names: - - - - janvier - - "février" - - mars - - avril - - mai - - juin - - juillet - - Aout - - septembre - - octobre - - novembre - - "décembre" - abbr_day_names: - - dim - - lun - - mar - - mer - - jeu - - ven - - sam - order: - - :day - - :month - - :year - formats: - only_day: "%e" - longer: "%A, %d %b %Y" - default: "%d/%m/%Y" - short: "%e %b" - month_day: "%d. %B" - long: "%e %B %Y" - day_names: - - dimanche - - lundi - - mardi - - mercredi - - jeudi - - vendredi - - samedi - abbr_month_names: - - - - jan. - - "Fév." - - mar. - - avr. - - mai - - juin - - juil. - - aout - - sept. - - oct. - - nov. - - déc. + to_tickler: "Vers le reporteur" + unable_to_add_dependency: "Impossible d'ajouter la dépendance" + unresolved_dependency: "La valeur saisie dans le champ dépendance ne correspond pas à une action existante. Cette valeur ne sera pas sauvegardée avec le reste de l'action. Continuer ?" + was_due_on_date: "arrivée à échéance le %{date}" + users: + account_signup: "Créer un compte" + auth_change_submit: "Modifier le type d'authenfication" + auth_type_update_error: "Un problème est survenu lors de la modification du type d'authentification : %{error_messages}" + auth_type_updated: "Type d'authentification modifié." + change_auth_type_title: "TRACKS::Modifier le type d'authentification" + change_authentication_type: "Modifier le type d'authentification" + change_password_prompt: "Entrer votre nouveau mot de passe dans les champs ci-dessous et cliquer sur 'Modifier mot de passe' pour remplacer votre mot de passe actuel par le nouveau." + change_password_submit: "Modifier mot de passe" + change_password_title: "TRACKS::Modifier mot de passe" + choose_password: "Choisir le mot de passe" + confirm_password: "Confirmer le mot de passe" + desired_login: "Login souhaité" + destroy_confirmation: "Attention : cela va supprimer l'utilisateur '%{login}', toutes ses actions, contextes, projets et notes. Etes-vous sûr de vouloir continuer ?" + destroy_error: "Une erreur s'est produite lors de la suppression de l'utilisateur %{login}" + destroy_successful: "Utilisateur %{login} supprimé avec succès" + destroy_user: "Supprimer utilisateur" + first_user_heading: "Bienvenu à TRAKS. Pour commencer, veuillez créer un compte administrateur" + identity_url: "URL Identité" + label_auth_type: "Type d'authentification" + manage_users: "Gérer utilisateurs" + new_password_label: "Nouveau mot de passe" + new_token_generated: "Nouveau token généré avec succés" + new_user_heading: "Créer un nouvel utilisateur:" + new_user_title: "TRACKS::Créer un administrateur" + no_signups_title: "TRACKS::Pas de signups" + openid_ok_pref_failed: "Vous avez vérifié avec succès votre identité comme %{url} mais un problème est survenu lors de la sauvegarde de vos préférences d'authentification." + openid_url_verified: "Vous avez vérifié avec succès votre identité comme %{url} et défini votre type authentification comme OpenID" + password_confirmation_label: "Confirmer mot de passe" + password_updated: "Mot de passe modifié." + register_with_cas: "Avec votre nom d'utilisateur CAS" + select_authentication_type: "Sélectionner votre nouveau type d'authentification et cliquer sur 'Modifier type d'authenfication' pour remplacer les paramètres actuels." + signup: Création + signup_new_user: "Créer un nouvel utilisateur" + signup_successful: "Utilisateur %{username} créé avec succès." + successfully_deleted_user: "Utilisateur %{username} supprimé avec succès" + total_actions: "Total actions" + total_contexts: "Total contextes" + total_notes: "Total notes" + total_projects: "Total projets" + total_users_count: "Vous avez %{count} utilisateurs" + user_created: "Utilisateur créé." + you_have_to_reset_your_password: "Vous devez réinitialiser votre mot de passe" will_paginate: - previous_label: "«Précédent" + next_label: "Suivant »" page_entries_info: multi_page: "Affiche %{model} de %{from} - %{to} à %{count} au total" - single_page_html: - one: Voir de 1 %{model} - other: Afficher tous les %{count} %{model} - zero: "Aucun %{model} trouvés" - single_page: - one: Voir de 1 %{model} - other: Afficher tous les %{count} %{model} - zero: "Aucun %{model} trouvés" multi_page_html: "Affiche %{model} %{from} - %{to} à la %{count} au total" - page_gap: ... - next_label: "Suivant »" - support: - array: - words_connector: "," - last_word_connector: ", et" - two_words_connector: et - select: - prompt: "Veuillez sélectionner" - footer: - send_feedback: Envoyer un feedback sur %{version} - shared: - multiple_next_actions: Actions suivante multiples (une sur chaque ligne) - make_actions_dependent: "Faire actions dépendantes les unes des autres" - toggle_single: Ajouter action suivante - hide_form: Cacher le formulaire - add_actions: Ajouter actions - add_action: Ajouter action - tags_for_all_actions: Tags pour toutes les actions (sep. avec des virgules) - toggle_single_title: Ajouter une nouvelle action suivante - project_for_all_actions: Projet pour toutes les actions - context_for_all_actions: Contexte pour toutes les actions - toggle_multi: Ajouter plusieurs actions suivantes - separate_tags_with_commas: "séparer avec des virgules" - add_context: Ajouter Contexte - toggle_multi_title: Basculer formulaire action simple/multiple - hide_action_form_title: Cacher le formulaire nouvelle action - feedlist: - choose_context: Choisir le contexte dont vous voulez un flux - actions_due_today: Actions devant se terminer aujourd'hui ou avant - ical_feed: Flux iCal - legend: "Légende" - all_contexts: Tous les contextes - rss_feed: Flux RSS - choose_project: Choisir le projet dont vous voulez un flux - all_projects: Tous les projets - project_needed: Il faut au moins un projet pour le flux - select_feed_for_project: Selectionner le flux pour ce projet - active_projects_wo_next: Projets actifs avec aucune action suivante - active_starred_actions: "Toutes les actions préferrées actives" - context_needed: Il faut au moins un contexte pour le flux - select_feed_for_context: Selectionner un flux pour ce contexte - projects_and_actions: Projets actifs et leurs actions - notice_incomplete_only: "NB: Les flux ne montrent que les actions incomplètes, sauf indication contraire" - actions_due_next_week: Actions devant se terminer dans les 7 prochains jours ou moins - actions_completed_last_week: "Actions réalisées dans les 7 derniers jours" - context_centric_actions: "Flux des actions dans un contexte spécifique" - plain_text_feed: Flux texte - last_fixed_number: "Dernières %{number} actions" - all_actions: Toutes les actions - project_centric: "Flux des actions incomplètes d'un projet spécifique" - sidebar: - list_name_active_contexts: Contextes actifs - list_name_active_projects: Projets actifs - list_empty: Aucun - list_name_completed_projects: "Projets réalisés" - list_name_hidden_projects: "Projets cachés" - list_name_hidden_contexts: "Contextes cachés" - users: - openid_url_verified: "Vous avez vérifié avec succès votre identité comme %{url} et défini votre type authentification comme OpenID" - auth_type_update_error: "Un problème est survenu lors de la modification du type d'authentification : %{error_messages}" - failed_to_delete_user: "La suppression de l'utilisateur {username} à échoué" - destroy_successful: "Utilisateur %{login} supprimé avec succès" - first_user_heading: "Bienvenu à TRAKS. Pour commencer, veuillez créer un compte administrateur" - total_contexts: Total contextes - successfully_deleted_user: "Utilisateur %{username} supprimé avec succès" - signup_successful: "Utilisateur %{username} créé avec succès." - new_token_generated: "Nouveau token généré avec succés" - total_projects: Total projets - change_password_submit: Modifier mot de passe - no_signups_title: TRACKS::Pas de signups - user_created: "Utilisateur créé." - account_signup: "Créer un compte" - manage_users: "Gérer utilisateurs" - password_updated: "Mot de passe modifié." - auth_type_updated: "Type d'authentification modifié." - total_actions: Total actions - desired_login: "Login souhaité" - signup: "Création" - confirm_password: Confirmer le mot de passe - new_user_heading: "Créer un nouvel utilisateur:" - password_confirmation_label: Confirmer mot de passe - destroy_error: Une erreur s'est produite lors de la suppression de l'utilisateur %{login} - choose_password: Choisir le mot de passe - change_password_title: TRACKS::Modifier mot de passe - change_auth_type_title: TRACKS::Modifier le type d'authentification - change_password_prompt: Entrer votre nouveau mot de passe dans les champs ci-dessous et cliquer sur 'Modifier mot de passe' pour remplacer votre mot de passe actuel par le nouveau. - new_password_label: Nouveau mot de passe - register_with_cas: Avec votre nom d'utilisateur CAS - label_auth_type: Type d'authentification - total_users_count: Vous avez %{count} utilisateurs - new_user_title: "TRACKS::Créer un administrateur" - destroy_user: Supprimer utilisateur - destroy_confirmation: "Attention : cela va supprimer l'utilisateur '%{login}', toutes ses actions, contextes, projets et notes. Etes-vous sûr de vouloir continuer ?" - you_have_to_reset_your_password: "Vous devez réinitialiser votre mot de passe" - signup_new_user: "Créer un nouvel utilisateur" - identity_url: "URL Identité" - openid_ok_pref_failed: "Vous avez vérifié avec succès votre identité comme %{url} mais un problème est survenu lors de la sauvegarde de vos préférences d'authentification." - auth_change_submit: Modifier le type d'authenfication - change_authentication_type: Modifier le type d'authentification - total_notes: Total notes - select_authentication_type: "Sélectionner votre nouveau type d'authentification et cliquer sur 'Modifier type d'authenfication' pour remplacer les paramètres actuels." - contexts: - delete_context_title: Supprimer contexte - all_completed_tasks_title: "TRACKS::Toutes les actions Achevé en le contexte '%{context_name}'" - hide_form: Cacher le formulaire - show_form_title: Ajouter un contexte - delete_context_confirmation: "Etes vous sûr de vouloir supprimer le contexte %{name}? Toutes les actions (répétitives) de ce contexte seront également supprimées !" - todos_append: dans ce contexte - delete_context: Supprimer contexte - edit_context: Modifier contexte - hide_form_title: Cacher le formulaire nouveau contexte - hidden_contexts: "Contextes cachés" - no_contexts_active: Actuellement, il n'y a pas de contextes actifs - context_hide: "Caché de la première page ?" - add_context: Ajouter un contexte - show_form: "Créer un nouveau contexte" - save_status_message: "Contexte sauvegardé" - visible_contexts: Contextes visibles - update_status_message: "Le nom du contexte à été modifié" - context_name: Nom du Contexte - status_active: Le Contexte est actif - completed_tasks_title: "TRACKS::actions Achevé en le contexte '%{context_name}'" - new_context_post: "'sera aussi créé. Etes-vous sûr ?" - new_context_pre: Nouveau contexte ' - no_actions: "Actuellement, il n'y pas d'actions incomplètes dans ce contexte" - last_completed_in_context: dans ce contexte (dernier %{number}) - context_deleted: "Contexte \\'%{name}\\' supprimé" - no_contexts_hidden: "Actuellement, il n'y a pas de contextes cachés" - status_hidden: "Le Contexte est caché" - login: - openid_identity_url_not_found: "Désolé, aucun utilisateur avec cette identité URL n'existe (%{identity_url})" - user_no_expiry: "Rester connecté" - sign_in: Se connecter - login_cas: Aller au CAS - cas_no_user_found: Bonjour, %{username}! Vous n'avez pas de compte sur Tracks. - cas_login: Login CAS - successful_with_session_info: "La connexion à réussi:" - please_login: Veuillez vous connecter pour utiliser Tracks - cas_logged_in_greeting: "Bonjour, %{username}! Vous êtes authentifié." - cas_username_not_found: "Désolé, aucun utilisateur avec ce nom CAS n'existe (%{username})" - cas_create_account: "Si vous voulez vous inscrire aller à %{signup_link}" - mobile_use_openid: ... ou ce connecter avec un OpenID - cas_signup_link: Demander un compte - account_login: Identifiant du compte - successful: "La connexion à réussi. Bienvenue !" - session_will_not_expire: la session n'expire jamais. - option_separator: ou, - session_time_out: "La session à expiré. Merci de %{link}" - session_will_expire: "la session expire après %{hours} heure(s) d'inactivité." - login_standard: "retourner à l'écran de connexion standard" - login_with_openid: se connecter avec un OpenID - unsuccessful: "La connexion à échoué." - log_in_again: Se reconnecter - logged_out: "Vous avez été déconnecté de Tracks." - datetime: - prompts: - minute: Minute - second: Secondes - month: Mois - hour: Heure - day: Jour - year: "Année" - distance_in_words: - less_than_x_minutes: - one: moins d'une minute - other: moins de %{count} minutes - zero: Moins de 1 minute - almost_x_years: - one: presque 1 an - other: presque %{count} ans - x_days: - one: 1 jour - other: "%{count} jours" - x_seconds: - one: 1 seconde - other: "%{count} secondes" - about_x_hours: - one: environ 1 heure - other: environ %{count} heures - less_than_x_seconds: - one: moins d'1 seconde - other: moins de %{count} secondes - zero: Moins de 1 seconde - x_months: - one: 1 mois - other: "%{count} mois" - x_minutes: - one: 1 minute - other: "%{count} minutes" - about_x_years: - one: environ 1 an - other: environ %{count} ans - about_x_months: - one: environ 1 mois - other: environ %{count} mois - over_x_years: - one: plus d'1 an - other: plus de %{count} ans - half_a_minute: une demi-minute - search: - contexts_matching_query: "Contextes correspondant à la requête" - tags_matching_query: "Tags correspondant à la requête" - no_results: "Aucun résultat à votre recherche." - todos_matching_query: "AFaire (todos) correspondant à la requête" - projects_matching_query: "Projets correspondant à la requête" - notes_matching_query: "Notes correspondant à la requête" + single_page: + one: "Voir de 1 %{model}" + other: "Afficher tous les %{count} %{model}" + zero: "Aucun %{model} trouvés" + single_page_html: + one: "Voir de 1 %{model}" + other: "Afficher tous les %{count} %{model}" + zero: "Aucun %{model} trouvés" + page_gap: "..." + previous_label: «Précédent diff --git a/config/locales/he.yml b/config/locales/he.yml index 5a69203b..42e23293 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1,914 +1,909 @@ ---- -he: - will_paginate: - page_entries_info: - multi_page: "מציג %{model} %{from} - %{to} מתוך %{count} בסך הכל" - single_page: - other: "מציג את כל %{count} %{model}" - zero: "לא נמצא %{model}" - one: "מציג %{model} אחד" - multi_page_html: "מציג %{model} %{from} - %{to} מתוך %{count} בסך הכל" - single_page_html: - other: "מציג כל %{count} %{model}" - zero: "לא נמצא %{model}" - one: "מציג 1 %{model}" - previous_label: "« הקודם" - page_gap: "…" - next_label: "הבא »" - integrations: - applescript_success_before_id: "פעולת המשך עם זיהוי" - gmail_description: "חֲפִיץ להוספת מסלולים ל-Gmail" - applescript_next_action_prompt: "תיאור הפעולות הבאות:" - applescript_success_after_id: "נוצר" - opensearch_description: "חיפוש במסלולים" - projects: - edit_project_settings: "עריכת הגדרות פרוייקט" - deferred_actions_empty: "אין פעולות שנדחו עבור פרוייקט זה" - hide_form_title: "הסתרת טופס פרוייקט חדש" - completed_projects: "פרוייקטים שהסתיימו" - no_default_context: "אין הקשר ברירת מחדל לפרוייקט זה" - settings: "הגדרות" - add_note_submit: "הוספת פתק" - no_last_completed_projects: "לא נמצאו פרוייקטים שהסתיימו" - notes_empty: "אין פתקיות לפרוייקט זה" - with_default_context: "עם הקשר בירת מחדל '%{context_name}'" - show_form: "הוספת פרוייקט" - with_default_tags: "עם התגיות '%{tags}' כברירת המחדל" - completed_tasks_title: "מסלולים::הצגת רשימת המשימות שהושלמו בפרוייקט '%{project_name}'" - edit_project_title: "עריכת פרוייקט" - to_new_project_page: "עבור לעמוד הפרוייקט החדש" - project_saved_status: "פרוייקט נשמר" - default_context_removed: "הקשר ברירת המחדל הוסר" - default_context_set: "בחירת הקשר ברירת המחדל לפרוייקט ל-%{default_context}" - with_no_default_tags: "וללא תגיות ברירת מחדל" - was_marked_hidden: "סומן כמוסתר" - no_projects: "אין כרגע פרוייקטים" - delete_project: "מחיקת פרוייקט" - delete_project_title: "מחיקת הפרוייקט" - active_projects: "פרוייקטים פעילים" - list_completed_projects: "מסלולים::רשימת הפרוייקטים שהולשמו" - no_last_completed_recurring_todos: "לא נמצאו משימות מחזוריות שהסתיימו" - state: "הפרוייקט במצב %{state}" - completed_actions_empty: "אין פעולות שהסתיימו בפרוייקט זה" - add_project: "הוספת פרוייקט" - was_marked_complete: "סומן כבוצע" - no_actions_in_project: "אין כרגע משימות של הושלמו בפרוייקט זה" - page_title: "מסלולים::פרוייקט: %{project}" - delete_project_confirmation: "האם למחוק את הפרוייקט '%{name}'?" - actions_in_project_title: "פעולות בפרוייקט זה" - add_note: "הוספת פתק" - list_projects: "מסלולים::רשימת פרוייקטים" - todos_append: "בפרוייקט זה" - default_tags_removed_notice: "תגיות ברירת המחדל הוסרו" - no_notes_attached: "אין כרגע פתקיות המקושרות לפרוייקט זה" - project_state: "הפרוייקט %{state}" - hidden_projects: "פרוייקטים שהוסתרו" - deferred_actions: "פעולות שנדחו עבור פרוייקט זה" - default_context: "הקשר ברירת המחדש לפרוייקט זה %{context}" - set_default_tags_notice: "בחירת תגיות ברירת המחדל ל-%{default_tags}" - completed_actions: "פעולות שהסתיימו בפרוייקט זה" - status_project_name_changed: "שם הפרוייקט שונה" - with_no_default_context: "ללא הקשר ברירת מחדל" - all_completed_tasks_title: "מסלולים::הצגת רשימת כל המשימות שהושלמו בפרוייקט '%{project_name}'" - is_active: "פעיל" - hide_form: "הסתרת טופס" - show_form_title: "יצירת פרוייקט חדש" - notes: "פתקיות" - this_project: "פרוייקט זה" - list_reviews: "מסלולים::סקירה" - errors: - user_unauthorized: "401 לא מאושר: רק משתמשים בדרגת מנהל רשאים להפעיל פעולה זו" - support: - array: - words_connector: "," - last_word_connector: ", ו-" - two_words_connector: "ו-" - select: - prompt: "יש לבצע בחירה" - login: - log_in_again: "כניסה מחודשת" - cas_login: "התחברות שא\"מ (שירות אימות מרכזי)" - mobile_use_openid: "...או כניסה עם OpenID" - cas_signup_link: "בקשת משתמש" - login_standard: "חזרה לכניסה הרגילה" - session_time_out: "פג תוקף הגישה. נא %{link}" - login_cas: "הגעה אל שא\"מ" - sign_in: "כניסה" - session_will_not_expire: "הגישה ללא תפוגה." - login_with_openid: "כניסה על OpenID" - cas_username_not_found: "לצערנו, לא קיים משתמש שא\"מ בשם (%{username})" - cas_create_account: "אם ברצונך לבקש יש להמשיך ל-%{signup_link}" - logged_out: "בוצעה יציאה מ-מסלולים" - please_login: "יש להכנס כדי להשתמש ב-מסלולים" - account_login: "כניסה לחשבון" - session_will_expire: "תוקף הגישה יפוג לאחר %{hours} שעה(ות) של חוסר פעילות." - unsuccessful: "כניסה נכשלה." - openid_identity_url_not_found: "לצערנו, לא קיים משתמש עם כתובת זהות (%{identity_url})" - successful: "כניסה בוצעה בהצלחה. ברוך שובך!" - cas_no_user_found: "%{username} שלום! אין חשבון בשם זה במסלולים." - successful_with_session_info: "כניסה מוצלחת:" - cas_logged_in_greeting: "שלום %{username}! הזיהוי הצליח" - option_separator: "או," - user_no_expiry: "השארת חיבור" - sidebar: - list_name_active_contexts: "הקשרים פעילים" - list_name_completed_projects: "פרוייקטים שהסתיימו" - list_name_hidden_projects: "פרוייקטים מוסתרים" - list_name_hidden_contexts: "הקשרים מוסתרים" - list_name_active_projects: "פרוייקטים פעילים" - list_empty: "אין" - datetime: - distance_in_words: - about_x_years: - other: "כ-%{count} שנים" - one: "כשנה" - less_than_x_seconds: - other: "פחות מ-%{count} שניות" - zero: "פחות משנייה" - one: "פחות משנייה" - less_than_x_minutes: - other: "פחות מ-%{count} דקות" - zero: "פחות מדקה" - one: "פחות מדקה" - x_minutes: - other: "%{count} דקות" - one: "דקה" - almost_x_years: - other: "כמעט %{count} שנים" - one: "כמעט שנה" - about_x_months: - other: "כ-%{count} חודשים" - one: "כחודש" - x_seconds: - other: "%{count} שניות" - one: "שנייה" - over_x_years: - other: "מעל %{count} שנים" - one: "מעלה לשנה" - about_x_hours: - other: "כ-%{count} שעות" - one: "כשעה" - x_months: - other: "%{count} חודשים" - one: "חודש" - x_days: - other: "%{count} ימים" - one: "יום" - half_a_minute: "חצי דקה" - prompts: - hour: "שעה" - second: "שניות" - day: "יום" - minute: "דקה" - month: "חודש" - year: "שנה" - activerecord: - errors: - template: - body: "בעיות בשדות הבאים:" - header: - other: "שגיאות מנעו ממודל %{model} להישמר" - one: "שגיאה מנעה ממודל %{model} להישמר" - messages: - greater_than: "חייב להיות גדול מ %{count}" - confirmation: "אינו תואם את האישור" - too_short: "קצר צדי (לכל הפחות %{count} תווים(" - equal_to: "חייב להיות שווה ל %{count}" - too_long: "ארוך מדי (לכל היותר %{count} תווים(" - exclusion: "שמור" - less_than: "חייב להיות קטן מ ${count}" - inclusion: "לא מוכל ברשימה" - accepted: "חייב להתקבל" - blank: "לא יכול להיות ריק" - odd: "חייב להיות אי זוגי" - invalid: "לא יכול להכיל את תו (',') הפסיק" - wrong_length: "באורך לא נכון (צריך להיות %{count} תווים(" - less_than_or_equal_to: "חייב להיות קטן או שווה ל %{count}" - not_a_number: "אינו מספר" - record_invalid: "אימות נכשל %{errors}" - taken: "כבר נמצא בשימוש" - even: "חייב להיות זוגי" - greater_than_or_equal_to: "חייב להיות גודל או שווה ל %{count}" - empty: "לא יכול להיות ריק" - models: - project: - attributes: - name: - too_long: "על שם הפרוייקט להכיל פחות מ-256 תווים" - blank: "לפרוייקט חייב להיות שם" - taken: "כבר קיים" - full_messages: +--- +he: + activerecord: + attributes: + note: + created_at: "???? ?" + updated_at: "????? ?" + preference: + date_format: "???? ?????" + due_style: "????? ????? ???" + first_name: "?? ????" + last_name: "?? ?????" + locale: "???" + mobile_todos_per_page: "???? ?????? ??? (????? ?????)" + refresh: "?????? ????? (?????)" + review_period: "?????? ????? ???????" + show_completed_projects_in_sidebar: "??? ????????? ???????? ???" + show_hidden_contexts_in_sidebar: "??? ?????? ??????? ???" + show_hidden_projects_in_sidebar: "??? ????????? ??????? ???" + show_number_completed: "??? ???? ?????? ??????" + show_project_on_todo_done: "???? ????? ???????? ????? ?????" + sms_context: "???\"? ????? ???? ???? ????" + sms_email: "???? ???" + staleness_starts: "????? ?????" + time_zone: "???? ???" + title_date_format: "???? ????? ?????" + verbose_action_descriptors: "?????? ?????? ???????" + week_starts: "???? ????? ????" + project: + default_context_name: "???? ????? ????" + default_tags: "????? ????? ????" + description: "?????" + name: "??" + todo: + context: "????" + description: "?????" + due: "????? ???" + notes: "??????" + predecessors: "???? ?" + project: "?????????" + show_from: "??? ?" + tags: "?????" + user: + first_name: "?? ????" + last_name: "?? ?????" + errors: + full_messages: format: "%{attribute} %{message}" - attributes: - todo: - description: "תיאור" - show_from: "הצג מ" - predecessors: "תלוי ב" - tags: "תגיות" - project: "פרוייקטים" - due: "תאריך יעד" - context: "הקשר" - notes: "פתקיות" - note: - created_at: "נוצר ב" - updated_at: "עודכן ב" - user: - first_name: "שם פרטי" - last_name: "שם משפחה" - project: - name: "שם" - description: "תיאור" - default_context_name: "הקשר ברירת מחדל" - default_tags: "תגיות ברירת מחדל" - preference: - review_period: "תדירות רענון פרוייקט" - locale: "שפה" - date_format: "מבנה תאריך" - show_project_on_todo_done: "עבור לעמוד הפרוייקט בסיום משימה" - show_hidden_projects_in_sidebar: "הצג פרוייקטים מוסתרים בצד" - show_completed_projects_in_sidebar: "הצג פרוייקטים שהסתיימו בצד" - verbose_action_descriptors: "תיאורי משימות מפורטים" - sms_context: "דוא\"ל ברירת מחדר עבור הקשר" - first_name: "שם פרטי" - sms_email: "דואר מאת" - due_style: "סגנון תאריך יעד" - last_name: "שם משפחה" - refresh: "תדירות רענון (בדקות)" - title_date_format: "מבנה תאריך כותרת" - show_number_completed: "הצג מספק פעולות שבוצעו" - staleness_starts: "התחלת תפלות" - week_starts: "שבוע מתחיל ביום" - show_hidden_contexts_in_sidebar: "הצג הקשרים מוסתרים בצד" - mobile_todos_per_page: "מספר פעולות לדף (תצוגה ניידת)" - time_zone: "אזור זמן" - data: - import_successful: "יבוא בוצע בהצלחה" - import_errors: "שגיאות ביבוא" - date: - formats: - short: "%b %d " - longer: "%A %B %d, %Y" + messages: + accepted: "???? ??????" + blank: "?? ???? ????? ???" + confirmation: "???? ???? ?? ??????" + empty: "?? ???? ????? ???" + equal_to: "???? ????? ???? ? %{count}" + even: "???? ????? ????" + exclusion: "????" + greater_than: "???? ????? ???? ? %{count}" + greater_than_or_equal_to: "???? ????? ???? ?? ???? ? %{count}" + inclusion: "?? ???? ??????" + invalid: "?? ???? ????? ?? ?? (',') ?????" + less_than_or_equal_to: "???? ????? ??? ?? ???? ? %{count}" + not_a_number: "???? ????" + odd: "???? ????? ?? ????" + record_invalid: "????? ???? %{errors}" + taken: "??? ???? ??????" + too_long: "???? ??? (??? ????? %{count} ?????(" + too_short: "??? ??? (??? ????? %{count} ?????(" + wrong_length: "????? ?? ???? (???? ????? %{count} ?????(" + models: + project: + attributes: + name: + blank: "???????? ???? ????? ??" + taken: "??? ????" + too_long: "?? ?? ???????? ????? ???? ?-256 ?????" + template: + body: "????? ????? ?????:" + common: + action: "?????" + actions: "??????" + actions_midsentence: + one: "?????" + other: "??????" + zero: "??????" + add: "????" + ajaxError: "????? ?????? ?????" + back: "?????" + bugs: "?????" + cancel: "???" + context: "????" + contexts: "??????" + contribute: "????" + create: "???" + days_midsentence: + one: "???" + other: "????" + zero: "????" + deferred: "????" + description: "?????" + drag_handle: "????" + email: "???\"?" + errors_with_fields: "?????? ????? ?????????" + first: "?????" + forth: "?????" + forum: "?????" + fourth: "?????" + go_back: "????" + last: "?????" + logout: "??" + month: "????" + months: "??????" + next: "???" + none: "????" + not_available_abbr: "?/?" + note: + one: "????" + other: "%{count} ??????" + zero: "??? ??????" + notes: "??????" + numbered_step: "??? %{number}" + ok: "????" + optional: "?????" + previous: "?????" + project: "???????" + projects: "?????????" + recurring_todos: "?????? ????????" + review: "??????" + search: "?????" + second: "???" + server_error: "?????? ????? ???" + show_all: "??? ???" + sort: + alphabetically: "??????" + alphabetically_confirm: "???? ?? ?????????? ???? ??????? ?????? ????? ?? ???? ?????" + alphabetically_title: "??? ????????? ???????" + by_task_count: "??? ???? ??????" + by_task_count_title: "???? ??? ???? ??????" + by_task_count_title_confirm: "???? ?? ?????????? ??? ???? ???????? ?????? ????? ?? ???? ?????" + sort: "????" + third: "?????" + todo: "?????" + update: "????" + website: "???" + week: "????" + weeks: "??????" + wiki: "????" + contexts: + add_context: "????? ????" + all_completed_tasks_title: "???????::?? ??????? ?????? ?????? ????? '%{context_name}'" + completed_tasks_title: "???????::?????? ?????? ?????? ????? '%{context_name}'" + context_deleted: "???? ???? '%{name}'" + context_hide: "????? ????? ?????" + context_name: "?? ????" + delete_context: "??? ????" + delete_context_confirmation: "??? ????? ?? ????? '%{name}'? ?? ????? ???? ?????? ?? ????? ?? ?? ??????? ????????? ????? ??" + delete_context_title: "????? ????" + edit_context: "????? ????" + hidden_contexts: "?????? ???????" + hide_form: "????? ????" + hide_form_title: "????? ???? ???? ???" + last_completed_in_context: "????? ?? (??????? %{number})" + new_context_post: "' ?????? ?????. ??? ???????" + new_context_pre: "???? ??? '" + no_actions: "??? ???? ?????? ??? ?????? ????? ??????" + no_contexts_active: "??? ???? ?????? ??????" + no_contexts_hidden: "??? ???? ?????? ???????" + save_status_message: "???? ????" + show_form: "????? ???? ???" + show_form_title: "????? ????" + status_active: "????? ????" + status_hidden: "????? ?????" + todos_append: "????? ??" + update_status_message: "???? ?? ?????" + visible_contexts: "?????? ??????" + data: + import_errors: "?????? ?????" + import_successful: "???? ???? ??????" + date: + formats: default: "%Y-%m-%d " long: "%B %d, %Y " - shared: - toggle_single_title: "הוספת פעולת המשך חדשה" - toggle_multi_title: "טופס שינוי מצב פעולה בודדת / פעולות מרובות" - toggle_multi: "הוספת פעולות המשך מרובות" - separate_tags_with_commas: "מופרד בפסיקים" - add_action: "הוספת פעולה" - tags_for_all_actions: "תגיות לכל הפעולות (יש להפריד בפסיקים)" - multiple_next_actions: "פעולות המשך מרובות (פעולה אחת בשורה)" - add_actions: "הוספת פעולה" - context_for_all_actions: "הקשר לכל הפעולות" - hide_action_form_title: "הסתרת טופס פעולות חדשות" - make_actions_dependent: "יצירת תלות בין פעולות" - toggle_single: "הוספת פעולת המשך" - project_for_all_actions: "פרוייקט לכל הפעולות" - hide_form: "הסתרת טופס" - add_context: "הוספת הקשר" - time: - pm: "אחה\"צ" - formats: - short: "%d %b %H:%M " - stats: "%a %d-%m" - default: "%a, %d %b %Y %H:%M:%S %z " - month_day: "%B %d " - long: "%B %d, %Y " - am: "לפנה\"צ" - todos: - added_new_project: "נוסף פרוייקט חדש" - recurring_action_saved: "פעולה מחזורית נשמרה" - completed_recurrence_completed: "אין פעולת המשך לפעולה המחזורית שנמחקה. הפעולה המחזורית נמחקה." - all_completed_tagged_page_title: "מסלולים::כל הפעולות שהסתיימו עם התגית %{tag_name}" - depends_on_separate_with_commas: "תלוי ב- (יש להפריד בפסיקים(" - next_actions_description_additions: - due_date: "עם תאריך יעד %{due_date} או מוקדם יותר " - completed: "ב-%{count} הימים האחרונים" - next_action_description: "תיאור פעולת המשך" - calendar_page_title: "מסלולים::לוח שנה" - calendar: - no_actions_due_after_this_month: "אין פעולות לביצוע לאחר חודש זה" - due_this_month: "תאריך יעד ליתרת חודש %{month}" - no_actions_due_today: "אין פעולות נוספות להיום" - due_next_week: "לשבוע הבא" - due_next_month_and_later: "תאריך יעד %{month} או מאוחר יותר" - due_today: "להיום" - due_this_week: "להמשך השבוע" - get_in_ical_format: "קבלת לוח שנה זה בפורמט iCal" - no_actions_due_next_week: "אין פעולות לביצוע בשבוע הבא" - no_actions_due_this_month: "אין פעולות לביצוע ביתרת החודש" - recurring_deleted_success: "הפעולה המחזורית נמחקה בהצלחה" - added_new_context: "נוסף הקשר חדש" - edit: "עריכה" - show_today: "הצגת היום" - added_dependency: "נוספה %{dependency} כתלות" - show_from: "הצגה מ-" - next_actions_due_date: - due_tomorrow: "למחר" - due_in_x_days: "יעד בעוד %{days} ימים" - overdue_by_plural: "באיחור של %{days} ימים" - due_today: "להיום" - overdue_by: "באיחור של %{days} יום" - completed_rest_of_week: "הסתיימו ביתרת שבוע זה" - new_related_todo_created_short: "יצירת משימה חדשה" - delete_action: "מחיקת פעולה" - task_list_title: "מסלולים::רשימת משימות" - blocked_by: "נחסם על ידי %{predecessors}" - error_deleting_recurring: "ארעה שגיעה במחיקת המשימה המחזורית \'%{description}\'" - feed_title_in_context: "בהקשר '%{context}'" - completed_actions_with: "פעולות שהסתיימו עם התגית %{tag_name} " - error_saving_recurring: "ארעה שגיעה בשמירת המשימה המחזורית \'%{description}\'" - delete: "מחיקה" - deferred_tasks_title: "מסלולים::מִזְכָּר" - tagged_with: "מתוייג ב- ‘%{tag_name}’" - removed_predecessor: "הוסרה%{successor} כתלות של %{predecessor}.־" - no_recurring_todos: "אין כרגע משימות מחזוריות" - added_new_next_action_plural: "נוספו פעולות המשך חדשות" - in_pending_state: "במצב המתנה" - clear_show_from_date: "נקה הצגה מתאריך" - scheduled_overdue: "תוזמן לתצוגה לפני %{days} ימים" - error_completing_todo: "ארעה שגיעה בסיום / הפעלה של משימה %{description}" - no_hidden_actions: "לא נמצאו פעולות מוסתרות" - drag_action_title: "יש לגרור אל פעולה אחרת כדי ליצור תלות בה" - depends_on: "תלוי ב" - new_related_todo_not_created_short: "לא נוצרה משימה" - action_deleted_success: "פעולת המשך נמחקה בהצלחה" - feed_title_in_project: "בפרוייקט '%{project}'" - next_actions_title_additions: - completed: "פעולות שהסתימו" - due_within_a_week: "תוך שבוע" - due_today: "להיום" - deferred_actions_with: "פעולות דחויות על תגית '%{tag_name}'" - show_on_date: "הצג בתאריך %{date}" - recurring_todos: "משימות מחזוריות" - append_in_this_project: "בפרוייקט זה" - next_action_needed: "יש להזין לפחות פעולת המשך אחת" - tickler_items_due: - other: "%{count} מהמִזְכָּרים הגיעו לתאריך היעד - יש לרענן העמוד להצגה." - one: "אחד מהמִזְכָּרים הגיע לתאריך היעד - יש לרענן העמוד להצגה." - action_deleted_error: "נכשלה מחיקת הפעולה" - completed_rest_of_month: "הסתיימו ביתרת החודש הנוכחי" - recurring_pattern_removed: "הדפוס המחזורי הוסר מ-%{count}" - done: "הסתיים?" - overdue: "באיחור" - add_another_dependency: "הוספת תלות נוספת" - defer_x_days: - other: "דחיה ב-%{count} ימים" - one: "דחיה ביום" - set_to_pending: "%{task} הוגדרה כממתינה" - completed_tasks_title: "מסלולים::משימות שהושלמו" - completed_tagged_page_title: "מסלולים::משימות שהסתיימו עם תגית '%{tag_name}'" - see_all_completed: "ניתן לראות כל כל הפעולות שהסתיימו כאן: %{link}" - add_new_recurring: "הוספת פעולה מחזורית חדשה" - in_hidden_state: "במצב מוסתר" - list_incomplete_next_actions_with_limit: "רישמת %{count} פעולות ההמשך שלא הסתיימו" - clear_due_date: "מחיקת תאריך יעד" - deferred_pending_actions: "פעולות ממתינות/דחויות" - tagged_page_title: "מסלולים::תגיות עם '%{tag_name}'" - action_saved: "פעולה נשמרה" - completed_last_day: "הסתיימו ב-24 שעות האחרונות" - error_starring: "הדגשת המשימה \'%{description}\' לא צלחה" - defer_date_after_due_date: "תאריך הדחייה מאוחר מתאריך היעד. יש לערוך את תאריך היעד בהתאם לפני בקשת הדחייה." - new_related_todo_created: "משימה חדשה הוספה למשימה מחזורית זו" - completed_in_archive: - other: "קיימות %{count} פעולות שהסתיימו בארכיון." - one: "קיימת בארכיון פעולה שהסתיימה." - action_due_on: "(פעולה עד %{date})" - remove_dependency: "הסרת תלות (לא מוחק את הפעולה)" - star_action: "הדגשת פעולה" - completed_actions: "פעולות שהסתיימו" - show_in_days: "הצג בעוד %{days} ימים" - tags: "תגיות (מופרדות בפסיקים)" - recurrence_completed: "אין פעולת המשך לפעולה המחזורית שסוימה. המחזוריות הסתיימה." - edit_action_with_description: "עריכת הפעולה '%{description}'" - deleted_success: "הפעולה נמחקה בהצלחה" - edit_action: "עריכת פעולה" - edit_recurring_todo: "ערכית פעולות מחזוריות" - no_actions_with: "אין כרגע פעולות שלא הסתיימות עם התגית '%{tag_name}'" - was_due_on_date: "היה מיועד עד %{date}" - confirm_delete: "האם למחוק את הפעילות '%{description}'?" - no_actions_found_title: "לא נמצא פעולות" - next_actions_title: "מסלולים - פעולות המשך" - due: "יעד" - no_actions_due_this_week: "אין פעולות המיועדות להמשך השבוע" - no_completed_recurring: "אין כרגע משימות מחזוריות שהסתיימו" - unresolved_dependency: "הערך שהוכנס בתלות לא תאם לאף פעולה קיימת. הערך לא ישמר עם יתרת הפעולה. להמשיך?" - completed_recurring: "הסתיימו משימות מחזוריות" - no_project: "--אין פרוייקט--" - older_completed_items: "משימות שהסתיימות ישנות יותר" - archived_tasks_title: "מסלולים: משימות שהסתיימו הועברו לארכיון" - completed_today: - other: "עד עתה הסתיימו %{count} פעולת היום." - one: "הושלמה פעולה אחת היום, עד עתה." - pending: "ממתין" - context_changed: "הקשר שונה ל-%{name}" - error_removing_dependency: "התרחשה שגיאה בהסרת התלות" - show_tomorrow: "הצגת מחר" - error_toggle_complete: "לא ניתן לסמן משימה כ\"הסתיימה\"" - recurring_action_deleted: "פעולה נמחקה. מאחר והפעולה מחזורית. פעולה חדשה נוספה" - completed_more_than_x_days_ago: "הסתיימו לפני יותר מ-%{count} ימים" - delete_recurring_action_confirm: "האם למחוק את הפעילות המחזורית '%{description}'?" - no_completed_actions_with: "אין פעולות שהסתיימו על התגית '%{tag_name}'" - feeds: - completed: "הסתיים: %{date}" - due: "יעד %{date}" - completed_rest_of_previous_month: "הסתיימו ביתרת החודש הקודם" - cannot_add_dependency_to_completed_todo: "אין אפשרות להוסיף פעולה זו כתלות לפעולה שהסתיימה!" - completed: "הסתיימו" - list_incomplete_next_actions: "רשימת פעולות המשך שלא הסתיימו" - recurrence: - recurrence_on_options: "הגדרת מחזוריות לפי" - show_days_before: "%{days} ימים לפני תאריך היעד למשימה" - ends_on: "מסתיים ב" - monthly: "חודשי" - every_work_day: "בכל יום עבודה" - weekly_options: "הגדרות לפעולות במחזוריות שבועית" - daily_options: "הגדרות לפעולות מחזוריות יומיות" - weekly_every_number_week: "חוזר כל %{number} שבוע ב" - yearly_every_xth_day: "יום %{day} ה -%{day_of_week} בכל %{month} חודש" - weekly: "שבועי" - daily_every_number_day: "כל %{number} ימים" - ends_on_date: "מסתיים ב-%{date}" - ends_on_number_times: "מסתיים לאחר %{number} פעמים" - recurrence_on_due_date: "יעד למשימה" - monthly_options: "הגדרות לפעולות בחזוריות חודשית" - starts_on: "מתחיל ב" - show_option_always: "תמיד" - monthly_every_xth_day: "יום %{day} ה -%{day_of_week} בכל %{month} חודש" - daily: "יומי" - no_end_date: "אין תאריך סיום" - show_options: "הצגת משימות" - day_x_on_every_x_month: "ביום %{day} בכל %{month} חודש" - pattern: - on_day_n: "ביום %{n}" - on_work_days: "בימי עבודה" - times: "כ-%{number} פעמים" - second: "שני" - every_month: "כל חודש" - weekly: "שבועי" - every_day: "כל יום" - third: "שלישי" - show: "הצגה" - every_year_on: "בכל שנה בתאריך %{date}" - last: "אחרון" - the_xth_day_of_month: "היום ה- %{x} %{day} בחודש %{month}" - fourth: "רביעי" - until: "עד" - every_n: "כל %{n}" - first: "ראשון" - every_xth_day_of_every_n_months: "כל %{x} %{day} בכל %{n_months}" - due: "יעד" - from: "מ" - yearly: "שנתית" - yearly_every_x_day: "כל %{month} %{day}" - from_tickler: "תאריך היעד למשימה מגיע מהמִזְכָּר (לא נקבע תאריך יעד)" - yearly_options: "הגדרות לפעולות במחזוריות שנתיות" - no_deferred_pending_actions: "אין כרגע פעולות דחויות או ממתינות" - action_marked_complete_error: "הפעולה '%{description}'־לא־ סומנה כ - %{completed} עקב שגיאת שרת" - recurrence_period: "תקופת מחזוריות" - no_last_completed_actions: "לא נמצאו פעולות שהסתיימו" - hidden_actions: "פעולות מוסתרות" - to_tickler: "למִזְכָּר" - added_new_next_action_singular: "נוספה פעולת המשך חדשה" - star_action_with_description: "הדגשת פעילות '%{description}'" - no_completed_actions: "אין כרגע פעולות שהסתיימו." - no_incomplete_actions: "אין פעולות שלא הסתיימו" - older_than_days: "וותק מעל %{count} ימים" - error_deleting_item: "ארעה שגיאה במחיקת הפריט %{description}" - action_saved_to_tickler: "פעולה נשמרה למִזְכָּר" - recurring_actions_title: "מסלולים::פעולות מחזוריות" - action_deferred: "הפעולה '%{description}' נדחתה" - action_marked_complete: "הפעולה '%{description}' סומנה כ- %{completed}" - no_deferred_actions_with: "אין פעולות דחויות עם התגית '%{tag_name}'" - error_starring_recurring: " הדגשת המשימה המחזורית \'%{description}\' לא צלחה" - has_x_pending: - other: "מכיל %{count} פעולת ממתינות" - one: "בעל פעולה דחויה אחת" - no_deferred_actions: "אין כרגע פעולות שנדחו." - completed_last_x_days: "הסתיימו ב-%{count} הימים האחרונים" - mobile_todos_page_title: "כל הפעולות" - convert_to_project: "יצירת פרוייקט" - added_new_next_action: "נוספה פעולת המשך חדשה" - no_actions_found: "אין כרגע פעולות שלא הסתיימו" - delete_recurring_action_title: "מחיקת פעולה מחזורית" - all_completed_here: "כאן" - all_completed: "כל הפעולות שהסתיימו" - unable_to_add_dependency: "לא ניתן להוסיף תלות" - next_actions_description: "מסנן:" - stats: - actions_avg_completed_30days: "והסתיימו בממוצע %{count} פעולות ליום" - projects: "פרוייקטים" - actions_dow_30days_legend: - number_of_actions: "מספר פעולות" - day_of_week: "יום בשבוע" - click_to_return: "הקלקה על %{link} תחזיר לעמוד הסטטיסטיקה" - top10_projects: "עשרת הפרוייקטים המובילים" - other_actions_label: "(אחרים)" - top5_contexts: "5 הקשרים מובילים" - totals_context_count: "קיימים %{count} הקשרים." - running_time_legend: - percentage: "אחוז" - weeks: "זמן מצטבר לפעולות (שבועות). הקלקה על הבר למידע נוסף" - actions: "פעולות" - actions_avg_created: "ב-12 החודשים האחרונים יוצרו במוצע %{count} פעולות" - actions_avg_completed: "והסתיימו בממוצע %{count} פעולות לחודש" - totals_incomplete_actions: "קיימות %{count} פעולות שלא הסתיימו" - top5_visible_contexts_with_incomplete_actions: "5 ההקשרים המובילים עם פעולות שלא הסתיימו" - index_title: "מסלולים::סטטיסטיקה" - tag_cloud_90days_title: "ענן תגיות לפעולות ב-90 הימים האחרונים" - action_completion_time_title: "זמן סיום (כל הפעולות שהסתיימו)" - open_per_week_legend: - weeks: "שבועות קודם לכן" - actions: "פעולות" - action_selection_title: "מסלולים::בחירת פעולה" - actions_day_of_week_title: "יום בשבוע (כל הפעולות)" - spread_of_actions_for_all_context: "פיזור פעולות לכל ההקשרים" - totals_hidden_project_count: "%{count} מוסתרים" - totals_deferred_actions: "מהן %{count} פעולות דחויות במִזְכָּר" - click_to_show_actions_from_week: "הקלקה על %{link} תציג את הפעולות משבוע %{week} ואילך" - actions_dow_30days_title: "יום בשבוע (30 הימים האחרונים(" - legend: - number_of_actions: "מספר פעולות" - percentage: "אחוז" - number_of_days: "מספר ימים קודם לכן" - day_of_week: "יום בשבוע" - running_time: "זמן מצטבר לפעולה (שבועות)" - months_ago: "חודשים קודם" - actions: "פעולות" - actions_last_year_legend: - number_of_actions: "מספר הפעולות" - months_ago: "חודשים קודם" - totals_visible_context_count: "מתוך אלו %{count} הקשרים גלויים" - totals_blocked_actions: "%{count} תלויים בסיום המשימות שלהם" - spread_of_running_actions_for_visible_contexts: "פיזור הפעולות להקשרים גלויים" - tag_cloud_description: "ענן התגיות מכיל תגיות לכל הפעולות (הסתיימו, לא הסתיימו, גלויות ו/או מוסתרות(" - totals: "סיכומים" - time_of_day_legend: - number_of_actions: "מספר פעולות" - time_of_day: "זמן ביום" - tags: "תגיות" - totals_action_count: "קיימות %{count} פעולות בסך הכל" - more_stats_will_appear: "סטטיסטיקות נוספות יוצגו כאן לאחר הוספת פעולות נוספות." - open_per_week: "פעולות המשך (מוצגות או מוסתרות) לכל שבוע" - no_actions_selected: "לא נבחרו פעולות" - totals_completed_project_count: "%{count} מהם פרוייקטים שנסתיימו." - totals_hidden_context_count: "ו-%{count} בהקשרים מוסתרים." - actions_day_of_week_legend: - number_of_actions: "מספר פעולות" - day_of_week: "יום בשבוע" - click_to_update_actions: "הקלקה על הבר בגרף מעדכנת את הפעולה למטה" - totals_first_action: "מאז הפעולה הראשונה ב-%{date}" - tod30: "זמן ביום (30 ימים אחרוני)" - tag_cloud_90days_description: "ענן התגיות מכיל תגיות עבור פעולות שנוצרו או הסתיימו ב-90 הימים האחרונים." - top10_projects_30days: "עשרת הפרוייקטים המובילים ב-30 הימים האחרונים" - top10_longrunning: "10 הפרוייקטים שרצים הכי הרבה זמן" - within_one: "תוך 1" - actions: "פעולות" - no_tags_available: "אין תגיות זמינות" - actions_min_completion_time: "הזמן המזערי לסיום הוא %{time}." - totals_active_project_count: "מתוכם, %{count} הם פרוייקטים פעילים" - actions_selected_from_week: "פעולות נבחרות משבוע" - totals_actions_completed: "%{count} מהם הסתיימו" - actions_avg_completion_time: "מכל הפעוליות שנסתיימות הזמן הממוצע לסיום הוא %{count} ימים" - time_of_day: "זמן ביום (כל הפעולות)" - labels: - avg_created: "נוצרו בממוצע" - created: "נוצרו" - month_avg_created: "%{months} נוצרו בממוצע לחודש" - completed: "הסתיימו" - month_avg_completed: "%{months} הסתיימו בממוצע לחודש" - avg_completed: "הסתיימו בממוצע" - actions_further: "ואילך" - tag_cloud_title: "ענן תגיות לכל הפעולות" - running_time_all_legend: - percentage: "אחוז" - running_time: "זמן מצטבר לפעולות (שבועות). הקלקה על הבר למידע נוסף" - actions: "פעולות" - totals_tag_count: "קיימים %{count} תגיות המשוייכות לפעולות." - totals_project_count: "קיימים %{count} פרוייקטים." - actions_30days_title: "פעולות ב-30 הימים האחרונים" - current_running_time_of_incomplete_visible_actions: "זמן מצטבר לכל הפעולות הגלויות" - click_to_return_link: "כאן" - tod30_legend: - number_of_actions: "מספר פעולות" - time_of_day: "זמן ביום" - contexts: "הקשרים" - running_time_all: "זמן מצטבר לכל הפעולות שלא הסתיימו" - actions_min_max_completion_days: "יחס זמן מיזערי/מירבי לסיום הוא %{min}/%{max}." - totals_unique_tags: "מתוך תגיות אלו, %{count} ייחודיות." - actions_lastyear_title: "פעולות ב-12 החודשים האחרונים" - actions_last_year: "פעולות בשנים האחרונות" - actions_actions_avg_created_30days: "ב-30 הימים האחרונים נוצרו בממוצע %{count} פעולות" - search: - no_results: "החיפוש לא הניב תוצאות" - contexts_matching_query: "הקשרים תואמים לשאילתא" - projects_matching_query: "פרוייקטים תואמים שאילתא" - todos_matching_query: "משימות תואמות שאילתא" - tags_matching_query: "תגיות תואמות לשאילתא" - notes_matching_query: "פתקיות תואמות שאילתא" - contexts: - last_completed_in_context: "בהקשר זה (אחרונות %{number})" - hide_form_title: "הסתרת טופס הקשר חדש" - status_hidden: "ההקשר מוסתר" - delete_context_title: "מחיקת הקשר" - delete_context_confirmation: "האם למחוק את ההקשר '%{name}'? יש להזהר מפני שפעולה זו מתחוק את כל הפעולות המחזוריות בהקשר זה" - update_status_message: "שונה שם ההקשר" - edit_context: "עריכת הקשר" - show_form: "יצירת הקשר חדש" - context_name: "שם הקשר" - completed_tasks_title: "מסלולים::פעולות שבוצעו במלואן בהקשר '%{context_name}'" - no_contexts_active: "אין כרגע הקשרים פעילים" - save_status_message: "הקשר נשמר" - no_actions: "אין כרגע פעולות שלא הושלמו בהקשר הנוכחי" - delete_context: "מחק הקשר" - hidden_contexts: "הקשרים מוסתרים" - visible_contexts: "הקשרים גלויים" - context_hide: "הסתרה מעמוד הבית?" - context_deleted: "נמחק הקשר '%{name}'" - todos_append: "בהקשר זה" - new_context_post: "' יווצרו בנוסף. האם להמשיך?" - no_contexts_hidden: "אין כרגע הקשרים מוסתרים" - status_active: "ההקשר פעיל" - all_completed_tasks_title: "מסלולים::כל הפעולות שבוצעו במלואן בהקשר '%{context_name}'" - hide_form: "הסתרת טופס" - add_context: "הוספת הקשר" - new_context_pre: "הקשר חדש '" - show_form_title: "הוספת הקשר" - models: - todo: - error_date_must_be_future: "חייב להיות תאריך עתידי" - user: - error_project_not_associated: "מזהה פרוייקט %{project} אינו משוייך עם מזה משתמש %{user}." - error_context_not_associated: "מזהה הקשר %{context} אינו משוייך עם מזה משתמש %{user}." - project: - feed_title: "פרוייקטים במסלולים" - feed_description: "רשימת כל הפרוייקטים עבור %{username}" - preference: - due_on: "- יעד ב%{date}" - due_in: "תאריך יעד בעוד %{days} ימים" - users: - total_notes: "כל הפתקיות" - destroy_successful: "משתמש %{login} הושמד בהצלחה" - change_password_submit: "שינוי סיסמא" - destroy_confirmation: "אזהרה: הפעולה תמחק את המשתמש '%{login}', כל הפעולות, הפרוייקטים והפתקים. האם להמשיך?" - label_auth_type: "שיטת אימות" - identity_url: "כתובת זהות" - total_users_count: "קיימים %{count} משתמשים" - new_user_title: "מסלולים::רישום משתמש כמנהל" - account_signup: "רישום לחשבון" - password_confirmation_label: "אימות סיסמא" - change_password_title: "מסלולים::שינוי סיסמא" - no_signups_title: "מסלולים::אין רישומים" - new_user_heading: "רישום משתמש חדש:" - total_projects: "פרויקטים בסך הכל" - destroy_error: "ארעה שגיאה במחיקת המשתמש %{login}" - new_password_label: "סיסמא חדשה" - you_have_to_reset_your_password: "יש לאפס את הסיסמא" - openid_ok_pref_failed: "כתובת הזהות %{url} .אומתה בהצלחה אך ארעה תקלה בשמירת הגדרות ההזדהות" - first_user_heading: "ברוכים הבאים אל מסלולים. כדי להתחיל, יש ליצור חשבון מנהל:" - select_authentication_type: "יש לבחור את שיטת הזיהוי החדשה ולהלליק 'שינוי שיטת הזדהות' לבחירת השיטה הנוכחית" - desired_login: "משתמש כניסה רצוי" - confirm_password: "אישור סיסמא" - change_password_prompt: "יש לכתוב את הסיסמא החדשה בשדות שלמטה ולהקליק 'שנה סיסמא' כדי להחליף את הסיסמא הנוכחית בחדשה." - failed_to_delete_user: "מחיקת המשתמש %{username} נכשלה" - register_with_cas: "עם משתמש השא\"מ שלך" - new_token_generated: "אסימון חדש נוצר בהצלחה" - password_updated: "סיסמא עודכנה." - total_actions: "סך פעולות" - choose_password: "בחירת סיסמא" - auth_change_submit: "שינוי שיטת אימות" - total_contexts: "סך הקשרים" - manage_users: "ניהול משתמשים" - auth_type_updated: "שיטת אימות עודכנה" - signup_successful: "רישום מוצלח עבור משתמש %{username}." - change_authentication_type: "שינוי שיטת הזדהות" - auth_type_update_error: "ארעה שגיאה בעידכון שיטת האימות: %{error_messages}" - change_auth_type_title: "מסלולים::שינוי שיטת הזדהות" - signup_new_user: "רשום משתמש חדש" - openid_url_verified: "כתובת הזהות %{url} .אומתה בהצלחה ואופן האימות נקבע ל-OpenID." - destroy_user: "השמדת משתמש" - user_created: "משתמש נוצר" - signup: "רישום" - successfully_deleted_user: "משתמש %{username} נמחק בהצלחה" - preferences: - page_title_edit: "מסלולים::עריכת העדפות" - authentication_header: "הזיהוי שלי" - change_password: "סינוי סיסמא" - staleness_starts_after: "תפלות מתחילה לאחר %{days} ימים" - change_identity_url: "שינוי כתובת URL הזדהות" - updated: "העדפות עודכנו" - current_authentication_type: "שיטת הזיהוי שלי היא %{auth_type}" - token_description: "אסימון (משמש להזנות ישימוש ממשק תכתנות)" - edit_preferences: "עריכת העדפות" - is_true: "חיובי" - token_header: "האסימון שלי" - generate_new_token_confirm: "בטוח? יצירת אסימון חדש תחליף את האסימון הקיים ותבטל את השימוש בו." - is_false: "שלילי" - tabs: - authentication: "אימות" - tracks_behavior: "התנהגות מסלולים" - date_and_time: "תאריך ושעה" - profile: "פרופיל" - page_title: "מסלולים::העדפות" - sms_context_none: "ללא" - change_authentication_type: "שינוי סוג הזדהות" - open_id_url: "כתובת זיהוי OpenID שלך היא" - show_number_completed: "הצג %{number} פריטים שהסתיימו" - generate_new_token: "יצירת אסימון חדש" - password_changed: "הסיסמא שונתה, יש להיכנס שנית." - title: "ההגדרות שלי" - common: - numbered_step: "צעד %{number}" - projects: "פרוייקטים" - add: "הוסף" - go_back: "חזור" - optional: "אפשרי" - contribute: "תרום" - todo: "משימה" - forth: "ואילך" - none: "הערה" - back: "אחורה" - second: "שני" - update: "עדכן" - create: "צור" - description: "תיאור" - bugs: "באגים" - third: "שלישי" - weeks: "שבועות" - days_midsentence: - other: "ימים" - zero: "ימים" - one: "יום" - cancel: "בטל" - sort: - sort: "מיין" - by_task_count: "לפי מספר משימות" - alphabetically_title: "סדר פרוייקטים אלפבטית" - by_task_count_title_confirm: "לסדר את הפרוייקטים לפי מספר המשימות? הפעולה תחליף את הסדר הקיים" - alphabetically_confirm: "לסדר את הפרוייקטים בסדר אלפבתי? הפעולה תחליף את הסדר הקיים" - by_task_count_title: "מיין לפי מספר משימות" - alphabetically: "אלפבתי" - errors_with_fields: "שגירות בשדות המצויינים" - ajaxError: "שגיאה בתגובה מהשרת" - server_error: "התרחשה שגיאת שרת" - action: "פעולה" - last: "אחרון" - email: "דוא\"ל" - note: - other: "%{count} פתקיות" - zero: "אין פתקיות" - one: "פתקה" - deferred: "נדחה" - previous: "הקודם" - months: "חודשים" - fourth: "רביעי" - search: "חיפוש" - contexts: "הקשרים" - recurring_todos: "פעולות מחזוריות" - project: "פרוייקט" - website: "אתר" - logout: "צא" - forum: "פורום" - month: "חודש" - week: "שבוע" - first: "ראשון" - show_all: "הצג הכל" - review: "ביקורת" - context: "הקשר" - drag_handle: "משוך" - wiki: "ויקי" - not_available_abbr: "ל/י" - actions: "פעולות" - next: "הבא" - notes: "פתקיות" - ok: "אוקי" - actions_midsentence: - other: "פעולות" - zero: "פעולות" - one: "פעולה" - layouts: - toggle_notes_title: "חשיפת כל הפתקיות" - mobile_navigation: - home: "1-בית" - projects: "פרוייקטים" - tickler: "מִזְכָּר" - starred: "4-מודגשים" - feeds: "הזנות" - new_action: "0-פעולה חדשה" - contexts: "2-הקשרים" - logout: "צא" - navigation: - home: "בית" - starred_title: "הצגת פעולות מודגשות" - recurring_todos_title: "ניהול פעולות מחזוריות" - tickler: "מִזְכָּר" + longer: "%A %B %d, %Y" + short: "%b %d " + datetime: + distance_in_words: + about_x_hours: + one: "????" + other: "?-%{count} ????" + about_x_months: + one: "?????" + other: "?-%{count} ??????" + about_x_years: + one: "????" + other: "?-%{count} ????" + almost_x_years: + one: "???? ???" + other: "???? %{count} ????" + half_a_minute: "??? ???" + less_than_x_minutes: + one: "???? ????" + other: "???? ?-%{count} ????" + zero: "???? ????" + less_than_x_seconds: + one: "???? ??????" + other: "???? ?-%{count} ?????" + zero: "???? ??????" + over_x_years: + one: "???? ????" + other: "??? %{count} ????" + x_days: + one: "???" + other: "%{count} ????" + x_minutes: + one: "???" + other: "%{count} ????" + x_months: + one: "????" + other: "%{count} ??????" + x_seconds: + one: "?????" + other: "%{count} ?????" + prompts: + day: "???" + hour: "???" + minute: "???" + month: "????" + second: "?????" + year: "???" + errors: + user_unauthorized: "401 ?? ?????: ?? ??????? ????? ???? ????? ?????? ????? ??" + feedlist: + actions_completed_last_week: "?????? ???????? ????? ????? ????????" + actions_due_next_week: "?????? ??? ???? ????? ????? ???????" + actions_due_today: "?????? ?????? ???? ?? ????? ????" + active_projects_wo_next: "????????? ?????? ??? ?????? ????" + active_starred_actions: "?? ??????? ??????? ????????" + all_actions: "?? ???????" + all_contexts: "?? ???????" + all_projects: "?? ??????????" + choose_context: "????? ????? ????? ????? ????" + choose_project: "????? ???????? ????? ????? ????" + context_centric_actions: "????? ???? ?????? ??? ??????? ????? ????" + context_needed: "???? ????? ????? ???? ??? ???? ????? ????? ????" + ical_feed: "???? iCal" + last_fixed_number: "%{number} ?????? ???????" + legend: "????:" + notice_incomplete_only: "????: ?? ?????? ?????? ?? ?? ??????? ??? ????? ???????? ??? ?? ?? ???? ?????? ????." + plain_text_feed: "???? ???? ????" + project_centric: "????? ???? ?????? ??? ??????? ???????? ??????" + project_needed: "???? ????? ??????? ??? ???? ????? ???? ????" + projects_and_actions: "????????? ?????? ???????? ????" + rss_feed: "???? ???" + select_feed_for_context: "????? ????? ???? ????? ?????" + select_feed_for_project: "????? ????? ???? ????????" + footer: + send_feedback: "????? ???? ?? ????? %{version}" + integrations: + applescript_next_action_prompt: "????? ??????? ?????:" + applescript_success_after_id: "????" + applescript_success_before_id: "????? ???? ?? ?????" + gmail_description: "?????? ?????? ??????? ?-Gmail" + opensearch_description: "????? ????????" + layouts: + mobile_navigation: + contexts: 2-?????? + feeds: "?????" + home: 1-??? + logout: "??" + new_action: "0-????? ????" + projects: "?????????" + starred: 4-??????? + tickler: "????????" + navigation: + admin: "?????" + api_docs: "????? ???? ?????" + calendar: "??? ???" + calendar_title: "??? ??? ?? ?????? ??????" + completed_tasks: "????" + completed_tasks_title: "??????" + contexts_title: "??????" + export: "????" + export_title: "???? ????? ??????" + feeds: "?????" + feeds_title: "???? ?????? ?????? ??????" help: "?" - admin: "ניהול" - starred: "מודגשים" - completed_tasks_title: "הסתיים" - api_docs: "תיעוד ממשק תכנות" - integrations_: "שילוב מסלולים" - feeds: "הזנות" - preferences_title: "הצגת העדפותי" - export_title: "יבוא ויצוא נתונים" - stats: "סטטיסטיקה" - home_title: "בית" - organize: "ארגון" - feeds_title: "צפיה ברשימת ההזנות הזמינה" - manage_users: "ניהול משתמשים" - notes_title: "הצגת כל הפתקיות" - search: "חיפוש כל הפריטים" - completed_tasks: "בוצע" - review_title: "עריכצ ביקורת" - recurring_todos: "משימות מחזוריות" - preferences: "העדפות" - manage_users_title: "הוספה או הסרה של משתמשים" - stats_title: "הצגת הסטטיסטיקה שלי" - view: "תצוגה" - contexts_title: "הקשרים" - calendar_title: "לוח שנה של משימות לביצוע" - projects_title: "פרוייקטים" - calendar: "לוח שנה" - tickler_title: "מִזְכָּר" - export: "יצוא" - next_actions_rss_feed: "הזנת רסס לפעולות המשך" - toggle_contexts_title: "הסתרת/הצגת שדות מוסתרים" - toggle_contexts: "הצגת שדות מוסתרים" - toggle_notes: "חשיפת פתקיות" - feedlist: - actions_due_today: "פעולות לביצוע היום או מוקדם יותר" - active_projects_wo_next: "פרוייקטים פעילים ללא פעולות המשך" - select_feed_for_project: "בחירת ההזנה עבור הפרוייקט" - actions_completed_last_week: "פעולות שהסתיימו בשבעת הימים האחרונים" - all_contexts: "כל ההקשרים" - project_needed: "דרוש לפחות פרוייקט אחד לפני שניתן לבקש הזנה" - notice_incomplete_only: "הערה: כל ההזנות מציגות את כל הפעולות שלא סומנו כמבוצעות אלא אם כן נבחר במפורש אחרת." - choose_context: "בחירת ההקשר עבורו דרושה הזנה" - all_projects: "כל הפרוייקטים" - context_centric_actions: "הזנות עבור פעולות שלא נסתיימו בהקשר נתון" - context_needed: "צריך להיות לפחות הקשר אחד לפני שניתן לבקשר הזנה" - project_centric: "הזנות עבור פעולות שלא הסתיימו בפרוייקט מסויים" - ical_feed: "הזנת iCal" - active_starred_actions: "כל הפעולות הפעילות והמדגשות" - last_fixed_number: "%{number} פעולות אחרונות" - rss_feed: "הזנת רסס" - choose_project: "בחירת הפרוייקט עבורו דרושה הזנה" - projects_and_actions: "פרוויקטים פעילים והפעולות שלהם" - actions_due_next_week: "פעולות שיש לבצע בשבעת הימים הקרובים" - plain_text_feed: "הזנת טקסט פשוט" - all_actions: "כל הפעולות" - legend: "מקרא:" - select_feed_for_context: "בחירת ההזנה עבור ההקשר הנתון" - number: - currency: - format: - unit: "₪" - separator: . + home: "???" + home_title: "???" + integrations_: "????? ???????" + manage_users: "????? ???????" + manage_users_title: "????? ?? ???? ?? ???????" + notes_title: "???? ?? ???????" + organize: "?????" + preferences: "??????" + preferences_title: "???? ???????" + projects_title: "?????????" + recurring_todos: "?????? ????????" + recurring_todos_title: "????? ?????? ????????" + review_title: "????? ??????" + search: "????? ?? ???????" + starred: "???????" + starred_title: "???? ?????? ???????" + stats: "?????????" + stats_title: "???? ?????????? ???" + tickler: "????????" + tickler_title: "????????" + view: "?????" + next_actions_rss_feed: "???? ??? ??????? ????" + toggle_contexts: "???? ???? ???????" + toggle_contexts_title: "?????/???? ???? ???????" + toggle_notes: "????? ??????" + toggle_notes_title: "????? ?? ???????" + login: + account_login: "????? ??????" + cas_create_account: "?? ?????? ???? ?? ?????? ?-%{signup_link}" + cas_logged_in_greeting: "???? %{username}! ?????? ?????" + cas_login: "??????? ??\"? (????? ????? ?????)" + cas_no_user_found: "%{username} ????! ??? ????? ??? ?? ????????." + cas_signup_link: "???? ?????" + cas_username_not_found: "??????, ?? ???? ????? ??\"? ??? (%{username})" + log_in_again: "????? ??????" + logged_out: "????? ????? ?-???????" + login_cas: "???? ?? ??\"?" + login_standard: "???? ?????? ??????" + login_with_openid: "????? ?? OpenID" + mobile_use_openid: "...?? ????? ?? OpenID" + openid_identity_url_not_found: "??????, ?? ???? ????? ?? ????? ???? (%{identity_url})" + option_separator: "??," + please_login: "?? ????? ??? ?????? ?-???????" + session_time_out: "?? ???? ?????. ?? %{link}" + session_will_expire: "???? ????? ???? ???? %{hours} ???(??) ?? ???? ??????." + session_will_not_expire: "????? ??? ?????." + sign_in: "?????" + successful: "????? ????? ??????. ???? ????!" + successful_with_session_info: "????? ??????:" + unsuccessful: "????? ?????." + user_no_expiry: "????? ?????" + models: + preference: + due_in: "????? ??? ???? %{days} ????" + due_on: "- ??? ?%{date}" + project: + feed_description: "????? ?? ?????????? ???? %{username}" + feed_title: "????????? ????????" + todo: + error_date_must_be_future: "???? ????? ????? ?????" + user: + error_context_not_associated: "???? ???? %{context} ???? ?????? ?? ??? ????? %{user}." + error_project_not_associated: "???? ??????? %{project} ???? ?????? ?? ??? ????? %{user}." + notes: + delete_confirmation: "??? ????? ?? ?????? '%{id}'?" + delete_item_title: "????? ????" + delete_note_confirm: "??? ????? ?? ?????? '%{id}'?" + delete_note_title: "????? ?????? '%{id}'" + deleted_note: "?????? '%{id}' ?????" + edit_item_title: "????? ????" + in_project: "?:" + no_notes_available: "??? ???? ??????: ???? ?????? ?????? ?????????????? ???????? ????? ????????????" + note_header: "????? %{id}" + note_link_title: "???? ????? %{id}" + note_location_link: "????:" + show_note_title: "???? ?????" + number: + currency: + format: delimiter: "," format: "%u%n " - human: - storage_units: - units: - tb: "טרה בייט" - kb: "קילו בייט" - gb: "ג'יגהבייט" - mb: "מגה בייט" - byte: - other: "בתים" - one: "בייט" - format: "%u%n" - format: - separator: . + separator: "." + unit: | + --- ? + ... + format: delimiter: "," - footer: - send_feedback: "שליחת משוב על גירסא %{version}" - notes: - delete_item_title: "מחיקת פריט" - in_project: "ב:" - show_note_title: "הצגת פתקית" - note_location_link: "בתוך:" - deleted_note: "הפתקית '%{id}' נמחקה" - delete_confirmation: "האם למחוק את הפתקית '%{id}'?" - delete_note_confirm: "האם למחוק את הפתקית '%{id}'?" - note_link_title: "הצגת פתקית %{id}" - edit_item_title: "עריכת פריט" - no_notes_available: "אין כרגע פתקיות: ניתן להוסיף פתקיות לפְּרוֹיֶקְטים ספציפיים מעמוד הפְּרוֹיֶקְט" - note_header: "פתקית %{id}" - delete_note_title: "מחיקת הפתקית '%{id}'" - states: - stalled_plural: "עצורים" - visible_plural: "גלויים" - hidden: "מוסתרים" - review_plural: "מתוארכים" - completed_plural: "הסתיימו" - current_plural: "מעודכנים" - visible: "גלוי" - completed: "הסתיים" - hidden_plural: "מוסתרים" - blocked_plural: "חסומים" - stalled: "נעצר" - current: "עדכני" - active_plural: "פעילים" - active: "פעיל" - review: "מתוארך" - blocked: "נחסם" + separator: "." + human: + storage_units: + format: "%u%n" + units: + byte: + one: "????" + other: "????" + gb: "?'???????" + kb: "???? ????" + mb: "??? ????" + tb: "??? ????" + preferences: + authentication_header: "?????? ???" + change_authentication_type: "????? ??? ??????" + change_identity_url: "????? ????? URL ??????" + change_password: "????? ?????" + current_authentication_type: "???? ?????? ??? ??? %{auth_type}" + edit_preferences: "????? ??????" + generate_new_token: "????? ?????? ???" + generate_new_token_confirm: "????? ????? ?????? ??? ????? ?? ??????? ????? ????? ?? ?????? ??." + is_false: "?????" + is_true: "?????" + open_id_url: "????? ????? OpenID ??? ???" + page_title: "???????::??????" + page_title_edit: "???????::????? ??????" + password_changed: "?????? ?????, ?? ?????? ????." + show_number_completed: "??? %{number} ?????? ????????" + sms_context_none: "???" + staleness_starts_after: "????? ?????? ???? %{days} ????" + tabs: + authentication: "?????" + date_and_time: "????? ????" + profile: "??????" + tracks_behavior: "??????? ???????" + title: "??????? ???" + token_description: "?????? (???? ?????? ?????? ???? ??????)" + token_header: "??????? ???" + updated: "?????? ??????" + projects: + actions_in_project_title: "?????? ???????? ??" + active_projects: "????????? ??????" + add_note: "????? ???" + add_note_submit: "????? ???" + add_project: "????? ???????" + all_completed_tasks_title: "???????::???? ????? ?? ??????? ??????? ???????? '%{project_name}'" + completed_actions: "?????? ???????? ???????? ??" + completed_actions_empty: "??? ?????? ???????? ???????? ??" + completed_projects: "????????? ????????" + completed_tasks_title: "???????::???? ????? ??????? ??????? ???????? '%{project_name}'" + default_context: "???? ????? ????? ???????? ?? %{context}" + default_context_removed: "???? ????? ????? ????" + default_context_set: "????? ???? ????? ????? ???????? ?-%{default_context}" + default_tags_removed_notice: "????? ????? ????? ?????" + deferred_actions: "?????? ????? ???? ??????? ??" + deferred_actions_empty: "??? ?????? ????? ???? ??????? ??" + delete_project: "????? ???????" + delete_project_confirmation: "??? ????? ?? ???????? '%{name}'?" + delete_project_title: "????? ????????" + edit_project_settings: "????? ?????? ???????" + edit_project_title: "????? ???????" + hidden_projects: "????????? ???????" + hide_form: "????? ????" + hide_form_title: "????? ???? ??????? ???" + is_active: "????" + list_completed_projects: "???????::????? ?????????? ???????" + list_projects: "???????::????? ?????????" + list_reviews: "???????::?????" + no_actions_in_project: "??? ???? ?????? ?? ?????? ???????? ??" + no_default_context: "??? ???? ????? ???? ???????? ??" + no_last_completed_projects: "?? ????? ????????? ????????" + no_last_completed_recurring_todos: "?? ????? ?????? ???????? ????????" + no_notes_attached: "??? ???? ?????? ???????? ???????? ??" + no_projects: "??? ???? ?????????" + notes: "??????" + notes_empty: "??? ?????? ???????? ??" + page_title: "???????::???????: %{project}" + project_saved_status: "??????? ????" + project_state: "???????? %{state}" + set_default_tags_notice: "????? ????? ????? ????? ?-%{default_tags}" + settings: "??????" + show_form: "????? ???????" + show_form_title: "????? ??????? ???" + state: "???????? ???? %{state}" + status_project_name_changed: "?? ???????? ????" + this_project: "??????? ??" + to_new_project_page: "???? ????? ???????? ????" + todos_append: "???????? ??" + was_marked_complete: "???? ?????" + was_marked_hidden: "???? ??????" + with_default_context: "?? ???? ???? ???? '%{context_name}'" + with_default_tags: "?? ?????? '%{tags}' ?????? ?????" + with_no_default_context: "??? ???? ????? ????" + with_no_default_tags: "???? ????? ????? ????" + search: + contexts_matching_query: "?????? ?????? ???????" + no_results: "?????? ?? ???? ??????" + notes_matching_query: "?????? ?????? ??????" + projects_matching_query: "????????? ?????? ??????" + tags_matching_query: "????? ?????? ???????" + todos_matching_query: "?????? ?????? ??????" + shared: + add_action: "????? ?????" + add_actions: "????? ?????" + add_context: "????? ????" + context_for_all_actions: "???? ??? ???????" + hide_action_form_title: "????? ???? ?????? ?????" + hide_form: "????? ????" + make_actions_dependent: "????? ???? ??? ??????" + multiple_next_actions: "?????? ???? ?????? (????? ??? ?????)" + project_for_all_actions: "??????? ??? ???????" + separate_tags_with_commas: "????? ???????" + tags_for_all_actions: "????? ??? ??????? (?? ?????? ???????)" + toggle_multi: "????? ?????? ???? ??????" + toggle_multi_title: "???? ????? ??? ????? ????? / ?????? ??????" + toggle_single: "????? ????? ????" + toggle_single_title: "????? ????? ???? ????" + sidebar: + list_empty: "???" + list_name_active_contexts: "?????? ??????" + list_name_active_projects: "????????? ??????" + list_name_completed_projects: "????????? ????????" + list_name_hidden_contexts: "?????? ???????" + list_name_hidden_projects: "????????? ???????" + states: + active: "????" + active_plural: "??????" + blocked: "????" + blocked_plural: "??????" + completed: "??????" + completed_plural: "???????" + current: "?????" + current_plural: "????????" + hidden: "???????" + hidden_plural: "???????" + review: "??????" + review_plural: "????????" + stalled: "????" + stalled_plural: "??????" + visible: "????" + visible_plural: "??????" + stats: + action_completion_time_title: "??? ???? (?? ??????? ????????)" + action_selection_title: "???????::????? ?????" + actions: "??????" + actions_30days_title: "?????? ?-30 ????? ????????" + actions_actions_avg_created_30days: "?-30 ????? ???????? ????? ?????? %{count} ??????" + actions_avg_completed: "???????? ?????? %{count} ?????? ?????" + actions_avg_completed_30days: "???????? ?????? %{count} ?????? ????" + actions_avg_completion_time: "??? ???????? ????????? ???? ?????? ????? ??? %{count} ????" + actions_avg_created: "?-12 ??????? ???????? ????? ????? %{count} ??????" + actions_day_of_week_legend: + day_of_week: "??? ?????" + number_of_actions: "???? ??????" + actions_day_of_week_title: "??? ????? (?? ???????)" + actions_dow_30days_legend: + day_of_week: "??? ?????" + number_of_actions: "???? ??????" + actions_dow_30days_title: "??? ????? (30 ????? ????????(" + actions_further: "?????" + actions_last_year: "?????? ????? ????????" + actions_last_year_legend: + months_ago: "?????? ????" + number_of_actions: "???? ???????" + actions_lastyear_title: "?????? ?-12 ??????? ????????" + actions_min_completion_time: "???? ?????? ????? ??? %{time}." + actions_min_max_completion_days: "??? ??? ??????/????? ????? ??? %{min}/%{max}." + actions_selected_from_week: "?????? ?????? ?????" + click_to_return: "????? ?? %{link} ????? ????? ??????????" + click_to_return_link: "???" + click_to_show_actions_from_week: "????? ?? %{link} ???? ?? ??????? ????? %{week} ?????" + click_to_update_actions: "????? ?? ??? ???? ?????? ?? ?????? ????" + contexts: "??????" + current_running_time_of_incomplete_visible_actions: "??? ????? ??? ??????? ???????" + index_title: "???????::?????????" + labels: + avg_completed: "??????? ??????" + avg_created: "????? ??????" + completed: "???????" + created: "?????" + month_avg_completed: "%{months} ??????? ?????? ?????" + month_avg_created: "%{months} ????? ?????? ?????" + legend: + actions: "??????" + day_of_week: "??? ?????" + months_ago: "?????? ????" + number_of_actions: "???? ??????" + number_of_days: "???? ???? ???? ???" + percentage: "????" + running_time: "??? ????? ?????? (??????)" + more_stats_will_appear: "?????????? ?????? ????? ??? ???? ????? ?????? ??????." + no_actions_selected: "?? ????? ??????" + no_tags_available: "??? ????? ??????" + open_per_week: "?????? ???? (?????? ?? ???????) ??? ????" + open_per_week_legend: + actions: "??????" + weeks: "?????? ???? ???" + other_actions_label: (?????) + projects: "?????????" + running_time_all: "??? ????? ??? ??????? ??? ???????" + running_time_all_legend: + actions: "??????" + percentage: "????" + running_time: "??? ????? ??????? (??????). ????? ?? ??? ????? ????" + running_time_legend: + actions: "??????" + percentage: "????" + weeks: "??? ????? ??????? (??????). ????? ?? ??? ????? ????" + spread_of_actions_for_all_context: "????? ?????? ??? ???????" + spread_of_running_actions_for_visible_contexts: "????? ??????? ??????? ??????" + tag_cloud_90days_description: "??? ?????? ???? ????? ???? ?????? ?????? ?? ??????? ?-90 ????? ????????." + tag_cloud_90days_title: "??? ????? ??????? ?-90 ????? ????????" + tag_cloud_description: "??? ?????? ???? ????? ??? ??????? (???????, ?? ???????, ?????? ?/?? ???????(" + tag_cloud_title: "??? ????? ??? ???????" + tags: "?????" + time_of_day: "??? ???? (?? ???????)" + time_of_day_legend: + number_of_actions: "???? ??????" + time_of_day: "??? ????" + tod30: "??? ???? (30 ???? ??????)" + tod30_legend: + number_of_actions: "???? ??????" + time_of_day: "??? ????" + top10_longrunning: "10 ?????????? ????? ??? ???? ???" + top10_projects: "???? ?????????? ????????" + top10_projects_30days: "???? ?????????? ???????? ?-30 ????? ????????" + top5_contexts: "5 ?????? ???????" + top5_visible_contexts_with_incomplete_actions: "5 ??????? ???????? ?? ?????? ??? ???????" + totals: "???????" + totals_action_count: "?????? %{count} ?????? ??? ???" + totals_actions_completed: "%{count} ??? ???????" + totals_active_project_count: "?????, %{count} ?? ????????? ??????" + totals_blocked_actions: "%{count} ?????? ????? ??????? ????" + totals_completed_project_count: "%{count} ??? ????????? ????????." + totals_context_count: "?????? %{count} ??????." + totals_deferred_actions: "??? %{count} ?????? ?????? ?????????" + totals_first_action: "??? ?????? ??????? ?-%{date}" + totals_hidden_context_count: "?-%{count} ??????? ???????." + totals_hidden_project_count: "%{count} ???????" + totals_incomplete_actions: "?????? %{count} ?????? ??? ???????" + totals_project_count: "?????? %{count} ?????????." + totals_tag_count: "?????? %{count} ????? ????????? ???????." + totals_unique_tags: "???? ????? ???, %{count} ????????." + totals_visible_context_count: "???? ??? %{count} ?????? ??????" + within_one: "??? 1" + support: + array: + last_word_connector: ", ?-" + two_words_connector: "?-" + words_connector: "," + select: + prompt: "?? ???? ?????" + time: + am: "????\"?" + formats: + default: "%a, %d %b %Y %H:%M:%S %z " + long: "%B %d, %Y " + month_day: "%B %d " + short: "%d %b %H:%M " + stats: "%a %d-%m" + pm: "???\"?" + todos: + action_deferred: "?????? '%{description}' ?????" + action_deleted_error: "????? ????? ??????" + action_deleted_success: "????? ???? ????? ??????" + action_due_on: "(????? ?? %{date})" + action_marked_complete: "?????? '%{description}' ????? ?- %{completed}" + action_marked_complete_error: "?????? '%{description}'???? ????? ? - %{completed} ??? ????? ???" + action_saved: "????? ?????" + action_saved_to_tickler: "????? ????? ?????????" + add_another_dependency: "????? ???? ?????" + add_new_recurring: "????? ????? ??????? ????" + added_dependency: "????? %{dependency} ?????" + added_new_context: "???? ???? ???" + added_new_next_action: "????? ????? ???? ????" + added_new_next_action_plural: "????? ?????? ???? ?????" + added_new_next_action_singular: "????? ????? ???? ????" + added_new_project: "???? ??????? ???" + all_completed: "?? ??????? ????????" + all_completed_here: "???" + all_completed_tagged_page_title: "???????::?? ??????? ???????? ?? ????? %{tag_name}" + append_in_this_project: "???????? ??" + archived_tasks_title: "???????: ?????? ???????? ?????? ???????" + blocked_by: "???? ?? ??? %{predecessors}" + calendar: + due_next_month_and_later: "????? ??? %{month} ?? ????? ????" + due_next_week: "????? ???" + due_this_month: "????? ??? ????? ???? %{month}" + due_this_week: "????? ?????" + due_today: "?????" + get_in_ical_format: "???? ??? ??? ?? ?????? iCal" + no_actions_due_after_this_month: "??? ?????? ?????? ???? ???? ??" + no_actions_due_next_week: "??? ?????? ?????? ????? ???" + no_actions_due_this_month: "??? ?????? ?????? ????? ?????" + no_actions_due_today: "??? ?????? ?????? ?????" + calendar_page_title: "???????::??? ???" + cannot_add_dependency_to_completed_todo: "??? ?????? ?????? ????? ?? ????? ?????? ????????!" + clear_due_date: "????? ????? ???" + clear_show_from_date: "??? ???? ??????" + completed: "???????" + completed_actions: "?????? ????????" + completed_actions_with: "?????? ???????? ?? ????? %{tag_name} " + completed_in_archive: + one: "????? ??????? ????? ????????." + other: "?????? %{count} ?????? ???????? ???????." + completed_last_day: "??????? ?-24 ???? ????????" + completed_last_x_days: "??????? ?-%{count} ????? ????????" + completed_recurrence_completed: "??? ????? ???? ?????? ???????? ??????. ?????? ???????? ?????." + completed_recurring: "??????? ?????? ????????" + completed_rest_of_month: "??????? ????? ????? ??????" + completed_rest_of_previous_month: "??????? ????? ????? ?????" + completed_rest_of_week: "??????? ????? ???? ??" + completed_tagged_page_title: "???????::?????? ???????? ?? ???? '%{tag_name}'" + completed_tasks_title: "???????::?????? ???????" + confirm_delete: "??? ????? ?? ??????? '%{description}'?" + context_changed: "???? ???? ?-%{name}" + convert_to_project: "????? ???????" + defer_date_after_due_date: "????? ?????? ????? ?????? ????. ?? ????? ?? ????? ???? ????? ???? ???? ??????." + defer_x_days: + one: "???? ????" + other: "???? ?-%{count} ????" + deferred_actions_with: "?????? ?????? ?? ???? '%{tag_name}'" + deferred_pending_actions: "?????? ???????/??????" + deferred_tasks_title: "???????::????????" + delete: "?????" + delete_action: "????? ?????" + delete_recurring_action_confirm: "??? ????? ?? ??????? ???????? '%{description}'?" + delete_recurring_action_title: "????? ????? ???????" + deleted_success: "?????? ????? ??????" + depends_on: "???? ?" + depends_on_separate_with_commas: "???? ?- (?? ?????? ???????(" + done: "???????" + drag_action_title: "?? ????? ?? ????? ???? ??? ????? ???? ??" + due: "???" + edit: "?????" + edit_action: "????? ?????" + edit_action_with_description: "????? ?????? '%{description}'" + edit_recurring_todo: "????? ?????? ????????" + error_completing_todo: "???? ????? ????? / ????? ?? ????? %{description}" + error_deleting_item: "???? ????? ?????? ????? %{description}" + error_deleting_recurring: "???? ????? ?????? ?????? ???????? '%{description}'" + error_removing_dependency: "?????? ????? ????? ?????" + error_saving_recurring: "???? ????? ?????? ?????? ???????? '%{description}'" + error_starring: "????? ?????? '%{description}' ?? ????" + error_starring_recurring: " ????? ?????? ???????? '%{description}' ?? ????" + error_toggle_complete: "?? ???? ???? ????? ?\"???????\"" + feed_title_in_context: "????? '%{context}'" + feed_title_in_project: "???????? '%{project}'" + feeds: + completed: "??????: %{date}" + due: "??? %{date}" + has_x_pending: + one: "??? ????? ????? ???" + other: "???? %{count} ????? ???????" + hidden_actions: "?????? ???????" + in_hidden_state: "???? ?????" + in_pending_state: "???? ?????" + list_incomplete_next_actions: "????? ?????? ???? ??? ???????" + list_incomplete_next_actions_with_limit: "????? %{count} ?????? ????? ??? ???????" + mobile_todos_page_title: "?? ???????" + new_related_todo_created: "????? ???? ????? ?????? ??????? ??" + new_related_todo_created_short: "????? ????? ????" + new_related_todo_not_created_short: "?? ????? ?????" + next_action_description: "????? ????? ????" + next_action_needed: "?? ????? ????? ????? ???? ???" + next_actions_description: "????:" + next_actions_description_additions: + completed: "?-%{count} ????? ????????" + due_date: "?? ????? ??? %{due_date} ?? ????? ???? " + next_actions_due_date: + due_in_x_days: "??? ???? %{days} ????" + due_today: "?????" + due_tomorrow: "????" + overdue_by: "?????? ?? %{days} ???" + overdue_by_plural: "?????? ?? %{days} ????" + next_actions_title: "??????? - ?????? ????" + next_actions_title_additions: + completed: "?????? ???????" + due_today: "?????" + due_within_a_week: "??? ????" + no_actions_due_this_week: "??? ?????? ???????? ????? ?????" + no_actions_found: "??? ???? ?????? ??? ???????" + no_actions_found_title: "?? ???? ??????" + no_actions_with: "??? ???? ?????? ??? ???????? ?? ????? '%{tag_name}'" + no_completed_actions: "??? ???? ?????? ????????." + no_completed_actions_with: "??? ?????? ???????? ?? ????? '%{tag_name}'" + no_completed_recurring: "??? ???? ?????? ???????? ????????" + no_deferred_actions: "??? ???? ?????? ?????." + no_deferred_actions_with: "??? ?????? ?????? ?? ????? '%{tag_name}'" + no_deferred_pending_actions: "??? ???? ?????? ?????? ?? ???????" + no_hidden_actions: "?? ????? ?????? ???????" + no_incomplete_actions: "??? ?????? ??? ???????" + no_last_completed_actions: "?? ????? ?????? ????????" + no_project: "--??? ???????--" + no_recurring_todos: "??? ???? ?????? ????????" + older_completed_items: "?????? ????????? ????? ????" + overdue: "??????" + pending: "?????" + recurrence: + daily: "????" + daily_every_number_day: "?? %{number} ????" + daily_options: "?????? ??????? ???????? ??????" + day_x_on_every_x_month: "???? %{day} ??? %{month} ????" + ends_on: "?????? ?" + ends_on_date: "?????? ?-%{date}" + ends_on_number_times: "?????? ???? %{number} ?????" + every_work_day: "??? ??? ?????" + from_tickler: "????? ???? ?????? ???? ?????????? (?? ???? ????? ???)" + monthly: "?????" + monthly_every_xth_day: "??? %{day} ? -%{day_of_week} ??? %{month} ????" + monthly_options: "?????? ??????? ???????? ??????" + no_end_date: "??? ????? ????" + pattern: + due: "???" + every_day: "?? ???" + every_month: "?? ????" + every_n: "?? %{n}" + every_xth_day_of_every_n_months: "?? %{x} %{day} ??? %{n_months}" + every_year_on: "??? ??? ?????? %{date}" + first: "?????" + fourth: "?????" + from: | + --- ? + ... + last: "?????" + on_day_n: "???? %{n}" + on_work_days: "???? ?????" + second: "???" + show: "????" + the_xth_day_of_month: "???? ?- %{x} %{day} ????? %{month}" + third: "?????" + times: "?-%{number} ?????" + until: "??" + weekly: "?????" + recurrence_on_due_date: "??? ??????" + recurrence_on_options: "????? ???????? ???" + show_days_before: "%{days} ???? ???? ????? ???? ??????" + show_option_always: "????" + show_options: "???? ??????" + starts_on: "????? ?" + weekly: "?????" + weekly_every_number_week: "???? ?? %{number} ???? ?" + weekly_options: "?????? ??????? ????????? ??????" + yearly: "?????" + yearly_every_x_day: "?? %{month} %{day}" + yearly_every_xth_day: "??? %{day} ? -%{day_of_week} ??? %{month} ????" + yearly_options: "?????? ??????? ????????? ??????" + recurrence_completed: "??? ????? ???? ?????? ???????? ??????. ????????? ???????." + recurrence_period: "????? ????????" + recurring_action_deleted: "????? ?????. ???? ??????? ???????. ????? ???? ?????" + recurring_action_saved: "????? ??????? ?????" + recurring_actions_title: "???????::?????? ????????" + recurring_deleted_success: "?????? ???????? ????? ??????" + recurring_pattern_removed: "????? ??????? ???? ?-%{count}" + recurring_todos: "?????? ????????" + remove_dependency: "???? ???? (?? ???? ?? ??????)" + removed_predecessor: "?????%{successor} ????? ?? %{predecessor}.?" + scheduled_overdue: "????? ?????? ???? %{days} ????" + see_all_completed: "???? ????? ?? ?? ??????? ???????? ???: %{link}" + set_to_pending: "%{task} ?????? ???????" + show_from: "???? ?-" + show_in_days: "??? ???? %{days} ????" + show_on_date: "??? ?????? %{date}" + show_today: "???? ????" + show_tomorrow: "???? ???" + star_action: "????? ?????" + star_action_with_description: "????? ?????? '%{description}'" + tagged_page_title: "???????::????? ?? '%{tag_name}'" + tagged_with: "?????? ?- ‘%{tag_name}’" + tags: "????? (??????? ???????)" + task_list_title: "???????::????? ??????" + tickler_items_due: + one: "??? ???????????? ???? ?????? ???? - ?? ????? ????? ?????." + other: "%{count} ???????????? ????? ?????? ???? - ?? ????? ????? ?????." + to_tickler: "?????????" + unable_to_add_dependency: "?? ???? ?????? ????" + unresolved_dependency: "???? ?????? ????? ?? ??? ??? ????? ?????. ???? ?? ???? ?? ???? ??????. ???????" + was_due_on_date: "??? ????? ?? %{date}" + users: + account_signup: "????? ??????" + auth_change_submit: "????? ???? ?????" + auth_type_update_error: "???? ????? ??????? ???? ??????: %{error_messages}" + auth_type_updated: "???? ????? ??????" + change_auth_type_title: "???????::????? ???? ??????" + change_authentication_type: "????? ???? ??????" + change_password_prompt: "?? ????? ?? ?????? ????? ????? ????? ??????? '??? ?????' ??? ?????? ?? ?????? ??????? ?????." + change_password_submit: "????? ?????" + change_password_title: "???????::????? ?????" + choose_password: "????? ?????" + confirm_password: "????? ?????" + desired_login: "????? ????? ????" + destroy_confirmation: "?????: ?????? ???? ?? ?????? '%{login}', ?? ???????, ?????????? ???????. ??? ???????" + destroy_error: "???? ????? ?????? ?????? %{login}" + destroy_successful: "????? %{login} ????? ??????" + destroy_user: "????? ?????" + failed_to_delete_user: "????? ?????? %{username} ?????" + first_user_heading: "?????? ????? ?? ???????. ??? ??????, ?? ????? ????? ????:" + identity_url: "????? ????" + label_auth_type: "???? ?????" + manage_users: "????? ???????" + new_password_label: "????? ????" + new_token_generated: "?????? ??? ???? ??????" + new_user_heading: "????? ????? ???:" + new_user_title: "???????::????? ????? ?????" + no_signups_title: "???????::??? ???????" + openid_ok_pref_failed: "????? ????? %{url} .????? ?????? ?? ???? ???? ?????? ?????? ???????" + openid_url_verified: "????? ????? %{url} .????? ?????? ????? ?????? ???? ?-OpenID." + password_confirmation_label: "????? ?????" + password_updated: "????? ??????." + register_with_cas: "?? ????? ???\"? ???" + select_authentication_type: "?? ????? ?? ???? ?????? ????? ??????? '????? ???? ??????' ?????? ????? ???????" + signup: "?????" + signup_new_user: "???? ????? ???" + signup_successful: "????? ????? ???? ????? %{username}." + successfully_deleted_user: "????? %{username} ???? ??????" + total_actions: "?? ??????" + total_contexts: "?? ??????" + total_notes: "?? ???????" + total_projects: "???????? ??? ???" + total_users_count: "?????? %{count} ???????" + user_created: "????? ????" + you_have_to_reset_your_password: "?? ???? ?? ??????" + will_paginate: + next_label: "??? »" + page_entries_info: + multi_page: "???? %{model} %{from} - %{to} ???? %{count} ??? ???" + multi_page_html: "???? %{model} %{from} - %{to} ???? %{count} ??? ???" + single_page: + one: "???? %{model} ???" + other: "???? ?? ?? %{count} %{model}" + zero: "?? ???? %{model}" + single_page_html: + one: "???? 1 %{model}" + other: "???? ?? %{count} %{model}" + zero: "?? ???? %{model}" + page_gap: "…" + previous_label: "« ?????" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 348568db..796a8b22 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1,1011 +1,1032 @@ ---- -nl: - layouts: - toggle_contexts_title: Maak ingeklapte contexten (on)zichtbaar - toggle_contexts: Toggle ingeklapte contexten - toggle_notes: Toggle notities - next_actions_rss_feed: RSS-feed van de acties - toggle_notes_title: Toggle alle notities - mobile_navigation: - new_action: Nieuwe actie - logout: Afmelden - feeds: Feeds - starred: Ster - projects: Projecten - tickler: Tickler - contexts: Contexten - home: Start - navigation: - manage_users_title: Toevoegen of verwijderen gebruikers - recurring_todos: Terugkerende acties - api_docs: REST API Docs - help: "?" - feeds: Feeds - starred: Ster - stats: Statistieken - notes_title: Toon alle notities - manage_users: Beheren gebruikers - tickler_title: Tickler - admin: Admin - preferences: Voorkeuren - integrations_: Integreer Tracks - export_title: Import en export van gegevens - calendar_title: Kalender met acties met deadline - feeds_title: Zie een lijst met beschikbare feeds - stats_title: Zie je statistieken - tickler: Tickler - home_title: Start - starred_title: Zie je ster acties - recurring_todos_title: Beheren terugkerende acties - completed_tasks: Gereed - organize: Organiseer - view: Bekijk - completed_tasks_title: Afgerond - home: Start - export: Export - contexts_title: Contexten - preferences_title: Toon mijn voorkeuren - search: Zoeken in alle items - review_title: Evaluatie uitvoeren - projects_title: Projecten - calendar: Agenda - number: - format: - separator: "," - delimiter: . - human: - storage_units: - format: "%n %u" - units: - kb: KB - tb: TB - gb: GB - byte: - one: Byte - other: Bytes - mb: MB - currency: - format: - format: "%u %n" - unit: "€" - separator: "," - delimiter: . - common: - recurring_todos: Herhalende acties - back: Terug +--- +nl: + activerecord: + attributes: + note: + created_at: "Gemaakt op" + updated_at: "Bijgewerkt op" + preference: + date_format: "Datum formaat" + due_style: "Deadline stijl" + first_name: Voornaam + last_name: Achternaam + locale: Taal + mobile_todos_per_page: "Acties per pagina (mobiel)" + refresh: "Ververs interval (in minuten)" + review_period: "Project evaluatie interval" + show_completed_projects_in_sidebar: "Toon afgeronde projecten in sidebar" + show_hidden_contexts_in_sidebar: "Toon verborgen contexten in sidebar" + show_hidden_projects_in_sidebar: "Toon verborgen projecten in sidebar" + show_number_completed: "Aantal te tonen afgeronde acties" + show_project_on_todo_done: "Ga naar project pagina wanneer actie gereed is" + sms_context: "Standaard context voor email" + sms_email: "Van email" + staleness_starts: "Begin van markeren openstaande actie" + time_zone: Tijdzone + title_date_format: "Datum formaat in titel" + verbose_action_descriptors: "Context en project uitschrijven in actielijst" + week_starts: "Week start op" + project: + default_context_name: "Standaard context" + default_tags: "Standaard Tags" + description: Beschrijving + name: Naam + todo: + context: Context + description: Beschrijving + due: Deadline + notes: Notities + predecessors: Afhankelijkheden + project: Project + show_from: "Tonen vanaf" + tags: Labels + user: + first_name: Voornaam + last_name: Achternaam + errors: + full_messages: + format: "%{attribute} %{message}" + messages: + accepted: "moet geaccepteerd worden" + blank: "mag niet leeg zijn" + confirmation: "komt niet overeen met de configuratie" + empty: "mag niet leeg zijn" + equal_to: "moet gelijk zijn aan %{count}" + even: "moet even zijn" + exclusion: "is gereserveerd" + greater_than: "moet groter zijn dan %{count}" + greater_than_or_equal_to: "moet groter of gelijk zijn aan %{count}" + inclusion: "is niet opgenomen in de lijst" + invalid: "mag niet een komma (',') karakter bevatten" + less_than: "moet kleiner zijn dan %{count}" + less_than_or_equal_to: "moet kleiner of gelijk zijn aan %{count}" + not_a_number: "is niet een getal" + odd: "moet oneven zijn" + record_invalid: "Validatie mislukt: %{errors}" + taken: "is al gepakt" + too_long: "is te lang (maximum is %{count} karakters)" + too_short: "is te kort (minimum is %{count} karakters)" + wrong_length: "heeft de verkeerde lengte (moet %{count} karakters lang zijn)" + models: + project: + attributes: + name: + blank: "project moet een naam hebben" + taken: "bestaat al" + too_long: "project naam moet minder dan 256 karakters hebben" + template: + body: "Er waren problemen met de volgende velden" + header: + one: "1 fout voorkomt het kunnen bewaren van deze %{model}" + other: "%{count} fouten voorkomen dat dit %{model} bewaard kan worden" + common: + action: Actie actions: Acties - third: Derde - add: Toevoegen - previous: Vorige - go_back: Ga terug - logout: Log uit - second: Tweede - none: Geen - week: week - optional: optioneel - deferred: uitgestelde - show_all: Toon alle - cancel: Annuleer - month: maand - actions_midsentence: + actions_midsentence: one: actie other: acties zero: acties - server_error: Een fout heeft op de server plaatsgevonden - forum: Forum - notes: Notities - projects: Projecten - last: Laatste - review: Evaluatie - action: Actie - days_midsentence: + add: Toevoegen + ajaxError: "Er is een fout opgetreden bij het ophalen van gegevens van de server" + back: Terug + bugs: Fouten + cancel: Annuleer + context: Context + contexts: Contexten + contribute: Bijdragen + create: Maken + days_midsentence: one: dag other: dagen zero: dagen - project: Project - contribute: Bijdragen - ok: Ok - website: Website - first: Eerste - note: - one: 1 notitie - other: "%{count} notities" - zero: geen notities - numbered_step: Stap %{number} - create: Maken - sort: - by_task_count_title: Sorteer op aantal acties - by_task_count_title_confirm: Weet u zeker dat u deze op aantal acties wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen. - alphabetically: Alfabetisch - sort: Sorteer - alphabetically_title: Sorteer projecten alfabetisch - alphabetically_confirm: Weet u zeker dat u deze projecten alfabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen. - by_task_count: Op aantal acties - todo: actie - months: maanden - errors_with_fields: Er waren problemen met de volgende velden + deferred: uitgestelde description: Beschrijving - next: Volgende - fourth: Vierde drag_handle: SLEEP - context: Context - contexts: Contexten - bugs: Fouten - update: Bijwerken + email: E-mail + errors_with_fields: "Er waren problemen met de volgende velden" + first: Eerste forth: Vierde + forum: Forum + fourth: Vierde + go_back: "Ga terug" + last: Laatste + logout: "Log uit" + month: maand + months: maanden + next: Volgende + none: Geen + not_available_abbr: n/b + note: + one: "1 notitie" + other: "%{count} notities" + zero: "geen notities" + notes: Notities + numbered_step: "Stap %{number}" + ok: Ok + optional: optioneel + previous: Vorige + project: Project + projects: Projecten + recurring_todos: "Herhalende acties" + review: Evaluatie + search: Zoeken + second: Tweede + server_error: "Een fout heeft op de server plaatsgevonden" + show_all: "Toon alle" + sort: + alphabetically: Alfabetisch + alphabetically_confirm: "Weet u zeker dat u deze projecten alfabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen." + alphabetically_title: "Sorteer projecten alfabetisch" + by_task_count: "Op aantal acties" + by_task_count_title: "Sorteer op aantal acties" + by_task_count_title_confirm: "Weet u zeker dat u deze op aantal acties wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen." + sort: Sorteer + third: Derde + todo: actie + update: Bijwerken + website: Website + week: week weeks: weken wiki: Wiki - email: E-mail - ajaxError: Er is een fout opgetreden bij het ophalen van gegevens van de server - search: Zoeken - not_available_abbr: n/b - integrations: - opensearch_description: Zoek in Tracks + contexts: + add_context: "Context toevoegen" + all_completed_tasks_title: "TRACKS:: Alle voltooide acties in context '%{context_name}'" + completed_tasks_title: "TRACKS:: Voltooid acties in de context '%{context_name}'" + context_deleted: "De context '%{name}' is verwijderd" + context_hide: "Verberg van de start pagina?" + context_name: "Context naam" + delete_context: "Verwijder context" + delete_context_confirmation: "Weet u zeker dat u de context '%{name}' wilt verwijderen? Merk op dat dit ook alle (herhalende) acties in deze context zal verwijderen!" + delete_context_title: "Verwijder context" + edit_context: "Bewerk context" + hidden_contexts: "Verborgen contexten" + hide_form: "Verberg formulier" + hide_form_title: "Verberg formulier voor nieuwe context " + last_completed_in_context: "in deze context (laatste %{number})" + new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?" + new_context_pre: "Nieuwe context '" + no_actions: "Momenteel zijn er geen onafgeronde acties in deze context" + no_contexts_active: "Momenteel zijn er geen actieve contexten" + no_contexts_hidden: "Momenteel zijn er geen verborgen contexten" + save_status_message: "Context bewaard" + show_form: "Maak een nieuwe context" + show_form_title: "Voeg een context toe" + status_active: "Context is actief" + status_hidden: "Context is verborgen" + todos_append: "in deze context" + update_status_message: "Naam van de context was veranderd" + visible_contexts: "Zichtbare contexten" + data: + import_errors: "Er hebben zich fouten voorgedaan bij de import" + import_successful: "De import was succesvol" + date: + abbr_day_names: + - Zo + - Ma + - Di + - Wo + - Do + - Vr + - Za + abbr_month_names: + - ~ + - Jan + - Feb + - Maa + - Apr + - Mei + - Jun + - Jul + - Aug + - Sep + - Okt + - Nov + - Dec + day_names: + - Zondag + - Maandag + - Dinsdag + - Woensdag + - Donderdag + - Vrijdag + - Zaterdag + formats: + default: "%d-%m-%Y" + long: "%e %B %Y" + longer: "%A %d %B %Y" + month_day: "%B %d" + only_day: "%e" + short: "%e %b" + month_names: + - ~ + - Januari + - Februari + - Maart + - April + - Mei + - Juni + - Juli + - Augustus + - September + - Oktober + - November + - December + order: + - !ruby/symbol day + - !ruby/symbol month + - !ruby/symbol year + datetime: + distance_in_words: + about_x_hours: + one: "ongeveer 1 uur" + other: "ongeveer %{count} uren" + about_x_months: + one: "ongeveer 1 maand" + other: "ongeveer %{count} maanden" + about_x_years: + one: "ongeveer 1 jaar" + other: "ongeveer %{count} jaren" + almost_x_years: + one: "bijna 1 jaar" + other: "bijna %{count} jaren" + half_a_minute: "halve minuut" + less_than_x_minutes: + one: "minder dan een minuut" + other: "minder dan %{count} minuten" + zero: "minder dan 1 minuut" + less_than_x_seconds: + one: "minder dan 1 seconde" + other: "minder dan %{count} seconden" + zero: "minder dan 1 seconde" + over_x_years: + one: "over 1 jaar" + other: "over %{count} jaren" + x_days: + one: "1 dag" + other: "%{count} dagen" + x_minutes: + one: "1 minuut" + other: "%{count} minuten" + x_months: + one: "1 maand" + other: "%{count} maanden" + x_seconds: + one: "1 seconde" + other: "%{count} seconden" + prompts: + day: Dag + hour: Uur + minute: Minuut + month: Maand + second: Seconden + year: Jaar + errors: + format: "%{attribute} %{message} " + messages: + accepted: "moet geaccepteerd worden" + blank: "kan niet leeg zijn" + confirmation: "komt niet met bevestiging overeen" + empty: "kan niet leeg zijn" + equal_to: "moet gelijk zijn aan %{count}" + even: "moet even zijn" + exclusion: "is gereserveerd" + greater_than: "moet groter zijn dan %{count}" + greater_than_or_equal_to: "moet groter of gelijk zijn aan %{count}" + inclusion: "is geen onderdeel van de lijst" + invalid: "is niet geldig" + less_than: "moet minder zijn dan %{count}" + less_than_or_equal_to: "moet minder of gelijk zijn aan %{count}" + not_a_number: "is geen getal" + not_an_integer: "moet een geheel getal zijn" + odd: "moet oneven zijn" + too_long: "is te lang (maximum is %{count} karakters)" + too_short: "is te kort (minimum is %{count} karakters)" + wrong_length: "is de verkeerde lengte (zou %{count} karakters moeten zijn)" + user_unauthorized: "401 Unauthorized: Alleen administratieve gebruikers mogen deze functie gebruiken." + feedlist: + actions_completed_last_week: "Acties afgerond in de afgelopen 7 dagen" + actions_due_next_week: "Acties die binnen 7 dagen afgerond moeten" + actions_due_today: "Acties die vandaag of eerder af moeten" + active_projects_wo_next: "Actieve projecten zonder acties" + active_starred_actions: "Alle gesterde, actieve acties" + all_actions: "Alle acties" + all_contexts: "Alle contexten" + all_projects: "Alle projecten" + choose_context: "Kies de context waar je een feed van wilt" + choose_project: "Kies het project waar je een feed van wilt" + context_centric_actions: "Feeds voor onafgeronde acties in een specifieke context" + context_needed: "Er moet eerst ten minste één context zijn voor je een feed kan opvragen" + ical_feed: "iCal feed" + last_fixed_number: "Laatste %{number} acties" + legend: Legenda + notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld." + plain_text_feed: "Reguliere tekst feed" + project_centric: "Feeds voor onafgeronde acties in een specifiek project" + project_needed: "Er moet ten minste één project zijn voor een feed opgevraagd kan worden" + projects_and_actions: "Actieve projecten met hun acties" + rss_feed: "RSS Feed" + select_feed_for_context: "Kies de feed voor deze context" + select_feed_for_project: "Kies de feed voor dit project" + footer: + send_feedback: "Stuur reactie op %{version}" + helpers: + button: + create: "Maak %{model}" + submit: "Bewaar %{model}" + update: "%{model} bijwerken" + select: + prompt: "Maak een keuze" + submit: + create: "Maak %{model}" + submit: "Bewaar %{model}" + update: "Bijwerken %{model}" + integrations: applescript_next_action_prompt: "Omschrijving van de actie:" - gmail_description: Gadget om Tracks toe te voegen aan Gmail als een gadget applescript_success_after_id: gemaakt - applescript_success_before_id: Nieuwe actie met ID - activerecord: - attributes: - project: - name: Naam - default_tags: Standaard Tags - default_context_name: Standaard context - description: Beschrijving - note: - created_at: Gemaakt op - updated_at: Bijgewerkt op - todo: - show_from: Tonen vanaf - predecessors: Afhankelijkheden - notes: Notities - tags: Labels - project: Project - description: Beschrijving - context: Context - due: Deadline - preference: - show_hidden_projects_in_sidebar: Toon verborgen projecten in sidebar - show_hidden_contexts_in_sidebar: Toon verborgen contexten in sidebar - date_format: Datum formaat - sms_context: Standaard context voor email - verbose_action_descriptors: Context en project uitschrijven in actielijst - mobile_todos_per_page: Acties per pagina (mobiel) - staleness_starts: Begin van markeren openstaande actie - show_number_completed: Aantal te tonen afgeronde acties - title_date_format: Datum formaat in titel - refresh: Ververs interval (in minuten) - week_starts: Week start op - last_name: Achternaam - locale: Taal - due_style: Deadline stijl - time_zone: Tijdzone - sms_email: Van email - show_project_on_todo_done: Ga naar project pagina wanneer actie gereed is - show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar - first_name: Voornaam - review_period: Project evaluatie interval - user: - last_name: Achternaam - first_name: Voornaam - errors: - models: - project: - attributes: - name: - blank: project moet een naam hebben - too_long: project naam moet minder dan 256 karakters hebben - taken: bestaat al - messages: - record_invalid: "Validatie mislukt: %{errors}" - greater_than_or_equal_to: moet groter of gelijk zijn aan %{count} - confirmation: komt niet overeen met de configuratie - less_than_or_equal_to: moet kleiner of gelijk zijn aan %{count} - blank: mag niet leeg zijn - exclusion: is gereserveerd - invalid: mag niet een komma (',') karakter bevatten - odd: moet oneven zijn - even: moet even zijn - empty: mag niet leeg zijn - too_short: is te kort (minimum is %{count} karakters) - wrong_length: heeft de verkeerde lengte (moet %{count} karakters lang zijn) - less_than: moet kleiner zijn dan %{count} - greater_than: moet groter zijn dan %{count} - equal_to: moet gelijk zijn aan %{count} - accepted: moet geaccepteerd worden - too_long: is te lang (maximum is %{count} karakters) - taken: is al gepakt - inclusion: is niet opgenomen in de lijst - not_a_number: is niet een getal - full_messages: - format: "%{attribute} %{message}" - template: - body: Er waren problemen met de volgende velden - header: - one: 1 fout voorkomt het kunnen bewaren van deze %{model} - other: "%{count} fouten voorkomen dat dit %{model} bewaard kan worden" - data: - import_successful: De import was succesvol - import_errors: Er hebben zich fouten voorgedaan bij de import - models: - project: - feed_title: Tracks Projecten - feed_description: Een overzicht van alle projecten voor %{username} - todo: - error_date_must_be_future: moet een datum in de toekomst zijn - preference: - due_on: Deadline op %{date} - due_in: Deadline over %{days} dagen - due_styles: - - Deadline over ____ dagen - - Deadline op ____ - user: - error_context_not_associated: Context %{context} niet geassocieerd met gebruikers %{user}. - error_project_not_associated: Project %{project} niet geassocieerd met gebruikers %{user}. - stats: - totals_hidden_context_count: en %{count} zijn verborgen contexten. - actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld%{count} acties aangemaakt - actions_min_max_completion_days: De max-/minimum dagen tot voltooiing is %{min}/%{max}. - totals_actions_completed: "%{count} van deze zijn voltooid." - tag_cloud_title: Tag Cloud voor alle acties - actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt - actions_avg_completed: en voltooide een gemiddelde van %{count} acties per maand. - top5_visible_contexts_with_incomplete_actions: Top 5 zichtbare contexten met onvolledige acties - actions: Acties - time_of_day_legend: - number_of_actions: Aantal acties - time_of_day: Tijd van de dag - totals_incomplete_actions: U heeft %{count} onvolledige acties - totals_deferred_actions: waarvan %{count} uitgestelde acties in de tickler zijn - running_time_legend: - actions: Acties - percentage: Percentage - weeks: Looptijd van een actie (weken). Klik op een balk voor meer info - totals_action_count: u heeft een totaal van %{count} acties - tag_cloud_90days_title: Tag cloud met acties in afgelopen 90 dagen - actions_avg_completion_time: Van al uw afgeronde acties, de gemiddelde tijd dat dit in beslag nam is %{count} dagen. - tod30: Tijd van de dag (laatste 30 dagen) - tags: Tags - projects: Projecten - totals_completed_project_count: en %{count} zijn afgeronde projecten. - labels: - month_avg_completed: "%{months} gem afgerond per maand" - completed: Afgerond - month_avg_created: "%{months} gem gemaakt per maand" - avg_created: Gem gemaakt - avg_completed: Gem afgerond - created: Gemaakt - actions_selected_from_week: Gekozen acties van week - actions_day_of_week_title: Dag van de week (alle acties) - actions_lastyear_title: Acties in de afgelopen 12 maanden - open_per_week: Active (zichtbare en verborgen) volgende acties per week - action_selection_title: "TRACKS:: Actie selectie" - totals_project_count: U heeft %{count} projecten. - legend: - number_of_days: Aantal dagen geleden - actions: Acties - number_of_actions: Aantal acties - day_of_week: Dag van de week - running_time: Looptijd van een actie (weken) - percentage: Percentage - months_ago: Maanden geleden - current_running_time_of_incomplete_visible_actions: Huidige looptijd van onvolledige zichtbare acties - tod30_legend: - number_of_actions: Aantal acties - time_of_day: Tijd van de dag - totals_context_count: U heeft %{count} contexten. - open_per_week_legend: - actions: Acties - weeks: Weken geleden - actions_last_year_legend: - number_of_actions: Aantal acties - months_ago: Maanden geleden - top5_contexts: Top 5 contexten - top10_projects: Top 10 projecten - contexts: Contexten - totals: Totalen - click_to_return: Klik %{link} om terug te keren naar de statistieken pagina. - tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen. - totals_visible_context_count: Van deze zijn %{count} zichtbare contexten - top10_projects_30days: Top 10 project in de laatste 30 dagen - running_time_all: Huidige looptijd van alle onvolledige acties - actions_min_completion_time: De minimale tijd tot afronding is %{time}. - action_completion_time_title: Doorlooptijd (alle voltooide acties) - click_to_show_actions_from_week: Klik %{link} om de acties van week %{week} en verder te zien. - top10_longrunning: Top 10 langstlopende projecten - no_actions_selected: Er zijn geen acties geselecteerd. - totals_tag_count: U heeft %{count} tags geplaatst op acties. - actions_further: en verder - actions_dow_30days_legend: - number_of_actions: Aantal acties - day_of_week: Dag van de week - totals_first_action: Sinds uw eerste actie op %{date} - tag_cloud_description: Deze tag cloud bevat tags van alle acties (afgerond, niet voltooid, zichtbaar en / of verborgen) - spread_of_actions_for_all_context: Verdeling van acties voor alle contexten - click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen. - click_to_return_link: hier - more_stats_will_appear: Meer statistieken zullen hier verschijnen zodra u acties hebt toegevoegd. - actions_avg_completed_30days: en voltooide een gemiddelde van %{count} acties per dag. - index_title: TRACKS::Statistiek - actions_30days_title: Acties in de afgelopen 30 dagen - no_tags_available: geen tags beschikbaar - actions_dow_30days_title: Dag van de week (laatste 30 dagen) - actions_day_of_week_legend: - number_of_actions: Aantal acties - day_of_week: Dag van de week - within_one: Binnen 1 - spread_of_running_actions_for_visible_contexts: Verdeling van actieve acties voor zichtbare contexten - actions_last_year: Acties in de afgelopen jaren - totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties." - totals_unique_tags: Van deze tags zijn %{count} uniek. - totals_active_project_count: Van deze zijn %{count} actieve projecten - running_time_all_legend: - actions: Acties - running_time: Looptijd van een actie (weken). Klik op een balk voor meer info - percentage: Percentage - other_actions_label: (anderen) - totals_hidden_project_count: "%{count} zijn verborgen" - time_of_day: Tijd van de dag (alle acties) - todos: - mark_complete: Markeer gereed - recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd - show_from: Toon vanaf - error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omzetten \'%{description}\' - completed_actions: Voltooide acties - added_new_next_action: Nieuwe actie toegevoegd - completed_recurring: Afgesloten terugkerende todos - completed_rest_of_previous_month: Afgerond in de rest van de vorige maand - blocked_by: Geblokkeerd door %{predecessors} - star_action: Markeer deze actie met een ster - completed_recurrence_completed: Er is geen actie na de terugkerende actie die u new verwijderd heeft. De herhaling is voltooid - defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitsteldatum aan te passen. - unable_to_add_dependency: Niet in staat om de afhankelijkheid toe te voegen - done: Voltooid? - star_action_with_description: markeer de actie '%{description}' met een ster - tagged_with: gelabeld met ‘%{tag_name}’ - completed: Afgerond - no_deferred_actions_with: Geen uitgestelde acties met de tag '%{tag_name}' - no_hidden_actions: Momenteel zijn er geen verborgen acties gevonden - edit_action_with_description: Bewerk de actie '%{description}' - action_due_on: (deadline actie op %{date}) - list_incomplete_next_actions: Toon onvoltooide acties - archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken" - remove_dependency: Verwijder afhankelijkheid (zal niet de actie zelf verwijderen) - action_deleted_success: Actie succesvol verwijderd - tags: Tags (gescheiden door komma's) - delete_recurring_action_title: Verwijder de terugkerende actie - context_changed: Context veranderd in '%{name}' - new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo - mobile_todos_page_title: Alle acties - add_another_dependency: Nog een afhankelijkheid toevoegen - removed_predecessor: "'%{successor}' is verwijderd als afhankelijkheid van '%{predecessor}'." - recurring_actions_title: TRACKS::Terugkerende acties - next_action_needed: U dient ten minste een actie in te vullen - action_saved: Actie opgeslagen - scheduled_overdue: Gepland om %{days} dagen geleden te tonen - action_deleted_error: Verwijderen van de actie is mislukt - edit_action: Actie bewerken - added_new_context: Nieuwe context toegevoegd - next_actions_description: "Filter:" - list_incomplete_next_actions_with_limit: Toont de laatste %{count} onvoltooide acties - set_to_pending: "'%{task}' als wachtend ingesteld" - added_new_project: Nieuw project toegevoegd - next_actions_title_additions: - completed: acties voltooid - due_today: deadline vandaag - due_within_a_week: deadline binnen een week - older_completed_items: Oudere voltooide items - no_actions_due_this_week: Geen acties met deadline in rest van deze week - all_completed_here: hier - append_in_this_project: in dit project - edit_recurring_todo: Bewerk herhalende actie - error_deleting_item: Er is een fout opgetreden bij het verwijderen van het item '%{description}' - task_list_title: TRACKS::Toon acties - no_recurring_todos: Momenteel zijn er geen terugkerende acties - error_completing_todo: Er was een fout bij het voltooien / activeren van de terugkerende actie '%{description}' - recurring_pattern_removed: Het herhalingspatroon is verwijderd van %{count} - convert_to_project: Maak project - no_deferred_pending_actions: Momenteel zijn er geen uitgestelde of wachtende acties - delete_recurring_action_confirm: Weet u zeker dat u wilt de terugkerende actie '%{description}' wilt verwijderen? - completed_last_day: Voltooid in de laatste 24 uur - feed_title_in_context: in context '%{context}' - no_project: -- Geen project -- - show_in_days: Toon over %{days} dagen - error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}' - completed_more_than_x_days_ago: Voltooid meer dan %{count} dagen geleden - new_related_todo_created_short: een nieuwe actie gemaakt - all_completed: Alle afgeronde acties - edit: Bewerken - completed_actions_with: Afgeronde acties met de tag %{tag_name} - older_than_days: Ouder dan %{count} dagen - completed_tagged_page_title: "TRACKS:: Afgeronde acties met tag %{tag_name}" - pending: Wachtend - completed_tasks_title: TRACKS::Voltooide taken - deleted_success: De actie werd met succes verwijderd. - feed_title_in_project: In het project '%{project}' - clear_due_date: Maak deadline leeg - error_removing_dependency: Er is een fout opgetreden het verwijderen van de afhankelijke actie - hidden_actions: Verborgen acties - was_due_on_date: had deadline op %{date} - show_on_date: Toon op %{date} - recurrence_period: Herhaling periode - deferred_actions_with: Uitgestelde acties met de tag '%{tag_name}' - confirm_delete: Weet u zeker dat u de actie '%{description}' wilt verwijderen? - recurring_deleted_success: De recurrente actie is succesvol verwijderd. - no_completed_actions_with: Geen voltooide acties met de tag '%{tag_name}' - next_actions_title: Tracks - Acties - next_action_description: Actie beschrijving - deferred_tasks_title: TRACKS::Tickler - clear_show_from_date: Maak de datum Tonen Vanaf leeg - in_hidden_state: in verborgen toestand - see_all_completed: Je kan alle afgeronde acties %{link} zien - calendar_page_title: TRACKS::Agenda - unresolved_dependency: De waarde die u ingevoerd heeft in het afhankelijkheden veld is niet herleidbaar naar een bestaande actie. Deze waarde wordt niet bewaard met de rest van de actie. Doorgaan? - no_actions_found_title: Geen acties gevonden - show_today: Toon vandaag - next_actions_due_date: - overdue_by: Over deadline met %{days} dag - due_in_x_days: Deadline over %{days} dagen - due_today: Deadline vandaag - overdue_by_plural: Over deadline met %{days} dagen - due_tomorrow: Deadline morgen - completed_last_x_days: Voltooid in de laatste %{count} dagen - no_actions_with: Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}' - defer_x_days: - one: Een dag uitstellen - other: "%{count} dagen uitstellen" - added_new_next_action_singular: Nieuwe actie toegevoegd - no_completed_actions: Momenteel zijn er geen voltooide acties. - deferred_pending_actions: Uitgestelde/wachtende acties - has_x_pending: - one: Heeft een wachtende actie - other: Heeft %{count} wachtende acties - feeds: - completed: "Voltooid: %{date}" - due: "Deadline: %{date}" - recurring_todos: Terugkerende acties - error_deleting_recurring: Er is een fout opgetreden bij het verwijderen van het item \'%{description}\' - delete_action: Verwijder actie - delete: Verwijder - no_last_completed_actions: Geen afgeronde acties gevonden - drag_action_title: Sleep naar een andere actie om deze afhankelijk te maken van die actie - cannot_add_dependency_to_completed_todo: Kan deze actie niet als een afhankelijkheid van een voltooide actie toevoegen! - depends_on: Hangt af van - tickler_items_due: - one: Een tickler item wordt nu zichtbaar - vernieuw de pagina om het te zien. - other: "%{count} tickerl items zijn nu zichtbaar - vernieuw de pagina om ze te zien." - action_marked_complete: De actie '%{description}' werd gemarkeerd als %{completed} - completed_today: Vandaag afgerond - added_new_next_action_plural: Nieuwe acties toegevoegd - new_related_todo_not_created_short: een nieuwe actie is niet gemaakt - completed_rest_of_week: Afgerond in de rest van deze week - show_tomorrow: Toon morgen - error_starring: Kon niet de ster van deze actie niet omzetten \'%{description}\' - calendar: - get_in_ical_format: Ontvang deze agenda in iCal-formaat - due_next_week: Deadline volgende week - no_actions_due_next_week: Geen acties met deadline in volgende week - due_this_week: Deadline in rest van deze week - no_actions_due_today: Geen acties met deadline vandaag - due_today: Deadline vandaag - due_next_month_and_later: Deadline in %{month} en later - no_actions_due_after_this_month: Geen acties met deadline na deze maand - no_actions_due_this_month: Geen acties met deadline in de rest van deze maand - due_this_month: Deadline in rest van %{month} - no_completed_recurring: Momenteel zijn er geen voltooide terugkerende acties - recurrence: - ends_on_date: Eindigt op %{date} - every_work_day: Elke werkdag - ends_on_number_times: Eindigt na %{number} keer - recurrence_on_due_date: de datum dat deadline van de actie is - weekly_options: Instellingen voor de wekelijkse terugkerende acties - weekly: Wekelijks - monthly_options: Instellingen voor maandelijks terugkerende acties - daily_options: Instellingen voor dagelijks terugkerende acties - monthly: Maandelijks - starts_on: Begint op - daily: Dagelijks - show_option_always: altijd - pattern: - third: derde - month_names: - - - - januari - - februari - - maart - - april - - mei - - juni - - juli - - augustus - - september - - oktober - - november - - december - every_n: elke %{n} - second: tweede - every_xth_day_of_every_n_months: elke %{x} %{day} van elke %{n_months} - on_day_n: op dag %{n} - weekly: wekelijks - from: vanaf - last: laatste - every_day: elke dag - the_xth_day_of_month: de %{x} %{day} van %{month} - times: voor %{number} keer - first: eerste - show: Tonen - every_year_on: elk jaar op %{date} - on_work_days: op werkdagen - day_names: - - zondag - - maandag - - dinsdag - - woensdag - - donderdag - - vrijdag - - zaterdag - fourth: vierde - due: Deadline - every_month: elke maand - until: tot - yearly_every_x_day: Elke %{month} %{day} - recurrence_on_options: Stel herhaling in op - daily_every_number_day: Elke %{number} dag(en) - show_options: Toon de actie - weekly_every_number_week: Herhaalt elke %{number} weken op - ends_on: Eindigt op - show_days_before: "%{days} dagen voor de deadline van actie" - from_tickler: de datum dat de actie uit de tickler komt (geen deadline ingesteld) - no_end_date: Geen einddatum - day_x_on_every_x_month: Dag %{day} op elke %{month} maand - yearly_every_xth_day: De %{day} %{day_of_week} van %{month} - yearly_options: Instellingen voor jaarlijks terugkerende acties - yearly: Jaarlijks - monthly_every_xth_day: De %{day} %{day_of_week} van elke %{month} maand - action_deferred: De actie '%{description}' is uitgesteld - tagged_page_title: TRACKS::Tagged met '%{tag_name}' - added_dependency: "%{dependency} als afhankelijkheid toegevoegd." - completed_rest_of_month: Afgerond in de rest van deze maand - all_completed_tagged_page_title: "TRACKS:: Alle afgeronde acties met tag %{tag_name}" - no_deferred_actions: Momenteel zijn er geen uitgestelde acties. - recurrence_completed: Er is geen volgende actie na de terugkerende actie die u zojuist hebt voltooid. De herhaling is voltooid - action_marked_complete_error: De actie '%{description}' is niet gemarkeerd als %{completed} vanwege een fout op de server. - no_actions_found: Momenteel zijn er geen onafgeronde acties. - in_pending_state: in wachtende toestand - error_toggle_complete: Kon deze actie niet als afgerond markeren - due: Deadline - no_incomplete_actions: Er zijn geen onvoltooide acties - action_saved_to_tickler: Actie opgeslagen in tickler - recurring_action_saved: Terugkerende actie opgeslagen - depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's) - completed_in_archive: - one: Er is een voltooide actie in het archief. - other: Er zijn %{count} afgeronde acties in het archief. - to_tickler: naar tickler - next_actions_description_additions: - completed: in de afgelopen %{count} dagen - due_date: met een deadline %{due_date} of eerder - overdue: Achterstallig - add_new_recurring: Voeg een nieuwe terugkerende actie toe - notes: - delete_note_title: Verwijder de notitie '%{id}' - delete_confirmation: Weet u zeker dat u de notitie '%{id}' wilt verwijderen? + applescript_success_before_id: "Nieuwe actie met ID" + gmail_description: "Gadget om Tracks toe te voegen aan Gmail als een gadget" + opensearch_description: "Zoek in Tracks" + layouts: + mobile_navigation: + contexts: Contexten + feeds: Feeds + home: Start + logout: Afmelden + new_action: "Nieuwe actie" + projects: Projecten + starred: Ster + tickler: Tickler + navigation: + admin: Admin + api_docs: "REST API Docs" + calendar: Agenda + calendar_title: "Kalender met acties met deadline" + completed_tasks: Gereed + completed_tasks_title: Afgerond + contexts_title: Contexten + export: Export + export_title: "Import en export van gegevens" + feeds: Feeds + feeds_title: "Zie een lijst met beschikbare feeds" + help: "?" + home: Start + home_title: Start + integrations_: "Integreer Tracks" + manage_users: "Beheren gebruikers" + manage_users_title: "Toevoegen of verwijderen gebruikers" + notes_title: "Toon alle notities" + organize: Organiseer + preferences: Voorkeuren + preferences_title: "Toon mijn voorkeuren" + projects_title: Projecten + recurring_todos: "Terugkerende acties" + recurring_todos_title: "Beheren terugkerende acties" + review_title: "Evaluatie uitvoeren" + search: "Zoeken in alle items" + starred: Ster + starred_title: "Zie je ster acties" + stats: Statistieken + stats_title: "Zie je statistieken" + tickler: Tickler + tickler_title: Tickler + view: Bekijk + next_actions_rss_feed: "RSS-feed van de acties" + toggle_contexts: "Toggle ingeklapte contexten" + toggle_contexts_title: "Maak ingeklapte contexten (on)zichtbaar" + toggle_notes: "Toggle notities" + toggle_notes_title: "Toggle alle notities" + login: + account_login: "Account login" + cas_create_account: "Als u willen vragen ga hier om %{signup_link}" + cas_logged_in_greeting: "Hallo, %{username}! U bent geauthenticeerd." + cas_login: "CAS Inloggen" + cas_no_user_found: "Hallo,%{username}! Je hebt nog geen account op Tracks." + cas_signup_link: "Aanvragen account" + cas_username_not_found: "Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (%{username})" + log_in_again: "opnieuw in te loggen." + logged_out: "Je bent afgemeld bij Tracks." + login_cas: "Ga naar het CAS" + login_standard: "Ga terug naar de standaard login" + login_with_openid: "inloggen met een OpenID" + mobile_use_openid: "... if inloggen met een OpenID" + openid_identity_url_not_found: "Sorry, geen gebruiker met die identiteit URL bestaat (%{identity_url})" + option_separator: "of," + please_login: "Log in om Tracks te gebruiken" + session_time_out: "Sessie is verlopen. Gelieve %{link}" + session_will_expire: "sessie zal verlopen na %{hours} u(u)r(en) van inactiviteit." + session_will_not_expire: "sessie zal niet verlopen." + sign_in: "Meld aan" + successful: "Succesvol aangemeld. Welkom terug!" + successful_with_session_info: "Login succesvol:" + unsuccessful: "Login mislukt." + user_no_expiry: "Blijf ingelogd" + models: + preference: + due_in: "Deadline over %{days} dagen" + due_on: "Deadline op %{date}" + due_styles: + - "Deadline over ____ dagen" + - "Deadline op ____" + project: + feed_description: "Een overzicht van alle projecten voor %{username}" + feed_title: "Tracks Projecten" + todo: + error_date_must_be_future: "moet een datum in de toekomst zijn" + user: + error_context_not_associated: "Context %{context} niet geassocieerd met gebruikers %{user}." + error_project_not_associated: "Project %{project} niet geassocieerd met gebruikers %{user}." + notes: + delete_confirmation: "Weet u zeker dat u de notitie '%{id}' wilt verwijderen?" + delete_item_title: "Verwijder item" + delete_note_confirm: "Weet u zeker dat u de notitie '%{id}' wilt verwijderen?" + delete_note_title: "Verwijder de notitie '%{id}'" + deleted_note: "Verwijder notitie '%{id}'" + edit_item_title: "Item bewerken" in_project: "In:" - delete_item_title: Verwijder item - deleted_note: Verwijder notitie '%{id}' - note_link_title: Toon notitie %{id} - show_note_title: Toon notitie - edit_item_title: Item bewerken - note_location_link: "In:" no_notes_available: "Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina's." - note_header: Notitie %{id} - delete_note_confirm: Weet u zeker dat u de notitie '%{id}' wilt verwijderen? - projects: - default_context_set: Stel project standaard context in op %{default_context} - no_actions_in_project: Momenteel zijn er geen onafgeronde acties in dit project - deferred_actions: Uitgestelde acties voor dit project - was_marked_hidden: is gemarkeerd als verborgen - edit_project_title: Bewerk project - default_tags_removed_notice: De standaard tags zijn verwijderd - page_title: "TRACKS:: Project: %{project}" - all_completed_tasks_title: TRACKS::Toon alle afgeronde acties in het project '{project_name}' - hide_form: Verberg formulier - list_completed_projects: TRACKS::Toon afgeronde projecten - no_notes_attached: Momenteel zijn er geen notities toegevoegd aan dit project - to_new_project_page: Ga naar de nieuwe projectpagina - show_form_title: Maak een nieuw project - deferred_actions_empty: Er zijn geen uitgestelde acties voor dit project - project_state: Project is %{state}. - this_project: Dit project - no_last_completed_projects: Geen afgeronde projecten gevonden - no_last_completed_recurring_todos: Geen afgeronde herhalende acties gevonden - notes: Notities - todos_append: in dit project - list_reviews: TRACKS::Evaluatie - notes_empty: Er zijn geen notities voor dit project - no_projects: Momenteel zijn er geen projecten - hide_form_title: Verberg nieuw project formulier - delete_project: Project verwijderen - completed_actions_empty: Er zijn nog geen afgeronde acties voor dit project - with_no_default_context: zonder standaard context - delete_project_confirmation: Weet u zeker dat u wilt het project '%{name} wilt verwijderen? - with_default_context: met een standaard context '%{context_name}' - show_form: Toevoegen van een project - actions_in_project_title: Acties in dit project - completed_projects: Voltooide projecten - is_active: is actief - add_note: Een notitie toevoegen - set_default_tags_notice: Stel project standaard tags in op %{default_tags} - add_project: Voeg project toe - settings: Instellingen - project_saved_status: Project opgeslagen + note_header: "Notitie %{id}" + note_link_title: "Toon notitie %{id}" + note_location_link: "In:" + show_note_title: "Toon notitie" + number: + currency: + format: + delimiter: "." + format: "%u %n" + precision: 2 + separator: "," + unit: € + format: + delimiter: "." + precision: 3 + separator: "," + human: + decimal_units: + format: "%n %u" + units: + billion: Biljoen + million: Miljoen + quadrillion: Quadriljoen + thousand: Duizend + trillion: Triljoen + format: + delimiter: "." + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: Byte + other: Bytes + gb: GB + kb: KB + mb: MB + tb: TB + preferences: + authentication_header: "Uw authenticatie" + change_authentication_type: "Verander uw authenticatietype" + change_identity_url: "Verander uw Identity URL" + change_password: "Wijzig uw wachtwoord" + current_authentication_type: "Uw authenticatietype is %{auth_type}" + edit_preferences: "Voorkeuren bewerken" + generate_new_token: "Genereer een nieuwe token" + generate_new_token_confirm: "Weet u dit zeker? Het genereren van een nieuw token zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token laten mislukken." + is_false: Nee + is_true: Ja + open_id_url: "Uw OpenID URL is" + page_title: "TRACKS:: Voorkeuren" + page_title_edit: "TRACKS:: Voorkeuren bewerken" + password_changed: "Je wachtwoord is gewijzigd, meld je opnieuw aan." + show_number_completed: "Toon %{number} voltooide items" + sms_context_none: Geen + staleness_starts_after: "Markeren openstaande acties begint na %{days} dagen" + tabs: + authentication: Authenticatie + date_and_time: "Datum en tijd" + profile: Profiel + tracks_behavior: "Tracks gedrag" + title: "Uw voorkeuren" + token_description: "Token (voor feeds en API gebruik)" + token_header: "Uw token" + updated: "Voorkeuren bijgewerkt" + projects: + actions_in_project_title: "Acties in dit project" + active_projects: "Actieve projecten" + add_note: "Een notitie toevoegen" + add_note_submit: "Notitie toevoegen" + add_project: "Voeg project toe" + all_completed_tasks_title: "TRACKS::Overzicht van all afgeronde acties in project '%{project_name}'" + completed_actions: "Afgeronde acties voor dit project" + completed_actions_empty: "Er zijn nog geen afgeronde acties voor dit project" + completed_projects: "Voltooide projecten" + completed_tasks_title: "TRACKS::Toon afgeronde acties in het project '%{project_name}'" + default_context: "De standaard context voor dit project is %{context}" + default_context_removed: "Standaard context verwijderd" + default_context_set: "Stel project standaard context in op %{default_context}" + default_tags_removed_notice: "De standaard tags zijn verwijderd" + deferred_actions: "Uitgestelde acties voor dit project" + deferred_actions_empty: "Er zijn geen uitgestelde acties voor dit project" + delete_project: "Project verwijderen" + delete_project_confirmation: "Weet u zeker dat u wilt het project '%{name} wilt verwijderen?" + delete_project_title: "Verwijder het project" + edit_project_settings: "Bewerk project instellingen" + edit_project_title: "Bewerk project" + hidden_projects: "Verborgen projecten" + hide_form: "Verberg formulier" + hide_form_title: "Verberg nieuw project formulier" + is_active: "is actief" + list_completed_projects: "TRACKS::Toon afgeronde projecten" list_projects: "TRACKS:: Overzicht van projecten" - with_default_tags: en met '%{tags}' als de standaard tags - completed_tasks_title: TRACKS::Toon afgeronde acties in het project '%{project_name}' - hidden_projects: Verborgen projecten - delete_project_title: Verwijder het project - default_context_removed: Standaard context verwijderd - add_note_submit: Notitie toevoegen - completed_actions: Afgeronde acties voor dit project - was_marked_complete: is gemarkeerd als voltooid - no_default_context: Dit project heeft geen standaard context - with_no_default_tags: en zonder standaard tags - default_context: De standaard context voor dit project is %{context} - edit_project_settings: Bewerk project instellingen - status_project_name_changed: Naam van het project werd gewijzigd - state: Dit project is %{state} - active_projects: Actieve projecten - states: - hidden_plural: Verborgen - stalled: Vastgelopen - review_plural: Gedateerde - completed: Afgerond - current: Bijgewerkt - review: Gedateerde - completed_plural: Afgeronde + list_reviews: "TRACKS::Evaluatie" + no_actions_in_project: "Momenteel zijn er geen onafgeronde acties in dit project" + no_default_context: "Dit project heeft geen standaard context" + no_last_completed_projects: "Geen afgeronde projecten gevonden" + no_last_completed_recurring_todos: "Geen afgeronde herhalende acties gevonden" + no_notes_attached: "Momenteel zijn er geen notities toegevoegd aan dit project" + no_projects: "Momenteel zijn er geen projecten" + notes: Notities + notes_empty: "Er zijn geen notities voor dit project" + page_title: "TRACKS:: Project: %{project}" + project_saved_status: "Project opgeslagen" + project_state: "Project is %{state}." + set_default_tags_notice: "Stel project standaard tags in op %{default_tags}" + settings: Instellingen + show_form: "Toevoegen van een project" + show_form_title: "Maak een nieuw project" + state: "Dit project is %{state}" + status_project_name_changed: "Naam van het project werd gewijzigd" + this_project: "Dit project" + to_new_project_page: "Ga naar de nieuwe projectpagina" + todos_append: "in dit project" + was_marked_complete: "is gemarkeerd als voltooid" + was_marked_hidden: "is gemarkeerd als verborgen" + with_default_context: "met een standaard context '%{context_name}'" + with_default_tags: "en met '%{tags}' als de standaard tags" + with_no_default_context: "zonder standaard context" + with_no_default_tags: "en zonder standaard tags" + search: + contexts_matching_query: "Contexten passend bij zoekopdracht" + no_results: "Uw zoekopdracht heeft geen resultaten opgeleverd." + notes_matching_query: "Notities passend bij zoekopdracht" + projects_matching_query: "Projecten passend bij zoekopdracht" + tags_matching_query: "Tags passend bij zoekopdracht" + todos_matching_query: "Todos passend bij zoekopdracht" + shared: + add_action: "Actie toevoegen" + add_actions: "Toevoegen acties" + add_context: "Toevoegen context" + context_for_all_actions: "Context voor alle acties" + hide_action_form_title: "Verberg nieuwe actie formulier" + hide_form: "Verberg formulier" + make_actions_dependent: "Maak acties afhankelijk van elkaar" + multiple_next_actions: "Meerdere acties (een op elke regel)" + project_for_all_actions: "Project voor alle acties" + separate_tags_with_commas: "gescheiden door komma's" + tags_for_all_actions: "Tags voor alle acties (scheiden met een komma)" + toggle_multi: "Voeg meerdere acties toe" + toggle_multi_title: "Toggle single / multi actie formulier" + toggle_single: "Voeg een actie toe" + toggle_single_title: "Voeg een nieuwe actie toe" + sidebar: + list_empty: Geen + list_name_active_contexts: "Actieve contexten" + list_name_active_projects: "Actieve projecten" + list_name_completed_projects: "Voltooide projecten" + list_name_hidden_contexts: "Verborgen contexten" + list_name_hidden_projects: "Verborgen projecten" + states: + active: Actief + active_plural: Actieve blocked: Geblokkeerd blocked_plural: Geblokkeerde - stalled_plural: Vastgelopen - visible_plural: Zichtbare - active_plural: Actieve - visible: Zichtbaar - hidden: Verborgen - active: Actief + completed: Afgerond + completed_plural: Afgeronde + current: Bijgewerkt current_plural: Bijgewerkte - errors: - user_unauthorized: "401 Unauthorized: Alleen administratieve gebruikers mogen deze functie gebruiken." - preferences: - open_id_url: Uw OpenID URL is - change_identity_url: Verander uw Identity URL - staleness_starts_after: Markeren openstaande acties begint na %{days} dagen - page_title: "TRACKS:: Voorkeuren" - change_password: Wijzig uw wachtwoord - token_description: Token (voor feeds en API gebruik) - title: Uw voorkeuren - is_false: Nee - show_number_completed: Toon %{number} voltooide items - password_changed: Je wachtwoord is gewijzigd, meld je opnieuw aan. - edit_preferences: Voorkeuren bewerken - page_title_edit: "TRACKS:: Voorkeuren bewerken" - is_true: Ja - sms_context_none: Geen - generate_new_token: Genereer een nieuwe token - token_header: Uw token - authentication_header: Uw authenticatie - updated: Voorkeuren bijgewerkt - current_authentication_type: Uw authenticatietype is %{auth_type} - change_authentication_type: Verander uw authenticatietype - generate_new_token_confirm: Weet u dit zeker? Het genereren van een nieuw token zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token laten mislukken. - tabs: - authentication: Authenticatie - tracks_behavior: Tracks gedrag - profile: Profiel - date_and_time: Datum en tijd - time: - am: ochtend - formats: - stats: "%a %d-%m" - default: "%A, %d %B %Y %H:%M:%S %z" - time: "%H:%M" - short: "%d %B %H:%M" - month_day: "%d %B" - long: "%A, %d. %B %Y, %H:%M" - pm: middag - date: - month_names: - - - - Januari - - Februari - - Maart - - April - - Mei - - Juni - - Juli - - Augustus - - September - - Oktober - - November - - December - abbr_day_names: - - Zo - - Ma - - Di - - Wo - - Do - - Vr - - Za - order: - - :day - - :month - - :year - formats: - only_day: "%e" - longer: "%A %d %B %Y" - default: "%d-%m-%Y" - short: "%e %b" - month_day: "%B %d" - long: "%e %B %Y" - day_names: - - Zondag - - Maandag - - Dinsdag - - Woensdag - - Donderdag - - Vrijdag - - Zaterdag - abbr_month_names: - - - - Jan - - Feb - - Maa - - Apr - - Mei - - Jun - - Jul - - Aug - - Sep - - Okt - - Nov - - Dec - support: - array: - words_connector: "," + hidden: Verborgen + hidden_plural: Verborgen + review: Gedateerde + review_plural: Gedateerde + stalled: Vastgelopen + stalled_plural: Vastgelopen + visible: Zichtbaar + visible_plural: Zichtbare + stats: + action_completion_time_title: "Doorlooptijd (alle voltooide acties)" + action_selection_title: "TRACKS:: Actie selectie" + actions: Acties + actions_30days_title: "Acties in de afgelopen 30 dagen" + actions_actions_avg_created_30days: "In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt" + actions_avg_completed: "en voltooide een gemiddelde van %{count} acties per maand." + actions_avg_completed_30days: "en voltooide een gemiddelde van %{count} acties per dag." + actions_avg_completion_time: "Van al uw afgeronde acties, de gemiddelde tijd dat dit in beslag nam is %{count} dagen." + actions_avg_created: "In de afgelopen 12 maanden heeft u gemiddeld%{count} acties aangemaakt" + actions_day_of_week_legend: + day_of_week: "Dag van de week" + number_of_actions: "Aantal acties" + actions_day_of_week_title: "Dag van de week (alle acties)" + actions_dow_30days_legend: + day_of_week: "Dag van de week" + number_of_actions: "Aantal acties" + actions_dow_30days_title: "Dag van de week (laatste 30 dagen)" + actions_further: "en verder" + actions_last_year: "Acties in de afgelopen jaren" + actions_last_year_legend: + months_ago: "Maanden geleden" + number_of_actions: "Aantal acties" + actions_lastyear_title: "Acties in de afgelopen 12 maanden" + actions_min_completion_time: "De minimale tijd tot afronding is %{time}." + actions_min_max_completion_days: "De max-/minimum dagen tot voltooiing is %{min}/%{max}." + actions_selected_from_week: "Gekozen acties van week" + click_to_return: "Klik %{link} om terug te keren naar de statistieken pagina." + click_to_return_link: hier + click_to_show_actions_from_week: "Klik %{link} om de acties van week %{week} en verder te zien." + click_to_update_actions: "Klik op een balk in de grafiek op de acties hieronder aan te passen." + contexts: Contexten + current_running_time_of_incomplete_visible_actions: "Huidige looptijd van onvolledige zichtbare acties" + index_title: "TRACKS::Statistiek" + labels: + avg_completed: "Gem afgerond" + avg_created: "Gem gemaakt" + completed: Afgerond + created: Gemaakt + month_avg_completed: "%{months} gem afgerond per maand" + month_avg_created: "%{months} gem gemaakt per maand" + legend: + actions: Acties + day_of_week: "Dag van de week" + months_ago: "Maanden geleden" + number_of_actions: "Aantal acties" + number_of_days: "Aantal dagen geleden" + percentage: Percentage + running_time: "Looptijd van een actie (weken)" + more_stats_will_appear: "Meer statistieken zullen hier verschijnen zodra u acties hebt toegevoegd." + no_actions_selected: "Er zijn geen acties geselecteerd." + no_tags_available: "geen tags beschikbaar" + open_per_week: "Active (zichtbare en verborgen) volgende acties per week" + open_per_week_legend: + actions: Acties + weeks: "Weken geleden" + other_actions_label: (anderen) + projects: Projecten + running_time_all: "Huidige looptijd van alle onvolledige acties" + running_time_all_legend: + actions: Acties + percentage: Percentage + running_time: "Looptijd van een actie (weken). Klik op een balk voor meer info" + running_time_legend: + actions: Acties + percentage: Percentage + weeks: "Looptijd van een actie (weken). Klik op een balk voor meer info" + spread_of_actions_for_all_context: "Verdeling van acties voor alle contexten" + spread_of_running_actions_for_visible_contexts: "Verdeling van actieve acties voor zichtbare contexten" + tag_cloud_90days_description: "Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen." + tag_cloud_90days_title: "Tag cloud met acties in afgelopen 90 dagen" + tag_cloud_description: "Deze tag cloud bevat tags van alle acties (afgerond, niet voltooid, zichtbaar en / of verborgen)" + tag_cloud_title: "Tag Cloud voor alle acties" + tags: Tags + time_of_day: "Tijd van de dag (alle acties)" + time_of_day_legend: + number_of_actions: "Aantal acties" + time_of_day: "Tijd van de dag" + tod30: "Tijd van de dag (laatste 30 dagen)" + tod30_legend: + number_of_actions: "Aantal acties" + time_of_day: "Tijd van de dag" + top10_longrunning: "Top 10 langstlopende projecten" + top10_projects: "Top 10 projecten" + top10_projects_30days: "Top 10 project in de laatste 30 dagen" + top5_contexts: "Top 5 contexten" + top5_visible_contexts_with_incomplete_actions: "Top 5 zichtbare contexten met onvolledige acties" + totals: Totalen + totals_action_count: "u heeft een totaal van %{count} acties" + totals_actions_completed: "%{count} van deze zijn voltooid." + totals_active_project_count: "Van deze zijn %{count} actieve projecten" + totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties." + totals_completed_project_count: "en %{count} zijn afgeronde projecten." + totals_context_count: "U heeft %{count} contexten." + totals_deferred_actions: "waarvan %{count} uitgestelde acties in de tickler zijn" + totals_first_action: "Sinds uw eerste actie op %{date}" + totals_hidden_context_count: "en %{count} zijn verborgen contexten." + totals_hidden_project_count: "%{count} zijn verborgen" + totals_incomplete_actions: "U heeft %{count} onvolledige acties" + totals_project_count: "U heeft %{count} projecten." + totals_tag_count: "U heeft %{count} tags geplaatst op acties." + totals_unique_tags: "Van deze tags zijn %{count} uniek." + totals_visible_context_count: "Van deze zijn %{count} zichtbare contexten" + within_one: "Binnen 1" + support: + array: last_word_connector: ", en" two_words_connector: en - select: + words_connector: "," + select: prompt: Selecteer - will_paginate: - previous_label: "«Vorige" - page_entries_info: - multi_page: Toon %{model} %{from} - %{to} van %{count} in totaal - single_page_html: - one: Toon 1 %{model} - other: Toon alle %{count} %{model} - zero: Geen %{model} gevonden - single_page: - one: Toon 1 %{model} - other: Toon alle %{count} %{model} - zero: Geen %{model} gevonden - multi_page_html: Toon %{model} %{from} - %{to} van %{count} in totaal - page_gap: "…" - next_label: "Volgende »" - dates: - month_names: - - Januari - - Februari - - Maart - - April - - Mei - - Juni - - Juli - - Augustus - - September - - Oktober - - November - - December - day_names: - - Zondag - - Maandag - - Dinsdag - - Woensdag - - Donderdag - - Vrijdag - - Zaterdag - footer: - send_feedback: Stuur reactie op %{version} - shared: - multiple_next_actions: Meerdere acties (een op elke regel) - make_actions_dependent: Maak acties afhankelijk van elkaar - toggle_single: Voeg een actie toe - hide_form: Verberg formulier - add_actions: Toevoegen acties - add_action: Actie toevoegen - tags_for_all_actions: Tags voor alle acties (scheiden met een komma) - toggle_single_title: Voeg een nieuwe actie toe - project_for_all_actions: Project voor alle acties - context_for_all_actions: Context voor alle acties - toggle_multi: Voeg meerdere acties toe - separate_tags_with_commas: gescheiden door komma's - add_context: Toevoegen context - toggle_multi_title: Toggle single / multi actie formulier - hide_action_form_title: Verberg nieuwe actie formulier - feedlist: - choose_context: Kies de context waar je een feed van wilt - actions_due_today: Acties die vandaag of eerder af moeten - ical_feed: iCal feed - legend: Legenda - all_contexts: Alle contexten - rss_feed: RSS Feed - choose_project: Kies het project waar je een feed van wilt - all_projects: Alle projecten - project_needed: "Er moet ten minste één project zijn voor een feed opgevraagd kan worden" - select_feed_for_project: Kies de feed voor dit project - active_projects_wo_next: Actieve projecten zonder acties - active_starred_actions: Alle gesterde, actieve acties - context_needed: "Er moet eerst ten minste één context zijn voor je een feed kan opvragen" - select_feed_for_context: Kies de feed voor deze context - projects_and_actions: Actieve projecten met hun acties - notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld." - actions_due_next_week: Acties die binnen 7 dagen afgerond moeten - actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen - context_centric_actions: Feeds voor onafgeronde acties in een specifieke context - plain_text_feed: Reguliere tekst feed - last_fixed_number: Laatste %{number} acties - all_actions: Alle acties - project_centric: Feeds voor onafgeronde acties in een specifiek project - sidebar: - list_name_active_contexts: Actieve contexten - list_name_active_projects: Actieve projecten - list_empty: Geen - list_name_completed_projects: Voltooide projecten - list_name_hidden_projects: Verborgen projecten - list_name_hidden_contexts: Verborgen contexten - users: - openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen. + time: + am: ochtend + formats: + default: "%A, %d %B %Y %H:%M:%S %z" + long: "%A, %d. %B %Y, %H:%M" + month_day: "%d %B" + short: "%d %B %H:%M" + stats: "%a %d-%m" + time: "%H:%M" + pm: middag + todos: + action_deferred: "De actie '%{description}' is uitgesteld" + action_deleted_error: "Verwijderen van de actie is mislukt" + action_deleted_success: "Actie succesvol verwijderd" + action_due_on: "(deadline actie op %{date})" + action_marked_complete: "De actie '%{description}' werd gemarkeerd als %{completed}" + action_marked_complete_error: "De actie '%{description}' is niet gemarkeerd als %{completed} vanwege een fout op de server." + action_saved: "Actie opgeslagen" + action_saved_to_tickler: "Actie opgeslagen in tickler" + add_another_dependency: "Nog een afhankelijkheid toevoegen" + add_new_recurring: "Voeg een nieuwe terugkerende actie toe" + added_dependency: "%{dependency} als afhankelijkheid toegevoegd." + added_new_context: "Nieuwe context toegevoegd" + added_new_next_action: "Nieuwe actie toegevoegd" + added_new_next_action_plural: "Nieuwe acties toegevoegd" + added_new_next_action_singular: "Nieuwe actie toegevoegd" + added_new_project: "Nieuw project toegevoegd" + all_completed: "Alle afgeronde acties" + all_completed_here: hier + all_completed_tagged_page_title: "TRACKS:: Alle afgeronde acties met tag %{tag_name}" + append_in_this_project: "in dit project" + archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken" + blocked_by: "Geblokkeerd door %{predecessors}" + calendar: + due_next_month_and_later: "Deadline in %{month} en later" + due_next_week: "Deadline volgende week" + due_this_month: "Deadline in rest van %{month}" + due_this_week: "Deadline in rest van deze week" + due_today: "Deadline vandaag" + get_in_ical_format: "Ontvang deze agenda in iCal-formaat" + no_actions_due_after_this_month: "Geen acties met deadline na deze maand" + no_actions_due_next_week: "Geen acties met deadline in volgende week" + no_actions_due_this_month: "Geen acties met deadline in de rest van deze maand" + no_actions_due_today: "Geen acties met deadline vandaag" + calendar_page_title: "TRACKS::Agenda" + cannot_add_dependency_to_completed_todo: "Kan deze actie niet als een afhankelijkheid van een voltooide actie toevoegen!" + clear_due_date: "Maak deadline leeg" + clear_show_from_date: "Maak de datum Tonen Vanaf leeg" + completed: Afgerond + completed_actions: "Voltooide acties" + completed_actions_with: "Afgeronde acties met de tag %{tag_name}" + completed_in_archive: + one: "Er is een voltooide actie in het archief." + other: "Er zijn %{count} afgeronde acties in het archief." + completed_last_day: "Voltooid in de laatste 24 uur" + completed_last_x_days: "Voltooid in de laatste %{count} dagen" + completed_recurrence_completed: "Er is geen actie na de terugkerende actie die u new verwijderd heeft. De herhaling is voltooid" + completed_recurring: "Afgesloten terugkerende todos" + completed_rest_of_month: "Afgerond in de rest van deze maand" + completed_rest_of_previous_month: "Afgerond in de rest van de vorige maand" + completed_rest_of_week: "Afgerond in de rest van deze week" + completed_tagged_page_title: "TRACKS:: Afgeronde acties met tag %{tag_name}" + completed_tasks_title: "TRACKS::Voltooide taken" + completed_today: "Vandaag afgerond" + confirm_delete: "Weet u zeker dat u de actie '%{description}' wilt verwijderen?" + context_changed: "Context veranderd in '%{name}'" + convert_to_project: "Maak project" + defer_date_after_due_date: "Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitsteldatum aan te passen." + defer_x_days: + one: "Een dag uitstellen" + other: "%{count} dagen uitstellen" + deferred_actions_with: "Uitgestelde acties met de tag '%{tag_name}'" + deferred_pending_actions: "Uitgestelde/wachtende acties" + deferred_tasks_title: "TRACKS::Tickler" + delete: Verwijder + delete_action: "Verwijder actie" + delete_recurring_action_confirm: "Weet u zeker dat u wilt de terugkerende actie '%{description}' wilt verwijderen?" + delete_recurring_action_title: "Verwijder de terugkerende actie" + deleted_success: "De actie werd met succes verwijderd." + depends_on: "Hangt af van" + depends_on_separate_with_commas: "Afhankelijk van (gescheiden door komma's)" + done: Voltooid? + drag_action_title: "Sleep naar een andere actie om deze afhankelijk te maken van die actie" + due: Deadline + edit: Bewerken + edit_action: "Actie bewerken" + edit_action_with_description: "Bewerk de actie '%{description}'" + edit_recurring_todo: "Bewerk herhalende actie" + error_completing_todo: "Er was een fout bij het voltooien / activeren van de terugkerende actie '%{description}'" + error_deleting_item: "Er is een fout opgetreden bij het verwijderen van het item '%{description}'" + error_deleting_recurring: "Er is een fout opgetreden bij het verwijderen van het item \\'%{description}\\'" + error_removing_dependency: "Er is een fout opgetreden het verwijderen van de afhankelijke actie" + error_saving_recurring: "Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}'" + error_starring: "Kon niet de ster van deze actie niet omzetten \\'%{description}\\'" + error_starring_recurring: "Kon niet de ster van deze terugkerende actie niet omzetten \\'%{description}\\'" + error_toggle_complete: "Kon deze actie niet als afgerond markeren" + feed_title_in_context: "in context '%{context}'" + feed_title_in_project: "In het project '%{project}'" + feeds: + completed: "Voltooid: %{date}" + due: "Deadline: %{date}" + has_x_pending: + one: "Heeft een wachtende actie" + other: "Heeft %{count} wachtende acties" + hidden_actions: "Verborgen acties" + in_hidden_state: "in verborgen toestand" + in_pending_state: "in wachtende toestand" + list_incomplete_next_actions: "Toon onvoltooide acties" + list_incomplete_next_actions_with_limit: "Toont de laatste %{count} onvoltooide acties" + mark_complete: "Markeer gereed" + mobile_todos_page_title: "Alle acties" + new_related_todo_created: "Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo" + new_related_todo_created_short: "een nieuwe actie gemaakt" + new_related_todo_not_created_short: "een nieuwe actie is niet gemaakt" + next_action_description: "Actie beschrijving" + next_action_needed: "U dient ten minste een actie in te vullen" + next_actions_description: "Filter:" + next_actions_description_additions: + completed: "in de afgelopen %{count} dagen" + due_date: "met een deadline %{due_date} of eerder" + next_actions_due_date: + due_in_x_days: "Deadline over %{days} dagen" + due_today: "Deadline vandaag" + due_tomorrow: "Deadline morgen" + overdue_by: "Over deadline met %{days} dag" + overdue_by_plural: "Over deadline met %{days} dagen" + next_actions_title: "Tracks - Acties" + next_actions_title_additions: + completed: "acties voltooid" + due_today: "deadline vandaag" + due_within_a_week: "deadline binnen een week" + no_actions_due_this_week: "Geen acties met deadline in rest van deze week" + no_actions_found: "Momenteel zijn er geen onafgeronde acties." + no_actions_found_title: "Geen acties gevonden" + no_actions_with: "Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}'" + no_completed_actions: "Momenteel zijn er geen voltooide acties." + no_completed_actions_with: "Geen voltooide acties met de tag '%{tag_name}'" + no_completed_recurring: "Momenteel zijn er geen voltooide terugkerende acties" + no_deferred_actions: "Momenteel zijn er geen uitgestelde acties." + no_deferred_actions_with: "Geen uitgestelde acties met de tag '%{tag_name}'" + no_deferred_pending_actions: "Momenteel zijn er geen uitgestelde of wachtende acties" + no_hidden_actions: "Momenteel zijn er geen verborgen acties gevonden" + no_incomplete_actions: "Er zijn geen onvoltooide acties" + no_last_completed_actions: "Geen afgeronde acties gevonden" + no_project: "-- Geen project --" + no_recurring_todos: "Momenteel zijn er geen terugkerende acties" + older_completed_items: "Oudere voltooide items" + overdue: Achterstallig + pending: Wachtend + recurrence: + daily: Dagelijks + daily_every_number_day: "Elke %{number} dag(en)" + daily_options: "Instellingen voor dagelijks terugkerende acties" + day_x_on_every_x_month: "Dag %{day} op elke %{month} maand" + ends_on: "Eindigt op" + ends_on_date: "Eindigt op %{date}" + ends_on_number_times: "Eindigt na %{number} keer" + every_work_day: "Elke werkdag" + from_tickler: "de datum dat de actie uit de tickler komt (geen deadline ingesteld)" + monthly: Maandelijks + monthly_every_xth_day: "De %{day} %{day_of_week} van elke %{month} maand" + monthly_options: "Instellingen voor maandelijks terugkerende acties" + no_end_date: "Geen einddatum" + pattern: + day_names: + - zondag + - maandag + - dinsdag + - woensdag + - donderdag + - vrijdag + - zaterdag + due: Deadline + every_day: "elke dag" + every_month: "elke maand" + every_n: "elke %{n}" + every_xth_day_of_every_n_months: "elke %{x} %{day} van elke %{n_months}" + every_year_on: "elk jaar op %{date}" + first: eerste + fourth: vierde + from: vanaf + last: laatste + month_names: + - ~ + - januari + - februari + - maart + - april + - mei + - juni + - juli + - augustus + - september + - oktober + - november + - december + on_day_n: "op dag %{n}" + on_work_days: "op werkdagen" + second: tweede + show: Tonen + the_xth_day_of_month: "de %{x} %{day} van %{month}" + third: derde + times: "voor %{number} keer" + until: tot + weekly: wekelijks + recurrence_on_due_date: "de datum dat deadline van de actie is" + recurrence_on_options: "Stel herhaling in op" + show_days_before: "%{days} dagen voor de deadline van actie" + show_option_always: altijd + show_options: "Toon de actie" + starts_on: "Begint op" + weekly: Wekelijks + weekly_every_number_week: "Herhaalt elke %{number} weken op" + weekly_options: "Instellingen voor de wekelijkse terugkerende acties" + yearly: Jaarlijks + yearly_every_x_day: "Elke %{month} %{day}" + yearly_every_xth_day: "De %{day} %{day_of_week} van %{month}" + yearly_options: "Instellingen voor jaarlijks terugkerende acties" + recurrence_completed: "Er is geen volgende actie na de terugkerende actie die u zojuist hebt voltooid. De herhaling is voltooid" + recurrence_period: "Herhaling periode" + recurring_action_deleted: "Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd" + recurring_action_saved: "Terugkerende actie opgeslagen" + recurring_actions_title: "TRACKS::Terugkerende acties" + recurring_deleted_success: "De recurrente actie is succesvol verwijderd." + recurring_pattern_removed: "Het herhalingspatroon is verwijderd van %{count}" + recurring_todos: "Terugkerende acties" + remove_dependency: "Verwijder afhankelijkheid (zal niet de actie zelf verwijderen)" + removed_predecessor: "'%{successor}' is verwijderd als afhankelijkheid van '%{predecessor}'." + scheduled_overdue: "Gepland om %{days} dagen geleden te tonen" + see_all_completed: "Je kan alle afgeronde acties %{link} zien" + set_to_pending: "'%{task}' als wachtend ingesteld" + show_from: "Toon vanaf" + show_in_days: "Toon over %{days} dagen" + show_on_date: "Toon op %{date}" + show_today: "Toon vandaag" + show_tomorrow: "Toon morgen" + star_action: "Markeer deze actie met een ster" + star_action_with_description: "markeer de actie '%{description}' met een ster" + tagged_page_title: "TRACKS::Tagged met '%{tag_name}'" + tagged_with: "gelabeld met ‘%{tag_name}’" + tags: "Tags (gescheiden door komma's)" + task_list_title: "TRACKS::Toon acties" + tickler_items_due: + one: "Een tickler item wordt nu zichtbaar - vernieuw de pagina om het te zien." + other: "%{count} tickerl items zijn nu zichtbaar - vernieuw de pagina om ze te zien." + to_tickler: "naar tickler" + unable_to_add_dependency: "Niet in staat om de afhankelijkheid toe te voegen" + unresolved_dependency: "De waarde die u ingevoerd heeft in het afhankelijkheden veld is niet herleidbaar naar een bestaande actie. Deze waarde wordt niet bewaard met de rest van de actie. Doorgaan?" + was_due_on_date: "had deadline op %{date}" + users: + account_signup: "Aanmelden voor een account" + auth_change_submit: "Wijzigen authenticatietype" auth_type_update_error: "Er was een probleem met het bijwerken van uw authenticatietype: %{error_messages}" - failed_to_delete_user: Mislukt de gebruiker %{username} te verwijderen - destroy_successful: Gebruiker %{login} met succes verwijderd - first_user_heading: "Welkom bij TRACKS. Om te beginnen, maak dan een admin account:" - total_contexts: Totaal aantal contexten - successfully_deleted_user: Succesvol gebruiker %{username} verwijderd - signup_successful: Aanmelding succesvol voor gebruiker %{username}. - new_token_generated: Nieuwe token met succes gegenereerd - total_projects: Totaal aantal projecten - change_password_submit: Wachtwoord wijzigen - no_signups_title: "TRACKS:: Geen nieuwe aanmeldingen" - user_created: Gebruiker aangemaakt. - account_signup: Aanmelden voor een account - manage_users: Beheren gebruikers - password_updated: Wachtwoord bijgewerkt. - auth_type_updated: Authenticatietype bijgewerkt. - total_actions: Totaal aanal acties - desired_login: Gewenste login - signup: Aanmelden - confirm_password: Bevestig wachtwoord - new_user_heading: "Registreer een nieuwe gebruiker:" - password_confirmation_label: Bevestig wachtwoord - destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}' - choose_password: Kies een wachtwoord - change_password_title: TRACKS::Wachtwoord wijzigen - change_auth_type_title: TRACKS::Wijzig authenticatietype - change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen. - new_password_label: Nieuw wachtwoord - register_with_cas: Met uw CAS gebruikersnaam - label_auth_type: Authenticatietype - total_users_count: Je hebt een totaal van %{count} gebruikers - new_user_title: "TRACKS:: Aanmelden als de admin gebruiker" - destroy_user: Verwijder de gebruiker + auth_type_updated: "Authenticatietype bijgewerkt." + change_auth_type_title: "TRACKS::Wijzig authenticatietype" + change_authentication_type: "Wijzigen authenticatietype" + change_password_prompt: "Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen." + change_password_submit: "Wachtwoord wijzigen" + change_password_title: "TRACKS::Wachtwoord wijzigen" + choose_password: "Kies een wachtwoord" + confirm_password: "Bevestig wachtwoord" + desired_login: "Gewenste login" destroy_confirmation: "Waarschuwing: dit zal de gebruiker '%{login} verwijderen met al zijn acties, contexten, projecten en notities. Weet u zeker dat u wilt doorgaan?" - you_have_to_reset_your_password: Je moet je wachtwoord opnieuw instellen - signup_new_user: Registreer nieuwe gebruiker - identity_url: Identiteit URL - openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren. - auth_change_submit: Wijzigen authenticatietype - change_authentication_type: Wijzigen authenticatietype - total_notes: Totaal aantal notities - select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen. - contexts: - delete_context_title: Verwijder context - all_completed_tasks_title: "TRACKS:: Alle voltooide acties in context '%{context_name}'" - hide_form: Verberg formulier - show_form_title: Voeg een context toe - delete_context_confirmation: Weet u zeker dat u de context '%{name}' wilt verwijderen? Merk op dat dit ook alle (herhalende) acties in deze context zal verwijderen! - todos_append: in deze context - delete_context: Verwijder context - edit_context: Bewerk context - hide_form_title: "Verberg formulier voor nieuwe context " - hidden_contexts: Verborgen contexten - no_contexts_active: Momenteel zijn er geen actieve contexten - context_hide: Verberg van de start pagina? - add_context: Context toevoegen - show_form: Maak een nieuwe context - save_status_message: Context bewaard - visible_contexts: Zichtbare contexten - update_status_message: Naam van de context was veranderd - context_name: Context naam - status_active: Context is actief - completed_tasks_title: "TRACKS:: Voltooid acties in de context '%{context_name}'" - new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?" - new_context_pre: Nieuwe context ' - no_actions: Momenteel zijn er geen onafgeronde acties in deze context - last_completed_in_context: in deze context (laatste %{number}) - context_deleted: De context '%{name}' is verwijderd - no_contexts_hidden: Momenteel zijn er geen verborgen contexten - status_hidden: Context is verborgen - login: - openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (%{identity_url}) - user_no_expiry: Blijf ingelogd - sign_in: Meld aan - login_cas: Ga naar het CAS - cas_no_user_found: Hallo,%{username}! Je hebt nog geen account op Tracks. - cas_login: CAS Inloggen - successful_with_session_info: "Login succesvol:" - please_login: Log in om Tracks te gebruiken - cas_logged_in_greeting: Hallo, %{username}! U bent geauthenticeerd. - cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (%{username}) - cas_create_account: Als u willen vragen ga hier om %{signup_link} - mobile_use_openid: ... if inloggen met een OpenID - cas_signup_link: Aanvragen account - account_login: Account login - successful: Succesvol aangemeld. Welkom terug! - session_will_not_expire: sessie zal niet verlopen. - option_separator: of, - session_time_out: Sessie is verlopen. Gelieve %{link} - session_will_expire: sessie zal verlopen na %{hours} u(u)r(en) van inactiviteit. - login_standard: Ga terug naar de standaard login - login_with_openid: inloggen met een OpenID - unsuccessful: Login mislukt. - log_in_again: opnieuw in te loggen. - logged_out: Je bent afgemeld bij Tracks. - datetime: - prompts: - minute: Minuut - second: Seconden - month: Maand - hour: Uur - day: Dag - year: Jaar - distance_in_words: - less_than_x_minutes: - one: minder dan een minuut - other: minder dan %{count} minuten - zero: minder dan 1 minuut - almost_x_years: - one: bijna 1 jaar - other: bijna %{count} jaren - x_days: - one: 1 dag - other: "%{count} dagen" - x_seconds: - one: 1 seconde - other: "%{count} seconden" - about_x_hours: - one: ongeveer 1 uur - other: ongeveer %{count} uren - less_than_x_seconds: - one: minder dan 1 seconde - other: minder dan %{count} seconden - zero: minder dan 1 seconde - x_months: - one: 1 maand - other: "%{count} maanden" - x_minutes: - one: 1 minuut - other: "%{count} minuten" - about_x_years: - one: ongeveer 1 jaar - other: ongeveer %{count} jaren - about_x_months: - one: ongeveer 1 maand - other: ongeveer %{count} maanden - over_x_years: - one: over 1 jaar - other: over %{count} jaren - half_a_minute: halve minuut - search: - contexts_matching_query: Contexten passend bij zoekopdracht - tags_matching_query: Tags passend bij zoekopdracht - no_results: Uw zoekopdracht heeft geen resultaten opgeleverd. - todos_matching_query: Todos passend bij zoekopdracht - projects_matching_query: Projecten passend bij zoekopdracht - notes_matching_query: Notities passend bij zoekopdracht + destroy_error: "Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}'" + destroy_successful: "Gebruiker %{login} met succes verwijderd" + destroy_user: "Verwijder de gebruiker" + failed_to_delete_user: "Mislukt de gebruiker %{username} te verwijderen" + first_user_heading: "Welkom bij TRACKS. Om te beginnen, maak dan een admin account:" + identity_url: "Identiteit URL" + label_auth_type: Authenticatietype + manage_users: "Beheren gebruikers" + new_password_label: "Nieuw wachtwoord" + new_token_generated: "Nieuwe token met succes gegenereerd" + new_user_heading: "Registreer een nieuwe gebruiker:" + new_user_title: "TRACKS:: Aanmelden als de admin gebruiker" + no_signups_title: "TRACKS:: Geen nieuwe aanmeldingen" + openid_ok_pref_failed: "Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren." + openid_url_verified: "Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen." + password_confirmation_label: "Bevestig wachtwoord" + password_updated: "Wachtwoord bijgewerkt." + register_with_cas: "Met uw CAS gebruikersnaam" + select_authentication_type: "Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen." + signup: Aanmelden + signup_new_user: "Registreer nieuwe gebruiker" + signup_successful: "Aanmelding succesvol voor gebruiker %{username}." + successfully_deleted_user: "Succesvol gebruiker %{username} verwijderd" + total_actions: "Totaal aanal acties" + total_contexts: "Totaal aantal contexten" + total_notes: "Totaal aantal notities" + total_projects: "Totaal aantal projecten" + total_users_count: "Je hebt een totaal van %{count} gebruikers" + user_created: "Gebruiker aangemaakt." + you_have_to_reset_your_password: "Je moet je wachtwoord opnieuw instellen" + will_paginate: + next_label: "Volgende »" + page_entries_info: + multi_page: "Toon %{model} %{from} - %{to} van %{count} in totaal" + multi_page_html: "Toon %{model} %{from} - %{to} van %{count} in totaal" + single_page: + one: "Toon 1 %{model}" + other: "Toon alle %{count} %{model}" + zero: "Geen %{model} gevonden" + single_page_html: + one: "Toon 1 %{model}" + other: "Toon alle %{count} %{model}" + zero: "Geen %{model} gevonden" + page_gap: "…" + previous_label: «Vorige diff --git a/config/routes.rb b/config/routes.rb index f34faf80..cb133922 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Tracksapp::Application.routes.draw do + mount Tolk::Engine => '/tolk', :as => 'tolk' if Rails.env=='development' + root :to => 'todos#index' match 'login' => 'login#login' diff --git a/db/migrate/20120718110127_create_tolk_tables.rb b/db/migrate/20120718110127_create_tolk_tables.rb new file mode 100644 index 00000000..160000ab --- /dev/null +++ b/db/migrate/20120718110127_create_tolk_tables.rb @@ -0,0 +1,38 @@ +class CreateTolkTables < ActiveRecord::Migration + def self.up + create_table :tolk_locales do |t| + t.string :name + t.datetime :created_at + t.datetime :updated_at + end + + add_index :tolk_locales, :name, :unique => true + + create_table :tolk_phrases do |t| + t.text :key + t.datetime :created_at + t.datetime :updated_at + end + + create_table :tolk_translations do |t| + t.integer :phrase_id + t.integer :locale_id + t.text :text + t.text :previous_text + t.boolean :primary_updated, :default => false + t.datetime :created_at + t.datetime :updated_at + end + + add_index :tolk_translations, [:phrase_id, :locale_id], :unique => true + end + + def self.down + remove_index :tolk_translations, :column => [:phrase_id, :locale_id] + remove_index :tolk_locales, :column => :name + + drop_table :tolk_translations + drop_table :tolk_phrases + drop_table :tolk_locales + end +end \ No newline at end of file