##// END OF EJS Templates
Added an option to turn user Gravatars on or off...
Eric Davis -
r1970:ba20a678737c
parent child
Show More
@@ -1,571 +1,577
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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 require 'coderay'
19 19 require 'coderay/helpers/file_type'
20 20 require 'forwardable'
21 21
22 22 module ApplicationHelper
23 23 include Redmine::WikiFormatting::Macros::Definitions
24 24
25 25 extend Forwardable
26 26 def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
27 27
28 28 def current_role
29 29 @current_role ||= User.current.role_for_project(@project)
30 30 end
31 31
32 32 # Return true if user is authorized for controller/action, otherwise false
33 33 def authorize_for(controller, action)
34 34 User.current.allowed_to?({:controller => controller, :action => action}, @project)
35 35 end
36 36
37 37 # Display a link if user is authorized
38 38 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
39 39 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
40 40 end
41 41
42 42 # Display a link to remote if user is authorized
43 43 def link_to_remote_if_authorized(name, options = {}, html_options = nil)
44 44 url = options[:url] || {}
45 45 link_to_remote(name, options, html_options) if authorize_for(url[:controller] || params[:controller], url[:action])
46 46 end
47 47
48 48 # Display a link to user's account page
49 49 def link_to_user(user)
50 50 user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
51 51 end
52 52
53 53 def link_to_issue(issue, options={})
54 54 options[:class] ||= ''
55 55 options[:class] << ' issue'
56 56 options[:class] << ' closed' if issue.closed?
57 57 link_to "#{issue.tracker.name} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, options
58 58 end
59 59
60 60 # Generates a link to an attachment.
61 61 # Options:
62 62 # * :text - Link text (default to attachment filename)
63 63 # * :download - Force download (default: false)
64 64 def link_to_attachment(attachment, options={})
65 65 text = options.delete(:text) || attachment.filename
66 66 action = options.delete(:download) ? 'download' : 'show'
67 67
68 68 link_to(h(text), {:controller => 'attachments', :action => action, :id => attachment, :filename => attachment.filename }, options)
69 69 end
70 70
71 71 def toggle_link(name, id, options={})
72 72 onclick = "Element.toggle('#{id}'); "
73 73 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
74 74 onclick << "return false;"
75 75 link_to(name, "#", :onclick => onclick)
76 76 end
77 77
78 78 def image_to_function(name, function, html_options = {})
79 79 html_options.symbolize_keys!
80 80 tag(:input, html_options.merge({
81 81 :type => "image", :src => image_path(name),
82 82 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
83 83 }))
84 84 end
85 85
86 86 def prompt_to_remote(name, text, param, url, html_options = {})
87 87 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
88 88 link_to name, {}, html_options
89 89 end
90 90
91 91 def format_date(date)
92 92 return nil unless date
93 93 # "Setting.date_format.size < 2" is a temporary fix (content of date_format setting changed)
94 94 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
95 95 date.strftime(@date_format)
96 96 end
97 97
98 98 def format_time(time, include_date = true)
99 99 return nil unless time
100 100 time = time.to_time if time.is_a?(String)
101 101 zone = User.current.time_zone
102 102 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time)
103 103 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
104 104 @time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format)
105 105 include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
106 106 end
107 107
108 108 def distance_of_date_in_words(from_date, to_date = 0)
109 109 from_date = from_date.to_date if from_date.respond_to?(:to_date)
110 110 to_date = to_date.to_date if to_date.respond_to?(:to_date)
111 111 distance_in_days = (to_date - from_date).abs
112 112 lwr(:actionview_datehelper_time_in_words_day, distance_in_days)
113 113 end
114 114
115 115 def due_date_distance_in_words(date)
116 116 if date
117 117 l((date < Date.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(Date.today, date))
118 118 end
119 119 end
120 120
121 121 # Truncates and returns the string as a single line
122 122 def truncate_single_line(string, *args)
123 123 truncate(string, *args).gsub(%r{[\r\n]+}m, ' ')
124 124 end
125 125
126 126 def html_hours(text)
127 127 text.gsub(%r{(\d+)\.(\d+)}, '<span class="hours hours-int">\1</span><span class="hours hours-dec">.\2</span>')
128 128 end
129 129
130 130 def authoring(created, author)
131 131 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created))
132 132 author_tag = (author.is_a?(User) && !author.anonymous?) ? link_to(h(author), :controller => 'account', :action => 'show', :id => author) : h(author || 'Anonymous')
133 133 l(:label_added_time_by, author_tag, time_tag)
134 134 end
135 135
136 136 def l_or_humanize(s, options={})
137 137 k = "#{options[:prefix]}#{s}".to_sym
138 138 l_has_string?(k) ? l(k) : s.to_s.humanize
139 139 end
140 140
141 141 def day_name(day)
142 142 l(:general_day_names).split(',')[day-1]
143 143 end
144 144
145 145 def month_name(month)
146 146 l(:actionview_datehelper_select_month_names).split(',')[month-1]
147 147 end
148 148
149 149 def syntax_highlight(name, content)
150 150 type = CodeRay::FileType[name]
151 151 type ? CodeRay.scan(content, type).html : h(content)
152 152 end
153 153
154 154 def to_path_param(path)
155 155 path.to_s.split(%r{[/\\]}).select {|p| !p.blank?}
156 156 end
157 157
158 158 def pagination_links_full(paginator, count=nil, options={})
159 159 page_param = options.delete(:page_param) || :page
160 160 url_param = params.dup
161 161 # don't reuse params if filters are present
162 162 url_param.clear if url_param.has_key?(:set_filter)
163 163
164 164 html = ''
165 165 html << link_to_remote(('&#171; ' + l(:label_previous)),
166 166 {:update => 'content',
167 167 :url => url_param.merge(page_param => paginator.current.previous),
168 168 :complete => 'window.scrollTo(0,0)'},
169 169 {:href => url_for(:params => url_param.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
170 170
171 171 html << (pagination_links_each(paginator, options) do |n|
172 172 link_to_remote(n.to_s,
173 173 {:url => {:params => url_param.merge(page_param => n)},
174 174 :update => 'content',
175 175 :complete => 'window.scrollTo(0,0)'},
176 176 {:href => url_for(:params => url_param.merge(page_param => n))})
177 177 end || '')
178 178
179 179 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
180 180 {:update => 'content',
181 181 :url => url_param.merge(page_param => paginator.current.next),
182 182 :complete => 'window.scrollTo(0,0)'},
183 183 {:href => url_for(:params => url_param.merge(page_param => paginator.current.next))}) if paginator.current.next
184 184
185 185 unless count.nil?
186 186 html << [" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})", per_page_links(paginator.items_per_page)].compact.join(' | ')
187 187 end
188 188
189 189 html
190 190 end
191 191
192 192 def per_page_links(selected=nil)
193 193 url_param = params.dup
194 194 url_param.clear if url_param.has_key?(:set_filter)
195 195
196 196 links = Setting.per_page_options_array.collect do |n|
197 197 n == selected ? n : link_to_remote(n, {:update => "content", :url => params.dup.merge(:per_page => n)},
198 198 {:href => url_for(url_param.merge(:per_page => n))})
199 199 end
200 200 links.size > 1 ? l(:label_display_per_page, links.join(', ')) : nil
201 201 end
202 202
203 203 def breadcrumb(*args)
204 204 elements = args.flatten
205 205 elements.any? ? content_tag('p', args.join(' &#187; ') + ' &#187; ', :class => 'breadcrumb') : nil
206 206 end
207 207
208 208 def html_title(*args)
209 209 if args.empty?
210 210 title = []
211 211 title << @project.name if @project
212 212 title += @html_title if @html_title
213 213 title << Setting.app_title
214 214 title.compact.join(' - ')
215 215 else
216 216 @html_title ||= []
217 217 @html_title += args
218 218 end
219 219 end
220 220
221 221 def accesskey(s)
222 222 Redmine::AccessKeys.key_for s
223 223 end
224 224
225 225 # Formats text according to system settings.
226 226 # 2 ways to call this method:
227 227 # * with a String: textilizable(text, options)
228 228 # * with an object and one of its attribute: textilizable(issue, :description, options)
229 229 def textilizable(*args)
230 230 options = args.last.is_a?(Hash) ? args.pop : {}
231 231 case args.size
232 232 when 1
233 233 obj = options[:object]
234 234 text = args.shift
235 235 when 2
236 236 obj = args.shift
237 237 text = obj.send(args.shift).to_s
238 238 else
239 239 raise ArgumentError, 'invalid arguments to textilizable'
240 240 end
241 241 return '' if text.blank?
242 242
243 243 only_path = options.delete(:only_path) == false ? false : true
244 244
245 245 # when using an image link, try to use an attachment, if possible
246 246 attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
247 247
248 248 if attachments
249 249 attachments = attachments.sort_by(&:created_on).reverse
250 250 text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(bmp|gif|jpg|jpeg|png))!/i) do |m|
251 251 style = $1
252 252 filename = $6
253 253 rf = Regexp.new(Regexp.escape(filename), Regexp::IGNORECASE)
254 254 # search for the picture in attachments
255 255 if found = attachments.detect { |att| att.filename =~ rf }
256 256 image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
257 257 desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
258 258 alt = desc.blank? ? nil : "(#{desc})"
259 259 "!#{style}#{image_url}#{alt}!"
260 260 else
261 261 "!#{style}#{filename}!"
262 262 end
263 263 end
264 264 end
265 265
266 266 text = Redmine::WikiFormatting.to_html(Setting.text_formatting, text) { |macro, args| exec_macro(macro, obj, args) }
267 267
268 268 # different methods for formatting wiki links
269 269 case options[:wiki_links]
270 270 when :local
271 271 # used for local links to html files
272 272 format_wiki_link = Proc.new {|project, title, anchor| "#{title}.html" }
273 273 when :anchor
274 274 # used for single-file wiki export
275 275 format_wiki_link = Proc.new {|project, title, anchor| "##{title}" }
276 276 else
277 277 format_wiki_link = Proc.new {|project, title, anchor| url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => project, :page => title, :anchor => anchor) }
278 278 end
279 279
280 280 project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
281 281
282 282 # Wiki links
283 283 #
284 284 # Examples:
285 285 # [[mypage]]
286 286 # [[mypage|mytext]]
287 287 # wiki links can refer other project wikis, using project name or identifier:
288 288 # [[project:]] -> wiki starting page
289 289 # [[project:|mytext]]
290 290 # [[project:mypage]]
291 291 # [[project:mypage|mytext]]
292 292 text = text.gsub(/(!)?(\[\[([^\]\n\|]+)(\|([^\]\n\|]+))?\]\])/) do |m|
293 293 link_project = project
294 294 esc, all, page, title = $1, $2, $3, $5
295 295 if esc.nil?
296 296 if page =~ /^([^\:]+)\:(.*)$/
297 297 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
298 298 page = $2
299 299 title ||= $1 if page.blank?
300 300 end
301 301
302 302 if link_project && link_project.wiki
303 303 # extract anchor
304 304 anchor = nil
305 305 if page =~ /^(.+?)\#(.+)$/
306 306 page, anchor = $1, $2
307 307 end
308 308 # check if page exists
309 309 wiki_page = link_project.wiki.find_page(page)
310 310 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page), anchor),
311 311 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
312 312 else
313 313 # project or wiki doesn't exist
314 314 title || page
315 315 end
316 316 else
317 317 all
318 318 end
319 319 end
320 320
321 321 # Redmine links
322 322 #
323 323 # Examples:
324 324 # Issues:
325 325 # #52 -> Link to issue #52
326 326 # Changesets:
327 327 # r52 -> Link to revision 52
328 328 # commit:a85130f -> Link to scmid starting with a85130f
329 329 # Documents:
330 330 # document#17 -> Link to document with id 17
331 331 # document:Greetings -> Link to the document with title "Greetings"
332 332 # document:"Some document" -> Link to the document with title "Some document"
333 333 # Versions:
334 334 # version#3 -> Link to version with id 3
335 335 # version:1.0.0 -> Link to version named "1.0.0"
336 336 # version:"1.0 beta 2" -> Link to version named "1.0 beta 2"
337 337 # Attachments:
338 338 # attachment:file.zip -> Link to the attachment of the current object named file.zip
339 339 # Source files:
340 340 # source:some/file -> Link to the file located at /some/file in the project's repository
341 341 # source:some/file@52 -> Link to the file's revision 52
342 342 # source:some/file#L120 -> Link to line 120 of the file
343 343 # source:some/file@52#L120 -> Link to line 120 of the file's revision 52
344 344 # export:some/file -> Force the download of the file
345 345 # Forum messages:
346 346 # message#1218 -> Link to message with id 1218
347 347 text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export|message)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|\s|<|$)}) do |m|
348 348 leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
349 349 link = nil
350 350 if esc.nil?
351 351 if prefix.nil? && sep == 'r'
352 352 if project && (changeset = project.changesets.find_by_revision(oid))
353 353 link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
354 354 :class => 'changeset',
355 355 :title => truncate_single_line(changeset.comments, 100))
356 356 end
357 357 elsif sep == '#'
358 358 oid = oid.to_i
359 359 case prefix
360 360 when nil
361 361 if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
362 362 link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid},
363 363 :class => (issue.closed? ? 'issue closed' : 'issue'),
364 364 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
365 365 link = content_tag('del', link) if issue.closed?
366 366 end
367 367 when 'document'
368 368 if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
369 369 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
370 370 :class => 'document'
371 371 end
372 372 when 'version'
373 373 if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
374 374 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
375 375 :class => 'version'
376 376 end
377 377 when 'message'
378 378 if message = Message.find_by_id(oid, :include => [:parent, {:board => :project}], :conditions => Project.visible_by(User.current))
379 379 link = link_to h(truncate(message.subject, 60)), {:only_path => only_path,
380 380 :controller => 'messages',
381 381 :action => 'show',
382 382 :board_id => message.board,
383 383 :id => message.root,
384 384 :anchor => (message.parent ? "message-#{message.id}" : nil)},
385 385 :class => 'message'
386 386 end
387 387 end
388 388 elsif sep == ':'
389 389 # removes the double quotes if any
390 390 name = oid.gsub(%r{^"(.*)"$}, "\\1")
391 391 case prefix
392 392 when 'document'
393 393 if project && document = project.documents.find_by_title(name)
394 394 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
395 395 :class => 'document'
396 396 end
397 397 when 'version'
398 398 if project && version = project.versions.find_by_name(name)
399 399 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
400 400 :class => 'version'
401 401 end
402 402 when 'commit'
403 403 if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
404 404 link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
405 405 :class => 'changeset',
406 406 :title => truncate_single_line(changeset.comments, 100)
407 407 end
408 408 when 'source', 'export'
409 409 if project && project.repository
410 410 name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
411 411 path, rev, anchor = $1, $3, $5
412 412 link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project,
413 413 :path => to_path_param(path),
414 414 :rev => rev,
415 415 :anchor => anchor,
416 416 :format => (prefix == 'export' ? 'raw' : nil)},
417 417 :class => (prefix == 'export' ? 'source download' : 'source')
418 418 end
419 419 when 'attachment'
420 420 if attachments && attachment = attachments.detect {|a| a.filename == name }
421 421 link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
422 422 :class => 'attachment'
423 423 end
424 424 end
425 425 end
426 426 end
427 427 leading + (link || "#{prefix}#{sep}#{oid}")
428 428 end
429 429
430 430 text
431 431 end
432 432
433 433 # Same as Rails' simple_format helper without using paragraphs
434 434 def simple_format_without_paragraph(text)
435 435 text.to_s.
436 436 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
437 437 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
438 438 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
439 439 end
440 440
441 441 def error_messages_for(object_name, options = {})
442 442 options = options.symbolize_keys
443 443 object = instance_variable_get("@#{object_name}")
444 444 if object && !object.errors.empty?
445 445 # build full_messages here with controller current language
446 446 full_messages = []
447 447 object.errors.each do |attr, msg|
448 448 next if msg.nil?
449 449 msg = msg.first if msg.is_a? Array
450 450 if attr == "base"
451 451 full_messages << l(msg)
452 452 else
453 453 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
454 454 end
455 455 end
456 456 # retrieve custom values error messages
457 457 if object.errors[:custom_values]
458 458 object.custom_values.each do |v|
459 459 v.errors.each do |attr, msg|
460 460 next if msg.nil?
461 461 msg = msg.first if msg.is_a? Array
462 462 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
463 463 end
464 464 end
465 465 end
466 466 content_tag("div",
467 467 content_tag(
468 468 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
469 469 ) +
470 470 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
471 471 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
472 472 )
473 473 else
474 474 ""
475 475 end
476 476 end
477 477
478 478 def lang_options_for_select(blank=true)
479 479 (blank ? [["(auto)", ""]] : []) +
480 480 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.last <=> y.last }
481 481 end
482 482
483 483 def label_tag_for(name, option_tags = nil, options = {})
484 484 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
485 485 content_tag("label", label_text)
486 486 end
487 487
488 488 def labelled_tabular_form_for(name, object, options, &proc)
489 489 options[:html] ||= {}
490 490 options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)
491 491 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
492 492 end
493 493
494 494 def back_url_hidden_field_tag
495 495 back_url = params[:back_url] || request.env['HTTP_REFERER']
496 496 hidden_field_tag('back_url', back_url) unless back_url.blank?
497 497 end
498 498
499 499 def check_all_links(form_name)
500 500 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
501 501 " | " +
502 502 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
503 503 end
504 504
505 505 def progress_bar(pcts, options={})
506 506 pcts = [pcts, pcts] unless pcts.is_a?(Array)
507 507 pcts[1] = pcts[1] - pcts[0]
508 508 pcts << (100 - pcts[1] - pcts[0])
509 509 width = options[:width] || '100px;'
510 510 legend = options[:legend] || ''
511 511 content_tag('table',
512 512 content_tag('tr',
513 513 (pcts[0] > 0 ? content_tag('td', '', :width => "#{pcts[0].floor}%;", :class => 'closed') : '') +
514 514 (pcts[1] > 0 ? content_tag('td', '', :width => "#{pcts[1].floor}%;", :class => 'done') : '') +
515 515 (pcts[2] > 0 ? content_tag('td', '', :width => "#{pcts[2].floor}%;", :class => 'todo') : '')
516 516 ), :class => 'progress', :style => "width: #{width};") +
517 517 content_tag('p', legend, :class => 'pourcent')
518 518 end
519 519
520 520 def context_menu_link(name, url, options={})
521 521 options[:class] ||= ''
522 522 if options.delete(:selected)
523 523 options[:class] << ' icon-checked disabled'
524 524 options[:disabled] = true
525 525 end
526 526 if options.delete(:disabled)
527 527 options.delete(:method)
528 528 options.delete(:confirm)
529 529 options.delete(:onclick)
530 530 options[:class] << ' disabled'
531 531 url = '#'
532 532 end
533 533 link_to name, url, options
534 534 end
535 535
536 536 def calendar_for(field_id)
537 537 include_calendar_headers_tags
538 538 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
539 539 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
540 540 end
541 541
542 542 def include_calendar_headers_tags
543 543 unless @calendar_headers_tags_included
544 544 @calendar_headers_tags_included = true
545 545 content_for :header_tags do
546 546 javascript_include_tag('calendar/calendar') +
547 547 javascript_include_tag("calendar/lang/calendar-#{current_language}.js") +
548 548 javascript_include_tag('calendar/calendar-setup') +
549 549 stylesheet_link_tag('calendar')
550 550 end
551 551 end
552 552 end
553 553
554 554 def content_for(name, content = nil, &block)
555 555 @has_content ||= {}
556 556 @has_content[name] = true
557 557 super(name, content, &block)
558 558 end
559 559
560 560 def has_content?(name)
561 561 (@has_content && @has_content[name]) || false
562 562 end
563 563
564 def gravatar_for_mail(mail, options = { })
565 if Setting.gravatar_enabled?
566 return gravatar(mail, options) rescue nil
567 end
568 end
569
564 570 private
565 571
566 572 def wiki_helper
567 573 helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting)
568 574 extend helper
569 575 return self
570 576 end
571 577 end
@@ -1,32 +1,32
1 1 <div class="contextual">
2 2 <%= link_to(l(:button_edit), {:controller => 'users', :action => 'edit', :id => @user}, :class => 'icon icon-edit') if User.current.admin? %>
3 3 </div>
4 4
5 <h2><%= gravatar @user.mail unless @user.mail.empty? %> <%=h @user.name %></h2>
5 <h2><%= gravatar_for_mail @user.mail unless @user.mail.empty? %> <%=h @user.name %></h2>
6 6
7 7 <p>
8 8 <%= mail_to(h(@user.mail)) unless @user.pref.hide_mail %>
9 9 <ul>
10 10 <li><%=l(:label_registered_on)%>: <%= format_date(@user.created_on) %></li>
11 11 <% for custom_value in @custom_values %>
12 12 <% if !custom_value.value.empty? %>
13 13 <li><%= custom_value.custom_field.name%>: <%=h show_value(custom_value) %></li>
14 14 <% end %>
15 15 <% end %>
16 16 </ul>
17 17 </p>
18 18
19 19 <% unless @memberships.empty? %>
20 20 <h3><%=l(:label_project_plural)%></h3>
21 21 <ul>
22 22 <% for membership in @memberships %>
23 23 <li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
24 24 (<%=h membership.role.name %>, <%= format_date(membership.created_on) %>)</li>
25 25 <% end %>
26 26 </ul>
27 27 <% end %>
28 28
29 29 <h3><%=l(:label_activity)%></h3>
30 30 <p>
31 31 <%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
32 </p> No newline at end of file
32 </p>
@@ -1,15 +1,15
1 1 <% reply_links = authorize_for('issues', 'edit') -%>
2 2 <% for journal in journals %>
3 3 <div id="change-<%= journal.id %>" class="journal">
4 4 <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
5 5 <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
6 6 <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
7 <%= gravatar(journal.user.mail.blank? ? "" : journal.user.mail, :size => "32") %>
7 <%= gravatar_for_mail(journal.user.mail.blank? ? "" : journal.user.mail, :size => "32") %>
8 8 <ul>
9 9 <% for detail in journal.details %>
10 10 <li><%= show_detail(detail) %></li>
11 11 <% end %>
12 12 </ul>
13 13 <%= render_notes(journal, :reply_links => reply_links) unless journal.notes.blank? %>
14 14 </div>
15 15 <% end %>
@@ -1,128 +1,128
1 1 <div class="contextual">
2 2 <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
3 3 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
4 4 <%= watcher_tag(@issue, User.current) %>
5 5 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
6 6 <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
7 7 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
8 8 </div>
9 9
10 10 <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
11 11
12 12 <div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>">
13 <%= gravatar(@issue.author.mail, :size => "64") rescue nil %>
13 <%= gravatar_for_mail(@issue.author.mail, :size => "64") %>
14 14 <h3><%=h @issue.subject %></h3>
15 15 <p class="author">
16 16 <%= authoring @issue.created_on, @issue.author %>.
17 17 <%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
18 18 </p>
19 19
20 20 <table width="100%">
21 21 <tr>
22 22 <td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status status-<%= @issue.status.name %>"><%= @issue.status.name %></td>
23 23 <td style="width:15%" class="start-date"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
24 24 </tr>
25 25 <tr>
26 26 <td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority priority-<%= @issue.priority.name %>"><%= @issue.priority.name %></td>
27 27 <td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
28 28 </tr>
29 29 <tr>
30 <td class="assigned-to"><b><%=l(:field_assigned_to)%>:</b></td><td><%= gravatar(@issue.assigned_to.mail, :size => "14") unless @issue.assigned_to.blank?%><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
30 <td class="assigned-to"><b><%=l(:field_assigned_to)%>:</b></td><td><%= gravatar_for_mail(@issue.assigned_to.mail, :size => "14") unless @issue.assigned_to.blank?%><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
31 31 <td class="progress"><b><%=l(:field_done_ratio)%>:</b></td><td class="progress"><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td>
32 32 </tr>
33 33 <tr>
34 34 <td class="category"><b><%=l(:field_category)%>:</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
35 35 <% if User.current.allowed_to?(:view_time_entries, @project) %>
36 36 <td class="spent-time"><b><%=l(:label_spent_time)%>:</b></td>
37 37 <td class="spent-hours"><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
38 38 <% end %>
39 39 </tr>
40 40 <tr>
41 41 <td class="fixed-version"><b><%=l(:field_fixed_version)%>:</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
42 42 <% if @issue.estimated_hours %>
43 43 <td class="estimated-hours"><b><%=l(:field_estimated_hours)%>:</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td>
44 44 <% end %>
45 45 </tr>
46 46 <tr>
47 47 <% n = 0 -%>
48 48 <% @issue.custom_values.each do |value| -%>
49 49 <td valign="top"><b><%=h value.custom_field.name %>:</b></td><td valign="top"><%= simple_format(h(show_value(value))) %></td>
50 50 <% n = n + 1
51 51 if (n > 1)
52 52 n = 0 %>
53 53 </tr><tr>
54 54 <%end
55 55 end %>
56 56 </tr>
57 57 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
58 58 </table>
59 59 <hr />
60 60
61 61 <div class="contextual">
62 62 <%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment' %>
63 63 </div>
64 64
65 65 <p><strong><%=l(:field_description)%></strong></p>
66 66 <div class="wiki">
67 67 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
68 68 </div>
69 69
70 70 <% if @issue.attachments.any? %>
71 71 <%= link_to_attachments @issue.attachments, :delete_url => (authorize_for('issues', 'destroy_attachment') ? {:controller => 'issues', :action => 'destroy_attachment', :id => @issue} : nil) %>
72 72 <% end %>
73 73
74 74 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
75 75 <hr />
76 76 <div id="relations">
77 77 <%= render :partial => 'relations' %>
78 78 </div>
79 79 <% end %>
80 80
81 81 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
82 82 (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
83 83 <hr />
84 84 <div id="watchers">
85 85 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
86 86 </div>
87 87 <% end %>
88 88
89 89 </div>
90 90
91 91 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
92 92 <div id="issue-changesets">
93 93 <h3><%=l(:label_associated_revisions)%></h3>
94 94 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
95 95 </div>
96 96 <% end %>
97 97
98 98 <% if @journals.any? %>
99 99 <div id="history">
100 100 <h3><%=l(:label_history)%></h3>
101 101 <%= render :partial => 'history', :locals => { :journals => @journals } %>
102 102 </div>
103 103 <% end %>
104 104 <div style="clear: both;"></div>
105 105
106 106 <% if authorize_for('issues', 'edit') %>
107 107 <div id="update" style="display:none;">
108 108 <h3><%= l(:button_update) %></h3>
109 109 <%= render :partial => 'edit' %>
110 110 </div>
111 111 <% end %>
112 112
113 113 <p class="other-formats">
114 114 <%= l(:label_export_to) %>
115 115 <span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
116 116 <span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
117 117 </p>
118 118
119 119 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
120 120
121 121 <% content_for :sidebar do %>
122 122 <%= render :partial => 'issues/sidebar' %>
123 123 <% end %>
124 124
125 125 <% content_for :header_tags do %>
126 126 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
127 127 <%= stylesheet_link_tag 'scm' %>
128 128 <% end %>
@@ -1,61 +1,61
1 1 <h2><%= l(:label_activity) %></h2>
2 2 <p class="subtitle"><%= "#{l(:label_date_from)} #{format_date(@date_to - @days)} #{l(:label_date_to).downcase} #{format_date(@date_to-1)}" %></p>
3 3
4 4 <div id="activity">
5 5 <% @events_by_day.keys.sort.reverse.each do |day| %>
6 6 <h3><%= format_activity_day(day) %></h3>
7 7 <dl>
8 8 <% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
9 9 <dt class="<%= e.event_type %> <%= User.current.logged? && e.respond_to?(:event_author) && User.current == e.event_author ? 'me' : nil %>">
10 <%= gravatar(e.user.mail, :size => "24") if e.respond_to?(:user) rescue nil%>
11 <%= gravatar(e.author.mail, :size => "24") if e.respond_to?(:author) rescue nil%>
12 <%= gravatar(e.committer.match('\\<.+?\\>')[0].gsub(/[<>]/, ''), :size => "24") if e.respond_to?(:committer) rescue nil%>
10 <%= gravatar_for_mail(e.user.mail, :size => "24") if e.respond_to?(:user) %>
11 <%= gravatar_for_mail(e.author.mail, :size => "24") if e.respond_to?(:author) %>
12 <%= gravatar_for_mail(e.committer.match('\\<.+?\\>')[0].gsub(/[<>]/, ''), :size => "24") if e.respond_to?(:committer) rescue nil %>
13 13 <span class="time"><%= format_time(e.event_datetime, false) %></span>
14 14 <%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %>
15 15 <%= link_to format_activity_title(e.event_title), e.event_url %></dt>
16 16 <dd><span class="description"><%= format_activity_description(e.event_description) %></span>
17 17 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></dd>
18 18 <% end -%>
19 19 </dl>
20 20 <% end -%>
21 21 </div>
22 22
23 23 <%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %>
24 24
25 25 <div style="float:left;">
26 26 <%= link_to_remote(('&#171; ' + l(:label_previous)),
27 27 {:update => "content", :url => params.merge(:from => @date_to - @days), :complete => 'window.scrollTo(0,0)'},
28 28 {:href => url_for(params.merge(:from => @date_to - @days)),
29 29 :title => "#{l(:label_date_from)} #{format_date(@date_to - 2*@days)} #{l(:label_date_to).downcase} #{format_date(@date_to - @days - 1)}"}) %>
30 30 </div>
31 31 <div style="float:right;">
32 32 <%= link_to_remote((l(:label_next) + ' &#187;'),
33 33 {:update => "content", :url => params.merge(:from => @date_to + @days), :complete => 'window.scrollTo(0,0)'},
34 34 {:href => url_for(params.merge(:from => @date_to + @days)),
35 35 :title => "#{l(:label_date_from)} #{format_date(@date_to)} #{l(:label_date_to).downcase} #{format_date(@date_to + @days - 1)}"}) unless @date_to >= Date.today %>
36 36 </div>
37 37 &nbsp;
38 38 <p class="other-formats">
39 39 <%= l(:label_export_to) %>
40 40 <%= link_to 'Atom', params.merge(:format => :atom, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}, :class => 'feed' %>
41 41 </p>
42 42
43 43 <% content_for :header_tags do %>
44 44 <%= auto_discovery_link_tag(:atom, params.merge(:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key)) %>
45 45 <% end %>
46 46
47 47 <% content_for :sidebar do %>
48 48 <% form_tag({}, :method => :get) do %>
49 49 <h3><%= l(:label_activity) %></h3>
50 50 <p><% @activity.event_types.each do |t| %>
51 51 <label><%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
52 52 <% end %></p>
53 53 <% if @project && @project.active_children.any? %>
54 54 <p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
55 55 <%= hidden_field_tag 'with_subprojects', 0 %>
56 56 <% end %>
57 57 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
58 58 <% end %>
59 59 <% end %>
60 60
61 61 <% html_title(l(:label_activity)) -%>
@@ -1,52 +1,55
1 1 <% form_tag({:action => 'edit'}) do %>
2 2
3 3 <div class="box tabular settings">
4 4 <p><label><%= l(:setting_app_title) %></label>
5 5 <%= text_field_tag 'settings[app_title]', Setting.app_title, :size => 30 %></p>
6 6
7 7 <p><label><%= l(:setting_welcome_text) %></label>
8 8 <%= text_area_tag 'settings[welcome_text]', Setting.welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %></p>
9 9 <%= wikitoolbar_for 'settings[welcome_text]' %>
10 10
11 11 <p><label><%= l(:label_theme) %></label>
12 12 <%= select_tag 'settings[ui_theme]', options_for_select( ([[l(:label_default), '']] + Redmine::Themes.themes.collect {|t| [t.name, t.id]}), Setting.ui_theme) %></p>
13 13
14 14 <p><label><%= l(:setting_default_language) %></label>
15 15 <%= select_tag 'settings[default_language]', options_for_select( lang_options_for_select(false), Setting.default_language) %></p>
16 16
17 17 <p><label><%= l(:setting_date_format) %></label>
18 18 <%= select_tag 'settings[date_format]', options_for_select( [[l(:label_language_based), '']] + Setting::DATE_FORMATS.collect {|f| [Date.today.strftime(f), f]}, Setting.date_format) %></p>
19 19
20 20 <p><label><%= l(:setting_time_format) %></label>
21 21 <%= select_tag 'settings[time_format]', options_for_select( [[l(:label_language_based), '']] + Setting::TIME_FORMATS.collect {|f| [Time.now.strftime(f), f]}, Setting.time_format) %></p>
22 22
23 23 <p><label><%= l(:setting_user_format) %></label>
24 24 <%= select_tag 'settings[user_format]', options_for_select( @options[:user_format], Setting.user_format.to_s ) %></p>
25 25
26 26 <p><label><%= l(:setting_attachment_max_size) %></label>
27 27 <%= text_field_tag 'settings[attachment_max_size]', Setting.attachment_max_size, :size => 6 %> KB</p>
28 28
29 29 <p><label><%= l(:setting_per_page_options) %></label>
30 30 <%= text_field_tag 'settings[per_page_options]', Setting.per_page_options_array.join(', '), :size => 20 %><br /><em><%= l(:text_comma_separated) %></em></p>
31 31
32 32 <p><label><%= l(:setting_activity_days_default) %></label>
33 33 <%= text_field_tag 'settings[activity_days_default]', Setting.activity_days_default, :size => 6 %> <%= l(:label_day_plural) %></p>
34 34
35 35 <p><label><%= l(:setting_host_name) %></label>
36 36 <%= text_field_tag 'settings[host_name]', Setting.host_name, :size => 60 %></p>
37 37
38 38 <p><label><%= l(:setting_protocol) %></label>
39 39 <%= select_tag 'settings[protocol]', options_for_select(['http', 'https'], Setting.protocol) %></p>
40 40
41 41 <p><label><%= l(:setting_text_formatting) %></label>
42 42 <%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], *Redmine::WikiFormatting.format_names.collect{|name| [name, name]} ], Setting.text_formatting.to_sym) %></p>
43 43
44 44 <p><label><%= l(:setting_wiki_compression) %></label>
45 45 <%= select_tag 'settings[wiki_compression]', options_for_select( [[l(:label_none), 0], ["gzip", "gzip"]], Setting.wiki_compression) %></p>
46 46
47 47 <p><label><%= l(:setting_feeds_limit) %></label>
48 48 <%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
49
50 <p><label><%= l(:setting_gravatar_enabled) %></label>
51 <%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
49 52 </div>
50 53
51 54 <%= submit_tag l(:button_save) %>
52 55 <% end %>
@@ -1,47 +1,47
1 1 <div class="contextual">
2 2 <%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %>
3 3 </div>
4 4
5 5 <h2><%=l(:label_user_plural)%></h2>
6 6
7 7 <% form_tag({}, :method => :get) do %>
8 8 <fieldset><legend><%= l(:label_filter_plural) %></legend>
9 9 <label><%= l(:field_status) %>:</label>
10 10 <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
11 11 <label><%= l(:label_user) %>:</label>
12 12 <%= text_field_tag 'name', params[:name], :size => 30 %>
13 13 <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
14 14 </fieldset>
15 15 <% end %>
16 16 &nbsp;
17 17
18 18 <table class="list">
19 19 <thead><tr>
20 20 <%= sort_header_tag('login', :caption => l(:field_login)) %>
21 21 <%= sort_header_tag('firstname', :caption => l(:field_firstname)) %>
22 22 <%= sort_header_tag('lastname', :caption => l(:field_lastname)) %>
23 23 <%= sort_header_tag('mail', :caption => l(:field_mail)) %>
24 24 <%= sort_header_tag('admin', :caption => l(:field_admin), :default_order => 'desc') %>
25 25 <%= sort_header_tag('created_on', :caption => l(:field_created_on), :default_order => 'desc') %>
26 26 <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on), :default_order => 'desc') %>
27 27 <th></th>
28 28 </tr></thead>
29 29 <tbody>
30 30 <% for user in @users -%>
31 31 <tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
32 <td class="username"><%= gravatar(user.mail.blank? ? "" : user.mail, :size => "24") %><%= link_to h(user.login), :action => 'edit', :id => user %></td>
32 <td class="username"><%= gravatar_for_mail(user.mail.blank? ? "" : user.mail, :size => "24") %><%= link_to h(user.login), :action => 'edit', :id => user %></td>
33 33 <td class="firstname"><%= h(user.firstname) %></td>
34 34 <td class="lastname"><%= h(user.lastname) %></td>
35 35 <td class="email"><%= mail_to(h(user.mail)) %></td>
36 36 <td align="center"><%= image_tag('true.png') if user.admin? %></td>
37 37 <td class="created_on" align="center"><%= format_time(user.created_on) %></td>
38 38 <td class="last_login_on" align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
39 39 <td><small><%= change_status_link(user) %></small></td>
40 40 </tr>
41 41 <% end -%>
42 42 </tbody>
43 43 </table>
44 44
45 45 <p class="pagination"><%= pagination_links_full @user_pages, @user_count %></p>
46 46
47 47 <% html_title(l(:label_user_plural)) -%>
@@ -1,138 +1,139
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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
19 19 # DO NOT MODIFY THIS FILE !!!
20 20 # Settings can be defined through the application in Admin -> Settings
21 21
22 22 app_title:
23 23 default: Redmine
24 24 app_subtitle:
25 25 default: Project management
26 26 welcome_text:
27 27 default:
28 28 login_required:
29 29 default: 0
30 30 self_registration:
31 31 default: '2'
32 32 lost_password:
33 33 default: 1
34 34 attachment_max_size:
35 35 format: int
36 36 default: 5120
37 37 issues_export_limit:
38 38 format: int
39 39 default: 500
40 40 activity_days_default:
41 41 format: int
42 42 default: 30
43 43 per_page_options:
44 44 default: '25,50,100'
45 45 mail_from:
46 46 default: redmine@example.net
47 47 bcc_recipients:
48 48 default: 1
49 49 plain_text_mail:
50 50 default: 0
51 51 text_formatting:
52 52 default: textile
53 53 wiki_compression:
54 54 default: ""
55 55 default_language:
56 56 default: en
57 57 host_name:
58 58 default: localhost:3000
59 59 protocol:
60 60 default: http
61 61 feeds_limit:
62 62 format: int
63 63 default: 15
64 64 enabled_scm:
65 65 serialized: true
66 66 default:
67 67 - Subversion
68 68 - Darcs
69 69 - Mercurial
70 70 - Cvs
71 71 - Bazaar
72 72 - Git
73 73 autofetch_changesets:
74 74 default: 1
75 75 sys_api_enabled:
76 76 default: 0
77 77 commit_ref_keywords:
78 78 default: 'refs,references,IssueID'
79 79 commit_fix_keywords:
80 80 default: 'fixes,closes'
81 81 commit_fix_status_id:
82 82 format: int
83 83 default: 0
84 84 commit_fix_done_ratio:
85 85 default: 100
86 86 # autologin duration in days
87 87 # 0 means autologin is disabled
88 88 autologin:
89 89 format: int
90 90 default: 0
91 91 # date format
92 92 date_format:
93 93 default: ''
94 94 time_format:
95 95 default: ''
96 96 user_format:
97 97 default: :firstname_lastname
98 98 format: symbol
99 99 cross_project_issue_relations:
100 100 default: 0
101 101 notified_events:
102 102 serialized: true
103 103 default:
104 104 - issue_added
105 105 - issue_updated
106 106 mail_handler_api_enabled:
107 107 default: 0
108 108 mail_handler_api_key:
109 109 default:
110 110 issue_list_default_columns:
111 111 serialized: true
112 112 default:
113 113 - tracker
114 114 - status
115 115 - priority
116 116 - subject
117 117 - assigned_to
118 118 - updated_on
119 119 display_subprojects_issues:
120 120 default: 1
121 121 default_projects_public:
122 122 default: 1
123 123 sequential_project_identifiers:
124 124 default: 0
125 125 # encodings used to convert repository files content to UTF-8
126 126 # multiple values accepted, comma separated
127 127 repositories_encodings:
128 128 default: ''
129 129 # encoding used to convert commit logs to UTF-8
130 130 commit_logs_encoding:
131 131 default: 'UTF-8'
132 132 ui_theme:
133 133 default: ''
134 134 emails_footer:
135 135 default: |-
136 136 You have received this notification because you have either subscribed to it, or are involved in it.
137 137 To change your notification preferences, please click here: http://hostname/my/account
138
138 gravatar_enabled:
139 default: 0
@@ -1,691 +1,692
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: is not a valid date
35 35 activerecord_error_greater_than_start_date: must be greater than start date
36 36 activerecord_error_not_same_project: doesn't belong to the same project
37 37 activerecord_error_circular_dependency: This relation would create a circular dependency
38 38
39 39 general_fmt_age: %d yr
40 40 general_fmt_age_plural: %d yrs
41 41 general_fmt_date: %%m/%%d/%%Y
42 42 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
43 43 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
44 44 general_fmt_time: %%I:%%M %%p
45 45 general_text_No: 'No'
46 46 general_text_Yes: 'Yes'
47 47 general_text_no: 'no'
48 48 general_text_yes: 'yes'
49 49 general_lang_name: 'English'
50 50 general_csv_separator: ','
51 51 general_csv_decimal_separator: '.'
52 52 general_csv_encoding: ISO-8859-1
53 53 general_pdf_encoding: ISO-8859-1
54 54 general_day_names: Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
55 55 general_first_day_of_week: '7'
56 56
57 57 notice_account_updated: Account was successfully updated.
58 58 notice_account_invalid_creditentials: Invalid user or password
59 59 notice_account_password_updated: Password was successfully updated.
60 60 notice_account_wrong_password: Wrong password
61 61 notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you.
62 62 notice_account_unknown_email: Unknown user.
63 63 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
64 64 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
65 65 notice_account_activated: Your account has been activated. You can now log in.
66 66 notice_successful_create: Successful creation.
67 67 notice_successful_update: Successful update.
68 68 notice_successful_delete: Successful deletion.
69 69 notice_successful_connection: Successful connection.
70 70 notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
71 71 notice_locking_conflict: Data has been updated by another user.
72 72 notice_not_authorized: You are not authorized to access this page.
73 73 notice_email_sent: An email was sent to %s
74 74 notice_email_error: An error occurred while sending mail (%s)
75 75 notice_feeds_access_key_reseted: Your RSS access key was reset.
76 76 notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
77 77 notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
78 78 notice_account_pending: "Your account was created and is now pending administrator approval."
79 79 notice_default_data_loaded: Default configuration successfully loaded.
80 80 notice_unable_delete_version: Unable to delete version.
81 81
82 82 error_can_t_load_default_data: "Default configuration could not be loaded: %s"
83 83 error_scm_not_found: "The entry or revision was not found in the repository."
84 84 error_scm_command_failed: "An error occurred when trying to access the repository: %s"
85 85 error_scm_annotate: "The entry does not exist or can not be annotated."
86 86 error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
87 87
88 88 mail_subject_lost_password: Your %s password
89 89 mail_body_lost_password: 'To change your password, click on the following link:'
90 90 mail_subject_register: Your %s account activation
91 91 mail_body_register: 'To activate your account, click on the following link:'
92 92 mail_body_account_information_external: You can use your "%s" account to log in.
93 93 mail_body_account_information: Your account information
94 94 mail_subject_account_activation_request: %s account activation request
95 95 mail_body_account_activation_request: 'A new user (%s) has registered. The account is pending your approval:'
96 96 mail_subject_reminder: "%d issue(s) due in the next days"
97 97 mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
98 98
99 99 gui_validation_error: 1 error
100 100 gui_validation_error_plural: %d errors
101 101
102 102 field_name: Name
103 103 field_description: Description
104 104 field_summary: Summary
105 105 field_is_required: Required
106 106 field_firstname: Firstname
107 107 field_lastname: Lastname
108 108 field_mail: Email
109 109 field_filename: File
110 110 field_filesize: Size
111 111 field_downloads: Downloads
112 112 field_author: Author
113 113 field_created_on: Created
114 114 field_updated_on: Updated
115 115 field_field_format: Format
116 116 field_is_for_all: For all projects
117 117 field_possible_values: Possible values
118 118 field_regexp: Regular expression
119 119 field_min_length: Minimum length
120 120 field_max_length: Maximum length
121 121 field_value: Value
122 122 field_category: Category
123 123 field_title: Title
124 124 field_project: Project
125 125 field_issue: Issue
126 126 field_status: Status
127 127 field_notes: Notes
128 128 field_is_closed: Issue closed
129 129 field_is_default: Default value
130 130 field_tracker: Tracker
131 131 field_subject: Subject
132 132 field_due_date: Due date
133 133 field_assigned_to: Assigned to
134 134 field_priority: Priority
135 135 field_fixed_version: Target version
136 136 field_user: User
137 137 field_role: Role
138 138 field_homepage: Homepage
139 139 field_is_public: Public
140 140 field_parent: Subproject of
141 141 field_is_in_chlog: Issues displayed in changelog
142 142 field_is_in_roadmap: Issues displayed in roadmap
143 143 field_login: Login
144 144 field_mail_notification: Email notifications
145 145 field_admin: Administrator
146 146 field_last_login_on: Last connection
147 147 field_language: Language
148 148 field_effective_date: Date
149 149 field_password: Password
150 150 field_new_password: New password
151 151 field_password_confirmation: Confirmation
152 152 field_version: Version
153 153 field_type: Type
154 154 field_host: Host
155 155 field_port: Port
156 156 field_account: Account
157 157 field_base_dn: Base DN
158 158 field_attr_login: Login attribute
159 159 field_attr_firstname: Firstname attribute
160 160 field_attr_lastname: Lastname attribute
161 161 field_attr_mail: Email attribute
162 162 field_onthefly: On-the-fly user creation
163 163 field_start_date: Start
164 164 field_done_ratio: %% Done
165 165 field_auth_source: Authentication mode
166 166 field_hide_mail: Hide my email address
167 167 field_comments: Comment
168 168 field_url: URL
169 169 field_start_page: Start page
170 170 field_subproject: Subproject
171 171 field_hours: Hours
172 172 field_activity: Activity
173 173 field_spent_on: Date
174 174 field_identifier: Identifier
175 175 field_is_filter: Used as a filter
176 176 field_issue_to_id: Related issue
177 177 field_delay: Delay
178 178 field_assignable: Issues can be assigned to this role
179 179 field_redirect_existing_links: Redirect existing links
180 180 field_estimated_hours: Estimated time
181 181 field_column_names: Columns
182 182 field_time_zone: Time zone
183 183 field_searchable: Searchable
184 184 field_default_value: Default value
185 185 field_comments_sorting: Display comments
186 186 field_parent_title: Parent page
187 187
188 188 setting_app_title: Application title
189 189 setting_app_subtitle: Application subtitle
190 190 setting_welcome_text: Welcome text
191 191 setting_default_language: Default language
192 192 setting_login_required: Authentication required
193 193 setting_self_registration: Self-registration
194 194 setting_attachment_max_size: Attachment max. size
195 195 setting_issues_export_limit: Issues export limit
196 196 setting_mail_from: Emission email address
197 197 setting_bcc_recipients: Blind carbon copy recipients (bcc)
198 198 setting_plain_text_mail: plain text mail (no HTML)
199 199 setting_host_name: Host name
200 200 setting_text_formatting: Text formatting
201 201 setting_wiki_compression: Wiki history compression
202 202 setting_feeds_limit: Feed content limit
203 203 setting_default_projects_public: New projects are public by default
204 204 setting_autofetch_changesets: Autofetch commits
205 205 setting_sys_api_enabled: Enable WS for repository management
206 206 setting_commit_ref_keywords: Referencing keywords
207 207 setting_commit_fix_keywords: Fixing keywords
208 208 setting_autologin: Autologin
209 209 setting_date_format: Date format
210 210 setting_time_format: Time format
211 211 setting_cross_project_issue_relations: Allow cross-project issue relations
212 212 setting_issue_list_default_columns: Default columns displayed on the issue list
213 213 setting_repositories_encodings: Repositories encodings
214 214 setting_commit_logs_encoding: Commit messages encoding
215 215 setting_emails_footer: Emails footer
216 216 setting_protocol: Protocol
217 217 setting_per_page_options: Objects per page options
218 218 setting_user_format: Users display format
219 219 setting_activity_days_default: Days displayed on project activity
220 220 setting_display_subprojects_issues: Display subprojects issues on main projects by default
221 221 setting_enabled_scm: Enabled SCM
222 222 setting_mail_handler_api_enabled: Enable WS for incoming emails
223 223 setting_mail_handler_api_key: API key
224 224 setting_sequential_project_identifiers: Generate sequential project identifiers
225 setting_gravatar_enabled: Use Gravatar user icons
225 226
226 227 permission_edit_project: Edit project
227 228 permission_select_project_modules: Select project modules
228 229 permission_manage_members: Manage members
229 230 permission_manage_versions: Manage versions
230 231 permission_manage_categories: Manage issue categories
231 232 permission_add_issues: Add issues
232 233 permission_edit_issues: Edit issues
233 234 permission_manage_issue_relations: Manage issue relations
234 235 permission_add_issue_notes: Add notes
235 236 permission_edit_issue_notes: Edit notes
236 237 permission_edit_own_issue_notes: Edit own notes
237 238 permission_move_issues: Move issues
238 239 permission_delete_issues: Delete issues
239 240 permission_manage_public_queries: Manage public queries
240 241 permission_save_queries: Save queries
241 242 permission_view_gantt: View gantt chart
242 243 permission_view_calendar: View calender
243 244 permission_view_issue_watchers: View watchers list
244 245 permission_add_issue_watchers: Add watchers
245 246 permission_log_time: Log spent time
246 247 permission_view_time_entries: View spent time
247 248 permission_edit_time_entries: Edit time logs
248 249 permission_edit_own_time_entries: Edit own time logs
249 250 permission_manage_news: Manage news
250 251 permission_comment_news: Comment news
251 252 permission_manage_documents: Manage documents
252 253 permission_view_documents: View documents
253 254 permission_manage_files: Manage files
254 255 permission_view_files: View files
255 256 permission_manage_wiki: Manage wiki
256 257 permission_rename_wiki_pages: Rename wiki pages
257 258 permission_delete_wiki_pages: Delete wiki pages
258 259 permission_view_wiki_pages: View wiki
259 260 permission_view_wiki_edits: View wiki history
260 261 permission_edit_wiki_pages: Edit wiki pages
261 262 permission_delete_wiki_pages_attachments: Delete attachments
262 263 permission_protect_wiki_pages: Protect wiki pages
263 264 permission_manage_repository: Manage repository
264 265 permission_browse_repository: Browse repository
265 266 permission_view_changesets: View changesets
266 267 permission_commit_access: Commit access
267 268 permission_manage_boards: Manage boards
268 269 permission_view_messages: View messages
269 270 permission_add_messages: Post messages
270 271 permission_edit_messages: Edit messages
271 272 permission_delete_messages: Delete messages
272 273
273 274 project_module_issue_tracking: Issue tracking
274 275 project_module_time_tracking: Time tracking
275 276 project_module_news: News
276 277 project_module_documents: Documents
277 278 project_module_files: Files
278 279 project_module_wiki: Wiki
279 280 project_module_repository: Repository
280 281 project_module_boards: Boards
281 282
282 283 label_user: User
283 284 label_user_plural: Users
284 285 label_user_new: New user
285 286 label_project: Project
286 287 label_project_new: New project
287 288 label_project_plural: Projects
288 289 label_project_all: All Projects
289 290 label_project_latest: Latest projects
290 291 label_issue: Issue
291 292 label_issue_new: New issue
292 293 label_issue_plural: Issues
293 294 label_issue_view_all: View all issues
294 295 label_issues_by: Issues by %s
295 296 label_issue_added: Issue added
296 297 label_issue_updated: Issue updated
297 298 label_document: Document
298 299 label_document_new: New document
299 300 label_document_plural: Documents
300 301 label_document_added: Document added
301 302 label_role: Role
302 303 label_role_plural: Roles
303 304 label_role_new: New role
304 305 label_role_and_permissions: Roles and permissions
305 306 label_member: Member
306 307 label_member_new: New member
307 308 label_member_plural: Members
308 309 label_tracker: Tracker
309 310 label_tracker_plural: Trackers
310 311 label_tracker_new: New tracker
311 312 label_workflow: Workflow
312 313 label_issue_status: Issue status
313 314 label_issue_status_plural: Issue statuses
314 315 label_issue_status_new: New status
315 316 label_issue_category: Issue category
316 317 label_issue_category_plural: Issue categories
317 318 label_issue_category_new: New category
318 319 label_custom_field: Custom field
319 320 label_custom_field_plural: Custom fields
320 321 label_custom_field_new: New custom field
321 322 label_enumerations: Enumerations
322 323 label_enumeration_new: New value
323 324 label_information: Information
324 325 label_information_plural: Information
325 326 label_please_login: Please log in
326 327 label_register: Register
327 328 label_password_lost: Lost password
328 329 label_home: Home
329 330 label_my_page: My page
330 331 label_my_account: My account
331 332 label_my_projects: My projects
332 333 label_administration: Administration
333 334 label_login: Sign in
334 335 label_logout: Sign out
335 336 label_help: Help
336 337 label_reported_issues: Reported issues
337 338 label_assigned_to_me_issues: Issues assigned to me
338 339 label_last_login: Last connection
339 340 label_last_updates: Last updated
340 341 label_last_updates_plural: %d last updated
341 342 label_registered_on: Registered on
342 343 label_activity: Activity
343 344 label_overall_activity: Overall activity
344 345 label_new: New
345 346 label_logged_as: Logged in as
346 347 label_environment: Environment
347 348 label_authentication: Authentication
348 349 label_auth_source: Authentication mode
349 350 label_auth_source_new: New authentication mode
350 351 label_auth_source_plural: Authentication modes
351 352 label_subproject_plural: Subprojects
352 353 label_and_its_subprojects: %s and its subprojects
353 354 label_min_max_length: Min - Max length
354 355 label_list: List
355 356 label_date: Date
356 357 label_integer: Integer
357 358 label_float: Float
358 359 label_boolean: Boolean
359 360 label_string: Text
360 361 label_text: Long text
361 362 label_attribute: Attribute
362 363 label_attribute_plural: Attributes
363 364 label_download: %d Download
364 365 label_download_plural: %d Downloads
365 366 label_no_data: No data to display
366 367 label_change_status: Change status
367 368 label_history: History
368 369 label_attachment: File
369 370 label_attachment_new: New file
370 371 label_attachment_delete: Delete file
371 372 label_attachment_plural: Files
372 373 label_file_added: File added
373 374 label_report: Report
374 375 label_report_plural: Reports
375 376 label_news: News
376 377 label_news_new: Add news
377 378 label_news_plural: News
378 379 label_news_latest: Latest news
379 380 label_news_view_all: View all news
380 381 label_news_added: News added
381 382 label_change_log: Change log
382 383 label_settings: Settings
383 384 label_overview: Overview
384 385 label_version: Version
385 386 label_version_new: New version
386 387 label_version_plural: Versions
387 388 label_confirmation: Confirmation
388 389 label_export_to: 'Also available in:'
389 390 label_read: Read...
390 391 label_public_projects: Public projects
391 392 label_open_issues: open
392 393 label_open_issues_plural: open
393 394 label_closed_issues: closed
394 395 label_closed_issues_plural: closed
395 396 label_total: Total
396 397 label_permissions: Permissions
397 398 label_current_status: Current status
398 399 label_new_statuses_allowed: New statuses allowed
399 400 label_all: all
400 401 label_none: none
401 402 label_nobody: nobody
402 403 label_next: Next
403 404 label_previous: Previous
404 405 label_used_by: Used by
405 406 label_details: Details
406 407 label_add_note: Add a note
407 408 label_per_page: Per page
408 409 label_calendar: Calendar
409 410 label_months_from: months from
410 411 label_gantt: Gantt
411 412 label_internal: Internal
412 413 label_last_changes: last %d changes
413 414 label_change_view_all: View all changes
414 415 label_personalize_page: Personalize this page
415 416 label_comment: Comment
416 417 label_comment_plural: Comments
417 418 label_comment_add: Add a comment
418 419 label_comment_added: Comment added
419 420 label_comment_delete: Delete comments
420 421 label_query: Custom query
421 422 label_query_plural: Custom queries
422 423 label_query_new: New query
423 424 label_filter_add: Add filter
424 425 label_filter_plural: Filters
425 426 label_equals: is
426 427 label_not_equals: is not
427 428 label_in_less_than: in less than
428 429 label_in_more_than: in more than
429 430 label_in: in
430 431 label_today: today
431 432 label_all_time: all time
432 433 label_yesterday: yesterday
433 434 label_this_week: this week
434 435 label_last_week: last week
435 436 label_last_n_days: last %d days
436 437 label_this_month: this month
437 438 label_last_month: last month
438 439 label_this_year: this year
439 440 label_date_range: Date range
440 441 label_less_than_ago: less than days ago
441 442 label_more_than_ago: more than days ago
442 443 label_ago: days ago
443 444 label_contains: contains
444 445 label_not_contains: doesn't contain
445 446 label_day_plural: days
446 447 label_repository: Repository
447 448 label_repository_plural: Repositories
448 449 label_browse: Browse
449 450 label_modification: %d change
450 451 label_modification_plural: %d changes
451 452 label_revision: Revision
452 453 label_revision_plural: Revisions
453 454 label_associated_revisions: Associated revisions
454 455 label_added: added
455 456 label_modified: modified
456 457 label_copied: copied
457 458 label_renamed: renamed
458 459 label_deleted: deleted
459 460 label_latest_revision: Latest revision
460 461 label_latest_revision_plural: Latest revisions
461 462 label_view_revisions: View revisions
462 463 label_max_size: Maximum size
463 464 label_on: 'on'
464 465 label_sort_highest: Move to top
465 466 label_sort_higher: Move up
466 467 label_sort_lower: Move down
467 468 label_sort_lowest: Move to bottom
468 469 label_roadmap: Roadmap
469 470 label_roadmap_due_in: Due in %s
470 471 label_roadmap_overdue: %s late
471 472 label_roadmap_no_issues: No issues for this version
472 473 label_search: Search
473 474 label_result_plural: Results
474 475 label_all_words: All words
475 476 label_wiki: Wiki
476 477 label_wiki_edit: Wiki edit
477 478 label_wiki_edit_plural: Wiki edits
478 479 label_wiki_page: Wiki page
479 480 label_wiki_page_plural: Wiki pages
480 481 label_index_by_title: Index by title
481 482 label_index_by_date: Index by date
482 483 label_current_version: Current version
483 484 label_preview: Preview
484 485 label_feed_plural: Feeds
485 486 label_changes_details: Details of all changes
486 487 label_issue_tracking: Issue tracking
487 488 label_spent_time: Spent time
488 489 label_f_hour: %.2f hour
489 490 label_f_hour_plural: %.2f hours
490 491 label_time_tracking: Time tracking
491 492 label_change_plural: Changes
492 493 label_statistics: Statistics
493 494 label_commits_per_month: Commits per month
494 495 label_commits_per_author: Commits per author
495 496 label_view_diff: View differences
496 497 label_diff_inline: inline
497 498 label_diff_side_by_side: side by side
498 499 label_options: Options
499 500 label_copy_workflow_from: Copy workflow from
500 501 label_permissions_report: Permissions report
501 502 label_watched_issues: Watched issues
502 503 label_related_issues: Related issues
503 504 label_applied_status: Applied status
504 505 label_loading: Loading...
505 506 label_relation_new: New relation
506 507 label_relation_delete: Delete relation
507 508 label_relates_to: related to
508 509 label_duplicates: duplicates
509 510 label_duplicated_by: duplicated by
510 511 label_blocks: blocks
511 512 label_blocked_by: blocked by
512 513 label_precedes: precedes
513 514 label_follows: follows
514 515 label_end_to_start: end to start
515 516 label_end_to_end: end to end
516 517 label_start_to_start: start to start
517 518 label_start_to_end: start to end
518 519 label_stay_logged_in: Stay logged in
519 520 label_disabled: disabled
520 521 label_show_completed_versions: Show completed versions
521 522 label_me: me
522 523 label_board: Forum
523 524 label_board_new: New forum
524 525 label_board_plural: Forums
525 526 label_topic_plural: Topics
526 527 label_message_plural: Messages
527 528 label_message_last: Last message
528 529 label_message_new: New message
529 530 label_message_posted: Message added
530 531 label_reply_plural: Replies
531 532 label_send_information: Send account information to the user
532 533 label_year: Year
533 534 label_month: Month
534 535 label_week: Week
535 536 label_date_from: From
536 537 label_date_to: To
537 538 label_language_based: Based on user's language
538 539 label_sort_by: Sort by %s
539 540 label_send_test_email: Send a test email
540 541 label_feeds_access_key_created_on: RSS access key created %s ago
541 542 label_module_plural: Modules
542 543 label_added_time_by: Added by %s %s ago
543 544 label_updated_time: Updated %s ago
544 545 label_jump_to_a_project: Jump to a project...
545 546 label_file_plural: Files
546 547 label_changeset_plural: Changesets
547 548 label_default_columns: Default columns
548 549 label_no_change_option: (No change)
549 550 label_bulk_edit_selected_issues: Bulk edit selected issues
550 551 label_theme: Theme
551 552 label_default: Default
552 553 label_search_titles_only: Search titles only
553 554 label_user_mail_option_all: "For any event on all my projects"
554 555 label_user_mail_option_selected: "For any event on the selected projects only..."
555 556 label_user_mail_option_none: "Only for things I watch or I'm involved in"
556 557 label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
557 558 label_registration_activation_by_email: account activation by email
558 559 label_registration_manual_activation: manual account activation
559 560 label_registration_automatic_activation: automatic account activation
560 561 label_display_per_page: 'Per page: %s'
561 562 label_age: Age
562 563 label_change_properties: Change properties
563 564 label_general: General
564 565 label_more: More
565 566 label_scm: SCM
566 567 label_plugins: Plugins
567 568 label_ldap_authentication: LDAP authentication
568 569 label_downloads_abbr: D/L
569 570 label_optional_description: Optional description
570 571 label_add_another_file: Add another file
571 572 label_preferences: Preferences
572 573 label_chronological_order: In chronological order
573 574 label_reverse_chronological_order: In reverse chronological order
574 575 label_planning: Planning
575 576 label_incoming_emails: Incoming emails
576 577 label_generate_key: Generate a key
577 578 label_issue_watchers: Watchers
578 579
579 580 button_login: Login
580 581 button_submit: Submit
581 582 button_save: Save
582 583 button_check_all: Check all
583 584 button_uncheck_all: Uncheck all
584 585 button_delete: Delete
585 586 button_create: Create
586 587 button_test: Test
587 588 button_edit: Edit
588 589 button_add: Add
589 590 button_change: Change
590 591 button_apply: Apply
591 592 button_clear: Clear
592 593 button_lock: Lock
593 594 button_unlock: Unlock
594 595 button_download: Download
595 596 button_list: List
596 597 button_view: View
597 598 button_move: Move
598 599 button_back: Back
599 600 button_cancel: Cancel
600 601 button_activate: Activate
601 602 button_sort: Sort
602 603 button_log_time: Log time
603 604 button_rollback: Rollback to this version
604 605 button_watch: Watch
605 606 button_unwatch: Unwatch
606 607 button_reply: Reply
607 608 button_archive: Archive
608 609 button_unarchive: Unarchive
609 610 button_reset: Reset
610 611 button_rename: Rename
611 612 button_change_password: Change password
612 613 button_copy: Copy
613 614 button_annotate: Annotate
614 615 button_update: Update
615 616 button_configure: Configure
616 617 button_quote: Quote
617 618
618 619 status_active: active
619 620 status_registered: registered
620 621 status_locked: locked
621 622
622 623 text_select_mail_notifications: Select actions for which email notifications should be sent.
623 624 text_regexp_info: eg. ^[A-Z0-9]+$
624 625 text_min_max_length_info: 0 means no restriction
625 626 text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
626 627 text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
627 628 text_workflow_edit: Select a role and a tracker to edit the workflow
628 629 text_are_you_sure: Are you sure ?
629 630 text_journal_changed: changed from %s to %s
630 631 text_journal_set_to: set to %s
631 632 text_journal_deleted: deleted
632 633 text_tip_task_begin_day: task beginning this day
633 634 text_tip_task_end_day: task ending this day
634 635 text_tip_task_begin_end_day: task beginning and ending this day
635 636 text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br />Once saved, the identifier can not be changed.'
636 637 text_caracters_maximum: %d characters maximum.
637 638 text_caracters_minimum: Must be at least %d characters long.
638 639 text_length_between: Length between %d and %d characters.
639 640 text_tracker_no_workflow: No workflow defined for this tracker
640 641 text_unallowed_characters: Unallowed characters
641 642 text_comma_separated: Multiple values allowed (comma separated).
642 643 text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
643 644 text_issue_added: Issue %s has been reported by %s.
644 645 text_issue_updated: Issue %s has been updated by %s.
645 646 text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
646 647 text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
647 648 text_issue_category_destroy_assignments: Remove category assignments
648 649 text_issue_category_reassign_to: Reassign issues to this category
649 650 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)."
650 651 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."
651 652 text_load_default_configuration: Load the default configuration
652 653 text_status_changed_by_changeset: Applied in changeset %s.
653 654 text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
654 655 text_select_project_modules: 'Select modules to enable for this project:'
655 656 text_default_administrator_account_changed: Default administrator account changed
656 657 text_file_repository_writable: File repository writable
657 658 text_rmagick_available: RMagick available (optional)
658 659 text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
659 660 text_destroy_time_entries: Delete reported hours
660 661 text_assign_time_entries_to_project: Assign reported hours to the project
661 662 text_reassign_time_entries: 'Reassign reported hours to this issue:'
662 663 text_user_wrote: '%s wrote:'
663 664 text_enumeration_destroy_question: '%d objects are assigned to this value.'
664 665 text_enumeration_category_reassign_to: 'Reassign them to this value:'
665 666 text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
666 667
667 668 default_role_manager: Manager
668 669 default_role_developper: Developer
669 670 default_role_reporter: Reporter
670 671 default_tracker_bug: Bug
671 672 default_tracker_feature: Feature
672 673 default_tracker_support: Support
673 674 default_issue_status_new: New
674 675 default_issue_status_assigned: Assigned
675 676 default_issue_status_resolved: Resolved
676 677 default_issue_status_feedback: Feedback
677 678 default_issue_status_closed: Closed
678 679 default_issue_status_rejected: Rejected
679 680 default_doc_category_user: User documentation
680 681 default_doc_category_tech: Technical documentation
681 682 default_priority_low: Low
682 683 default_priority_normal: Normal
683 684 default_priority_high: High
684 685 default_priority_urgent: Urgent
685 686 default_priority_immediate: Immediate
686 687 default_activity_design: Design
687 688 default_activity_development: Development
688 689
689 690 enumeration_issue_priorities: Issue priorities
690 691 enumeration_doc_categories: Document categories
691 692 enumeration_activities: Activities (time tracking)
General Comments 0
You need to be logged in to leave comments. Login now