Compare commits

...

169 Commits

Author SHA1 Message Date
Eric Davis
b5cfe79044 Tagging 1.0.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.0.2@4213 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:43:11 +00:00
Eric Davis
38a2beb2c0 Merged r4210 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4212 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:41:55 +00:00
Eric Davis
77ba8bbfc0 Merged r4209 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4211 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:41:50 +00:00
Eric Davis
7bbf4af0c1 Locales update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4208 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:34:05 +00:00
Eric Davis
babcd39918 Merged r4189 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4207 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:59 +00:00
Eric Davis
924bb8da0b Merged r4188 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4206 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:52 +00:00
Eric Davis
2c91d15c58 Merged r4187 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4205 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:45 +00:00
Eric Davis
dd91dc4cb7 Merged r4186 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4204 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:39 +00:00
Eric Davis
98eaff414f Merged r4185 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4203 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:33 +00:00
Eric Davis
eb05880717 Merged r4183 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4202 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:28 +00:00
Eric Davis
25b2ffb8fd Merged r4182 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4201 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:22 +00:00
Eric Davis
c4e123b2f0 Merged r4181 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4200 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:17 +00:00
Eric Davis
324baf60a6 Merged r4180 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4199 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:11 +00:00
Eric Davis
22bcce63aa Merged r4177 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4198 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:06 +00:00
Eric Davis
ef90132cf3 Merged r4175 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4197 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:01 +00:00
Eric Davis
3909d2c8ba Merged r4173 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4196 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:55 +00:00
Eric Davis
5e7e11440c Merged r4171 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4195 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:50 +00:00
Eric Davis
7d55572bd1 Merged r4169 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4194 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:44 +00:00
Eric Davis
945cd3933e Merged r4167 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4193 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:38 +00:00
Eric Davis
47b969de00 Merged r4166 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4192 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:32 +00:00
Eric Davis
c51f9b8907 Merged r4165 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4191 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:26 +00:00
Eric Davis
65b6b7f5a9 Merged r4164 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4190 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:21 +00:00
Eric Davis
d44a90045a Merged r4107 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4162 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:21 +00:00
Eric Davis
1c63c443b6 Merged r4105 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4161 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:16 +00:00
Eric Davis
b0b321bd11 Merged r4104 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4160 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:09 +00:00
Eric Davis
8bd0ff03a0 Merged r4103 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4159 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:04 +00:00
Eric Davis
7dbc8b4f97 Merged r4102 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4158 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:58 +00:00
Eric Davis
019ea4adf3 Merged r4100 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4157 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:53 +00:00
Eric Davis
0a62a9187c Merged r4099 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4156 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:48 +00:00
Eric Davis
e450c124d9 Merged r4096 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4155 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:42 +00:00
Eric Davis
e1a557fa58 Merged r4095 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4154 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:37 +00:00
Eric Davis
b35bc6d93c Merged r4094 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4153 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:31 +00:00
Eric Davis
4593d97472 Merged r4093 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4152 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:26 +00:00
Eric Davis
d99d2efcca Merged r4092 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4151 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:20 +00:00
Eric Davis
1c62645270 Merged r4091 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4150 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:14 +00:00
Eric Davis
60caea006a Merged r4090 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4149 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:08 +00:00
Eric Davis
5003152542 Merged r4089 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4148 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:02 +00:00
Eric Davis
2149add25c Merged r4088 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4147 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:56 +00:00
Eric Davis
b5bbc93325 Merged r4087 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4146 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:50 +00:00
Eric Davis
7ad17f92b1 Merged r4086 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4145 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:43 +00:00
Eric Davis
066f648949 Merged r4083 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4144 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:38 +00:00
Eric Davis
46fc878396 Merged r4082 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4143 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:31 +00:00
Eric Davis
d1952aefb8 Merged r4080 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4142 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:26 +00:00
Eric Davis
4a5dce41e2 Merged r4076 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4141 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:20 +00:00
Eric Davis
f74d9809fd Merged r4070 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4140 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:57 +00:00
Eric Davis
f219a92c1f Merged r4069 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4139 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:50 +00:00
Eric Davis
f8e46cfd30 Merged r4068 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4138 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:44 +00:00
Eric Davis
9321ffde39 Merged r4067 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4137 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:38 +00:00
Eric Davis
1e370f2c5a Merged r4066 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4136 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:32 +00:00
Eric Davis
d2f9a726bb Merged r4065 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4135 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:26 +00:00
Eric Davis
00423307ce Merged r4064 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4134 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:21 +00:00
Eric Davis
5a639173de Merged r4063 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4133 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:14 +00:00
Eric Davis
823fd16c3a Merged r4062 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4132 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:09 +00:00
Eric Davis
e32fc44dc2 Merged r4061 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4131 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:02 +00:00
Eric Davis
934221337d Merged r4060 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4130 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:57 +00:00
Eric Davis
c48e40af31 Merged r4059 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:50 +00:00
Eric Davis
47e12f12cc Merged r4058 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4128 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:45 +00:00
Eric Davis
897258289a Merged r4057 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4127 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:38 +00:00
Eric Davis
67867d99fe Merged r4056 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4126 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:32 +00:00
Eric Davis
32b2e84477 Merged r4055 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4125 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:26 +00:00
Eric Davis
1f278a0221 Merged r4054 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4124 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:20 +00:00
Eric Davis
5e49df04d2 Merged r4053 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4123 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:14 +00:00
Eric Davis
973c54d49b Merged r4052 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4122 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:07 +00:00
Eric Davis
d2a4265f86 Merged r4051 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4121 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:00 +00:00
Eric Davis
771723c595 Merged r4050 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4120 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:53 +00:00
Eric Davis
8de76de8a1 Merged r4049 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4119 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:47 +00:00
Eric Davis
f2711afe65 Merged r4048 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4118 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:41 +00:00
Eric Davis
8fa5019e69 Merged r4047 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:35 +00:00
Eric Davis
7b472a605d Merged r4043 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:28 +00:00
Eric Davis
56fba472a7 Merged r4042 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:22 +00:00
Eric Davis
af5d9ca907 Merged r4040 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4114 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:16 +00:00
Eric Davis
8a42ca81a9 Merged r4039 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4113 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:11 +00:00
Eric Davis
ada4c889be Merged r4038 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4112 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:05 +00:00
Eric Davis
6fe600b163 Merged r4037 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4111 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:00 +00:00
Eric Davis
b2e82fd5a0 Merged r4036 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4110 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:53 +00:00
Eric Davis
cee0dce6b7 Merged r4035 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4109 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:47 +00:00
Eric Davis
d090e539f6 Merged r4034 form trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4108 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:41 +00:00
Eric Davis
29f9f3feff Merged r4029 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4032 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:25 +00:00
Eric Davis
2bea4b30a5 Merged r4028 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:20 +00:00
Eric Davis
00b53286fd Merged changelog from trunk, r4027.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4030 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:15 +00:00
Eric Davis
c8c4fb130c Merged r4014 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4026 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:31 +00:00
Eric Davis
0d7cead479 Merged r4013 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4025 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:26 +00:00
Eric Davis
b5d64b9a2f Merged r4012 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4024 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:19 +00:00
Eric Davis
519069b867 Merged r4011 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4023 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:14 +00:00
Eric Davis
7443f2a310 Merged r4010 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:08 +00:00
Eric Davis
b419deb907 Merged r4009 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4021 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:03 +00:00
Eric Davis
b8d5a05b20 Merged r4008 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:57 +00:00
Eric Davis
e29244652c Merged r4007 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4019 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:52 +00:00
Eric Davis
27ef72c35e Merged r4006 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:45 +00:00
Eric Davis
86e986f014 Merged r4005 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:38 +00:00
Eric Davis
d60cc50d99 Merged r4004 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:32 +00:00
Eric Davis
9e5d2100b6 Merged r4003 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:26 +00:00
Eric Davis
ccbc9f8ff9 Merged r3952 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4002 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:48 +00:00
Eric Davis
047bf692b3 Merged r3951 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4001 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:42 +00:00
Eric Davis
3e692a908b Merged r3950 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:37 +00:00
Eric Davis
d457f90fcd Merged r3949 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:31 +00:00
Eric Davis
b9f23bedb7 Merged r3948 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:26 +00:00
Eric Davis
d1a9f81fc6 Merged r3947 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3997 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:20 +00:00
Eric Davis
80e833cd88 Merged r3946 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3996 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:14 +00:00
Eric Davis
a12a073a6e Merged r3945 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3995 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:08 +00:00
Eric Davis
bc57078b12 Merged r3944 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3994 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:02 +00:00
Eric Davis
1c93f99a55 Merged r3943 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3993 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:57 +00:00
Eric Davis
758feaccab Merged r3942 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3992 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:51 +00:00
Eric Davis
2012c60bfd Merged r3941 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3991 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:46 +00:00
Eric Davis
8ca6941a33 Merged r3940 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3990 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:40 +00:00
Eric Davis
10a76f5e73 Merged r3939 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3989 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:34 +00:00
Eric Davis
6e5f567346 Merged r3938 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3988 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:29 +00:00
Eric Davis
7af610631f Merged r3937 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3987 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:23 +00:00
Eric Davis
fab5064643 Merged r3936 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3986 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:18 +00:00
Eric Davis
ab5ce45b43 Merged r3935 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3985 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:11 +00:00
Eric Davis
5345a2dd89 Merged r3934 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3984 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:05 +00:00
Eric Davis
7ca197b37f Merged r3933 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3983 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:59 +00:00
Eric Davis
72ce3e18f8 Merged r3932 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3982 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:53 +00:00
Eric Davis
358ee2ef2e Merged r3931 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3981 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:47 +00:00
Eric Davis
b5b8d34d94 Merged r3930 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3980 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:42 +00:00
Eric Davis
597266e5a2 Merged r3929 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3979 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:36 +00:00
Eric Davis
36ad597b69 Merged r3928 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3978 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:31 +00:00
Eric Davis
c67272599c Merged r3927 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3977 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:25 +00:00
Eric Davis
b6bc3a3665 Merged r3926 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3976 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:19 +00:00
Eric Davis
a96eb375ec Merged r3925 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3975 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:13 +00:00
Eric Davis
c7e719fc4b Merged r3924 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3974 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:06 +00:00
Eric Davis
18d841553e Merged r3923 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:59 +00:00
Eric Davis
31d233e567 Merged r3922 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:53 +00:00
Eric Davis
4ff6070126 Merged r3921 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:48 +00:00
Eric Davis
dfe44017b6 Merged r3920 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:42 +00:00
Eric Davis
7cae43314a Merged r3919 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:36 +00:00
Eric Davis
2f529fd834 Merged r3918 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3968 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:30 +00:00
Eric Davis
9892ede7b7 Merged r3917 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:24 +00:00
Eric Davis
102e845391 Merged r3916 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:18 +00:00
Eric Davis
7bdf0ab729 Merged r3915 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3965 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:12 +00:00
Eric Davis
4426fd695e Merged r3914 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3964 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:06 +00:00
Eric Davis
3f1c3fa020 Merged r3913 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3963 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:59 +00:00
Eric Davis
19bbb6e2cb Merged r3912 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3962 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:53 +00:00
Eric Davis
b02463184a Merged r3911 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3961 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:48 +00:00
Eric Davis
a6408945e5 Merged r3910 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3960 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:41 +00:00
Eric Davis
c20e85e4dd Merged r3909 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:35 +00:00
Eric Davis
7a9fab7748 Merged r3908 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:29 +00:00
Eric Davis
acaa223cf8 Merged r3907 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:23 +00:00
Eric Davis
8dde6e019d Merged r3906 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3956 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:03 +00:00
Eric Davis
ae3d542664 Merged r3905 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:57 +00:00
Eric Davis
c731d11209 Merged r3904 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3954 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:51 +00:00
Eric Davis
8458dc23d4 Merged r3903 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3953 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:46 +00:00
Eric Davis
9af4cb5c38 Merged r3899 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:56 +00:00
Eric Davis
df120e43cd Merged r3898 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:52 +00:00
Eric Davis
59f98693ae Merged r3897 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3900 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:46 +00:00
Eric Davis
677fee310a Merged r3894 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:03:11 +00:00
Eric Davis
0843b188fb Merged r3893 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3895 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:03:06 +00:00
Jean-Philippe Lang
8f64938b9e Merged r3891 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:57:49 +00:00
Jean-Philippe Lang
29e7ae9698 Merged r3889 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3890 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:49:15 +00:00
Jean-Philippe Lang
f682be8468 Merged r3887 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:56:45 +00:00
Jean-Philippe Lang
e771fc03bd Merged r3883, r3884 and r3885 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3886 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:49:07 +00:00
Jean-Philippe Lang
52a12aaca8 Merged r3881 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3882 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:49:08 +00:00
Jean-Philippe Lang
8146e096f4 Merged r3879 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3880 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:35:35 +00:00
Jean-Philippe Lang
41e38483a6 Merged r3877 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3878 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:02:55 +00:00
Jean-Philippe Lang
41c6d3cef6 Merged r3875 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3876 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:56:07 +00:00
Jean-Philippe Lang
ec526c1261 Merged r3873 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3874 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:52:07 +00:00
Jean-Philippe Lang
b4122707f6 Merged r3871 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3872 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:48:51 +00:00
Jean-Philippe Lang
f70a8cde88 Merged r3869 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3870 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:40:59 +00:00
Jean-Philippe Lang
69f34a595d Merged r3865 and r3866 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3867 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:34:04 +00:00
Eric Davis
be52ccf01f Merged r3859 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3862 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:23:50 +00:00
Eric Davis
8a1d45ffd6 Merged r3860 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3861 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:20:35 +00:00
Eric Davis
4b52b7a8df Change version to the show this is the stable branch.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3857 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:39:00 +00:00
Eric Davis
6ed2e003a1 Merged r3854 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3856 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:38:56 +00:00
Eric Davis
1cc116fe5c Merged r3853 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3855 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:38:51 +00:00
Eric Davis
619c148719 Merged r3849 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3852 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:56 +00:00
Eric Davis
0ae9cc7d07 Merged r3848 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3851 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:51 +00:00
Eric Davis
a2a3dae974 Merged r3847 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3850 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:46 +00:00
Eric Davis
4f5dc94170 Merged r3845 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3846 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:47:03 +00:00
Eric Davis
4775864d69 Adding 1.0 stable branch to prepare for 1.0.0 RC
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3844 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:31:31 +00:00
213 changed files with 7449 additions and 4709 deletions

