##// END OF EJS Templates
Gantt progress lines (#12122)....
Jean-Philippe Lang -
r10980:237f297f03e2
parent child
Show More
@@ -1,282 +1,319
1 1 <% @gantt.view = self %>
2 2 <h2><%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2>
3 3
4 4 <%= form_tag({:controller => 'gantts', :action => 'show',
5 5 :project_id => @project, :month => params[:month],
6 6 :year => params[:year], :months => params[:months]},
7 7 :method => :get, :id => 'query_form') do %>
8 8 <%= hidden_field_tag 'set_filter', '1' %>
9 9 <fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
10 10 <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
11 11 <div style="<%= @query.new_record? ? "" : "display: none;" %>">
12 12 <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
13 13 </div>
14 14 </fieldset>
15 <fieldset id="filters" class="collapsible">
16 <legend onclick="toggleFieldset(this);"><%= l(:label_display) %></legend>
17 <div>
18 <table>
19 <tr>
20 <td>
21 <fieldset>
22 <legend><%= l(:label_related_issues) %></legend>
23 <label>
24 <%= check_box_tag "draw_rels", params["draw_rels"], true %>
25 <% rels = [IssueRelation::TYPE_BLOCKS, IssueRelation::TYPE_PRECEDES] %>
26 <% rels.each do |rel| %>
27 <% color = Redmine::Helpers::Gantt::DRAW_TYPES[rel][:color] %>
28 <%= content_tag(:span, '&nbsp;&nbsp;&nbsp;'.html_safe,
29 :style => "background-color: #{color}") %>
30 <%= l(IssueRelation::TYPES[rel][:name]) %>
31 <% end %>
32 </label>
33 </fieldset>
34 </td>
35 <td>
36 <fieldset>
37 <legend><%= l(:label_gantt_progress_line) %></legend>
38 <label>
39 <%= check_box_tag "draw_progress_line", params[:draw_progress_line], false %>
40 <%= l(:label_display) %>
41 </label>
42 </fieldset>
43 </td>
44 </tr>
45 </table>
46 </div>
47 </fieldset>
15 48
16 49 <p class="contextual">
17 50 <%= gantt_zoom_link(@gantt, :in) %>
18 51 <%= gantt_zoom_link(@gantt, :out) %>
19 52 </p>
20 53
21 54 <p class="buttons">
22 55 <%= text_field_tag 'months', @gantt.months, :size => 2 %>
23 56 <%= l(:label_months_from) %>
24 57 <%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %>
25 58 <%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %>
26 59 <%= hidden_field_tag 'zoom', @gantt.zoom %>
27 60
28 61 <%= link_to_function l(:button_apply), '$("#query_form").submit()',
29 62 :class => 'icon icon-checked' %>
30 63 <%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 },
31 64 :class => 'icon icon-reload' %>
32 65 </p>
33 66 <% end %>
34 67
35 68 <%= error_messages_for 'query' %>
36 69 <% if @query.valid? %>
37 70 <%
38 71 zoom = 1
39 72 @gantt.zoom.times { zoom = zoom * 2 }
40 73
41 74 subject_width = 330
42 75 header_heigth = 18
43 76
44 77 headers_height = header_heigth
45 78 show_weeks = false
46 79 show_days = false
47 80
48 81 if @gantt.zoom > 1
49 82 show_weeks = true
50 83 headers_height = 2 * header_heigth
51 84 if @gantt.zoom > 2
52 85 show_days = true
53 86 headers_height = 3 * header_heigth
54 87 end
55 88 end
56 89
57 90 # Width of the entire chart
58 91 g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i
59 92 @gantt.render(:top => headers_height + 8,
60 93 :zoom => zoom,
61 94 :g_width => g_width,
62 95 :subject_width => subject_width)
63 96 g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max
64 97 t_height = g_height + headers_height
65 98 %>
66 99
67 100 <% if @gantt.truncated %>
68 101 <p class="warning"><%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %></p>
69 102 <% end %>
70 103
71 104 <table style="width:100%; border:0; border-collapse: collapse;">
72 105 <tr>
73 106 <td style="width:<%= subject_width %>px; padding:0px;">
74 107 <%
75 108 style = ""
76 109 style += "position:relative;"
77 110 style += "height: #{t_height + 24}px;"
78 111 style += "width: #{subject_width + 1}px;"
79 112 %>
80 113 <%= content_tag(:div, :style => style) do %>
81 114 <%
82 115 style = ""
83 116 style += "right:-2px;"
84 117 style += "width: #{subject_width}px;"
85 118 style += "height: #{headers_height}px;"
86 119 style += 'background: #eee;'
87 120 %>
88 121 <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %>
89 122 <%
90 123 style = ""
91 124 style += "right:-2px;"
92 125 style += "width: #{subject_width}px;"
93 126 style += "height: #{t_height}px;"
94 127 style += 'border-left: 1px solid #c0c0c0;'
95 128 style += 'overflow: hidden;'
96 129 %>
97 130 <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %>
98 131 <%= content_tag(:div, :class => "gantt_subjects") do %>
99 132 <%= @gantt.subjects.html_safe %>
100 133 <% end %>
101 134 <% end %>
102 135 </td>
103 136
104 137 <td>
105 138 <div style="position:relative;height:<%= t_height + 24 %>px;overflow:auto;" id="gantt_area">
106 139 <%
107 140 style = ""
108 141 style += "width: #{g_width - 1}px;"
109 142 style += "height: #{headers_height}px;"
110 143 style += 'background: #eee;'
111 144 %>
112 145 <%= content_tag(:div, '&nbsp;'.html_safe, :style => style, :class => "gantt_hdr") %>
113 146
114 147 <% ###### Months headers ###### %>
115 148 <%
116 149 month_f = @gantt.date_from
117 150 left = 0
118 151 height = (show_weeks ? header_heigth : header_heigth + g_height)
119 152 %>
120 153 <% @gantt.months.times do %>
121 154 <%
122 155 width = (((month_f >> 1) - month_f) * zoom - 1).to_i
123 156 style = ""
124 157 style += "left: #{left}px;"
125 158 style += "width: #{width}px;"
126 159 style += "height: #{height}px;"
127 160 %>
128 161 <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %>
129 162 <%= link_to h("#{month_f.year}-#{month_f.month}"),
130 163 @gantt.params.merge(:year => month_f.year, :month => month_f.month),
131 164 :title => "#{month_name(month_f.month)} #{month_f.year}" %>
132 165 <% end %>
133 166 <%
134 167 left = left + width + 1
135 168 month_f = month_f >> 1
136 169 %>
137 170 <% end %>
138 171
139 172 <% ###### Weeks headers ###### %>
140 173 <% if show_weeks %>
141 174 <%
142 175 left = 0
143 176 height = (show_days ? header_heigth - 1 : header_heigth - 1 + g_height)
144 177 %>
145 178 <% if @gantt.date_from.cwday == 1 %>
146 179 <%
147 180 # @date_from is monday
148 181 week_f = @gantt.date_from
149 182 %>
150 183 <% else %>
151 184 <%
152 185 # find next monday after @date_from
153 186 week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1)
154 187 width = (7 - @gantt.date_from.cwday + 1) * zoom - 1
155 188 style = ""
156 189 style += "left: #{left}px;"
157 190 style += "top: 19px;"
158 191 style += "width: #{width}px;"
159 192 style += "height: #{height}px;"
160 193 %>
161 194 <%= content_tag(:div, '&nbsp;'.html_safe,
162 195 :style => style, :class => "gantt_hdr") %>
163 196 <% left = left + width + 1 %>
164 197 <% end %>
165 198 <% while week_f <= @gantt.date_to %>
166 199 <%
167 200 width = ((week_f + 6 <= @gantt.date_to) ?
168 201 7 * zoom - 1 :
169 202 (@gantt.date_to - week_f + 1) * zoom - 1).to_i
170 203 style = ""
171 204 style += "left: #{left}px;"
172 205 style += "top: 19px;"
173 206 style += "width: #{width}px;"
174 207 style += "height: #{height}px;"
175 208 %>
176 209 <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %>
177 210 <%= content_tag(:small) do %>
178 211 <%= week_f.cweek if width >= 16 %>
179 212 <% end %>
180 213 <% end %>
181 214 <%
182 215 left = left + width + 1
183 216 week_f = week_f + 7
184 217 %>
185 218 <% end %>
186 219 <% end %>
187 220
188 221 <% ###### Days headers ####### %>
189 222 <% if show_days %>
190 223 <%
191 224 left = 0
192 225 height = g_height + header_heigth - 1
193 226 wday = @gantt.date_from.cwday
194 227 %>
195 228 <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %>
196 229 <%
197 230 width = zoom - 1
198 231 style = ""
199 232 style += "left: #{left}px;"
200 233 style += "top:37px;"
201 234 style += "width: #{width}px;"
202 235 style += "height: #{height}px;"
203 236 style += "font-size:0.7em;"
204 237 clss = "gantt_hdr"
205 238 clss << " nwday" if @gantt.non_working_week_days.include?(wday)
206 239 %>
207 240 <%= content_tag(:div, :style => style, :class => clss) do %>
208 241 <%= day_letter(wday) %>
209 242 <% end %>
210 243 <%
211 244 left = left + width + 1
212 245 wday = wday + 1
213 246 wday = 1 if wday > 7
214 247 %>
215 248 <% end %>
216 249 <% end %>
217 250
218 251 <%= @gantt.lines.html_safe %>
219 252
220 253 <% ###### Today red line (excluded from cache) ###### %>
221 254 <% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %>
222 255 <%
223 256 today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i
224 257 style = ""
225 258 style += "position: absolute;"
226 259 style += "height: #{g_height}px;"
227 260 style += "top: #{headers_height + 1}px;"
228 261 style += "left: #{today_left}px;"
229 262 style += "width:10px;"
230 263 style += "border-left: 1px dashed red;"
231 264 %>
232 <%= content_tag(:div, '&nbsp;'.html_safe, :style => style) %>
265 <%= content_tag(:div, '&nbsp;'.html_safe, :style => style, :id => 'today_line') %>
233 266 <% end %>
234 267 <%
235 268 style = ""
236 269 style += "position: absolute;"
237 270 style += "height: #{g_height}px;"
238 271 style += "top: #{headers_height + 1}px;"
239 272 style += "left: 0px;"
240 273 style += "width: #{g_width - 1}px;"
241 274 %>
242 275 <%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %>
243 276 </div>
244 277 </td>
245 278 </tr>
246 279 </table>
247 280
248 281 <table style="width:100%">
249 282 <tr>
250 283 <td align="left">
251 284 <%= link_to_content_update("\xc2\xab " + l(:label_previous),
252 285 params.merge(@gantt.params_previous)) %>
253 286 </td>
254 287 <td align="right">
255 288 <%= link_to_content_update(l(:label_next) + " \xc2\xbb",
256 289 params.merge(@gantt.params_next)) %>
257 290 </td>
258 291 </tr>
259 292 </table>
260 293
261 294 <% other_formats_links do |f| %>
262 295 <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %>
263 296 <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %>
264 297 <% end %>
265 298 <% end # query.valid? %>
266 299
267 300 <% content_for :sidebar do %>
268 301 <%= render :partial => 'issues/sidebar' %>
269 302 <% end %>
270 303
271 304 <% html_title(l(:label_gantt)) -%>
272 305
273 306 <% content_for :header_tags do %>
274 307 <%= javascript_include_tag 'raphael' %>
275 308 <%= javascript_include_tag 'gantt' %>
276 309 <% end %>
277 310
278 311 <%= javascript_tag do %>
279 312 var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>;
280 313 $(document).ready(drawGanttHandler);
281 314 $(window).resize(drawGanttHandler);
315 $(function() {
316 $("#draw_rels").change(drawGanttHandler);
317 $("#draw_progress_line").change(drawGanttHandler);
318 });
282 319 <% end %>
@@ -1,1078 +1,1079
1 1 en:
2 2 # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
3 3 direction: ltr
4 4 date:
5 5 formats:
6 6 # Use the strftime parameters for formats.
7 7 # When no format has been given, it uses default.
8 8 # You can provide other formats here if you like!
9 9 default: "%m/%d/%Y"
10 10 short: "%b %d"
11 11 long: "%B %d, %Y"
12 12
13 13 day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
14 14 abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
15 15
16 16 # Don't forget the nil at the beginning; there's no such thing as a 0th month
17 17 month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
18 18 abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
19 19 # Used in date_select and datime_select.
20 20 order:
21 21 - :year
22 22 - :month
23 23 - :day
24 24
25 25 time:
26 26 formats:
27 27 default: "%m/%d/%Y %I:%M %p"
28 28 time: "%I:%M %p"
29 29 short: "%d %b %H:%M"
30 30 long: "%B %d, %Y %H:%M"
31 31 am: "am"
32 32 pm: "pm"
33 33
34 34 datetime:
35 35 distance_in_words:
36 36 half_a_minute: "half a minute"
37 37 less_than_x_seconds:
38 38 one: "less than 1 second"
39 39 other: "less than %{count} seconds"
40 40 x_seconds:
41 41 one: "1 second"
42 42 other: "%{count} seconds"
43 43 less_than_x_minutes:
44 44 one: "less than a minute"
45 45 other: "less than %{count} minutes"
46 46 x_minutes:
47 47 one: "1 minute"
48 48 other: "%{count} minutes"
49 49 about_x_hours:
50 50 one: "about 1 hour"
51 51 other: "about %{count} hours"
52 52 x_hours:
53 53 one: "1 hour"
54 54 other: "%{count} hours"
55 55 x_days:
56 56 one: "1 day"
57 57 other: "%{count} days"
58 58 about_x_months:
59 59 one: "about 1 month"
60 60 other: "about %{count} months"
61 61 x_months:
62 62 one: "1 month"
63 63 other: "%{count} months"
64 64 about_x_years:
65 65 one: "about 1 year"
66 66 other: "about %{count} years"
67 67 over_x_years:
68 68 one: "over 1 year"
69 69 other: "over %{count} years"
70 70 almost_x_years:
71 71 one: "almost 1 year"
72 72 other: "almost %{count} years"
73 73
74 74 number:
75 75 format:
76 76 separator: "."
77 77 delimiter: ""
78 78 precision: 3
79 79
80 80 human:
81 81 format:
82 82 delimiter: ""
83 83 precision: 3
84 84 storage_units:
85 85 format: "%n %u"
86 86 units:
87 87 byte:
88 88 one: "Byte"
89 89 other: "Bytes"
90 90 kb: "KB"
91 91 mb: "MB"
92 92 gb: "GB"
93 93 tb: "TB"
94 94
95 95 # Used in array.to_sentence.
96 96 support:
97 97 array:
98 98 sentence_connector: "and"
99 99 skip_last_comma: false
100 100
101 101 activerecord:
102 102 errors:
103 103 template:
104 104 header:
105 105 one: "1 error prohibited this %{model} from being saved"
106 106 other: "%{count} errors prohibited this %{model} from being saved"
107 107 messages:
108 108 inclusion: "is not included in the list"
109 109 exclusion: "is reserved"
110 110 invalid: "is invalid"
111 111 confirmation: "doesn't match confirmation"
112 112 accepted: "must be accepted"
113 113 empty: "can't be empty"
114 114 blank: "can't be blank"
115 115 too_long: "is too long (maximum is %{count} characters)"
116 116 too_short: "is too short (minimum is %{count} characters)"
117 117 wrong_length: "is the wrong length (should be %{count} characters)"
118 118 taken: "has already been taken"
119 119 not_a_number: "is not a number"
120 120 not_a_date: "is not a valid date"
121 121 greater_than: "must be greater than %{count}"
122 122 greater_than_or_equal_to: "must be greater than or equal to %{count}"
123 123 equal_to: "must be equal to %{count}"
124 124 less_than: "must be less than %{count}"
125 125 less_than_or_equal_to: "must be less than or equal to %{count}"
126 126 odd: "must be odd"
127 127 even: "must be even"
128 128 greater_than_start_date: "must be greater than start date"
129 129 not_same_project: "doesn't belong to the same project"
130 130 circular_dependency: "This relation would create a circular dependency"
131 131 cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks"
132 132
133 133 actionview_instancetag_blank_option: Please select
134 134
135 135 general_text_No: 'No'
136 136 general_text_Yes: 'Yes'
137 137 general_text_no: 'no'
138 138 general_text_yes: 'yes'
139 139 general_lang_name: 'English'
140 140 general_csv_separator: ','
141 141 general_csv_decimal_separator: '.'
142 142 general_csv_encoding: ISO-8859-1
143 143 general_pdf_encoding: UTF-8
144 144 general_first_day_of_week: '7'
145 145
146 146 notice_account_updated: Account was successfully updated.
147 147 notice_account_invalid_creditentials: Invalid user or password
148 148 notice_account_password_updated: Password was successfully updated.
149 149 notice_account_wrong_password: Wrong password
150 150 notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you.
151 151 notice_account_unknown_email: Unknown user.
152 152 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
153 153 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
154 154 notice_account_activated: Your account has been activated. You can now log in.
155 155 notice_successful_create: Successful creation.
156 156 notice_successful_update: Successful update.
157 157 notice_successful_delete: Successful deletion.
158 158 notice_successful_connection: Successful connection.
159 159 notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
160 160 notice_locking_conflict: Data has been updated by another user.
161 161 notice_not_authorized: You are not authorized to access this page.
162 162 notice_not_authorized_archived_project: The project you're trying to access has been archived.
163 163 notice_email_sent: "An email was sent to %{value}"
164 164 notice_email_error: "An error occurred while sending mail (%{value})"
165 165 notice_feeds_access_key_reseted: Your RSS access key was reset.
166 166 notice_api_access_key_reseted: Your API access key was reset.
167 167 notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}."
168 168 notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
169 169 notice_failed_to_save_members: "Failed to save member(s): %{errors}."
170 170 notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
171 171 notice_account_pending: "Your account was created and is now pending administrator approval."
172 172 notice_default_data_loaded: Default configuration successfully loaded.
173 173 notice_unable_delete_version: Unable to delete version.
174 174 notice_unable_delete_time_entry: Unable to delete time log entry.
175 175 notice_issue_done_ratios_updated: Issue done ratios updated.
176 176 notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
177 177 notice_issue_successful_create: "Issue %{id} created."
178 178 notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it."
179 179 notice_account_deleted: "Your account has been permanently deleted."
180 180 notice_user_successful_create: "User %{id} created."
181 181
182 182 error_can_t_load_default_data: "Default configuration could not be loaded: %{value}"
183 183 error_scm_not_found: "The entry or revision was not found in the repository."
184 184 error_scm_command_failed: "An error occurred when trying to access the repository: %{value}"
185 185 error_scm_annotate: "The entry does not exist or cannot be annotated."
186 186 error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size."
187 187 error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
188 188 error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
189 189 error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
190 190 error_can_not_delete_custom_field: Unable to delete custom field
191 191 error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted."
192 192 error_can_not_remove_role: "This role is in use and cannot be deleted."
193 193 error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened'
194 194 error_can_not_archive_project: This project cannot be archived
195 195 error_issue_done_ratios_not_updated: "Issue done ratios not updated."
196 196 error_workflow_copy_source: 'Please select a source tracker or role'
197 197 error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
198 198 error_unable_delete_issue_status: 'Unable to delete issue status'
199 199 error_unable_to_connect: "Unable to connect (%{value})"
200 200 error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
201 201 error_session_expired: "Your session has expired. Please login again."
202 202 warning_attachments_not_saved: "%{count} file(s) could not be saved."
203 203
204 204 mail_subject_lost_password: "Your %{value} password"
205 205 mail_body_lost_password: 'To change your password, click on the following link:'
206 206 mail_subject_register: "Your %{value} account activation"
207 207 mail_body_register: 'To activate your account, click on the following link:'
208 208 mail_body_account_information_external: "You can use your %{value} account to log in."
209 209 mail_body_account_information: Your account information
210 210 mail_subject_account_activation_request: "%{value} account activation request"
211 211 mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:"
212 212 mail_subject_reminder: "%{count} issue(s) due in the next %{days} days"
213 213 mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:"
214 214 mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
215 215 mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}."
216 216 mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
217 217 mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}."
218 218
219 219 field_name: Name
220 220 field_description: Description
221 221 field_summary: Summary
222 222 field_is_required: Required
223 223 field_firstname: First name
224 224 field_lastname: Last name
225 225 field_mail: Email
226 226 field_filename: File
227 227 field_filesize: Size
228 228 field_downloads: Downloads
229 229 field_author: Author
230 230 field_created_on: Created
231 231 field_updated_on: Updated
232 232 field_field_format: Format
233 233 field_is_for_all: For all projects
234 234 field_possible_values: Possible values
235 235 field_regexp: Regular expression
236 236 field_min_length: Minimum length
237 237 field_max_length: Maximum length
238 238 field_value: Value
239 239 field_category: Category
240 240 field_title: Title
241 241 field_project: Project
242 242 field_issue: Issue
243 243 field_status: Status
244 244 field_notes: Notes
245 245 field_is_closed: Issue closed
246 246 field_is_default: Default value
247 247 field_tracker: Tracker
248 248 field_subject: Subject
249 249 field_due_date: Due date
250 250 field_assigned_to: Assignee
251 251 field_priority: Priority
252 252 field_fixed_version: Target version
253 253 field_user: User
254 254 field_principal: Principal
255 255 field_role: Role
256 256 field_homepage: Homepage
257 257 field_is_public: Public
258 258 field_parent: Subproject of
259 259 field_is_in_roadmap: Issues displayed in roadmap
260 260 field_login: Login
261 261 field_mail_notification: Email notifications
262 262 field_admin: Administrator
263 263 field_last_login_on: Last connection
264 264 field_language: Language
265 265 field_effective_date: Date
266 266 field_password: Password
267 267 field_new_password: New password
268 268 field_password_confirmation: Confirmation
269 269 field_version: Version
270 270 field_type: Type
271 271 field_host: Host
272 272 field_port: Port
273 273 field_account: Account
274 274 field_base_dn: Base DN
275 275 field_attr_login: Login attribute
276 276 field_attr_firstname: Firstname attribute
277 277 field_attr_lastname: Lastname attribute
278 278 field_attr_mail: Email attribute
279 279 field_onthefly: On-the-fly user creation
280 280 field_start_date: Start date
281 281 field_done_ratio: "% Done"
282 282 field_auth_source: Authentication mode
283 283 field_hide_mail: Hide my email address
284 284 field_comments: Comment
285 285 field_url: URL
286 286 field_start_page: Start page
287 287 field_subproject: Subproject
288 288 field_hours: Hours
289 289 field_activity: Activity
290 290 field_spent_on: Date
291 291 field_identifier: Identifier
292 292 field_is_filter: Used as a filter
293 293 field_issue_to: Related issue
294 294 field_delay: Delay
295 295 field_assignable: Issues can be assigned to this role
296 296 field_redirect_existing_links: Redirect existing links
297 297 field_estimated_hours: Estimated time
298 298 field_column_names: Columns
299 299 field_time_entries: Log time
300 300 field_time_zone: Time zone
301 301 field_searchable: Searchable
302 302 field_default_value: Default value
303 303 field_comments_sorting: Display comments
304 304 field_parent_title: Parent page
305 305 field_editable: Editable
306 306 field_watcher: Watcher
307 307 field_identity_url: OpenID URL
308 308 field_content: Content
309 309 field_group_by: Group results by
310 310 field_sharing: Sharing
311 311 field_parent_issue: Parent task
312 312 field_member_of_group: "Assignee's group"
313 313 field_assigned_to_role: "Assignee's role"
314 314 field_text: Text field
315 315 field_visible: Visible
316 316 field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text"
317 317 field_issues_visibility: Issues visibility
318 318 field_is_private: Private
319 319 field_commit_logs_encoding: Commit messages encoding
320 320 field_scm_path_encoding: Path encoding
321 321 field_path_to_repository: Path to repository
322 322 field_root_directory: Root directory
323 323 field_cvsroot: CVSROOT
324 324 field_cvs_module: Module
325 325 field_repository_is_default: Main repository
326 326 field_multiple: Multiple values
327 327 field_auth_source_ldap_filter: LDAP filter
328 328 field_core_fields: Standard fields
329 329 field_timeout: "Timeout (in seconds)"
330 330 field_board_parent: Parent forum
331 331 field_private_notes: Private notes
332 332
333 333 setting_app_title: Application title
334 334 setting_app_subtitle: Application subtitle
335 335 setting_welcome_text: Welcome text
336 336 setting_default_language: Default language
337 337 setting_login_required: Authentication required
338 338 setting_self_registration: Self-registration
339 339 setting_attachment_max_size: Maximum attachment size
340 340 setting_issues_export_limit: Issues export limit
341 341 setting_mail_from: Emission email address
342 342 setting_bcc_recipients: Blind carbon copy recipients (bcc)
343 343 setting_plain_text_mail: Plain text mail (no HTML)
344 344 setting_host_name: Host name and path
345 345 setting_text_formatting: Text formatting
346 346 setting_wiki_compression: Wiki history compression
347 347 setting_feeds_limit: Maximum number of items in Atom feeds
348 348 setting_default_projects_public: New projects are public by default
349 349 setting_autofetch_changesets: Fetch commits automatically
350 350 setting_sys_api_enabled: Enable WS for repository management
351 351 setting_commit_ref_keywords: Referencing keywords
352 352 setting_commit_fix_keywords: Fixing keywords
353 353 setting_autologin: Autologin
354 354 setting_date_format: Date format
355 355 setting_time_format: Time format
356 356 setting_cross_project_issue_relations: Allow cross-project issue relations
357 357 setting_cross_project_subtasks: Allow cross-project subtasks
358 358 setting_issue_list_default_columns: Default columns displayed on the issue list
359 359 setting_repositories_encodings: Attachments and repositories encodings
360 360 setting_emails_header: Emails header
361 361 setting_emails_footer: Emails footer
362 362 setting_protocol: Protocol
363 363 setting_per_page_options: Objects per page options
364 364 setting_user_format: Users display format
365 365 setting_activity_days_default: Days displayed on project activity
366 366 setting_display_subprojects_issues: Display subprojects issues on main projects by default
367 367 setting_enabled_scm: Enabled SCM
368 368 setting_mail_handler_body_delimiters: "Truncate emails after one of these lines"
369 369 setting_mail_handler_api_enabled: Enable WS for incoming emails
370 370 setting_mail_handler_api_key: API key
371 371 setting_sequential_project_identifiers: Generate sequential project identifiers
372 372 setting_gravatar_enabled: Use Gravatar user icons
373 373 setting_gravatar_default: Default Gravatar image
374 374 setting_diff_max_lines_displayed: Maximum number of diff lines displayed
375 375 setting_file_max_size_displayed: Maximum size of text files displayed inline
376 376 setting_repository_log_display_limit: Maximum number of revisions displayed on file log
377 377 setting_openid: Allow OpenID login and registration
378 378 setting_password_min_length: Minimum password length
379 379 setting_new_project_user_role_id: Role given to a non-admin user who creates a project
380 380 setting_default_projects_modules: Default enabled modules for new projects
381 381 setting_issue_done_ratio: Calculate the issue done ratio with
382 382 setting_issue_done_ratio_issue_field: Use the issue field
383 383 setting_issue_done_ratio_issue_status: Use the issue status
384 384 setting_start_of_week: Start calendars on
385 385 setting_rest_api_enabled: Enable REST web service
386 386 setting_cache_formatted_text: Cache formatted text
387 387 setting_default_notification_option: Default notification option
388 388 setting_commit_logtime_enabled: Enable time logging
389 389 setting_commit_logtime_activity_id: Activity for logged time
390 390 setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
391 391 setting_issue_group_assignment: Allow issue assignment to groups
392 392 setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
393 393 setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
394 394 setting_unsubscribe: Allow users to delete their own account
395 395 setting_session_lifetime: Session maximum lifetime
396 396 setting_session_timeout: Session inactivity timeout
397 397 setting_thumbnails_enabled: Display attachment thumbnails
398 398 setting_thumbnails_size: Thumbnails size (in pixels)
399 399 setting_non_working_week_days: Non-working days
400 400
401 401 permission_add_project: Create project
402 402 permission_add_subprojects: Create subprojects
403 403 permission_edit_project: Edit project
404 404 permission_close_project: Close / reopen the project
405 405 permission_select_project_modules: Select project modules
406 406 permission_manage_members: Manage members
407 407 permission_manage_project_activities: Manage project activities
408 408 permission_manage_versions: Manage versions
409 409 permission_manage_categories: Manage issue categories
410 410 permission_view_issues: View Issues
411 411 permission_add_issues: Add issues
412 412 permission_edit_issues: Edit issues
413 413 permission_manage_issue_relations: Manage issue relations
414 414 permission_set_issues_private: Set issues public or private
415 415 permission_set_own_issues_private: Set own issues public or private
416 416 permission_add_issue_notes: Add notes
417 417 permission_edit_issue_notes: Edit notes
418 418 permission_edit_own_issue_notes: Edit own notes
419 419 permission_view_private_notes: View private notes
420 420 permission_set_notes_private: Set notes as private
421 421 permission_move_issues: Move issues
422 422 permission_delete_issues: Delete issues
423 423 permission_manage_public_queries: Manage public queries
424 424 permission_save_queries: Save queries
425 425 permission_view_gantt: View gantt chart
426 426 permission_view_calendar: View calendar
427 427 permission_view_issue_watchers: View watchers list
428 428 permission_add_issue_watchers: Add watchers
429 429 permission_delete_issue_watchers: Delete watchers
430 430 permission_log_time: Log spent time
431 431 permission_view_time_entries: View spent time
432 432 permission_edit_time_entries: Edit time logs
433 433 permission_edit_own_time_entries: Edit own time logs
434 434 permission_manage_news: Manage news
435 435 permission_comment_news: Comment news
436 436 permission_view_documents: View documents
437 437 permission_add_documents: Add documents
438 438 permission_edit_documents: Edit documents
439 439 permission_delete_documents: Delete documents
440 440 permission_manage_files: Manage files
441 441 permission_view_files: View files
442 442 permission_manage_wiki: Manage wiki
443 443 permission_rename_wiki_pages: Rename wiki pages
444 444 permission_delete_wiki_pages: Delete wiki pages
445 445 permission_view_wiki_pages: View wiki
446 446 permission_view_wiki_edits: View wiki history
447 447 permission_edit_wiki_pages: Edit wiki pages
448 448 permission_delete_wiki_pages_attachments: Delete attachments
449 449 permission_protect_wiki_pages: Protect wiki pages
450 450 permission_manage_repository: Manage repository
451 451 permission_browse_repository: Browse repository
452 452 permission_view_changesets: View changesets
453 453 permission_commit_access: Commit access
454 454 permission_manage_boards: Manage forums
455 455 permission_view_messages: View messages
456 456 permission_add_messages: Post messages
457 457 permission_edit_messages: Edit messages
458 458 permission_edit_own_messages: Edit own messages
459 459 permission_delete_messages: Delete messages
460 460 permission_delete_own_messages: Delete own messages
461 461 permission_export_wiki_pages: Export wiki pages
462 462 permission_manage_subtasks: Manage subtasks
463 463 permission_manage_related_issues: Manage related issues
464 464
465 465 project_module_issue_tracking: Issue tracking
466 466 project_module_time_tracking: Time tracking
467 467 project_module_news: News
468 468 project_module_documents: Documents
469 469 project_module_files: Files
470 470 project_module_wiki: Wiki
471 471 project_module_repository: Repository
472 472 project_module_boards: Forums
473 473 project_module_calendar: Calendar
474 474 project_module_gantt: Gantt
475 475
476 476 label_user: User
477 477 label_user_plural: Users
478 478 label_user_new: New user
479 479 label_user_anonymous: Anonymous
480 480 label_project: Project
481 481 label_project_new: New project
482 482 label_project_plural: Projects
483 483 label_x_projects:
484 484 zero: no projects
485 485 one: 1 project
486 486 other: "%{count} projects"
487 487 label_project_all: All Projects
488 488 label_project_latest: Latest projects
489 489 label_issue: Issue
490 490 label_issue_new: New issue
491 491 label_issue_plural: Issues
492 492 label_issue_view_all: View all issues
493 493 label_issues_by: "Issues by %{value}"
494 494 label_issue_added: Issue added
495 495 label_issue_updated: Issue updated
496 496 label_issue_note_added: Note added
497 497 label_issue_status_updated: Status updated
498 498 label_issue_priority_updated: Priority updated
499 499 label_document: Document
500 500 label_document_new: New document
501 501 label_document_plural: Documents
502 502 label_document_added: Document added
503 503 label_role: Role
504 504 label_role_plural: Roles
505 505 label_role_new: New role
506 506 label_role_and_permissions: Roles and permissions
507 507 label_role_anonymous: Anonymous
508 508 label_role_non_member: Non member
509 509 label_member: Member
510 510 label_member_new: New member
511 511 label_member_plural: Members
512 512 label_tracker: Tracker
513 513 label_tracker_plural: Trackers
514 514 label_tracker_new: New tracker
515 515 label_workflow: Workflow
516 516 label_issue_status: Issue status
517 517 label_issue_status_plural: Issue statuses
518 518 label_issue_status_new: New status
519 519 label_issue_category: Issue category
520 520 label_issue_category_plural: Issue categories
521 521 label_issue_category_new: New category
522 522 label_custom_field: Custom field
523 523 label_custom_field_plural: Custom fields
524 524 label_custom_field_new: New custom field
525 525 label_enumerations: Enumerations
526 526 label_enumeration_new: New value
527 527 label_information: Information
528 528 label_information_plural: Information
529 529 label_please_login: Please log in
530 530 label_register: Register
531 531 label_login_with_open_id_option: or login with OpenID
532 532 label_password_lost: Lost password
533 533 label_home: Home
534 534 label_my_page: My page
535 535 label_my_account: My account
536 536 label_my_projects: My projects
537 537 label_my_page_block: My page block
538 538 label_administration: Administration
539 539 label_login: Sign in
540 540 label_logout: Sign out
541 541 label_help: Help
542 542 label_reported_issues: Reported issues
543 543 label_assigned_to_me_issues: Issues assigned to me
544 544 label_last_login: Last connection
545 545 label_registered_on: Registered on
546 546 label_activity: Activity
547 547 label_overall_activity: Overall activity
548 548 label_user_activity: "%{value}'s activity"
549 549 label_new: New
550 550 label_logged_as: Logged in as
551 551 label_environment: Environment
552 552 label_authentication: Authentication
553 553 label_auth_source: Authentication mode
554 554 label_auth_source_new: New authentication mode
555 555 label_auth_source_plural: Authentication modes
556 556 label_subproject_plural: Subprojects
557 557 label_subproject_new: New subproject
558 558 label_and_its_subprojects: "%{value} and its subprojects"
559 559 label_min_max_length: Min - Max length
560 560 label_list: List
561 561 label_date: Date
562 562 label_integer: Integer
563 563 label_float: Float
564 564 label_boolean: Boolean
565 565 label_string: Text
566 566 label_text: Long text
567 567 label_attribute: Attribute
568 568 label_attribute_plural: Attributes
569 569 label_no_data: No data to display
570 570 label_change_status: Change status
571 571 label_history: History
572 572 label_attachment: File
573 573 label_attachment_new: New file
574 574 label_attachment_delete: Delete file
575 575 label_attachment_plural: Files
576 576 label_file_added: File added
577 577 label_report: Report
578 578 label_report_plural: Reports
579 579 label_news: News
580 580 label_news_new: Add news
581 581 label_news_plural: News
582 582 label_news_latest: Latest news
583 583 label_news_view_all: View all news
584 584 label_news_added: News added
585 585 label_news_comment_added: Comment added to a news
586 586 label_settings: Settings
587 587 label_overview: Overview
588 588 label_version: Version
589 589 label_version_new: New version
590 590 label_version_plural: Versions
591 591 label_close_versions: Close completed versions
592 592 label_confirmation: Confirmation
593 593 label_export_to: 'Also available in:'
594 594 label_read: Read...
595 595 label_public_projects: Public projects
596 596 label_open_issues: open
597 597 label_open_issues_plural: open
598 598 label_closed_issues: closed
599 599 label_closed_issues_plural: closed
600 600 label_x_open_issues_abbr_on_total:
601 601 zero: 0 open / %{total}
602 602 one: 1 open / %{total}
603 603 other: "%{count} open / %{total}"
604 604 label_x_open_issues_abbr:
605 605 zero: 0 open
606 606 one: 1 open
607 607 other: "%{count} open"
608 608 label_x_closed_issues_abbr:
609 609 zero: 0 closed
610 610 one: 1 closed
611 611 other: "%{count} closed"
612 612 label_x_issues:
613 613 zero: 0 issues
614 614 one: 1 issue
615 615 other: "%{count} issues"
616 616 label_total: Total
617 617 label_permissions: Permissions
618 618 label_current_status: Current status
619 619 label_new_statuses_allowed: New statuses allowed
620 620 label_all: all
621 621 label_any: any
622 622 label_none: none
623 623 label_nobody: nobody
624 624 label_next: Next
625 625 label_previous: Previous
626 626 label_used_by: Used by
627 627 label_details: Details
628 628 label_add_note: Add a note
629 629 label_per_page: Per page
630 630 label_calendar: Calendar
631 631 label_months_from: months from
632 632 label_gantt: Gantt
633 633 label_internal: Internal
634 634 label_last_changes: "last %{count} changes"
635 635 label_change_view_all: View all changes
636 636 label_personalize_page: Personalize this page
637 637 label_comment: Comment
638 638 label_comment_plural: Comments
639 639 label_x_comments:
640 640 zero: no comments
641 641 one: 1 comment
642 642 other: "%{count} comments"
643 643 label_comment_add: Add a comment
644 644 label_comment_added: Comment added
645 645 label_comment_delete: Delete comments
646 646 label_query: Custom query
647 647 label_query_plural: Custom queries
648 648 label_query_new: New query
649 649 label_my_queries: My custom queries
650 650 label_filter_add: Add filter
651 651 label_filter_plural: Filters
652 652 label_equals: is
653 653 label_not_equals: is not
654 654 label_in_less_than: in less than
655 655 label_in_more_than: in more than
656 656 label_in_the_next_days: in the next
657 657 label_in_the_past_days: in the past
658 658 label_greater_or_equal: '>='
659 659 label_less_or_equal: '<='
660 660 label_between: between
661 661 label_in: in
662 662 label_today: today
663 663 label_all_time: all time
664 664 label_yesterday: yesterday
665 665 label_this_week: this week
666 666 label_last_week: last week
667 667 label_last_n_weeks: "last %{count} weeks"
668 668 label_last_n_days: "last %{count} days"
669 669 label_this_month: this month
670 670 label_last_month: last month
671 671 label_this_year: this year
672 672 label_date_range: Date range
673 673 label_less_than_ago: less than days ago
674 674 label_more_than_ago: more than days ago
675 675 label_ago: days ago
676 676 label_contains: contains
677 677 label_not_contains: doesn't contain
678 678 label_any_issues_in_project: any issues in project
679 679 label_any_issues_not_in_project: any issues not in project
680 680 label_no_issues_in_project: no issues in project
681 681 label_day_plural: days
682 682 label_repository: Repository
683 683 label_repository_new: New repository
684 684 label_repository_plural: Repositories
685 685 label_browse: Browse
686 686 label_branch: Branch
687 687 label_tag: Tag
688 688 label_revision: Revision
689 689 label_revision_plural: Revisions
690 690 label_revision_id: "Revision %{value}"
691 691 label_associated_revisions: Associated revisions
692 692 label_added: added
693 693 label_modified: modified
694 694 label_copied: copied
695 695 label_renamed: renamed
696 696 label_deleted: deleted
697 697 label_latest_revision: Latest revision
698 698 label_latest_revision_plural: Latest revisions
699 699 label_view_revisions: View revisions
700 700 label_view_all_revisions: View all revisions
701 701 label_max_size: Maximum size
702 702 label_sort_highest: Move to top
703 703 label_sort_higher: Move up
704 704 label_sort_lower: Move down
705 705 label_sort_lowest: Move to bottom
706 706 label_roadmap: Roadmap
707 707 label_roadmap_due_in: "Due in %{value}"
708 708 label_roadmap_overdue: "%{value} late"
709 709 label_roadmap_no_issues: No issues for this version
710 710 label_search: Search
711 711 label_result_plural: Results
712 712 label_all_words: All words
713 713 label_wiki: Wiki
714 714 label_wiki_edit: Wiki edit
715 715 label_wiki_edit_plural: Wiki edits
716 716 label_wiki_page: Wiki page
717 717 label_wiki_page_plural: Wiki pages
718 718 label_index_by_title: Index by title
719 719 label_index_by_date: Index by date
720 720 label_current_version: Current version
721 721 label_preview: Preview
722 722 label_feed_plural: Feeds
723 723 label_changes_details: Details of all changes
724 724 label_issue_tracking: Issue tracking
725 725 label_spent_time: Spent time
726 726 label_overall_spent_time: Overall spent time
727 727 label_f_hour: "%{value} hour"
728 728 label_f_hour_plural: "%{value} hours"
729 729 label_time_tracking: Time tracking
730 730 label_change_plural: Changes
731 731 label_statistics: Statistics
732 732 label_commits_per_month: Commits per month
733 733 label_commits_per_author: Commits per author
734 734 label_diff: diff
735 735 label_view_diff: View differences
736 736 label_diff_inline: inline
737 737 label_diff_side_by_side: side by side
738 738 label_options: Options
739 739 label_copy_workflow_from: Copy workflow from
740 740 label_permissions_report: Permissions report
741 741 label_watched_issues: Watched issues
742 742 label_related_issues: Related issues
743 743 label_applied_status: Applied status
744 744 label_loading: Loading...
745 745 label_relation_new: New relation
746 746 label_relation_delete: Delete relation
747 747 label_relates_to: Related to
748 748 label_duplicates: Duplicates
749 749 label_duplicated_by: Duplicated by
750 750 label_blocks: Blocks
751 751 label_blocked_by: Blocked by
752 752 label_precedes: Precedes
753 753 label_follows: Follows
754 754 label_copied_to: Copied to
755 755 label_copied_from: Copied from
756 756 label_end_to_start: end to start
757 757 label_end_to_end: end to end
758 758 label_start_to_start: start to start
759 759 label_start_to_end: start to end
760 760 label_stay_logged_in: Stay logged in
761 761 label_disabled: disabled
762 762 label_show_completed_versions: Show completed versions
763 763 label_me: me
764 764 label_board: Forum
765 765 label_board_new: New forum
766 766 label_board_plural: Forums
767 767 label_board_locked: Locked
768 768 label_board_sticky: Sticky
769 769 label_topic_plural: Topics
770 770 label_message_plural: Messages
771 771 label_message_last: Last message
772 772 label_message_new: New message
773 773 label_message_posted: Message added
774 774 label_reply_plural: Replies
775 775 label_send_information: Send account information to the user
776 776 label_year: Year
777 777 label_month: Month
778 778 label_week: Week
779 779 label_date_from: From
780 780 label_date_to: To
781 781 label_language_based: Based on user's language
782 782 label_sort_by: "Sort by %{value}"
783 783 label_send_test_email: Send a test email
784 784 label_feeds_access_key: RSS access key
785 785 label_missing_feeds_access_key: Missing a RSS access key
786 786 label_feeds_access_key_created_on: "RSS access key created %{value} ago"
787 787 label_module_plural: Modules
788 788 label_added_time_by: "Added by %{author} %{age} ago"
789 789 label_updated_time_by: "Updated by %{author} %{age} ago"
790 790 label_updated_time: "Updated %{value} ago"
791 791 label_jump_to_a_project: Jump to a project...
792 792 label_file_plural: Files
793 793 label_changeset_plural: Changesets
794 794 label_default_columns: Default columns
795 795 label_no_change_option: (No change)
796 796 label_bulk_edit_selected_issues: Bulk edit selected issues
797 797 label_bulk_edit_selected_time_entries: Bulk edit selected time entries
798 798 label_theme: Theme
799 799 label_default: Default
800 800 label_search_titles_only: Search titles only
801 801 label_user_mail_option_all: "For any event on all my projects"
802 802 label_user_mail_option_selected: "For any event on the selected projects only..."
803 803 label_user_mail_option_none: "No events"
804 804 label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in"
805 805 label_user_mail_option_only_assigned: "Only for things I am assigned to"
806 806 label_user_mail_option_only_owner: "Only for things I am the owner of"
807 807 label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
808 808 label_registration_activation_by_email: account activation by email
809 809 label_registration_manual_activation: manual account activation
810 810 label_registration_automatic_activation: automatic account activation
811 811 label_display_per_page: "Per page: %{value}"
812 812 label_age: Age
813 813 label_change_properties: Change properties
814 814 label_general: General
815 815 label_more: More
816 816 label_scm: SCM
817 817 label_plugins: Plugins
818 818 label_ldap_authentication: LDAP authentication
819 819 label_downloads_abbr: D/L
820 820 label_optional_description: Optional description
821 821 label_add_another_file: Add another file
822 822 label_preferences: Preferences
823 823 label_chronological_order: In chronological order
824 824 label_reverse_chronological_order: In reverse chronological order
825 825 label_planning: Planning
826 826 label_incoming_emails: Incoming emails
827 827 label_generate_key: Generate a key
828 828 label_issue_watchers: Watchers
829 829 label_example: Example
830 830 label_display: Display
831 831 label_sort: Sort
832 832 label_ascending: Ascending
833 833 label_descending: Descending
834 834 label_date_from_to: From %{start} to %{end}
835 835 label_wiki_content_added: Wiki page added
836 836 label_wiki_content_updated: Wiki page updated
837 837 label_group: Group
838 838 label_group_plural: Groups
839 839 label_group_new: New group
840 840 label_time_entry_plural: Spent time
841 841 label_version_sharing_none: Not shared
842 842 label_version_sharing_descendants: With subprojects
843 843 label_version_sharing_hierarchy: With project hierarchy
844 844 label_version_sharing_tree: With project tree
845 845 label_version_sharing_system: With all projects
846 846 label_update_issue_done_ratios: Update issue done ratios
847 847 label_copy_source: Source
848 848 label_copy_target: Target
849 849 label_copy_same_as_target: Same as target
850 850 label_display_used_statuses_only: Only display statuses that are used by this tracker
851 851 label_api_access_key: API access key
852 852 label_missing_api_access_key: Missing an API access key
853 853 label_api_access_key_created_on: "API access key created %{value} ago"
854 854 label_profile: Profile
855 855 label_subtask_plural: Subtasks
856 856 label_project_copy_notifications: Send email notifications during the project copy
857 857 label_principal_search: "Search for user or group:"
858 858 label_user_search: "Search for user:"
859 859 label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
860 860 label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
861 861 label_issues_visibility_all: All issues
862 862 label_issues_visibility_public: All non private issues
863 863 label_issues_visibility_own: Issues created by or assigned to the user
864 864 label_git_report_last_commit: Report last commit for files and directories
865 865 label_parent_revision: Parent
866 866 label_child_revision: Child
867 867 label_export_options: "%{export_format} export options"
868 868 label_copy_attachments: Copy attachments
869 869 label_copy_subtasks: Copy subtasks
870 870 label_item_position: "%{position} of %{count}"
871 871 label_completed_versions: Completed versions
872 872 label_search_for_watchers: Search for watchers to add
873 873 label_session_expiration: Session expiration
874 874 label_show_closed_projects: View closed projects
875 875 label_status_transitions: Status transitions
876 876 label_fields_permissions: Fields permissions
877 877 label_readonly: Read-only
878 878 label_required: Required
879 879 label_attribute_of_project: "Project's %{name}"
880 880 label_attribute_of_issue: "Issue's %{name}"
881 881 label_attribute_of_author: "Author's %{name}"
882 882 label_attribute_of_assigned_to: "Assignee's %{name}"
883 883 label_attribute_of_user: "User's %{name}"
884 884 label_attribute_of_fixed_version: "Target version's %{name}"
885 885 label_cross_project_descendants: With subprojects
886 886 label_cross_project_tree: With project tree
887 887 label_cross_project_hierarchy: With project hierarchy
888 888 label_cross_project_system: With all projects
889 label_gantt_progress_line: Progress line
889 890
890 891 button_login: Login
891 892 button_submit: Submit
892 893 button_save: Save
893 894 button_check_all: Check all
894 895 button_uncheck_all: Uncheck all
895 896 button_collapse_all: Collapse all
896 897 button_expand_all: Expand all
897 898 button_delete: Delete
898 899 button_create: Create
899 900 button_create_and_continue: Create and continue
900 901 button_test: Test
901 902 button_edit: Edit
902 903 button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
903 904 button_add: Add
904 905 button_change: Change
905 906 button_apply: Apply
906 907 button_clear: Clear
907 908 button_lock: Lock
908 909 button_unlock: Unlock
909 910 button_download: Download
910 911 button_list: List
911 912 button_view: View
912 913 button_move: Move
913 914 button_move_and_follow: Move and follow
914 915 button_back: Back
915 916 button_cancel: Cancel
916 917 button_activate: Activate
917 918 button_sort: Sort
918 919 button_log_time: Log time
919 920 button_rollback: Rollback to this version
920 921 button_watch: Watch
921 922 button_unwatch: Unwatch
922 923 button_reply: Reply
923 924 button_archive: Archive
924 925 button_unarchive: Unarchive
925 926 button_reset: Reset
926 927 button_rename: Rename
927 928 button_change_password: Change password
928 929 button_copy: Copy
929 930 button_copy_and_follow: Copy and follow
930 931 button_annotate: Annotate
931 932 button_update: Update
932 933 button_configure: Configure
933 934 button_quote: Quote
934 935 button_duplicate: Duplicate
935 936 button_show: Show
936 937 button_hide: Hide
937 938 button_edit_section: Edit this section
938 939 button_export: Export
939 940 button_delete_my_account: Delete my account
940 941 button_close: Close
941 942 button_reopen: Reopen
942 943
943 944 status_active: active
944 945 status_registered: registered
945 946 status_locked: locked
946 947
947 948 project_status_active: active
948 949 project_status_closed: closed
949 950 project_status_archived: archived
950 951
951 952 version_status_open: open
952 953 version_status_locked: locked
953 954 version_status_closed: closed
954 955
955 956 field_active: Active
956 957
957 958 text_select_mail_notifications: Select actions for which email notifications should be sent.
958 959 text_regexp_info: eg. ^[A-Z0-9]+$
959 960 text_min_max_length_info: 0 means no restriction
960 961 text_project_destroy_confirmation: Are you sure you want to delete this project and related data?
961 962 text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted."
962 963 text_workflow_edit: Select a role and a tracker to edit the workflow
963 964 text_are_you_sure: Are you sure?
964 965 text_journal_changed: "%{label} changed from %{old} to %{new}"
965 966 text_journal_changed_no_detail: "%{label} updated"
966 967 text_journal_set_to: "%{label} set to %{value}"
967 968 text_journal_deleted: "%{label} deleted (%{old})"
968 969 text_journal_added: "%{label} %{value} added"
969 970 text_tip_issue_begin_day: issue beginning this day
970 971 text_tip_issue_end_day: issue ending this day
971 972 text_tip_issue_begin_end_day: issue beginning and ending this day
972 973 text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.<br />Once saved, the identifier cannot be changed.'
973 974 text_caracters_maximum: "%{count} characters maximum."
974 975 text_caracters_minimum: "Must be at least %{count} characters long."
975 976 text_length_between: "Length between %{min} and %{max} characters."
976 977 text_tracker_no_workflow: No workflow defined for this tracker
977 978 text_unallowed_characters: Unallowed characters
978 979 text_comma_separated: Multiple values allowed (comma separated).
979 980 text_line_separated: Multiple values allowed (one line for each value).
980 981 text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
981 982 text_issue_added: "Issue %{id} has been reported by %{author}."
982 983 text_issue_updated: "Issue %{id} has been updated by %{author}."
983 984 text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content?
984 985 text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?"
985 986 text_issue_category_destroy_assignments: Remove category assignments
986 987 text_issue_category_reassign_to: Reassign issues to this category
987 988 text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
988 989 text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
989 990 text_load_default_configuration: Load the default configuration
990 991 text_status_changed_by_changeset: "Applied in changeset %{value}."
991 992 text_time_logged_by_changeset: "Applied in changeset %{value}."
992 993 text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?'
993 994 text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)."
994 995 text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?'
995 996 text_select_project_modules: 'Select modules to enable for this project:'
996 997 text_default_administrator_account_changed: Default administrator account changed
997 998 text_file_repository_writable: Attachments directory writable
998 999 text_plugin_assets_writable: Plugin assets directory writable
999 1000 text_rmagick_available: RMagick available (optional)
1000 1001 text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?"
1001 1002 text_destroy_time_entries: Delete reported hours
1002 1003 text_assign_time_entries_to_project: Assign reported hours to the project
1003 1004 text_reassign_time_entries: 'Reassign reported hours to this issue:'
1004 1005 text_user_wrote: "%{value} wrote:"
1005 1006 text_enumeration_destroy_question: "%{count} objects are assigned to this value."
1006 1007 text_enumeration_category_reassign_to: 'Reassign them to this value:'
1007 1008 text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them."
1008 1009 text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
1009 1010 text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
1010 1011 text_custom_field_possible_values_info: 'One line for each value'
1011 1012 text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?"
1012 1013 text_wiki_page_nullify_children: "Keep child pages as root pages"
1013 1014 text_wiki_page_destroy_children: "Delete child pages and all their descendants"
1014 1015 text_wiki_page_reassign_children: "Reassign child pages to this parent page"
1015 1016 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.\nAre you sure you want to continue?"
1016 1017 text_zoom_in: Zoom in
1017 1018 text_zoom_out: Zoom out
1018 1019 text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page."
1019 1020 text_scm_path_encoding_note: "Default: UTF-8"
1020 1021 text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
1021 1022 text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
1022 1023 text_scm_command: Command
1023 1024 text_scm_command_version: Version
1024 1025 text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
1025 1026 text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
1026 1027 text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)"
1027 1028 text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
1028 1029 text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
1029 1030 text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
1030 1031 text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
1031 1032 text_project_closed: This project is closed and read-only.
1032 1033 text_turning_multiple_off: "If you disable multiple values, duplicate values will be removed in order to preserve only one value per item."
1033 1034
1034 1035 default_role_manager: Manager
1035 1036 default_role_developer: Developer
1036 1037 default_role_reporter: Reporter
1037 1038 default_tracker_bug: Bug
1038 1039 default_tracker_feature: Feature
1039 1040 default_tracker_support: Support
1040 1041 default_issue_status_new: New
1041 1042 default_issue_status_in_progress: In Progress
1042 1043 default_issue_status_resolved: Resolved
1043 1044 default_issue_status_feedback: Feedback
1044 1045 default_issue_status_closed: Closed
1045 1046 default_issue_status_rejected: Rejected
1046 1047 default_doc_category_user: User documentation
1047 1048 default_doc_category_tech: Technical documentation
1048 1049 default_priority_low: Low
1049 1050 default_priority_normal: Normal
1050 1051 default_priority_high: High
1051 1052 default_priority_urgent: Urgent
1052 1053 default_priority_immediate: Immediate
1053 1054 default_activity_design: Design
1054 1055 default_activity_development: Development
1055 1056
1056 1057 enumeration_issue_priorities: Issue priorities
1057 1058 enumeration_doc_categories: Document categories
1058 1059 enumeration_activities: Activities (time tracking)
1059 1060 enumeration_system_activity: System Activity
1060 1061 description_filter: Filter
1061 1062 description_search: Searchfield
1062 1063 description_choose_project: Projects
1063 1064 description_project_scope: Search scope
1064 1065 description_notes: Notes
1065 1066 description_message_content: Message content
1066 1067 description_query_sort_criteria_attribute: Sort attribute
1067 1068 description_query_sort_criteria_direction: Sort direction
1068 1069 description_user_mail_notification: Mail notification settings
1069 1070 description_available_columns: Available Columns
1070 1071 description_selected_columns: Selected Columns
1071 1072 description_all_columns: All Columns
1072 1073 description_issue_category_reassign: Choose issue category
1073 1074 description_wiki_subpages_reassign: Choose new parent page
1074 1075 description_date_range_list: Choose range from list
1075 1076 description_date_range_interval: Choose range by selecting start and end date
1076 1077 description_date_from: Enter start date
1077 1078 description_date_to: Enter end date
1078 1079 text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.'
@@ -1,1113 +1,1114
1 1 # Japanese translations for Ruby on Rails
2 2 # by Akira Matsuda (ronnie@dio.jp)
3 3 # AR error messages are basically taken from Ruby-GetText-Package. Thanks to Masao Mutoh.
4 4
5 5 ja:
6 6 direction: ltr
7 7 date:
8 8 formats:
9 9 # Use the strftime parameters for formats.
10 10 # When no format has been given, it uses default.
11 11 # You can provide other formats here if you like!
12 12 default: "%Y/%m/%d"
13 13 short: "%m/%d"
14 14 long: "%Y年%m月%d日(%a)"
15 15
16 16 day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
17 17 abbr_day_names: [, , , , , , ]
18 18
19 19 # Don't forget the nil at the beginning; there's no such thing as a 0th month
20 20 month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
21 21 abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
22 22 # Used in date_select and datime_select.
23 23 order:
24 24 - :year
25 25 - :month
26 26 - :day
27 27
28 28 time:
29 29 formats:
30 30 default: "%Y/%m/%d %H:%M:%S"
31 31 time: "%H:%M"
32 32 short: "%y/%m/%d %H:%M"
33 33 long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
34 34 am: "午前"
35 35 pm: "午後"
36 36
37 37 datetime:
38 38 distance_in_words:
39 39 half_a_minute: "30秒前後"
40 40 less_than_x_seconds:
41 41 one: "1秒以内"
42 42 other: "%{count}秒以内"
43 43 x_seconds:
44 44 one: "1秒"
45 45 other: "%{count}秒"
46 46 less_than_x_minutes:
47 47 one: "1分以内"
48 48 other: "%{count}分以内"
49 49 x_minutes:
50 50 one: "1分"
51 51 other: "%{count}分"
52 52 about_x_hours:
53 53 one: "約1時間"
54 54 other: "約%{count}時間"
55 55 x_hours:
56 56 one: "1時間"
57 57 other: "%{count}時間"
58 58 x_days:
59 59 one: "1日"
60 60 other: "%{count}日"
61 61 about_x_months:
62 62 one: "約1ヶ月"
63 63 other: "約%{count}ヶ月"
64 64 x_months:
65 65 one: "1ヶ月"
66 66 other: "%{count}ヶ月"
67 67 about_x_years:
68 68 one: "約1年"
69 69 other: "約%{count}年"
70 70 over_x_years:
71 71 one: "1年以上"
72 72 other: "%{count}年以上"
73 73 almost_x_years:
74 74 one: "ほぼ1年"
75 75 other: "ほぼ%{count}年"
76 76
77 77 number:
78 78 format:
79 79 separator: "."
80 80 delimiter: ","
81 81 precision: 3
82 82
83 83 currency:
84 84 format:
85 85 format: "%n%u"
86 86 unit: "円"
87 87 separator: "."
88 88 delimiter: ","
89 89 precision: 0
90 90
91 91 percentage:
92 92 format:
93 93 delimiter: ""
94 94
95 95 precision:
96 96 format:
97 97 delimiter: ""
98 98
99 99 human:
100 100 format:
101 101 delimiter: ""
102 102 precision: 3
103 103 storage_units:
104 104 format: "%n %u"
105 105 units:
106 106 byte:
107 107 one: "Byte"
108 108 other: "Bytes"
109 109 kb: "KB"
110 110 mb: "MB"
111 111 gb: "GB"
112 112 tb: "TB"
113 113
114 114 # Used in array.to_sentence.
115 115 support:
116 116 array:
117 117 sentence_connector: "及び"
118 118 skip_last_comma: true
119 119
120 120 activerecord:
121 121 errors:
122 122 template:
123 123 header:
124 124 one: "%{model} にエラーが発生しました。"
125 125 other: "%{model} %{count} つのエラーが発生しました。"
126 126 body: "次の項目を確認してください。"
127 127
128 128 messages:
129 129 inclusion: "は一覧にありません。"
130 130 exclusion: "は予約されています。"
131 131 invalid: "は不正な値です。"
132 132 confirmation: "が一致しません。"
133 133 accepted: "を受諾してください。"
134 134 empty: "を入力してください。"
135 135 blank: "を入力してください。"
136 136 too_long: "は%{count}文字以内で入力してください。"
137 137 too_short: "は%{count}文字以上で入力してください。"
138 138 wrong_length: "は%{count}文字で入力してください。"
139 139 taken: "はすでに存在します。"
140 140 not_a_number: "は数値で入力してください。"
141 141 not_a_date: "は日付を入力してください。"
142 142 greater_than: "は%{count}より大きい値にしてください。"
143 143 greater_than_or_equal_to: "は%{count}以上の値にしてください。"
144 144 equal_to: "は%{count}にしてください。"
145 145 less_than: "は%{count}より小さい値にしてください。"
146 146 less_than_or_equal_to: "は%{count}以下の値にしてください。"
147 147 odd: "は奇数にしてください。"
148 148 even: "は偶数にしてください。"
149 149 greater_than_start_date: "を開始日より後にしてください"
150 150 not_same_project: "同じプロジェクトに属していません"
151 151 circular_dependency: "この関係では、循環依存になります"
152 152 cant_link_an_issue_with_a_descendant: "指定したチケットとは親子関係になっているため関連づけられません"
153 153
154 154 actionview_instancetag_blank_option: 選んでください
155 155
156 156 general_text_No: 'いいえ'
157 157 general_text_Yes: 'はい'
158 158 general_text_no: 'いいえ'
159 159 general_text_yes: 'はい'
160 160 general_lang_name: 'Japanese (日本語)'
161 161 general_csv_separator: ','
162 162 general_csv_decimal_separator: '.'
163 163 general_csv_encoding: CP932
164 164 ## Redmine 1.2.0 現在、この値によって、pdfの出力のフォントを切り替えています。
165 165 ## CRuby では CP932 にしてください。
166 166 ## JRuby 1.6.2 (ruby-1.8.7-p330) では、CP932 ですと
167 167 ## Iconv::InvalidEncoding例外が発生します。
168 168 ## JRuby では、SJIS か Shift_JIS にしてください。
169 169 ## ご存知の通り、CP932 と SJIS は別物ですが、
170 170 ## そこまでの検証はしていません。
171 171 # general_pdf_encoding: SJIS
172 172 general_pdf_encoding: CP932
173 173 general_first_day_of_week: '7'
174 174
175 175 notice_account_updated: アカウントが更新されました。
176 176 notice_account_invalid_creditentials: ユーザー名もしくはパスワードが無効です
177 177 notice_account_password_updated: パスワードが更新されました。
178 178 notice_account_wrong_password: パスワードが違います
179 179 notice_account_register_done: アカウントが作成されました。有効にするには送信したメールにあるリンクをクリックしてください。
180 180 notice_account_unknown_email: ユーザーが存在しません。
181 181 notice_can_t_change_password: このアカウントでは外部認証を使っています。パスワードは変更できません。
182 182 notice_account_lost_email_sent: 新しいパスワードのメールを送信しました。
183 183 notice_account_activated: アカウントが有効になりました。ログインできます。
184 184 notice_successful_create: 作成しました。
185 185 notice_successful_update: 更新しました。
186 186 notice_successful_delete: 削除しました。
187 187 notice_successful_connection: 接続しました。
188 188 notice_file_not_found: アクセスしようとしたページは存在しないか削除されています。
189 189 notice_locking_conflict: 別のユーザーがデータを更新しています。
190 190 notice_not_authorized: このページにアクセスするには認証が必要です。
191 191 notice_not_authorized_archived_project: プロジェクトはアーカイブされています。
192 192 notice_email_sent: "%{value} 宛にメールを送信しました。"
193 193 notice_email_error: "メール送信中にエラーが発生しました (%{value})"
194 194 notice_feeds_access_key_reseted: RSSアクセスキーを初期化しました。
195 195 notice_api_access_key_reseted: APIアクセスキーを初期化しました。
196 196 notice_failed_to_save_issues: "全%{total}件中%{count}件のチケットが保存できませんでした: %{ids}."
197 197 notice_failed_to_save_members: "メンバーの保存に失敗しました: %{errors}."
198 198 notice_no_issue_selected: "チケットが選択されていません! 更新対象のチケットを選択してください。"
199 199 notice_account_pending: アカウントは作成済みで、システム管理者の承認待ちです。
200 200 notice_default_data_loaded: デフォルト設定をロードしました。
201 201 notice_unable_delete_version: バージョンを削除できません
202 202 notice_unable_delete_time_entry: 作業時間を削除できません
203 203 notice_issue_done_ratios_updated: チケットの進捗が更新されました。
204 204 notice_gantt_chart_truncated: ガントチャートは、最大表示項目数(%{max})を超えたたため切り捨てられました。
205 205
206 206 error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}"
207 207 error_scm_not_found: リポジトリに、エントリ/リビジョンが存在しません。
208 208 error_scm_command_failed: "リポジトリへアクセスしようとしてエラーになりました: %{value}"
209 209 error_scm_annotate: "エントリが存在しない、もしくはアノテートできません。"
210 210 error_issue_not_found_in_project: 'チケットが見つかりません、もしくはこのプロジェクトに属していません'
211 211 error_unable_delete_issue_status: "チケットのステータスを削除できませんでした。"
212 212 error_no_tracker_in_project: 'このプロジェクトにはトラッカーが登録されていません。プロジェクト設定を確認してください。'
213 213 error_no_default_issue_status: 'デフォルトのチケットステータスが定義されていません。設定を確認してください(管理→チケットのステータス)。'
214 214 error_can_not_delete_custom_field: 'カスタムフィールドを削除できません。'
215 215 error_unable_to_connect: "接続できません。 (%{value})"
216 216 error_can_not_remove_role: 'このロールは使用されています。削除できません。'
217 217 error_can_not_reopen_issue_on_closed_version: '終了したバージョンにひも付けされたチケットの再オープンはできません。'
218 218 error_can_not_archive_project: このプロジェクトはアーカイブできません
219 219 error_issue_done_ratios_not_updated: "チケットの進捗が更新できません。"
220 220 error_workflow_copy_source: 'コピー元となるトラッカーまたはロールを選択してください'
221 221 error_workflow_copy_target: 'コピー先となるトラッカーとロールを選択してください'
222 222 error_can_not_delete_tracker: 'このトラッカーは使用されています。削除できません。'
223 223
224 224 warning_attachments_not_saved: "%{count}個の添付ファイルが保存できませんでした。"
225 225
226 226 mail_subject_lost_password: "%{value} パスワード再発行"
227 227 mail_body_lost_password: 'パスワードを変更するには、以下のリンクをクリックしてください:'
228 228 mail_subject_register: "%{value} アカウント登録の確認"
229 229 mail_body_register: 'アカウント登録を完了するには、以下のアドレスをクリックしてください:'
230 230 mail_body_account_information_external: "%{value} アカウントを使ってにログインできます。"
231 231 mail_body_account_information: アカウント情報
232 232 mail_subject_account_activation_request: "%{value} アカウントの承認要求"
233 233 mail_body_account_activation_request: "新しいユーザー %{value} が登録されました。このアカウントはあなたの承認待ちです:"
234 234 mail_subject_reminder: "%{count}件のチケットの期日が%{days}日以内に到来します"
235 235 mail_body_reminder: "%{count}件の担当チケットの期日が%{days}日以内に到来します:"
236 236 mail_subject_wiki_content_added: "Wikiページ %{id} が追加されました"
237 237 mail_body_wiki_content_added: "%{author} によってWikiページ %{id} が追加されました。"
238 238 mail_subject_wiki_content_updated: "Wikiページ %{id} が更新されました"
239 239 mail_body_wiki_content_updated: "%{author} によってWikiページ %{id} が更新されました。"
240 240
241 241
242 242 field_name: 名称
243 243 field_description: 説明
244 244 field_summary: サマリー
245 245 field_is_required: 必須
246 246 field_firstname: 名前
247 247 field_lastname: 苗字
248 248 field_mail: メールアドレス
249 249 field_filename: ファイル
250 250 field_filesize: サイズ
251 251 field_downloads: ダウンロード
252 252 field_author: 作成者
253 253 field_created_on: 作成日
254 254 field_updated_on: 更新日
255 255 field_field_format: 書式
256 256 field_is_for_all: 全プロジェクト向け
257 257 field_possible_values: 選択肢
258 258 field_regexp: 正規表現
259 259 field_min_length: 最小値
260 260 field_max_length: 最大値
261 261 field_value:
262 262 field_category: カテゴリ
263 263 field_title: タイトル
264 264 field_project: プロジェクト
265 265 field_issue: チケット
266 266 field_status: ステータス
267 267 field_notes: 注記
268 268 field_is_closed: 終了したチケット
269 269 field_is_default: デフォルト値
270 270 field_tracker: トラッカー
271 271 field_subject: 題名
272 272 field_due_date: 期日
273 273 field_assigned_to: 担当者
274 274 field_priority: 優先度
275 275 field_fixed_version: 対象バージョン
276 276 field_user: ユーザー
277 277 field_principal: 主体
278 278 field_role: ロール
279 279 field_homepage: ホームページ
280 280 field_is_public: 公開
281 281 field_parent: 親プロジェクト名
282 282 field_is_in_roadmap: チケットをロードマップに表示する
283 283 field_login: ログイン
284 284 field_mail_notification: メール通知
285 285 field_admin: システム管理者
286 286 field_last_login_on: 最終接続日
287 287 field_language: 言語
288 288 field_effective_date: 期日
289 289 field_password: パスワード
290 290 field_new_password: 新しいパスワード
291 291 field_password_confirmation: パスワードの確認
292 292 field_version: バージョン
293 293 field_type: タイプ
294 294 field_host: ホスト
295 295 field_port: ポート
296 296 field_account: アカウント
297 297 field_base_dn: 検索範囲
298 298 field_attr_login: ログイン名属性
299 299 field_attr_firstname: 名前属性
300 300 field_attr_lastname: 苗字属性
301 301 field_attr_mail: メール属性
302 302 field_onthefly: あわせてユーザーを作成
303 303 field_start_date: 開始日
304 304 field_done_ratio: 進捗 %
305 305 field_auth_source: 認証方式
306 306 field_hide_mail: メールアドレスを隠す
307 307 field_comments: コメント
308 308 field_url: URL
309 309 field_start_page: メインページ
310 310 field_subproject: サブプロジェクト
311 311 field_hours: 時間
312 312 field_activity: 活動
313 313 field_spent_on: 日付
314 314 field_identifier: 識別子
315 315 field_is_filter: フィルタとして使う
316 316 field_issue_to: 関連するチケット
317 317 field_delay: 遅延
318 318 field_assignable: このロールにチケットを割り当て可能
319 319 field_redirect_existing_links: 既存のリンクをリダイレクトする
320 320 field_estimated_hours: 予定工数
321 321 field_column_names: 項目
322 322 field_time_entries: 時間を記録
323 323 field_time_zone: タイムゾーン
324 324 field_searchable: 検索条件に設定可能とする
325 325 field_default_value: デフォルト値
326 326 field_comments_sorting: コメントの表示順
327 327 field_parent_title: 親ページ
328 328 field_editable: 編集可能
329 329 field_watcher: ウォッチャー
330 330 field_identity_url: OpenID URL
331 331 field_content: 内容
332 332 field_group_by: グループ条件
333 333 field_sharing: 共有
334 334 field_parent_issue: 親チケット
335 335 field_member_of_group: 担当者のグループ
336 336 field_assigned_to_role: 担当者のロール
337 337 field_text: テキスト
338 338 field_visible: 表示
339 339 field_warn_on_leaving_unsaved: データを保存せずにページから移動するときに警告
340 340 field_commit_logs_encoding: コミットメッセージのエンコーディング
341 341 field_scm_path_encoding: パスのエンコーディング
342 342 field_path_to_repository: リポジトリのパス
343 343 field_root_directory: ルートディレクトリ
344 344 field_cvsroot: CVSROOT
345 345 field_cvs_module: モジュール
346 346
347 347 setting_app_title: アプリケーションのタイトル
348 348 setting_app_subtitle: アプリケーションのサブタイトル
349 349 setting_welcome_text: ウェルカムメッセージ
350 350 setting_default_language: 既定の言語
351 351 setting_login_required: 認証が必要
352 352 setting_self_registration: ユーザーによるアカウント登録
353 353 setting_attachment_max_size: 添付ファイルサイズの上限
354 354 setting_issues_export_limit: エクスポートするチケット数の上限
355 355 setting_mail_from: 送信元メールアドレス
356 356 setting_bcc_recipients: ブラインドカーボンコピーで受信(bcc)
357 357 setting_plain_text_mail: プレインテキストのみ(HTMLなし)
358 358 setting_host_name: ホスト名
359 359 setting_text_formatting: テキストの書式
360 360 setting_cache_formatted_text: 書式化されたテキストをキャッシュする
361 361 setting_wiki_compression: Wiki履歴を圧縮する
362 362 setting_feeds_limit: フィード内容の上限
363 363 setting_default_projects_public: デフォルトで新しいプロジェクトは公開にする
364 364 setting_autofetch_changesets: コミットを自動取得する
365 365 setting_sys_api_enabled: リポジトリ管理用のWebサービスを有効にする
366 366 setting_commit_ref_keywords: 参照用キーワード
367 367 setting_commit_fix_keywords: 修正用キーワード
368 368 setting_autologin: 自動ログイン
369 369 setting_date_format: 日付の形式
370 370 setting_time_format: 時刻の形式
371 371 setting_cross_project_issue_relations: 異なるプロジェクトのチケット間で関連の設定を許可
372 372 setting_issue_list_default_columns: チケットの一覧で表示する項目
373 373 setting_repositories_encodings: 添付ファイルとリポジトリのエンコーディング
374 374 setting_emails_header: メールのヘッダ
375 375 setting_emails_footer: メールのフッタ
376 376 setting_protocol: プロトコル
377 377 setting_per_page_options: ページ毎の表示件数
378 378 setting_user_format: ユーザー名の表示書式
379 379 setting_activity_days_default: プロジェクトの活動ページに表示される日数
380 380 setting_display_subprojects_issues: サブプロジェクトのチケットをメインプロジェクトに表示する
381 381 setting_enabled_scm: 使用するバージョン管理システム
382 382 setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り取る"
383 383 setting_mail_handler_api_enabled: 受信メール用のWebサービスを有効にする
384 384 setting_mail_handler_api_key: APIキー
385 385 setting_sequential_project_identifiers: プロジェクト識別子を連番で生成する
386 386 setting_gravatar_enabled: Gravatarのアイコンを使用する
387 387 setting_gravatar_default: デフォルトのGravatarアイコン
388 388 setting_diff_max_lines_displayed: 差分の表示行数の上限
389 389 setting_file_max_size_displayed: 画面表示するテキストファイルサイズの上限
390 390 setting_repository_log_display_limit: ファイルのリビジョン表示数の上限
391 391 setting_openid: OpenIDによるログインと登録
392 392 setting_password_min_length: パスワードの最低必要文字数
393 393 setting_new_project_user_role_id: システム管理者以外のユーザーが作成したプロジェクトに設定するロール
394 394 setting_default_projects_modules: 新規プロジェクトにおいてデフォルトで有効になるモジュール
395 395 setting_issue_done_ratio: 進捗の算出方法
396 396 setting_issue_done_ratio_issue_field: 各チケットにフィールドを用意する
397 397 setting_issue_done_ratio_issue_status: チケットのステータスを使用する
398 398 setting_start_of_week: 週の開始曜日
399 399 setting_rest_api_enabled: RESTによるWebサービスを有効にする
400 400 setting_default_notification_option: デフォルトのメール通知オプション
401 401 setting_commit_logtime_enabled: コミット時に作業時間を記録する
402 402 setting_commit_logtime_activity_id: 作業時間の作業分類
403 403 setting_gantt_items_limit: ガントチャート最大表示項目数
404 404
405 405 permission_add_project: プロジェクトの追加
406 406 permission_add_subprojects: サブプロジェクトの追加
407 407 permission_edit_project: プロジェクトの編集
408 408 permission_select_project_modules: モジュールの選択
409 409 permission_manage_members: メンバーの管理
410 410 permission_manage_versions: バージョンの管理
411 411 permission_manage_categories: チケットのカテゴリの管理
412 412 permission_view_issues: チケットの閲覧
413 413 permission_add_issues: チケットの追加
414 414 permission_edit_issues: チケットの編集
415 415 permission_manage_issue_relations: 関連するチケットの管理
416 416 permission_add_issue_notes: 注記の追加
417 417 permission_edit_issue_notes: 注記の編集
418 418 permission_edit_own_issue_notes: 自身が記入した注記の編集
419 419 permission_move_issues: チケットの移動
420 420 permission_delete_issues: チケットの削除
421 421 permission_manage_public_queries: 公開クエリの管理
422 422 permission_save_queries: クエリの保存
423 423 permission_view_gantt: ガントチャートの閲覧
424 424 permission_view_calendar: カレンダーの閲覧
425 425 permission_view_issue_watchers: ウォッチャー一覧の閲覧
426 426 permission_add_issue_watchers: ウォッチャーの追加
427 427 permission_delete_issue_watchers: ウォッチャーの削除
428 428 permission_log_time: 作業時間の記入
429 429 permission_view_time_entries: 作業時間の閲覧
430 430 permission_edit_time_entries: 作業時間の編集
431 431 permission_edit_own_time_entries: 自身が記入した作業時間の編集
432 432 permission_manage_project_activities: 作業分類 (時間トラッキング) の管理
433 433 permission_manage_news: ニュースの管理
434 434 permission_comment_news: ニュースへのコメント
435 435 permission_view_documents: 文書の閲覧
436 436 permission_manage_files: ファイルの管理
437 437 permission_view_files: ファイルの閲覧
438 438 permission_manage_wiki: Wikiの管理
439 439 permission_rename_wiki_pages: Wikiページ名の変更
440 440 permission_delete_wiki_pages: Wikiページの削除
441 441 permission_view_wiki_pages: Wikiの閲覧
442 442 permission_export_wiki_pages: Wikiページを他の形式にエクスポート
443 443 permission_view_wiki_edits: Wiki履歴の閲覧
444 444 permission_edit_wiki_pages: Wikiページの編集
445 445 permission_delete_wiki_pages_attachments: 添付ファイルの削除
446 446 permission_protect_wiki_pages: Wikiページの凍結
447 447 permission_manage_repository: リポジトリの管理
448 448 permission_browse_repository: リポジトリの閲覧
449 449 permission_view_changesets: 更新履歴の閲覧
450 450 permission_commit_access: コミット権限
451 451 permission_manage_boards: フォーラムの管理
452 452 permission_view_messages: メッセージの閲覧
453 453 permission_add_messages: メッセージの追加
454 454 permission_edit_messages: メッセージの編集
455 455 permission_edit_own_messages: 自身が記入したメッセージの編集
456 456 permission_delete_messages: メッセージの削除
457 457 permission_delete_own_messages: 自身が記入したメッセージの削除
458 458 permission_manage_subtasks: 子チケットの管理
459 459
460 460 project_module_issue_tracking: チケットトラッキング
461 461 project_module_time_tracking: 時間トラッキング
462 462 project_module_news: ニュース
463 463 project_module_documents: 文書
464 464 project_module_files: ファイル
465 465 project_module_wiki: Wiki
466 466 project_module_repository: リポジトリ
467 467 project_module_boards: フォーラム
468 468 project_module_gantt: ガントチャート
469 469 project_module_calendar: カレンダー
470 470
471 471 label_user: ユーザー
472 472 label_user_plural: ユーザー
473 473 label_user_new: 新しいユーザー
474 474 label_user_anonymous: 匿名ユーザー
475 475 label_profile: プロフィール
476 476 label_project: プロジェクト
477 477 label_project_new: 新しいプロジェクト
478 478 label_project_plural: プロジェクト
479 479 label_x_projects:
480 480 zero: プロジェクトはありません
481 481 one: 1プロジェクト
482 482 other: "%{count}プロジェクト"
483 483 label_project_all: 全プロジェクト
484 484 label_project_latest: 最近のプロジェクト
485 485 label_issue: チケット
486 486 label_issue_new: 新しいチケット
487 487 label_issue_plural: チケット
488 488 label_issue_view_all: すべてのチケットを見る
489 489 label_issues_by: "%{value} 別のチケット"
490 490 label_issue_added: チケットが追加されました
491 491 label_issue_updated: チケットが更新されました
492 492 label_document: 文書
493 493 label_document_new: 新しい文書
494 494 label_document_plural: 文書
495 495 label_document_added: 文書が追加されました
496 496 label_role: ロール
497 497 label_role_plural: ロール
498 498 label_role_new: 新しいロール
499 499 label_role_and_permissions: ロールと権限
500 500 label_member: メンバー
501 501 label_member_new: 新しいメンバー
502 502 label_member_plural: メンバー
503 503 label_tracker: トラッカー
504 504 label_tracker_plural: トラッカー
505 505 label_tracker_new: 新しいトラッカーを作成
506 506 label_workflow: ワークフロー
507 507 label_issue_status: チケットのステータス
508 508 label_issue_status_plural: チケットのステータス
509 509 label_issue_status_new: 新しいステータス
510 510 label_issue_category: チケットのカテゴリ
511 511 label_issue_category_plural: チケットのカテゴリ
512 512 label_issue_category_new: 新しいカテゴリ
513 513 label_custom_field: カスタムフィールド
514 514 label_custom_field_plural: カスタムフィールド
515 515 label_custom_field_new: 新しいカスタムフィールドを作成
516 516 label_enumerations: 列挙項目
517 517 label_enumeration_new: 新しい値
518 518 label_information: 情報
519 519 label_information_plural: 情報
520 520 label_please_login: ログインしてください
521 521 label_register: 登録する
522 522 label_login_with_open_id_option: またはOpenIDでログインする
523 523 label_password_lost: パスワードの再発行
524 524 label_home: ホーム
525 525 label_my_page: マイページ
526 526 label_my_account: 個人設定
527 527 label_my_projects: マイプロジェクト
528 528 label_my_page_block: マイページパーツ
529 529 label_administration: 管理
530 530 label_login: ログイン
531 531 label_logout: ログアウト
532 532 label_help: ヘルプ
533 533 label_reported_issues: 報告したチケット
534 534 label_assigned_to_me_issues: 担当しているチケット
535 535 label_last_login: 最近の接続
536 536 label_registered_on: 登録日
537 537 label_activity: 活動
538 538 label_overall_activity: すべての活動
539 539 label_user_activity: "%{value} の活動"
540 540 label_new: 新しく作成
541 541 label_logged_as: ログイン中:
542 542 label_environment: 環境
543 543 label_authentication: 認証
544 544 label_auth_source: 認証方式
545 545 label_auth_source_new: 新しい認証方式
546 546 label_auth_source_plural: 認証方式
547 547 label_subproject_plural: サブプロジェクト
548 548 label_subproject_new: 新しいサブプロジェクト
549 549 label_and_its_subprojects: "%{value} とサブプロジェクト"
550 550 label_min_max_length: 最小値 - 最大値の長さ
551 551 label_list: リストから選択
552 552 label_date: 日付
553 553 label_integer: 整数
554 554 label_float: 小数
555 555 label_boolean: 真偽値
556 556 label_string: テキスト
557 557 label_text: 長いテキスト
558 558 label_attribute: 属性
559 559 label_attribute_plural: 属性
560 560 label_no_data: 表示するデータがありません
561 561 label_change_status: ステータスの変更
562 562 label_history: 履歴
563 563 label_attachment: ファイル
564 564 label_attachment_new: 新しいファイル
565 565 label_attachment_delete: ファイルを削除
566 566 label_attachment_plural: ファイル
567 567 label_file_added: ファイルが追加されました
568 568 label_report: レポート
569 569 label_report_plural: レポート
570 570 label_news: ニュース
571 571 label_news_new: ニュースを追加
572 572 label_news_plural: ニュース
573 573 label_news_latest: 最新ニュース
574 574 label_news_view_all: すべてのニュースを見る
575 575 label_news_added: ニュースが追加されました
576 576 label_news_comment_added: ニュースにコメントが追加されました
577 577 label_settings: 設定
578 578 label_overview: 概要
579 579 label_version: バージョン
580 580 label_version_new: 新しいバージョン
581 581 label_version_plural: バージョン
582 582 label_confirmation: 確認
583 583 label_close_versions: 完了したバージョンを終了にする
584 584 label_export_to: '他の形式にエクスポート:'
585 585 label_read: 読む...
586 586 label_public_projects: 公開プロジェクト
587 587 label_open_issues: 未完了
588 588 label_open_issues_plural: 未完了
589 589 label_closed_issues: 完了
590 590 label_closed_issues_plural: 完了
591 591 label_x_open_issues_abbr_on_total:
592 592 zero: 0件未完了 / 全%{total}件
593 593 one: 1件未完了 / 全%{total}件
594 594 other: "%{count}件未完了 / 全%{total}件"
595 595 label_x_open_issues_abbr:
596 596 zero: 0件未完了
597 597 one: 1件未完了
598 598 other: "%{count}件未完了"
599 599 label_x_closed_issues_abbr:
600 600 zero: 0件完了
601 601 one: 1件完了
602 602 other: "%{count}件完了"
603 603 label_total: 合計
604 604 label_permissions: 権限
605 605 label_current_status: 現在のステータス
606 606 label_new_statuses_allowed: ステータスの移行先
607 607 label_all: すべて
608 608 label_none: なし
609 609 label_nobody: 無記名
610 610 label_next:
611 611 label_previous:
612 612 label_used_by: 使用中
613 613 label_details: 詳細
614 614 label_add_note: 注記を追加
615 615 label_per_page: ページ毎
616 616 label_calendar: カレンダー
617 617 label_months_from: ヶ月分
618 618 label_gantt: ガントチャート
619 619 label_internal: 内部
620 620 label_last_changes: "最新の変更 %{count}件"
621 621 label_change_view_all: すべての変更を見る
622 622 label_personalize_page: このページをパーソナライズする
623 623 label_comment: コメント
624 624 label_comment_plural: コメント
625 625 label_x_comments:
626 626 zero: コメントがありません
627 627 one: 1コメント
628 628 other: "%{count}コメント"
629 629 label_comment_add: コメント追加
630 630 label_comment_added: 追加されたコメント
631 631 label_comment_delete: コメント削除
632 632 label_query: カスタムクエリ
633 633 label_query_plural: カスタムクエリ
634 634 label_query_new: 新しいクエリ
635 635 label_my_queries: マイカスタムクエリ
636 636 label_filter_add: フィルタ追加
637 637 label_filter_plural: フィルタ
638 638 label_equals: 等しい
639 639 label_not_equals: 等しくない
640 640 label_in_less_than: 今日から○日後以前
641 641 label_in_more_than: 今日から○日後以降
642 642 label_greater_or_equal: 以上
643 643 label_less_or_equal: 以下
644 644 label_in: 今日から○日後
645 645 label_today: 今日
646 646 label_all_time: 全期間
647 647 label_yesterday: 昨日
648 648 label_this_week: 今週
649 649 label_last_week: 先週
650 650 label_last_n_days: "直近%{count}日間"
651 651 label_this_month: 今月
652 652 label_last_month: 先月
653 653 label_this_year: 今年
654 654 label_date_range: 期間
655 655 label_less_than_ago: 今日より○日前以降
656 656 label_more_than_ago: 今日より○日前以前
657 657 label_ago: ○日前
658 658 label_contains: 含む
659 659 label_not_contains: 含まない
660 660 label_day_plural:
661 661 label_repository: リポジトリ
662 662 label_repository_plural: リポジトリ
663 663 label_browse: ブラウズ
664 664 label_branch: ブランチ
665 665 label_tag: タグ
666 666 label_revision: リビジョン
667 667 label_revision_plural: リビジョン
668 668 label_revision_id: リビジョン %{value}
669 669 label_associated_revisions: 関係しているリビジョン
670 670 label_added: 追加
671 671 label_modified: 変更
672 672 label_copied: コピー
673 673 label_renamed: 名称変更
674 674 label_deleted: 削除
675 675 label_latest_revision: 最新リビジョン
676 676 label_latest_revision_plural: 最新リビジョン
677 677 label_view_revisions: リビジョンを見る
678 678 label_view_all_revisions: すべてのリビジョンを見る
679 679 label_max_size: サイズの上限
680 680 label_sort_highest: 一番上へ
681 681 label_sort_higher: 上へ
682 682 label_sort_lower: 下へ
683 683 label_sort_lowest: 一番下へ
684 684 label_roadmap: ロードマップ
685 685 label_roadmap_due_in: "期日まで %{value}"
686 686 label_roadmap_overdue: "%{value} 遅れ"
687 687 label_roadmap_no_issues: このバージョンに関するチケットはありません
688 688 label_search: 検索
689 689 label_result_plural: 結果
690 690 label_all_words: すべての単語
691 691 label_wiki: Wiki
692 692 label_wiki_edit: Wiki編集
693 693 label_wiki_edit_plural: Wiki編集
694 694 label_wiki_page: Wikiページ
695 695 label_wiki_page_plural: Wikiページ
696 696 label_index_by_title: 索引(名前順)
697 697 label_index_by_date: 索引(日付順)
698 698 label_current_version: 最新版
699 699 label_preview: プレビュー
700 700 label_feed_plural: フィード
701 701 label_changes_details: 全変更の詳細
702 702 label_issue_tracking: チケットトラッキング
703 703 label_spent_time: 作業時間の記録
704 704 label_overall_spent_time: すべての作業時間の記録
705 705 label_f_hour: "%{value}時間"
706 706 label_f_hour_plural: "%{value}時間"
707 707 label_time_tracking: 時間トラッキング
708 708 label_change_plural: 変更
709 709 label_statistics: 統計
710 710 label_commits_per_month: 月別のコミット
711 711 label_commits_per_author: 起票者別のコミット
712 712 label_diff: 差分
713 713 label_view_diff: 差分を見る
714 714 label_diff_inline: インライン
715 715 label_diff_side_by_side: 横に並べる
716 716 label_options: オプション
717 717 label_copy_workflow_from: ワークフローをここからコピー
718 718 label_permissions_report: 権限レポート
719 719 label_watched_issues: ウォッチしているチケット
720 720 label_related_issues: 関連するチケット
721 721 label_applied_status: 適用されるステータス
722 722 label_loading: ロード中...
723 723 label_relation_new: 新しい関連
724 724 label_relation_delete: 関連の削除
725 725 label_relates_to: 関連している
726 726 label_duplicates: 次のチケットと重複
727 727 label_duplicated_by: 次のチケットが重複
728 728 label_blocks: ブロックしている
729 729 label_blocked_by: ブロックされている
730 730 label_precedes: 次のチケットに先行
731 731 label_follows: 次のチケットに後続
732 732 label_end_to_start: 最後-最初
733 733 label_end_to_end: 最後-最後
734 734 label_start_to_start: 最初-最初
735 735 label_start_to_end: 最初-最後
736 736 label_stay_logged_in: ログインを維持
737 737 label_disabled: 無効
738 738 label_show_completed_versions: 完了したバージョンを表示
739 739 label_me: 自分
740 740 label_board: フォーラム
741 741 label_board_new: 新しいフォーラム
742 742 label_board_plural: フォーラム
743 743 label_board_sticky: スティッキー
744 744 label_board_locked: ロック
745 745 label_topic_plural: トピック
746 746 label_message_plural: メッセージ
747 747 label_message_last: 最新のメッセージ
748 748 label_message_new: 新しいメッセージ
749 749 label_message_posted: メッセージが追加されました
750 750 label_reply_plural: 返答
751 751 label_send_information: アカウント情報をユーザーに送信
752 752 label_year:
753 753 label_month:
754 754 label_week:
755 755 label_date_from: "日付指定: "
756 756 label_date_to: から
757 757 label_language_based: ユーザーの言語の設定に従う
758 758 label_sort_by: "並び替え %{value}"
759 759 label_send_test_email: テストメールを送信
760 760 label_feeds_access_key: RSSアクセスキー
761 761 label_missing_feeds_access_key: RSSアクセスキーが見つかりません
762 762 label_feeds_access_key_created_on: "RSSアクセスキーは%{value}前に作成されました"
763 763 label_module_plural: モジュール
764 764 label_added_time_by: "%{author} が%{age}前に追加"
765 765 label_updated_time_by: "%{author} が%{age}前に更新"
766 766 label_updated_time: "%{value}前に更新"
767 767 label_jump_to_a_project: プロジェクトへ移動...
768 768 label_file_plural: ファイル
769 769 label_changeset_plural: 更新履歴
770 770 label_default_columns: 既定の項目
771 771 label_no_change_option: (変更無し)
772 772 label_bulk_edit_selected_issues: チケットの一括編集
773 773 label_theme: テーマ
774 774 label_default: 既定
775 775 label_search_titles_only: タイトルのみ
776 776 label_user_mail_option_all: "参加しているプロジェクトのすべての通知"
777 777 label_user_mail_option_selected: "選択したプロジェクトのすべての通知..."
778 778 label_user_mail_option_none: "通知しない"
779 779 label_user_mail_option_only_my_events: "ウォッチまたは関係している事柄のみ"
780 780 label_user_mail_option_only_assigned: "自分が担当している事柄のみ"
781 781 label_user_mail_option_only_owner: "自分が作成した事柄のみ"
782 782 label_user_mail_no_self_notified: 自分自身による変更の通知は不要
783 783 label_registration_activation_by_email: メールでアカウントを有効化
784 784 label_registration_manual_activation: 手動でアカウントを有効化
785 785 label_registration_automatic_activation: 自動でアカウントを有効化
786 786 label_display_per_page: "1ページに: %{value}"
787 787 label_age: 年齢
788 788 label_change_properties: プロパティの変更
789 789 label_general: 全般
790 790 label_more: 続き
791 791 label_scm: バージョン管理システム
792 792 label_plugins: プラグイン
793 793 label_ldap_authentication: LDAP認証
794 794 label_downloads_abbr: DL
795 795 label_optional_description: 任意のコメント
796 796 label_add_another_file: 別のファイルを追加
797 797 label_preferences: 設定
798 798 label_chronological_order: 古い順
799 799 label_reverse_chronological_order: 新しい順
800 800 label_planning: 計画
801 801 label_incoming_emails: 受信メール
802 802 label_generate_key: キーの生成
803 803 label_issue_watchers: チケットのウォッチャー
804 804 label_example:
805 805 label_display: 表示
806 806 label_sort: ソート条件
807 807 label_ascending: 昇順
808 808 label_descending: 降順
809 809 label_date_from_to: "%{start}から%{end}まで"
810 810 label_wiki_content_added: Wikiページが追加されました
811 811 label_wiki_content_updated: Wikiページが更新されました
812 812 label_group: グループ
813 813 label_group_plural: グループ
814 814 label_group_new: 新しいグループ
815 815 label_time_entry_plural: 作業時間の記録
816 816 label_version_sharing_none: 共有しない
817 817 label_version_sharing_descendants: サブプロジェクト単位
818 818 label_version_sharing_hierarchy: プロジェクト階層単位
819 819 label_version_sharing_tree: プロジェクトツリー単位
820 820 label_version_sharing_system: すべてのプロジェクト
821 821 label_update_issue_done_ratios: 進捗の更新
822 822 label_copy_source: コピー元
823 823 label_copy_target: コピー先
824 824 label_copy_same_as_target: 同じコピー先
825 825 label_display_used_statuses_only: このトラッカーで使われているステータスのみ表示する
826 826 label_api_access_key: APIアクセスキー
827 827 label_missing_api_access_key: APIアクセスキーが見つかりません
828 828 label_api_access_key_created_on: "APIアクセスキーは%{value}前に作成されました"
829 829 label_subtask_plural: 子チケット
830 830 label_project_copy_notifications: コピーしたチケットのメール通知を送信する
831 831 label_principal_search: "ユーザーまたはグループの検索:"
832 832 label_user_search: "ユーザーの検索:"
833 833 label_git_report_last_commit: ファイルとディレクトリの最新コミットを表示する
834 834 label_parent_revision:
835 835 label_child_revision:
836 label_gantt_progress_line: イナズマ線
836 837
837 838 button_login: ログイン
838 839 button_submit: 送信
839 840 button_save: 保存
840 841 button_check_all: すべてにチェックをつける
841 842 button_uncheck_all: すべてのチェックを外す
842 843 button_expand_all: 展開
843 844 button_collapse_all: 折りたたみ
844 845 button_delete: 削除
845 846 button_create: 作成
846 847 button_create_and_continue: 連続作成
847 848 button_test: テスト
848 849 button_edit: 編集
849 850 button_edit_associated_wikipage: "関連するWikiページを編集: %{page_title}"
850 851 button_add: 追加
851 852 button_change: 変更
852 853 button_apply: 適用
853 854 button_clear: クリア
854 855 button_lock: ロック
855 856 button_unlock: アンロック
856 857 button_download: ダウンロード
857 858 button_list: 一覧
858 859 button_view: 表示
859 860 button_move: 移動
860 861 button_move_and_follow: 移動後表示
861 862 button_back: 戻る
862 863 button_cancel: キャンセル
863 864 button_activate: 有効にする
864 865 button_sort: ソート
865 866 button_log_time: 時間を記録
866 867 button_rollback: このバージョンにロールバック
867 868 button_watch: ウォッチ
868 869 button_unwatch: ウォッチをやめる
869 870 button_reply: 返答
870 871 button_archive: アーカイブ
871 872 button_unarchive: アーカイブ解除
872 873 button_reset: リセット
873 874 button_rename: 名前変更
874 875 button_change_password: パスワード変更
875 876 button_copy: コピー
876 877 button_copy_and_follow: コピー後表示
877 878 button_annotate: アノテート
878 879 button_update: 更新
879 880 button_configure: 設定
880 881 button_quote: 引用
881 882 button_duplicate: 複製
882 883 button_show: 表示
883 884
884 885 status_active: 有効
885 886 status_registered: 登録
886 887 status_locked: ロック
887 888
888 889 version_status_open: 進行中
889 890 version_status_locked: ロック中
890 891 version_status_closed: 終了
891 892
892 893 field_active: 有効
893 894
894 895 text_select_mail_notifications: どのメール通知を送信するか、アクションを選択してください。
895 896 text_regexp_info: 例) ^[A-Z0-9]+$
896 897 text_min_max_length_info: 0だと無制限になります
897 898 text_project_destroy_confirmation: 本当にこのプロジェクトと関連データを削除しますか?
898 899 text_subprojects_destroy_warning: "サブプロジェクト %{value} も削除されます。"
899 900 text_workflow_edit: ワークフローを編集するロールとトラッカーを選んでください
900 901 text_are_you_sure: よろしいですか?
901 902 text_journal_changed: "%{label} %{old} から %{new} に変更"
902 903 text_journal_changed_no_detail: "%{label} を更新"
903 904 text_journal_set_to: "%{label} %{value} にセット"
904 905 text_journal_deleted: "%{label} を削除 (%{old})"
905 906 text_journal_added: "%{label} %{value} を追加"
906 907 text_tip_issue_begin_day: この日に開始するタスク
907 908 text_tip_issue_end_day: この日に終了するタスク
908 909 text_tip_issue_begin_end_day: この日のうちに開始して終了するタスク
909 910 text_caracters_maximum: "最大%{count}文字です。"
910 911 text_caracters_minimum: "最低%{count}文字の長さが必要です"
911 912 text_length_between: "長さは%{min}から%{max}文字までです。"
912 913 text_tracker_no_workflow: このトラッカーにワークフローが定義されていません
913 914 text_unallowed_characters: 次の文字は使用できません
914 915 text_comma_separated: (カンマで区切ることで)複数の値を設定できます。
915 916 text_line_separated: (1行ごとに書くことで)複数の値を設定できます。
916 917 text_issues_ref_in_commit_messages: コミットメッセージ内でチケットの参照/修正
917 918 text_issue_added: "チケット %{id} %{author} によって報告されました。"
918 919 text_issue_updated: "チケット %{id} %{author} によって更新されました。"
919 920 text_wiki_destroy_confirmation: 本当にこのwikiとその内容のすべてを削除しますか?
920 921 text_issue_category_destroy_question: "%{count}件のチケットがこのカテゴリに割り当てられています。"
921 922 text_issue_category_destroy_assignments: カテゴリの割り当てを削除する
922 923 text_issue_category_reassign_to: チケットをこのカテゴリに再割り当てする
923 924 text_user_mail_option: "未選択のプロジェクトでは、ウォッチまたは関係している事柄(例: 自分が報告者もしくは担当者であるチケット)のみメールが送信されます。"
924 925 text_no_configuration_data: "ロール、トラッカー、チケットのステータス、ワークフローがまだ設定されていません。\nデフォルト設定のロードを強くお勧めします。ロードした後、それを修正することができます。"
925 926 text_load_default_configuration: デフォルト設定をロード
926 927 text_status_changed_by_changeset: "更新履歴 %{value} で適用されました。"
927 928 text_time_logged_by_changeset: "更新履歴 %{value} で適用されました。"
928 929 text_issues_destroy_confirmation: '本当に選択したチケットを削除しますか?'
929 930 text_select_project_modules: 'このプロジェクトで使用するモジュールを選択してください:'
930 931 text_default_administrator_account_changed: デフォルト管理アカウントが変更済
931 932 text_file_repository_writable: ファイルリポジトリに書き込み可能
932 933 text_plugin_assets_writable: Plugin assetsディレクトリに書き込み可能
933 934 text_rmagick_available: RMagickが使用可能 (オプション)
934 935 text_destroy_time_entries_question: このチケットの%{hours}時間分の作業記録の扱いを選択してください。
935 936 text_destroy_time_entries: 記録された作業時間を含めて削除
936 937 text_assign_time_entries_to_project: 記録された作業時間をプロジェクト自体に割り当て
937 938 text_reassign_time_entries: '記録された作業時間をこのチケットに再割り当て:'
938 939 text_user_wrote: "%{value} は書きました:"
939 940 text_enumeration_destroy_question: "%{count}個のオブジェクトがこの値に割り当てられています。"
940 941 text_enumeration_category_reassign_to: '次の値に割り当て直す:'
941 942 text_email_delivery_not_configured: "メールを送信するために必要な設定が行われていないため、メール通知は利用できません。\nconfig/configuration.ymlでSMTPサーバの設定を行い、アプリケーションを再起動してください。"
942 943 text_repository_usernames_mapping: "リポジトリのログから検出されたユーザー名をどのRedmineユーザーに関連づけるのか選択してください。\nログ上のユーザー名またはメールアドレスがRedmineのユーザーと一致する場合は自動的に関連づけられます。"
943 944 text_diff_truncated: '... 差分の行数が表示可能な上限を超えました。超過分は表示しません。'
944 945 text_custom_field_possible_values_info: '選択肢の値は1行に1個ずつ記述してください。'
945 946 text_wiki_page_destroy_question: "この親ページの配下に%{descendants}ページの子孫ページがあります。"
946 947 text_wiki_page_nullify_children: "子ページをメインページ配下に移動する"
947 948 text_wiki_page_destroy_children: "配下の子孫ページも削除する"
948 949 text_wiki_page_reassign_children: "子ページを次の親ページの配下に移動する"
949 950 text_own_membership_delete_confirmation: "一部またはすべての権限を自分自身から剥奪しようとしているため、このプロジェクトを編集できなくなる可能性があります。\n本当に続けますか?"
950 951 text_zoom_in: 拡大
951 952 text_zoom_out: 縮小
952 953 text_warn_on_leaving_unsaved: このページから移動すると、保存されていないデータが失われます。
953 954 text_scm_path_encoding_note: "デフォルト: UTF-8"
954 955 text_mercurial_repository_note: "ローカルリポジトリ (例: /hgrepo, c:\\hgrepo)"
955 956 text_git_repository_note: "Bare、かつ、ローカルリポジトリ (例: /gitrepo, c:\\gitrepo)"
956 957 text_scm_command: コマンド
957 958 text_scm_command_version: バージョン
958 959 text_scm_config: バージョン管理システムのコマンドをconfig/configuration.ymlで設定できます。設定後、Redmineを再起動してください。
959 960 text_scm_command_not_available: バージョン管理システムのコマンドが利用できません。管理画面にて設定を確認してください。
960 961
961 962 default_role_manager: 管理者
962 963 default_role_developer: 開発者
963 964 default_role_reporter: 報告者
964 965 default_tracker_bug: バグ
965 966 default_tracker_feature: 機能
966 967 default_tracker_support: サポート
967 968 default_issue_status_new: 新規
968 969 default_issue_status_in_progress: 進行中
969 970 default_issue_status_resolved: 解決
970 971 default_issue_status_feedback: フィードバック
971 972 default_issue_status_closed: 終了
972 973 default_issue_status_rejected: 却下
973 974 default_doc_category_user: ユーザー文書
974 975 default_doc_category_tech: 技術文書
975 976 default_priority_low: 低め
976 977 default_priority_normal: 通常
977 978 default_priority_high: 高め
978 979 default_priority_urgent: 急いで
979 980 default_priority_immediate: 今すぐ
980 981 default_activity_design: 設計作業
981 982 default_activity_development: 開発作業
982 983
983 984 enumeration_issue_priorities: チケットの優先度
984 985 enumeration_doc_categories: 文書カテゴリ
985 986 enumeration_activities: 作業分類 (時間トラッキング)
986 987 enumeration_system_activity: システム作業分類
987 988 label_additional_workflow_transitions_for_assignee: チケット担当者に追加で許可する遷移
988 989 label_additional_workflow_transitions_for_author: チケット作成者に追加で許可する遷移
989 990 label_bulk_edit_selected_time_entries: 作業時間の一括編集
990 991 text_time_entries_destroy_confirmation: 本当に選択した作業時間を削除しますか?
991 992
992 993 label_role_anonymous: 匿名ユーザー
993 994 label_role_non_member: 非メンバー
994 995
995 996 label_issue_note_added: 注記が追加されました
996 997 label_issue_status_updated: ステータスが更新されました
997 998 label_issue_priority_updated: 優先度が更新されました
998 999 label_issues_visibility_own: 作成者か担当者であるチケット
999 1000 field_issues_visibility: 表示できるチケット
1000 1001 label_issues_visibility_all: すべてのチケット
1001 1002 permission_set_own_issues_private: 自分のチケットをプライベートに設定
1002 1003 field_is_private: プライベート
1003 1004 permission_set_issues_private: チケットをプライベートに設定
1004 1005 label_issues_visibility_public: プライベートチケット以外
1005 1006 text_issues_destroy_descendants_confirmation: "%{count}個の子チケットも削除されます。"
1006 1007 notice_issue_successful_create: チケット %{id} が作成されました。
1007 1008 label_between: 次の範囲内
1008 1009 setting_issue_group_assignment: グループへのチケット割り当てを許可
1009 1010 description_query_sort_criteria_direction: 順序
1010 1011 description_project_scope: 検索範囲
1011 1012 description_filter: Filter
1012 1013 description_user_mail_notification: メール通知の設定
1013 1014 description_date_from: 開始日
1014 1015 description_message_content: 内容
1015 1016 description_available_columns: 利用できる項目
1016 1017 description_date_range_interval: 日付で指定
1017 1018 description_issue_category_reassign: 新しいカテゴリを選択してください
1018 1019 description_search: 検索キーワード
1019 1020 description_notes: 注記
1020 1021 description_date_range_list: 一覧から選択
1021 1022 description_choose_project: プロジェクト
1022 1023 description_date_to: 終了日
1023 1024 description_query_sort_criteria_attribute: 項目
1024 1025 description_wiki_subpages_reassign: 新しい親ページを選択してください
1025 1026 description_selected_columns: 選択された項目
1026 1027 error_scm_annotate_big_text_file: テキストファイルサイズの上限を超えているためアノテートできません。
1027 1028 setting_default_issue_start_date_to_creation_date: 現在の日付を新しいチケットの開始日とする
1028 1029 button_edit_section: このセクションを編集
1029 1030 description_all_columns: すべての項目
1030 1031 button_export: エクスポート
1031 1032 label_export_options: "%{export_format} エクスポート設定"
1032 1033 error_attachment_too_big: このファイルはアップロードできません。添付ファイルサイズの上限(%{max_size})を超えています。
1033 1034 notice_failed_to_save_time_entries: "全%{total}件中%{count}件の作業時間が保存できませんでした: %{ids}."
1034 1035 label_x_issues:
1035 1036 zero: 0 チケット
1036 1037 one: 1 チケット
1037 1038 other: "%{count} チケット"
1038 1039 label_repository_new: 新しいリポジトリ
1039 1040 field_repository_is_default: メインリポジトリ
1040 1041 label_copy_attachments: 添付ファイルをコピー
1041 1042 label_item_position: "%{position}/%{count}"
1042 1043 label_completed_versions: 完了したバージョン
1043 1044 text_project_identifier_info: アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。最初の文字はアルファベットの小文字にしてください。<br />識別子は後で変更することはできません。
1044 1045 field_multiple: 複数選択可
1045 1046 setting_commit_cross_project_ref: 異なるプロジェクトのチケットの参照/修正を許可
1046 1047 text_issue_conflict_resolution_add_notes: 自分の編集内容を破棄し注記のみ追加
1047 1048 text_issue_conflict_resolution_overwrite: 自分の編集内容の保存を強行 (他のユーザーの更新内容は注記を除き上書きされます)
1048 1049 notice_issue_update_conflict: このチケットを編集中に他のユーザーが更新しました。
1049 1050 text_issue_conflict_resolution_cancel: 自分の編集内容を破棄し %{link} を再表示
1050 1051 permission_manage_related_issues: 関連するチケットの管理
1051 1052 field_auth_source_ldap_filter: LDAPフィルタ
1052 1053 label_search_for_watchers: ウォッチャーを検索して追加
1053 1054 notice_account_deleted: アカウントが削除されました。
1054 1055 setting_unsubscribe: ユーザーによるアカウント削除を許可
1055 1056 button_delete_my_account: 自分のアカウントを削除
1056 1057 text_account_destroy_confirmation: |-
1057 1058 本当にアカウントを削除しますか?
1058 1059 アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。
1059 1060 error_session_expired: セッションが失効しました。ログインし直してください。
1060 1061 text_session_expiration_settings: "警告: この設定を変更すると現在有効なセッションが失効する可能性があります。"
1061 1062 setting_session_lifetime: 有効期間の最大値
1062 1063 setting_session_timeout: 無操作タイムアウト
1063 1064 label_session_expiration: セッション有効期間
1064 1065 permission_close_project: プロジェクトの終了/再開
1065 1066 label_show_closed_projects: 終了したプロジェクトを表示
1066 1067 button_close: 終了
1067 1068 button_reopen: 再開
1068 1069 project_status_active: 有効
1069 1070 project_status_closed: 終了
1070 1071 project_status_archived: アーカイブ
1071 1072 text_project_closed: このプロジェクトは終了しているため読み取り専用です。
1072 1073 notice_user_successful_create: ユーザー %{id} を作成しました。
1073 1074 field_core_fields: 標準フィールド
1074 1075 field_timeout: タイムアウト(秒単位)
1075 1076 setting_thumbnails_enabled: 添付ファイルのサムネイル画像を表示
1076 1077 setting_thumbnails_size: サムネイル画像の大きさ(ピクセル単位)
1077 1078 label_status_transitions: ステータスの遷移
1078 1079 label_fields_permissions: フィールドに対する権限
1079 1080 label_readonly: 読み取り専用
1080 1081 label_required: 必須
1081 1082 text_repository_identifier_info: アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。<br />識別子は後で変更することはできません。
1082 1083 field_board_parent: 親フォーラム
1083 1084 label_attribute_of_project: プロジェクトの %{name}
1084 1085 label_attribute_of_author: 作成者の %{name}
1085 1086 label_attribute_of_assigned_to: 担当者の %{name}
1086 1087 label_attribute_of_fixed_version: 対象バージョンの %{name}
1087 1088 label_copy_subtasks: 子チケットをコピー
1088 1089 label_copied_to: コピー先
1089 1090 label_copied_from: コピー元
1090 1091 label_any_issues_in_project: 次のプロジェクト内のチケット
1091 1092 label_any_issues_not_in_project: 次のプロジェクト外のチケット
1092 1093 field_private_notes: プライベート注記
1093 1094 permission_view_private_notes: プライベート注記の閲覧
1094 1095 permission_set_notes_private: 注記をプライベートに設定
1095 1096 label_no_issues_in_project: 次のプロジェクト内のチケットを除く
1096 1097 label_any: すべて
1097 1098 label_last_n_weeks: 直近%{count}週間
1098 1099 setting_cross_project_subtasks: 異なるプロジェクトのチケット間の親子関係を許可
1099 1100 label_cross_project_descendants: サブプロジェクト単位
1100 1101 label_cross_project_tree: プロジェクトツリー単位
1101 1102 label_cross_project_hierarchy: プロジェクト階層単位
1102 1103 label_cross_project_system: すべてのプロジェクト
1103 1104 button_hide: 隠す
1104 1105 setting_non_working_week_days: 休業日
1105 1106 label_in_the_next_days: 今後○日
1106 1107 label_in_the_past_days: 過去○日
1107 1108 label_attribute_of_user: ユーザーの %{name}
1108 1109 text_turning_multiple_off: If you disable multiple values, duplicate values will be
1109 1110 removed in order to preserve only one value per item.
1110 1111 label_attribute_of_issue: Issue's %{name}
1111 1112 permission_add_documents: Add documents
1112 1113 permission_edit_documents: Edit documents
1113 1114 permission_delete_documents: Delete documents
@@ -1,918 +1,943
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2013 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module Redmine
19 19 module Helpers
20 20 # Simple class to handle gantt chart data
21 21 class Gantt
22 22 include ERB::Util
23 23 include Redmine::I18n
24 24 include Redmine::Utils::DateCalculation
25 25
26 26 # Relation types that are rendered
27 27 DRAW_TYPES = {
28 28 IssueRelation::TYPE_BLOCKS => { :landscape_margin => 16, :color => '#F34F4F' },
29 29 IssueRelation::TYPE_PRECEDES => { :landscape_margin => 20, :color => '#628FEA' }
30 30 }.freeze
31 31
32 32 # :nodoc:
33 33 # Some utility methods for the PDF export
34 34 class PDF
35 35 MaxCharactorsForSubject = 45
36 36 TotalWidth = 280
37 37 LeftPaneWidth = 100
38 38
39 39 def self.right_pane_width
40 40 TotalWidth - LeftPaneWidth
41 41 end
42 42 end
43 43
44 44 attr_reader :year_from, :month_from, :date_from, :date_to, :zoom, :months, :truncated, :max_rows
45 45 attr_accessor :query
46 46 attr_accessor :project
47 47 attr_accessor :view
48 48
49 49 def initialize(options={})
50 50 options = options.dup
51 51 if options[:year] && options[:year].to_i >0
52 52 @year_from = options[:year].to_i
53 53 if options[:month] && options[:month].to_i >=1 && options[:month].to_i <= 12
54 54 @month_from = options[:month].to_i
55 55 else
56 56 @month_from = 1
57 57 end
58 58 else
59 59 @month_from ||= Date.today.month
60 60 @year_from ||= Date.today.year
61 61 end
62 62 zoom = (options[:zoom] || User.current.pref[:gantt_zoom]).to_i
63 63 @zoom = (zoom > 0 && zoom < 5) ? zoom : 2
64 64 months = (options[:months] || User.current.pref[:gantt_months]).to_i
65 65 @months = (months > 0 && months < 25) ? months : 6
66 66 # Save gantt parameters as user preference (zoom and months count)
67 67 if (User.current.logged? && (@zoom != User.current.pref[:gantt_zoom] ||
68 68 @months != User.current.pref[:gantt_months]))
69 69 User.current.pref[:gantt_zoom], User.current.pref[:gantt_months] = @zoom, @months
70 70 User.current.preference.save
71 71 end
72 72 @date_from = Date.civil(@year_from, @month_from, 1)
73 73 @date_to = (@date_from >> @months) - 1
74 74 @subjects = ''
75 75 @lines = ''
76 76 @number_of_rows = nil
77 77 @issue_ancestors = []
78 78 @truncated = false
79 79 if options.has_key?(:max_rows)
80 80 @max_rows = options[:max_rows]
81 81 else
82 82 @max_rows = Setting.gantt_items_limit.blank? ? nil : Setting.gantt_items_limit.to_i
83 83 end
84 84 end
85 85
86 86 def common_params
87 87 { :controller => 'gantts', :action => 'show', :project_id => @project }
88 88 end
89 89
90 90 def params
91 91 common_params.merge({:zoom => zoom, :year => year_from,
92 92 :month => month_from, :months => months})
93 93 end
94 94
95 95 def params_previous
96 96 common_params.merge({:year => (date_from << months).year,
97 97 :month => (date_from << months).month,
98 98 :zoom => zoom, :months => months})
99 99 end
100 100
101 101 def params_next
102 102 common_params.merge({:year => (date_from >> months).year,
103 103 :month => (date_from >> months).month,
104 104 :zoom => zoom, :months => months})
105 105 end
106 106
107 107 # Returns the number of rows that will be rendered on the Gantt chart
108 108 def number_of_rows
109 109 return @number_of_rows if @number_of_rows
110 110 rows = projects.inject(0) {|total, p| total += number_of_rows_on_project(p)}
111 111 rows > @max_rows ? @max_rows : rows
112 112 end
113 113
114 114 # Returns the number of rows that will be used to list a project on
115 115 # the Gantt chart. This will recurse for each subproject.
116 116 def number_of_rows_on_project(project)
117 117 return 0 unless projects.include?(project)
118 118 count = 1
119 119 count += project_issues(project).size
120 120 count += project_versions(project).size
121 121 count
122 122 end
123 123
124 124 # Renders the subjects of the Gantt chart, the left side.
125 125 def subjects(options={})
126 126 render(options.merge(:only => :subjects)) unless @subjects_rendered
127 127 @subjects
128 128 end
129 129
130 130 # Renders the lines of the Gantt chart, the right side
131 131 def lines(options={})
132 132 render(options.merge(:only => :lines)) unless @lines_rendered
133 133 @lines
134 134 end
135 135
136 136 # Returns issues that will be rendered
137 137 def issues
138 138 @issues ||= @query.issues(
139 139 :include => [:assigned_to, :tracker, :priority, :category, :fixed_version],
140 140 :order => "#{Project.table_name}.lft ASC, #{Issue.table_name}.id ASC",
141 141 :limit => @max_rows
142 142 )
143 143 end
144 144
145 145 # Returns a hash of the relations between the issues that are present on the gantt
146 146 # and that should be displayed, grouped by issue ids.
147 147 def relations
148 148 return @relations if @relations
149 149 if issues.any?
150 150 issue_ids = issues.map(&:id)
151 151 @relations = IssueRelation.
152 152 where(:issue_from_id => issue_ids, :issue_to_id => issue_ids, :relation_type => DRAW_TYPES.keys).
153 153 group_by(&:issue_from_id)
154 154 else
155 155 @relations = {}
156 156 end
157 157 end
158 158
159 159 # Return all the project nodes that will be displayed
160 160 def projects
161 161 return @projects if @projects
162 162 ids = issues.collect(&:project).uniq.collect(&:id)
163 163 if ids.any?
164 164 # All issues projects and their visible ancestors
165 165 @projects = Project.visible.all(
166 166 :joins => "LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt",
167 167 :conditions => ["child.id IN (?)", ids],
168 168 :order => "#{Project.table_name}.lft ASC"
169 169 ).uniq
170 170 else
171 171 @projects = []
172 172 end
173 173 end
174 174
175 175 # Returns the issues that belong to +project+
176 176 def project_issues(project)
177 177 @issues_by_project ||= issues.group_by(&:project)
178 178 @issues_by_project[project] || []
179 179 end
180 180
181 181 # Returns the distinct versions of the issues that belong to +project+
182 182 def project_versions(project)
183 183 project_issues(project).collect(&:fixed_version).compact.uniq
184 184 end
185 185
186 186 # Returns the issues that belong to +project+ and are assigned to +version+
187 187 def version_issues(project, version)
188 188 project_issues(project).select {|issue| issue.fixed_version == version}
189 189 end
190 190
191 191 def render(options={})
192 192 options = {:top => 0, :top_increment => 20,
193 193 :indent_increment => 20, :render => :subject,
194 194 :format => :html}.merge(options)
195 195 indent = options[:indent] || 4
196 196 @subjects = '' unless options[:only] == :lines
197 197 @lines = '' unless options[:only] == :subjects
198 198 @number_of_rows = 0
199 199 Project.project_tree(projects) do |project, level|
200 200 options[:indent] = indent + level * options[:indent_increment]
201 201 render_project(project, options)
202 202 break if abort?
203 203 end
204 204 @subjects_rendered = true unless options[:only] == :lines
205 205 @lines_rendered = true unless options[:only] == :subjects
206 206 render_end(options)
207 207 end
208 208
209 209 def render_project(project, options={})
210 210 subject_for_project(project, options) unless options[:only] == :lines
211 211 line_for_project(project, options) unless options[:only] == :subjects
212 212 options[:top] += options[:top_increment]
213 213 options[:indent] += options[:indent_increment]
214 214 @number_of_rows += 1
215 215 return if abort?
216 216 issues = project_issues(project).select {|i| i.fixed_version.nil?}
217 217 sort_issues!(issues)
218 218 if issues
219 219 render_issues(issues, options)
220 220 return if abort?
221 221 end
222 222 versions = project_versions(project)
223 223 versions.each do |version|
224 224 render_version(project, version, options)
225 225 end
226 226 # Remove indent to hit the next sibling
227 227 options[:indent] -= options[:indent_increment]
228 228 end
229 229
230 230 def render_issues(issues, options={})
231 231 @issue_ancestors = []
232 232 issues.each do |i|
233 233 subject_for_issue(i, options) unless options[:only] == :lines
234 234 line_for_issue(i, options) unless options[:only] == :subjects
235 235 options[:top] += options[:top_increment]
236 236 @number_of_rows += 1
237 237 break if abort?
238 238 end
239 239 options[:indent] -= (options[:indent_increment] * @issue_ancestors.size)
240 240 end
241 241
242 242 def render_version(project, version, options={})
243 243 # Version header
244 244 subject_for_version(version, options) unless options[:only] == :lines
245 245 line_for_version(version, options) unless options[:only] == :subjects
246 246 options[:top] += options[:top_increment]
247 247 @number_of_rows += 1
248 248 return if abort?
249 249 issues = version_issues(project, version)
250 250 if issues
251 251 sort_issues!(issues)
252 252 # Indent issues
253 253 options[:indent] += options[:indent_increment]
254 254 render_issues(issues, options)
255 255 options[:indent] -= options[:indent_increment]
256 256 end
257 257 end
258 258
259 259 def render_end(options={})
260 260 case options[:format]
261 261 when :pdf
262 262 options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top])
263 263 end
264 264 end
265 265
266 266 def subject_for_project(project, options)
267 267 case options[:format]
268 268 when :html
269 269 html_class = ""
270 270 html_class << 'icon icon-projects '
271 271 html_class << (project.overdue? ? 'project-overdue' : '')
272 272 s = view.link_to_project(project).html_safe
273 273 subject = view.content_tag(:span, s,
274 274 :class => html_class).html_safe
275 275 html_subject(options, subject, :css => "project-name")
276 276 when :image
277 277 image_subject(options, project.name)
278 278 when :pdf
279 279 pdf_new_page?(options)
280 280 pdf_subject(options, project.name)
281 281 end
282 282 end
283 283
284 284 def line_for_project(project, options)
285 285 # Skip versions that don't have a start_date or due date
286 286 if project.is_a?(Project) && project.start_date && project.due_date
287 287 options[:zoom] ||= 1
288 288 options[:g_width] ||= (self.date_to - self.date_from + 1) * options[:zoom]
289 289 coords = coordinates(project.start_date, project.due_date, nil, options[:zoom])
290 290 label = h(project)
291 291 case options[:format]
292 292 when :html
293 293 html_task(options, coords, :css => "project task", :label => label, :markers => true)
294 294 when :image
295 295 image_task(options, coords, :label => label, :markers => true, :height => 3)
296 296 when :pdf
297 297 pdf_task(options, coords, :label => label, :markers => true, :height => 0.8)
298 298 end
299 299 else
300 300 ''
301 301 end
302 302 end
303 303
304 304 def subject_for_version(version, options)
305 305 case options[:format]
306 306 when :html
307 307 html_class = ""
308 308 html_class << 'icon icon-package '
309 309 html_class << (version.behind_schedule? ? 'version-behind-schedule' : '') << " "
310 310 html_class << (version.overdue? ? 'version-overdue' : '')
311 html_class << ' version-closed' unless version.open?
312 if version.start_date && version.due_date && version.completed_pourcent
313 progress_date = calc_progress_date(version.start_date,
314 version.due_date, version.completed_pourcent)
315 html_class << ' behind-start-date' if progress_date < self.date_from
316 html_class << ' over-end-date' if progress_date > self.date_to
317 end
311 318 s = view.link_to_version(version).html_safe
312 319 subject = view.content_tag(:span, s,
313 320 :class => html_class).html_safe
314 html_subject(options, subject, :css => "version-name")
321 html_subject(options, subject, :css => "version-name",
322 :id => "version-#{version.id}")
315 323 when :image
316 324 image_subject(options, version.to_s_with_project)
317 325 when :pdf
318 326 pdf_new_page?(options)
319 327 pdf_subject(options, version.to_s_with_project)
320 328 end
321 329 end
322 330
323 331 def line_for_version(version, options)
324 332 # Skip versions that don't have a start_date
325 333 if version.is_a?(Version) && version.due_date && version.start_date
326 334 options[:zoom] ||= 1
327 335 options[:g_width] ||= (self.date_to - self.date_from + 1) * options[:zoom]
328 336 coords = coordinates(version.start_date,
329 337 version.due_date, version.completed_percent,
330 338 options[:zoom])
331 339 label = "#{h version} #{h version.completed_percent.to_i.to_s}%"
332 340 label = h("#{version.project} -") + label unless @project && @project == version.project
333 341 case options[:format]
334 342 when :html
335 html_task(options, coords, :css => "version task", :label => label, :markers => true)
343 html_task(options, coords, :css => "version task",
344 :label => label, :markers => true, :version => version)
336 345 when :image
337 346 image_task(options, coords, :label => label, :markers => true, :height => 3)
338 347 when :pdf
339 348 pdf_task(options, coords, :label => label, :markers => true, :height => 0.8)
340 349 end
341 350 else
342 351 ''
343 352 end
344 353 end
345 354
346 355 def subject_for_issue(issue, options)
347 356 while @issue_ancestors.any? && !issue.is_descendant_of?(@issue_ancestors.last)
348 357 @issue_ancestors.pop
349 358 options[:indent] -= options[:indent_increment]
350 359 end
351 360 output = case options[:format]
352 361 when :html
353 362 css_classes = ''
354 363 css_classes << ' issue-overdue' if issue.overdue?
355 364 css_classes << ' issue-behind-schedule' if issue.behind_schedule?
356 365 css_classes << ' icon icon-issue' unless Setting.gravatar_enabled? && issue.assigned_to
366 css_classes << ' issue-closed' if issue.closed?
367 if issue.start_date && issue.due_before && issue.done_ratio
368 progress_date = calc_progress_date(issue.start_date,
369 issue.due_before, issue.done_ratio)
370 css_classes << ' behind-start-date' if progress_date < self.date_from
371 css_classes << ' over-end-date' if progress_date > self.date_to
372 end
357 373 s = "".html_safe
358 374 if issue.assigned_to.present?
359 375 assigned_string = l(:field_assigned_to) + ": " + issue.assigned_to.name
360 376 s << view.avatar(issue.assigned_to,
361 377 :class => 'gravatar icon-gravatar',
362 378 :size => 10,
363 379 :title => assigned_string).to_s.html_safe
364 380 end
365 381 s << view.link_to_issue(issue).html_safe
366 382 subject = view.content_tag(:span, s, :class => css_classes).html_safe
367 383 html_subject(options, subject, :css => "issue-subject",
368 :title => issue.subject) + "\n"
384 :title => issue.subject, :id => "issue-#{issue.id}") + "\n"
369 385 when :image
370 386 image_subject(options, issue.subject)
371 387 when :pdf
372 388 pdf_new_page?(options)
373 389 pdf_subject(options, issue.subject)
374 390 end
375 391 unless issue.leaf?
376 392 @issue_ancestors << issue
377 393 options[:indent] += options[:indent_increment]
378 394 end
379 395 output
380 396 end
381 397
382 398 def line_for_issue(issue, options)
383 399 # Skip issues that don't have a due_before (due_date or version's due_date)
384 400 if issue.is_a?(Issue) && issue.due_before
385 401 coords = coordinates(issue.start_date, issue.due_before, issue.done_ratio, options[:zoom])
386 402 label = "#{issue.status.name} #{issue.done_ratio}%"
387 403 case options[:format]
388 404 when :html
389 405 html_task(options, coords,
390 406 :css => "task " + (issue.leaf? ? 'leaf' : 'parent'),
391 407 :label => label, :issue => issue,
392 408 :markers => !issue.leaf?)
393 409 when :image
394 410 image_task(options, coords, :label => label)
395 411 when :pdf
396 412 pdf_task(options, coords, :label => label)
397 413 end
398 414 else
399 415 ''
400 416 end
401 417 end
402 418
403 419 # Generates a gantt image
404 420 # Only defined if RMagick is avalaible
405 421 def to_image(format='PNG')
406 422 date_to = (@date_from >> @months) - 1
407 423 show_weeks = @zoom > 1
408 424 show_days = @zoom > 2
409 425 subject_width = 400
410 426 header_height = 18
411 427 # width of one day in pixels
412 428 zoom = @zoom * 2
413 429 g_width = (@date_to - @date_from + 1) * zoom
414 430 g_height = 20 * number_of_rows + 30
415 431 headers_height = (show_weeks ? 2 * header_height : header_height)
416 432 height = g_height + headers_height
417 433 imgl = Magick::ImageList.new
418 434 imgl.new_image(subject_width + g_width + 1, height)
419 435 gc = Magick::Draw.new
420 436 gc.font = Redmine::Configuration['rmagick_font_path'] || ""
421 437 # Subjects
422 438 gc.stroke('transparent')
423 439 subjects(:image => gc, :top => (headers_height + 20), :indent => 4, :format => :image)
424 440 # Months headers
425 441 month_f = @date_from
426 442 left = subject_width
427 443 @months.times do
428 444 width = ((month_f >> 1) - month_f) * zoom
429 445 gc.fill('white')
430 446 gc.stroke('grey')
431 447 gc.stroke_width(1)
432 448 gc.rectangle(left, 0, left + width, height)
433 449 gc.fill('black')
434 450 gc.stroke('transparent')
435 451 gc.stroke_width(1)
436 452 gc.text(left.round + 8, 14, "#{month_f.year}-#{month_f.month}")
437 453 left = left + width
438 454 month_f = month_f >> 1
439 455 end
440 456 # Weeks headers
441 457 if show_weeks
442 458 left = subject_width
443 459 height = header_height
444 460 if @date_from.cwday == 1
445 461 # date_from is monday
446 462 week_f = date_from
447 463 else
448 464 # find next monday after date_from
449 465 week_f = @date_from + (7 - @date_from.cwday + 1)
450 466 width = (7 - @date_from.cwday + 1) * zoom
451 467 gc.fill('white')
452 468 gc.stroke('grey')
453 469 gc.stroke_width(1)
454 470 gc.rectangle(left, header_height, left + width, 2 * header_height + g_height - 1)
455 471 left = left + width
456 472 end
457 473 while week_f <= date_to
458 474 width = (week_f + 6 <= date_to) ? 7 * zoom : (date_to - week_f + 1) * zoom
459 475 gc.fill('white')
460 476 gc.stroke('grey')
461 477 gc.stroke_width(1)
462 478 gc.rectangle(left.round, header_height, left.round + width, 2 * header_height + g_height - 1)
463 479 gc.fill('black')
464 480 gc.stroke('transparent')
465 481 gc.stroke_width(1)
466 482 gc.text(left.round + 2, header_height + 14, week_f.cweek.to_s)
467 483 left = left + width
468 484 week_f = week_f + 7
469 485 end
470 486 end
471 487 # Days details (week-end in grey)
472 488 if show_days
473 489 left = subject_width
474 490 height = g_height + header_height - 1
475 491 wday = @date_from.cwday
476 492 (date_to - @date_from + 1).to_i.times do
477 493 width = zoom
478 494 gc.fill(non_working_week_days.include?(wday) ? '#eee' : 'white')
479 495 gc.stroke('#ddd')
480 496 gc.stroke_width(1)
481 497 gc.rectangle(left, 2 * header_height, left + width, 2 * header_height + g_height - 1)
482 498 left = left + width
483 499 wday = wday + 1
484 500 wday = 1 if wday > 7
485 501 end
486 502 end
487 503 # border
488 504 gc.fill('transparent')
489 505 gc.stroke('grey')
490 506 gc.stroke_width(1)
491 507 gc.rectangle(0, 0, subject_width + g_width, headers_height)
492 508 gc.stroke('black')
493 509 gc.rectangle(0, 0, subject_width + g_width, g_height + headers_height - 1)
494 510 # content
495 511 top = headers_height + 20
496 512 gc.stroke('transparent')
497 513 lines(:image => gc, :top => top, :zoom => zoom,
498 514 :subject_width => subject_width, :format => :image)
499 515 # today red line
500 516 if Date.today >= @date_from and Date.today <= date_to
501 517 gc.stroke('red')
502 518 x = (Date.today - @date_from + 1) * zoom + subject_width
503 519 gc.line(x, headers_height, x, headers_height + g_height - 1)
504 520 end
505 521 gc.draw(imgl)
506 522 imgl.format = format
507 523 imgl.to_blob
508 524 end if Object.const_defined?(:Magick)
509 525
510 526 def to_pdf
511 527 pdf = ::Redmine::Export::PDF::ITCPDF.new(current_language)
512 528 pdf.SetTitle("#{l(:label_gantt)} #{project}")
513 529 pdf.alias_nb_pages
514 530 pdf.footer_date = format_date(Date.today)
515 531 pdf.AddPage("L")
516 532 pdf.SetFontStyle('B', 12)
517 533 pdf.SetX(15)
518 534 pdf.RDMCell(PDF::LeftPaneWidth, 20, project.to_s)
519 535 pdf.Ln
520 536 pdf.SetFontStyle('B', 9)
521 537 subject_width = PDF::LeftPaneWidth
522 538 header_height = 5
523 539 headers_height = header_height
524 540 show_weeks = false
525 541 show_days = false
526 542 if self.months < 7
527 543 show_weeks = true
528 544 headers_height = 2 * header_height
529 545 if self.months < 3
530 546 show_days = true
531 547 headers_height = 3 * header_height
532 548 end
533 549 end
534 550 g_width = PDF.right_pane_width
535 551 zoom = (g_width) / (self.date_to - self.date_from + 1)
536 552 g_height = 120
537 553 t_height = g_height + headers_height
538 554 y_start = pdf.GetY
539 555 # Months headers
540 556 month_f = self.date_from
541 557 left = subject_width
542 558 height = header_height
543 559 self.months.times do
544 560 width = ((month_f >> 1) - month_f) * zoom
545 561 pdf.SetY(y_start)
546 562 pdf.SetX(left)
547 563 pdf.RDMCell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
548 564 left = left + width
549 565 month_f = month_f >> 1
550 566 end
551 567 # Weeks headers
552 568 if show_weeks
553 569 left = subject_width
554 570 height = header_height
555 571 if self.date_from.cwday == 1
556 572 # self.date_from is monday
557 573 week_f = self.date_from
558 574 else
559 575 # find next monday after self.date_from
560 576 week_f = self.date_from + (7 - self.date_from.cwday + 1)
561 577 width = (7 - self.date_from.cwday + 1) * zoom-1
562 578 pdf.SetY(y_start + header_height)
563 579 pdf.SetX(left)
564 580 pdf.RDMCell(width + 1, height, "", "LTR")
565 581 left = left + width + 1
566 582 end
567 583 while week_f <= self.date_to
568 584 width = (week_f + 6 <= self.date_to) ? 7 * zoom : (self.date_to - week_f + 1) * zoom
569 585 pdf.SetY(y_start + header_height)
570 586 pdf.SetX(left)
571 587 pdf.RDMCell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
572 588 left = left + width
573 589 week_f = week_f + 7
574 590 end
575 591 end
576 592 # Days headers
577 593 if show_days
578 594 left = subject_width
579 595 height = header_height
580 596 wday = self.date_from.cwday
581 597 pdf.SetFontStyle('B', 7)
582 598 (self.date_to - self.date_from + 1).to_i.times do
583 599 width = zoom
584 600 pdf.SetY(y_start + 2 * header_height)
585 601 pdf.SetX(left)
586 602 pdf.RDMCell(width, height, day_name(wday).first, "LTR", 0, "C")
587 603 left = left + width
588 604 wday = wday + 1
589 605 wday = 1 if wday > 7
590 606 end
591 607 end
592 608 pdf.SetY(y_start)
593 609 pdf.SetX(15)
594 610 pdf.RDMCell(subject_width + g_width - 15, headers_height, "", 1)
595 611 # Tasks
596 612 top = headers_height + y_start
597 613 options = {
598 614 :top => top,
599 615 :zoom => zoom,
600 616 :subject_width => subject_width,
601 617 :g_width => g_width,
602 618 :indent => 0,
603 619 :indent_increment => 5,
604 620 :top_increment => 5,
605 621 :format => :pdf,
606 622 :pdf => pdf
607 623 }
608 624 render(options)
609 625 pdf.Output
610 626 end
611 627
612 628 private
613 629
614 630 def coordinates(start_date, end_date, progress, zoom=nil)
615 631 zoom ||= @zoom
616 632 coords = {}
617 633 if start_date && end_date && start_date < self.date_to && end_date > self.date_from
618 634 if start_date > self.date_from
619 635 coords[:start] = start_date - self.date_from
620 636 coords[:bar_start] = start_date - self.date_from
621 637 else
622 638 coords[:bar_start] = 0
623 639 end
624 640 if end_date < self.date_to
625 641 coords[:end] = end_date - self.date_from
626 642 coords[:bar_end] = end_date - self.date_from + 1
627 643 else
628 644 coords[:bar_end] = self.date_to - self.date_from + 1
629 645 end
630 646 if progress
631 progress_date = start_date + (end_date - start_date + 1) * (progress / 100.0)
647 progress_date = calc_progress_date(start_date, end_date, progress)
632 648 if progress_date > self.date_from && progress_date > start_date
633 649 if progress_date < self.date_to
634 650 coords[:bar_progress_end] = progress_date - self.date_from
635 651 else
636 652 coords[:bar_progress_end] = self.date_to - self.date_from + 1
637 653 end
638 654 end
639 655 if progress_date < Date.today
640 656 late_date = [Date.today, end_date].min
641 657 if late_date > self.date_from && late_date > start_date
642 658 if late_date < self.date_to
643 659 coords[:bar_late_end] = late_date - self.date_from + 1
644 660 else
645 661 coords[:bar_late_end] = self.date_to - self.date_from + 1
646 662 end
647 663 end
648 664 end
649 665 end
650 666 end
651 667 # Transforms dates into pixels witdh
652 668 coords.keys.each do |key|
653 669 coords[key] = (coords[key] * zoom).floor
654 670 end
655 671 coords
656 672 end
657 673
674 def calc_progress_date(start_date, end_date, progress)
675 start_date + (end_date - start_date + 1) * (progress / 100.0)
676 end
677
658 678 # Sorts a collection of issues by start_date, due_date, id for gantt rendering
659 679 def sort_issues!(issues)
660 680 issues.sort! { |a, b| gantt_issue_compare(a, b) }
661 681 end
662 682
663 683 # TODO: top level issues should be sorted by start date
664 684 def gantt_issue_compare(x, y)
665 685 if x.root_id == y.root_id
666 686 x.lft <=> y.lft
667 687 else
668 688 x.root_id <=> y.root_id
669 689 end
670 690 end
671 691
672 692 def current_limit
673 693 if @max_rows
674 694 @max_rows - @number_of_rows
675 695 else
676 696 nil
677 697 end
678 698 end
679 699
680 700 def abort?
681 701 if @max_rows && @number_of_rows >= @max_rows
682 702 @truncated = true
683 703 end
684 704 end
685 705
686 706 def pdf_new_page?(options)
687 707 if options[:top] > 180
688 708 options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top])
689 709 options[:pdf].AddPage("L")
690 710 options[:top] = 15
691 711 options[:pdf].Line(15, options[:top] - 0.1, PDF::TotalWidth, options[:top] - 0.1)
692 712 end
693 713 end
694 714
695 715 def html_subject(params, subject, options={})
696 716 style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;"
697 717 style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width]
698 output = view.content_tag('div', subject,
718 output = view.content_tag(:div, subject,
699 719 :class => options[:css], :style => style,
700 :title => options[:title])
720 :title => options[:title],
721 :id => options[:id])
701 722 @subjects << output
702 723 output
703 724 end
704 725
705 726 def pdf_subject(params, subject, options={})
706 727 params[:pdf].SetY(params[:top])
707 728 params[:pdf].SetX(15)
708 729 char_limit = PDF::MaxCharactorsForSubject - params[:indent]
709 730 params[:pdf].RDMCell(params[:subject_width] - 15, 5,
710 731 (" " * params[:indent]) +
711 732 subject.to_s.sub(/^(.{#{char_limit}}[^\s]*\s).*$/, '\1 (...)'),
712 733 "LR")
713 734 params[:pdf].SetY(params[:top])
714 735 params[:pdf].SetX(params[:subject_width])
715 736 params[:pdf].RDMCell(params[:g_width], 5, "", "LR")
716 737 end
717 738
718 739 def image_subject(params, subject, options={})
719 740 params[:image].fill('black')
720 741 params[:image].stroke('transparent')
721 742 params[:image].stroke_width(1)
722 743 params[:image].text(params[:indent], params[:top] + 2, subject)
723 744 end
724 745
725 746 def issue_relations(issue)
726 747 rels = {}
727 748 if relations[issue.id]
728 749 relations[issue.id].each do |relation|
729 750 (rels[relation.relation_type] ||= []) << relation.issue_to_id
730 751 end
731 752 end
732 753 rels
733 754 end
734 755
735 756 def html_task(params, coords, options={})
736 757 output = ''
737 758 # Renders the task bar, with progress and late
738 759 if coords[:bar_start] && coords[:bar_end]
739 760 width = coords[:bar_end] - coords[:bar_start] - 2
740 761 style = ""
741 762 style << "top:#{params[:top]}px;"
742 763 style << "left:#{coords[:bar_start]}px;"
743 764 style << "width:#{width}px;"
744 765 html_id = "task-todo-issue-#{options[:issue].id}" if options[:issue]
766 html_id = "task-todo-version-#{options[:version].id}" if options[:version]
745 767 content_opt = {:style => style,
746 768 :class => "#{options[:css]} task_todo",
747 769 :id => html_id}
748 770 if options[:issue]
749 771 rels = issue_relations(options[:issue])
750 772 if rels.present?
751 773 content_opt[:data] = {"rels" => rels.to_json}
752 774 end
753 775 end
754 776 output << view.content_tag(:div, '&nbsp;'.html_safe, content_opt)
755 777 if coords[:bar_late_end]
756 778 width = coords[:bar_late_end] - coords[:bar_start] - 2
757 779 style = ""
758 780 style << "top:#{params[:top]}px;"
759 781 style << "left:#{coords[:bar_start]}px;"
760 782 style << "width:#{width}px;"
761 783 output << view.content_tag(:div, '&nbsp;'.html_safe,
762 784 :style => style,
763 785 :class => "#{options[:css]} task_late")
764 786 end
765 787 if coords[:bar_progress_end]
766 788 width = coords[:bar_progress_end] - coords[:bar_start] - 2
767 789 style = ""
768 790 style << "top:#{params[:top]}px;"
769 791 style << "left:#{coords[:bar_start]}px;"
770 792 style << "width:#{width}px;"
793 html_id = "task-done-issue-#{options[:issue].id}" if options[:issue]
794 html_id = "task-done-version-#{options[:version].id}" if options[:version]
771 795 output << view.content_tag(:div, '&nbsp;'.html_safe,
772 796 :style => style,
773 :class => "#{options[:css]} task_done")
797 :class => "#{options[:css]} task_done",
798 :id => html_id)
774 799 end
775 800 end
776 801 # Renders the markers
777 802 if options[:markers]
778 803 if coords[:start]
779 804 style = ""
780 805 style << "top:#{params[:top]}px;"
781 806 style << "left:#{coords[:start]}px;"
782 807 style << "width:15px;"
783 808 output << view.content_tag(:div, '&nbsp;'.html_safe,
784 809 :style => style,
785 810 :class => "#{options[:css]} marker starting")
786 811 end
787 812 if coords[:end]
788 813 style = ""
789 814 style << "top:#{params[:top]}px;"
790 815 style << "left:#{coords[:end] + params[:zoom]}px;"
791 816 style << "width:15px;"
792 817 output << view.content_tag(:div, '&nbsp;'.html_safe,
793 818 :style => style,
794 819 :class => "#{options[:css]} marker ending")
795 820 end
796 821 end
797 822 # Renders the label on the right
798 823 if options[:label]
799 824 style = ""
800 825 style << "top:#{params[:top]}px;"
801 826 style << "left:#{(coords[:bar_end] || 0) + 8}px;"
802 827 style << "width:15px;"
803 828 output << view.content_tag(:div, options[:label],
804 829 :style => style,
805 830 :class => "#{options[:css]} label")
806 831 end
807 832 # Renders the tooltip
808 833 if options[:issue] && coords[:bar_start] && coords[:bar_end]
809 834 s = view.content_tag(:span,
810 835 view.render_issue_tooltip(options[:issue]).html_safe,
811 836 :class => "tip")
812 837 style = ""
813 838 style << "position: absolute;"
814 839 style << "top:#{params[:top]}px;"
815 840 style << "left:#{coords[:bar_start]}px;"
816 841 style << "width:#{coords[:bar_end] - coords[:bar_start]}px;"
817 842 style << "height:12px;"
818 843 output << view.content_tag(:div, s.html_safe,
819 844 :style => style,
820 845 :class => "tooltip")
821 846 end
822 847 @lines << output
823 848 output
824 849 end
825 850
826 851 def pdf_task(params, coords, options={})
827 852 height = options[:height] || 2
828 853 # Renders the task bar, with progress and late
829 854 if coords[:bar_start] && coords[:bar_end]
830 855 params[:pdf].SetY(params[:top] + 1.5)
831 856 params[:pdf].SetX(params[:subject_width] + coords[:bar_start])
832 857 params[:pdf].SetFillColor(200, 200, 200)
833 858 params[:pdf].RDMCell(coords[:bar_end] - coords[:bar_start], height, "", 0, 0, "", 1)
834 859 if coords[:bar_late_end]
835 860 params[:pdf].SetY(params[:top] + 1.5)
836 861 params[:pdf].SetX(params[:subject_width] + coords[:bar_start])
837 862 params[:pdf].SetFillColor(255, 100, 100)
838 863 params[:pdf].RDMCell(coords[:bar_late_end] - coords[:bar_start], height, "", 0, 0, "", 1)
839 864 end
840 865 if coords[:bar_progress_end]
841 866 params[:pdf].SetY(params[:top] + 1.5)
842 867 params[:pdf].SetX(params[:subject_width] + coords[:bar_start])
843 868 params[:pdf].SetFillColor(90, 200, 90)
844 869 params[:pdf].RDMCell(coords[:bar_progress_end] - coords[:bar_start], height, "", 0, 0, "", 1)
845 870 end
846 871 end
847 872 # Renders the markers
848 873 if options[:markers]
849 874 if coords[:start]
850 875 params[:pdf].SetY(params[:top] + 1)
851 876 params[:pdf].SetX(params[:subject_width] + coords[:start] - 1)
852 877 params[:pdf].SetFillColor(50, 50, 200)
853 878 params[:pdf].RDMCell(2, 2, "", 0, 0, "", 1)
854 879 end
855 880 if coords[:end]
856 881 params[:pdf].SetY(params[:top] + 1)
857 882 params[:pdf].SetX(params[:subject_width] + coords[:end] - 1)
858 883 params[:pdf].SetFillColor(50, 50, 200)
859 884 params[:pdf].RDMCell(2, 2, "", 0, 0, "", 1)
860 885 end
861 886 end
862 887 # Renders the label on the right
863 888 if options[:label]
864 889 params[:pdf].SetX(params[:subject_width] + (coords[:bar_end] || 0) + 5)
865 890 params[:pdf].RDMCell(30, 2, options[:label])
866 891 end
867 892 end
868 893
869 894 def image_task(params, coords, options={})
870 895 height = options[:height] || 6
871 896 # Renders the task bar, with progress and late
872 897 if coords[:bar_start] && coords[:bar_end]
873 898 params[:image].fill('#aaa')
874 899 params[:image].rectangle(params[:subject_width] + coords[:bar_start],
875 900 params[:top],
876 901 params[:subject_width] + coords[:bar_end],
877 902 params[:top] - height)
878 903 if coords[:bar_late_end]
879 904 params[:image].fill('#f66')
880 905 params[:image].rectangle(params[:subject_width] + coords[:bar_start],
881 906 params[:top],
882 907 params[:subject_width] + coords[:bar_late_end],
883 908 params[:top] - height)
884 909 end
885 910 if coords[:bar_progress_end]
886 911 params[:image].fill('#00c600')
887 912 params[:image].rectangle(params[:subject_width] + coords[:bar_start],
888 913 params[:top],
889 914 params[:subject_width] + coords[:bar_progress_end],
890 915 params[:top] - height)
891 916 end
892 917 end
893 918 # Renders the markers
894 919 if options[:markers]
895 920 if coords[:start]
896 921 x = params[:subject_width] + coords[:start]
897 922 y = params[:top] - height / 2
898 923 params[:image].fill('blue')
899 924 params[:image].polygon(x - 4, y, x, y - 4, x + 4, y, x, y + 4)
900 925 end
901 926 if coords[:end]
902 927 x = params[:subject_width] + coords[:end] + params[:zoom]
903 928 y = params[:top] - height / 2
904 929 params[:image].fill('blue')
905 930 params[:image].polygon(x - 4, y, x, y - 4, x + 4, y, x, y + 4)
906 931 end
907 932 end
908 933 # Renders the label on the right
909 934 if options[:label]
910 935 params[:image].fill('black')
911 936 params[:image].text(params[:subject_width] + (coords[:bar_end] || 0) + 5,
912 937 params[:top] + 1,
913 938 options[:label])
914 939 end
915 940 end
916 941 end
917 942 end
918 943 end
@@ -1,109 +1,172
1 1 var draw_gantt = null;
2 2 var draw_top;
3 3 var draw_right;
4 4 var draw_left;
5 5
6 6 var rels_stroke_width = 2;
7 7
8 8 function setDrawArea() {
9 9 draw_top = $("#gantt_draw_area").position().top;
10 10 draw_right = $("#gantt_draw_area").width();
11 11 draw_left = $("#gantt_area").scrollLeft();
12 12 }
13 13
14 14 function getRelationsArray() {
15 15 var arr = new Array();
16 16 $.each($('div.task_todo[data-rels]'), function(index_div, element) {
17 17 var element_id = $(element).attr("id");
18 18 if (element_id != null) {
19 19 var issue_id = element_id.replace("task-todo-issue-", "");
20 20 var data_rels = $(element).data("rels");
21 21 for (rel_type_key in data_rels) {
22 22 $.each(data_rels[rel_type_key], function(index_issue, element_issue) {
23 23 arr.push({issue_from: issue_id, issue_to: element_issue,
24 24 rel_type: rel_type_key});
25 25 });
26 26 }
27 27 }
28 28 });
29 29 return arr;
30 30 }
31 31
32 32 function drawRelations() {
33 33 var arr = getRelationsArray();
34 34 $.each(arr, function(index_issue, element_issue) {
35 35 var issue_from = $("#task-todo-issue-" + element_issue["issue_from"]);
36 36 var issue_to = $("#task-todo-issue-" + element_issue["issue_to"]);
37 37 if (issue_from.size() == 0 || issue_to.size() == 0) {
38 38 return;
39 39 }
40 40 var issue_height = issue_from.height();
41 41 var issue_from_top = issue_from.position().top + (issue_height / 2) - draw_top;
42 42 var issue_from_right = issue_from.position().left + issue_from.width();
43 43 var issue_to_top = issue_to.position().top + (issue_height / 2) - draw_top;
44 44 var issue_to_left = issue_to.position().left;
45 45 var color = issue_relation_type[element_issue["rel_type"]]["color"];
46 46 var landscape_margin = issue_relation_type[element_issue["rel_type"]]["landscape_margin"];
47 47 var issue_from_right_rel = issue_from_right + landscape_margin;
48 48 var issue_to_left_rel = issue_to_left - landscape_margin;
49 49 draw_gantt.path(["M", issue_from_right + draw_left, issue_from_top,
50 50 "L", issue_from_right_rel + draw_left, issue_from_top])
51 51 .attr({stroke: color,
52 52 "stroke-width": rels_stroke_width
53 53 });
54 54 if (issue_from_right_rel < issue_to_left_rel) {
55 55 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top,
56 56 "L", issue_from_right_rel + draw_left, issue_to_top])
57 57 .attr({stroke: color,
58 58 "stroke-width": rels_stroke_width
59 59 });
60 60 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_to_top,
61 61 "L", issue_to_left + draw_left, issue_to_top])
62 62 .attr({stroke: color,
63 63 "stroke-width": rels_stroke_width
64 64 });
65 65 } else {
66 66 var issue_middle_top = issue_to_top +
67 67 (issue_height *
68 68 ((issue_from_top > issue_to_top) ? 1 : -1));
69 69 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top,
70 70 "L", issue_from_right_rel + draw_left, issue_middle_top])
71 71 .attr({stroke: color,
72 72 "stroke-width": rels_stroke_width
73 73 });
74 74 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_middle_top,
75 75 "L", issue_to_left_rel + draw_left, issue_middle_top])
76 76 .attr({stroke: color,
77 77 "stroke-width": rels_stroke_width
78 78 });
79 79 draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_middle_top,
80 80 "L", issue_to_left_rel + draw_left, issue_to_top])
81 81 .attr({stroke: color,
82 82 "stroke-width": rels_stroke_width
83 83 });
84 84 draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_to_top,
85 85 "L", issue_to_left + draw_left, issue_to_top])
86 86 .attr({stroke: color,
87 87 "stroke-width": rels_stroke_width
88 88 });
89 89 }
90 90 draw_gantt.path(["M", issue_to_left + draw_left, issue_to_top,
91 91 "l", -4 * rels_stroke_width, -2 * rels_stroke_width,
92 92 "l", 0, 4 * rels_stroke_width, "z"])
93 93 .attr({stroke: "none",
94 94 fill: color,
95 95 "stroke-linecap": "butt",
96 96 "stroke-linejoin": "miter",
97 97 });
98 98 });
99 99 }
100 100
101 function getProgressLinesArray() {
102 var arr = new Array();
103 var today_left = $('#today_line').position().left;
104 arr.push({left: today_left, top: 0});
105 $.each($('div.issue-subject, div.version-name'), function(index, element) {
106 var t = $(element).position().top - draw_top ;
107 var h = ($(element).height() / 9);
108 var element_top_upper = t - h;
109 var element_top_center = t + (h * 3);
110 var element_top_lower = t + (h * 8);
111 var issue_closed = $(element).children('span').hasClass('issue-closed');
112 var version_closed = $(element).children('span').hasClass('version-closed');
113 if (issue_closed || version_closed) {
114 arr.push({left: today_left, top: element_top_center});
115 } else {
116 var issue_done = $("#task-done-" + $(element).attr("id"));
117 var is_behind_start = $(element).children('span').hasClass('behind-start-date');
118 var is_over_end = $(element).children('span').hasClass('over-end-date');
119 if (is_over_end) {
120 arr.push({left: draw_right, top: element_top_upper, is_right_edge: true});
121 arr.push({left: draw_right, top: element_top_lower, is_right_edge: true, none_stroke: true});
122 } else if (issue_done.size() > 0) {
123 var done_left = issue_done.first().position().left +
124 issue_done.first().width();
125 arr.push({left: done_left, top: element_top_center});
126 } else if (is_behind_start) {
127 arr.push({left: 0 , top: element_top_upper, is_left_edge: true});
128 arr.push({left: 0 , top: element_top_lower, is_left_edge: true, none_stroke: true});
129 } else {
130 var todo_left = today_left;
131 var issue_todo = $("#task-todo-" + $(element).attr("id"));
132 if (issue_todo.size() > 0){
133 todo_left = issue_todo.first().position().left;
134 }
135 arr.push({left: Math.min(today_left, todo_left), top: element_top_center});
136 }
137 }
138 });
139 return arr;
140 }
141
142 function drawGanttProgressLines() {
143 var arr = getProgressLinesArray();
144 var color = $("#today_line")
145 .css("border-left-color");
146 var i;
147 for(i = 1 ; i < arr.length ; i++) {
148 if (!("none_stroke" in arr[i]) &&
149 (!("is_right_edge" in arr[i - 1] && "is_right_edge" in arr[i]) &&
150 !("is_left_edge" in arr[i - 1] && "is_left_edge" in arr[i]))
151 ) {
152 var x1 = (arr[i - 1].left == 0) ? 0 : arr[i - 1].left + draw_left;
153 var x2 = (arr[i].left == 0) ? 0 : arr[i].left + draw_left;
154 draw_gantt.path(["M", x1, arr[i - 1].top,
155 "L", x2, arr[i].top])
156 .attr({stroke: color, "stroke-width": 2});
157 }
158 }
159 }
160
101 161 function drawGanttHandler() {
102 162 var folder = document.getElementById('gantt_draw_area');
103 163 if(draw_gantt != null)
104 164 draw_gantt.clear();
105 165 else
106 166 draw_gantt = Raphael(folder);
107 167 setDrawArea();
108 drawRelations();
168 if ($("#draw_progress_line").attr('checked'))
169 drawGanttProgressLines();
170 if ($("#draw_rels").attr('checked'))
171 drawRelations();
109 172 }
General Comments 0
You need to be logged in to leave comments. Login now