Compare commits

...

165 Commits

Author SHA1 Message Date
Toshi MARUYAMA 868e15ff2d remove unneeded trailing ';' from lib/redmine/export/pdf.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13132 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-07 08:25:15 +00:00
Toshi MARUYAMA 1944473eee remove unneeded trailing ';' from test/functional/repositories_git_controller_test.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13131 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-07 08:25:00 +00:00
Toshi MARUYAMA e06de47234 Gemfile: update Rails 3.2.18
git-svn-id: http://svn.redmine.org/redmine/trunk@13130 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-07 07:55:53 +00:00
Toshi MARUYAMA a87cc86b99 fix typo of app/models/repository/mercurial.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-03 23:21:01 +00:00
Toshi MARUYAMA 6eaba1137a fix typo of app/models/repository/cvs.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13128 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-03 23:20:45 +00:00
Jean-Philippe Lang ef4cacdb66 Repository identifiers can be reserved words (#16564).
Patch by Felix Schäfer.

git-svn-id: http://svn.redmine.org/redmine/trunk@13127 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 08:09:33 +00:00
Jean-Philippe Lang 53deb6ca88 Mailer.token_for generates invalid message_id when using from address with full name (#16619).
git-svn-id: http://svn.redmine.org/redmine/trunk@13126 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 07:56:11 +00:00
Jean-Philippe Lang 61776a8b7e Blank content type for attachments attached via Ajax file upload (Patch by Jens Krämer).
git-svn-id: http://svn.redmine.org/redmine/trunk@13125 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 07:38:04 +00:00
Jean-Philippe Lang 382ca5055a Field set as read-only still available in the issues list context menu (#16755).
git-svn-id: http://svn.redmine.org/redmine/trunk@13124 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 07:32:41 +00:00
Jean-Philippe Lang 2d3f3cd9aa Use async email deliveries in rake tasks (#16784).
git-svn-id: http://svn.redmine.org/redmine/trunk@13123 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 07:07:02 +00:00
Jean-Philippe Lang bcc5ac38f3 Crash in markdown formatter causes ruby process to end (#16781).
Patch by Jens Krämer.

git-svn-id: http://svn.redmine.org/redmine/trunk@13122 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-02 06:57:29 +00:00
Toshi MARUYAMA 9875ed9954 Gemfile: upgrade mocha version (#16685)
git-svn-id: http://svn.redmine.org/redmine/trunk@13117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-01 11:44:06 +00:00
Toshi MARUYAMA 6b33956394 use rvm 2.0 and 2.1 instead of 2.0.0 and 2.1.0 at .travis.yml
See:
https://github.com/travis-ci/travis-ci/issues/2220

git-svn-id: http://svn.redmine.org/redmine/trunk@13116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-01 01:59:55 +00:00
Toshi MARUYAMA 82fa2cf79a add patch for regression of Hash#reject in Ruby 2.1.1 (#16194)
git-svn-id: http://svn.redmine.org/redmine/trunk@13115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-01 01:59:39 +00:00
Toshi MARUYAMA 4276fc306c Gemfile: use double quote for request_store (#16685)
git-svn-id: http://svn.redmine.org/redmine/trunk@13112 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-01 01:50:40 +00:00
Toshi MARUYAMA a599442d05 introduce request_store to ensure that the current user doesn't leak across request boundaries (#16685)
Contributed by Holger Just.

git-svn-id: http://svn.redmine.org/redmine/trunk@13110 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-05-01 00:44:01 +00:00
Jean-Philippe Lang 9fdd0862f7 Missing type=array attributes in custom fields API (#16739).
git-svn-id: http://svn.redmine.org/redmine/trunk@13109 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 07:56:00 +00:00
Jean-Philippe Lang ddd6ac8cd4 Don't submit the form when tabs are inside a form (#16708).
Patch by Nicolas Rodriguez.

git-svn-id: http://svn.redmine.org/redmine/trunk@13108 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 07:48:28 +00:00
Jean-Philippe Lang 613757a83d Support for the 1.x versions of mime-types gem (#16710).
Patch by Szilveszter Ördög.

git-svn-id: http://svn.redmine.org/redmine/trunk@13107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 07:44:06 +00:00
Jean-Philippe Lang a4fa0364d4 Redmine links not working with html escpaed characters (#16668).
git-svn-id: http://svn.redmine.org/redmine/trunk@13106 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 07:34:11 +00:00
Jean-Philippe Lang d197203d79 Set Redcarpet :no_intra_emphasis to true (#16669).
git-svn-id: http://svn.redmine.org/redmine/trunk@13105 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 07:02:45 +00:00
Jean-Philippe Lang 43c9d69bf2 Set default start date on issues created by email if default_issue_start_date_to_creation_date is set (#16655).
git-svn-id: http://svn.redmine.org/redmine/trunk@13104 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-26 06:57:09 +00:00
Toshi MARUYAMA 709211cb9c fix non-ascii attachment file name get corrupted in IE11 (#16711)
Contributed by Go MAEDA.

git-svn-id: http://svn.redmine.org/redmine/trunk@13101 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 18:21:23 +00:00
Toshi MARUYAMA 9eb7f25918 remove permission_manage_documents (#16704, #7418)
git-svn-id: http://svn.redmine.org/redmine/trunk@13100 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 01:11:36 +00:00
Toshi MARUYAMA 771dc9b2d6 fix label_module_plural merge miss (#16704, #7418)
git-svn-id: http://svn.redmine.org/redmine/trunk@13099 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 00:53:03 +00:00
Toshi MARUYAMA ee8cf0f12b replace RSS by Atom (#16704, #7418)
git-svn-id: http://svn.redmine.org/redmine/trunk@13098 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 00:43:47 +00:00
Toshi MARUYAMA c6fb9c5f51 replace Atom by RSS (#16704, #7418)
git-svn-id: http://svn.redmine.org/redmine/trunk@13097 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 00:34:33 +00:00
Toshi MARUYAMA 20df9c4dbd Persian Translation updated by shakib a (#16704, #7418)
git-svn-id: http://svn.redmine.org/redmine/trunk@13096 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-17 00:21:43 +00:00
Toshi MARUYAMA 770a296f43 fix typo at lib/tasks/ciphering.rake
git-svn-id: http://svn.redmine.org/redmine/trunk@13095 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-16 00:20:49 +00:00
Toshi MARUYAMA 8c5d88160f fix typo at lib/tasks/ci.rake
git-svn-id: http://svn.redmine.org/redmine/trunk@13094 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-16 00:20:32 +00:00
Toshi MARUYAMA a581f35dff fix typo at test/unit/helpers/application_helper_test.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-16 00:20:15 +00:00
Toshi MARUYAMA 4b1f75e611 fix typo at app/controllers/repositories_controller.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-16 00:19:57 +00:00
Toshi MARUYAMA 44614b5834 fix typo at lib/redcloth3.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13091 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-15 23:57:52 +00:00
Toshi MARUYAMA 38fc2e4391 remove unneeded tabs from test/functional/repositories_cvs_controller_test.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13090 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-15 22:50:04 +00:00
Toshi MARUYAMA bec603eb9b replace tabs to spaces at app/models/repository/cvs.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13089 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-15 22:49:48 +00:00
Toshi MARUYAMA 3270a3af40 replace tabs to spaces at app/models/query.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13088 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-15 22:49:30 +00:00
Toshi MARUYAMA 8c52689d91 reorder French translation (#16553)
Contributed by Darth Vader.

git-svn-id: http://svn.redmine.org/redmine/trunk@13087 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 12:39:11 +00:00
Toshi MARUYAMA c777f75edd mark deprecated Enumeration#overridding_change? which was changed in r13056
git-svn-id: http://svn.redmine.org/redmine/trunk@13086 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 12:38:55 +00:00
Toshi MARUYAMA ce2b12957f remove trailing white-spaces from Issue#count_and_group_by SQL
git-svn-id: http://svn.redmine.org/redmine/trunk@13084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 11:23:05 +00:00
Toshi MARUYAMA 05d24e64f7 remove trailing white-spaces from Issue#by_subproject SQL
git-svn-id: http://svn.redmine.org/redmine/trunk@13083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 11:22:49 +00:00
Toshi MARUYAMA 3c6d46beec remove trailing white-spaces from app/models/issue.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13082 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 11:22:33 +00:00
Toshi MARUYAMA 20496b516f code format clean up Issue#update_versions_from_hierarchy_change
git-svn-id: http://svn.redmine.org/redmine/trunk@13081 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 11:22:17 +00:00
Toshi MARUYAMA 2a1a02f976 French "text_git_repository_note" translation updated by Darth Vader (#16553, #16566)
git-svn-id: http://svn.redmine.org/redmine/trunk@13080 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 11:22:01 +00:00
Toshi MARUYAMA e26f35860c Traditional Chinese "field_assigned_to" translation changed by ChunChang Lo (#16545, #16556)
git-svn-id: http://svn.redmine.org/redmine/trunk@13078 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 02:27:31 +00:00
Toshi MARUYAMA a3f57f1cbf Traditional Chinese translation updated by ChunChang Lo (#16545)
git-svn-id: http://svn.redmine.org/redmine/trunk@13077 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-08 02:27:15 +00:00
Toshi MARUYAMA cebcd67704 fix typos of source comments at Query model
git-svn-id: http://svn.redmine.org/redmine/trunk@13076 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:07:59 +00:00
Toshi MARUYAMA e9399e16d2 fix typos of source comments at Project model
git-svn-id: http://svn.redmine.org/redmine/trunk@13075 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:07:43 +00:00
Toshi MARUYAMA 3aeb85bfd5 fix typos of source comments at Member model
git-svn-id: http://svn.redmine.org/redmine/trunk@13074 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:07:25 +00:00
Toshi MARUYAMA 66f0a5c2ef fix typos of source comments at Issue model
git-svn-id: http://svn.redmine.org/redmine/trunk@13073 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:07:08 +00:00
Toshi MARUYAMA 071d2d7f47 fix typos of source comments at Enumeration model
git-svn-id: http://svn.redmine.org/redmine/trunk@13072 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:06:50 +00:00
Toshi MARUYAMA 9250994088 fix typos of source comments at ApplicationHelper
git-svn-id: http://svn.redmine.org/redmine/trunk@13071 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:06:32 +00:00
Toshi MARUYAMA 6067bfcd09 fix typos of source comments at lib/redmine/wiki_formatting.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13070 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:06:14 +00:00
Toshi MARUYAMA 242b440073 fix typos of source comments at lib/redmine/plugin.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:05:54 +00:00
Toshi MARUYAMA bf776b3304 fix typos of source comments at lib/redmine/hook.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13068 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 08:05:35 +00:00
Toshi MARUYAMA e806f8cc43 German Translation updated by Daniel Felix (#16542)
git-svn-id: http://svn.redmine.org/redmine/trunk@13065 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 07:34:47 +00:00
Toshi MARUYAMA 7dca09a135 not use non ASCII characters at CHANGELOG
git-svn-id: http://svn.redmine.org/redmine/trunk@13064 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 05:44:40 +00:00
Toshi MARUYAMA e475798769 fix character broken (MOJIBAKE) of CHANGELOG
git-svn-id: http://svn.redmine.org/redmine/trunk@13063 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 05:44:23 +00:00
Toshi MARUYAMA f773219426 fix typos of source comments at Version model
git-svn-id: http://svn.redmine.org/redmine/trunk@13062 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 00:22:11 +00:00
Toshi MARUYAMA e8e9c046af fix typos at unit version test
git-svn-id: http://svn.redmine.org/redmine/trunk@13061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 00:21:55 +00:00
Toshi MARUYAMA 5d56f0f26f Japanese translation (email notification) updated by Go MAEDA (#16536)
git-svn-id: http://svn.redmine.org/redmine/trunk@13060 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-07 00:21:39 +00:00
Toshi MARUYAMA 82de347dfd fix typos of source comments at acts_as_event.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@13059 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 14:14:55 +00:00
Toshi MARUYAMA 3e89c2ff3e fix typos of source comments at WikiContent model
git-svn-id: http://svn.redmine.org/redmine/trunk@13058 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 14:14:40 +00:00
Toshi MARUYAMA 597d042ec2 fix typos of source comments at Project model
git-svn-id: http://svn.redmine.org/redmine/trunk@13057 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 14:14:23 +00:00
Toshi MARUYAMA 5e0d93b689 fix typo of Enumeration#overridding_change?
git-svn-id: http://svn.redmine.org/redmine/trunk@13056 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 13:32:35 +00:00
Jean-Philippe Lang 01ac064935 Exclude custom fields with multiple values from time report criteria (#16519).
git-svn-id: http://svn.redmine.org/redmine/trunk@13055 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 11:29:44 +00:00
Jean-Philippe Lang 22b2a1f699 Fixed that Link custom fields are not displayed as links on the issue list (#16496).
git-svn-id: http://svn.redmine.org/redmine/trunk@13054 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 11:11:52 +00:00
Jean-Philippe Lang 5b8a96472f Missing closing tag (#3177).
git-svn-id: http://svn.redmine.org/redmine/trunk@13052 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 11:03:57 +00:00
Toshi MARUYAMA 1c208fcc86 Bulgarian translation updated by Ivan Cenov (#16532)
git-svn-id: http://svn.redmine.org/redmine/trunk@13050 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-06 07:11:37 +00:00
Jean-Philippe Lang 25ddc672a1 Adds strings to locales (#3177).
git-svn-id: http://svn.redmine.org/redmine/trunk@13044 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 14:08:18 +00:00
Jean-Philippe Lang 64c65463a4 Adds strings to locales (#3177).
git-svn-id: http://svn.redmine.org/redmine/trunk@13043 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 14:05:36 +00:00
Jean-Philippe Lang 43d7036051 Adds "Check for updates" for installed plugins (#3177).
git-svn-id: http://svn.redmine.org/redmine/trunk@13042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 14:00:19 +00:00
Jean-Philippe Lang 4920bb9d4d Potentiel data leak in "Invalid form authenticity token" error screen (#16511).
git-svn-id: http://svn.redmine.org/redmine/trunk@13041 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 08:19:55 +00:00
Jean-Philippe Lang 380b0515d1 Fixed that back_url=/ param is ignored (#16467).
git-svn-id: http://svn.redmine.org/redmine/trunk@13040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 08:11:28 +00:00
Toshi MARUYAMA e739628c81 replace mail options reference URL at configuration.yml.example
wiki.rubyonrails.org seems dead.

git-svn-id: http://svn.redmine.org/redmine/trunk@13037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-05 00:21:16 +00:00
Jean-Philippe Lang bf37fd9695 Format table list.
git-svn-id: http://svn.redmine.org/redmine/trunk@13036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-04-03 23:11:47 +00:00
Jean-Philippe Lang 08b96d8b47 Updates for 2.5.1 release.
git-svn-id: http://svn.redmine.org/redmine/trunk@13033 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-29 16:09:30 +00:00
Jean-Philippe Lang 6d5569a46d Remove users from cc if they are already notified (#16415).
git-svn-id: http://svn.redmine.org/redmine/trunk@13029 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-29 15:27:42 +00:00
Jean-Philippe Lang 7567c3d8b2 Fixed back url verification (#16466).
git-svn-id: http://svn.redmine.org/redmine/trunk@13018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-29 14:32:47 +00:00
Toshi MARUYAMA cecbb225a2 Czech translation for trunk updated by Karel Pičman (#16453)
git-svn-id: http://svn.redmine.org/redmine/trunk@13016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-28 10:52:36 +00:00
Toshi MARUYAMA 279c3a2e9b Czech translation for 2.5-stable updated by Karel Pičman (#16453)
git-svn-id: http://svn.redmine.org/redmine/trunk@13015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-28 10:52:20 +00:00
Toshi MARUYAMA 2545720afa fix awesome_nested_set test failure (#6579)
git-svn-id: http://svn.redmine.org/redmine/trunk@13014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 11:46:47 +00:00
Toshi MARUYAMA 971dbfecc0 add missing awesome_nested_set 2.1.6 files (#6579)
64cc8bc8cf

git-svn-id: http://svn.redmine.org/redmine/trunk@13013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 11:46:31 +00:00
Toshi MARUYAMA 92cac9011e remove unneeded Relation#all from WorkflowTransition#count_by_tracker_and_role
git-svn-id: http://svn.redmine.org/redmine/trunk@13012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 10:38:04 +00:00
Toshi MARUYAMA 2ec3b3694f fix race condition of highest rgt at Issue#update_nested_set_attributes_on_parent_change (#6579)
git-svn-id: http://svn.redmine.org/redmine/trunk@13011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 01:48:20 +00:00
Toshi MARUYAMA 755108566c awesome_nested_set: split highest rgt reader method (#6579)
git-svn-id: http://svn.redmine.org/redmine/trunk@13010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 01:48:04 +00:00
Toshi MARUYAMA 3c83d1c646 fix always new lft and rgt are lft = 1, rgt = 2 (#6579)
git-svn-id: http://svn.redmine.org/redmine/trunk@13009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 01:47:48 +00:00
Toshi MARUYAMA e4cf210fa2 use bundled awesome_nested_set (#6579)
git-svn-id: http://svn.redmine.org/redmine/trunk@13008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 01:47:31 +00:00
Toshi MARUYAMA d1057bc4ad import awesome_nested_set 2.1.6 (#6579)
64cc8bc8cf

git-svn-id: http://svn.redmine.org/redmine/trunk@13007 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-26 01:47:14 +00:00
Toshi MARUYAMA 560bfa6d87 add ChangeLog note that #15781 was forgotten to merge to v2.4.3.
git-svn-id: http://svn.redmine.org/redmine/trunk@13004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-25 08:35:49 +00:00
Toshi MARUYAMA 291de3d03f Gemfile: pin rake version 10.1
rake 10.2.0 requires Ruby version >= 1.9.

git-svn-id: http://svn.redmine.org/redmine/trunk@13001 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-25 07:14:34 +00:00
Toshi MARUYAMA 4a9d04a767 remove unneeded Relation#all from Issue#workflow_rule_by_attribute
git-svn-id: http://svn.redmine.org/redmine/trunk@13000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-24 16:00:01 +00:00
Toshi MARUYAMA 5fb5bd0b11 remove unneeded Relation#all from WorkflowsController#edit
git-svn-id: http://svn.redmine.org/redmine/trunk@12999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-24 15:59:45 +00:00
Jean-Philippe Lang aa9b8ea187 Use named routes.
git-svn-id: http://svn.redmine.org/redmine/trunk@12998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 04:11:59 +00:00
Jean-Philippe Lang 83ce5c1687 Don't run the test if Redcarpet is not available (#16236).
git-svn-id: http://svn.redmine.org/redmine/trunk@12997 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 04:07:56 +00:00
Jean-Philippe Lang d50ec43dff Disable children when checking parent notifiable.
git-svn-id: http://svn.redmine.org/redmine/trunk@12996 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 04:05:49 +00:00
Jean-Philippe Lang ddcad64aa2 Don't abort processing of emails when an email triggers a parsing exception (#16122).
git-svn-id: http://svn.redmine.org/redmine/trunk@12995 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 03:04:43 +00:00
Toshi MARUYAMA 429210f03f German Translation updated by Daniel Felix (#16399)
git-svn-id: http://svn.redmine.org/redmine/trunk@12994 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 02:27:26 +00:00
Toshi MARUYAMA 74373c1597 move de.yml "label_link" by alphabetical order
git-svn-id: http://svn.redmine.org/redmine/trunk@12993 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 02:27:05 +00:00
Jean-Philippe Lang 2b0dfe948a Set same width for all buttons (#16326).
git-svn-id: http://svn.redmine.org/redmine/trunk@12992 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 02:22:31 +00:00
Jean-Philippe Lang 54830abd6b Custom queries: buttons to move column to top and bottom (#16326).
git-svn-id: http://svn.redmine.org/redmine/trunk@12991 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 02:20:56 +00:00
Jean-Philippe Lang dd70327ce4 Let user choose an issue of another project when updating a time entry (#16338).
git-svn-id: http://svn.redmine.org/redmine/trunk@12990 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 02:12:32 +00:00
Jean-Philippe Lang 273aa42900 Fixed: right-aligned table of contents (TOC) not working with markdown (#16236).
git-svn-id: http://svn.redmine.org/redmine/trunk@12989 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 01:35:21 +00:00
Jean-Philippe Lang abf24a7d92 Don't clear plugins in tests (#16258).
git-svn-id: http://svn.redmine.org/redmine/trunk@12988 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 01:12:11 +00:00
Jean-Philippe Lang 913c8cd2e6 Don't clear plugins in tests (#16258).
git-svn-id: http://svn.redmine.org/redmine/trunk@12987 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 01:06:18 +00:00
Jean-Philippe Lang f4e5025aed Extract code to render project context links to helper (#16381).
Patch by Michael Esemplare.

git-svn-id: http://svn.redmine.org/redmine/trunk@12986 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 00:27:42 +00:00
Jean-Philippe Lang b29c48717d Fixed: Error generated on 'search for watchers to add' after clicking add without selected users (#14298).
git-svn-id: http://svn.redmine.org/redmine/trunk@12985 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-21 00:23:46 +00:00
Toshi MARUYAMA b109fff281 Bulgarian translation updated by Ivan Cenov (#16385)
git-svn-id: http://svn.redmine.org/redmine/trunk@12984 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-19 15:14:38 +00:00
Toshi MARUYAMA d352d55f27 Traditional Chinese translation updated by ChunChang Lo (#16380)
git-svn-id: http://svn.redmine.org/redmine/trunk@12983 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-19 07:00:29 +00:00
Toshi MARUYAMA d541020982 Polish translation updated by Jan Inowolski (#16368)
git-svn-id: http://svn.redmine.org/redmine/trunk@12981 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-18 03:24:22 +00:00
Jean-Philippe Lang 509d0fbb5e Fixed test failure (#16362).
git-svn-id: http://svn.redmine.org/redmine/trunk@12980 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 14:11:37 +00:00
Jean-Philippe Lang 716da4622e Adds string to locales (#16362).
git-svn-id: http://svn.redmine.org/redmine/trunk@12977 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 08:26:50 +00:00
Jean-Philippe Lang 0b5e7d2a3c Wrong argument.
git-svn-id: http://svn.redmine.org/redmine/trunk@12976 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 08:23:07 +00:00
Jean-Philippe Lang 4bf18a697c Adds an option to send email on "Assignee updated" in application settings (#16362).
git-svn-id: http://svn.redmine.org/redmine/trunk@12975 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 08:20:27 +00:00
Jean-Philippe Lang b695878193 Adds an option to send email on "Assignee updated" in application settings (#16362).
git-svn-id: http://svn.redmine.org/redmine/trunk@12974 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 08:19:45 +00:00
Jean-Philippe Lang 4e5bb0e231 Fixed flawed regexp for removing pre blocks when quoting messages (#16353).
git-svn-id: http://svn.redmine.org/redmine/trunk@12973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-17 07:49:14 +00:00
Toshi MARUYAMA b4fd6b47b1 remove garbage comment from test/integration/account_test.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@12972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 22:20:46 +00:00
Jean-Philippe Lang c075626462 Fixed that requesting a specific version of a non-existent wiki page raises an error (#16255).
git-svn-id: http://svn.redmine.org/redmine/trunk@12971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 11:41:24 +00:00
Jean-Philippe Lang 218e5f40a1 Select proper tracker and status for when hitting F5 with browsers that preserve select values on reload, eg. Firefox (#16259).
git-svn-id: http://svn.redmine.org/redmine/trunk@12970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 11:21:16 +00:00
Jean-Philippe Lang 995ae083cd Fixed flawed regexp for removing pre blocks when quoting notes (#16353).
Patch by Stephane Lapie.

git-svn-id: http://svn.redmine.org/redmine/trunk@12969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 10:36:56 +00:00
Jean-Philippe Lang d7729d6d4f Use #read/#write_attribute instead of #super when overwriting default accessors (#16319).
Patch by Felix Schäfer.

git-svn-id: http://svn.redmine.org/redmine/trunk@12968 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 10:25:24 +00:00
Jean-Philippe Lang 1547119627 Fixed that integer custom fields with "Link values to URL" set are displayed as escaped html in text email (#16321).
git-svn-id: http://svn.redmine.org/redmine/trunk@12967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 10:21:18 +00:00
Toshi MARUYAMA 484b13cc94 Spanish translation updated by Jesus Gutierrez de la Vega (#16356)
git-svn-id: http://svn.redmine.org/redmine/trunk@12965 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-15 05:49:16 +00:00
Toshi MARUYAMA 23fd067124 Russian translation updated by Kirill Bezrukov (#16336)
git-svn-id: http://svn.redmine.org/redmine/trunk@12963 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-13 11:14:24 +00:00
Toshi MARUYAMA f3311cd1ff Korean Translation updated by Jong-Ha Ahn (#16334)
git-svn-id: http://svn.redmine.org/redmine/trunk@12961 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-13 08:27:00 +00:00
Toshi MARUYAMA 9130222480 fix Turkish translation typo by Gürkan Gür (#16320)
git-svn-id: http://svn.redmine.org/redmine/trunk@12959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-12 00:13:43 +00:00
Toshi MARUYAMA b772319977 fix source indent of lib/redmine/views/labelled_form_builder.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@12958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-11 09:59:56 +00:00
Toshi MARUYAMA c67043e01c fix source indent of lib/redmine/views/labelled_form_builder.rb
git-svn-id: http://svn.redmine.org/redmine/trunk@12957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-11 09:59:40 +00:00
Toshi MARUYAMA 8a5baf9961 Japanese translation updated by Go MAEDA (#16291)
git-svn-id: http://svn.redmine.org/redmine/trunk@12955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-11 09:30:04 +00:00
Jean-Philippe Lang 1d71564d6f Watcher search now displays project members by default.
git-svn-id: http://svn.redmine.org/redmine/trunk@12951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-02 11:05:26 +00:00
Jean-Philippe Lang 8a2413f3b7 Updated CHANGELOG for 2.4.4 and 2.5.0.
git-svn-id: http://svn.redmine.org/redmine/trunk@12948 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-03-02 09:37:55 +00:00
Jean-Philippe Lang 2641f8ba91 Changeset comments set to longtext for handling comments > 64KB with Mysql (#16143).
git-svn-id: http://svn.redmine.org/redmine/trunk@12944 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-28 13:16:46 +00:00
Jean-Philippe Lang b0ec39fc45 Always load formatter scripts for when the description is read-only on page load (#16161).
git-svn-id: http://svn.redmine.org/redmine/trunk@12941 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-28 12:52:23 +00:00
Jean-Philippe Lang 4c7a76785d Fixed that non-empty blank strings as custom field values are not properly validated (#16169).
git-svn-id: http://svn.redmine.org/redmine/trunk@12938 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-28 10:05:27 +00:00
Toshi MARUYAMA 0cf7a27b50 use Python getattr instead of hasattr (#16177)
git-svn-id: http://svn.redmine.org/redmine/trunk@12935 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-26 16:28:43 +00:00
Toshi MARUYAMA 7b295f379b Mercurial 2.9 compatibility (#16177)
git-svn-id: http://svn.redmine.org/redmine/trunk@12930 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-26 12:01:00 +00:00
Toshi MARUYAMA e266ddb309 scm: mercurial: add one "closed" branch to test repository (#16177)
git-svn-id: http://svn.redmine.org/redmine/trunk@12929 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-26 11:27:41 +00:00
Jean-Philippe Lang 74e434b2f3 Removed hard-coded strings (#16164).
git-svn-id: http://svn.redmine.org/redmine/trunk@12928 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-25 20:17:15 +00:00
Toshi MARUYAMA 4162d8ec6b prevent issue tree hierarchy is broken in race conditions (#6579)
awesome_nested_set 2.1.6 uses lock.
Issue model uses as same way.

git-svn-id: http://svn.redmine.org/redmine/trunk@12927 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-25 06:54:40 +00:00
Jean-Philippe Lang b6c794d16b Bulk edit workflows for multiple trackers/roles (#16164).
git-svn-id: http://svn.redmine.org/redmine/trunk@12924 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-25 02:54:47 +00:00
Toshi MARUYAMA c6f71f727b explicitly set encoding UTF-8 (#16107)
Default Ruby source file encoding changed in Ruby 2.0.0.
https://bugs.ruby-lang.org/issues/6679

git-svn-id: http://svn.redmine.org/redmine/trunk@12918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 15:55:35 +00:00
Toshi MARUYAMA ad8c02ca82 add "assert_response 401" to tests (#16107)
git-svn-id: http://svn.redmine.org/redmine/trunk@12917 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 15:55:20 +00:00
Jean-Philippe Lang 8405d57516 Strip invalid UTF-8 bytes in User#find_by_login (#16107).
git-svn-id: http://svn.redmine.org/redmine/trunk@12916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 12:50:56 +00:00
Jean-Philippe Lang 58ff842d34 Trigger basic HTTP authentication only when Basic authorization header is present (#16107).
git-svn-id: http://svn.redmine.org/redmine/trunk@12915 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 12:09:58 +00:00
Jean-Philippe Lang 98e299857b Only notify users that can see news (#16134).
git-svn-id: http://svn.redmine.org/redmine/trunk@12914 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 11:32:52 +00:00
Jean-Philippe Lang 9733194cce Prevent N queries on custom_fields when call /issues API.
git-svn-id: http://svn.redmine.org/redmine/trunk@12913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 11:23:39 +00:00
Jean-Philippe Lang 411ddaf701 Preload authors for /issues API calls.
git-svn-id: http://svn.redmine.org/redmine/trunk@12912 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 11:22:43 +00:00
Jean-Philippe Lang 9b6f53219f Preload issue authors when displayed on the issue list (#16091).
git-svn-id: http://svn.redmine.org/redmine/trunk@12911 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 11:21:05 +00:00
Jean-Philippe Lang 15c85ededd Preload issue relations when exporting issues to CSV with all columns (#16091).
git-svn-id: http://svn.redmine.org/redmine/trunk@12910 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-22 11:19:21 +00:00
Toshi MARUYAMA 95e44a2e57 fix typos of migrate_from_trac.rake
git-svn-id: http://svn.redmine.org/redmine/trunk@12909 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-20 04:59:33 +00:00
Toshi MARUYAMA 4dc7bc75b4 update Rails to 3.2.17
git-svn-id: http://svn.redmine.org/redmine/trunk@12906 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-19 09:32:51 +00:00
Toshi MARUYAMA 78f9d6d2ce svn propset svn:eol-style native fixture (#16122)
git-svn-id: http://svn.redmine.org/redmine/trunk@12905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-18 23:28:23 +00:00
Toshi MARUYAMA 63a53e17fd fix newline of fixture (#16122)
git-svn-id: http://svn.redmine.org/redmine/trunk@12904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-18 23:27:39 +00:00
Toshi MARUYAMA b5d80456ac add test of gmail ISO-8859-2 mail receiving (#16122)
git-svn-id: http://svn.redmine.org/redmine/trunk@12903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-18 23:21:41 +00:00
Toshi MARUYAMA cce92213b0 svn propset svn:eol-style native fixture (#14675)
git-svn-id: http://svn.redmine.org/redmine/trunk@12902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-17 12:44:58 +00:00
Toshi MARUYAMA 14c02f50cc add test of quoted printable UTF-8 mail reviving (#14675)
git-svn-id: http://svn.redmine.org/redmine/trunk@12901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-17 12:42:44 +00:00
Toshi MARUYAMA 50ab5ec1b6 Rails4: fix time related git unit test failure
git-svn-id: http://svn.redmine.org/redmine/trunk@12900 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 23:13:44 +00:00
Jean-Philippe Lang e8057d41bb Fixed that collapse macro with headings breaks the table of contents (#16077).
git-svn-id: http://svn.redmine.org/redmine/trunk@12899 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 10:55:29 +00:00
Jean-Philippe Lang 4a2114c73b Move the field format at the top of the form.
git-svn-id: http://svn.redmine.org/redmine/trunk@12897 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 10:04:25 +00:00
Jean-Philippe Lang 1114bf5e99 Fixed: Export CSV - Custom field true/false not using translation (#16081).
git-svn-id: http://svn.redmine.org/redmine/trunk@12896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 09:18:01 +00:00
Jean-Philippe Lang 88568da451 Always preload issues custom values (#16091).
git-svn-id: http://svn.redmine.org/redmine/trunk@12894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 08:59:45 +00:00
Jean-Philippe Lang ceb7e346a7 Fixed alignments.
git-svn-id: http://svn.redmine.org/redmine/trunk@12892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 08:34:30 +00:00
Jean-Philippe Lang b5e19e2d17 Removed trailing spaces in french locale.
git-svn-id: http://svn.redmine.org/redmine/trunk@12890 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 08:15:25 +00:00
Jean-Philippe Lang 7204f64254 Typo in french locale (#16073).
git-svn-id: http://svn.redmine.org/redmine/trunk@12889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 08:08:18 +00:00
Jean-Philippe Lang a339deeacd Typo in french locale (#16073).
git-svn-id: http://svn.redmine.org/redmine/trunk@12888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 08:04:11 +00:00
Jean-Philippe Lang 0b97099f8c Set version to 2.5.0.
git-svn-id: http://svn.redmine.org/redmine/trunk@12886 e93f8b46-1217-0410-a6f0-8f06a7374b81
2014-02-15 07:40:26 +00:00
194 changed files with 5022 additions and 1043 deletions

View File

@ -5,8 +5,8 @@ language: ruby
rvm: rvm:
- 1.8.7 - 1.8.7
- 1.9.3 - 1.9.3
- 2.0.0 - 2.0
- 2.1.0 - 2.1
- jruby - jruby
matrix: matrix:
allow_failures: allow_failures:

View File

@ -1,12 +1,13 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem "rails", "3.2.16" gem "rails", "3.2.18"
gem "rake", "~> 10.1.1"
gem "jquery-rails", "~> 2.0.2" gem "jquery-rails", "~> 2.0.2"
gem "coderay", "~> 1.1.0" gem "coderay", "~> 1.1.0"
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
gem "builder", "3.0.0" gem "builder", "3.0.0"
gem "request_store"
gem "mime-types" gem "mime-types"
gem "awesome_nested_set", "2.1.6"
# Optional gem for LDAP authentication # Optional gem for LDAP authentication
group :ldap do group :ldap do
@ -85,7 +86,7 @@ end
group :test do group :test do
gem "shoulda", "~> 3.3.2" gem "shoulda", "~> 3.3.2"
gem "mocha", ">= 0.14", :require => 'mocha/api' gem "mocha", "~> 1.0.0", :require => 'mocha/api'
if RUBY_VERSION >= '1.9.3' if RUBY_VERSION >= '1.9.3'
gem "capybara", "~> 2.1.0" gem "capybara", "~> 2.1.0"
gem "selenium-webdriver" gem "selenium-webdriver"

View File

@ -44,6 +44,7 @@ class ApplicationController < ActionController::Base
unless api_request? unless api_request?
super super
cookies.delete(autologin_cookie_name) cookies.delete(autologin_cookie_name)
self.logged_user = nil
render_error :status => 422, :message => "Invalid form authenticity token." render_error :status => 422, :message => "Invalid form authenticity token."
end end
end end
@ -119,7 +120,7 @@ class ApplicationController < ActionController::Base
if (key = api_key_from_request) if (key = api_key_from_request)
# Use API key # Use API key
user = User.find_by_api_key(key) user = User.find_by_api_key(key)
else elsif request.authorization.to_s =~ /\ABasic /i
# HTTP Basic, either username/password or API key/random # HTTP Basic, either username/password or API key/random
authenticate_with_http_basic do |username, password| authenticate_with_http_basic do |username, password|
user = User.try_to_login(username, password) || User.find_by_api_key(username) user = User.try_to_login(username, password) || User.find_by_api_key(username)
@ -379,7 +380,7 @@ class ApplicationController < ActionController::Base
begin begin
uri = URI.parse(back_url) uri = URI.parse(back_url)
# do not redirect user to another host or to the login or register page # do not redirect user to another host or to the login or register page
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)}) if ((uri.relative? && back_url.match(%r{\A/(\w.*)?\z})) || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
redirect_to(back_url) redirect_to(back_url)
return return
end end
@ -557,7 +558,7 @@ class ApplicationController < ActionController::Base
# Returns a string that can be used as filename value in Content-Disposition header # Returns a string that can be used as filename value in Content-Disposition header
def filename_for_content_disposition(name) def filename_for_content_disposition(name)
request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name request.env['HTTP_USER_AGENT'] =~ %r{(MSIE|Trident)} ? ERB::Util.url_encode(name) : name
end end
def api_request? def api_request?

View File

@ -55,7 +55,7 @@ class ContextMenusController < ApplicationController
@options_by_custom_field = {} @options_by_custom_field = {}
if @can[:edit] if @can[:edit]
custom_fields = @issues.map(&:available_custom_fields).reduce(:&).reject(&:multiple?) custom_fields = @issues.map(&:editable_custom_fields).reduce(:&).reject(&:multiple?)
custom_fields.each do |field| custom_fields.each do |field|
values = field.possible_values_options(@projects) values = field.possible_values_options(@projects)
if values.present? if values.present?

View File

@ -62,10 +62,14 @@ class IssuesController < ApplicationController
case params[:format] case params[:format]
when 'csv', 'pdf' when 'csv', 'pdf'
@limit = Setting.issues_export_limit.to_i @limit = Setting.issues_export_limit.to_i
if params[:columns] == 'all'
@query.column_names = @query.available_inline_columns.map(&:name)
end
when 'atom' when 'atom'
@limit = Setting.feeds_limit.to_i @limit = Setting.feeds_limit.to_i
when 'xml', 'json' when 'xml', 'json'
@offset, @limit = api_offset_and_limit @offset, @limit = api_offset_and_limit
@query.column_names = %w(author)
else else
@limit = per_page_option @limit = per_page_option
end end

View File

@ -66,7 +66,7 @@ class JournalsController < ApplicationController
text = @issue.description text = @issue.description
end end
# Replaces pre blocks with [...] # Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]') text = text.to_s.strip.gsub(%r{<pre>(.*?)</pre>}m, '[...]')
@content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> " @content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
@content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound

View File

@ -113,7 +113,7 @@ class MessagesController < ApplicationController
@subject = "RE: #{@subject}" unless @subject.starts_with?('RE:') @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:')
@content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> " @content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> "
@content << @message.content.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" @content << @message.content.to_s.strip.gsub(%r{<pre>(.*?)</pre>}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
end end
def preview def preview

View File

@ -411,7 +411,7 @@ class RepositoriesController < ApplicationController
commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10 commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10 changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10
# Remove email adress in usernames # Remove email address in usernames
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
graph = SVG::Graph::BarHorizontal.new( graph = SVG::Graph::BarHorizontal.new(

View File

@ -55,6 +55,9 @@ class WatchersController < ApplicationController
user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]] user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]]
@users = User.active.where(:id => user_ids).all @users = User.active.where(:id => user_ids).all
end end
if @users.blank?
render :nothing => true
end
end end
def destroy def destroy

View File

@ -18,40 +18,30 @@
class WorkflowsController < ApplicationController class WorkflowsController < ApplicationController
layout 'admin' layout 'admin'
before_filter :require_admin, :find_roles, :find_trackers before_filter :require_admin
def index def index
@workflow_counts = WorkflowTransition.count_by_tracker_and_role @workflow_counts = WorkflowTransition.count_by_tracker_and_role
end end
def edit def edit
@role = Role.find_by_id(params[:role_id]) if params[:role_id] find_trackers_roles_and_statuses_for_edit
@tracker = Tracker.find_by_id(params[:tracker_id]) if params[:tracker_id]
if request.post? if request.post? && @roles && @trackers && params[:transitions]
WorkflowTransition.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id]) transitions = params[:transitions].deep_dup
(params[:issue_status] || []).each { |status_id, transitions| transitions.each do |old_status_id, transitions_by_new_status|
transitions.each { |new_status_id, options| transitions_by_new_status.each do |new_status_id, transition_by_rule|
author = options.is_a?(Array) && options.include?('author') && !options.include?('always') transition_by_rule.reject! {|rule, transition| transition == 'no_change'}
assignee = options.is_a?(Array) && options.include?('assignee') && !options.include?('always') end
WorkflowTransition.create(:role_id => @role.id, :tracker_id => @tracker.id, :old_status_id => status_id, :new_status_id => new_status_id, :author => author, :assignee => assignee)
}
}
if @role.save
flash[:notice] = l(:notice_successful_update)
redirect_to workflows_edit_path(:role_id => @role, :tracker_id => @tracker, :used_statuses_only => params[:used_statuses_only])
return
end end
WorkflowTransition.replace_transitions(@trackers, @roles, transitions)
flash[:notice] = l(:notice_successful_update)
redirect_to_referer_or workflows_edit_path
return
end end
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true) if @trackers && @roles && @statuses.any?
if @tracker && @used_statuses_only && @tracker.issue_statuses.any? workflows = WorkflowTransition.where(:role_id => @roles.map(&:id), :tracker_id => @trackers.map(&:id))
@statuses = @tracker.issue_statuses
end
@statuses ||= IssueStatus.sorted.all
if @tracker && @role && @statuses.any?
workflows = WorkflowTransition.where(:role_id => @role.id, :tracker_id => @tracker.id).all
@workflows = {} @workflows = {}
@workflows['always'] = workflows.select {|w| !w.author && !w.assignee} @workflows['always'] = workflows.select {|w| !w.author && !w.assignee}
@workflows['author'] = workflows.select {|w| w.author} @workflows['author'] = workflows.select {|w| w.author}
@ -60,36 +50,31 @@ class WorkflowsController < ApplicationController
end end
def permissions def permissions
@role = Role.find_by_id(params[:role_id]) if params[:role_id] find_trackers_roles_and_statuses_for_edit
@tracker = Tracker.find_by_id(params[:tracker_id]) if params[:tracker_id]
if request.post? && @role && @tracker if request.post? && @roles && @trackers && params[:permissions]
WorkflowPermission.replace_permissions(@tracker, @role, params[:permissions] || {}) permissions = params[:permissions].deep_dup
permissions.each { |field, rule_by_status_id|
rule_by_status_id.reject! {|status_id, rule| rule == 'no_change'}
}
WorkflowPermission.replace_permissions(@trackers, @roles, permissions)
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to workflows_permissions_path(:role_id => @role, :tracker_id => @tracker, :used_statuses_only => params[:used_statuses_only]) redirect_to_referer_or workflows_permissions_path
return return
end end
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true) if @roles && @trackers
if @tracker && @used_statuses_only && @tracker.issue_statuses.any? @fields = (Tracker::CORE_FIELDS_ALL - @trackers.map(&:disabled_core_fields).reduce(:&)).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]}
@statuses = @tracker.issue_statuses @custom_fields = @trackers.map(&:custom_fields).flatten.uniq.sort
end @permissions = WorkflowPermission.rules_by_status_id(@trackers, @roles)
@statuses ||= IssueStatus.sorted.all
if @role && @tracker
@fields = (Tracker::CORE_FIELDS_ALL - @tracker.disabled_core_fields).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]}
@custom_fields = @tracker.custom_fields
@permissions = WorkflowPermission.
where(:tracker_id => @tracker.id, :role_id => @role.id).inject({}) do |h, w|
h[w.old_status_id] ||= {}
h[w.old_status_id][w.field_name] = w.rule
h
end
@statuses.each {|status| @permissions[status.id] ||= {}} @statuses.each {|status| @permissions[status.id] ||= {}}
end end
end end
def copy def copy
@roles = Role.sorted
@trackers = Tracker.sorted
if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any' if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any'
@source_tracker = nil @source_tracker = nil
else else
@ -119,11 +104,37 @@ class WorkflowsController < ApplicationController
private private
def find_trackers_roles_and_statuses_for_edit
find_roles
find_trackers
find_statuses
end
def find_roles def find_roles
@roles = Role.sorted.all ids = Array.wrap(params[:role_id])
if ids == ['all']
@roles = Role.sorted.all
elsif ids.present?
@roles = Role.where(:id => ids).all
end
@roles = nil if @roles.blank?
end end
def find_trackers def find_trackers
@trackers = Tracker.sorted.all ids = Array.wrap(params[:tracker_id])
if ids == ['all']
@trackers = Tracker.sorted.all
elsif ids.present?
@trackers = Tracker.where(:id => ids).all
end
@trackers = nil if @trackers.blank?
end
def find_statuses
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
if @trackers && @used_statuses_only
@statuses = @trackers.map(&:issue_statuses).flatten.uniq.sort.presence
end
@statuses ||= IssueStatus.sorted.all
end end
end end

View File

@ -24,4 +24,12 @@ module AdminHelper
[l(:project_status_closed), '5'], [l(:project_status_closed), '5'],
[l(:project_status_archived), '9']], selected.to_s) [l(:project_status_archived), '9']], selected.to_s)
end end
def plugin_data_for_updates(plugins)
data = {"v" => Redmine::VERSION.to_s, "p" => {}}
plugins.each do |plugin|
data["p"].merge! plugin.id => {"v" => plugin.version, "n" => plugin.name, "a" => plugin.author}
end
data
end
end end

View File

@ -158,7 +158,10 @@ module ApplicationHelper
end end
# Helper that formats object for html or text rendering # Helper that formats object for html or text rendering
def format_object(object, html=true) def format_object(object, html=true, &block)
if block_given?
object = yield object
end
case object.class.name case object.class.name
when 'Array' when 'Array'
object.map {|o| format_object(o, html)}.join(', ').html_safe object.map {|o| format_object(o, html)}.join(', ').html_safe
@ -188,7 +191,7 @@ module ApplicationHelper
if f.nil? || f.is_a?(String) if f.nil? || f.is_a?(String)
f f
else else
format_object(f, html) format_object(f, html, &block)
end end
else else
object.value.to_s object.value.to_s
@ -819,6 +822,7 @@ module ApplicationHelper
elsif sep == ':' elsif sep == ':'
# removes the double quotes if any # removes the double quotes if any
name = identifier.gsub(%r{^"(.*)"$}, "\\1") name = identifier.gsub(%r{^"(.*)"$}, "\\1")
name = CGI.unescapeHTML(name)
case prefix case prefix
when 'document' when 'document'
if project && document = project.documents.visible.find_by_title(name) if project && document = project.documents.visible.find_by_title(name)
@ -978,19 +982,20 @@ module ApplicationHelper
end end
end end
TOC_RE = /<p>\{\{([<>]?)toc\}\}<\/p>/i unless const_defined?(:TOC_RE) TOC_RE = /<p>\{\{((<|&lt;)|(>|&gt;))?toc\}\}<\/p>/i unless const_defined?(:TOC_RE)
# Renders the TOC with given headings # Renders the TOC with given headings
def replace_toc(text, headings) def replace_toc(text, headings)
text.gsub!(TOC_RE) do text.gsub!(TOC_RE) do
left_align, right_align = $2, $3
# Keep only the 4 first levels # Keep only the 4 first levels
headings = headings.select{|level, anchor, item| level <= 4} headings = headings.select{|level, anchor, item| level <= 4}
if headings.empty? if headings.empty?
'' ''
else else
div_class = 'toc' div_class = 'toc'
div_class << ' right' if $1 == '>' div_class << ' right' if right_align
div_class << ' left' if $1 == '<' div_class << ' left' if left_align
out = "<ul class=\"#{div_class}\"><li>" out = "<ul class=\"#{div_class}\"><li>"
root = headings.map(&:first).min root = headings.map(&:first).min
current = root current = root
@ -1327,7 +1332,7 @@ module ApplicationHelper
def api_meta(options) def api_meta(options)
if params[:nometa].present? || request.headers['X-Redmine-Nometa'] if params[:nometa].present? || request.headers['X-Redmine-Nometa']
# compatibility mode for activeresource clients that raise # compatibility mode for activeresource clients that raise
# an error when unserializing an array with attributes # an error when deserializing an array with attributes
nil nil
else else
options options

View File

@ -20,7 +20,7 @@
module ProjectsHelper module ProjectsHelper
def link_to_version(version, options = {}) def link_to_version(version, options = {})
return '' unless version && version.is_a?(Version) return '' unless version && version.is_a?(Version)
link_to_if version.visible?, format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, options link_to_if version.visible?, format_version_name(version), version_path(version), options
end end
def project_settings_tabs def project_settings_tabs
@ -51,6 +51,21 @@ module ProjectsHelper
content_tag('select', options.html_safe, :name => 'project[parent_id]', :id => 'project_parent_id') content_tag('select', options.html_safe, :name => 'project[parent_id]', :id => 'project_parent_id')
end end
def render_project_action_links
links = []
if User.current.allowed_to?(:add_project, nil, :global => true)
links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add')
end
if User.current.allowed_to?(:view_issues, nil, :global => true)
links << link_to(l(:label_issue_view_all), issues_path)
end
if User.current.allowed_to?(:view_time_entries, nil, :global => true)
links << link_to(l(:label_overall_spent_time), time_entries_path)
end
links << link_to(l(:label_overall_activity), activity_path)
links.join(" | ").html_safe
end
# Renders the projects index # Renders the projects index
def render_project_hierarchy(projects) def render_project_hierarchy(projects)
render_project_nested_lists(projects) do |project| render_project_nested_lists(projects) do |project|

View File

@ -18,6 +18,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module QueriesHelper module QueriesHelper
include ApplicationHelper
def filters_options_for_select(query) def filters_options_for_select(query)
options_for_select(filters_options(query)) options_for_select(filters_options(query))
end end
@ -81,7 +83,7 @@ module QueriesHelper
end end
def column_content(column, issue) def column_content(column, issue)
value = column.value(issue) value = column.value_object(issue)
if value.is_a?(Array) if value.is_a?(Array)
value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe
else else
@ -110,7 +112,7 @@ module QueriesHelper
end end
def csv_content(column, issue) def csv_content(column, issue)
value = column.value(issue) value = column.value_object(issue)
if value.is_a?(Array) if value.is_a?(Array)
value.collect {|v| csv_value(column, issue, v)}.compact.join(', ') value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
else else
@ -119,18 +121,16 @@ module QueriesHelper
end end
def csv_value(column, issue, value) def csv_value(column, issue, value)
case value.class.name format_object(value, false) do |value|
when 'Time' case value.class.name
format_time(value) when 'Float'
when 'Date' sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
format_date(value) when 'IssueRelation'
when 'Float' other = value.other_issue(issue)
sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator)) l(value.label_for(issue)) + " ##{other.id}"
when 'IssueRelation' else
other = value.other_issue(issue) value
l(value.label_for(issue)) + " ##{other.id}" end
else
value.to_s
end end
end end

View File

@ -84,12 +84,24 @@ module SettingsHelper
# Renders a notification field for a Redmine::Notifiable option # Renders a notification field for a Redmine::Notifiable option
def notification_field(notifiable) def notification_field(notifiable)
return content_tag(:label, tag_data = notifiable.parent.present? ?
check_box_tag('settings[notified_events][]', {:parent_notifiable => notifiable.parent} :
notifiable.name, {:disables => "input[data-parent-notifiable=#{notifiable.name}]"}
Setting.notified_events.include?(notifiable.name), :id => nil).html_safe +
l_or_humanize(notifiable.name, :prefix => 'label_').html_safe, tag = check_box_tag('settings[notified_events][]',
:class => notifiable.parent.present? ? "parent" : '').html_safe notifiable.name,
Setting.notified_events.include?(notifiable.name),
:id => nil,
:data => tag_data)
text = l_or_humanize(notifiable.name, :prefix => 'label_')
options = {}
if notifiable.parent.present?
options[:class] = "parent"
end
content_tag(:label, tag + text, options)
end end
def cross_project_subtasks_options def cross_project_subtasks_options

View File

@ -18,24 +18,78 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module WorkflowsHelper module WorkflowsHelper
def options_for_workflow_select(name, objects, selected, options={})
option_tags = ''.html_safe
multiple = false
if selected
if selected.size == objects.size
selected = 'all'
else
selected = selected.map(&:id)
if selected.size > 1
multiple = true
end
end
else
selected = objects.first.try(:id)
end
all_tag_options = {:value => 'all', :selected => (selected == 'all')}
if multiple
all_tag_options.merge!(:style => "display:none;")
end
option_tags << content_tag('option', l(:label_all), all_tag_options)
option_tags << options_from_collection_for_select(objects, "id", "name", selected)
select_tag name, option_tags, {:multiple => multiple}.merge(options)
end
def field_required?(field) def field_required?(field)
field.is_a?(CustomField) ? field.is_required? : %w(project_id tracker_id subject priority_id is_private).include?(field) field.is_a?(CustomField) ? field.is_required? : %w(project_id tracker_id subject priority_id is_private).include?(field)
end end
def field_permission_tag(permissions, status, field, role) def field_permission_tag(permissions, status, field, roles)
name = field.is_a?(CustomField) ? field.id.to_s : field name = field.is_a?(CustomField) ? field.id.to_s : field
options = [["", ""], [l(:label_readonly), "readonly"]] options = [["", ""], [l(:label_readonly), "readonly"]]
options << [l(:label_required), "required"] unless field_required?(field) options << [l(:label_required), "required"] unless field_required?(field)
html_options = {} html_options = {}
selected = permissions[status.id][name]
if perm = permissions[status.id][name]
if perm.uniq.size > 1 || perm.size < @roles.size * @trackers.size
options << [l(:label_no_change_option), "no_change"]
selected = 'no_change'
else
selected = perm.first
end
end
hidden = field.is_a?(CustomField) &&
!field.visible? &&
!roles.detect {|role| role.custom_fields.to_a.include?(field)}
hidden = field.is_a?(CustomField) && !field.visible? && !role.custom_fields.to_a.include?(field)
if hidden if hidden
options[0][0] = l(:label_hidden) options[0][0] = l(:label_hidden)
selected = '' selected = ''
html_options[:disabled] = true html_options[:disabled] = true
end end
select_tag("permissions[#{name}][#{status.id}]", options_for_select(options, selected), html_options) select_tag("permissions[#{status.id}][#{name}]", options_for_select(options, selected), html_options)
end
def transition_tag(workflows, old_status, new_status, name)
w = workflows.select {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id}.size
tag_name = "transitions[#{ old_status.id }][#{new_status.id}][#{name}]"
if w == 0 || w == @roles.size * @trackers.size
hidden_field_tag(tag_name, "0") +
check_box_tag(tag_name, "1", w != 0,
:class => "old-status-#{old_status.id} new-status-#{new_status.id}")
else
select_tag tag_name,
options_for_select([
[l(:general_text_Yes), "1"],
[l(:general_text_No), "0"],
[l(:label_no_change_option), "no_change"]
], "no_change")
end
end end
end end

View File

@ -114,7 +114,7 @@ class CustomField < ActiveRecord::Base
end end
def possible_values def possible_values
values = super() values = read_attribute(:possible_values)
if values.is_a?(Array) if values.is_a?(Array)
values.each do |value| values.each do |value|
value.force_encoding('UTF-8') if value.respond_to?(:force_encoding) value.force_encoding('UTF-8') if value.respond_to?(:force_encoding)
@ -128,7 +128,8 @@ class CustomField < ActiveRecord::Base
# Makes possible_values accept a multiline string # Makes possible_values accept a multiline string
def possible_values=(arg) def possible_values=(arg)
if arg.is_a?(Array) if arg.is_a?(Array)
super(arg.compact.collect(&:strip).select {|v| !v.blank?}) values = arg.compact.collect(&:strip).select {|v| !v.blank?}
write_attribute(:possible_values, values)
else else
self.possible_values = arg.to_s.split(/[\n\r]+/) self.possible_values = arg.to_s.split(/[\n\r]+/)
end end
@ -241,9 +242,7 @@ class CustomField < ActiveRecord::Base
errs << ::I18n.t('activerecord.errors.messages.blank') errs << ::I18n.t('activerecord.errors.messages.blank')
end end
end end
if custom_value.value.present? errs += format.validate_custom_value(custom_value)
errs += format.validate_custom_value(custom_value)
end
errs errs
end end

View File

@ -73,7 +73,7 @@ class Enumeration < ActiveRecord::Base
self.objects_count != 0 self.objects_count != 0
end end
# Is this enumeration overiding a system level enumeration? # Is this enumeration overriding a system level enumeration?
def is_override? def is_override?
!self.parent.nil? !self.parent.nil?
end end
@ -103,8 +103,14 @@ class Enumeration < ActiveRecord::Base
subclasses subclasses
end end
# Does the +new+ Hash override the previous Enumeration? # TODO: remove in Redmine 3.0
def self.overridding_change?(new, previous) def self.overridding_change?(new, previous)
ActiveSupport::Deprecation.warn "Enumeration#overridding_change? is deprecated and will be removed in Redmine 3.0. Please use #overriding_change?."
overriding_change?(new, previous)
end
# Does the +new+ Hash override the previous Enumeration?
def self.overriding_change?(new, previous)
if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous) if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous)
return false return false
else else

View File

@ -33,7 +33,7 @@ class Issue < ActiveRecord::Base
has_many :visible_journals, has_many :visible_journals,
:class_name => 'Journal', :class_name => 'Journal',
:as => :journalized, :as => :journalized,
:conditions => Proc.new { :conditions => Proc.new {
["(#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(User.current, :view_private_notes)}))", false] ["(#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(User.current, :view_private_notes)}))", false]
}, },
:readonly => true :readonly => true
@ -94,7 +94,7 @@ class Issue < ActiveRecord::Base
before_create :default_assign before_create :default_assign
before_save :close_duplicates, :update_done_ratio_from_issue_status, before_save :close_duplicates, :update_done_ratio_from_issue_status,
:force_updated_on_change, :update_closed_on, :set_assigned_to_was :force_updated_on_change, :update_closed_on, :set_assigned_to_was
after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?}
after_save :reschedule_following_issues, :update_nested_set_attributes, after_save :reschedule_following_issues, :update_nested_set_attributes,
:update_parent_attributes, :create_journal :update_parent_attributes, :create_journal
# Should be after_create but would be called before previous after_save callbacks # Should be after_create but would be called before previous after_save callbacks
@ -200,7 +200,7 @@ class Issue < ActiveRecord::Base
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields # Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
def available_custom_fields def available_custom_fields
(project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : [] (project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields) : []
end end
def visible_custom_field_values(user=nil) def visible_custom_field_values(user=nil)
@ -218,7 +218,7 @@ class Issue < ActiveRecord::Base
self.status = issue.status self.status = issue.status
self.author = User.current self.author = User.current
unless options[:attachments] == false unless options[:attachments] == false
self.attachments = issue.attachments.map do |attachement| self.attachments = issue.attachments.map do |attachement|
attachement.copy(:container => self) attachement.copy(:container => self)
end end
end end
@ -394,10 +394,10 @@ class Issue < ActiveRecord::Base
:if => lambda {|issue, user| user.allowed_to?(:add_issue_notes, issue.project)} :if => lambda {|issue, user| user.allowed_to?(:add_issue_notes, issue.project)}
safe_attributes 'private_notes', safe_attributes 'private_notes',
:if => lambda {|issue, user| !issue.new_record? && user.allowed_to?(:set_notes_private, issue.project)} :if => lambda {|issue, user| !issue.new_record? && user.allowed_to?(:set_notes_private, issue.project)}
safe_attributes 'watcher_user_ids', safe_attributes 'watcher_user_ids',
:if => lambda {|issue, user| issue.new_record? && user.allowed_to?(:add_issue_watchers, issue.project)} :if => lambda {|issue, user| issue.new_record? && user.allowed_to?(:add_issue_watchers, issue.project)}
safe_attributes 'is_private', safe_attributes 'is_private',
:if => lambda {|issue, user| :if => lambda {|issue, user|
@ -483,6 +483,11 @@ class Issue < ActiveRecord::Base
end end
end end
# Returns the custom fields that can be edited by the given user
def editable_custom_fields(user=nil)
editable_custom_field_values(user).map(&:custom_field).uniq
end
# Returns the names of attributes that are read-only for user or the current user # Returns the names of attributes that are read-only for user or the current user
# For users with multiple roles, the read-only fields are the intersection of # For users with multiple roles, the read-only fields are the intersection of
# read-only fields of each role # read-only fields of each role
@ -524,7 +529,7 @@ class Issue < ActiveRecord::Base
return {} if roles.empty? return {} if roles.empty?
result = {} result = {}
workflow_permissions = WorkflowPermission.where(:tracker_id => tracker_id, :old_status_id => status_id, :role_id => roles.map(&:id)).all workflow_permissions = WorkflowPermission.where(:tracker_id => tracker_id, :old_status_id => status_id, :role_id => roles.map(&:id))
if workflow_permissions.any? if workflow_permissions.any?
workflow_rules = workflow_permissions.inject({}) do |h, wp| workflow_rules = workflow_permissions.inject({}) do |h, wp|
h[wp.field_name] ||= [] h[wp.field_name] ||= []
@ -762,7 +767,7 @@ class Issue < ActiveRecord::Base
initial_status ||= status initial_status ||= status
initial_assigned_to_id = assigned_to_id_changed? ? assigned_to_id_was : assigned_to_id initial_assigned_to_id = assigned_to_id_changed? ? assigned_to_id_was : assigned_to_id
assignee_transitions_allowed = initial_assigned_to_id.present? && assignee_transitions_allowed = initial_assigned_to_id.present? &&
(user.id == initial_assigned_to_id || user.group_ids.include?(initial_assigned_to_id)) (user.id == initial_assigned_to_id || user.group_ids.include?(initial_assigned_to_id))
statuses = initial_status.find_new_statuses_allowed_to( statuses = initial_status.find_new_statuses_allowed_to(
@ -1056,7 +1061,7 @@ class Issue < ActiveRecord::Base
if leaf.start_date if leaf.start_date
# Only move subtask if it starts at the same date as the parent # Only move subtask if it starts at the same date as the parent
# or if it starts before the given date # or if it starts before the given date
if start_date == leaf.start_date || date > leaf.start_date if start_date == leaf.start_date || date > leaf.start_date
leaf.reschedule_on!(date) leaf.reschedule_on!(date)
end end
else else
@ -1107,7 +1112,10 @@ class Issue < ActiveRecord::Base
def self.update_versions_from_hierarchy_change(project) def self.update_versions_from_hierarchy_change(project)
moved_project_ids = project.self_and_descendants.reload.collect(&:id) moved_project_ids = project.self_and_descendants.reload.collect(&:id)
# Update issues of the moved projects and issues assigned to a version of a moved project # Update issues of the moved projects and issues assigned to a version of a moved project
Issue.update_versions(["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)", moved_project_ids, moved_project_ids]) Issue.update_versions(
["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)",
moved_project_ids, moved_project_ids]
)
end end
def parent_issue_id=(arg) def parent_issue_id=(arg)
@ -1191,13 +1199,13 @@ class Issue < ActiveRecord::Base
end end
def self.by_subproject(project) def self.by_subproject(project)
ActiveRecord::Base.connection.select_all("select s.id as status_id, ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed, s.is_closed as closed,
#{Issue.table_name}.project_id as project_id, #{Issue.table_name}.project_id as project_id,
count(#{Issue.table_name}.id) as total count(#{Issue.table_name}.id) as total
from from
#{Issue.table_name}, #{Project.table_name}, #{IssueStatus.table_name} s #{Issue.table_name}, #{Project.table_name}, #{IssueStatus.table_name} s
where where
#{Issue.table_name}.status_id=s.id #{Issue.table_name}.status_id=s.id
and #{Issue.table_name}.project_id = #{Project.table_name}.id and #{Issue.table_name}.project_id = #{Project.table_name}.id
and #{visible_condition(User.current, :project => project, :with_subprojects => true)} and #{visible_condition(User.current, :project => project, :with_subprojects => true)}
@ -1287,9 +1295,7 @@ class Issue < ActiveRecord::Base
if root_id.nil? if root_id.nil?
# issue was just created # issue was just created
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id) self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id)
set_default_left_and_right Issue.where(["id = ?", id]).update_all(["root_id = ?", root_id])
Issue.where(["id = ?", id]).
update_all(["root_id = ?, lft = ?, rgt = ?", root_id, lft, rgt])
if @parent_issue if @parent_issue
move_to_child_of(@parent_issue) move_to_child_of(@parent_issue)
end end
@ -1312,13 +1318,18 @@ class Issue < ActiveRecord::Base
move_to_right_of(root) move_to_right_of(root)
end end
old_root_id = root_id old_root_id = root_id
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id ) in_tenacious_transaction do
target_maxright = nested_set_scope.maximum(right_column_name) || 0 @parent_issue.reload_nested_set if @parent_issue
offset = target_maxright + 1 - lft self.reload_nested_set
Issue.where(["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]). self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id)
update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset]) cond = ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]
self[left_column_name] = lft + offset self.class.base_class.select('id').lock(true).where(cond)
self[right_column_name] = rgt + offset offset = right_most_bound + 1 - lft
Issue.where(cond).
update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset])
self[left_column_name] = lft + offset
self[right_column_name] = rgt + offset
end
if @parent_issue if @parent_issue
move_to_child_of(@parent_issue) move_to_child_of(@parent_issue)
end end
@ -1430,7 +1441,7 @@ class Issue < ActiveRecord::Base
def close_duplicates def close_duplicates
if closing? if closing?
duplicates.each do |duplicate| duplicates.each do |duplicate|
# Reload is need in case the duplicate was updated by a previous duplicate # Reload is needed in case the duplicate was updated by a previous duplicate
duplicate.reload duplicate.reload
# Don't re-close it if it's already closed # Don't re-close it if it's already closed
next if duplicate.closed? next if duplicate.closed?
@ -1485,11 +1496,11 @@ class Issue < ActiveRecord::Base
before = @custom_values_before_change[c.custom_field_id] before = @custom_values_before_change[c.custom_field_id]
after = c.value after = c.value
next if before == after || (before.blank? && after.blank?) next if before == after || (before.blank? && after.blank?)
if before.is_a?(Array) || after.is_a?(Array) if before.is_a?(Array) || after.is_a?(Array)
before = [before] unless before.is_a?(Array) before = [before] unless before.is_a?(Array)
after = [after] unless after.is_a?(Array) after = [after] unless after.is_a?(Array)
# values removed # values removed
(before - after).reject(&:blank?).each do |value| (before - after).reject(&:blank?).each do |value|
@current_journal.details << JournalDetail.new(:property => 'cf', @current_journal.details << JournalDetail.new(:property => 'cf',
@ -1550,14 +1561,14 @@ class Issue < ActiveRecord::Base
where = "#{Issue.table_name}.#{select_field}=j.id" where = "#{Issue.table_name}.#{select_field}=j.id"
ActiveRecord::Base.connection.select_all("select s.id as status_id, ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed, s.is_closed as closed,
j.id as #{select_field}, j.id as #{select_field},
count(#{Issue.table_name}.id) as total count(#{Issue.table_name}.id) as total
from from
#{Issue.table_name}, #{Project.table_name}, #{IssueStatus.table_name} s, #{joins} j #{Issue.table_name}, #{Project.table_name}, #{IssueStatus.table_name} s, #{joins} j
where where
#{Issue.table_name}.status_id=s.id #{Issue.table_name}.status_id=s.id
and #{where} and #{where}
and #{Issue.table_name}.project_id=#{Project.table_name}.id and #{Issue.table_name}.project_id=#{Project.table_name}.id
and #{visible_condition(User.current, :project => project)} and #{visible_condition(User.current, :project => project)}

View File

@ -333,8 +333,9 @@ class IssueQuery < Query
limit(options[:limit]). limit(options[:limit]).
offset(options[:offset]) offset(options[:offset])
if has_custom_field_column? scope = scope.preload(:custom_values)
scope = scope.preload(:custom_values) if has_column?(:author)
scope = scope.preload(:author)
end end
issues = scope.all issues = scope.all

View File

@ -80,15 +80,20 @@ class Journal < ActiveRecord::Base
end end
end end
# Returns the JournalDetail for the given attribute, or nil if the attribute
# was not updated
def detail_for_attribute(attribute)
details.detect {|detail| detail.prop_key == attribute}
end
# Returns the new status if the journal contains a status change, otherwise nil # Returns the new status if the journal contains a status change, otherwise nil
def new_status def new_status
c = details.detect {|detail| detail.prop_key == 'status_id'} s = new_value_for('status_id')
(c && c.value) ? IssueStatus.find_by_id(c.value.to_i) : nil s ? IssueStatus.find_by_id(s.to_i) : nil
end end
def new_value_for(prop) def new_value_for(prop)
c = details.detect {|detail| detail.prop_key == prop} detail_for_attribute(prop).try(:value)
c ? c.value : nil
end end
def editable_by?(usr) def editable_by?(usr)
@ -185,6 +190,7 @@ class Journal < ActiveRecord::Base
if notify? && (Setting.notified_events.include?('issue_updated') || if notify? && (Setting.notified_events.include?('issue_updated') ||
(Setting.notified_events.include?('issue_note_added') && notes.present?) || (Setting.notified_events.include?('issue_note_added') && notes.present?) ||
(Setting.notified_events.include?('issue_status_updated') && new_status.present?) || (Setting.notified_events.include?('issue_status_updated') && new_status.present?) ||
(Setting.notified_events.include?('issue_assigned_to_updated') && detail_for_attribute('assigned_to_id').present?) ||
(Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?) (Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?)
) )
Mailer.deliver_issue_edit(self) Mailer.deliver_issue_edit(self)

View File

@ -46,6 +46,14 @@ class MailHandler < ActionMailer::Base
super(email) super(email)
end end
# Receives an email and rescues any exception
def self.safe_receive(*args)
receive(*args)
rescue => e
logger.error "An unexpected error occurred when receiving email: #{e.message}" if logger
return false
end
# Extracts MailHandler options from environment variables # Extracts MailHandler options from environment variables
# Use when receiving emails with rake tasks # Use when receiving emails with rake tasks
def self.extract_options_from_env(env) def self.extract_options_from_env(env)
@ -190,6 +198,7 @@ class MailHandler < ActionMailer::Base
issue.subject = '(no subject)' issue.subject = '(no subject)'
end end
issue.description = cleaned_up_text_body issue.description = cleaned_up_text_body
issue.start_date ||= Date.today if Setting.default_issue_start_date_to_creation_date?
# add To and Cc as watchers before saving so the watchers can reply to Redmine # add To and Cc as watchers before saving so the watchers can reply to Redmine
add_watchers(issue) add_watchers(issue)

View File

@ -80,7 +80,7 @@ class Mailer < ActionMailer::Base
def self.deliver_issue_edit(journal) def self.deliver_issue_edit(journal)
issue = journal.journalized.reload issue = journal.journalized.reload
to = journal.notified_users to = journal.notified_users
cc = journal.notified_watchers cc = journal.notified_watchers - to
journal.each_notification(to + cc) do |users| journal.each_notification(to + cc) do |users|
issue.each_notification(users) do |users2| issue.each_notification(users) do |users2|
Mailer.issue_edit(journal, to & users2, cc & users2).deliver Mailer.issue_edit(journal, to & users2, cc & users2).deliver
@ -464,7 +464,7 @@ class Mailer < ActionMailer::Base
if rand if rand
hash << Redmine::Utils.random_hex(8) hash << Redmine::Utils.random_hex(8)
end end
host = Setting.mail_from.to_s.gsub(%r{^.*@}, '') host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '')
host = "#{::Socket.gethostname}.redmine" if host.empty? host = "#{::Socket.gethostname}.redmine" if host.empty?
"#{hash.join('.')}@#{host}" "#{hash.join('.')}@#{host}"
end end

View File

@ -89,7 +89,7 @@ class Member < ActiveRecord::Base
end end
end end
# Find or initilize a Member with an id, attributes, and for a Principal # Find or initialize a Member with an id, attributes, and for a Principal
def self.edit_membership(id, new_attributes, principal=nil) def self.edit_membership(id, new_attributes, principal=nil)
@membership = id.present? ? Member.find(id) : Member.new(:principal => principal) @membership = id.present? ? Member.find(id) : Member.new(:principal => principal)
@membership.attributes = new_attributes @membership.attributes = new_attributes

View File

@ -51,7 +51,7 @@ class News < ActiveRecord::Base
end end
def recipients def recipients
project.users.select {|user| user.notify_about?(self)}.map(&:mail) project.users.select {|user| user.notify_about?(self) && user.allowed_to?(:view_news, project)}.map(&:mail)
end end
# Returns the email addresses that should be cc'd when a new news is added # Returns the email addresses that should be cc'd when a new news is added

View File

@ -26,7 +26,7 @@ class Project < ActiveRecord::Base
# Maximum length for project identifiers # Maximum length for project identifiers
IDENTIFIER_MAX_LENGTH = 100 IDENTIFIER_MAX_LENGTH = 100
# Specific overidden Activities # Specific overridden Activities
has_many :time_entry_activities has_many :time_entry_activities
has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}" has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}"
has_many :memberships, :class_name => 'Member' has_many :memberships, :class_name => 'Member'
@ -74,7 +74,7 @@ class Project < ActiveRecord::Base
validates_length_of :name, :maximum => 255 validates_length_of :name, :maximum => 255
validates_length_of :homepage, :maximum => 255 validates_length_of :homepage, :maximum => 255
validates_length_of :identifier, :in => 1..IDENTIFIER_MAX_LENGTH validates_length_of :identifier, :in => 1..IDENTIFIER_MAX_LENGTH
# donwcase letters, digits, dashes but not digits only # downcase letters, digits, dashes but not digits only
validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? } validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? }
# reserved words # reserved words
validates_exclusion_of :identifier, :in => %w( new ) validates_exclusion_of :identifier, :in => %w( new )
@ -252,10 +252,10 @@ class Project < ActiveRecord::Base
parent_activity = TimeEntryActivity.find(activity['parent_id']) parent_activity = TimeEntryActivity.find(activity['parent_id'])
activity['name'] = parent_activity.name activity['name'] = parent_activity.name
activity['position'] = parent_activity.position activity['position'] = parent_activity.position
if Enumeration.overridding_change?(activity, parent_activity) if Enumeration.overriding_change?(activity, parent_activity)
project_activity = self.time_entry_activities.create(activity) project_activity = self.time_entry_activities.create(activity)
if project_activity.new_record? if project_activity.new_record?
raise ActiveRecord::Rollback, "Overridding TimeEntryActivity was not successfully saved" raise ActiveRecord::Rollback, "Overriding TimeEntryActivity was not successfully saved"
else else
self.time_entries. self.time_entries.
where(["activity_id = ?", parent_activity.id]). where(["activity_id = ?", parent_activity.id]).
@ -502,7 +502,7 @@ class Project < ActiveRecord::Base
assignable.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal}.sort assignable.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal}.sort
end end
# Returns the mail adresses of users that should be always notified on project events # Returns the mail addresses of users that should be always notified on project events
def recipients def recipients
notified_users.collect {|user| user.mail} notified_users.collect {|user| user.mail}
end end
@ -514,7 +514,7 @@ class Project < ActiveRecord::Base
end end
# Returns a scope of all custom fields enabled for project issues # Returns a scope of all custom fields enabled for project issues
# (explictly associated custom fields and custom fields enabled for all projects) # (explicitly associated custom fields and custom fields enabled for all projects)
def all_issue_custom_fields def all_issue_custom_fields
@all_issue_custom_fields ||= IssueCustomField. @all_issue_custom_fields ||= IssueCustomField.
sorted. sorted.
@ -847,7 +847,7 @@ class Project < ActiveRecord::Base
# Copies issues from +project+ # Copies issues from +project+
def copy_issues(project) def copy_issues(project)
# Stores the source issue id as a key and the copied issues as the # Stores the source issue id as a key and the copied issues as the
# value. Used to map the two togeather for issue relations. # value. Used to map the two together for issue relations.
issues_map = {} issues_map = {}
# Store status and reopen locked/closed versions # Store status and reopen locked/closed versions

View File

@ -57,6 +57,10 @@ class QueryColumn
object.send name object.send name
end end
def value_object(object)
object.send name
end
def css_classes def css_classes
name name
end end
@ -80,10 +84,21 @@ class QueryCustomFieldColumn < QueryColumn
@cf @cf
end end
def value(object) def value_object(object)
if custom_field.visible_by?(object.project, User.current) if custom_field.visible_by?(object.project, User.current)
cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)} cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}
cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first cv.size > 1 ? cv.sort {|a,b| a.value.to_s <=> b.value.to_s} : cv.first
else
nil
end
end
def value(object)
raw = value_object(object)
if raw.is_a?(Array)
raw.map {|r| @cf.cast_value(r.value)}
elsif raw
@cf.cast_value(raw.value)
else else
nil nil
end end
@ -105,7 +120,7 @@ class QueryAssociationCustomFieldColumn < QueryCustomFieldColumn
@association = association @association = association
end end
def value(object) def value_object(object)
if assoc = object.send(@association) if assoc = object.send(@association)
super(assoc) super(assoc)
end end
@ -144,8 +159,8 @@ class Query < ActiveRecord::Base
after_save do |query| after_save do |query|
if query.visibility_changed? && query.visibility != VISIBILITY_ROLES if query.visibility_changed? && query.visibility != VISIBILITY_ROLES
query.roles.clear query.roles.clear
end end
end end
class_attribute :operators class_attribute :operators
@ -541,7 +556,7 @@ class Query < ActiveRecord::Base
next unless v and !v.empty? next unless v and !v.empty?
operator = operator_for(field) operator = operator_for(field)
# "me" value subsitution # "me" value substitution
if %w(assigned_to_id author_id user_id watcher_id).include?(field) if %w(assigned_to_id author_id user_id watcher_id).include?(field)
if v.delete("me") if v.delete("me")
if User.current.logged? if User.current.logged?

View File

@ -40,7 +40,7 @@ class Repository < ActiveRecord::Base
validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true
validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? } validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true
validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph) validates_exclusion_of :identifier, :in => %w(browse show entry raw changes annotate diff statistics graph revisions revision)
# donwcase letters, digits, dashes, underscores but not digits only # donwcase letters, digits, dashes, underscores but not digits only
validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :allow_blank => true validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :allow_blank => true
# Checks if the SCM is enabled when creating a repository # Checks if the SCM is enabled when creating a repository

View File

@ -138,9 +138,9 @@ class Repository::Cvs < Repository
# is not exclusive at all. # is not exclusive at all.
tmp_time = revision.time.clone tmp_time = revision.time.clone
unless filechanges.find_by_path_and_revision( unless filechanges.find_by_path_and_revision(
scm.with_leading_slash(revision.paths[0][:path]), scm.with_leading_slash(revision.paths[0][:path]),
revision.paths[0][:revision] revision.paths[0][:revision]
) )
cmt = Changeset.normalize_comments(revision.message, repo_log_encoding) cmt = Changeset.normalize_comments(revision.message, repo_log_encoding)
author_utf8 = Changeset.to_utf8(revision.author, repo_log_encoding) author_utf8 = Changeset.to_utf8(revision.author, repo_log_encoding)
cs = changesets.where( cs = changesets.where(
@ -150,7 +150,7 @@ class Repository::Cvs < Repository
).first ).first
# create a new changeset.... # create a new changeset....
unless cs unless cs
# we use a temporaray revision number here (just for inserting) # we use a temporary revision number here (just for inserting)
# later on, we calculate a continous positive number # later on, we calculate a continous positive number
tmp_time2 = tmp_time.clone.gmtime tmp_time2 = tmp_time.clone.gmtime
branch = revision.paths[0][:branch] branch = revision.paths[0][:branch]

View File

@ -155,7 +155,7 @@ class Repository::Mercurial < Repository
# Revisions in root directory and sub directory are not equal. # Revisions in root directory and sub directory are not equal.
# So, in order to get correct limit, we need to get all revisions. # So, in order to get correct limit, we need to get all revisions.
# But, it is very heavy. # But, it is very heavy.
# Mercurial does not treat direcotry. # Mercurial does not treat directory.
# So, "hg log DIR" is very heavy. # So, "hg log DIR" is very heavy.
branch_limit = path.blank? ? limit : ( limit * 5 ) branch_limit = path.blank? ? limit : ( limit * 5 )
args << nodes_in_branch(rev, branch_limit) args << nodes_in_branch(rev, branch_limit)

View File

@ -77,6 +77,16 @@ class TimeEntry < ActiveRecord::Base
end end
end end
def safe_attributes=(attrs, user=User.current)
attrs = super
if !new_record? && issue && issue.project_id != project_id
if user.allowed_to?(:log_time, issue.project)
self.project_id = issue.project_id
end
end
attrs
end
def set_project_if_nil def set_project_if_nil
self.project = issue.project if issue && project.nil? self.project = issue.project if issue && project.nil?
end end

View File

@ -384,8 +384,8 @@ class User < Principal
# Find a user account by matching the exact login and then a case-insensitive # Find a user account by matching the exact login and then a case-insensitive
# version. Exact matches will be given priority. # version. Exact matches will be given priority.
def self.find_by_login(login) def self.find_by_login(login)
login = Redmine::CodesetUtil.replace_invalid_utf8(login.to_s)
if login.present? if login.present?
login = login.to_s
# First look for an exact match # First look for an exact match
user = where(:login => login).detect {|u| u.login == login} user = where(:login => login).detect {|u| u.login == login}
unless user unless user
@ -626,11 +626,11 @@ class User < Principal
end end
def self.current=(user) def self.current=(user)
Thread.current[:current_user] = user RequestStore.store[:current_user] = user
end end
def self.current def self.current
Thread.current[:current_user] ||= User.anonymous RequestStore.store[:current_user] ||= User.anonymous
end end
# Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only # Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only

View File

@ -256,7 +256,7 @@ class Version < ActiveRecord::Base
# Returns the average estimated time of assigned issues # Returns the average estimated time of assigned issues
# or 1 if no issue has an estimated time # or 1 if no issue has an estimated time
# Used to weigth unestimated issues in progress calculation # Used to weight unestimated issues in progress calculation
def estimated_average def estimated_average
if @estimated_average.nil? if @estimated_average.nil?
average = fixed_issues.average(:estimated_hours).to_f average = fixed_issues.average(:estimated_hours).to_f

View File

@ -40,7 +40,7 @@ class WikiContent < ActiveRecord::Base
page.nil? ? [] : page.attachments page.nil? ? [] : page.attachments
end end
# Returns the mail adresses of users that should be notified # Returns the mail addresses of users that should be notified
def recipients def recipients
notified = project.notified_users notified = project.notified_users
notified.reject! {|user| !visible?(user)} notified.reject! {|user| !visible?(user)}

View File

@ -104,9 +104,11 @@ class WikiPage < ActiveRecord::Base
end end
def content_for_version(version=nil) def content_for_version(version=nil)
result = content.versions.find_by_version(version.to_i) if version if content
result ||= content result = content.versions.find_by_version(version.to_i) if version
result result ||= content
result
end
end end
def diff(version_to=nil, version_from=nil) def diff(version_to=nil, version_from=nil)

View File

@ -19,20 +19,43 @@ class WorkflowPermission < WorkflowRule
validates_inclusion_of :rule, :in => %w(readonly required) validates_inclusion_of :rule, :in => %w(readonly required)
validate :validate_field_name validate :validate_field_name
# Replaces the workflow permissions for the given tracker and role # Returns the workflow permissions for the given trackers and roles
# grouped by status_id
# #
# Example: # Example:
# WorkflowPermission.replace_permissions role, tracker, {'due_date' => {'1' => 'readonly', '2' => 'required'}} # WorkflowPermission.rules_by_status_id trackers, roles
def self.replace_permissions(tracker, role, permissions) # # => {1 => {'start_date' => 'required', 'due_date' => 'readonly'}}
destroy_all(:tracker_id => tracker.id, :role_id => role.id) def self.rules_by_status_id(trackers, roles)
WorkflowPermission.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).inject({}) do |h, w|
h[w.old_status_id] ||= {}
h[w.old_status_id][w.field_name] ||= []
h[w.old_status_id][w.field_name] << w.rule
h
end
end
permissions.each { |field, rule_by_status_id| # Replaces the workflow permissions for the given trackers and roles
rule_by_status_id.each { |status_id, rule| #
if rule.present? # Example:
WorkflowPermission.create(:role_id => role.id, :tracker_id => tracker.id, :old_status_id => status_id, :field_name => field, :rule => rule) # WorkflowPermission.replace_permissions trackers, roles, {'1' => {'start_date' => 'required', 'due_date' => 'readonly'}}
end def self.replace_permissions(trackers, roles, permissions)
trackers = Array.wrap trackers
roles = Array.wrap roles
transaction do
permissions.each { |status_id, rule_by_field|
rule_by_field.each { |field, rule|
destroy_all(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id), :old_status_id => status_id, :field_name => field)
if rule.present?
trackers.each do |tracker|
roles.each do |role|
WorkflowPermission.create(:role_id => role.id, :tracker_id => tracker.id, :old_status_id => status_id, :field_name => field, :rule => rule)
end
end
end
}
} }
} end
end end
protected protected

View File

@ -21,9 +21,8 @@ class WorkflowTransition < WorkflowRule
# Returns workflow transitions count by tracker and role # Returns workflow transitions count by tracker and role
def self.count_by_tracker_and_role def self.count_by_tracker_and_role
counts = connection.select_all("SELECT role_id, tracker_id, count(id) AS c FROM #{table_name} WHERE type = 'WorkflowTransition' GROUP BY role_id, tracker_id") counts = connection.select_all("SELECT role_id, tracker_id, count(id) AS c FROM #{table_name} WHERE type = 'WorkflowTransition' GROUP BY role_id, tracker_id")
roles = Role.sorted.all roles = Role.sorted
trackers = Tracker.sorted.all trackers = Tracker.sorted
result = [] result = []
trackers.each do |tracker| trackers.each do |tracker|
t = [] t = []
@ -33,7 +32,71 @@ class WorkflowTransition < WorkflowRule
end end
result << [tracker, t] result << [tracker, t]
end end
result result
end end
def self.replace_transitions(trackers, roles, transitions)
trackers = Array.wrap trackers
roles = Array.wrap roles
transaction do
records = WorkflowTransition.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).all
transitions.each do |old_status_id, transitions_by_new_status|
transitions_by_new_status.each do |new_status_id, transition_by_rule|
transition_by_rule.each do |rule, transition|
trackers.each do |tracker|
roles.each do |role|
w = records.select {|r|
r.old_status_id == old_status_id.to_i &&
r.new_status_id == new_status_id.to_i &&
r.tracker_id == tracker.id &&
r.role_id == role.id &&
!r.destroyed?
}
if rule == 'always'
w = w.select {|r| !r.author && !r.assignee}
else
w = w.select {|r| r.author || r.assignee}
end
if w.size > 1
w[1..-1].each(&:destroy)
end
w = w.first
if transition == "1" || transition == true
unless w
w = WorkflowTransition.new(:old_status_id => old_status_id, :new_status_id => new_status_id, :tracker_id => tracker.id, :role_id => role.id)
records << w
end
w.author = true if rule == "author"
w.assignee = true if rule == "assignee"
w.save if w.changed?
elsif w
if rule == 'always'
w.destroy
elsif rule == 'author'
if w.assignee
w.author = false
w.save if w.changed?
else
w.destroy
end
elsif rule == 'assignee'
if w.author
w.assignee = false
w.save if w.changed?
else
w.destroy
end
end
end
end
end
end
end
end
end
end
end end

View File

@ -9,11 +9,55 @@
<%= content_tag('span', link_to(h(plugin.url), plugin.url), :class => 'url') unless plugin.url.blank? %> <%= content_tag('span', link_to(h(plugin.url), plugin.url), :class => 'url') unless plugin.url.blank? %>
</td> </td>
<td class="author"><%= plugin.author_url.blank? ? h(plugin.author) : link_to(h(plugin.author), plugin.author_url) %></td> <td class="author"><%= plugin.author_url.blank? ? h(plugin.author) : link_to(h(plugin.author), plugin.author_url) %></td>
<td class="version"><%=h plugin.version %></td> <td class="version"><span class="icon"><%= plugin.version %></span></td>
<td class="configure"><%= link_to(l(:button_configure), plugin_settings_path(plugin)) if plugin.configurable? %></td> <td class="configure"><%= link_to(l(:button_configure), plugin_settings_path(plugin)) if plugin.configurable? %></td>
</tr> </tr>
<% end %> <% end %>
</table> </table>
<p><a href="#" id="check-for-updates"><%= l(:label_check_for_updates) %></a></p>
<% else %> <% else %>
<p class="nodata"><%= l(:label_no_data) %></p> <p class="nodata"><%= l(:label_no_data) %></p>
<% end %> <% end %>
<%= javascript_tag do %>
$(document).ready(function(){
$("#check-for-updates").click(function(e){
e.preventDefault();
$.ajax({
dataType: "jsonp",
url: "http://www.redmine.org/plugins/check_updates",
data: <%= raw_json plugin_data_for_updates(@plugins) %>,
timeout: 3000,
beforeSend: function(){
$('#ajax-indicator').show();
},
success: function(data){
$('#ajax-indicator').hide();
$("table.plugins td.version span").addClass("unknown");
$.each(data, function(plugin_id, plugin_data){
var s = $("tr#plugin-"+plugin_id+" td.version span");
s.removeClass("icon-checked icon-warning unknown");
if (plugin_data.url) {
if (s.parent("a").length>0) {
s.unwrap();
}
s.addClass("found");
s.wrap($("<a></a>").attr("href", plugin_data.url).attr("target", "_blank"));
}
if (plugin_data.c == s.text()) {
s.addClass("icon-checked");
} else if (plugin_data.c) {
s.addClass("icon-warning");
s.attr("title", "<%= escape_javascript l(:label_latest_compatible_version) %>: "+plugin_data.c);
}
});
$("table.plugins td.version span.unknown").addClass("icon-help").attr("title", "<%= escape_javascript l(:label_unknown_plugin) %>");
},
error: function(){
$('#ajax-indicator').hide();
alert("Unable to retrieve plugin informations from www.redmine.org");
}
});
});
});
<% end if @plugins.any? %>

View File

@ -8,8 +8,8 @@
<% end -%> <% end -%>
</ul> </ul>
<div class="tabs-buttons" style="display:none;"> <div class="tabs-buttons" style="display:none;">
<button class="tab-left" onclick="moveTabLeft(this);"></button> <button class="tab-left" onclick="moveTabLeft(this); return false;"></button>
<button class="tab-right" onclick="moveTabRight(this);"></button> <button class="tab-right" onclick="moveTabRight(this); return false;"></button>
</div> </div>
</div> </div>

View File

@ -2,9 +2,9 @@
<div class="splitcontentleft"> <div class="splitcontentleft">
<div class="box tabular"> <div class="box tabular">
<p><%= f.select :field_format, custom_field_formats_for_select(@custom_field), {}, :disabled => !@custom_field.new_record? %></p>
<p><%= f.text_field :name, :required => true %></p> <p><%= f.text_field :name, :required => true %></p>
<p><%= f.text_area :description, :rows => 7 %></p> <p><%= f.text_area :description, :rows => 7 %></p>
<p><%= f.select :field_format, custom_field_formats_for_select(@custom_field), {}, :disabled => !@custom_field.new_record? %></p>
<% if @custom_field.format.multiple_supported %> <% if @custom_field.format.multiple_supported %>
<p> <p>

View File

@ -27,12 +27,12 @@ api.array :custom_fields do
end end
if field.is_a?(IssueCustomField) if field.is_a?(IssueCustomField)
api.trackers do api.array :trackers do
field.trackers.each do |tracker| field.trackers.each do |tracker|
api.tracker :id => tracker.id, :name => tracker.name api.tracker :id => tracker.id, :name => tracker.name
end end
end end
api.roles do api.array :roles do
field.roles.each do |role| field.roles.each do |role|
api.role :id => role.id, :name => role.name api.role :id => role.id, :name => role.name
end end

View File

@ -8,7 +8,7 @@
<tbody> <tbody>
<% @group.users.sort.each do |user| %> <% @group.users.sort.each do |user| %>
<tr id="user-<%= user.id %>" class="<%= cycle 'odd', 'even' %>"> <tr id="user-<%= user.id %>" class="<%= cycle 'odd', 'even' %>">
<td class="user"><%= link_to_user user %></td> <td class="name"><%= link_to_user user %></td>
<td class="buttons"> <td class="buttons">
<%= delete_link group_user_path(@group, :user_id => user), :remote => true %> <%= delete_link group_user_path(@group, :user_id => user), :remote => true %>
</td> </td>

View File

@ -43,3 +43,13 @@
<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %> <%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
<% end %> <% end %>
<% heads_for_wiki_formatter %>
<%= javascript_tag do %>
$(document).ready(function(){
$("#issue_tracker_id, #issue_status_id").each(function(){
$(this).val($(this).find("option[selected=selected]").val());
});
});
<% end %>

View File

@ -3,12 +3,7 @@
<% end %> <% end %>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %> <%= render_project_action_links %>
<%= link_to(l(:label_issue_view_all), issues_path) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
<%= link_to(l(:label_overall_spent_time), time_entries_path) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
<%= link_to l(:label_overall_activity),
{ :controller => 'activities', :action => 'index',
:id => nil } %>
</div> </div>
<h2><%= l(:label_project_plural) %></h2> <h2><%= l(:label_project_plural) %></h2>

View File

@ -23,8 +23,10 @@
:ondblclick => "moveOptions(this.form.selected_columns, this.form.available_columns);" %> :ondblclick => "moveOptions(this.form.selected_columns, this.form.available_columns);" %>
</td> </td>
<td class="buttons"> <td class="buttons">
<input type="button" value="&#8648;" onclick="moveOptionTop(this.form.selected_columns);" /><br />
<input type="button" value="&#8593;" onclick="moveOptionUp(this.form.selected_columns);" /><br /> <input type="button" value="&#8593;" onclick="moveOptionUp(this.form.selected_columns);" /><br />
<input type="button" value="&#8595;" onclick="moveOptionDown(this.form.selected_columns);" /> <input type="button" value="&#8595;" onclick="moveOptionDown(this.form.selected_columns);" /><br />
<input type="button" value="&#8650;" onclick="moveOptionBottom(this.form.selected_columns);" />
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -1,4 +1,4 @@
<table class="list transitions transitions-<%= name %>"> <table class="list workflows transitions transitions-<%= name %>">
<thead> <thead>
<tr> <tr>
<th> <th>
@ -31,8 +31,7 @@
<% for new_status in @statuses -%> <% for new_status in @statuses -%>
<% checked = workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id} %> <% checked = workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id} %>
<td class="<%= checked ? 'enabled' : '' %>"> <td class="<%= checked ? 'enabled' : '' %>">
<%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, checked, <%= transition_tag workflows, old_status, new_status, name %>
:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>
</td> </td>
<% end -%> <% end -%>
</tr> </tr>

View File

@ -4,8 +4,8 @@
<div class="tabs"> <div class="tabs">
<ul> <ul>
<li><%= link_to l(:label_status_transitions), {:action => 'edit', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li> <li><%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %></li>
<li><%= link_to l(:label_fields_permissions), {:action => 'permissions', :role_id => @role, :tracker_id => @tracker} %></li> <li><%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers) %></li>
</ul> </ul>
</div> </div>
@ -14,10 +14,14 @@
<%= form_tag({}, :method => 'get') do %> <%= form_tag({}, :method => 'get') do %>
<p> <p>
<label><%=l(:label_role)%>: <label><%=l(:label_role)%>:
<%= select_tag 'role_id', options_from_collection_for_select(@roles, "id", "name", @role && @role.id) %></label> <%= options_for_workflow_select 'role_id[]', Role.sorted, @roles, :id => 'role_id', :class => 'expandable' %>
</label>
<a href="#" data-expands="#role_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
<label><%=l(:label_tracker)%>: <label><%=l(:label_tracker)%>:
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label> <%= options_for_workflow_select 'tracker_id[]', Tracker.sorted, @trackers, :id => 'tracker_id', :class => 'expandable' %>
</label>
<a href="#" data-expands="#tracker_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
<%= submit_tag l(:button_edit), :name => nil %> <%= submit_tag l(:button_edit), :name => nil %>
@ -27,10 +31,10 @@
</p> </p>
<% end %> <% end %>
<% if @tracker && @role && @statuses.any? %> <% if @trackers && @roles && @statuses.any? %>
<%= form_tag({}, :id => 'workflow_form' ) do %> <%= form_tag({}, :id => 'workflow_form' ) do %>
<%= hidden_field_tag 'tracker_id', @tracker.id %> <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id}.join.html_safe %>
<%= hidden_field_tag 'role_id', @role.id %> <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id}.join.html_safe %>
<%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %> <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %>
<div class="autoscroll"> <div class="autoscroll">
<%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %> <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %>
@ -54,3 +58,18 @@
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
<% end %> <% end %>
<%= javascript_tag do %>
$("a[data-expands]").click(function(e){
e.preventDefault();
var target = $($(this).attr("data-expands"));
if (target.attr("multiple")) {
target.attr("multiple", false);
target.find("option[value=all]").show();
} else {
target.attr("multiple", true);
target.find("option[value=all]").attr("selected", false).hide();
}
});
<% end %>

View File

@ -4,8 +4,8 @@
<div class="tabs"> <div class="tabs">
<ul> <ul>
<li><%= link_to l(:label_status_transitions), {:action => 'edit', :role_id => @role, :tracker_id => @tracker} %></li> <li><%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers) %></li>
<li><%= link_to l(:label_fields_permissions), {:action => 'permissions', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li> <li><%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %></li>
</ul> </ul>
</div> </div>
@ -14,10 +14,14 @@
<%= form_tag({}, :method => 'get') do %> <%= form_tag({}, :method => 'get') do %>
<p> <p>
<label><%=l(:label_role)%>: <label><%=l(:label_role)%>:
<%= select_tag 'role_id', options_from_collection_for_select(@roles, "id", "name", @role && @role.id) %></label> <%= options_for_workflow_select 'role_id[]', Role.sorted, @roles, :id => 'role_id', :class => 'expandable' %>
</label>
<a href="#" data-expands="#role_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
<label><%=l(:label_tracker)%>: <label><%=l(:label_tracker)%>:
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label> <%= options_for_workflow_select 'tracker_id[]', Tracker.sorted, @trackers, :id => 'tracker_id', :class => 'expandable' %>
</label>
<a href="#" data-expands="#tracker_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
<%= submit_tag l(:button_edit), :name => nil %> <%= submit_tag l(:button_edit), :name => nil %>
@ -26,13 +30,13 @@
</p> </p>
<% end %> <% end %>
<% if @tracker && @role && @statuses.any? %> <% if @trackers && @roles && @statuses.any? %>
<%= form_tag({}, :id => 'workflow_form' ) do %> <%= form_tag({}, :id => 'workflow_form' ) do %>
<%= hidden_field_tag 'tracker_id', @tracker.id %> <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id}.join.html_safe %>
<%= hidden_field_tag 'role_id', @role.id %> <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id}.join.html_safe %>
<%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %> <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %>
<div class="autoscroll"> <div class="autoscroll">
<table class="list fields_permissions"> <table class="list workflows fields_permissions">
<thead> <thead>
<tr> <tr>
<th> <th>
@ -62,7 +66,7 @@
</td> </td>
<% for status in @statuses -%> <% for status in @statuses -%>
<td class="<%= @permissions[status.id][field] %>"> <td class="<%= @permissions[status.id][field] %>">
<%= field_permission_tag(@permissions, status, field, @role) %> <%= field_permission_tag(@permissions, status, field, @roles) %>
<% unless status == @statuses.last %><a href="#" class="repeat-value">&#187;</a><% end %> <% unless status == @statuses.last %><a href="#" class="repeat-value">&#187;</a><% end %>
</td> </td>
<% end -%> <% end -%>
@ -82,7 +86,7 @@
</td> </td>
<% for status in @statuses -%> <% for status in @statuses -%>
<td class="<%= @permissions[status.id][field.id.to_s] %>"> <td class="<%= @permissions[status.id][field.id.to_s] %>">
<%= field_permission_tag(@permissions, status, field, @role) %> <%= field_permission_tag(@permissions, status, field, @roles) %>
<% unless status == @statuses.last %><a href="#" class="repeat-value">&#187;</a><% end %> <% unless status == @statuses.last %><a href="#" class="repeat-value">&#187;</a><% end %>
</td> </td>
<% end -%> <% end -%>
@ -103,4 +107,17 @@ $("a.repeat-value").click(function(e){
var selected = td.find("select").find(":selected").val(); var selected = td.find("select").find(":selected").val();
td.nextAll('td').find("select").val(selected); td.nextAll('td').find("select").val(selected);
}); });
$("a[data-expands]").click(function(e){
e.preventDefault();
var target = $($(this).attr("data-expands"));
if (target.attr("multiple")) {
target.attr("multiple", false);
target.find("option[value=all]").show();
} else {
target.attr("multiple", true);
target.find("option[value=all]").attr("selected", false).hide();
}
});
<% end %> <% end %>

View File

@ -72,10 +72,9 @@
# #
# === More configuration options # === More configuration options
# #
# See the "Configuration options" at the following website for a list of the # See following page:
# full options allowed:
# #
# http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer # http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
# default configuration options for all environments # default configuration options for all environments

View File

@ -203,6 +203,30 @@ module ActionController
end end
end end
if Rails::VERSION::MAJOR < 4 && RUBY_VERSION >= "2.1"
module ActiveSupport
class HashWithIndifferentAccess
def select(*args, &block)
dup.tap { |hash| hash.select!(*args, &block) }
end
def reject(*args, &block)
dup.tap { |hash| hash.reject!(*args, &block) }
end
end
class OrderedHash
def select(*args, &block)
dup.tap { |hash| hash.select!(*args, &block) }
end
def reject(*args, &block)
dup.tap { |hash| hash.reject!(*args, &block) }
end
end
end
end
require 'awesome_nested_set/version' require 'awesome_nested_set/version'
module CollectiveIdea module CollectiveIdea

View File

@ -1112,3 +1112,7 @@ ar:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1209,3 +1209,7 @@ az:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -511,6 +511,7 @@ bg:
label_issue_updated: Обновена задача label_issue_updated: Обновена задача
label_issue_note_added: Добавена бележка label_issue_note_added: Добавена бележка
label_issue_status_updated: Обновено състояние label_issue_status_updated: Обновено състояние
label_issue_assigned_to_updated: Задачата е с назначен нов изпълнител
label_issue_priority_updated: Обновен приоритет label_issue_priority_updated: Обновен приоритет
label_document: Документ label_document: Документ
label_document_new: Нов документ label_document_new: Нов документ
@ -914,6 +915,9 @@ bg:
label_checkboxes: чек-бокс label_checkboxes: чек-бокс
label_link_values_to: URL (опция) label_link_values_to: URL (опция)
label_custom_field_select_type: "Изберете тип на обект, към който потребителското поле да бъде асоциирано" label_custom_field_select_type: "Изберете тип на обект, към който потребителското поле да бъде асоциирано"
label_check_for_updates: Проверка за нови версии
label_latest_compatible_version: Последна съвместима версия
label_unknown_plugin: Непознат плъгин
button_login: Вход button_login: Вход
button_submit: Изпращане button_submit: Изпращане

View File

@ -1125,3 +1125,7 @@ bs:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1114,3 +1114,7 @@ ca:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1,4 +1,4 @@
# Update to 2.2, 2.4 by Karel Picman <karel.picman@kontron.com> # Update to 2.2, 2.4, 2.5 by Karel Picman <karel.picman@kontron.com>
# Update to 1.1 by Michal Gebauer <mishak@mishak.net> # Update to 1.1 by Michal Gebauer <mishak@mishak.net>
# Updated by Josef Liška <jl@chl.cz> # Updated by Josef Liška <jl@chl.cz>
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
@ -1104,14 +1104,17 @@ cs:
notice_new_password_must_be_different: Nové heslo se musí lišit od stávajícího notice_new_password_must_be_different: Nové heslo se musí lišit od stávajícího
setting_mail_handler_excluded_filenames: Vyřadit přílohy podle jména setting_mail_handler_excluded_filenames: Vyřadit přílohy podle jména
text_convert_available: ImageMagick convert k dispozici (volitelné) text_convert_available: ImageMagick convert k dispozici (volitelné)
label_link: Link label_link: Odkaz
label_only: only label_only: jenom
label_drop_down_list: drop-down list label_drop_down_list: rozbalovací seznam
label_checkboxes: checkboxes label_checkboxes: zaškrtávátka
label_link_values_to: Link values to URL label_link_values_to: Propojit hodnoty s URL
setting_force_default_language_for_anonymous: Force default language for anonymous setting_force_default_language_for_anonymous: Vynutit výchozí jazyk pro anonymní uživatele
users users
setting_force_default_language_for_loggedin: Force default language for logged-in setting_force_default_language_for_loggedin: Vynutit výchozí jazyk pro přihlášené uživatele
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Vybrat typ objektu, ke kterému bude přiřazeno uživatelské pole
is to be attached label_issue_assigned_to_updated: Přiřazený uživatel aktualizován
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1129,3 +1129,7 @@ da:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -460,6 +460,7 @@ de:
label_changes_details: Details aller Änderungen label_changes_details: Details aller Änderungen
label_changeset_plural: Changesets label_changeset_plural: Changesets
label_checkboxes: Checkboxen label_checkboxes: Checkboxen
label_check_for_updates: Auf Updates prüfen
label_child_revision: Nachfolger label_child_revision: Nachfolger
label_chronological_order: in zeitlicher Reihenfolge label_chronological_order: in zeitlicher Reihenfolge
label_close_versions: Vollständige Versionen schließen label_close_versions: Vollständige Versionen schließen
@ -568,6 +569,7 @@ de:
label_internal: Intern label_internal: Intern
label_issue: Ticket label_issue: Ticket
label_issue_added: Ticket hinzugefügt label_issue_added: Ticket hinzugefügt
label_issue_assigned_to_updated: Bearbeiter aktualisiert
label_issue_category: Ticket-Kategorie label_issue_category: Ticket-Kategorie
label_issue_category_new: Neue Kategorie label_issue_category_new: Neue Kategorie
label_issue_category_plural: Ticket-Kategorien label_issue_category_plural: Ticket-Kategorien
@ -596,11 +598,13 @@ de:
label_last_n_days: "die letzten %{count} Tage" label_last_n_days: "die letzten %{count} Tage"
label_last_n_weeks: letzte %{count} Wochen label_last_n_weeks: letzte %{count} Wochen
label_last_week: vorige Woche label_last_week: vorige Woche
label_latest_compatible_version: Letzte kompatible Version
label_latest_revision: Aktuellste Revision label_latest_revision: Aktuellste Revision
label_latest_revision_plural: Aktuellste Revisionen label_latest_revision_plural: Aktuellste Revisionen
label_ldap_authentication: LDAP-Authentifizierung label_ldap_authentication: LDAP-Authentifizierung
label_less_or_equal: "<=" label_less_or_equal: "<="
label_less_than_ago: vor weniger als label_less_than_ago: vor weniger als
label_link: Link
label_link_values_to: Werte mit URL verknüpfen label_link_values_to: Werte mit URL verknüpfen
label_list: Liste label_list: Liste
label_loading: Lade... label_loading: Lade...
@ -757,6 +761,7 @@ de:
label_tracker: Tracker label_tracker: Tracker
label_tracker_new: Neuer Tracker label_tracker_new: Neuer Tracker
label_tracker_plural: Tracker label_tracker_plural: Tracker
label_unknown_plugin: Unbekanntes Plugin
label_update_issue_done_ratios: Ticket-Fortschritt aktualisieren label_update_issue_done_ratios: Ticket-Fortschritt aktualisieren
label_updated_time: "Vor %{value} aktualisiert" label_updated_time: "Vor %{value} aktualisiert"
label_updated_time_by: "Von %{author} vor %{age} aktualisiert" label_updated_time_by: "Von %{author} vor %{age} aktualisiert"
@ -1120,4 +1125,3 @@ de:
version_status_open: offen version_status_open: offen
warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden." warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden."
label_link: Link

View File

@ -1112,3 +1112,7 @@ el:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1114,3 +1114,7 @@ en-GB:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -508,6 +508,7 @@ en:
label_issue_updated: Issue updated label_issue_updated: Issue updated
label_issue_note_added: Note added label_issue_note_added: Note added
label_issue_status_updated: Status updated label_issue_status_updated: Status updated
label_issue_assigned_to_updated: Assignee updated
label_issue_priority_updated: Priority updated label_issue_priority_updated: Priority updated
label_document: Document label_document: Document
label_document_new: New document label_document_new: New document
@ -911,6 +912,9 @@ en:
label_checkboxes: checkboxes label_checkboxes: checkboxes
label_link_values_to: Link values to URL label_link_values_to: Link values to URL
label_custom_field_select_type: Select the type of object to which the custom field is to be attached label_custom_field_select_type: Select the type of object to which the custom field is to be attached
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin
button_login: Login button_login: Login
button_submit: Submit button_submit: Submit

View File

@ -1144,5 +1144,8 @@ es:
label_link_values_to: Enlazar valores a la URL label_link_values_to: Enlazar valores a la URL
setting_force_default_language_for_anonymous: Forzar lenguaje por defecto a usuarios anónimos setting_force_default_language_for_anonymous: Forzar lenguaje por defecto a usuarios anónimos
setting_force_default_language_for_loggedin: Forzar lenguaje por defecto para usuarios identificados setting_force_default_language_for_loggedin: Forzar lenguaje por defecto para usuarios identificados
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Seleccione el tipo de objeto al que unir el campo personalizado
is to be attached label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1125,3 +1125,7 @@ et:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1113,3 +1113,7 @@ eu:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

File diff suppressed because it is too large Load Diff

View File

@ -1133,3 +1133,7 @@ fi:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -15,8 +15,11 @@ fr:
day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi] day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
# Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.]
# Used in date_select and datime_select.
order: order:
- :day - :day
- :month - :month
@ -100,7 +103,7 @@ fr:
units: units:
byte: byte:
one: "octet" one: "octet"
other: "octet" other: "octets"
kb: "ko" kb: "ko"
mb: "Mo" mb: "Mo"
gb: "Go" gb: "Go"
@ -146,7 +149,7 @@ fr:
not_same_project: "n'appartient pas au même projet" not_same_project: "n'appartient pas au même projet"
circular_dependency: "Cette relation créerait une dépendance circulaire" circular_dependency: "Cette relation créerait une dépendance circulaire"
cant_link_an_issue_with_a_descendant: "Une demande ne peut pas être liée à l'une de ses sous-tâches" cant_link_an_issue_with_a_descendant: "Une demande ne peut pas être liée à l'une de ses sous-tâches"
earlier_than_minimum_start_date: "ne peut pas être antérieure au %{date} à cause des demandes qui précédent" earlier_than_minimum_start_date: "ne peut pas être antérieure au %{date} à cause des demandes qui précèdent"
actionview_instancetag_blank_option: Choisir actionview_instancetag_blank_option: Choisir
@ -183,14 +186,16 @@ fr:
notice_email_sent: "Un email a été envoyé à %{value}" notice_email_sent: "Un email a été envoyé à %{value}"
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})" notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée." notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée."
notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}." notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}."
notice_failed_to_save_time_entries: "%{count} temps passé(s) sur les %{total} sélectionnés n'ont pas pu être mis à jour: %{ids}." notice_failed_to_save_time_entries: "%{count} temps passé(s) sur les %{total} sélectionnés n'ont pas pu être mis à jour: %{ids}."
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour." notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour."
notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur." notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur."
notice_default_data_loaded: Paramétrage par défaut chargé avec succès. notice_default_data_loaded: Paramétrage par défaut chargé avec succès.
notice_unable_delete_version: Impossible de supprimer cette version. notice_unable_delete_version: Impossible de supprimer cette version.
notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour. notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour.
notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})" notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})"
notice_issue_successful_create: "Demande %{id} créée." notice_issue_successful_create: "Demande %{id} créée."
notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez." notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez."
@ -202,15 +207,22 @@ fr:
error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt." error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}" error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}"
error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée." error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée."
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale.
error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet" error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet"
error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
error_can_not_reopen_issue_on_closed_version: 'Une demande assignée à une version fermée ne peut pas être réouverte' error_can_not_reopen_issue_on_closed_version: 'Une demande assignée à une version fermée ne peut pas être réouverte'
error_can_not_archive_project: "Ce projet ne peut pas être archivé" error_can_not_archive_project: "Ce projet ne peut pas être archivé"
error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
error_workflow_copy_source: 'Veuillez sélectionner un tracker et/ou un rôle source' error_workflow_copy_source: 'Veuillez sélectionner un tracker et/ou un rôle source'
error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles' error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles'
error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour. error_unable_delete_issue_status: Impossible de supprimer le statut de demande
error_unable_to_connect: Connexion impossible (%{value})
error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size}) error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size})
error_session_expired: "Votre session a expiré. Veuillez vous reconnecter." error_session_expired: "Votre session a expiré. Veuillez vous reconnecter."
warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés." warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés."
mail_subject_lost_password: "Votre mot de passe %{value}" mail_subject_lost_password: "Votre mot de passe %{value}"
@ -228,20 +240,19 @@ fr:
mail_subject_wiki_content_updated: "Page wiki '%{id}' mise à jour" mail_subject_wiki_content_updated: "Page wiki '%{id}' mise à jour"
mail_body_wiki_content_updated: "La page wiki '%{id}' a été mise à jour par %{author}." mail_body_wiki_content_updated: "La page wiki '%{id}' a été mise à jour par %{author}."
field_name: Nom field_name: Nom
field_description: Description field_description: Description
field_summary: Résumé field_summary: Résumé
field_is_required: Obligatoire field_is_required: Obligatoire
field_firstname: Prénom field_firstname: Prénom
field_lastname: Nom field_lastname: Nom
field_mail: "Email " field_mail: Email
field_filename: Fichier field_filename: Fichier
field_filesize: Taille field_filesize: Taille
field_downloads: Téléchargements field_downloads: Téléchargements
field_author: Auteur field_author: Auteur
field_created_on: "Créé " field_created_on: Créé
field_updated_on: "Mis-à-jour " field_updated_on: Mis-à-jour
field_closed_on: Fermé field_closed_on: Fermé
field_field_format: Format field_field_format: Format
field_is_for_all: Pour tous les projets field_is_for_all: Pour tous les projets
@ -265,15 +276,16 @@ fr:
field_priority: Priorité field_priority: Priorité
field_fixed_version: Version cible field_fixed_version: Version cible
field_user: Utilisateur field_user: Utilisateur
field_principal: Principal
field_role: Rôle field_role: Rôle
field_homepage: "Site web " field_homepage: Site web
field_is_public: Public field_is_public: Public
field_parent: Sous-projet de field_parent: Sous-projet de
field_is_in_roadmap: Demandes affichées dans la roadmap field_is_in_roadmap: Demandes affichées dans la roadmap
field_login: "Identifiant " field_login: Identifiant
field_mail_notification: Notifications par mail field_mail_notification: Notifications par mail
field_admin: Administrateur field_admin: Administrateur
field_last_login_on: "Dernière connexion " field_last_login_on: Dernière connexion
field_language: Langue field_language: Langue
field_effective_date: Date field_effective_date: Date
field_password: Mot de passe field_password: Mot de passe
@ -309,6 +321,7 @@ fr:
field_redirect_existing_links: Rediriger les liens existants field_redirect_existing_links: Rediriger les liens existants
field_estimated_hours: Temps estimé field_estimated_hours: Temps estimé
field_column_names: Colonnes field_column_names: Colonnes
field_time_entries: Temps passé
field_time_zone: Fuseau horaire field_time_zone: Fuseau horaire
field_searchable: Utilisé pour les recherches field_searchable: Utilisé pour les recherches
field_default_value: Valeur par défaut field_default_value: Valeur par défaut
@ -320,13 +333,20 @@ fr:
field_content: Contenu field_content: Contenu
field_group_by: Grouper par field_group_by: Grouper par
field_sharing: Partage field_sharing: Partage
field_active: Actif
field_parent_issue: Tâche parente field_parent_issue: Tâche parente
field_member_of_group: Groupe de l'assigné
field_assigned_to_role: Rôle de l'assigné
field_text: Champ texte
field_visible: Visible field_visible: Visible
field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé" field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé"
field_issues_visibility: Visibilité des demandes field_issues_visibility: Visibilité des demandes
field_is_private: Privée field_is_private: Privée
field_commit_logs_encoding: Encodage des messages de commit field_commit_logs_encoding: Encodage des messages de commit
field_scm_path_encoding: Encodage des chemins
field_path_to_repository: Chemin du dépôt
field_root_directory: Répertoire racine
field_cvsroot: CVSROOT
field_cvs_module: Module
field_repository_is_default: Dépôt principal field_repository_is_default: Dépôt principal
field_multiple: Valeurs multiples field_multiple: Valeurs multiples
field_auth_source_ldap_filter: Filtre LDAP field_auth_source_ldap_filter: Filtre LDAP
@ -364,6 +384,8 @@ fr:
setting_cross_project_issue_relations: Autoriser les relations entre demandes de différents projets setting_cross_project_issue_relations: Autoriser les relations entre demandes de différents projets
setting_cross_project_subtasks: Autoriser les sous-tâches dans des projets différents setting_cross_project_subtasks: Autoriser les sous-tâches dans des projets différents
setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
setting_repositories_encodings: Encodages des fichiers et des dépôts
setting_emails_header: En-tête des emails
setting_emails_footer: Pied-de-page des emails setting_emails_footer: Pied-de-page des emails
setting_protocol: Protocole setting_protocol: Protocole
setting_per_page_options: Options d'objets affichés par page setting_per_page_options: Options d'objets affichés par page
@ -376,6 +398,7 @@ fr:
setting_mail_handler_api_key: Clé de protection de l'API setting_mail_handler_api_key: Clé de protection de l'API
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
setting_gravatar_default: Image Gravatar par défaut
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne
setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier" setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier"
@ -384,12 +407,12 @@ fr:
setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet
setting_default_projects_modules: Modules activés par défaut pour les nouveaux projets setting_default_projects_modules: Modules activés par défaut pour les nouveaux projets
setting_issue_done_ratio: Calcul de l'avancement des demandes setting_issue_done_ratio: Calcul de l'avancement des demandes
setting_issue_done_ratio_issue_status: Utiliser le statut
setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectué' setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectué'
setting_rest_api_enabled: Activer l'API REST setting_issue_done_ratio_issue_status: Utiliser le statut
setting_gravatar_default: Image Gravatar par défaut
setting_start_of_week: Jour de début des calendriers setting_start_of_week: Jour de début des calendriers
setting_rest_api_enabled: Activer l'API REST
setting_cache_formatted_text: Mettre en cache le texte formaté setting_cache_formatted_text: Mettre en cache le texte formaté
setting_default_notification_option: Option de notification par défaut
setting_commit_logtime_enabled: Permettre la saisie de temps setting_commit_logtime_enabled: Permettre la saisie de temps
setting_commit_logtime_activity_id: Activité pour le temps saisi setting_commit_logtime_activity_id: Activité pour le temps saisi
setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt
@ -414,6 +437,7 @@ fr:
permission_close_project: Fermer / réouvrir le projet permission_close_project: Fermer / réouvrir le projet
permission_select_project_modules: Choisir les modules permission_select_project_modules: Choisir les modules
permission_manage_members: Gérer les membres permission_manage_members: Gérer les membres
permission_manage_project_activities: Gérer les activités
permission_manage_versions: Gérer les versions permission_manage_versions: Gérer les versions
permission_manage_categories: Gérer les catégories de demandes permission_manage_categories: Gérer les catégories de demandes
permission_view_issues: Voir les demandes permission_view_issues: Voir les demandes
@ -468,7 +492,6 @@ fr:
permission_delete_messages: Supprimer les messages permission_delete_messages: Supprimer les messages
permission_delete_own_messages: Supprimer ses propres messages permission_delete_own_messages: Supprimer ses propres messages
permission_export_wiki_pages: Exporter les pages permission_export_wiki_pages: Exporter les pages
permission_manage_project_activities: Gérer les activités
permission_manage_subtasks: Gérer les sous-tâches permission_manage_subtasks: Gérer les sous-tâches
permission_manage_related_issues: Gérer les demandes associées permission_manage_related_issues: Gérer les demandes associées
@ -480,6 +503,8 @@ fr:
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Dépôt de sources project_module_repository: Dépôt de sources
project_module_boards: Forums de discussion project_module_boards: Forums de discussion
project_module_calendar: Calendrier
project_module_gantt: Gantt
label_user: Utilisateur label_user: Utilisateur
label_user_plural: Utilisateurs label_user_plural: Utilisateurs
@ -498,12 +523,13 @@ fr:
label_issue_new: Nouvelle demande label_issue_new: Nouvelle demande
label_issue_plural: Demandes label_issue_plural: Demandes
label_issue_view_all: Voir toutes les demandes label_issue_view_all: Voir toutes les demandes
label_issues_by: "Demandes par %{value}"
label_issue_added: Demande ajoutée label_issue_added: Demande ajoutée
label_issue_updated: Demande mise à jour label_issue_updated: Demande mise à jour
label_issue_note_added: Note ajoutée label_issue_note_added: Note ajoutée
label_issue_status_updated: Statut changé label_issue_status_updated: Statut changé
label_issue_assigned_to_updated: Assigné changé
label_issue_priority_updated: Priorité changée label_issue_priority_updated: Priorité changée
label_issues_by: "Demandes par %{value}"
label_document: Document label_document: Document
label_document_new: Nouveau document label_document_new: Nouveau document
label_document_plural: Documents label_document_plural: Documents
@ -547,10 +573,10 @@ fr:
label_login: Connexion label_login: Connexion
label_logout: Déconnexion label_logout: Déconnexion
label_help: Aide label_help: Aide
label_reported_issues: "Demandes soumises " label_reported_issues: Demandes soumises
label_assigned_to_me_issues: Demandes qui me sont assignées label_assigned_to_me_issues: Demandes qui me sont assignées
label_last_login: "Dernière connexion " label_last_login: Dernière connexion
label_registered_on: "Inscrit le " label_registered_on: Inscrit le
label_activity: Activité label_activity: Activité
label_overall_activity: Activité globale label_overall_activity: Activité globale
label_user_activity: "Activité de %{value}" label_user_activity: "Activité de %{value}"
@ -596,6 +622,7 @@ fr:
label_version: Version label_version: Version
label_version_new: Nouvelle version label_version_new: Nouvelle version
label_version_plural: Versions label_version_plural: Versions
label_close_versions: Fermer les versions terminées
label_confirmation: Confirmation label_confirmation: Confirmation
label_export_to: 'Formats disponibles :' label_export_to: 'Formats disponibles :'
label_read: Lire... label_read: Lire...
@ -655,7 +682,7 @@ fr:
label_query_plural: Rapports personnalisés label_query_plural: Rapports personnalisés
label_query_new: Nouveau rapport label_query_new: Nouveau rapport
label_my_queries: Mes rapports personnalisés label_my_queries: Mes rapports personnalisés
label_filter_add: "Ajouter le filtre " label_filter_add: Ajouter le filtre
label_filter_plural: Filtres label_filter_plural: Filtres
label_equals: égal label_equals: égal
label_not_equals: différent label_not_equals: différent
@ -663,6 +690,9 @@ fr:
label_in_more_than: dans plus de label_in_more_than: dans plus de
label_in_the_next_days: dans les prochains jours label_in_the_next_days: dans les prochains jours
label_in_the_past_days: dans les derniers jours label_in_the_past_days: dans les derniers jours
label_greater_or_equal: '>='
label_less_or_equal: '<='
label_between: entre
label_in: dans label_in: dans
label_today: aujourd'hui label_today: aujourd'hui
label_all_time: toute la période label_all_time: toute la période
@ -688,8 +718,11 @@ fr:
label_repository_new: Nouveau dépôt label_repository_new: Nouveau dépôt
label_repository_plural: Dépôts label_repository_plural: Dépôts
label_browse: Parcourir label_browse: Parcourir
label_revision: "Révision " label_branch: Branche
label_tag: Tag
label_revision: Révision
label_revision_plural: Révisions label_revision_plural: Révisions
label_revision_id: "Révision %{value}"
label_associated_revisions: Révisions associées label_associated_revisions: Révisions associées
label_added: ajouté label_added: ajouté
label_modified: modifié label_modified: modifié
@ -699,6 +732,7 @@ fr:
label_latest_revision: Dernière révision label_latest_revision: Dernière révision
label_latest_revision_plural: Dernières révisions label_latest_revision_plural: Dernières révisions
label_view_revisions: Voir les révisions label_view_revisions: Voir les révisions
label_view_all_revisions: Voir toutes les révisions
label_max_size: Taille maximale label_max_size: Taille maximale
label_sort_highest: Remonter en premier label_sort_highest: Remonter en premier
label_sort_higher: Remonter label_sort_higher: Remonter
@ -708,7 +742,7 @@ fr:
label_roadmap_due_in: "Échéance dans %{value}" label_roadmap_due_in: "Échéance dans %{value}"
label_roadmap_overdue: "En retard de %{value}" label_roadmap_overdue: "En retard de %{value}"
label_roadmap_no_issues: Aucune demande pour cette version label_roadmap_no_issues: Aucune demande pour cette version
label_search: "Recherche " label_search: Recherche
label_result_plural: Résultats label_result_plural: Résultats
label_all_words: Tous les mots label_all_words: Tous les mots
label_wiki: Wiki label_wiki: Wiki
@ -724,6 +758,7 @@ fr:
label_changes_details: Détails de tous les changements label_changes_details: Détails de tous les changements
label_issue_tracking: Suivi des demandes label_issue_tracking: Suivi des demandes
label_spent_time: Temps passé label_spent_time: Temps passé
label_overall_spent_time: Temps passé global
label_f_hour: "%{value} heure" label_f_hour: "%{value} heure"
label_f_hour_plural: "%{value} heures" label_f_hour_plural: "%{value} heures"
label_time_tracking: Suivi du temps label_time_tracking: Suivi du temps
@ -731,6 +766,7 @@ fr:
label_statistics: Statistiques label_statistics: Statistiques
label_commits_per_month: Commits par mois label_commits_per_month: Commits par mois
label_commits_per_author: Commits par auteur label_commits_per_author: Commits par auteur
label_diff: diff
label_view_diff: Voir les différences label_view_diff: Voir les différences
label_diff_inline: en ligne label_diff_inline: en ligne
label_diff_side_by_side: côte à côte label_diff_side_by_side: côte à côte
@ -763,6 +799,8 @@ fr:
label_board: Forum label_board: Forum
label_board_new: Nouveau forum label_board_new: Nouveau forum
label_board_plural: Forums label_board_plural: Forums
label_board_locked: Verrouillé
label_board_sticky: Sticky
label_topic_plural: Discussions label_topic_plural: Discussions
label_message_plural: Messages label_message_plural: Messages
label_message_last: Dernier message label_message_last: Dernier message
@ -778,6 +816,8 @@ fr:
label_language_based: Basé sur la langue de l'utilisateur label_language_based: Basé sur la langue de l'utilisateur
label_sort_by: "Trier par %{value}" label_sort_by: "Trier par %{value}"
label_send_test_email: Envoyer un email de test label_send_test_email: Envoyer un email de test
label_feeds_access_key: Clé d'accès Atom
label_missing_feeds_access_key: Clé d'accès Atom manquante
label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}" label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}"
label_module_plural: Modules label_module_plural: Modules
label_added_time_by: "Ajouté par %{author} il y a %{age}" label_added_time_by: "Ajouté par %{author} il y a %{age}"
@ -789,11 +829,16 @@ fr:
label_default_columns: Colonnes par défaut label_default_columns: Colonnes par défaut
label_no_change_option: (Pas de changement) label_no_change_option: (Pas de changement)
label_bulk_edit_selected_issues: Modifier les demandes sélectionnées label_bulk_edit_selected_issues: Modifier les demandes sélectionnées
label_bulk_edit_selected_time_entries: Modifier les temps passés sélectionnés
label_theme: Thème label_theme: Thème
label_default: Défaut label_default: Défaut
label_search_titles_only: Uniquement dans les titres label_search_titles_only: Uniquement dans les titres
label_user_mail_option_all: "Pour tous les événements de tous mes projets" label_user_mail_option_all: "Pour tous les événements de tous mes projets"
label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..." label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..."
label_user_mail_option_none: Aucune notification
label_user_mail_option_only_my_events: Seulement pour ce que je surveille
label_user_mail_option_only_assigned: Seulement pour ce qui m'est assigné
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue" label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue"
label_registration_activation_by_email: activation du compte par email label_registration_activation_by_email: activation du compte par email
label_registration_manual_activation: activation manuelle du compte label_registration_manual_activation: activation manuelle du compte
@ -824,8 +869,8 @@ fr:
label_date_from_to: Du %{start} au %{end} label_date_from_to: Du %{start} au %{end}
label_wiki_content_added: Page wiki ajoutée label_wiki_content_added: Page wiki ajoutée
label_wiki_content_updated: Page wiki mise à jour label_wiki_content_updated: Page wiki mise à jour
label_group_plural: Groupes
label_group: Groupe label_group: Groupe
label_group_plural: Groupes
label_group_new: Nouveau groupe label_group_new: Nouveau groupe
label_time_entry_plural: Temps passé label_time_entry_plural: Temps passé
label_version_sharing_none: Non partagé label_version_sharing_none: Non partagé
@ -833,18 +878,14 @@ fr:
label_version_sharing_hierarchy: Avec toute la hiérarchie label_version_sharing_hierarchy: Avec toute la hiérarchie
label_version_sharing_tree: Avec tout l'arbre label_version_sharing_tree: Avec tout l'arbre
label_version_sharing_system: Avec tous les projets label_version_sharing_system: Avec tous les projets
label_update_issue_done_ratios: Mettre à jour l'avancement des demandes
label_copy_source: Source label_copy_source: Source
label_copy_target: Cible label_copy_target: Cible
label_copy_same_as_target: Comme la cible label_copy_same_as_target: Comme la cible
label_update_issue_done_ratios: Mettre à jour l'avancement des demandes
label_display_used_statuses_only: N'afficher que les statuts utilisés dans ce tracker label_display_used_statuses_only: N'afficher que les statuts utilisés dans ce tracker
label_api_access_key: Clé d'accès API label_api_access_key: Clé d'accès API
label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
label_feeds_access_key: Clé d'accès Atom
label_missing_api_access_key: Clé d'accès API manquante label_missing_api_access_key: Clé d'accès API manquante
label_missing_feeds_access_key: Clé d'accès Atom manquante label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
label_close_versions: Fermer les versions terminées
label_revision_id: Révision %{value}
label_profile: Profil label_profile: Profil
label_subtask_plural: Sous-tâches label_subtask_plural: Sous-tâches
label_project_copy_notifications: Envoyer les notifications durant la copie du projet label_project_copy_notifications: Envoyer les notifications durant la copie du projet
@ -855,11 +896,15 @@ fr:
label_issues_visibility_all: Toutes les demandes label_issues_visibility_all: Toutes les demandes
label_issues_visibility_public: Toutes les demandes non privées label_issues_visibility_public: Toutes les demandes non privées
label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur
label_git_report_last_commit: Afficher le dernier commit des fichiers et répertoires
label_parent_revision: Parent
label_child_revision: Enfant
label_export_options: Options d'exportation %{export_format} label_export_options: Options d'exportation %{export_format}
label_copy_attachments: Copier les fichiers label_copy_attachments: Copier les fichiers
label_copy_subtasks: Copier les sous-tâches label_copy_subtasks: Copier les sous-tâches
label_item_position: "%{position} sur %{count}" label_item_position: "%{position} sur %{count}"
label_completed_versions: Versions passées label_completed_versions: Versions passées
label_search_for_watchers: Rechercher des observateurs
label_session_expiration: Expiration des sessions label_session_expiration: Expiration des sessions
label_show_closed_projects: Voir les projets fermés label_show_closed_projects: Voir les projets fermés
label_status_transitions: Changements de statut label_status_transitions: Changements de statut
@ -879,7 +924,7 @@ fr:
label_cross_project_system: Avec tous les projets label_cross_project_system: Avec tous les projets
label_gantt_progress_line: Ligne de progression label_gantt_progress_line: Ligne de progression
label_visibility_private: par moi uniquement label_visibility_private: par moi uniquement
label_visibility_roles: par ces roles uniquement label_visibility_roles: par ces rôles uniquement
label_visibility_public: par tout le monde label_visibility_public: par tout le monde
label_link: Lien label_link: Lien
label_only: seulement label_only: seulement
@ -887,6 +932,9 @@ fr:
label_checkboxes: cases à cocher label_checkboxes: cases à cocher
label_link_values_to: Lier les valeurs vers l'URL label_link_values_to: Lier les valeurs vers l'URL
label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisé label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisé
label_check_for_updates: Vérifier les mises à jour
label_latest_compatible_version: Dernière version compatible
label_unknown_plugin: Plugin inconnu
button_login: Connexion button_login: Connexion
button_submit: Soumettre button_submit: Soumettre
@ -900,6 +948,7 @@ fr:
button_create_and_continue: Créer et continuer button_create_and_continue: Créer et continuer
button_test: Tester button_test: Tester
button_edit: Modifier button_edit: Modifier
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}"
button_add: Ajouter button_add: Ajouter
button_change: Changer button_change: Changer
button_apply: Appliquer button_apply: Appliquer
@ -952,6 +1001,8 @@ fr:
version_status_locked: verrouillé version_status_locked: verrouillé
version_status_closed: fermé version_status_closed: fermé
field_active: Actif
text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée
text_regexp_info: ex. ^[A-Z0-9]+$ text_regexp_info: ex. ^[A-Z0-9]+$
text_min_max_length_info: 0 pour aucune restriction text_min_max_length_info: 0 pour aucune restriction
@ -959,6 +1010,11 @@ fr:
text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront également supprimés." text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront également supprimés."
text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
text_are_you_sure: Êtes-vous sûr ? text_are_you_sure: Êtes-vous sûr ?
text_journal_changed: "%{label} changé de %{old} à %{new}"
text_journal_changed_no_detail: "%{label} mis à jour"
text_journal_set_to: "%{label} mis à %{value}"
text_journal_deleted: "%{label} %{old} supprimé"
text_journal_added: "%{label} %{value} ajouté"
text_tip_issue_begin_day: tâche commençant ce jour text_tip_issue_begin_day: tâche commençant ce jour
text_tip_issue_end_day: tâche finissant ce jour text_tip_issue_end_day: tâche finissant ce jour
text_tip_issue_begin_end_day: tâche commençant et finissant ce jour text_tip_issue_begin_end_day: tâche commençant et finissant ce jour
@ -984,11 +1040,13 @@ fr:
text_time_logged_by_changeset: "Appliqué par commit %{value}" text_time_logged_by_changeset: "Appliqué par commit %{value}"
text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?' text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?'
text_issues_destroy_descendants_confirmation: "Cela entrainera également la suppression de %{count} sous-tâche(s)." text_issues_destroy_descendants_confirmation: "Cela entrainera également la suppression de %{count} sous-tâche(s)."
text_time_entries_destroy_confirmation: "Etes-vous sûr de vouloir supprimer les temps passés sélectionnés ?"
text_select_project_modules: 'Sélectionner les modules à activer pour ce projet :' text_select_project_modules: 'Sélectionner les modules à activer pour ce projet :'
text_default_administrator_account_changed: Compte administrateur par défaut changé text_default_administrator_account_changed: Compte administrateur par défaut changé
text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture
text_plugin_assets_writable: Répertoire public des plugins accessible en écriture text_plugin_assets_writable: Répertoire public des plugins accessible en écriture
text_rmagick_available: Bibliothèque RMagick présente (optionnelle) text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
text_convert_available: Binaire convert de ImageMagick présent (optionel)
text_destroy_time_entries_question: "%{hours} heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?" text_destroy_time_entries_question: "%{hours} heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?"
text_destroy_time_entries: Supprimer les heures text_destroy_time_entries: Supprimer les heures
text_assign_time_entries_to_project: Reporter les heures sur le projet text_assign_time_entries_to_project: Reporter les heures sur le projet
@ -1005,7 +1063,16 @@ fr:
text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes" text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page" text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page"
text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?" text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?"
text_zoom_in: Zoom avant
text_zoom_out: Zoom arrière
text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page." text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page."
text_scm_path_encoding_note: "Défaut : UTF-8"
text_git_repository_note: "Le dépôt est vide et local (exemples : /gitrepo, c:\\gitrepo)"
text_mercurial_repository_note: "Dépôt local (exemples : /hgrepo, c:\\hgrepo)"
text_scm_command: Commande
text_scm_command_version: Version
text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)" text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)"
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements" text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}" text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
@ -1014,9 +1081,9 @@ fr:
text_project_closed: Ce projet est fermé et accessible en lecture seule. text_project_closed: Ce projet est fermé et accessible en lecture seule.
text_turning_multiple_off: "Si vous désactivez les valeurs multiples, les valeurs multiples seront supprimées pour n'en conserver qu'une par objet." text_turning_multiple_off: "Si vous désactivez les valeurs multiples, les valeurs multiples seront supprimées pour n'en conserver qu'une par objet."
default_role_manager: "Manager " default_role_manager: Manager
default_role_developer: "Développeur " default_role_developer: Développeur
default_role_reporter: "Rapporteur " default_role_reporter: Rapporteur
default_tracker_bug: Anomalie default_tracker_bug: Anomalie
default_tracker_feature: Evolution default_tracker_feature: Evolution
default_tracker_support: Assistance default_tracker_support: Assistance
@ -1039,84 +1106,23 @@ fr:
enumeration_issue_priorities: Priorités des demandes enumeration_issue_priorities: Priorités des demandes
enumeration_doc_categories: Catégories des documents enumeration_doc_categories: Catégories des documents
enumeration_activities: Activités (suivi du temps) enumeration_activities: Activités (suivi du temps)
label_greater_or_equal: ">="
label_less_or_equal: "<="
label_between: entre
label_view_all_revisions: Voir toutes les révisions
label_tag: Tag
label_branch: Branche
error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
text_journal_changed: "%{label} changé de %{old} à %{new}"
text_journal_changed_no_detail: "%{label} mis à jour"
text_journal_set_to: "%{label} mis à %{value}"
text_journal_deleted: "%{label} %{old} supprimé"
text_journal_added: "%{label} %{value} ajouté"
enumeration_system_activity: Activité système enumeration_system_activity: Activité système
label_board_sticky: Sticky
label_board_locked: Verrouillé
error_unable_delete_issue_status: Impossible de supprimer le statut de demande
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
error_unable_to_connect: Connexion impossible (%{value})
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
field_principal: Principal
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
text_zoom_out: Zoom arrière
text_zoom_in: Zoom avant
notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
label_overall_spent_time: Temps passé global
field_time_entries: Temps passé
project_module_gantt: Gantt
project_module_calendar: Calendrier
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}"
field_text: Champ texte
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
setting_default_notification_option: Option de notification par défaut
label_user_mail_option_only_my_events: Seulement pour ce que je surveille
label_user_mail_option_only_assigned: Seulement pour ce qui m'est assigné
label_user_mail_option_none: Aucune notification
field_member_of_group: Groupe de l'assigné
field_assigned_to_role: Rôle de l'assigné
setting_emails_header: En-tête des emails
label_bulk_edit_selected_time_entries: Modifier les temps passés sélectionnés
text_time_entries_destroy_confirmation: "Etes-vous sûr de vouloir supprimer les temps passés sélectionnés ?"
field_scm_path_encoding: Encodage des chemins
text_scm_path_encoding_note: "Défaut : UTF-8"
field_path_to_repository: Chemin du dépôt
field_root_directory: Répertoire racine
field_cvs_module: Module
field_cvsroot: CVSROOT
text_mercurial_repository_note: "Dépôt local (exemples : /hgrepo, c:\\hgrepo)"
text_scm_command: Commande
text_scm_command_version: Version
label_git_report_last_commit: Afficher le dernier commit des fichiers et répertoires
text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
label_diff: diff
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Ordre de tri
description_project_scope: Périmètre de recherche
description_filter: Filtre description_filter: Filtre
description_user_mail_notification: Option de notification
description_date_from: Date de début
description_message_content: Contenu du message
description_available_columns: Colonnes disponibles
description_all_columns: Toutes les colonnes
description_date_range_interval: Choisir une période
description_issue_category_reassign: Choisir une catégorie
description_search: Champ de recherche description_search: Champ de recherche
description_notes: Notes
description_date_range_list: Choisir une période prédéfinie
description_choose_project: Projets description_choose_project: Projets
description_date_to: Date de fin description_project_scope: Périmètre de recherche
description_notes: Notes
description_message_content: Contenu du message
description_query_sort_criteria_attribute: Critère de tri description_query_sort_criteria_attribute: Critère de tri
description_wiki_subpages_reassign: Choisir une nouvelle page parent description_query_sort_criteria_direction: Ordre de tri
description_user_mail_notification: Option de notification
description_available_columns: Colonnes disponibles
description_selected_columns: Colonnes sélectionnées description_selected_columns: Colonnes sélectionnées
label_parent_revision: Parent description_all_columns: Toutes les colonnes
label_child_revision: Enfant description_issue_category_reassign: Choisir une catégorie
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale. description_wiki_subpages_reassign: Choisir une nouvelle page parent
setting_repositories_encodings: Encodages des fichiers et des dépôts description_date_range_list: Choisir une période prédéfinie
label_search_for_watchers: Rechercher des observateurs description_date_range_interval: Choisir une période
description_date_from: Date de début
description_date_to: Date de fin
text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.<br />Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.<br />Un fois sauvegardé, l''identifiant ne pourra plus être modifié.'
text_convert_available: Binaire convert de ImageMagick présent (optionel)

View File

@ -1123,3 +1123,7 @@ gl:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1117,3 +1117,7 @@ he:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1113,3 +1113,7 @@ hr:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1131,3 +1131,7 @@
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1116,3 +1116,7 @@ id:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1111,3 +1111,7 @@ it:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -354,8 +354,8 @@ ja:
setting_attachment_max_size: 添付ファイルサイズの上限 setting_attachment_max_size: 添付ファイルサイズの上限
setting_issues_export_limit: エクスポートするチケット数の上限 setting_issues_export_limit: エクスポートするチケット数の上限
setting_mail_from: 送信元メールアドレス setting_mail_from: 送信元メールアドレス
setting_bcc_recipients: ブラインドカーボンコピーで受信(bcc) setting_bcc_recipients: 宛先を非表示(bcc)
setting_plain_text_mail: プレインテキストのみ(HTMLなし) setting_plain_text_mail: プレインテキスト形式(HTMLなし)
setting_host_name: ホスト名 setting_host_name: ホスト名
setting_text_formatting: テキストの書式 setting_text_formatting: テキストの書式
setting_cache_formatted_text: 書式化されたテキストをキャッシュする setting_cache_formatted_text: 書式化されたテキストをキャッシュする
@ -489,12 +489,12 @@ ja:
label_issue_plural: チケット label_issue_plural: チケット
label_issue_view_all: すべてのチケットを見る label_issue_view_all: すべてのチケットを見る
label_issues_by: "%{value} 別のチケット" label_issues_by: "%{value} 別のチケット"
label_issue_added: チケットが追加されました label_issue_added: チケットの追加
label_issue_updated: チケットが更新されました label_issue_updated: チケットの更新
label_document: 文書 label_document: 文書
label_document_new: 新しい文書 label_document_new: 新しい文書
label_document_plural: 文書 label_document_plural: 文書
label_document_added: 文書が追加されました label_document_added: 文書の追加
label_role: ロール label_role: ロール
label_role_plural: ロール label_role_plural: ロール
label_role_new: 新しいロール label_role_new: 新しいロール
@ -566,7 +566,7 @@ ja:
label_attachment_new: 新しいファイル label_attachment_new: 新しいファイル
label_attachment_delete: ファイルを削除 label_attachment_delete: ファイルを削除
label_attachment_plural: ファイル label_attachment_plural: ファイル
label_file_added: ファイルが追加されました label_file_added: ファイルの追加
label_report: レポート label_report: レポート
label_report_plural: レポート label_report_plural: レポート
label_news: ニュース label_news: ニュース
@ -574,8 +574,8 @@ ja:
label_news_plural: ニュース label_news_plural: ニュース
label_news_latest: 最新ニュース label_news_latest: 最新ニュース
label_news_view_all: すべてのニュースを見る label_news_view_all: すべてのニュースを見る
label_news_added: ニュースが追加されました label_news_added: ニュースの追加
label_news_comment_added: ニュースにコメントが追加されました label_news_comment_added: ニュースへのコメント追加
label_settings: 設定 label_settings: 設定
label_overview: 概要 label_overview: 概要
label_version: バージョン label_version: バージョン
@ -748,7 +748,7 @@ ja:
label_message_plural: メッセージ label_message_plural: メッセージ
label_message_last: 最新のメッセージ label_message_last: 最新のメッセージ
label_message_new: 新しいメッセージ label_message_new: 新しいメッセージ
label_message_posted: メッセージが追加されました label_message_posted: メッセージの追加
label_reply_plural: 返答 label_reply_plural: 返答
label_send_information: アカウント情報をユーザーに送信 label_send_information: アカウント情報をユーザーに送信
label_year: label_year:
@ -809,8 +809,8 @@ ja:
label_ascending: 昇順 label_ascending: 昇順
label_descending: 降順 label_descending: 降順
label_date_from_to: "%{start}から%{end}まで" label_date_from_to: "%{start}から%{end}まで"
label_wiki_content_added: Wikiページが追加されました label_wiki_content_added: Wikiページの追加
label_wiki_content_updated: Wikiページが更新されました label_wiki_content_updated: Wikiページの更新
label_group: グループ label_group: グループ
label_group_plural: グループ label_group_plural: グループ
label_group_new: 新しいグループ label_group_new: 新しいグループ
@ -894,7 +894,7 @@ ja:
field_active: 有効 field_active: 有効
text_select_mail_notifications: どのメール通知を送信するか、アクションを選択してください。 text_select_mail_notifications: メール通知の送信対象とする操作を選択してください。
text_regexp_info: 例) ^[A-Z0-9]+$ text_regexp_info: 例) ^[A-Z0-9]+$
text_min_max_length_info: 0だと無制限になります text_min_max_length_info: 0だと無制限になります
text_project_destroy_confirmation: 本当にこのプロジェクトと関連データを削除しますか? text_project_destroy_confirmation: 本当にこのプロジェクトと関連データを削除しますか?
@ -995,9 +995,9 @@ ja:
label_role_anonymous: 匿名ユーザー label_role_anonymous: 匿名ユーザー
label_role_non_member: 非メンバー label_role_non_member: 非メンバー
label_issue_note_added: 注記が追加されました label_issue_note_added: 注記の追加
label_issue_status_updated: ステータスが更新されました label_issue_status_updated: ステータスの更新
label_issue_priority_updated: 優先度が更新されました label_issue_priority_updated: 優先度の更新
label_issues_visibility_own: 作成者か担当者であるチケット label_issues_visibility_own: 作成者か担当者であるチケット
field_issues_visibility: 表示できるチケット field_issues_visibility: 表示できるチケット
label_issues_visibility_all: すべてのチケット label_issues_visibility_all: すべてのチケット
@ -1135,5 +1135,8 @@ ja:
label_link_values_to: 値に設定するリンクURL label_link_values_to: 値に設定するリンクURL
setting_force_default_language_for_anonymous: 匿名ユーザーに既定の言語を強制 setting_force_default_language_for_anonymous: 匿名ユーザーに既定の言語を強制
setting_force_default_language_for_loggedin: ログインユーザーに既定の言語を強制 setting_force_default_language_for_loggedin: ログインユーザーに既定の言語を強制
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: カスタムフィールドを追加するオブジェクトを選択してください
is to be attached label_issue_assigned_to_updated: 担当者の更新
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1131,33 +1131,32 @@ ko:
permission_add_documents: 문서 추가 permission_add_documents: 문서 추가
permission_edit_documents: 문서 편집 permission_edit_documents: 문서 편집
permission_delete_documents: 문서 삭제 permission_delete_documents: 문서 삭제
label_gantt_progress_line: Progress line label_gantt_progress_line: 진행 선
setting_jsonp_enabled: JSONP 허용 setting_jsonp_enabled: JSONP 허용
field_inherit_members: 상위 프로젝트로부터 구성원을 상속 field_inherit_members: 상위 프로젝트로부터 구성원을 상속
field_closed_on: 완료일 field_closed_on: 완료일
field_generate_password: Generate password field_generate_password: 비밀번호 생성
setting_default_projects_tracker_ids: 새 프로젝트에 기본적으로 추가할 일감 유형 setting_default_projects_tracker_ids: 새 프로젝트에 기본적으로 추가할 일감 유형
label_total_time: 합계 label_total_time: 합계
notice_account_not_activated_yet: You haven't activated your account yet. If you want notice_account_not_activated_yet: 계정이 활성화되지 않았습니다. 계정을 활성화하기 위해 메일을 다시 수신하려면 <a href="%{url}">여기를 클릭해 주세요</a>.
to receive a new activation email, please <a href="%{url}">click this link</a>. notice_account_locked: 계정이 잠겨 있습니다.
notice_account_locked: Your account is locked. label_hidden: 숨김
label_hidden: Hidden label_visibility_private: 자신 만
label_visibility_private: to me only label_visibility_roles: 다음 역할 만
label_visibility_roles: to these roles only label_visibility_public: 모든 사용자
label_visibility_public: to any users field_must_change_passwd: 다음 로그온 시 반드시 암호를 변경해야 함
field_must_change_passwd: Must change password at next logon notice_new_password_must_be_different: 새 암호는 현재 암호와 달라야 합니다.
notice_new_password_must_be_different: The new password must be different from the setting_mail_handler_excluded_filenames: 제외할 첨부 파일명
current password text_convert_available: ImageMagick 변환 사용 가능 (옵션)
setting_mail_handler_excluded_filenames: Exclude attachments by name label_link: 링크
text_convert_available: ImageMagick convert available (optional) label_only: 다음의 것만
label_link: Link label_drop_down_list: 드롭다운 목록
label_only: only label_checkboxes: 체크박스
label_drop_down_list: drop-down list label_link_values_to: URL 링크 값
label_checkboxes: checkboxes setting_force_default_language_for_anonymous: 익명 사용자의 기본 언어 강제
label_link_values_to: Link values to URL setting_force_default_language_for_loggedin: 로그인 사용자의 기본 언어 강제
setting_force_default_language_for_anonymous: Force default language for anonymous label_custom_field_select_type: 사용자 정의 필드에 추가할 대상을 선택해주세요.
users label_issue_assigned_to_updated: Assignee updated
setting_force_default_language_for_loggedin: Force default language for logged-in label_check_for_updates: Check for updates
users label_latest_compatible_version: Latest compatible version
label_custom_field_select_type: Select the type of object to which the custom field label_unknown_plugin: Unknown plugin
is to be attached

View File

@ -1171,3 +1171,7 @@ lt:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1106,3 +1106,7 @@ lv:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1112,3 +1112,7 @@ mk:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1113,3 +1113,7 @@ mn:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1091,3 +1091,7 @@ nl:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1102,3 +1102,7 @@
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -150,7 +150,7 @@ pl:
# Wiktor Wandachowicz <siryes@gmail.com>, 2010 # Wiktor Wandachowicz <siryes@gmail.com>, 2010
actionview_instancetag_blank_option: Proszę wybrać actionview_instancetag_blank_option: Proszę wybrać
actionview_instancetag_blank_option: Proszę wybierz actionview_instancetag_blank_option: wybierz
button_activate: Aktywuj button_activate: Aktywuj
button_add: Dodaj button_add: Dodaj
@ -228,18 +228,18 @@ pl:
field_attr_lastname: Nazwisko atrybut field_attr_lastname: Nazwisko atrybut
field_attr_login: Login atrybut field_attr_login: Login atrybut
field_attr_mail: E-mail atrybut field_attr_mail: E-mail atrybut
field_auth_source: Tryb identyfikacji field_auth_source: Tryb uwierzytelniania
field_author: Autor field_author: Autor
field_base_dn: Base DN field_base_dn: Base DN
field_category: Kategoria field_category: Kategoria
field_column_names: Nazwy kolumn field_column_names: Nazwy kolumn
field_comments: Komentarz field_comments: Komentarz
field_comments_sorting: Pokazuj komentarze field_comments_sorting: Pokazuj komentarze
field_created_on: Stworzone field_created_on: Data utworzenia
field_default_value: Domyślny field_default_value: Domyślny
field_delay: Opóźnienie field_delay: Opóźnienie
field_description: Opis field_description: Opis
field_done_ratio: "% Wykonane" field_done_ratio: "% Wykonania"
field_downloads: Pobrań field_downloads: Pobrań
field_due_date: Data oddania field_due_date: Data oddania
field_effective_date: Data field_effective_date: Data
@ -298,7 +298,7 @@ pl:
field_title: Tytuł field_title: Tytuł
field_tracker: Typ zagadnienia field_tracker: Typ zagadnienia
field_type: Typ field_type: Typ
field_updated_on: Zmienione field_updated_on: Data modyfikacji
field_url: URL field_url: URL
field_user: Użytkownik field_user: Użytkownik
field_value: Wartość field_value: Wartość
@ -337,10 +337,10 @@ pl:
label_attachment_plural: Pliki label_attachment_plural: Pliki
label_attribute: Atrybut label_attribute: Atrybut
label_attribute_plural: Atrybuty label_attribute_plural: Atrybuty
label_auth_source: Tryb identyfikacji label_auth_source: Tryb uwierzytelniania
label_auth_source_new: Nowy tryb identyfikacji label_auth_source_new: Nowy tryb uwierzytelniania
label_auth_source_plural: Tryby identyfikacji label_auth_source_plural: Tryby uwierzytelniania
label_authentication: Identyfikacja label_authentication: Uwierzytelnianie
label_blocked_by: blokowane przez label_blocked_by: blokowane przez
label_blocks: blokuje label_blocks: blokuje
label_board: Forum label_board: Forum
@ -411,7 +411,7 @@ pl:
label_diff_inline: w linii label_diff_inline: w linii
label_diff_side_by_side: obok siebie label_diff_side_by_side: obok siebie
label_disabled: zablokowany label_disabled: zablokowany
label_display_per_page: "Na stronę: %{value}" label_display_per_page: "Na stronie: %{value}"
label_document: Dokument label_document: Dokument
label_document_added: Dodano dokument label_document_added: Dodano dokument
label_document_new: Nowy dokument label_document_new: Nowy dokument
@ -477,8 +477,8 @@ pl:
label_last_week: ostatni tydzień label_last_week: ostatni tydzień
label_latest_revision: Najnowsza rewizja label_latest_revision: Najnowsza rewizja
label_latest_revision_plural: Najnowsze rewizje label_latest_revision_plural: Najnowsze rewizje
label_ldap_authentication: Autoryzacja LDAP label_ldap_authentication: Uwierzytelnianie LDAP
label_less_than_ago: dni mniej label_less_than_ago: dni temu
label_list: Lista label_list: Lista
label_loading: Ładowanie... label_loading: Ładowanie...
label_logged_as: Zalogowany jako label_logged_as: Zalogowany jako
@ -499,7 +499,7 @@ pl:
label_month: Miesiąc label_month: Miesiąc
label_months_from: miesiące od label_months_from: miesiące od
label_more: Więcej label_more: Więcej
label_more_than_ago: dni więcej label_more_than_ago: dni od teraz
label_my_account: Moje konto label_my_account: Moje konto
label_my_page: Moja strona label_my_page: Moja strona
label_my_projects: Moje projekty label_my_projects: Moje projekty
@ -603,7 +603,7 @@ pl:
label_string: Tekst label_string: Tekst
label_subproject_plural: Podprojekty label_subproject_plural: Podprojekty
label_text: Długi tekst label_text: Długi tekst
label_theme: Temat label_theme: Motyw
label_this_month: ten miesiąc label_this_month: ten miesiąc
label_this_week: ten tydzień label_this_week: ten tydzień
label_this_year: ten rok label_this_year: ten rok
@ -655,7 +655,7 @@ pl:
notice_account_unknown_email: Nieznany użytkownik. notice_account_unknown_email: Nieznany użytkownik.
notice_account_updated: Konto prawidłowo zaktualizowane. notice_account_updated: Konto prawidłowo zaktualizowane.
notice_account_wrong_password: Złe hasło notice_account_wrong_password: Złe hasło
notice_can_t_change_password: To konto ma zewnętrzne źródło identyfikacji. Nie możesz zmienić hasła. notice_can_t_change_password: To konto ma zewnętrzne źródło uwierzytelniania. Nie możesz zmienić hasła.
notice_default_data_loaded: Domyślna konfiguracja została pomyślnie załadowana. notice_default_data_loaded: Domyślna konfiguracja została pomyślnie załadowana.
notice_email_error: "Wystąpił błąd w trakcie wysyłania e-maila (%{value})" notice_email_error: "Wystąpił błąd w trakcie wysyłania e-maila (%{value})"
notice_email_sent: "E-mail został wysłany do %{value}" notice_email_sent: "E-mail został wysłany do %{value}"
@ -666,9 +666,9 @@ pl:
notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować." notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować."
notice_not_authorized: Nie posiadasz autoryzacji do oglądania tej strony. notice_not_authorized: Nie posiadasz autoryzacji do oglądania tej strony.
notice_successful_connection: Udane nawiązanie połączenia. notice_successful_connection: Udane nawiązanie połączenia.
notice_successful_create: Utworzenie zakończone sukcesem. notice_successful_create: Utworzenie zakończone pomyślnie.
notice_successful_delete: Usunięcie zakończone sukcesem. notice_successful_delete: Usunięcie zakończone pomyślnie.
notice_successful_update: Uaktualnienie zakończone sukcesem. notice_successful_update: Uaktualnienie zakończone pomyślnie.
notice_unable_delete_version: Nie można usunąć wersji notice_unable_delete_version: Nie można usunąć wersji
permission_add_issue_notes: Dodawanie notatek permission_add_issue_notes: Dodawanie notatek
permission_add_issue_watchers: Dodawanie obserwatorów permission_add_issue_watchers: Dodawanie obserwatorów
@ -732,7 +732,7 @@ pl:
setting_autofetch_changesets: Automatyczne pobieranie zmian setting_autofetch_changesets: Automatyczne pobieranie zmian
setting_autologin: Automatyczne logowanie setting_autologin: Automatyczne logowanie
setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc) setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc)
setting_commit_fix_keywords: Słowa zmieniające status setting_commit_fix_keywords: Słowo zmieniające status
setting_commit_ref_keywords: Słowa tworzące powiązania setting_commit_ref_keywords: Słowa tworzące powiązania
setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami
setting_date_format: Format daty setting_date_format: Format daty
@ -758,7 +758,7 @@ pl:
setting_sys_api_enabled: Włączenie WS do zarządzania repozytorium setting_sys_api_enabled: Włączenie WS do zarządzania repozytorium
setting_text_formatting: Formatowanie tekstu setting_text_formatting: Formatowanie tekstu
setting_time_format: Format czasu setting_time_format: Format czasu
setting_user_format: Własny format wyświetlania setting_user_format: Format wyświetlania użytkownika
setting_welcome_text: Tekst powitalny setting_welcome_text: Tekst powitalny
setting_wiki_compression: Kompresja historii Wiki setting_wiki_compression: Kompresja historii Wiki
status_active: aktywny status_active: aktywny
@ -782,7 +782,7 @@ pl:
text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii
text_issue_updated: "Zagadnienie %{id} zostało zaktualizowane (przez %{author})." text_issue_updated: "Zagadnienie %{id} zostało zaktualizowane (przez %{author})."
text_issues_destroy_confirmation: 'Czy jesteś pewien, że chcesz usunąć wskazane zagadnienia?' text_issues_destroy_confirmation: 'Czy jesteś pewien, że chcesz usunąć wskazane zagadnienia?'
text_issues_ref_in_commit_messages: Odwołania do zagadnień w komentarzach zatwierdzeń text_issues_ref_in_commit_messages: Odwołania do zagadnień Redmine w komentarzach w repozytorium
text_length_between: "Długość pomiędzy %{min} i %{max} znaków." text_length_between: "Długość pomiędzy %{min} i %{max} znaków."
text_load_default_configuration: Załaduj domyślną konfigurację text_load_default_configuration: Załaduj domyślną konfigurację
text_min_max_length_info: 0 oznacza brak restrykcji text_min_max_length_info: 0 oznacza brak restrykcji
@ -888,7 +888,7 @@ pl:
label_version_sharing_system: Ze wszystkimi projektami label_version_sharing_system: Ze wszystkimi projektami
label_version_sharing_tree: Z drzewem projektów label_version_sharing_tree: Z drzewem projektów
notice_api_access_key_reseted: Twój klucz dostępu do API został zresetowany. notice_api_access_key_reseted: Twój klucz dostępu do API został zresetowany.
notice_issue_done_ratios_updated: Uaktualnienie % wykonania zakończone sukcesem. notice_issue_done_ratios_updated: Uaktualnienie % wykonania zakończone pomyślnie.
permission_add_subprojects: Tworzenie podprojektów permission_add_subprojects: Tworzenie podprojektów
permission_delete_issue_watchers: Usuń obserwatorów permission_delete_issue_watchers: Usuń obserwatorów
permission_view_issues: Przeglądanie zagadnień permission_view_issues: Przeglądanie zagadnień
@ -935,45 +935,45 @@ pl:
project_module_calendar: Kalendarz project_module_calendar: Kalendarz
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of label_user_mail_option_only_owner: Tylko to, czego jestem właścicielem (autorem)
setting_default_notification_option: Default notification option setting_default_notification_option: Domyślna opcja powiadomień
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_my_events: "Tylko to, co obserwuję lub w czym biorę udział"
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_assigned: "Tylko to, do czego jestem przypisany"
label_user_mail_option_none: "Tylko to, co obserwuję lub w czym biorę udział" label_user_mail_option_none: "Brak powiadomień"
field_member_of_group: Assignee's group field_member_of_group: Grupa osoby przypisanej
field_assigned_to_role: Assignee's role field_assigned_to_role: Rola osoby przypisanej
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: The project you're trying to access has been archived.
label_principal_search: "Szukaj użytkownika lub grupy:" label_principal_search: "Szukaj użytkownika lub grupy:"
label_user_search: "Szukaj użytkownika:" label_user_search: "Szukaj użytkownika:"
field_visible: Visible field_visible: Widoczne
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Aktywność dla śledzonego czasu
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Applied in changeset %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Włącz śledzenie czasu
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Maksymalna liczba elementów wyświetlanych na diagramie Gantta
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: Ostrzegaj mnie, gdy opuszczam stronę z niezapisanym tekstem
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries label_my_queries: Moje kwerendy
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news label_news_comment_added: Dodano komentarz do komunikatu
button_expand_all: Expand all button_expand_all: Rozwiń wszystkie
button_collapse_all: Collapse all button_collapse_all: Zwiń wszystkie
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous label_role_anonymous: Anonimowy
label_role_non_member: Non member label_role_non_member: Bez roli
label_issue_note_added: Note added label_issue_note_added: Dodano notatkę
label_issue_status_updated: Status updated label_issue_status_updated: Uaktualniono status
label_issue_priority_updated: Priority updated label_issue_priority_updated: Uaktualniono priorytet
label_issues_visibility_own: Issues created by or assigned to the user label_issues_visibility_own: Utworzone lub przypisane do użytkownika
field_issues_visibility: Issues visibility field_issues_visibility: Widoczne zagadnienia
label_issues_visibility_all: All issues label_issues_visibility_all: Wszystkie
permission_set_own_issues_private: Set own issues public or private permission_set_own_issues_private: Ustawianie własnych zagadnień jako prywatne/publiczne
field_is_private: Private field_is_private: Prywatne
permission_set_issues_private: Set issues public or private permission_set_issues_private: Ustawianie zagadnień jako prywatne/publiczne
label_issues_visibility_public: All non private issues label_issues_visibility_public: Wszystkie nie prywatne
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
field_commit_logs_encoding: Kodowanie komentarzy zatwierdzeń field_commit_logs_encoding: Kodowanie komentarzy zatwierdzeń
field_scm_path_encoding: Path encoding field_scm_path_encoding: Path encoding
@ -983,12 +983,12 @@ pl:
field_cvs_module: Module field_cvs_module: Module
field_cvsroot: CVSROOT field_cvsroot: CVSROOT
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command text_scm_command: Polecenie
text_scm_command_version: Version text_scm_command_version: Wersja
label_git_report_last_commit: Report last commit for files and directories label_git_report_last_commit: Report last commit for files and directories
notice_issue_successful_create: Issue %{id} created. notice_issue_successful_create: Issue %{id} created.
label_between: between label_between: pomiędzy
setting_issue_group_assignment: Allow issue assignment to groups setting_issue_group_assignment: Zezwól przypisywać zagadnienia do grup
label_diff: diff label_diff: diff
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Sort direction description_query_sort_criteria_direction: Sort direction
@ -997,7 +997,7 @@ pl:
description_user_mail_notification: Mail notification settings description_user_mail_notification: Mail notification settings
description_date_from: Enter start date description_date_from: Enter start date
description_message_content: Message content description_message_content: Message content
description_available_columns: Available Columns description_available_columns: Dostępne kolumny
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Choose range by selecting start and end date
description_issue_category_reassign: Choose issue category description_issue_category_reassign: Choose issue category
description_search: Searchfield description_search: Searchfield
@ -1007,13 +1007,13 @@ pl:
description_date_to: Enter end date description_date_to: Enter end date
description_query_sort_criteria_attribute: Sort attribute description_query_sort_criteria_attribute: Sort attribute
description_wiki_subpages_reassign: Choose new parent page description_wiki_subpages_reassign: Choose new parent page
description_selected_columns: Selected Columns description_selected_columns: Wybrane kolumny
label_parent_revision: Parent label_parent_revision: Parent
label_child_revision: Child label_child_revision: Child
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues setting_default_issue_start_date_to_creation_date: Użyj bieżącej daty jako daty rozpoczęcia nowych zagadnień
button_edit_section: Edit this section button_edit_section: Edit this section
setting_repositories_encodings: Attachments and repositories encodings setting_repositories_encodings: Kodowanie znaków załączników i repozytoriów
description_all_columns: All Columns description_all_columns: All Columns
button_export: Export button_export: Export
label_export_options: "%{export_format} export options" label_export_options: "%{export_format} export options"
@ -1030,107 +1030,109 @@ pl:
label_completed_versions: Completed versions label_completed_versions: Completed versions
text_project_identifier_info: 'Dozwolone małe litery (a-z), liczby i myślniki.<br />Raz zapisany, identyfikator nie może być zmieniony.' text_project_identifier_info: 'Dozwolone małe litery (a-z), liczby i myślniki.<br />Raz zapisany, identyfikator nie może być zmieniony.'
field_multiple: Multiple values field_multiple: Multiple values
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Zezwól na odwołania do innych projektów i zamykanie zagadnień innych projektów
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: Manage related issues permission_manage_related_issues: Zarządzanie powiązanymi zagadnieniami
field_auth_source_ldap_filter: LDAP filter field_auth_source_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Wyszukaj obserwatorów do dodania
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Twoje konto zostało trwale usunięte.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Zezwól użytkownikom usuwać swoje konta
button_delete_my_account: Delete my account button_delete_my_account: Usuń moje konto
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Czy jesteś pewien?
Your account will be permanently deleted, with no way to reactivate it. Twoje konto zostanie trwale usunięte, bez możliwości przywrócenia go.
error_session_expired: Your session has expired. Please login again. error_session_expired: Twoja sesja wygasła. Zaloguj się ponownie.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." text_session_expiration_settings: "Uwaga: zmiana tych ustawień może spowodować przeterminowanie sesji obecnie zalogowanych użytkowników, w tym twojej."
setting_session_lifetime: Session maximum lifetime setting_session_lifetime: Maksymalny czas życia sesji
setting_session_timeout: Session inactivity timeout setting_session_timeout: Maksymalny czas życia nieaktywnej sesji
label_session_expiration: Session expiration label_session_expiration: Przeterminowywanie sesji
permission_close_project: Close / reopen the project permission_close_project: Zamykanie / otwieranie projektów
label_show_closed_projects: View closed projects label_show_closed_projects: Przeglądanie zamkniętych projektów
button_close: Close button_close: Zamknij projekt
button_reopen: Reopen button_reopen: Otwórz projekt
project_status_active: active project_status_active: aktywny
project_status_closed: closed project_status_closed: zamknięty
project_status_archived: archived project_status_archived: zarchiwizowany
text_project_closed: This project is closed and read-only. text_project_closed: Ten projekt jest zamknięty i dostępny tylko do odczytu.
notice_user_successful_create: User %{id} created. notice_user_successful_create: Utworzono użytkownika %{id}.
field_core_fields: Standard fields field_core_fields: Pola standardowe
field_timeout: Timeout (in seconds) field_timeout: Limit czasu (w sekundach)
setting_thumbnails_enabled: Display attachment thumbnails setting_thumbnails_enabled: Wyświetlaj miniatury załączników
setting_thumbnails_size: Thumbnails size (in pixels) setting_thumbnails_size: Rozmiar minuatury (w pikselach)
label_status_transitions: Status transitions label_status_transitions: Przejścia między statusami
label_fields_permissions: Fields permissions label_fields_permissions: Uprawnienia do pól
label_readonly: Read-only label_readonly: Tylko do odczytu
label_required: Required label_required: Wymagane
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed. text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_board_parent: Parent forum field_board_parent: Parent forum
label_attribute_of_project: Project's %{name} label_attribute_of_project: Project's %{name}
label_attribute_of_author: Author's %{name} label_attribute_of_author: Author's %{name}
label_attribute_of_assigned_to: Assignee's %{name} label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name} label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks label_copy_subtasks: Kopiuj podzagadnienia
label_copied_to: copied to label_copied_to: skopiowane do
label_copied_from: copied from label_copied_from: skopiowane z
label_any_issues_in_project: any issues in project label_any_issues_in_project: dowolne zagadnienie w projekcie
label_any_issues_not_in_project: any issues not in project label_any_issues_not_in_project: dowolne zagadnienie w innym projekcie
field_private_notes: Private notes field_private_notes: Prywatne notatki
permission_view_private_notes: View private notes permission_view_private_notes: Podgląd prywatnych notatek
permission_set_notes_private: Set notes as private permission_set_notes_private: Ustawianie notatek jako prywatnych
label_no_issues_in_project: no issues in project label_no_issues_in_project: brak zagadnień w projekcie
label_any: wszystko label_any: wszystko
label_last_n_weeks: last %{count} weeks label_last_n_weeks: ostatnie %{count} tygodnie
setting_cross_project_subtasks: Allow cross-project subtasks setting_cross_project_subtasks: Powiązania zagadnień między projektami
label_cross_project_descendants: Z podprojektami label_cross_project_descendants: Z podprojektami
label_cross_project_tree: Z drzewem projektów label_cross_project_tree: Z drzewem projektów
label_cross_project_hierarchy: Z hierarchią projektów label_cross_project_hierarchy: Z hierarchią projektów
label_cross_project_system: Ze wszystkimi projektami label_cross_project_system: Ze wszystkimi projektami
button_hide: Hide button_hide: Ukryj
setting_non_working_week_days: Non-working days setting_non_working_week_days: Dni nie-robocze
label_in_the_next_days: in the next label_in_the_next_days: w ciągu następnych dni
label_in_the_past_days: in the past label_in_the_past_days: w ciągu poprzednich dni
label_attribute_of_user: User's %{name} label_attribute_of_user: User's %{name}
text_turning_multiple_off: If you disable multiple values, multiple values will be text_turning_multiple_off: If you disable multiple values, multiple values will be
removed in order to preserve only one value per item. removed in order to preserve only one value per item.
label_attribute_of_issue: Issue's %{name} label_attribute_of_issue: Issue's %{name}
permission_add_documents: Add documents permission_add_documents: Dodawanie dokumentów
permission_edit_documents: Edit documents permission_edit_documents: Edycja dokumentów
permission_delete_documents: Delete documents permission_delete_documents: Usuwanie dokumentów
label_gantt_progress_line: Progress line label_gantt_progress_line: Linia postępu
setting_jsonp_enabled: Enable JSONP support setting_jsonp_enabled: Uaktywnij wsparcie dla JSONP
field_inherit_members: Inherit members field_inherit_members: Dziedziczenie członków
field_closed_on: Closed field_closed_on: Data zamknięcia
field_generate_password: Generate password field_generate_password: Wygeneruj hasło
setting_default_projects_tracker_ids: Default trackers for new projects setting_default_projects_tracker_ids: Domyślne typy zagadnień dla nowych projektów
label_total_time: Ogółem label_total_time: Ogółem
text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_config: Możesz skonfigurować polecenia SCM w pliku config/configuration.yml. Zrestartuj aplikację po wykonaniu zmian.
text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. text_scm_command_not_available: Polecenie SCM nie jest dostępne. Proszę sprawdzić ustawienia w panelu administracyjnym.
setting_emails_header: Email header setting_emails_header: Nagłówek e-maili
notice_account_not_activated_yet: You haven't activated your account yet. If you want notice_account_not_activated_yet: Jeszcze nie aktywowałeś swojego konta. Jeśli chcesz
to receive a new activation email, please <a href="%{url}">click this link</a>. otrzymać nowy e-mail aktywanyjny, <a href="%{url}">kliknij tutaj</a>.
notice_account_locked: Your account is locked. notice_account_locked: Twoje konto jest zablokowane.
notice_account_register_done: Account was successfully created. An email containing notice_account_register_done: Konto zostało pomyślnie utworzone. E-mail zawierający
the instructions to activate your account was sent to %{email}. instrukcję aktywacji konta został wysłany na adres %{email}.
label_hidden: Hidden label_hidden: Hidden
label_visibility_private: to me only label_visibility_private: tylko dla mnie
label_visibility_roles: to these roles only label_visibility_roles: tylko dla ról
label_visibility_public: to any users label_visibility_public: dla wszystkich
field_must_change_passwd: Must change password at next logon field_must_change_passwd: Musi zmienić hasło przy następnym logowaniu
notice_new_password_must_be_different: The new password must be different from the notice_new_password_must_be_different: The new password must be different from the
current password current password
setting_mail_handler_excluded_filenames: Exclude attachments by name setting_mail_handler_excluded_filenames: Wyklucz załączniki wg nazwy
text_convert_available: ImageMagick convert available (optional) text_convert_available: Konwersja przez ImageMagick dostępna (optional)
label_link: Link label_link: Link
label_only: only label_only: only
label_drop_down_list: drop-down list label_drop_down_list: drop-down list
label_checkboxes: checkboxes label_checkboxes: checkboxes
label_link_values_to: Link values to URL label_link_values_to: Link values to URL
setting_force_default_language_for_anonymous: Force default language for anonymous setting_force_default_language_for_anonymous: Wymuś domyślny język dla anonimowych użytkowników
users setting_force_default_language_for_loggedin: Wymuś domyślny język dla zalogowanych użytkowników
setting_force_default_language_for_loggedin: Force default language for logged-in
users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Uaktualniono osobę przypisaną
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1131,3 +1131,7 @@ pt-BR:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1118,3 +1118,7 @@ pt:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1107,3 +1107,7 @@ ro:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1217,5 +1217,8 @@ ru:
label_link_values_to: Значения ссылки для URL label_link_values_to: Значения ссылки для URL
setting_force_default_language_for_anonymous: Не определять язык для анонимных пользователей setting_force_default_language_for_anonymous: Не определять язык для анонимных пользователей
setting_force_default_language_for_loggedin: Не определять язык для зарегистрированных пользователей setting_force_default_language_for_loggedin: Не определять язык для зарегистрированных пользователей
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Выберите тип объекта для которого будет создано настраиваемое поле
is to be attached label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1102,3 +1102,7 @@ sk:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1112,3 +1112,7 @@ sl:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1108,3 +1108,7 @@ sq:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1114,3 +1114,7 @@ sr-YU:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1113,3 +1113,7 @@ sr:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1150,3 +1150,7 @@ sv:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1109,3 +1109,7 @@ th:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -357,7 +357,7 @@ tr:
label_tracker_new: Yeni iş tipi label_tracker_new: Yeni iş tipi
label_workflow: İş akışı label_workflow: İş akışı
label_issue_status: İş durumu label_issue_status: İş durumu
label_issue_status_plural: İş durumuları label_issue_status_plural: İş durumları
label_issue_status_new: Yeni durum label_issue_status_new: Yeni durum
label_issue_category: İş kategorisi label_issue_category: İş kategorisi
label_issue_category_plural: İş kategorileri label_issue_category_plural: İş kategorileri
@ -1121,3 +1121,7 @@ tr:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1107,3 +1107,7 @@ uk:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -1165,3 +1165,7 @@ vi:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -278,7 +278,7 @@
error_can_not_delete_custom_field: 無法刪除自訂欄位 error_can_not_delete_custom_field: 無法刪除自訂欄位
error_can_not_delete_tracker: "此追蹤標籤已包含問題,無法被刪除。" error_can_not_delete_tracker: "此追蹤標籤已包含問題,無法被刪除。"
error_can_not_remove_role: "此角色已被使用,無法將其刪除。" error_can_not_remove_role: "此角色已被使用,無法將其刪除。"
error_can_not_reopen_issue_on_closed_version: '派給「已結束」版本的問題,無法再將其狀態變更為「進行中」' error_can_not_reopen_issue_on_closed_version: '派給「已結束」版本的問題,無法再將其狀態變更為「進行中」'
error_can_not_archive_project: 此專案無法被封存 error_can_not_archive_project: 此專案無法被封存
error_issue_done_ratios_not_updated: "問題完成百分比未更新。" error_issue_done_ratios_not_updated: "問題完成百分比未更新。"
error_workflow_copy_source: '請選擇一個來源問題追蹤標籤或角色' error_workflow_copy_source: '請選擇一個來源問題追蹤標籤或角色'
@ -298,7 +298,7 @@
mail_subject_account_activation_request: Redmine 帳號啟用需求通知 mail_subject_account_activation_request: Redmine 帳號啟用需求通知
mail_body_account_activation_request: "有位新用戶 (%{value}) 已經完成註冊,正等候您的審核:" mail_body_account_activation_request: "有位新用戶 (%{value}) 已經完成註冊,正等候您的審核:"
mail_subject_reminder: "您有 %{count} 個問題即將到期 (%{days})" mail_subject_reminder: "您有 %{count} 個問題即將到期 (%{days})"
mail_body_reminder: "%{count} 個派給您的問題,將於 %{days} 天之內到期:" mail_body_reminder: "%{count} 個派給您的問題,將於 %{days} 天之內到期:"
mail_subject_wiki_content_added: "'%{id}' wiki 頁面已被新增" mail_subject_wiki_content_added: "'%{id}' wiki 頁面已被新增"
mail_body_wiki_content_added: "此 '%{id}' wiki 頁面已被 %{author} 新增。" mail_body_wiki_content_added: "此 '%{id}' wiki 頁面已被 %{author} 新增。"
mail_subject_wiki_content_updated: "'%{id}' wiki 頁面已被更新" mail_subject_wiki_content_updated: "'%{id}' wiki 頁面已被更新"
@ -337,7 +337,7 @@
field_tracker: 追蹤標籤 field_tracker: 追蹤標籤
field_subject: 主旨 field_subject: 主旨
field_due_date: 完成日期 field_due_date: 完成日期
field_assigned_to: 分派給 field_assigned_to: 被分派者
field_priority: 優先權 field_priority: 優先權
field_fixed_version: 版本 field_fixed_version: 版本
field_user: 用戶 field_user: 用戶
@ -399,8 +399,8 @@
field_group_by: 結果分組方式 field_group_by: 結果分組方式
field_sharing: 共用 field_sharing: 共用
field_parent_issue: 父問題 field_parent_issue: 父問題
field_member_of_group: "被派者的群組" field_member_of_group: "被派者的群組"
field_assigned_to_role: "被派者的角色" field_assigned_to_role: "被派者的角色"
field_text: 內容文字 field_text: 內容文字
field_visible: 可被看見 field_visible: 可被看見
field_warn_on_leaving_unsaved: "提醒我將要離開的頁面中尚有未儲存的資料" field_warn_on_leaving_unsaved: "提醒我將要離開的頁面中尚有未儲存的資料"
@ -469,7 +469,7 @@
setting_repository_log_display_limit: 修訂版顯示數目之最大值 setting_repository_log_display_limit: 修訂版顯示數目之最大值
setting_openid: 允許使用 OpenID 登入與註冊 setting_openid: 允許使用 OpenID 登入與註冊
setting_password_min_length: 密碼最小長度 setting_password_min_length: 密碼最小長度
setting_new_project_user_role_id: 管理者以外之用戶建立新專案時,將被派的角色 setting_new_project_user_role_id: 管理者以外之用戶建立新專案時,將被派的角色
setting_default_projects_modules: 新專案預設啟用的模組 setting_default_projects_modules: 新專案預設啟用的模組
setting_issue_done_ratio: 計算問題完成百分比之方式 setting_issue_done_ratio: 計算問題完成百分比之方式
setting_issue_done_ratio_issue_field: 依據問題完成百分比欄位 setting_issue_done_ratio_issue_field: 依據問題完成百分比欄位
@ -481,7 +481,7 @@
setting_commit_logtime_enabled: 啟用認可中的時間記錄 setting_commit_logtime_enabled: 啟用認可中的時間記錄
setting_commit_logtime_activity_id: 時間記錄對應的活動 setting_commit_logtime_activity_id: 時間記錄對應的活動
setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值 setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值
setting_issue_group_assignment: 允許問題被派至群組 setting_issue_group_assignment: 允許問題被派至群組
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期 setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題 setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶) setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
@ -593,6 +593,7 @@
label_issue_updated: 問題已更新 label_issue_updated: 問題已更新
label_issue_note_added: 筆記已新增 label_issue_note_added: 筆記已新增
label_issue_status_updated: 狀態已更新 label_issue_status_updated: 狀態已更新
label_issue_assigned_to_updated: 被分派者已更新
label_issue_priority_updated: 優先權已更新 label_issue_priority_updated: 優先權已更新
label_document: 文件 label_document: 文件
label_document_new: 建立新文件 label_document_new: 建立新文件
@ -901,7 +902,7 @@
label_user_mail_option_selected: "只提醒我所選擇專案中的事件..." label_user_mail_option_selected: "只提醒我所選擇專案中的事件..."
label_user_mail_option_none: "取消提醒" label_user_mail_option_none: "取消提醒"
label_user_mail_option_only_my_events: "只提醒我觀察中或參與中的事物" label_user_mail_option_only_my_events: "只提醒我觀察中或參與中的事物"
label_user_mail_option_only_assigned: "只提醒我被派的事物" label_user_mail_option_only_assigned: "只提醒我被派的事物"
label_user_mail_option_only_owner: "只提醒我作為擁有者的事物" label_user_mail_option_only_owner: "只提醒我作為擁有者的事物"
label_user_mail_no_self_notified: "不提醒我自己所做的變更" label_user_mail_no_self_notified: "不提醒我自己所做的變更"
label_registration_activation_by_email: 透過電子郵件啟用帳戶 label_registration_activation_by_email: 透過電子郵件啟用帳戶
@ -913,7 +914,7 @@
label_general: 一般 label_general: 一般
label_more: 更多 » label_more: 更多 »
label_scm: 版本控管 label_scm: 版本控管
label_plugins: 附加元件 label_plugins: 外掛程式
label_ldap_authentication: LDAP 認證 label_ldap_authentication: LDAP 認證
label_downloads_abbr: 下載 label_downloads_abbr: 下載
label_optional_description: 額外的說明 label_optional_description: 額外的說明
@ -956,10 +957,10 @@
label_principal_search: "搜尋用戶或群組:" label_principal_search: "搜尋用戶或群組:"
label_user_search: "搜尋用戶:" label_user_search: "搜尋用戶:"
label_additional_workflow_transitions_for_author: 用戶為作者時額外允許的流程轉換 label_additional_workflow_transitions_for_author: 用戶為作者時額外允許的流程轉換
label_additional_workflow_transitions_for_assignee: 用戶為被指定者時額外允許的流程轉換 label_additional_workflow_transitions_for_assignee: 用戶為被分派者時額外允許的流程轉換
label_issues_visibility_all: 所有問題 label_issues_visibility_all: 所有問題
label_issues_visibility_public: 所有非私人問題 label_issues_visibility_public: 所有非私人問題
label_issues_visibility_own: 使用者所建立的或被派的問題 label_issues_visibility_own: 使用者所建立的或被派的問題
label_git_report_last_commit: 報告最後認可的文件和目錄 label_git_report_last_commit: 報告最後認可的文件和目錄
label_parent_revision: 父項 label_parent_revision: 父項
label_child_revision: 子項 label_child_revision: 子項
@ -979,7 +980,7 @@
label_attribute_of_project: "專案是 %{name}" label_attribute_of_project: "專案是 %{name}"
label_attribute_of_issue: "問題是 %{name}" label_attribute_of_issue: "問題是 %{name}"
label_attribute_of_author: "作者是 %{name}" label_attribute_of_author: "作者是 %{name}"
label_attribute_of_assigned_to: "被派者是 %{name}" label_attribute_of_assigned_to: "被派者是 %{name}"
label_attribute_of_user: "用戶是 %{name}" label_attribute_of_user: "用戶是 %{name}"
label_attribute_of_fixed_version: "版本是 %{name}" label_attribute_of_fixed_version: "版本是 %{name}"
label_cross_project_descendants: 與子專案共用 label_cross_project_descendants: 與子專案共用
@ -996,6 +997,9 @@
label_checkboxes: 核取方塊 label_checkboxes: 核取方塊
label_link_values_to: 連結欄位值至此網址 label_link_values_to: 連結欄位值至此網址
label_custom_field_select_type: 請選擇連結此自訂欄位的物件類型 label_custom_field_select_type: 請選擇連結此自訂欄位的物件類型
label_check_for_updates: 檢查更新
label_latest_compatible_version: 最新的相容版本
label_unknown_plugin: 無法辨識的外掛程式
button_login: 登入 button_login: 登入
button_submit: 送出 button_submit: 送出
@ -1091,10 +1095,10 @@
text_issue_added: "問題 %{id} 已被 %{author} 通報。" text_issue_added: "問題 %{id} 已被 %{author} 通報。"
text_issue_updated: "問題 %{id} 已被 %{author} 更新。" text_issue_updated: "問題 %{id} 已被 %{author} 更新。"
text_wiki_destroy_confirmation: 您確定要刪除這個 wiki 和其中的所有內容? text_wiki_destroy_confirmation: 您確定要刪除這個 wiki 和其中的所有內容?
text_issue_category_destroy_question: "有 (%{count}) 個問題被派到此分類. 請選擇您想要的動作?" text_issue_category_destroy_question: "有 (%{count}) 個問題被派到此分類. 請選擇您想要的動作?"
text_issue_category_destroy_assignments: 移除這些問題的分類 text_issue_category_destroy_assignments: 移除這些問題的分類
text_issue_category_reassign_to: 重新派這些問題至其它分類 text_issue_category_reassign_to: 重新派這些問題至其它分類
text_user_mail_option: "對於那些未被選擇的專案,將只會接收到您正在觀察中,或是參與中的問題通知。(「參與中的問題」包含您建立的或是派給您的問題)" text_user_mail_option: "對於那些未被選擇的專案,將只會接收到您正在觀察中,或是參與中的問題通知。(「參與中的問題」包含您建立的或是派給您的問題)"
text_no_configuration_data: "角色、追蹤標籤、問題狀態與流程尚未被設定完成。\n強烈建議您先載入預設的組態。將預設組態載入之後您可再變更其中之值。" text_no_configuration_data: "角色、追蹤標籤、問題狀態與流程尚未被設定完成。\n強烈建議您先載入預設的組態。將預設組態載入之後您可再變更其中之值。"
text_load_default_configuration: 載入預設組態 text_load_default_configuration: 載入預設組態
text_status_changed_by_changeset: "已套用至變更集 %{value}." text_status_changed_by_changeset: "已套用至變更集 %{value}."
@ -1105,7 +1109,7 @@
text_select_project_modules: '選擇此專案可使用之模組:' text_select_project_modules: '選擇此專案可使用之模組:'
text_default_administrator_account_changed: 已變更預設管理員帳號內容 text_default_administrator_account_changed: 已變更預設管理員帳號內容
text_file_repository_writable: 可寫入附加檔案目錄 text_file_repository_writable: 可寫入附加檔案目錄
text_plugin_assets_writable: 可寫入附加元件目錄 text_plugin_assets_writable: 可寫入外掛程式目錄
text_rmagick_available: 可使用 RMagick (選配) text_rmagick_available: 可使用 RMagick (選配)
text_convert_available: 可使用 ImageMagick 轉換圖片格式 (選配) text_convert_available: 可使用 ImageMagick 轉換圖片格式 (選配)
text_destroy_time_entries_question: 您即將刪除的問題已報工 %{hours} 小時. 您的選擇是? text_destroy_time_entries_question: 您即將刪除的問題已報工 %{hours} 小時. 您的選擇是?

View File

@ -1113,3 +1113,7 @@ zh:
users users
label_custom_field_select_type: Select the type of object to which the custom field label_custom_field_select_type: Select the type of object to which the custom field
is to be attached is to be attached
label_issue_assigned_to_updated: Assignee updated
label_check_for_updates: Check for updates
label_latest_compatible_version: Latest compatible version
label_unknown_plugin: Unknown plugin

View File

@ -0,0 +1,12 @@
class ChangeChangesetsCommentsLimit < ActiveRecord::Migration
def up
if ActiveRecord::Base.connection.adapter_name =~ /mysql/i
max_size = 16.megabytes
change_column :changesets, :comments, :text, :limit => max_size
end
end
def down
# no-op
end
end

View File

@ -4,6 +4,83 @@ Redmine - project management software
Copyright (C) 2006-2014 Jean-Philippe Lang Copyright (C) 2006-2014 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2014-03-29 v2.5.1
* Defect #14298: Error generated on 'search for watchers to add' after clicking add without selected users
* Defect #16236: Right-aligned table of contents (TOC) not working with markdown
* Defect #16255: Internal Error for specific version of non-existent wiki page
* Defect #16259: Changing Tracker value on new issue form makes hidden fields appearing after hitting F5
* Defect #16321: Custom Fields with "Link values to URL" set are displayed as escaped html in email
* Defect #16338: Can't choose an issue of a different project when updating time entries
* Defect #16353: Regexp bug in JournalsController regexp handling when quoting existing journal entries
* Feature #16326: Custom queries, buttons to move column to top and bottom
* Patch #16291: Japanese translation update
* Patch #16319: Random crash when using custom fields
* Patch #16320: Turkish typo fix
* Patch #16334: Korean Translation
* Patch #16336: Russian translation
* Patch #16356: Spanish Translation: label_custom_field_select_type
* Patch #16368: Polish translation update
* Patch #16381: Extract code to render project context links to helper
* Patch #16453: Czech localisation
* Defect #16466: Fixed back url verification
== 2014-03-02 v2.5.0
* Defect #3163: Large inline images overflow
* Defect #13385: Searchable checkbox displayed on edit form for not-searchable custom field formats.
* Defect #13396: Updating an issue with user or list format custom field, currently having value that is locked or removed, clears that field
* Defect #14361: Mercurial commit ids are short (12 digits) on database
* Defect #15377: bundle install --without development test fails
* Defect #15381: Error pages improvement
* Defect #15485: HTML 5 validation multiple ids
* Defect #15551: Validating a Setting with invalid name triggers an error
* Defect #15552: Preferences are not preserved after adding user with validation error
* Defect #15704: Journal for relation should store relation type instead of i18n key
* Defect #15709: TimeEntry custom_values are not deleted from the database when destroying the associated project
* Defect #15831: Successful update notice for workflows
* Defect #15848: REST API: Cannot retrieve memberships of closed projects
* Defect #15929: REST API: Integer custom field validation fails when using non-string values
* Defect #15947: Deadlock when delete issues in same time on multiple sessions
* Defect #15983: Project.activities returns different types depending on context
* Defect #16077: Table of contents macro conflicts with collapse macro
* Defect #16091: Export CSV with many custom field runs many queries
* Defect #16107: ApplicationController mishandles non-Basic authentication information, causing an internal error
* Defect #16143: Can't insert too long comment field from repository (MySQL)
* Feature #1179: Optionally allow Text and Long Text custom fields support wiki formatting
* Feature #1358: Link_to for Custom Field
* Feature #2083: CustomField of type "external-link-to" with configurable URL prefix
* Feature #2549: Enable the watching of news
* Feature #2691: Option to disable automated language-guessing based on HTTP_ACCEPT_LANGUAGE HTTP-header
* Feature #8152: Render Version and User custom fields as links
* Feature #8562: Watchers list too big in new issue form
* Feature #8572: Configuration of which versions (by version-status) are shown in version-format custom fields
* Feature #8842: REST API: Filter issues created/updated before or after specific timestamp
* Feature #13134: Focus first text field automatically
* Feature #14309: Add favicon to Atom feeds
* Feature #15275: Improve usage of label "button_update"
* Feature #15362: Wrap filters, options and buttons with extra div on the issue list
* Feature #15520: Markdown formatting
* Feature #15699: Description for custom fields
* Feature #15701: Add project identifier substitution option to the URL-pattern property of link format custom fields
* Feature #15790: Use the mime-types gem to get mime type for unknown extension
* Feature #15815: REST API : Add project status in API response
* Feature #15926: Redirect to back_url or referer when clicking "Sign in" while already logged-in
* Patch #12753: Update config.i18n.load_path for plugin-supplied locales
* Patch #13774: Show warning if CSV-Export exceeds limit
* Patch #14766: Better block detection on my page
* Patch #15403: Czech "message" and "changeset" translation change
* Patch #15420: Don't create duplicate wikis in tests
* Patch #15689: Make favicon themeable
* Patch #15785: Support more character encodings in incoming emails
== 2014-03-02 v2.4.4
* Defect #16081: Export CSV - Custom field true/false not using translation
* Defect #16161: Parent task search and datepicker not available after changing status
* Defect #16169: Wrong validation when updating integer custom field with spaces
* Defect #16177: Mercurial 2.9 compatibility
== 2014-02-08 v2.4.3 == 2014-02-08 v2.4.3
* Defect #13544: Commit reference: autogenerated issue note has wrong commit link syntax in multi-repo or cross-project context * Defect #13544: Commit reference: autogenerated issue note has wrong commit link syntax in multi-repo or cross-project context
@ -16,6 +93,11 @@ http://www.redmine.org/
* Defect #16038: Issue#css_classes corrupts user.groups association cache * Defect #16038: Issue#css_classes corrupts user.groups association cache
* Patch #15960: pt-BR translation for 2.4-stable * Patch #15960: pt-BR translation for 2.4-stable
Additional note:
#15781 was forgotten to merge to v2.4.3.
It is in v2.5.0.
== 2013-12-23 v2.4.2 == 2013-12-23 v2.4.2
* Defect #15398: HTML 5 invalid <center> tag * Defect #15398: HTML 5 invalid <center> tag
@ -1359,7 +1441,7 @@ http://www.redmine.org/
* #819: Add a body ID and class to all pages * #819: Add a body ID and class to all pages
* #871: Commit new CSS styles! * #871: Commit new CSS styles!
* #3301: Add favicon to base layout * #3301: Add favicon to base layout
* #4656: On Issue#show page, clicking on “Add related issueâ€<C3A2> should focus on the input * #4656: On Issue#show page, clicking on "Add related issue" should focus on the input
* #4896: Project identifier should be a limited field * #4896: Project identifier should be a limited field
* #5084: Filter all isssues by projects * #5084: Filter all isssues by projects
* #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase * #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase
@ -2368,7 +2450,7 @@ http://www.redmine.org/
* Search engines now supports pagination. Results are sorted in reverse chronological order * Search engines now supports pagination. Results are sorted in reverse chronological order
* Added "Estimated hours" attribute on issues * Added "Estimated hours" attribute on issues
* A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category * A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
* Forum notifications are now also sent to the authors of the thread, even if they don�t watch the board * Forum notifications are now also sent to the authors of the thread, even if they don't watch the board
* Added an application setting to specify the application protocol (http or https) used to generate urls in emails * Added an application setting to specify the application protocol (http or https) used to generate urls in emails
* Gantt chart: now starts at the current month by default * Gantt chart: now starts at the current month by default
* Gantt chart: month count and zoom factor are automatically saved as user preferences * Gantt chart: month count and zoom factor are automatically saved as user preferences
@ -2376,7 +2458,7 @@ http://www.redmine.org/
* Added wiki index by date * Added wiki index by date
* Added preview on add/edit issue form * Added preview on add/edit issue form
* Emails footer can now be customized from the admin interface (Admin -> Email notifications) * Emails footer can now be customized from the admin interface (Admin -> Email notifications)
* Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they�re properly displayed) * Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they're properly displayed)
* Calendar: first day of week can now be set in lang files * Calendar: first day of week can now be set in lang files
* Automatic closing of duplicate issues * Automatic closing of duplicate issues
* Added a cross-project issue list * Added a cross-project issue list
@ -2388,7 +2470,7 @@ http://www.redmine.org/
* Added some accesskeys * Added some accesskeys
* Added "Float" as a custom field format * Added "Float" as a custom field format
* Added basic Theme support * Added basic Theme support
* Added the ability to set the �done ratio� of issues fixed by commit (Nikolay Solakov) * Added the ability to set the "done ratio" of issues fixed by commit (Nikolay Solakov)
* Added custom fields in issue related mail notifications * Added custom fields in issue related mail notifications
* Email notifications are now sent in plain text and html * Email notifications are now sent in plain text and html
* Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed. * Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
@ -2421,7 +2503,7 @@ http://www.redmine.org/
* Added Korean translation (Choi Jong Yoon) * Added Korean translation (Choi Jong Yoon)
* Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations * Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
* Performance improvement on calendar and gantt * Performance improvement on calendar and gantt
* Fixed: wiki preview doesn�t work on long entries * Fixed: wiki preview doesn't work on long entries
* Fixed: queries with multiple custom fields return no result * Fixed: queries with multiple custom fields return no result
* Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters * Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
* Fixed: URL with ~ broken in wiki formatting * Fixed: URL with ~ broken in wiki formatting
@ -2432,7 +2514,7 @@ http://www.redmine.org/
* per project forums added * per project forums added
* added the ability to archive projects * added the ability to archive projects
* added �Watch� functionality on issues. It allows users to receive notifications about issue changes * added "Watch" functionality on issues. It allows users to receive notifications about issue changes
* custom fields for issues can now be used as filters on issue list * custom fields for issues can now be used as filters on issue list
* added per user custom queries * added per user custom queries
* commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings) * commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
@ -2473,7 +2555,7 @@ http://www.redmine.org/
* added swedish translation (Thomas Habets) * added swedish translation (Thomas Habets)
* italian translation update (Alessio Spadaro) * italian translation update (Alessio Spadaro)
* japanese translation update (Satoru Kurashiki) * japanese translation update (Satoru Kurashiki)
* fixed: error on history atom feed when there�s no notes on an issue change * fixed: error on history atom feed when there's no notes on an issue change
* fixed: error in journalizing an issue with longtext custom fields (Postgresql) * fixed: error in journalizing an issue with longtext custom fields (Postgresql)
* fixed: creation of Oracle schema * fixed: creation of Oracle schema
* fixed: last day of the month not included in project activity * fixed: last day of the month not included in project activity

Some files were not shown because too many files have changed in this diff Show More