View File

@@ -2,4 +2,4 @@
Redmine is a flexible project management web application written using Ruby on Rails framework.
More details can be found at http://www.redmine.org
More details can be found at in the doc directory or on the official website http://www.redmine.org

View File

@@ -83,9 +83,9 @@ class AccountController < ApplicationController
else
@user = User.new(params[:user])
@user.admin = false
@user.status = User::STATUS_REGISTERED
@user.register
if session[:auth_source_registration]
@user.status = User::STATUS_ACTIVE
@user.activate
@user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save
@@ -116,8 +116,8 @@ class AccountController < ApplicationController
token = Token.find_by_action_and_value('register', params[:token])
redirect_to(home_url) && return unless token and !token.expired?
user = token.user
redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
user.status = User::STATUS_ACTIVE
redirect_to(home_url) && return unless user.registered?
user.activate
if user.save
token.destroy
flash[:notice] = l(:notice_account_activated)
@@ -170,7 +170,7 @@ class AccountController < ApplicationController
user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password
user.status = User::STATUS_REGISTERED
user.register
case Setting.self_registration
when '1'
@@ -241,7 +241,7 @@ class AccountController < ApplicationController
# Pass a block for behavior when a user fails to save
def register_automatically(user, &block)
# Automatic activation
user.status = User::STATUS_ACTIVE
user.activate
user.last_login_on = Time.now
if user.save
self.logged_user = user

View File

@@ -0,0 +1,59 @@
class ActivitiesController < ApplicationController
menu_item :activity
before_filter :find_optional_project
accept_key_auth :index
def index
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private
# TODO: refactor, duplicated in projects_controller
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -201,7 +201,23 @@ class ApplicationController < ActionController::Base
def self.model_object(model)
write_inheritable_attribute('model_object', model)
end
# Filter for bulk issue operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
# make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy
@@ -218,6 +234,10 @@ class ApplicationController < ActionController::Base
end
end
def back_url
params[:back_url] || request.env['HTTP_REFERER']
end
def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank?
@@ -238,7 +258,7 @@ class ApplicationController < ActionController::Base
def render_403
@project = nil
respond_to do |format|
format.html { render :template => "common/403", :layout => (request.xhr? ? false : 'base'), :status => 403 }
format.html { render :template => "common/403", :layout => use_layout, :status => 403 }
format.atom { head 403 }
format.xml { head 403 }
format.js { head 403 }
@@ -249,7 +269,7 @@ class ApplicationController < ActionController::Base
def render_404
respond_to do |format|
format.html { render :template => "common/404", :layout => !request.xhr?, :status => 404 }
format.html { render :template => "common/404", :layout => use_layout, :status => 404 }
format.atom { head 404 }
format.xml { head 404 }
format.js { head 404 }
@@ -262,7 +282,7 @@ class ApplicationController < ActionController::Base
respond_to do |format|
format.html {
flash.now[:error] = msg
render :text => '', :layout => !request.xhr?, :status => 500
render :text => '', :layout => use_layout, :status => 500
}
format.atom { head 500 }
format.xml { head 500 }
@@ -270,6 +290,13 @@ class ApplicationController < ActionController::Base
format.json { head 500 }
end
end
# Picks which layout to use based on the request
#
# @return [boolean, string] name of the layout to use or false for no layout
def use_layout
request.xhr? ? false : 'base'
end
def invalid_authenticity_token
if api_request?
@@ -345,6 +372,21 @@ class ApplicationController < ActionController::Base
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
end
# Sets the `flash` notice or error based the number of issues that did not save
#
# @param [Array, Issue] issues all of the saved and unsaved Issues
# @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
# Rescues an invalid query statement. Just in case...
def query_statement_invalid(exception)
logger.error "Query::StatementInvalid: #{exception.message}" if logger

View File

@@ -0,0 +1,25 @@
class AutoCompletesController < ApplicationController
before_filter :find_project
def issues
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -18,6 +18,7 @@
class BoardsController < ApplicationController
default_search_scope :messages
before_filter :find_project, :find_board_if_available, :authorize
accept_key_auth :index, :show
helper :messages
include MessagesHelper

View File

@@ -1,4 +1,5 @@
class CalendarsController < ApplicationController
menu_item :calendar
before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid

View File

@@ -0,0 +1,39 @@
class ContextMenusController < ApplicationController
helper :watchers
def issues
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
else
@allowed_statuses = @issues.map do |i|
i.new_statuses_allowed_to(User.current)
end.inject do |memo,s|
memo & s
end
end
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = back_url
render :layout => false
end
end

View File

@@ -0,0 +1,37 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project
before_filter :authorize
helper :sort
include SortHelper
def index
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
# TODO: split method into new (GET) and create (POST)
def new
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'files', :action => 'index', :id => @project
return
end
@versions = @project.versions.sort
end
end

View File

@@ -1,4 +1,5 @@
class GanttsController < ApplicationController
menu_item :gantt
before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -37,7 +38,7 @@ class GanttsController < ApplicationController
respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
end
end

View File

@@ -141,14 +141,22 @@ class GroupsController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
@membership.save if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
end
if @membership.valid?
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end
def destroy_membership

View File

@@ -0,0 +1,65 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues
before_filter :authorize
def new
prepare_for_issue_move
render :layout => false if request.xhr?
end
def create
prepare_for_issue_move
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
end
return
end
end
private
def prepare_for_issue_move
@issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
end
def extract_changed_attributes_for_move(params)
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
changed_attributes
end
end

View File

@@ -19,14 +19,14 @@ class IssuesController < ApplicationController
menu_item :new_issue, :only => [:new, :create]
default_search_scope :issues
before_filter :find_issue, :only => [:show, :edit, :update, :reply]
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete]
before_filter :authorize, :except => [:index, :changes, :preview, :context_menu]
before_filter :find_optional_project, :only => [:index, :changes]
before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index]
before_filter :check_for_default_issue_status, :only => [:new, :create]
before_filter :build_new_issue_from_params, :only => [:new, :create]
accept_key_auth :index, :show, :changes
accept_key_auth :index, :show
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -54,6 +54,7 @@ class IssuesController < ApplicationController
:render => { :nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def index
@@ -95,21 +96,6 @@ class IssuesController < ApplicationController
render_404
end
def changes
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def show
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@journals.each_with_index {|j,i| j.indice = i+1}
@@ -124,7 +110,7 @@ class IssuesController < ApplicationController
format.html { render :template => 'issues/show.rhtml' }
format.xml { render :layout => false }
format.json { render :text => @issue.to_json, :layout => false }
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
end
end
@@ -132,7 +118,10 @@ class IssuesController < ApplicationController
# Add a new issue
# The new issue will be created from an existing one if copy_from parameter is given
def new
render :action => 'new', :layout => !request.xhr?
respond_to do |format|
format.html { render :action => 'new', :layout => !request.xhr? }
format.js { render :partial => 'attributes' }
end
end
def create
@@ -144,7 +133,7 @@ class IssuesController < ApplicationController
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format|
format.html {
redirect_to(params[:continue] ? { :action => 'new', :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
{ :action => 'show', :id => @issue })
}
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) }
@@ -200,98 +189,30 @@ class IssuesController < ApplicationController
end
end
def reply
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
# Bulk edit a set of issues
def bulk_edit
@issues.sort!
if request.post?
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
unsaved_issue_ids = []
@issues.each do |issue|
issue.reload
journal = issue.init_journal(User.current, params[:notes])
issue.safe_attributes = attributes
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
unless issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
return
end
@available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields
end
def move
def bulk_update
@issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
attributes = parse_params_for_bulk_issue_attributes(params)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
unsaved_issue_ids = []
@issues.each do |issue|
issue.reload
journal = issue.init_journal(User.current, params[:notes])
issue.safe_attributes = attributes
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
unless issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
return
end
render :layout => false if request.xhr?
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
end
def destroy
@@ -324,77 +245,7 @@ class IssuesController < ApplicationController
format.json { head :ok }
end
end
def context_menu
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
end
projects = @issues.collect(&:project).compact.uniq
@project = projects.first if projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = params[:back_url] || request.env['HTTP_REFERER']
render :layout => false
end
def update_form
if params[:id].blank?
@issue = Issue.new
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.attributes = params[:issue]
@allowed_statuses = ([@issue.status] + @issue.status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
@priorities = IssuePriority.all
render :partial => 'attributes'
end
def preview
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
def auto_complete
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@@ -403,22 +254,6 @@ private
render_404
end
# Filter for bulk operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
@@ -435,7 +270,7 @@ private
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@time_entry = TimeEntry.new
@notes = params[:notes]
@notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
@issue.init_journal(User.current, @notes)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
@@ -448,9 +283,16 @@ private
end
# TODO: Refactor, lots of extra code in here
# TODO: Changing tracker on an existing issue should not trigger this
def build_new_issue_from_params
@issue = Issue.new
@issue.copy_from(params[:copy_from]) if params[:copy_from]
if params[:id].blank?
@issue = Issue.new
@issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.project = @project
# Tracker must be set before custom field values
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
@@ -460,7 +302,9 @@ private
end
if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue]
@issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
@issue.watcher_user_ids = params[:issue]['watcher_user_ids']
end
end
@issue.author = User.current
@issue.start_date ||= Date.today
@@ -468,21 +312,17 @@ private
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
def check_for_default_issue_status
if IssueStatus.default.nil?
render_error l(:error_no_default_issue_status)
return false
end
end
def parse_params_for_bulk_issue_attributes(params)
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
attributes
end
end

View File

@@ -16,7 +16,54 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class JournalsController < ApplicationController
before_filter :find_journal
before_filter :find_journal, :only => [:edit]
before_filter :find_issue, :only => [:new]
before_filter :find_optional_project, :only => [:index]
accept_key_auth :index
helper :issues
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def index
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def new
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
def edit
if request.post?
@@ -38,4 +85,12 @@ private
rescue ActiveRecord::RecordNotFound
render_404
end
# TODO: duplicated in IssuesController
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -0,0 +1,28 @@
class PreviewsController < ApplicationController
before_filter :find_project
def issue
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -0,0 +1,26 @@
class ProjectEnumerationsController < ApplicationController
before_filter :find_project
before_filter :authorize
def save
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def destroy
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
end

View File

@@ -17,24 +17,24 @@
class ProjectsController < ApplicationController
menu_item :overview
menu_item :activity, :only => :activity
menu_item :roadmap, :only => :roadmap
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings
before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
before_filter :find_optional_project, :only => :activity
before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
before_filter :authorize_global, :only => :add
before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
before_filter :authorize_global, :only => [:new, :create]
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :activity, :index
after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
accept_key_auth :index
after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end
end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
helper :sort
include SortHelper
helper :custom_fields
@@ -63,40 +63,45 @@ class ProjectsController < ApplicationController
end
end
# Add a new project
def add
def new
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@project = Project.new(params[:project])
if request.get?
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
@project.trackers = Tracker.all
@project.is_public = Setting.default_projects_public?
@project.enabled_module_names = Setting.default_projects_modules
else
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
unless User.current.admin?
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
@project.members << m
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
@project.trackers = Tracker.all
@project.is_public = Setting.default_projects_public?
@project.enabled_module_names = Setting.default_projects_modules
end
def create
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
unless User.current.admin?
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
@project.members << m
end
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html { render :action => 'new' }
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end
end
def copy
@@ -120,13 +125,13 @@ class ProjectsController < ApplicationController
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects'
redirect_to :controller => 'projects', :action => 'settings'
elsif !@project.new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
redirect_to :controller => 'admin', :action => 'projects'
redirect_to :controller => 'projects', :action => 'settings'
end
end
end
@@ -177,28 +182,27 @@ class ProjectsController < ApplicationController
@wiki ||= @project.wiki
end
# Edit @project
def edit
if request.get?
end
def update
@project.attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else
@project.attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else
respond_to do |format|
format.html {
settings
render :action => 'settings'
}
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
respond_to do |format|
format.html {
settings
render :action => 'settings'
}
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end
end
@@ -241,120 +245,6 @@ class ProjectsController < ApplicationController
@project = nil
end
def add_file
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
return
end
@versions = @project.versions.sort
end
def save_activities
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def reset_activities
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def list_files
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
def roadmap
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def activity
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private
def find_optional_project
return true unless params[:id]
@@ -364,14 +254,6 @@ private
render_404
end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id

View File

@@ -55,8 +55,7 @@ class TimelogController < ApplicationController
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
sql << time_report_joins
sql << " WHERE"
sql << " (%s) AND" % sql_condition
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
@@ -261,8 +260,8 @@ private
end
@from, @to = @to, @from if @from && @to && @from > @to
@from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) - 1
@to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today)
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end
def load_available_criterias
@@ -314,4 +313,12 @@ private
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias
end
def time_report_joins
sql = ''
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end

View File

@@ -53,10 +53,8 @@ class UsersController < ApplicationController
@user = User.find(params[:id])
@custom_values = @user.custom_values
# show only public projects and private projects that the logged in user is also a member of
@memberships = @user.memberships.select do |membership|
membership.project.is_public? || (User.current.member_of?(membership.project))
end
# show projects based on current user visibility
@memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
@events_by_day = events.group_by(&:event_date)
@@ -97,7 +95,9 @@ class UsersController < ApplicationController
if request.post?
@user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id
if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
end
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
@user.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
@@ -123,14 +123,22 @@ class UsersController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
@membership.save if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'users/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
end
if @membership.valid?
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'users/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end
def destroy_membership

View File

@@ -18,15 +18,42 @@
class VersionsController < ApplicationController
menu_item :roadmap
model_object Version
before_filter :find_model_object, :except => [:new, :close_completed]
before_filter :find_project_from_association, :except => [:new, :close_completed]
before_filter :find_project, :only => [:new, :close_completed]
before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
before_filter :authorize
helper :custom_fields
helper :projects
def index
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def show
@issues = @version.fixed_issues.visible.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
end
def new
@@ -36,6 +63,17 @@ class VersionsController < ApplicationController
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
end
def create
# TODO: refactor with code above in #new
@version = @project.versions.build
if params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
if request.post?
if @version.save
respond_to do |format|
@@ -52,7 +90,7 @@ class VersionsController < ApplicationController
end
else
respond_to do |format|
format.html
format.html { render :action => 'new' }
format.js do
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
end
@@ -60,8 +98,11 @@ class VersionsController < ApplicationController
end
end
end
def edit
end
def update
if request.post? && params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
@@ -102,4 +143,13 @@ private
rescue ActiveRecord::RecordNotFound
render_404
end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
end

View File

@@ -20,12 +20,4 @@ module AdminHelper
options_for_select([[l(:label_all), ''],
[l(:status_active), 1]], selected)
end
def css_project_classes(project)
s = 'project'
s << ' root' if project.root?
s << ' child' if project.child?
s << (project.leaf? ? ' leaf' : ' parent')
s
end
end

View File

@@ -32,8 +32,27 @@ module ApplicationHelper
end
# Display a link if user is authorized
#
# @param [String] name Anchor text (passed to link_to)
# @param [Hash, String] options Hash params or url for the link target (passed to link_to).
# This will checked by authorize_for to see if the user is authorized
# @param [optional, Hash] html_options Options passed to link_to
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
if options.is_a?(String)
begin
route = ActionController::Routing::Routes.recognize_path(options.gsub(/\?.*/,''), :method => options[:method] || :get)
link_controller = route[:controller]
link_action = route[:action]
rescue ActionController::RoutingError # Parse failed, not a route
link_controller, link_action = nil, nil
end
else
link_controller = options[:controller] || params[:controller]
link_action = options[:action]
end
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(link_controller, link_action)
end
# Display a link to remote if user is authorized
@@ -103,6 +122,23 @@ module ApplicationHelper
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
end
# Generates a link to a project if active
# Examples:
#
# link_to_project(project) # => link to the specified project overview
# link_to_project(project, :action=>'settings') # => link to project settings
# link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options
# link_to_project(project, {}, :class => "project") # => html options with default url (project overview)
#
def link_to_project(project, options={}, html_options = nil)
if project.active?
url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
link_to(h(project), url, html_options)
else
h(project)
end
end
def toggle_link(name, id, options={})
onclick = "Element.toggle('#{id}'); "
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
@@ -285,7 +321,7 @@ module ApplicationHelper
def time_tag(time)
text = distance_of_time_in_words(Time.now, time)
if @project
link_to(text, {:controller => 'projects', :action => 'activity', :id => @project, :from => time.to_date}, :title => format_time(time))
link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => time.to_date}, :title => format_time(time))
else
content_tag('acronym', text, :title => format_time(time))
end
@@ -368,12 +404,12 @@ module ApplicationHelper
ancestors = (@project.root? ? [] : @project.ancestors.visible)
if ancestors.any?
root = ancestors.shift
b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root')
b << link_to_project(root, {:jump => current_menu_item}, :class => 'root')
if ancestors.size > 2
b << '&#8230;'
ancestors = ancestors[-2, 2]
end
b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') }
b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') }
end
b << h(@project)
b.join(' &#187; ')
@@ -393,6 +429,19 @@ module ApplicationHelper
end
end
# Returns the theme, controller name, and action as css classes for the
# HTML body.
def body_css_classes
css = []
if theme = Redmine::Themes.theme(Setting.ui_theme)
css << 'theme-' + theme.name
end
css << 'controller-' + params[:controller]
css << 'action-' + params[:action]
css.join(' ')
end
def accesskey(s)
Redmine::AccessKeys.key_for s
end
@@ -592,8 +641,7 @@ module ApplicationHelper
end
when 'project'
if p = Project.visible.find_by_id(oid)
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
end
end
elsif sep == ':'
@@ -635,8 +683,7 @@ module ApplicationHelper
end
when 'project'
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
end
end
end
@@ -709,6 +756,11 @@ module ApplicationHelper
javascript_include_tag('context_menu') +
stylesheet_link_tag('context_menu')
end
if l(:direction) == 'rtl'
content_for :header_tags do
stylesheet_link_tag('context_menu_rtl')
end
end
@context_menu_included = true
end
javascript_tag "new ContextMenu('#{ url_for(url) }')"
@@ -772,7 +824,7 @@ module ApplicationHelper
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
def avatar(user, options = { })
if Setting.gravatar_enabled?
options.merge!({:ssl => Setting.protocol == 'https', :default => Setting.gravatar_default})
options.merge!({:ssl => (defined?(request) && request.ssl?), :default => Setting.gravatar_default})
email = nil
if user.respond_to?(:mail)
email = user.mail
@@ -783,6 +835,10 @@ module ApplicationHelper
end
end
def favicon
"<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
end
private
def wiki_helper

View File

@@ -0,0 +1,38 @@
module CalendarsHelper
def link_to_previous_month(year, month)
target_year, target_month = if month == 1
[year - 1, 12]
else
[year, month - 1]
end
name = if target_month == 12
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote ('&#171; ' + name),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
end
def link_to_next_month(year, month)
target_year, target_month = if month == 12
[year + 1, 1]
else
[year, month + 1]
end
name = if target_month == 1
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote (name + ' &#187;'),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
end
end

View File

@@ -0,0 +1,2 @@
module IssueMovesHelper
end

View File

@@ -28,14 +28,25 @@ module IssuesHelper
ancestors << issue unless issue.leaf?
end
end
# Renders a HTML/CSS tooltip
#
# To use, a trigger div is needed. This is a div with the class of "tooltip"
# that contains this method wrapped in a span with the class of "tip"
#
# <div class="tooltip"><%= link_to_issue(issue) %>
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
# </div>
#
def render_issue_tooltip(issue)
@cached_label_status ||= l(:field_status)
@cached_label_start_date ||= l(:field_start_date)
@cached_label_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority)
link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +

View File

@@ -22,7 +22,7 @@ module JournalsHelper
links = []
if !journal.notes.blank?
links << link_to_remote(image_tag('comment.png'),
{ :url => {:controller => 'issues', :action => 'reply', :id => issue, :journal_id => journal} },
{ :url => {:controller => 'journals', :action => 'new', :id => issue, :journal_id => journal} },
:title => l(:button_quote)) if options[:reply_links]
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
{ :controller => 'journals', :action => 'edit', :id => journal },

View File

@@ -72,7 +72,7 @@ module ProjectsHelper
end
classes = (ancestors.empty? ? 'root' : 'child')
s << "<li class='#{classes}'><div class='#{classes}'>" +
link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
s << "</div>\n"
ancestors << project

View File

@@ -50,7 +50,7 @@ module QueriesHelper
when 'User'
link_to_user value
when 'Project'
link_to(h(value), :controller => 'projects', :action => 'show', :id => value)
link_to_project value
when 'Version'
link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
when 'TrueClass'

View File

@@ -19,12 +19,13 @@ class Change < ActiveRecord::Base
belongs_to :changeset
validates_presence_of :changeset_id, :action, :path
before_save :init_path
def relative_path
changeset.repository.relative_path(path)
end
def before_save
path ||= ""
def init_path
self.path ||= ""
end
end

View File

@@ -76,7 +76,6 @@ class Changeset < ActiveRecord::Base
def after_create
scan_comment_for_issue_ids
end
require 'pp'
def scan_comment_for_issue_ids
return if comments.blank?

View File

@@ -245,7 +245,7 @@ class Issue < ActiveRecord::Base
end
def done_ratio
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
status.default_done_ratio
else
read_attribute(:done_ratio)
@@ -308,7 +308,7 @@ class Issue < ActiveRecord::Base
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios
# even if the user turns off the setting later
def update_done_ratio_from_issue_status
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
self.done_ratio = status.default_done_ratio
end
end
@@ -357,6 +357,11 @@ class Issue < ActiveRecord::Base
def overdue?
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
end
# Does this issue have children?
def children?
!leaf?
end
# Users the issue can be assigned to
def assignable_users
@@ -684,7 +689,7 @@ class Issue < ActiveRecord::Base
end
# done ratio = weighted average ratio of leaves
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio?
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
leaves_count = p.leaves.count
if leaves_count > 0
average = p.leaves.average(:estimated_hours).to_f
@@ -821,7 +826,7 @@ class Issue < ActiveRecord::Base
j.id as #{select_field},
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} as j
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} j
where
i.status_id=s.id
and #{where}

View File

@@ -17,8 +17,10 @@
class IssueStatus < ActiveRecord::Base
before_destroy :check_integrity
has_many :workflows, :foreign_key => "old_status_id", :dependent => :delete_all
has_many :workflows, :foreign_key => "old_status_id"
acts_as_list
before_destroy :delete_workflows
validates_presence_of :name
validates_uniqueness_of :name
@@ -89,4 +91,9 @@ private
def check_integrity
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
end
# Deletes associated workflows
def delete_workflows
Workflow.delete_all(["old_status_id = :id OR new_status_id = :id", {:id => id}])
end
end

View File

@@ -65,4 +65,12 @@ class Journal < ActiveRecord::Base
def attachments
journalized.respond_to?(:attachments) ? journalized.attachments : nil
end
# Returns a string of css classes
def css_classes
s = 'journal'
s << ' has-notes' unless notes.blank?
s << ' has-details' unless details.blank?
s
end
end

View File

@@ -15,6 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'ar_condition'
class Mailer < ActionMailer::Base
layout 'mailer'
helper :application
@@ -80,7 +82,7 @@ class Mailer < ActionMailer::Base
def reminder(user, issues, days)
set_language_if_valid user.language
recipients user.mail
subject l(:mail_subject_reminder, issues.size)
subject l(:mail_subject_reminder, :count => issues.size, :days => days)
body :issues => issues,
:days => days,
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')
@@ -306,13 +308,16 @@ class Mailer < ActionMailer::Base
# * :days => how many days in the future to remind about (defaults to 7)
# * :tracker => id of tracker for filtering issues (defaults to all trackers)
# * :project => id or identifier of project to process (defaults to all projects)
# * :users => array of user ids who should be reminded
def self.reminders(options={})
days = options[:days] || 7
project = options[:project] ? Project.find(options[:project]) : nil
tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
user_ids = options[:users]
s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
s << ["#{Issue.table_name}.assigned_to_id IN (?)", user_ids] if user_ids.present?
s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
s << "#{Issue.table_name}.project_id = #{project.id}" if project
s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker

View File

@@ -82,7 +82,7 @@ class Member < ActiveRecord::Base
protected
def validate
errors.add_to_base "Role can't be blank" if member_roles.empty? && roles.empty?
errors.add_on_empty :role if member_roles.empty? && roles.empty?
end
private

View File

@@ -33,7 +33,11 @@ class Principal < ActiveRecord::Base
}
before_create :set_default_empty_values
def name(formatter = nil)
to_s
end
def <=>(principal)
if self.class.name == principal.class.name
self.to_s.downcase <=> principal.to_s.downcase

View File

@@ -412,7 +412,15 @@ class Project < ActiveRecord::Base
def short_description(length = 255)
description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
end
def css_classes
s = 'project'
s << ' root' if root?
s << ' child' if child?
s << (leaf? ? ' leaf' : ' parent')
s
end
# Return true if this project is allowed to do the specified action.
# action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
@@ -441,6 +449,15 @@ class Project < ActiveRecord::Base
enabled_modules.clear
end
end
# Returns an array of projects that are in this project's hierarchy
#
# Example: parents, children, siblings
def hierarchy
parents = project.self_and_ancestors || []
descendants = project.descendants || []
project_hierarchy = parents | descendants # Set union
end
# Returns an auto-generated project identifier based on the last identifier used
def self.next_identifier

View File

@@ -187,7 +187,7 @@ class Query < ActiveRecord::Base
if project
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
else
project_ids = User.current.projects.collect(&:id)
project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id)
if project_ids.any?
# members of the user's projects
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
@@ -219,6 +219,12 @@ class Query < ActiveRecord::Base
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
# project filter
project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
["#{pre}#{p.name}",p.id.to_s]
end
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
end
@available_filters
end

View File

@@ -81,4 +81,20 @@ class TimeEntry < ActiveRecord::Base
yield
end
end
def self.earilest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.minimum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
def self.latest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.maximum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
end

View File

@@ -79,6 +79,10 @@ class User < Principal
super
end
def mail=(arg)
write_attribute(:mail, arg.to_s.strip)
end
def identity_url=(url)
if url.blank?
write_attribute(:identity_url, '')
@@ -160,6 +164,30 @@ class User < Principal
self.status == STATUS_LOCKED
end
def activate
self.status = STATUS_ACTIVE
end
def register
self.status = STATUS_REGISTERED
end
def lock
self.status = STATUS_LOCKED
end
def activate!
update_attribute(:status, STATUS_ACTIVE)
end
def register!
update_attribute(:status, STATUS_REGISTERED)
end
def lock!
update_attribute(:status, STATUS_LOCKED)
end
def check_password?(clear_password)
if auth_source_id.present?
auth_source.authenticate(self.login, clear_password)
@@ -324,6 +352,12 @@ class User < Principal
false
end
end
# Is the user allowed to do the specified action on any project?
# See allowed_to? for the actions and valid options.
def allowed_to_globally?(action, options)
allowed_to?(action, nil, options.reverse_merge(:global => true))
end
def self.current=(user)
@current_user = user

View File

@@ -1,20 +1,5 @@
<div id="admin-menu">
<ul>
<li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %></li>
<li><%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %></li>
<li><%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %></li>
<li><%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %></li>
<li><%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %></li>
<li><%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %></li>
<li><%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %></li>
<li><%= link_to l(:label_workflow), {:controller => 'workflows', :action => 'edit'}, :class => 'workflows' %></li>
<li><%= link_to l(:label_custom_field_plural), {:controller => 'custom_fields'}, :class => 'custom_fields' %></li>
<li><%= link_to l(:label_enumerations), {:controller => 'enumerations'}, :class => 'enumerations' %></li>
<li><%= link_to l(:label_settings), {:controller => 'settings'}, :class => 'settings' %></li>
<% menu_items_for(:admin_menu) do |item| -%>
<li><%= link_to h(item.caption), item.url, item.html_options %></li>
<% end -%>
<li><%= link_to l(:label_plugins), {:controller => 'admin', :action => 'plugins'}, :class => 'plugins' %></li>
<li><%= link_to l(:label_information_plural), {:controller => 'admin', :action => 'info'}, :class => 'info' %></li>
</ul>
<ul>
<%= render_menu :admin_menu %>
</ul>
</div>

View File

@@ -1,5 +1,5 @@
<div class="contextual">
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add' %>
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>
</div>
<h2><%=l(:label_project_plural)%></h2>
@@ -26,8 +26,8 @@
</tr></thead>
<tbody>
<% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %></td>
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= link_to_project(project, :action => 'settings') %></td>
<td><%= textilizable project.short_description, :project => project %></td>
<td align="center"><%= checked_image project.is_public? %></td>
<td align="center"><%= format_date(project.created_on) %></td>

View File

@@ -1,6 +1,5 @@
<span id="attachments_fields">
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%>
<label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%><label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
</label>
</span>
<br />

View File

@@ -30,11 +30,11 @@
</table>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
<% end %>
<% html_title l(:label_board_plural) %>

View File

@@ -9,14 +9,7 @@
</fieldset>
<p style="float:right;">
<%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
{:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
{:href => url_for(:action => 'show', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
%> |
<%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
{:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
{:href => url_for(:action => 'show', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
%>
<%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>
</p>
<p class="buttons">

View File

@@ -4,20 +4,23 @@
<% if !@issue.nil? -%>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue},
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
<li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul>
<% @statuses.each do |s| -%>
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}, :back_url => @back}, :method => :post,
:selected => (s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
<% end -%>
</ul>
</li>
<% else %>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %>
<% unless @allowed_statuses.empty? %>
<li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul>
<% @statuses.each do |s| -%>
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {:status_id => s}, :back_url => @back}, :method => :post,
:selected => (@issue && s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
<% end -%>
</ul>
</li>
<% end %>
<% unless @trackers.nil? %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_tracker) %></a>
@@ -29,15 +32,19 @@
</ul>
</li>
<% end %>
<% if @projects.size == 1 %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul>
<% @priorities.each do |p| -%>
<li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.priority), :disabled => !@can[:edit] %></li>
:selected => (@issue && p == @issue.priority), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
<% end -%>
</ul>
</li>
<% end %>
<% unless @project.nil? || @project.shared_versions.open.empty? -%>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
@@ -77,17 +84,19 @@
</ul>
</li>
<% end -%>
<% if Issue.use_field_for_done_ratio? %>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul>
<% (0..10).map{|x|x*10}.each do |p| -%>
<li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.done_ratio), :disabled => !@can[:edit] %></li>
:selected => (@issue && p == @issue.done_ratio), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
<% end -%>
</ul>
</li>
<% end %>
<% if !@issue.nil? %>
<% if @can[:log_time] -%>
<li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
@@ -102,9 +111,9 @@
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
<% end %>
<li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id), :copy_options => {:copy => 't'}},
<li><%= context_menu_link l(:button_copy), new_issue_move_path(:ids => @issues.collect(&:id), :copy_options => {:copy => 't'}),
:class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id)},
<li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
:class => 'icon-move', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>

View File

@@ -1,5 +1,5 @@
<div class="contextual">
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'projects', :action => 'add_file', :id => @project}, :class => 'icon icon-add' %>
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'files', :action => 'new', :id => @project}, :class => 'icon icon-add' %>
</div>
<h2><%=l(:label_attachment_plural)%></h2>

View File

@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %>
<div class="box">
<% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %>
<% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %>
<% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label>

View File

@@ -6,14 +6,14 @@
<% end -%>
</ul>
<% form_tag({}, :id => 'move_form') do %>
<% form_tag({:action => 'create'}, :id => 'move_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular">
<p><label for="new_project_id"><%=l(:field_project)%>:</label>
<%= select_tag "new_project_id",
project_tree_options_for_select(@allowed_projects, :selected => @target_project),
:onchange => remote_function(:url => { :action => 'move' },
:onchange => remote_function(:url => { :action => 'new' },
:method => :get,
:update => 'content',
:with => "Form.serialize('move_form')") %></p>

View File

@@ -4,7 +4,7 @@
<% replace_watcher ||= 'watcher' %>
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'move', :id => @issue, :copy_options => {:copy => 't'} }, :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
<%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %>
</div>

View File

@@ -23,7 +23,7 @@
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
l(:label_version_new),
'version[name]',
{:controller => 'versions', :action => 'new', :project_id => @project},
{:controller => 'versions', :action => 'create', :project_id => @project},
:title => l(:label_version_new),
:tabindex => 200) if authorize_for('versions', 'new') %>
</p>
@@ -40,6 +40,6 @@
</div>
<div style="clear:both;"> </div>
<%= render :partial => 'form_custom_fields' %>
<%= render :partial => 'issues/form_custom_fields' %>
<% end %>

View File

@@ -3,6 +3,8 @@
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}",
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br />
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
<%= textilizable(changeset, :comments) %>
<div class="changeset-changes">
<%= textilizable(changeset, :comments) %>
</div>
</div>
<% end %>

View File

@@ -44,7 +44,7 @@
<%= f.hidden_field :lock_version %>
<%= submit_tag l(:button_submit) %>
<%= link_to_remote l(:label_preview),
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project, :id => @issue },
{ :url => preview_issue_path(:project_id => @project, :id => @issue),
:method => 'post',
:update => 'preview',
:with => 'Form.serialize("issue-form")',

View File

@@ -1,6 +1,8 @@
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
<%= observe_field :issue_tracker_id, :url => { :action => :update_form, :project_id => @project, :id => @issue },
<%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue },
:update => :attributes,
:with => "Form.serialize('issue-form')" %>
@@ -9,10 +11,7 @@
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
<p><%= f.text_field :parent_issue_id, :size => 10 %></p>
<div id="parent_issue_candidates" class="autocomplete"></div>
<%= javascript_tag "observeParentIssueField('#{url_for(:controller => :issues,
:action => :auto_complete,
:id => @issue,
:project_id => @project) }')" %>
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
<% end %>
<p><%= f.text_area :description,
@@ -23,7 +22,7 @@
</div>
<div id="attributes" class="attributes">
<%= render :partial => 'attributes' %>
<%= render :partial => 'issues/attributes' %>
</div>
<% if @issue.new_record? %>

View File

@@ -1,7 +1,7 @@
<% reply_links = authorize_for('issues', 'edit') -%>
<% for journal in journals %>
<div id="change-<%= journal.id %>" class="journal">
<h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
<h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
<%= avatar(journal.user, :size => "24") %>
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>

View File

@@ -3,7 +3,7 @@
<div class="autoscroll">
<table class="list issues">
<thead><tr>
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
@@ -25,7 +25,7 @@
<% previous_group = group %>
<% end %>
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
</tr>

View File

@@ -14,7 +14,7 @@
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
</td>
<td class="project"><%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %></td>
<td class="project"><%= link_to_project(issue.project) %></td>
<td class="tracker"><%=h issue.tracker %></td>
<td class="subject">
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)

View File

@@ -1,6 +1,6 @@
<div class="contextual">
<% if authorize_for('issue_relations', 'new') %>
<%= toggle_link l(:button_add), 'new-relation-form'%>
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
<% end %>
</div>
@@ -28,6 +28,7 @@
<% remote_form_for(:relation, @relation,
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
:method => :post,
:complete => "Form.Element.focus('relation_issue_to_id');",
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
<% end %>

View File

@@ -6,7 +6,7 @@
<%= call_hook(:view_issues_sidebar_issues_bottom) %>
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
<%= link_to(l(:label_calendar), :controller => 'issues', :action => 'calendar', :project_id => @project) %><br />
<%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br />
<% end %>
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br />

View File

@@ -2,7 +2,7 @@
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
<% form_tag() do %>
<% form_tag(:action => 'bulk_update') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular">
<fieldset class="attributes">

View File

@@ -39,6 +39,7 @@
{ :url => { :set_filter => 1 },
:before => 'selectAllOptions("selected_columns");',
:update => "content",
:complete => "apply_filters_observer()",
:with => "Form.serialize('query_form')"
}, :class => 'icon icon-checked' %>
@@ -78,7 +79,7 @@
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
<%= auto_discovery_link_tag(:atom, {:action => 'changes', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
<%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
<% end %>
<%= context_menu :controller => 'issues', :action => 'context_menu' %>
<%= context_menu issues_context_menu_path %>

View File

@@ -9,7 +9,7 @@
<%= submit_tag l(:button_create) %>
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
<%= link_to_remote l(:label_preview),
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project },
{ :url => preview_issue_path(:project_id => @project),
:method => 'post',
:update => 'preview',
:with => "Form.serialize('issue-form')",

View File

@@ -128,6 +128,7 @@
<%= stylesheet_link_tag 'scm' %>
<%= javascript_include_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu_rtl' if l(:direction) == 'rtl' %>
<% end %>
<div id="context-menu" style="display: none;"></div>
<%= javascript_tag "new ContextMenu('#{url_for(:controller => 'issues', :action => 'context_menu')}')" %>
<%= javascript_tag "new ContextMenu('#{issues_context_menu_path}')" %>

View File

@@ -5,7 +5,9 @@
<title><%=h html_title %></title>
<meta name="description" content="<%= Redmine::Info.app_name %>" />
<meta name="keywords" content="issue,bug,tracker" />
<%= favicon %>
<%= stylesheet_link_tag 'application', :media => 'all' %>
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
<%= javascript_include_tag :defaults %>
<%= heads_for_wiki_formatter %>
<!--[if IE]>
@@ -18,7 +20,7 @@
<!-- page specific tags -->
<%= yield :header_tags -%>
</head>
<body>
<body class="<%= body_css_classes %>">
<div id="wrapper">
<div id="wrapper2">
<div id="top-menu">

View File

@@ -30,7 +30,7 @@
</div>
<h4>
<%= avatar(message.author, :size => "24") %>
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :anchor => "message-#{message.id}" } %>
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :r => message, :anchor => "message-#{message.id}" } %>
-
<%= authoring message.created_on, message.author %>
</h4>

View File

@@ -1,4 +1,4 @@
<p><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %>
<p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
<br />

View File

@@ -12,3 +12,7 @@
}, :accesskey => accesskey(:preview) %>
<% end %>
<div id="preview" class="wiki"></div>
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>

View File

@@ -28,7 +28,7 @@
<p class="nodata"><%= l(:label_no_data) %></p>
<% else %>
<% @newss.each do |news| %>
<h3><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %>
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
<p class="author"><%= authoring news.created_on, news.author %></p>
@@ -45,6 +45,7 @@
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
<% html_title(l(:label_news_plural)) -%>

View File

@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :project, @project, :url => { :action => "edit", :id => @project } do |f| %>
<% labelled_tabular_form_for :project, @project, :url => { :action => "update", :id => @project } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<% end %>

View File

@@ -2,14 +2,14 @@
<div class="box">
<!--[form:project]-->
<p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<p><%= f.text_field :name, :required => true, :maxlength => 30 %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<% unless @project.allowed_parents.compact.empty? %>
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
<% end %>
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen?, :maxlength => 20 %>
<% unless @project.identifier_frozen? %>
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
<% end %></p>

View File

@@ -0,0 +1,8 @@
<% if @users_by_role.any? %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>

View File

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

View File

@@ -1,6 +1,6 @@
<h2><%=l(:label_project_new)%></h2>
<% labelled_tabular_form_for :project, @project, :url => { :action => "add" } do |f| %>
<% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend>

View File

@@ -1,4 +1,4 @@
<% form_tag({:controller => 'projects', :action => 'save_activities', :id => @project}, :class => "tabular") do %>
<% form_tag({:controller => 'project_enumerations', :action => 'save', :id => @project}, :class => "tabular") do %>
<table class="list">
<thead><tr>
@@ -32,7 +32,7 @@
</table>
<div class="contextual">
<%= link_to(l(:button_reset), {:controller => 'projects', :action => 'reset_activities', :id => @project},
<%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project},
:method => :delete,
:confirm => l(:text_are_you_sure),
:class => 'icon icon-del') %>

View File

@@ -1,6 +1,6 @@
<div class="contextual">
<% if User.current.allowed_to?(:add_subprojects, @project) %>
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'add', :parent_id => @project}, :class => 'icon icon-add' %>
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'new', :parent_id => @project}, :class => 'icon icon-add' %>
<% end %>
</div>
@@ -51,14 +51,7 @@
</div>
<div class="splitcontentright">
<% if @users_by_role.any? %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>
<%= render :partial => 'members_box' %>
<% if @news.any? && authorize_for('news', 'index') %>
<div class="news box">
@@ -81,7 +74,7 @@
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:action => 'activity', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
<% end %>
<% html_title(l(:label_overview)) -%>

View File

@@ -53,6 +53,18 @@ function toggle_multi_select(field) {
select.multiple = true;
}
}
function apply_filters_observer() {
$$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
if(e.keyCode == Event.KEY_RETURN) {
<%= remote_function(:url => { :set_filter => 1},
:update => "content",
:with => "Form.serialize('query_form')",
:complete => "e.stop(); apply_filters_observer()") %>
}
});
}
Event.observe(document,"dom:loaded", apply_filters_observer);
//]]>
</script>

View File

@@ -1,7 +1,7 @@
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2>
<!-- Choose view type -->
<% form_tag({}, :method => 'get') do %>
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
<p><label><%= l(:label_view_diff) %></label>

View File

@@ -20,7 +20,7 @@
</div>
<div style="float:right;">
<%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %>
<%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'icon icon-server-authentication' %>
</div>
<%= submit_tag l(:button_save) %>

View File

@@ -14,7 +14,9 @@
<% @user.memberships.each do |membership| %>
<% next if membership.new_record? %>
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
<td class="project"><%=h membership.project %></td>
<td class="project">
<%= link_to_project membership.project %>
</td>
<td class="roles">
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },

View File

@@ -24,7 +24,7 @@
<h3><%=l(:label_project_plural)%></h3>
<ul>
<% for membership in @memberships %>
<li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
<li><%= link_to_project(membership.project) %>
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
<% end %>
</ul>
@@ -35,7 +35,7 @@
<div class="splitcontentright">
<% unless @events_by_day.empty? %>
<h3><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
<h3><%= link_to l(:label_activity), :controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
<p>
<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
@@ -57,11 +57,11 @@
</div>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
<% end %>
<% end %>
<%= call_hook :view_account_right_bottom, :user => @user %>

View File

@@ -1,6 +1,6 @@
<h2><%=l(:label_version)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'edit' } do |f| %>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'update', :id => @version } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<% end %>

View File

@@ -51,4 +51,4 @@
<% html_title(l(:label_roadmap)) %>
<%= context_menu :controller => 'issues', :action => 'context_menu' %>
<%= context_menu issues_context_menu_path %>

View File

@@ -1,6 +1,6 @@
<h2><%=l(:label_version_new)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'new' } do |f| %>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'create', :project_id => @project } do |f| %>
<%= render :partial => 'versions/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %>
<% end %>
<% end %>

View File

@@ -32,13 +32,10 @@
<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
<% issues = @version.fixed_issues.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
<% if issues.size > 0 %>
<% if @issues.present? %>
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
<ul>
<% issues.each do |issue| -%>
<% @issues.each do |issue| -%>
<li><%= link_to_issue(issue) %></li>
<% end -%>
</ul>

View File

@@ -20,7 +20,7 @@
<% for project in @projects %>
<% @project = project %>
<li>
<%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
<%= link_to_project project %> (<%= format_time(project.created_on) %>)
<%= textilizable project.short_description, :project => project %>
</li>
<% end %>
@@ -34,6 +34,6 @@
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :key => User.current.rss_key, :format => 'atom'},
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_activity)}") %>
<% end %>

View File

@@ -23,11 +23,11 @@
<% unless @pages.empty? %>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>

View File

@@ -16,11 +16,11 @@
<% unless @pages.empty? %>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>

View File

@@ -4,9 +4,17 @@
# Code is not reloaded between requests
config.cache_classes = true
#####
# Customize the default logger (http://ruby-doc.org/core/classes/Logger.html)
#
# Use a different logger for distributed setups
# config.logger = SyslogLogger.new
#
# Rotate logs bigger than 1MB, keeps no more than 7 rotated logs around.
# When setting a new Logger, make sure to set it's log level too.
#
# config.logger = Logger.new(config.log_path, 7, 1048576)
# config.logger.level = Logger::INFO
# Full error reports are disabled and caching is turned on
config.action_controller.consider_all_requests_local = false

View File

@@ -78,3 +78,17 @@ module AsynchronousMailer
end
ActionMailer::Base.send :include, AsynchronousMailer
# TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6.
# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
module I18n
module Backend
module Base
def warn_syntax_deprecation!
return if @skip_syntax_deprecation
warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\nDowngrade your i18n gem to 0.3.7 (everything above must be deinstalled) to remove this warning, see http://www.redmine.org/issues/5608 for more information."
@skip_syntax_deprecation = true
end
end
end
end

View File

@@ -1,4 +1,5 @@
bg:
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
@@ -63,7 +64,11 @@ bg:
one: "almost 1 year"
other: "almost {{count}} years"
number:
number:
format:
separator: "."
delimiter: ""
precision: 3
human:
format:
precision: 1
@@ -71,13 +76,13 @@ bg:
storage_units:
format: "%n %u"
units:
kb: KB
tb: TB
gb: GB
byte:
one: Byte
other: Bytes
mb: 'MB'
kb: "KB"
mb: "MB"
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
@@ -111,6 +116,7 @@ bg:
greater_than_start_date: "трябва да е след началната дата"
not_same_project: "не е от същия проект"
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Изберете
@@ -704,7 +710,7 @@ bg:
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM
@@ -898,3 +904,12 @@ bg:
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

View File

@@ -1,6 +1,7 @@
#Ernad Husremovic hernad@bring.out.ba
bs:
direction: ltr
date:
formats:
default: "%d.%m.%Y"
@@ -129,6 +130,7 @@ bs:
greater_than_start_date: "mora biti veći nego početni datum"
not_same_project: "ne pripada istom projektu"
circular_dependency: "Ova relacija stvar cirkularnu zavisnost"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Molimo odaberite
@@ -184,7 +186,7 @@ bs:
mail_body_account_information: Informacija o vašem korisničkom računu
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima"
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
gui_validation_error: 1 greška
@@ -922,3 +924,12 @@ bs:
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

View File

@@ -1,4 +1,9 @@
# Redmine catalan translation:
# by Joan Duran
ca:
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
@@ -64,6 +69,11 @@ ca:
other: "almost {{count}} years"
number:
# Default format for numbers
format:
separator: "."
delimiter: ""
precision: 3
human:
format:
delimiter: ""
@@ -78,6 +88,7 @@ ca:
mb: "MB"
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
@@ -111,6 +122,7 @@ ca:
greater_than_start_date: "ha de ser superior que la data inicial"
not_same_project: "no pertany al mateix projecte"
circular_dependency: "Aquesta relació crearia una dependència circular"
cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques"
actionview_instancetag_blank_option: Seleccioneu
@@ -144,18 +156,33 @@ ca:
notice_email_sent: "S'ha enviat un correu electrònic a {{value}}"
notice_email_error: "S'ha produït un error en enviar el correu ({{value}})"
notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API."
notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}."
notice_failed_to_save_members: "No s'han pogut desar els membres: {{errors}}."
notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
notice_unable_delete_version: "No s'ha pogut suprimir la versió."
notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps."
notice_issue_done_ratios_updated: "S'ha actualitzat el tant per cent dels assumptes."
error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} "
error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}"
error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
error_no_tracker_in_project: "Aquest projecte no té seguidor associat. Comproveu els paràmetres del projecte."
error_no_default_issue_status: "No s'ha definit cap estat d'assumpte predeterminat. Comproveu la configuració (aneu a «Administració -> Estats de l'assumpte»)."
error_can_not_delete_custom_field: "No s'ha pogut suprimir el camp personalitat"
error_can_not_delete_tracker: "Aquest seguidor conté assumptes i no es pot suprimir."
error_can_not_remove_role: "Aquest rol s'està utilitzant i no es pot suprimir."
error_can_not_reopen_issue_on_closed_version: "Un assumpte assignat a una versió tancada no es pot tornar a obrir"
error_can_not_archive_project: "Aquest projecte no es pot arxivar"
error_issue_done_ratios_not_updated: "No s'ha actualitza el tant per cent dels assumptes."
error_workflow_copy_source: "Seleccioneu un seguidor o rol font"
error_workflow_copy_target: "Seleccioneu seguidors i rols objectiu"
error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte"
error_unable_to_connect: "No s'ha pogut connectar ({{value}})"
warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers."
mail_subject_lost_password: "Contrasenya de {{value}}"
@@ -166,8 +193,12 @@ ca:
mail_body_account_information: Informació del compte
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies"
mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies"
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
mail_subject_wiki_content_added: "S'ha afegit la pàgina wiki «{{page}}»"
mail_body_wiki_content_added: "En {{author}} ha afegit la pàgina wiki «{{page}}»."
mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «{{page}}»"
mail_body_wiki_content_updated: "En {{author}} ha actualitzat la pàgina wiki «{{page}}»."
gui_validation_error: 1 error
gui_validation_error_plural: "{{count}} errors"
@@ -207,6 +238,7 @@ ca:
field_priority: Prioritat
field_fixed_version: Versió objectiu
field_user: Usuari
field_principal: Principal
field_role: Rol
field_homepage: Pàgina web
field_is_public: Públic
@@ -251,6 +283,7 @@ ca:
field_redirect_existing_links: Redirigeix els enllaços existents
field_estimated_hours: Temps previst
field_column_names: Columnes
field_time_entries: "Registre de temps"
field_time_zone: Zona horària
field_searchable: Es pot cercar
field_default_value: Valor predeterminat
@@ -260,6 +293,9 @@ ca:
field_watcher: Vigilància
field_identity_url: URL OpenID
field_content: Contingut
field_group_by: "Agrupa els resultats per"
field_sharing: Compartició
field_parent_issue: "Tasca pare"
setting_app_title: "Títol de l'aplicació"
setting_app_subtitle: "Subtítol de l'aplicació"
@@ -295,20 +331,35 @@ ca:
setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
setting_enabled_scm: "Habilita l'SCM"
setting_mail_handler_body_delimiters: "Trunca els correus electrònics després d'una d'aquestes línies"
setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
setting_mail_handler_api_key: Clau API
setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials
setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar"
setting_gravatar_default: "Imatge Gravatar predeterminada"
setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades
setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia
setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers
setting_openid: "Permet entrar i registrar-se amb l'OpenID"
setting_password_min_length: "Longitud mínima de la contrasenya"
setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes"
setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous"
setting_issue_done_ratio: "Calcula tant per cent realitzat de l'assumpte amb"
setting_issue_done_ratio_issue_status: "Utilitza l'estat de l'assumpte"
setting_issue_done_ratio_issue_field: "Utilitza el camp de l'assumpte"
setting_start_of_week: "Inicia les setmanes en"
setting_rest_api_enabled: "Habilita el servei web REST"
setting_cache_formatted_text: Cache formatted text
permission_add_project: "Crea projectes"
permission_add_subprojects: "Crea subprojectes"
permission_edit_project: Edita el projecte
permission_select_project_modules: Selecciona els mòduls del projecte
permission_manage_members: Gestiona els membres
permission_manage_project_activities: "Gestiona les activitats del projecte"
permission_manage_versions: Gestiona les versions
permission_manage_categories: Gestiona les categories dels assumptes
permission_view_issues: "Visualitza els assumptes"
permission_add_issues: Afegeix assumptes
permission_edit_issues: Edita els assumptes
permission_manage_issue_relations: Gestiona les relacions dels assumptes
@@ -323,6 +374,7 @@ ca:
permission_view_calendar: Visualitza el calendari
permission_view_issue_watchers: Visualitza la llista de vigilàncies
permission_add_issue_watchers: Afegeix vigilàncies
permission_delete_issue_watchers: Suprimeix els vigilants
permission_log_time: Registra el temps invertit
permission_view_time_entries: Visualitza el temps invertit
permission_edit_time_entries: Edita els registres de temps
@@ -352,6 +404,8 @@ ca:
permission_edit_own_messages: Edita els missatges propis
permission_delete_messages: Suprimeix els missatges
permission_delete_own_messages: Suprimeix els missatges propis
permission_export_wiki_pages: "Exporta les pàgines wiki"
permission_manage_subtasks: "Gestiona subtasques"
project_module_issue_tracking: "Seguidor d'assumptes"
project_module_time_tracking: Seguidor de temps
@@ -361,10 +415,13 @@ ca:
project_module_wiki: Wiki
project_module_repository: Dipòsit
project_module_boards: Taulers
project_module_calendar: Calendari
project_module_gantt: Gantt
label_user: Usuari
label_user_plural: Usuaris
label_user_new: Usuari nou
label_user_anonymous: Anònim
label_project: Projecte
label_project_new: Projecte nou
label_project_plural: Projectes
@@ -411,12 +468,13 @@ ca:
label_information_plural: Informació
label_please_login: Entreu
label_register: Registre
label_login_with_open_id_option: o entra amb l'OpenID
label_login_with_open_id_option: "o entra amb l'OpenID"
label_password_lost: Contrasenya perduda
label_home: Inici
label_my_page: La meva pàgina
label_my_account: El meu compte
label_my_projects: Els meus projectes
label_my_page_block: "Els meus blocs de pàgina"
label_administration: Administració
label_login: Entra
label_logout: Surt
@@ -436,6 +494,7 @@ ca:
label_auth_source_new: "Mode d'autenticació nou"
label_auth_source_plural: "Modes d'autenticació"
label_subproject_plural: Subprojectes
label_subproject_new: "Subprojecte nou"
label_and_its_subprojects: "{{value}} i els seus subprojectes"
label_min_max_length: Longitud mín - max
label_list: Llist
@@ -470,8 +529,9 @@ ca:
label_version: Versió
label_version_new: Versió nova
label_version_plural: Versions
label_close_versions: "Tanca les versions completades"
label_confirmation: Confirmació
label_export_to: 'També disponible a:'
label_export_to: "També disponible a:"
label_read: Llegeix...
label_public_projects: Projectes públics
label_open_issues: obert
@@ -528,6 +588,8 @@ ca:
label_not_equals: no és
label_in_less_than: en menys de
label_in_more_than: en més de
label_greater_or_equal: ">="
label_less_or_equal: <=
label_in: en
label_today: avui
label_all_time: tot el temps
@@ -550,17 +612,21 @@ ca:
label_browse: Navega
label_modification: "{{count}} canvi"
label_modification_plural: "{{count}} canvis"
label_branch: Branca
label_tag: Etiqueta
label_revision: Revisió
label_revision_plural: Revisions
label_revision_id: "Revisió {{value}}"
label_associated_revisions: Revisions associades
label_added: afegit
label_modified: modificat
label_renamed: reanomenat
label_copied: copiat
label_renamed: reanomenat
label_deleted: suprimit
label_latest_revision: Última revisió
label_latest_revision_plural: Últimes revisions
label_view_revisions: Visualitza les revisions
label_view_all_revisions: "Visualitza totes les revisions"
label_max_size: Mida màxima
label_sort_highest: Mou a la part superior
label_sort_higher: Mou cap amunt
@@ -586,6 +652,7 @@ ca:
label_changes_details: Detalls de tots els canvis
label_issue_tracking: "Seguiment d'assumptes"
label_spent_time: Temps invertit
label_overall_spent_time: "Temps total invertit"
label_f_hour: "{{value}} hora"
label_f_hour_plural: "{{value}} hores"
label_time_tracking: Temps de seguiment
@@ -623,6 +690,8 @@ ca:
label_board: Fòrum
label_board_new: Fòrum nou
label_board_plural: Fòrums
label_board_locked: Bloquejat
label_board_sticky: Sticky
label_topic_plural: Temes
label_message_plural: Missatges
label_message_last: Últim missatge
@@ -638,6 +707,8 @@ ca:
label_language_based: "Basat en l'idioma de l'usuari"
label_sort_by: "Ordena per {{value}}"
label_send_test_email: Envia un correu electrònic de prova
label_feeds_access_key: "Clau d'accés del RSS"
label_missing_feeds_access_key: "Falta una clau d'accés del RSS"
label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}"
label_module_plural: Mòduls
label_added_time_by: "Afegit per {{author}} fa {{age}}"
@@ -683,6 +754,28 @@ ca:
label_ascending: Ascendent
label_descending: Descendent
label_date_from_to: Des de {{start}} a {{end}}
label_wiki_content_added: "S'ha afegit la pàgina wiki"
label_wiki_content_updated: "S'ha actualitzat la pàgina wiki"
label_group: Grup
label_group_plural: Grups
label_group_new: Grup nou
label_time_entry_plural: Temps invertit
label_version_sharing_hierarchy: "Amb la jerarquia del projecte"
label_version_sharing_system: "Amb tots els projectes"
label_version_sharing_descendants: "Amb tots els subprojectes"
label_version_sharing_tree: "Amb l'arbre del projecte"
label_version_sharing_none: "Sense compartir"
label_update_issue_done_ratios: "Actualitza el tant per cent dels assumptes realitzats"
label_copy_source: Font
label_copy_target: Objectiu
label_copy_same_as_target: "El mateix que l'objectiu"
label_display_used_statuses_only: "Mostra només els estats que utilitza aquest seguidor"
label_api_access_key: "Clau d'accés a l'API"
label_missing_api_access_key: "Falta una clau d'accés de l'API"
label_api_access_key_created_on: "Clau d'accés de l'API creada fa {{value}}"
label_profile: Perfil
label_subtask_plural: Subtasques
label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte"
button_login: Entra
button_submit: Tramet
@@ -704,11 +797,12 @@ ca:
button_list: Llista
button_view: Visualitza
button_move: Mou
button_move_and_follow: "Mou i segueix"
button_back: Enrere
button_cancel: Cancel·la
button_activate: Activa
button_sort: Ordena
button_log_time: "Hora d'entrada"
button_log_time: "Registre de temps"
button_rollback: Torna a aquesta versió
button_watch: Vigila
button_unwatch: No vigilis
@@ -719,15 +813,24 @@ ca:
button_rename: Reanomena
button_change_password: Canvia la contrasenya
button_copy: Copia
button_copy_and_follow: "Copia i segueix"
button_annotate: Anota
button_update: Actualitza
button_configure: Configura
button_quote: Cita
button_duplicate: Duplica
button_show: Mostra
status_active: actiu
status_registered: informat
status_locked: bloquejat
version_status_open: oberta
version_status_locked: bloquejada
version_status_closed: tancada
field_active: Actiu
text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
text_regexp_info: ex. ^[A-Z0-9]+$
text_min_max_length_info: 0 significa sense restricció
@@ -735,6 +838,10 @@ ca:
text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}."
text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
text_are_you_sure: Segur?
text_journal_changed: "{{label}} ha canviat de {{old}} a {{new}}"
text_journal_set_to: "{{label}} s'ha establert a {{value}}"
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
text_journal_added: "S'ha afegit {{label}} {{value}}"
text_tip_task_begin_day: "tasca que s'inicia aquest dia"
text_tip_task_end_day: tasca que finalitza aquest dia
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
@@ -745,6 +852,7 @@ ca:
text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
text_unallowed_characters: Caràcters no permesos
text_comma_separated: Es permeten valors múltiples (separats per una coma).
text_line_separated: "Es permeten diversos valors (una línia per cada valor)."
text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}."
text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}."
@@ -765,14 +873,21 @@ ca:
text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?"
text_destroy_time_entries: Suprimeix les hores informades
text_assign_time_entries_to_project: Assigna les hores informades al projecte
text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:'
text_reassign_time_entries: "Torna a assignar les hores informades a aquest assumpte:"
text_user_wrote: "{{value}} va escriure:"
text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor."
text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:'
text_enumeration_category_reassign_to: "Torna a assignar-los a aquest valor:"
text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo."
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament."
text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar."
text_custom_field_possible_values_info: 'Una línia per a cada valor'
text_custom_field_possible_values_info: "Una línia per a cada valor"
text_wiki_page_destroy_question: "Aquesta pàgina té {{descendants}} pàgines fill i descendents. Què voleu fer?"
text_wiki_page_nullify_children: "Deixa les pàgines fill com a pàgines arrel"
text_wiki_page_destroy_children: "Suprimeix les pàgines fill i tots els seus descendents"
text_wiki_page_reassign_children: "Reasigna les pàgines fill a aquesta pàgina pare"
text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?"
text_zoom_in: Redueix
text_zoom_out: Amplia
default_role_manager: Gestor
default_role_developer: Desenvolupador
@@ -799,105 +914,10 @@ ca:
enumeration_issue_priorities: Prioritat dels assumptes
enumeration_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps)
label_greater_or_equal: ">="
label_less_or_equal: <=
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
text_wiki_page_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
enumeration_system_activity: Activitat del sistema
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

View File

@@ -1,4 +1,5 @@
cs:
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
@@ -23,8 +24,8 @@ cs:
time: "%H:%M"
short: "%d %b %H:%M"
long: "%B %d, %Y %H:%M"
am: "am"
pm: "pm"
am: "dop."
pm: "odp."
datetime:
distance_in_words:
@@ -60,10 +61,14 @@ cs:
one: "více než 1 rok"
other: "více než {{count}} roky"
almost_x_years:
one: "almost 1 year"
other: "almost {{count}} years"
one: "témeř 1 rok"
other: "téměř {{count}} roky"
number:
number:
format:
separator: "."
delimiter: ""
precision: 3
human:
format:
precision: 1
@@ -111,6 +116,7 @@ cs:
greater_than_start_date: "musí být větší než počáteční datum"
not_same_project: "nepatří stejnému projektu"
circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
# Updated by Josef Liška <jl@chl.cz>
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
@@ -144,19 +150,19 @@ cs:
notice_successful_connection: Úspěšné připojení.
notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
notice_locking_conflict: Údaje byly změněny jiným uživatelem.
notice_scm_error: Entry and/or revision doesn't exist in the repository.
notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři.
notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
notice_email_sent: "Na adresu {{value}} byl odeslán email"
notice_email_error: "Při odesílání emailu nastala chyba ({{value}})"
notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
notice_failed_to_save_issues: "Failed to save {{count}} issue(s) on {{total}} selected: {{ids}}."
notice_failed_to_save_issues: "Chyba při uložení {{count}} úkolu(ů) z {{total}} vybraných: {{ids}}."
notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}"
error_scm_not_found: "Položka a/nebo revize neexistují v repository."
error_scm_command_failed: "Při pokusu o přístup k repository došlo k chybě: {{value}}"
error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři."
error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: {{value}}"
error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
mail_subject_lost_password: "Vaše heslo ({{value}})"
@@ -204,10 +210,10 @@ cs:
field_due_date: Uzavřít do
field_assigned_to: Přiřazeno
field_priority: Priorita
field_fixed_version: Přiřazeno k verzi
field_fixed_version: Cílová verze
field_user: Uživatel
field_role: Role
field_homepage: Homepage
field_homepage: Domovská stránka
field_is_public: Veřejný
field_parent: Nadřazený projekt
field_is_in_roadmap: Úkoly zobrazené v plánu
@@ -259,18 +265,18 @@ cs:
setting_app_subtitle: Podtitulek aplikace
setting_welcome_text: Uvítací text
setting_default_language: Výchozí jazyk
setting_login_required: Auten. vyžadována
setting_login_required: Autentifikace vyžadována
setting_self_registration: Povolena automatická registrace
setting_attachment_max_size: Maximální velikost přílohy
setting_issues_export_limit: Limit pro export úkolů
setting_mail_from: Odesílat emaily z adresy
setting_bcc_recipients: Příjemci skryté kopie (bcc)
setting_host_name: Host name
setting_host_name: Jméno serveru
setting_text_formatting: Formátování textu
setting_wiki_compression: Komperese historie Wiki
setting_feeds_limit: Feed content limit
setting_wiki_compression: Komprese historie Wiki
setting_feeds_limit: Limit obsahu příspěvků
setting_default_projects_public: Nové projekty nastavovat jako veřejné
setting_autofetch_changesets: Autofetch commits
setting_autofetch_changesets: Automaticky stahovat commity
setting_sys_api_enabled: Povolit WS pro správu repozitory
setting_commit_ref_keywords: Klíčová slova pro odkazy
setting_commit_fix_keywords: Klíčová slova pro uzavření
@@ -284,8 +290,8 @@ cs:
setting_protocol: Protokol
setting_per_page_options: Povolené počty řádků na stránce
setting_user_format: Formát zobrazení uživatele
setting_activity_days_default: Days displayed on project activity
setting_display_subprojects_issues: Display subprojects issues on main projects by default
setting_activity_days_default: Dny zobrazené v činnosti projektu
setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu
project_module_issue_tracking: Sledování úkolů
project_module_time_tracking: Sledování času
@@ -293,7 +299,7 @@ cs:
project_module_documents: Dokumenty
project_module_files: Soubory
project_module_wiki: Wiki
project_module_repository: Repository
project_module_repository: Repozitář
project_module_boards: Diskuse
label_user: Uživatel
@@ -303,16 +309,16 @@ cs:
label_project_new: Nový projekt
label_project_plural: Projekty
label_x_projects:
zero: no projects
one: 1 project
other: "{{count}} projects"
zero: žádné projekty
one: 1 projekt
other: "{{count}} projekty(ů)"
label_project_all: Všechny projekty
label_project_latest: Poslední projekty
label_issue: Úkol
label_issue_new: Nový úkol
label_issue_plural: Úkoly
label_issue_view_all: Všechny úkoly
label_issues_by: "Úkoly od uživatele {{value}}"
label_issues_by: "Úkoly podle {{value}}"
label_issue_added: Úkol přidán
label_issue_updated: Úkol aktualizován
label_document: Dokument
@@ -329,7 +335,7 @@ cs:
label_tracker: Fronta
label_tracker_plural: Fronty
label_tracker_new: Nová fronta
label_workflow: Workflow
label_workflow: Průběh práce
label_issue_status: Stav úkolu
label_issue_status_plural: Stavy úkolů
label_issue_status_new: Nový stav
@@ -372,14 +378,14 @@ cs:
label_list: Seznam
label_date: Datum
label_integer: Celé číslo
label_float: Desetiné číslo
label_float: Desetinné číslo
label_boolean: Ano/Ne
label_string: Text
label_text: Dlouhý text
label_attribute: Atribut
label_attribute_plural: Atributy
label_download: "{{count}} Download"
label_download_plural: "{{count}} Downloads"
label_download: "{{count}} stažení"
label_download_plural: "{{count}} stažení"
label_no_data: Žádné položky
label_change_status: Změnit stav
label_history: Historie
@@ -388,7 +394,7 @@ cs:
label_attachment_delete: Odstranit soubor
label_attachment_plural: Soubory
label_file_added: Soubor přidán
label_report: Přeheled
label_report: Přehled
label_report_plural: Přehledy
label_news: Novinky
label_news_new: Přidat novinku
@@ -410,17 +416,17 @@ cs:
label_closed_issues: uzavřený
label_closed_issues_plural: uzavřené
label_x_open_issues_abbr_on_total:
zero: 0 open / {{total}}
one: 1 open / {{total}}
other: "{{count}} open / {{total}}"
zero: 0 otevřených / {{total}}
one: 1 otevřený / {{total}}
other: "{{count}} otevřených / {{total}}"
label_x_open_issues_abbr:
zero: 0 open
one: 1 open
other: "{{count}} open"
zero: 0 otevřených
one: 1 otevřený
other: "{{count}} otevřených"
label_x_closed_issues_abbr:
zero: 0 closed
one: 1 closed
other: "{{count}} closed"
zero: 0 uzavřených
one: 1 uzavřený
other: "{{count}} uzavřených"
label_total: Celkem
label_permissions: Práva
label_current_status: Aktuální stav
@@ -444,9 +450,9 @@ cs:
label_comment: Komentář
label_comment_plural: Komentáře
label_x_comments:
zero: no comments
one: 1 comment
other: "{{count}} comments"
zero: žádné komentáře
one: 1 komentář
other: "{{count}} komentářů"
label_comment_add: Přidat komentáře
label_comment_added: Komentář přidán
label_comment_delete: Odstranit komentář
@@ -476,8 +482,8 @@ cs:
label_contains: obsahuje
label_not_contains: neobsahuje
label_day_plural: dny
label_repository: Repository
label_repository_plural: Repository
label_repository: Repozitář
label_repository_plural: Repozitáře
label_browse: Procházet
label_modification: "{{count}} změna"
label_modification_plural: "{{count}} změn"
@@ -526,7 +532,7 @@ cs:
label_diff_inline: uvnitř
label_diff_side_by_side: vedle sebe
label_options: Nastavení
label_copy_workflow_from: Kopírovat workflow z
label_copy_workflow_from: Kopírovat průběh práce z
label_permissions_report: Přehled práv
label_watched_issues: Sledované úkoly
label_related_issues: Související úkoly
@@ -547,7 +553,7 @@ cs:
label_stay_logged_in: Zůstat přihlášený
label_disabled: zakázán
label_show_completed_versions: Ukázat dokončené verze
label_me:
label_me:
label_board: Fórum
label_board_new: Nové fórum
label_board_plural: Fóra
@@ -570,12 +576,12 @@ cs:
label_module_plural: Moduly
label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}"
label_updated_time: "Aktualizováno před {{value}}"
label_jump_to_a_project: Zvolit projekt...
label_jump_to_a_project: Vyberte projekt...
label_file_plural: Soubory
label_changeset_plural: Changesety
label_default_columns: Výchozí sloupce
label_no_change_option: (beze změny)
label_bulk_edit_selected_issues: Bulk edit selected issues
label_bulk_edit_selected_issues: Hromadná úprava vybraných úkolů
label_theme: Téma
label_default: Výchozí
label_search_titles_only: Vyhledávat pouze v názvech
@@ -594,7 +600,7 @@ cs:
label_scm: SCM
label_plugins: Doplňky
label_ldap_authentication: Autentifikace LDAP
label_downloads_abbr: D/L
label_downloads_abbr: Staž.
label_optional_description: Volitelný popis
label_add_another_file: Přidat další soubor
label_preferences: Nastavení
@@ -647,7 +653,7 @@ cs:
text_regexp_info: např. ^[A-Z0-9]+$
text_min_max_length_info: 0 znamená bez limitu
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
text_workflow_edit: Vyberte roli a frontu k editaci workflow
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
text_are_you_sure: Jste si jisti?
text_tip_task_begin_day: úkol začíná v tento den
text_tip_task_end_day: úkol končí v tento den
@@ -656,24 +662,24 @@ cs:
text_caracters_maximum: "{{count}} znaků maximálně."
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
text_length_between: "Délka mezi {{min}} a {{max}} znaky."
text_tracker_no_workflow: Pro tuto frontu není definován žádný workflow
text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce
text_unallowed_characters: Nepovolené znaky
text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů
text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}."
text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}."
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto WIKI a celý její obsah?
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto Wiki a celý její obsah?
text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?"
text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii
text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))."
text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci.Po té si můžete vše upravit"
text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit"
text_load_default_configuration: Nahrát výchozí konfiguraci
text_status_changed_by_changeset: "Použito v changesetu {{value}}."
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
text_select_project_modules: 'Aktivní moduly v tomto projektu:'
text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
text_file_repository_writable: Povolen zápis do repository
text_file_repository_writable: Povolen zápis do adresáře ukládání souborů
text_rmagick_available: RMagick k dispozici (volitelné)
text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?"
text_destroy_time_entries: Odstranit evidované hodiny.
@@ -687,7 +693,7 @@ cs:
default_tracker_feature: Požadavek
default_tracker_support: Podpora
default_issue_status_new: Nový
default_issue_status_in_progress: In Progress
default_issue_status_in_progress: Ve vývoji
default_issue_status_resolved: Vyřešený
default_issue_status_feedback: Čeká se
default_issue_status_closed: Uzavřený
@@ -699,7 +705,7 @@ cs:
default_priority_high: Vysoká
default_priority_urgent: Urgentní
default_priority_immediate: Okamžitá
default_activity_design: Design
default_activity_design: Návhr
default_activity_development: Vývoj
enumeration_issue_priorities: Priority úkolů
@@ -710,10 +716,10 @@ cs:
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
label_and_its_subprojects: "{{value}} a jeho podprojekty"
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})"
text_user_wrote: "{{value}} napsal:"
label_duplicated_by: duplicated by
setting_enabled_scm: Povoleno SCM
label_duplicated_by: duplikováno od
setting_enabled_scm: Povolené SCM
text_enumeration_category_reassign_to: 'Přeřadit je do této:'
text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě."
label_incoming_emails: Příchozí e-maily
@@ -739,22 +745,22 @@ cs:
permission_view_changesets: Zobrazování sady změn
permission_view_time_entries: Zobrazení stráveného času
permission_manage_versions: Spravování verzí
permission_manage_wiki: Spravování wiki
permission_manage_wiki: Spravování Wiki
permission_manage_categories: Spravování kategorií úkolů
permission_protect_wiki_pages: Zabezpečení wiki stránek
permission_protect_wiki_pages: Zabezpečení Wiki stránek
permission_comment_news: Komentování novinek
permission_delete_messages: Mazání zpráv
permission_select_project_modules: Výběr modulů projektu
permission_manage_documents: Správa dokumentů
permission_edit_wiki_pages: Upravování stránek wiki
permission_edit_wiki_pages: Upravování stránek Wiki
permission_add_issue_watchers: Přidání sledujících uživatelů
permission_view_gantt: Zobrazené Ganttova diagramu
permission_move_issues: Přesouvání úkolů
permission_manage_issue_relations: Spravování vztahů mezi úkoly
permission_delete_wiki_pages: Mazání stránek na wiki
permission_delete_wiki_pages: Mazání stránek na Wiki
permission_manage_boards: Správa diskusních fór
permission_delete_wiki_pages_attachments: Mazání příloh
permission_view_wiki_edits: Prohlížení historie wiki
permission_view_wiki_edits: Prohlížení historie Wiki
permission_add_messages: Posílání zpráv
permission_view_messages: Prohlížení zpráv
permission_manage_files: Spravování souborů
@@ -766,26 +772,26 @@ cs:
permission_delete_issues: Mazání úkolů
permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
permission_manage_repository: Spravování repozitáře
permission_commit_access: Commit access
permission_commit_access: Commit přístup
permission_browse_repository: Procházení repozitáře
permission_view_documents: Prohlížení dokumentů
permission_edit_project: Úprava projektů
permission_add_issue_notes: Přidávání poznámek
permission_save_queries: Ukládání dotazů
permission_view_wiki_pages: Prohlížení wiki
permission_rename_wiki_pages: Přejmenovávání wiki stránek
permission_view_wiki_pages: Prohlížení Wiki
permission_rename_wiki_pages: Přejmenovávání Wiki stránek
permission_edit_time_entries: Upravování záznamů o stráveném času
permission_edit_own_issue_notes: Upravování vlastních poznámek
setting_gravatar_enabled: Použít uživatelské ikony Gravatar
label_example: Příklad
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživateslkým jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
permission_edit_own_messages: Upravit vlastní zprávy
permission_delete_own_messages: Smazat vlastní zprávy
label_user_activity: "Aktivita uživatele: {{value}}"
label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}"
text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
text_plugin_assets_writable: Plugin assets directory writable
text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit."
button_create_and_continue: Vytvořit a pokračovat
text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
@@ -804,103 +810,111 @@ cs:
label_date_from_to: Od {{start}} do {{end}}
label_greater_or_equal: ">="
label_less_or_equal: <=
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
text_wiki_page_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
text_wiki_page_destroy_question: Tato stránka má {{descendants}} podstránek a potomků. Co chcete udělat?
text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
setting_password_min_length: Minimální délka hesla
field_group_by: Seskupovat výsledky podle
mail_subject_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována"
label_wiki_content_added: Wiki stránka přidána
mail_subject_wiki_content_added: "'{{page}}' Wiki stránka byla přidána"
mail_body_wiki_content_added: "'{{page}}' Wiki stránka byla přidána od {{author}}."
label_wiki_content_updated: Wiki stránka aktualizována
mail_body_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována od {{author}}."
permission_add_project: Vytvořit projekt
setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
label_view_all_revisions: Zobrazit všechny revize
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
text_journal_changed: "{{label}} změněn z {{old}} na {{new}}"
text_journal_set_to: "{{label}} nastaven na {{value}}"
text_journal_deleted: "{{label}} smazán ({{old}})"
label_group_plural: Skupiny
label_group: Skupina
label_group_new: Nová skupina
label_time_entry_plural: Strávený čas
text_journal_added: "{{label}} {{value}} přidán"
field_active: Aktiv
enumeration_system_activity: Systémová aktivita
permission_delete_issue_watchers: Smazat přihlížející
version_status_closed: zavřený
version_status_locked: uzamčený
version_status_open: otevřený
error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
label_user_anonymous: Anonym
button_move_and_follow: Přesunout a následovat
setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
setting_gravatar_default: Výchozí Gravatar
field_sharing: Sdílení
label_version_sharing_hierarchy: S hierarchií projektu
label_version_sharing_system: Se všemi projekty
label_version_sharing_descendants: S podprojekty
label_version_sharing_tree: Se stromem projektu
label_version_sharing_none: Nesdíleno
error_can_not_archive_project: Tento projekt nemůže být archivován
button_duplicate: Duplikát
button_copy_and_follow: Kopírovat a následovat
label_copy_source: Zdroj
setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
setting_issue_done_ratio_issue_status: Použít stav úkolu
error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
setting_issue_done_ratio_issue_field: Použít pole úkolu
label_copy_same_as_target: Stejný jako cíl
label_copy_target: Cíl
notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
setting_start_of_week: Začínat kalendáře
permission_view_issues: Zobrazit úkoly
label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
label_revision_id: Revize {{value}}
label_api_access_key: API přístupový klíč
label_api_access_key_created_on: API přístupový klíč vytvořen {{value}}
label_feeds_access_key: RSS přístupový klíč
notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
setting_rest_api_enabled: Zapnout službu REST
label_missing_api_access_key: Chybějící přístupový klíč API
label_missing_feeds_access_key: Chybějící přístupový klíč RSS
button_show: Zobrazit
text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
permission_add_subprojects: Vytvořit podprojekty
label_subproject_new: Nový podprojekt
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.
Opravdu chcete pokračovat?
label_close_versions: Zavřít dokončené verze
label_board_sticky: Nálepka
label_board_locked: Uzamčeno
permission_export_wiki_pages: Exportovat Wiki stránky
setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
permission_manage_project_activities: Spravovat aktivity projektu
error_unable_delete_issue_status: Nelze smazat stavy úkolů
label_profile: Profil
permission_manage_subtasks: Spravovat podúkoly
field_parent_issue: Rodičovský úkol
label_subtask_plural: Podúkol
label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
error_can_not_delete_custom_field: Nelze smazat volitelné pole
error_unable_to_connect: Nelze se připojit ({{value}})
error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
field_principal: Hlavní
label_my_page_block: Bloky na mé stránce
notice_failed_to_save_members: "Nepodařilo se uložit člena(y): {{errors}}."
text_zoom_out: Oddálit
text_zoom_in: Přiblížit
notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
label_overall_spent_time: Celkově strávený čas
field_time_entries: Zaznamenaný čas
project_module_gantt: Gantt
project_module_calendar: Kalendář
field_member_of_group: Člen skupiny
field_assigned_to_role: Člen role
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole

View File

@@ -3,6 +3,7 @@
# updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net)
da:
direction: ltr
date:
formats:
default: "%d.%m.%Y"
@@ -129,6 +130,7 @@ da:
greater_than_start_date: "skal være senere end startdatoen"
not_same_project: "hører ikke til samme projekt"
circular_dependency: "Denne relation vil skabe et afhængighedsforhold"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
template:
header:
@@ -791,7 +793,7 @@ da:
permission_browse_repository: Gennemse repository
permission_manage_repository: Administrér repository
permission_manage_members: Administrér medlemmer
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage"
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage ({{days}})"
permission_add_issue_notes: Tilføj noter
permission_edit_messages: Redigér beskeder
permission_view_issue_watchers: Se liste over overvågere
@@ -924,3 +926,12 @@ da:
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

View File

@@ -2,6 +2,7 @@
# by Clemens Kofler (clemens@railway.at)
de:
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
@@ -67,10 +68,11 @@ de:
other: "fast {{count}} Jahren"
number:
# Default format for numbers
format:
precision: 2
separator: ','
delimiter: '.'
precision: 2
currency:
format:
unit: '€'
@@ -99,13 +101,13 @@ de:
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
array:
sentence_connector: "und"
skip_last_comma: true
activerecord:
errors:
template:
@@ -136,9 +138,10 @@ de:
greater_than_start_date: "muss größer als Anfangsdatum sein"
not_same_project: "gehört nicht zum selben Projekt"
circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen"
cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer ihrer Unteraufgaben verlinkt werden"
actionview_instancetag_blank_option: Bitte auswählen
general_text_No: 'Nein'
general_text_Yes: 'Ja'
general_text_no: 'nein'
@@ -171,6 +174,7 @@ de:
notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt.
notice_failed_to_save_issues: "{{count}} von {{total}} ausgewählten Tickets konnte(n) nicht gespeichert werden: {{ids}}."
notice_failed_to_save_members: "Benutzer konnte nicht gespeichert werden: {{errors}}."
notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen.
@@ -185,17 +189,18 @@ de:
error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen.
error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status").
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden.
error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden.
error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert.
error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle.
error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen.
error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden."
warning_attachments_not_saved:
one: "1 Datei konnte nicht gespeichert werden."
other: "{{count}} Dateien konnten nicht gespeichert werden."
error_unable_to_connect: Fehler beim Verbinden ({{value}})
warning_attachments_not_saved: "{{count}} Datei(en) konnten nicht gespeichert werden."
mail_subject_lost_password: "Ihr {{value}} Kennwort"
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
mail_subject_register: "{{value}} Kontoaktivierung"
@@ -204,7 +209,7 @@ de:
mail_body_account_information: Ihre Konto-Informationen
mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung"
mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten Tagen abgegeben werden"
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten {{days}} Tagen abgegeben werden"
mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:"
mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt"
mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt."
@@ -249,6 +254,7 @@ de:
field_priority: Priorität
field_fixed_version: Zielversion
field_user: Benutzer
field_principal: Auftraggeber
field_role: Rolle
field_homepage: Projekt-Homepage
field_is_public: Öffentlich
@@ -293,6 +299,7 @@ de:
field_redirect_existing_links: Existierende Links umleiten
field_estimated_hours: Geschätzter Aufwand
field_column_names: Spalten
field_time_entries: Logzeit
field_time_zone: Zeitzone
field_searchable: Durchsuchbar
field_default_value: Standardwert
@@ -304,6 +311,7 @@ de:
field_content: Inhalt
field_group_by: Gruppiere Ergebnisse nach
field_sharing: Gemeinsame Verwendung
field_parent_issue: Übergeordnete Aufgabe
setting_app_title: Applikations-Titel
setting_app_subtitle: Applikations-Untertitel
@@ -413,6 +421,7 @@ de:
permission_delete_messages: Forenbeiträge löschen
permission_delete_own_messages: Eigene Forenbeiträge löschen
permission_export_wiki_pages: Wiki-Seiten exportieren
permission_manage_subtasks: Unteraufgaben verwalten
project_module_issue_tracking: Ticket-Verfolgung
project_module_time_tracking: Zeiterfassung
@@ -422,7 +431,9 @@ de:
project_module_wiki: Wiki
project_module_repository: Projektarchiv
project_module_boards: Foren
project_module_calendar: Kalender
project_module_gantt: Gantt
label_user: Benutzer
label_user_plural: Benutzer
label_user_new: Neuer Benutzer
@@ -479,6 +490,7 @@ de:
label_my_page: Meine Seite
label_my_account: Mein Konto
label_my_projects: Meine Projekte
label_my_page_block: Bereich "Meine Seite"
label_administration: Administration
label_login: Anmelden
label_logout: Abmelden
@@ -492,7 +504,7 @@ de:
label_user_activity: "Aktivität von {{value}}"
label_new: Neu
label_logged_as: Angemeldet als
label_environment: Environment
label_environment: Umgebung
label_authentication: Authentifizierung
label_auth_source: Authentifizierungs-Modus
label_auth_source_new: Neuer Authentifizierungs-Modus
@@ -542,9 +554,18 @@ de:
label_open_issues_plural: offen
label_closed_issues: geschlossen
label_closed_issues_plural: geschlossen
label_x_open_issues_abbr_on_total: "{{count}} offen / {{total}}"
label_x_open_issues_abbr: "{{count}} offen"
label_x_closed_issues_abbr: "{{count}} geschlossen"
label_x_open_issues_abbr_on_total:
zero: 0 offen / {{total}}
one: 1 offen / {{total}}
other: "{{count}} offen / {{total}}"
label_x_open_issues_abbr:
zero: 0 offen
one: 1 offen
other: "{{count}} offen"
label_x_closed_issues_abbr:
zero: 0 geschlossen
one: 1 geschlossen
other: "{{count}} geschlossen"
label_total: Gesamtzahl
label_permissions: Berechtigungen
label_current_status: Gegenwärtiger Status
@@ -768,7 +789,10 @@ de:
label_api_access_key: API-Zugriffsschlüssel
label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt.
label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor {{value}} erstellt
label_profile: Profil
label_subtask_plural: Unteraufgaben
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
button_login: Anmelden
button_submit: OK
button_save: Speichern
@@ -812,17 +836,17 @@ de:
button_quote: Zitieren
button_duplicate: Duplizieren
button_show: Anzeigen
status_active: aktiv
status_registered: angemeldet
status_locked: gesperrt
version_status_closed: abgeschlossen
version_status_locked: gesperrt
version_status_open: offen
version_status_locked: gesperrt
version_status_closed: abgeschlossen
field_active: Aktiv
text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll.
text_regexp_info: z. B. ^[A-Z0-9]+$
text_min_max_length_info: 0 heißt keine Beschränkung
@@ -877,10 +901,10 @@ de:
text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene
text_wiki_page_destroy_children: Lösche alle Unterseiten
text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu
text_own_membership_delete_confirmation: |-
Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.
Sind Sie sicher, dass Sie dies tun möchten?
text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?"
text_zoom_in: Zoom in
text_zoom_out: Zoom out
default_role_manager: Manager
default_role_developer: Entwickler
default_role_reporter: Reporter
@@ -902,21 +926,14 @@ de:
default_priority_immediate: Sofort
default_activity_design: Design
default_activity_development: Entwicklung
enumeration_issue_priorities: Ticket-Prioritäten
enumeration_doc_categories: Dokumentenkategorien
enumeration_activities: Aktivitäten (Zeiterfassung)
enumeration_system_activity: System-Aktivität
label_profile: Profil
permission_manage_subtasks: Unteraufgaben verwalten
field_parent_issue: Übergeordnete Aufgabe
label_subtask_plural: Unteraufgaben
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
error_unable_to_connect: Fehler beim Verbinden ({{value}})
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

View File

@@ -2,6 +2,7 @@
# by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com)
el:
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
@@ -66,7 +67,11 @@ el:
one: "almost 1 year"
other: "almost {{count}} years"
number:
number:
format:
separator: "."
delimiter: ""
precision: 3
human:
format:
precision: 1
@@ -114,6 +119,7 @@ el:
greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης"
not_same_project: "δεν ανήκει στο ίδιο έργο"
circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Παρακαλώ επιλέξτε
@@ -171,7 +177,7 @@ el:
mail_body_account_information: Πληροφορίες του λογαριασμού σας
mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}"
mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:"
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες ημέρες"
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες {{days}} ημέρες"
mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:"
mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' "
mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}."
@@ -904,3 +910,12 @@ el:
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

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