##// END OF EJS Templates
* single/multiple issues pdf export added...
Jean-Philippe Lang -
r35:51e0989c4919
parent child
Show More
@@ -0,0 +1,43
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require 'iconv'
19
20 module IfpdfHelper
21
22 class IFPDF < FPDF
23
24 def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
25 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
26 super w,h,@ic.iconv(txt),border,ln,align,fill,link
27 end
28
29 def MultiCell(w,h,txt,border=0,align='J',fill=0)
30 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
31 super w,h,txt,border,align,fill
32 end
33
34 def Footer
35 SetY(-15)
36 SetX(-30)
37 SetFont('Helvetica', 'I', 8)
38 Cell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
39 end
40
41 end
42
43 end
@@ -0,0 +1,95
1 <% pdf.SetFont('Arial','B',11)
2 pdf.Cell(190,10, "#{issue.project.name} - #{issue.tracker.name} # #{issue.long_id} - #{issue.subject}")
3 pdf.Ln
4
5 y0 = pdf.GetY
6
7 pdf.SetFont('Arial','B',9)
8 pdf.Cell(35,5, l(:field_status) + ":","LT")
9 pdf.SetFont('Arial','',9)
10 pdf.Cell(60,5, issue.status.name,"RT")
11 pdf.SetFont('Arial','B',9)
12 pdf.Cell(35,5, l(:field_priority) + ":","LT")
13 pdf.SetFont('Arial','',9)
14 pdf.Cell(60,5, issue.priority.name,"RT")
15 pdf.Ln
16
17 pdf.SetFont('Arial','B',9)
18 pdf.Cell(35,5, l(:field_author) + ":","L")
19 pdf.SetFont('Arial','',9)
20 pdf.Cell(60,5, issue.author.name,"R")
21 pdf.SetFont('Arial','B',9)
22 pdf.Cell(35,5, l(:field_category) + ":","L")
23 pdf.SetFont('Arial','',9)
24 pdf.Cell(60,5, (issue.category ? issue.category.name : "-"),"R")
25 pdf.Ln
26
27 pdf.SetFont('Arial','B',9)
28 pdf.Cell(35,5, l(:field_created_on) + ":","L")
29 pdf.SetFont('Arial','',9)
30 pdf.Cell(60,5, format_date(issue.created_on),"R")
31 pdf.SetFont('Arial','B',9)
32 pdf.Cell(35,5, l(:field_assigned_to) + ":","L")
33 pdf.SetFont('Arial','',9)
34 pdf.Cell(60,5, (issue.assigned_to ? issue.assigned_to.name : "-"),"R")
35 pdf.Ln
36
37 pdf.SetFont('Arial','B',9)
38 pdf.Cell(35,5, l(:field_updated_on) + ":","LB")
39 pdf.SetFont('Arial','',9)
40 pdf.Cell(60,5, format_date(issue.updated_on),"RB")
41 pdf.SetFont('Arial','B',9)
42 pdf.Cell(35,5, l(:field_due_date) + ":","LB")
43 pdf.SetFont('Arial','',9)
44 pdf.Cell(60,5, format_date(issue.due_date),"RB")
45 pdf.Ln
46
47 for custom_value in issue.custom_values
48 pdf.SetFont('Arial','B',9)
49 pdf.Cell(35,5, custom_value.custom_field.name + ":","L")
50 pdf.SetFont('Arial','',9)
51 pdf.MultiCell(155,5, (show_value custom_value),"R")
52 end
53
54 pdf.SetFont('Arial','B',9)
55 pdf.Cell(35,5, l(:field_subject) + ":","LTB")
56 pdf.SetFont('Arial','',9)
57 pdf.Cell(155,5, issue.subject,"RTB")
58 pdf.Ln
59
60 pdf.SetFont('Arial','B',9)
61 pdf.Cell(35,5, l(:field_description) + ":")
62 pdf.SetFont('Arial','',9)
63 pdf.MultiCell(155,5, issue.description,"BR")
64
65 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
66 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
67
68 pdf.Ln
69 pdf.SetFont('Arial','B',9)
70 pdf.Cell(190,5, l(:label_history),"B")
71 pdf.Ln
72 for history in issue.histories.find(:all, :include => [:author, :status])
73 pdf.SetFont('Arial','B',8)
74 pdf.Cell(100,5, history.status.name)
75 pdf.SetFont('Arial','',8)
76 pdf.Cell(20,5, format_date(history.created_on))
77 pdf.Cell(70,5, history.author.name,0,0,"R")
78 pdf.SetFont('Arial','',8)
79 pdf.Ln
80 pdf.Cell(10,4, "") and pdf.MultiCell(180,4, history.notes) if history.notes?
81 end
82 pdf.Ln
83
84 pdf.SetFont('Arial','B',9)
85 pdf.Cell(190,5, l(:label_attachment_plural), "B")
86 pdf.Ln
87 for attachment in issue.attachments
88 pdf.SetFont('Arial','',8)
89 pdf.Cell(80,5, attachment.filename)
90 pdf.Cell(20,5, human_size(attachment.filesize))
91 pdf.Cell(20,5, format_date(attachment.created_on))
92 pdf.Cell(70,5, attachment.author.name,0,0,"R")
93 pdf.Ln
94 end
95 %> No newline at end of file
@@ -0,0 +1,8
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => @issue }
6 %>
7
8 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,10
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4 @issues.each {|i|
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => i }
6 pdf.AddPage
7 }
8 %>
9
10 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,11
1 class ExportPdf < ActiveRecord::Migration
2 def self.up
3 Permission.create :controller => "projects", :action => "export_issues_pdf", :description => "label_export_pdf", :sort => 1002, :is_public => true, :mail_option => 0, :mail_enabled => 0
4 Permission.create :controller => "issues", :action => "export_pdf", :description => "label_export_pdf", :sort => 1015, :is_public => true, :mail_option => 0, :mail_enabled => 0
5 end
6
7 def self.down
8 Permission.find(:first, :conditions => ["controller=? and action=?", 'projects', 'export_issues_pdf']).destroy
9 Permission.find(:first, :conditions => ["controller=? and action=?", 'issues', 'export_pdf']).destroy
10 end
11 end
@@ -1,107 +1,107
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class ApplicationController < ActionController::Base
18 class ApplicationController < ActionController::Base
19 before_filter :check_if_login_required, :set_localization
19 before_filter :check_if_login_required, :set_localization
20
20
21 def logged_in_user=(user)
21 def logged_in_user=(user)
22 @logged_in_user = user
22 @logged_in_user = user
23 session[:user_id] = (user ? user.id : nil)
23 session[:user_id] = (user ? user.id : nil)
24 end
24 end
25
25
26 def logged_in_user
26 def logged_in_user
27 if session[:user_id]
27 if session[:user_id]
28 @logged_in_user ||= User.find(session[:user_id], :include => :memberships)
28 @logged_in_user ||= User.find(session[:user_id], :include => :memberships)
29 else
29 else
30 nil
30 nil
31 end
31 end
32 end
32 end
33
33
34 # check if login is globally required to access the application
34 # check if login is globally required to access the application
35 def check_if_login_required
35 def check_if_login_required
36 require_login if $RDM_LOGIN_REQUIRED
36 require_login if $RDM_LOGIN_REQUIRED
37 end
37 end
38
38
39 def set_localization
39 def set_localization
40 lang = begin
40 lang = begin
41 if self.logged_in_user and self.logged_in_user.language and !self.logged_in_user.language.empty? and GLoc.valid_languages.include? self.logged_in_user.language.to_sym
41 if self.logged_in_user and self.logged_in_user.language and !self.logged_in_user.language.empty? and GLoc.valid_languages.include? self.logged_in_user.language.to_sym
42 self.logged_in_user.language
42 self.logged_in_user.language
43 elsif request.env['HTTP_ACCEPT_LANGUAGE']
43 elsif request.env['HTTP_ACCEPT_LANGUAGE']
44 accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
44 accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
45 if accept_lang and !accept_lang.empty? and GLoc.valid_languages.include? accept_lang.to_sym
45 if accept_lang and !accept_lang.empty? and GLoc.valid_languages.include? accept_lang.to_sym
46 accept_lang
46 accept_lang
47 end
47 end
48 end
48 end
49 rescue
49 rescue
50 nil
50 nil
51 end || $RDM_DEFAULT_LANG
51 end || $RDM_DEFAULT_LANG
52 set_language_if_valid(lang)
52 set_language_if_valid(lang)
53 end
53 end
54
54
55 def require_login
55 def require_login
56 unless self.logged_in_user
56 unless self.logged_in_user
57 store_location
57 store_location
58 redirect_to :controller => "account", :action => "login"
58 redirect_to :controller => "account", :action => "login"
59 return false
59 return false
60 end
60 end
61 true
61 true
62 end
62 end
63
63
64 def require_admin
64 def require_admin
65 return unless require_login
65 return unless require_login
66 unless self.logged_in_user.admin?
66 unless self.logged_in_user.admin?
67 render :nothing => true, :status => 403
67 render :nothing => true, :status => 403
68 return false
68 return false
69 end
69 end
70 true
70 true
71 end
71 end
72
72
73 # authorizes the user for the requested action.
73 # authorizes the user for the requested action.
74 def authorize
74 def authorize
75 # check if action is allowed on public projects
75 # check if action is allowed on public projects
76 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]
76 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]
77 return true
77 return true
78 end
78 end
79 # if action is not public, force login
79 # if action is not public, force login
80 return unless require_login
80 return unless require_login
81 # admin is always authorized
81 # admin is always authorized
82 return true if self.logged_in_user.admin?
82 return true if self.logged_in_user.admin?
83 # if not admin, check membership permission
83 # if not admin, check membership permission
84 @user_membership ||= Member.find(:first, :conditions => ["user_id=? and project_id=?", self.logged_in_user.id, @project.id])
84 @user_membership ||= Member.find(:first, :conditions => ["user_id=? and project_id=?", self.logged_in_user.id, @project.id])
85 if @user_membership and Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], @user_membership.role_id )
85 if @user_membership and Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], @user_membership.role_id )
86 return true
86 return true
87 end
87 end
88 render :nothing => true, :status => 403
88 render :nothing => true, :status => 403
89 false
89 false
90 end
90 end
91
91
92 # store current uri in session.
92 # store current uri in session.
93 # return to this location by calling redirect_back_or_default
93 # return to this location by calling redirect_back_or_default
94 def store_location
94 def store_location
95 session[:return_to] = @request.request_uri
95 session[:return_to] = @request.request_uri
96 end
96 end
97
97
98 # move to the last store_location call or to the passed default one
98 # move to the last store_location call or to the passed default one
99 def redirect_back_or_default(default)
99 def redirect_back_or_default(default)
100 if session[:return_to].nil?
100 if session[:return_to].nil?
101 redirect_to default
101 redirect_to default
102 else
102 else
103 redirect_to_url session[:return_to]
103 redirect_to_url session[:return_to]
104 session[:return_to] = nil
104 session[:return_to] = nil
105 end
105 end
106 end
106 end
107 end No newline at end of file
107 end
@@ -1,120 +1,128
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class IssuesController < ApplicationController
18 class IssuesController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_pdf
20 before_filter :find_project, :authorize
20 before_filter :find_project, :authorize
21
21
22 helper :custom_fields
22 helper :custom_fields
23 include CustomFieldsHelper
23 include CustomFieldsHelper
24 helper :ifpdf
25 include IfpdfHelper
24
26
25 def show
27 def show
26 @status_options = @issue.status.workflows.find(:all, :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
28 @status_options = @issue.status.workflows.find(:all, :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
27 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
29 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
30 end
31
32 def export_pdf
33 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
34 @options_for_rfpdf ||= {}
35 @options_for_rfpdf[:file_name] = "#{@project.name}_#{@issue.long_id}.pdf"
28 end
36 end
29
37
30 def edit
38 def edit
31 @priorities = Enumeration::get_values('IPRI')
39 @priorities = Enumeration::get_values('IPRI')
32 if request.get?
40 if request.get?
33 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
41 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
34 else
42 else
35 begin
43 begin
36 # Retrieve custom fields and values
44 # Retrieve custom fields and values
37 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
45 @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
38 @issue.custom_values = @custom_values
46 @issue.custom_values = @custom_values
39 @issue.attributes = params[:issue]
47 @issue.attributes = params[:issue]
40 if @issue.save
48 if @issue.save
41 flash[:notice] = l(:notice_successful_update)
49 flash[:notice] = l(:notice_successful_update)
42 redirect_to :action => 'show', :id => @issue
50 redirect_to :action => 'show', :id => @issue
43 end
51 end
44 rescue ActiveRecord::StaleObjectError
52 rescue ActiveRecord::StaleObjectError
45 # Optimistic locking exception
53 # Optimistic locking exception
46 flash[:notice] = l(:notice_locking_conflict)
54 flash[:notice] = l(:notice_locking_conflict)
47 end
55 end
48 end
56 end
49 end
57 end
50
58
51 def add_note
59 def add_note
52 unless params[:history][:notes].empty?
60 unless params[:history][:notes].empty?
53 @history = @issue.histories.build(params[:history])
61 @history = @issue.histories.build(params[:history])
54 @history.author_id = self.logged_in_user.id if self.logged_in_user
62 @history.author_id = self.logged_in_user.id if self.logged_in_user
55 @history.status = @issue.status
63 @history.status = @issue.status
56 if @history.save
64 if @history.save
57 flash[:notice] = l(:notice_successful_update)
65 flash[:notice] = l(:notice_successful_update)
58 redirect_to :action => 'show', :id => @issue
66 redirect_to :action => 'show', :id => @issue
59 return
67 return
60 end
68 end
61 end
69 end
62 show
70 show
63 render :action => 'show'
71 render :action => 'show'
64 end
72 end
65
73
66 def change_status
74 def change_status
67 @history = @issue.histories.build(params[:history])
75 @history = @issue.histories.build(params[:history])
68 @status_options = @issue.status.workflows.find(:all, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
76 @status_options = @issue.status.workflows.find(:all, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
69 if params[:confirm]
77 if params[:confirm]
70 begin
78 begin
71 @history.author_id = self.logged_in_user.id if self.logged_in_user
79 @history.author_id = self.logged_in_user.id if self.logged_in_user
72 @issue.status = @history.status
80 @issue.status = @history.status
73 @issue.fixed_version_id = (params[:issue][:fixed_version_id])
81 @issue.fixed_version_id = (params[:issue][:fixed_version_id])
74 @issue.assigned_to_id = (params[:issue][:assigned_to_id])
82 @issue.assigned_to_id = (params[:issue][:assigned_to_id])
75 @issue.lock_version = (params[:issue][:lock_version])
83 @issue.lock_version = (params[:issue][:lock_version])
76 if @issue.save
84 if @issue.save
77 flash[:notice] = l(:notice_successful_update)
85 flash[:notice] = l(:notice_successful_update)
78 Mailer.deliver_issue_change_status(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
86 Mailer.deliver_issue_change_status(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
79 redirect_to :action => 'show', :id => @issue
87 redirect_to :action => 'show', :id => @issue
80 end
88 end
81 rescue ActiveRecord::StaleObjectError
89 rescue ActiveRecord::StaleObjectError
82 # Optimistic locking exception
90 # Optimistic locking exception
83 flash[:notice] = l(:notice_locking_conflict)
91 flash[:notice] = l(:notice_locking_conflict)
84 end
92 end
85 end
93 end
86 @assignable_to = @project.members.find(:all, :include => :user).collect{ |m| m.user }
94 @assignable_to = @project.members.find(:all, :include => :user).collect{ |m| m.user }
87 end
95 end
88
96
89 def destroy
97 def destroy
90 @issue.destroy
98 @issue.destroy
91 redirect_to :controller => 'projects', :action => 'list_issues', :id => @project
99 redirect_to :controller => 'projects', :action => 'list_issues', :id => @project
92 end
100 end
93
101
94 def add_attachment
102 def add_attachment
95 # Save the attachment
103 # Save the attachment
96 if params[:attachment][:file].size > 0
104 if params[:attachment][:file].size > 0
97 @attachment = @issue.attachments.build(params[:attachment])
105 @attachment = @issue.attachments.build(params[:attachment])
98 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
106 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
99 @attachment.save
107 @attachment.save
100 end
108 end
101 redirect_to :action => 'show', :id => @issue
109 redirect_to :action => 'show', :id => @issue
102 end
110 end
103
111
104 def destroy_attachment
112 def destroy_attachment
105 @issue.attachments.find(params[:attachment_id]).destroy
113 @issue.attachments.find(params[:attachment_id]).destroy
106 redirect_to :action => 'show', :id => @issue
114 redirect_to :action => 'show', :id => @issue
107 end
115 end
108
116
109 # Send the file in stream mode
117 # Send the file in stream mode
110 def download
118 def download
111 @attachment = @issue.attachments.find(params[:attachment_id])
119 @attachment = @issue.attachments.find(params[:attachment_id])
112 send_file @attachment.diskfile, :filename => @attachment.filename
120 send_file @attachment.diskfile, :filename => @attachment.filename
113 end
121 end
114
122
115 private
123 private
116 def find_project
124 def find_project
117 @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
125 @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
118 @project = @issue.project
126 @project = @issue.project
119 end
127 end
120 end
128 end
@@ -1,334 +1,368
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class ProjectsController < ApplicationController
18 class ProjectsController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_issues_pdf
20 before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
20 before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
21 before_filter :require_admin, :only => [ :add, :destroy ]
21 before_filter :require_admin, :only => [ :add, :destroy ]
22
22
23 helper :sort
23 helper :sort
24 include SortHelper
24 include SortHelper
25 helper :search_filter
25 helper :search_filter
26 include SearchFilterHelper
26 include SearchFilterHelper
27 helper :custom_fields
27 helper :custom_fields
28 include CustomFieldsHelper
28 include CustomFieldsHelper
29
29 helper :ifpdf
30 include IfpdfHelper
31
30 def index
32 def index
31 list
33 list
32 render :action => 'list' unless request.xhr?
34 render :action => 'list' unless request.xhr?
33 end
35 end
34
36
35 # Lists public projects
37 # Lists public projects
36 def list
38 def list
37 sort_init 'name', 'asc'
39 sort_init 'name', 'asc'
38 sort_update
40 sort_update
39 @project_count = Project.count(["is_public=?", true])
41 @project_count = Project.count(["is_public=?", true])
40 @project_pages = Paginator.new self, @project_count,
42 @project_pages = Paginator.new self, @project_count,
41 15,
43 15,
42 @params['page']
44 @params['page']
43 @projects = Project.find :all, :order => sort_clause,
45 @projects = Project.find :all, :order => sort_clause,
44 :conditions => ["is_public=?", true],
46 :conditions => ["is_public=?", true],
45 :limit => @project_pages.items_per_page,
47 :limit => @project_pages.items_per_page,
46 :offset => @project_pages.current.offset
48 :offset => @project_pages.current.offset
47
49
48 render :action => "list", :layout => false if request.xhr?
50 render :action => "list", :layout => false if request.xhr?
49 end
51 end
50
52
51 # Add a new project
53 # Add a new project
52 def add
54 def add
53 @custom_fields = IssueCustomField.find(:all)
55 @custom_fields = IssueCustomField.find(:all)
54 @root_projects = Project.find(:all, :conditions => "parent_id is null")
56 @root_projects = Project.find(:all, :conditions => "parent_id is null")
55 @project = Project.new(params[:project])
57 @project = Project.new(params[:project])
56 if request.get?
58 if request.get?
57 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
59 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
58 else
60 else
59 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
61 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
60 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
62 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
61 @project.custom_values = @custom_values
63 @project.custom_values = @custom_values
62 if @project.save
64 if @project.save
63 flash[:notice] = l(:notice_successful_create)
65 flash[:notice] = l(:notice_successful_create)
64 redirect_to :controller => 'admin', :action => 'projects'
66 redirect_to :controller => 'admin', :action => 'projects'
65 end
67 end
66 end
68 end
67 end
69 end
68
70
69 # Show @project
71 # Show @project
70 def show
72 def show
71 @custom_values = @project.custom_values.find(:all, :include => :custom_field)
73 @custom_values = @project.custom_values.find(:all, :include => :custom_field)
72 @members = @project.members.find(:all, :include => [:user, :role])
74 @members = @project.members.find(:all, :include => [:user, :role])
73 @subprojects = @project.children if @project.children_count > 0
75 @subprojects = @project.children if @project.children_count > 0
74 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
76 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
75 @trackers = Tracker.find(:all)
77 @trackers = Tracker.find(:all)
76 end
78 end
77
79
78 def settings
80 def settings
79 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
81 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
80 @custom_fields = IssueCustomField::find_all
82 @custom_fields = IssueCustomField::find_all
81 @issue_category ||= IssueCategory.new
83 @issue_category ||= IssueCategory.new
82 @member ||= @project.members.new
84 @member ||= @project.members.new
83 @roles = Role.find_all
85 @roles = Role.find_all
84 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
86 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
85 @custom_values ||= ProjectCustomField.find(:all).collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
87 @custom_values ||= ProjectCustomField.find(:all).collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
86 end
88 end
87
89
88 # Edit @project
90 # Edit @project
89 def edit
91 def edit
90 if request.post?
92 if request.post?
91 @project.custom_fields = IssueCustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
93 @project.custom_fields = IssueCustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
92 if params[:custom_fields]
94 if params[:custom_fields]
93 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
95 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
94 @project.custom_values = @custom_values
96 @project.custom_values = @custom_values
95 end
97 end
96 if @project.update_attributes(params[:project])
98 if @project.update_attributes(params[:project])
97 flash[:notice] = l(:notice_successful_update)
99 flash[:notice] = l(:notice_successful_update)
98 redirect_to :action => 'settings', :id => @project
100 redirect_to :action => 'settings', :id => @project
99 else
101 else
100 settings
102 settings
101 render :action => 'settings'
103 render :action => 'settings'
102 end
104 end
103 end
105 end
104 end
106 end
105
107
106 # Delete @project
108 # Delete @project
107 def destroy
109 def destroy
108 if request.post? and params[:confirm]
110 if request.post? and params[:confirm]
109 @project.destroy
111 @project.destroy
110 redirect_to :controller => 'admin', :action => 'projects'
112 redirect_to :controller => 'admin', :action => 'projects'
111 end
113 end
112 end
114 end
113
115
114 # Add a new issue category to @project
116 # Add a new issue category to @project
115 def add_issue_category
117 def add_issue_category
116 if request.post?
118 if request.post?
117 @issue_category = @project.issue_categories.build(params[:issue_category])
119 @issue_category = @project.issue_categories.build(params[:issue_category])
118 if @issue_category.save
120 if @issue_category.save
119 flash[:notice] = l(:notice_successful_create)
121 flash[:notice] = l(:notice_successful_create)
120 redirect_to :action => 'settings', :id => @project
122 redirect_to :action => 'settings', :id => @project
121 else
123 else
122 settings
124 settings
123 render :action => 'settings'
125 render :action => 'settings'
124 end
126 end
125 end
127 end
126 end
128 end
127
129
128 # Add a new version to @project
130 # Add a new version to @project
129 def add_version
131 def add_version
130 @version = @project.versions.build(params[:version])
132 @version = @project.versions.build(params[:version])
131 if request.post? and @version.save
133 if request.post? and @version.save
132 flash[:notice] = l(:notice_successful_create)
134 flash[:notice] = l(:notice_successful_create)
133 redirect_to :action => 'settings', :id => @project
135 redirect_to :action => 'settings', :id => @project
134 end
136 end
135 end
137 end
136
138
137 # Add a new member to @project
139 # Add a new member to @project
138 def add_member
140 def add_member
139 @member = @project.members.build(params[:member])
141 @member = @project.members.build(params[:member])
140 if request.post?
142 if request.post?
141 if @member.save
143 if @member.save
142 flash[:notice] = l(:notice_successful_create)
144 flash[:notice] = l(:notice_successful_create)
143 redirect_to :action => 'settings', :id => @project
145 redirect_to :action => 'settings', :id => @project
144 else
146 else
145 settings
147 settings
146 render :action => 'settings'
148 render :action => 'settings'
147 end
149 end
148 end
150 end
149 end
151 end
150
152
151 # Show members list of @project
153 # Show members list of @project
152 def list_members
154 def list_members
153 @members = @project.members
155 @members = @project.members
154 end
156 end
155
157
156 # Add a new document to @project
158 # Add a new document to @project
157 def add_document
159 def add_document
158 @categories = Enumeration::get_values('DCAT')
160 @categories = Enumeration::get_values('DCAT')
159 @document = @project.documents.build(params[:document])
161 @document = @project.documents.build(params[:document])
160 if request.post?
162 if request.post?
161 # Save the attachment
163 # Save the attachment
162 if params[:attachment][:file].size > 0
164 if params[:attachment][:file].size > 0
163 @attachment = @document.attachments.build(params[:attachment])
165 @attachment = @document.attachments.build(params[:attachment])
164 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
166 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
165 end
167 end
166 if @document.save
168 if @document.save
167 flash[:notice] = l(:notice_successful_create)
169 flash[:notice] = l(:notice_successful_create)
168 redirect_to :action => 'list_documents', :id => @project
170 redirect_to :action => 'list_documents', :id => @project
169 end
171 end
170 end
172 end
171 end
173 end
172
174
173 # Show documents list of @project
175 # Show documents list of @project
174 def list_documents
176 def list_documents
175 @documents = @project.documents
177 @documents = @project.documents
176 end
178 end
177
179
178 # Add a new issue to @project
180 # Add a new issue to @project
179 def add_issue
181 def add_issue
180 @tracker = Tracker.find(params[:tracker_id])
182 @tracker = Tracker.find(params[:tracker_id])
181 @priorities = Enumeration::get_values('IPRI')
183 @priorities = Enumeration::get_values('IPRI')
182 @issue = Issue.new(:project => @project, :tracker => @tracker)
184 @issue = Issue.new(:project => @project, :tracker => @tracker)
183 if request.get?
185 if request.get?
184 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) }
186 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) }
185 else
187 else
186 @issue.attributes = params[:issue]
188 @issue.attributes = params[:issue]
187 @issue.author_id = self.logged_in_user.id if self.logged_in_user
189 @issue.author_id = self.logged_in_user.id if self.logged_in_user
188 # Create the document if a file was sent
190 # Create the document if a file was sent
189 if params[:attachment][:file].size > 0
191 if params[:attachment][:file].size > 0
190 @attachment = @issue.attachments.build(params[:attachment])
192 @attachment = @issue.attachments.build(params[:attachment])
191 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
193 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
192 end
194 end
193 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
195 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
194 @issue.custom_values = @custom_values
196 @issue.custom_values = @custom_values
195 if @issue.save
197 if @issue.save
196 flash[:notice] = l(:notice_successful_create)
198 flash[:notice] = l(:notice_successful_create)
197 Mailer.deliver_issue_add(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
199 Mailer.deliver_issue_add(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
198 redirect_to :action => 'list_issues', :id => @project
200 redirect_to :action => 'list_issues', :id => @project
199 end
201 end
200 end
202 end
201 end
203 end
202
204
203 # Show filtered/sorted issues list of @project
205 # Show filtered/sorted issues list of @project
204 def list_issues
206 def list_issues
205 sort_init 'issues.id', 'desc'
207 sort_init 'issues.id', 'desc'
206 sort_update
208 sort_update
207
209
208 search_filter_init_list_issues
210 search_filter_init_list_issues
209 search_filter_update if params[:set_filter]
211 search_filter_update if params[:set_filter]
210
212
213 @results_per_page_options = [ 15, 25, 50, 100 ]
214 if params[:per_page] and @results_per_page_options.include? params[:per_page].to_i
215 @results_per_page = params[:per_page].to_i
216 session[:results_per_page] = @results_per_page
217 else
218 @results_per_page = session[:results_per_page] || @results_per_page_options.first
219 end
220
211 @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause)
221 @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause)
212 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
222 @issue_pages = Paginator.new self, @issue_count, @results_per_page, @params['page']
213 @issues = Issue.find :all, :order => sort_clause,
223 @issues = Issue.find :all, :order => sort_clause,
214 :include => [ :author, :status, :tracker, :project ],
224 :include => [ :author, :status, :tracker, :project ],
215 :conditions => search_filter_clause,
225 :conditions => search_filter_clause,
216 :limit => @issue_pages.items_per_page,
226 :limit => @issue_pages.items_per_page,
217 :offset => @issue_pages.current.offset
227 :offset => @issue_pages.current.offset
218
228
219 render :action => "list_issues", :layout => false if request.xhr?
229 render :layout => false if request.xhr?
220 end
230 end
221
231
222 # Export filtered/sorted issues list to CSV
232 # Export filtered/sorted issues list to CSV
223 def export_issues_csv
233 def export_issues_csv
224 sort_init 'issues.id', 'desc'
234 sort_init 'issues.id', 'desc'
225 sort_update
235 sort_update
226
236
227 search_filter_init_list_issues
237 search_filter_init_list_issues
228
238
229 @issues = Issue.find :all, :order => sort_clause,
239 @issues = Issue.find :all, :order => sort_clause,
230 :include => [ :author, :status, :tracker, :project ],
240 :include => [ :author, :status, :tracker, :project, :custom_values ],
231 :conditions => search_filter_clause
241 :conditions => search_filter_clause
232
242
243 ic = Iconv.new('ISO-8859-1', 'UTF-8')
233 export = StringIO.new
244 export = StringIO.new
234 CSV::Writer.generate(export, ',') do |csv|
245 CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
235 csv << %w(Id Status Tracker Subject Author Created Updated)
246 # csv header fields
247 headers = [ "#", l(:field_status), l(:field_tracker), l(:field_subject), l(:field_author), l(:field_created_on), l(:field_updated_on) ]
248 for custom_field in @project.all_custom_fields
249 headers << custom_field.name
250 end
251 csv << headers.collect {|c| ic.iconv(c) }
252 # csv lines
236 @issues.each do |issue|
253 @issues.each do |issue|
237 csv << [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
254 fields = [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
255 for custom_field in @project.all_custom_fields
256 fields << (show_value issue.custom_value_for(custom_field))
257 end
258 csv << fields.collect {|c| ic.iconv(c.to_s) }
238 end
259 end
239 end
260 end
240 export.rewind
261 export.rewind
241 send_data(export.read,
262 send_data(export.read, :type => 'text/csv; header=present', :filename => 'export.csv')
242 :type => 'text/csv; charset=utf-8; header=present',
263 end
243 :filename => 'export.csv')
264
265 # Export filtered/sorted issues to PDF
266 def export_issues_pdf
267 sort_init 'issues.id', 'desc'
268 sort_update
269
270 search_filter_init_list_issues
271
272 @issues = Issue.find :all, :order => sort_clause,
273 :include => [ :author, :status, :tracker, :project, :custom_values ],
274 :conditions => search_filter_clause
275
276 @options_for_rfpdf ||= {}
277 @options_for_rfpdf[:file_name] = "export.pdf"
244 end
278 end
245
279
246 def move_issues
280 def move_issues
247 @issues = @project.issues.find(params[:issue_ids]) if params[:issue_ids]
281 @issues = @project.issues.find(params[:issue_ids]) if params[:issue_ids]
248 redirect_to :action => 'list_issues', :id => @project and return unless @issues
282 redirect_to :action => 'list_issues', :id => @project and return unless @issues
249 @projects = []
283 @projects = []
250 # find projects to which the user is allowed to move the issue
284 # find projects to which the user is allowed to move the issue
251 @logged_in_user.memberships.each {|m| @projects << m.project if Permission.allowed_to_role("projects/move_issues", m.role_id)}
285 @logged_in_user.memberships.each {|m| @projects << m.project if Permission.allowed_to_role("projects/move_issues", m.role_id)}
252 # issue can be moved to any tracker
286 # issue can be moved to any tracker
253 @trackers = Tracker.find(:all)
287 @trackers = Tracker.find(:all)
254 if request.post? and params[:new_project_id] and params[:new_tracker_id]
288 if request.post? and params[:new_project_id] and params[:new_tracker_id]
255 new_project = Project.find(params[:new_project_id])
289 new_project = Project.find(params[:new_project_id])
256 new_tracker = Tracker.find(params[:new_tracker_id])
290 new_tracker = Tracker.find(params[:new_tracker_id])
257 @issues.each { |i|
291 @issues.each { |i|
258 # category is project dependent
292 # category is project dependent
259 i.category = nil unless i.project_id == new_project.id
293 i.category = nil unless i.project_id == new_project.id
260 # move the issue
294 # move the issue
261 i.project = new_project
295 i.project = new_project
262 i.tracker = new_tracker
296 i.tracker = new_tracker
263 i.save
297 i.save
264 }
298 }
265 flash[:notice] = l(:notice_successful_update)
299 flash[:notice] = l(:notice_successful_update)
266 redirect_to :action => 'list_issues', :id => @project
300 redirect_to :action => 'list_issues', :id => @project
267 end
301 end
268 end
302 end
269
303
270 # Add a news to @project
304 # Add a news to @project
271 def add_news
305 def add_news
272 @news = News.new(:project => @project)
306 @news = News.new(:project => @project)
273 if request.post?
307 if request.post?
274 @news.attributes = params[:news]
308 @news.attributes = params[:news]
275 @news.author_id = self.logged_in_user.id if self.logged_in_user
309 @news.author_id = self.logged_in_user.id if self.logged_in_user
276 if @news.save
310 if @news.save
277 flash[:notice] = l(:notice_successful_create)
311 flash[:notice] = l(:notice_successful_create)
278 redirect_to :action => 'list_news', :id => @project
312 redirect_to :action => 'list_news', :id => @project
279 end
313 end
280 end
314 end
281 end
315 end
282
316
283 # Show news list of @project
317 # Show news list of @project
284 def list_news
318 def list_news
285 @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC"
319 @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC"
286 render :action => "list_news", :layout => false if request.xhr?
320 render :action => "list_news", :layout => false if request.xhr?
287 end
321 end
288
322
289 def add_file
323 def add_file
290 if request.post?
324 if request.post?
291 # Save the attachment
325 # Save the attachment
292 if params[:attachment][:file].size > 0
326 if params[:attachment][:file].size > 0
293 @attachment = @project.versions.find(params[:version_id]).attachments.build(params[:attachment])
327 @attachment = @project.versions.find(params[:version_id]).attachments.build(params[:attachment])
294 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
328 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
295 if @attachment.save
329 if @attachment.save
296 flash[:notice] = l(:notice_successful_create)
330 flash[:notice] = l(:notice_successful_create)
297 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
331 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
298 end
332 end
299 end
333 end
300 end
334 end
301 @versions = @project.versions
335 @versions = @project.versions
302 end
336 end
303
337
304 def list_files
338 def list_files
305 @versions = @project.versions
339 @versions = @project.versions
306 end
340 end
307
341
308 # Show changelog for @project
342 # Show changelog for @project
309 def changelog
343 def changelog
310 @trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true])
344 @trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true])
311 if request.get?
345 if request.get?
312 @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
346 @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
313 else
347 else
314 @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
348 @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
315 end
349 end
316 @selected_tracker_ids ||= []
350 @selected_tracker_ids ||= []
317 @fixed_issues = @project.issues.find(:all,
351 @fixed_issues = @project.issues.find(:all,
318 :include => [ :fixed_version, :status, :tracker ],
352 :include => [ :fixed_version, :status, :tracker ],
319 :conditions => [ "issue_statuses.is_closed=? and issues.tracker_id in (#{@selected_tracker_ids.join(',')}) and issues.fixed_version_id is not null", true],
353 :conditions => [ "issue_statuses.is_closed=? and issues.tracker_id in (#{@selected_tracker_ids.join(',')}) and issues.fixed_version_id is not null", true],
320 :order => "versions.effective_date DESC, issues.id DESC"
354 :order => "versions.effective_date DESC, issues.id DESC"
321 ) unless @selected_tracker_ids.empty?
355 ) unless @selected_tracker_ids.empty?
322 @fixed_issues ||= []
356 @fixed_issues ||= []
323 end
357 end
324
358
325 private
359 private
326 # Find project of id params[:id]
360 # Find project of id params[:id]
327 # if not found, redirect to project list
361 # if not found, redirect to project list
328 # Used as a before_filter
362 # Used as a before_filter
329 def find_project
363 def find_project
330 @project = Project.find(params[:id])
364 @project = Project.find(params[:id])
331 rescue
365 rescue
332 redirect_to :action => 'list'
366 redirect_to :action => 'list'
333 end
367 end
334 end
368 end
@@ -1,171 +1,171
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module ApplicationHelper
18 module ApplicationHelper
19
19
20 # Return current logged in user or nil
20 # Return current logged in user or nil
21 def loggedin?
21 def loggedin?
22 @logged_in_user
22 @logged_in_user
23 end
23 end
24
24
25 # Return true if user is logged in and is admin, otherwise false
25 # Return true if user is logged in and is admin, otherwise false
26 def admin_loggedin?
26 def admin_loggedin?
27 @logged_in_user and @logged_in_user.admin?
27 @logged_in_user and @logged_in_user.admin?
28 end
28 end
29
29
30 # Return true if user is authorized for controller/action, otherwise false
30 # Return true if user is authorized for controller/action, otherwise false
31 def authorize_for(controller, action)
31 def authorize_for(controller, action)
32 # check if action is allowed on public projects
32 # check if action is allowed on public projects
33 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
33 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
34 return true
34 return true
35 end
35 end
36 # check if user is authorized
36 # check if user is authorized
37 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) )
37 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) )
38 return true
38 return true
39 end
39 end
40 return false
40 return false
41 end
41 end
42
42
43 # Display a link if user is authorized
43 # Display a link if user is authorized
44 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
44 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
45 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
45 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
46 end
46 end
47
47
48 # Display a link to user's account page
48 # Display a link to user's account page
49 def link_to_user(user)
49 def link_to_user(user)
50 link_to user.display_name, :controller => 'account', :action => 'show', :id => user
50 link_to user.display_name, :controller => 'account', :action => 'show', :id => user
51 end
51 end
52
52
53 def format_date(date)
53 def format_date(date)
54 l_date(date) if date
54 l_date(date) if date
55 end
55 end
56
56
57 def format_time(time)
57 def format_time(time)
58 l_datetime(time) if time
58 l_datetime(time) if time
59 end
59 end
60
60
61 def pagination_links_full(paginator, options={}, html_options={})
61 def pagination_links_full(paginator, options={}, html_options={})
62 html = ''
62 html = ''
63 html << link_to_remote(('&#171; ' + l(:label_previous)),
63 html << link_to_remote(('&#171; ' + l(:label_previous)),
64 {:update => "content", :url => { :page => paginator.current.previous }},
64 {:update => "content", :url => { :page => paginator.current.previous }},
65 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.previous}))}) + ' ' if paginator.current.previous
65 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.previous}))}) + ' ' if paginator.current.previous
66
66
67 html << (pagination_links_each(paginator, options) do |n|
67 html << (pagination_links_each(paginator, options) do |n|
68 link_to_remote(n.to_s,
68 link_to_remote(n.to_s,
69 {:url => {:action => 'list', :params => @params.merge({:page => n})}, :update => 'content'},
69 {:url => {:action => 'list', :params => @params.merge({:page => n})}, :update => 'content'},
70 {:href => url_for(:action => 'list', :params => @params.merge({:page => n}))})
70 {:href => url_for(:action => 'list', :params => @params.merge({:page => n}))})
71 end || '')
71 end || '')
72
72
73 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
73 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
74 {:update => "content", :url => { :page => paginator.current.next }},
74 {:update => "content", :url => { :page => paginator.current.next }},
75 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.next}))}) if paginator.current.next
75 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.next}))}) if paginator.current.next
76 html
76 html
77 end
77 end
78
78
79 def error_messages_for(object_name, options = {})
79 def error_messages_for(object_name, options = {})
80 options = options.symbolize_keys
80 options = options.symbolize_keys
81 object = instance_variable_get("@#{object_name}")
81 object = instance_variable_get("@#{object_name}")
82 if object && !object.errors.empty?
82 if object && !object.errors.empty?
83 # build full_messages here with controller current language
83 # build full_messages here with controller current language
84 full_messages = []
84 full_messages = []
85 object.errors.each do |attr, msg|
85 object.errors.each do |attr, msg|
86 next if msg.nil?
86 next if msg.nil?
87 if attr == "base"
87 if attr == "base"
88 full_messages << l(msg)
88 full_messages << l(msg)
89 else
89 else
90 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
90 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
91 end
91 end
92 end
92 end
93 # retrieve custom values error messages
93 # retrieve custom values error messages
94 if object.errors[:custom_values]
94 if object.errors[:custom_values]
95 object.custom_values.each do |v|
95 object.custom_values.each do |v|
96 v.errors.each do |attr, msg|
96 v.errors.each do |attr, msg|
97 next if msg.nil?
97 next if msg.nil?
98 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
98 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
99 end
99 end
100 end
100 end
101 end
101 end
102 content_tag("div",
102 content_tag("div",
103 content_tag(
103 content_tag(
104 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
104 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
105 ) +
105 ) +
106 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
106 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
107 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
107 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
108 )
108 )
109 else
109 else
110 ""
110 ""
111 end
111 end
112 end
112 end
113
113
114 def lang_options_for_select
114 def lang_options_for_select
115 (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]}
115 (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]}
116 end
116 end
117
117
118 def label_tag_for(name, option_tags = nil, options = {})
118 def label_tag_for(name, option_tags = nil, options = {})
119 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
119 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
120 content_tag("label", label_text)
120 content_tag("label", label_text)
121 end
121 end
122
122
123 def labelled_tabular_form_for(name, object, options, &proc)
123 def labelled_tabular_form_for(name, object, options, &proc)
124 options[:html] ||= {}
124 options[:html] ||= {}
125 options[:html].store :class, "tabular"
125 options[:html].store :class, "tabular"
126 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
126 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
127 end
127 end
128
128
129 def check_all_links(form_name)
129 def check_all_links(form_name)
130 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
130 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
131 " | " +
131 " | " +
132 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
132 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
133 end
133 end
134
134
135 def calendar_for(field_id)
135 def calendar_for(field_id)
136 image_tag("calendar", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
136 image_tag("calendar", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
137 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
137 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
138 end
138 end
139 end
139 end
140
140
141 class TabularFormBuilder < ActionView::Helpers::FormBuilder
141 class TabularFormBuilder < ActionView::Helpers::FormBuilder
142 include GLoc
142 include GLoc
143
143
144 def initialize(object_name, object, template, options, proc)
144 def initialize(object_name, object, template, options, proc)
145 set_language_if_valid options.delete(:lang)
145 set_language_if_valid options.delete(:lang)
146 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
146 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
147 end
147 end
148
148
149 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
149 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
150 src = <<-END_SRC
150 src = <<-END_SRC
151 def #{selector}(field, options = {})
151 def #{selector}(field, options = {})
152 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
152 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
153 label = @template.content_tag("label", label_text,
153 label = @template.content_tag("label", label_text,
154 :class => (@object.errors[field] ? "error" : nil),
154 :class => (@object.errors[field] ? "error" : nil),
155 :for => (@object_name.to_s + "_" + field.to_s))
155 :for => (@object_name.to_s + "_" + field.to_s))
156 label + super
156 label + super
157 end
157 end
158 END_SRC
158 END_SRC
159 class_eval src, __FILE__, __LINE__
159 class_eval src, __FILE__, __LINE__
160 end
160 end
161
161
162 def select(field, choices, options = {})
162 def select(field, choices, options = {})
163 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
163 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
164 label = @template.content_tag("label", label_text,
164 label = @template.content_tag("label", label_text,
165 :class => (@object.errors[field] ? "error" : nil),
165 :class => (@object.errors[field] ? "error" : nil),
166 :for => (@object_name.to_s + "_" + field.to_s))
166 :for => (@object_name.to_s + "_" + field.to_s))
167 label + super
167 label + super
168 end
168 end
169
169
170 end
170 end
171
171
@@ -1,70 +1,72
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module CustomFieldsHelper
18 module CustomFieldsHelper
19
19
20 # Return custom field html tag corresponding to its format
20 # Return custom field html tag corresponding to its format
21 def custom_field_tag(custom_value)
21 def custom_field_tag(custom_value)
22 custom_field = custom_value.custom_field
22 custom_field = custom_value.custom_field
23 field_name = "custom_fields[#{custom_field.id}]"
23 field_name = "custom_fields[#{custom_field.id}]"
24 field_id = "custom_fields_#{custom_field.id}"
24 field_id = "custom_fields_#{custom_field.id}"
25
25
26 case custom_field.field_format
26 case custom_field.field_format
27 when "string", "int"
27 when "string", "int"
28 text_field 'custom_value', 'value', :name => field_name, :id => field_id
28 text_field 'custom_value', 'value', :name => field_name, :id => field_id
29 when "date"
29 when "date"
30 text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) +
30 text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) +
31 calendar_for(field_id)
31 calendar_for(field_id)
32 when "text"
32 when "text"
33 text_area 'custom_value', 'value', :name => field_name, :id => field_id, :cols => 60, :rows => 3
33 text_area 'custom_value', 'value', :name => field_name, :id => field_id, :cols => 60, :rows => 3
34 when "bool"
34 when "bool"
35 check_box 'custom_value', 'value', :name => field_name, :id => field_id
35 check_box 'custom_value', 'value', :name => field_name, :id => field_id
36 when "list"
36 when "list"
37 select 'custom_value', 'value', custom_field.possible_values.split('|'), { :include_blank => true }, :name => field_name, :id => field_id
37 select 'custom_value', 'value', custom_field.possible_values.split('|'), { :include_blank => true }, :name => field_name, :id => field_id
38 end
38 end
39 end
39 end
40
40
41 # Return custom field label tag
41 # Return custom field label tag
42 def custom_field_label_tag(custom_value)
42 def custom_field_label_tag(custom_value)
43 content_tag "label", custom_value.custom_field.name +
43 content_tag "label", custom_value.custom_field.name +
44 (custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""),
44 (custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""),
45 :for => "custom_fields_#{custom_value.custom_field.id}",
45 :for => "custom_fields_#{custom_value.custom_field.id}",
46 :class => (custom_value.errors.empty? ? nil : "error" )
46 :class => (custom_value.errors.empty? ? nil : "error" )
47 end
47 end
48
48
49 # Return custom field tag with its label tag
49 # Return custom field tag with its label tag
50 def custom_field_tag_with_label(custom_value)
50 def custom_field_tag_with_label(custom_value)
51 custom_field_label_tag(custom_value) + custom_field_tag(custom_value)
51 custom_field_label_tag(custom_value) + custom_field_tag(custom_value)
52 end
52 end
53
53
54 # Return a string used to display a custom value
54 # Return a string used to display a custom value
55 def show_value(custom_value)
55 def show_value(custom_value)
56 return "" unless custom_value
57
56 case custom_value.custom_field.field_format
58 case custom_value.custom_field.field_format
57 when "date"
59 when "date"
58 format_date(custom_value.value.to_date)
60 l_date(custom_value.value.to_date) if custom_value.value
59 when "bool"
61 when "bool"
60 l_YesNo(custom_value.value == "1")
62 l_YesNo(custom_value.value == "1")
61 else
63 else
62 custom_value.value
64 custom_value.value
63 end
65 end
64 end
66 end
65
67
66 # Return an array of custom field formats which can be used in select_tag
68 # Return an array of custom field formats which can be used in select_tag
67 def custom_field_formats_for_select
69 def custom_field_formats_for_select
68 CustomField::FIELD_FORMATS.keys.collect { |k| [ l(CustomField::FIELD_FORMATS[k]), k ] }
70 CustomField::FIELD_FORMATS.keys.collect { |k| [ l(CustomField::FIELD_FORMATS[k]), k ] }
69 end
71 end
70 end
72 end
@@ -1,101 +1,106
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module SearchFilterHelper
18 module SearchFilterHelper
19
19
20 def search_filter_criteria(name, options = {})
20 def search_filter_criteria(name, options = {})
21 @search_filter ||= {}
21 @search_filter ||= {}
22 @search_filter[name] ||= {}
22 @search_filter[name] ||= {}
23 @search_filter[name][:options] = []
23 @search_filter[name][:options] = []
24 @search_filter[name][:conditions] = {}
24 @search_filter[name][:conditions] = {}
25 yield.each { |c|
25 yield.each { |c|
26 @search_filter[name][:options] << [c[0], c[1].to_s]
26 @search_filter[name][:options] << [c[0], c[1].to_s]
27 @search_filter[name][:conditions].store(c[1].to_s, c[2])
27 @search_filter[name][:conditions].store(c[1].to_s, c[2])
28 }
28 }
29 end
29 end
30
30
31 def search_filter_update
31 def search_filter_update
32 session[:search_filter] ||= {}
32 session[:search_filter] ||= {}
33 @search_filter.each_key {|field| session[:search_filter][field] = params[field] }
33 @search_filter.each_key {|field| session[:search_filter][field] = params[field] }
34 end
34 end
35
35
36 def search_filter_clause
36 def search_filter_clause
37 session[:search_filter] ||= {}
37 session[:search_filter] ||= {}
38 clause = ["1=1"]
38 clause = ["1=1"]
39 @search_filter.each { |k, v|
39 @search_filter.each { |k, v|
40 filter_value = session[:search_filter][k] || v[:options][0][1]
40 filter_value = session[:search_filter][k] || v[:options][0][1]
41 if v[:conditions][filter_value]
41 if v[:conditions][filter_value]
42 clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first
42 clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first
43 clause += v[:conditions][filter_value][1..-1]
43 clause += v[:conditions][filter_value][1..-1]
44 end
44 end
45 }
45 }
46 clause
46 clause
47 end
47 end
48
48
49 def search_filter_tag(criteria, options = {})
49 def search_filter_tag(criteria, options = {})
50 session[:search_filter] ||= {}
50 session[:search_filter] ||= {}
51 options[:name] = criteria
51 options[:name] = criteria
52 options[:class] += " active-filter" if session[:search_filter][criteria] and session[:search_filter][criteria] != @search_filter[criteria][:options][0][1]
52 options[:class] += " active-filter" if session[:search_filter][criteria] and session[:search_filter][criteria] != @search_filter[criteria][:options][0][1]
53 content_tag("select",
53 content_tag("select",
54 options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
54 options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
55 options
55 options
56 )
56 )
57 end
57 end
58
58
59 def search_filter_init_list_issues
59 def search_filter_init_list_issues
60 search_filter_criteria('status_id') {
60 search_filter_criteria('status_id') {
61 [ [('['+l(:label_open_issues_plural)+']'), "O", ["issue_statuses.is_closed=?", false]],
61 [ [('['+l(:label_open_issues_plural)+']'), "O", ["issue_statuses.is_closed=?", false]],
62 [('['+l(:label_closed_issues_plural)+']'), "C", ["issue_statuses.is_closed=?", true]],
62 [('['+l(:label_closed_issues_plural)+']'), "C", ["issue_statuses.is_closed=?", true]],
63 [('['+l(:label_all)+']'), "A", nil]
63 [('['+l(:label_all)+']'), "A", nil]
64 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
64 ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] }
65 }
65 }
66
66
67 search_filter_criteria('tracker_id') {
67 search_filter_criteria('tracker_id') {
68 [ [('['+l(:label_all)+']'), "A", nil]
68 [ [('['+l(:label_all)+']'), "A", nil]
69 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
69 ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] }
70 }
70 }
71
71
72 search_filter_criteria('priority_id') {
72 search_filter_criteria('priority_id') {
73 [ [('['+l(:label_all)+']'), "A", nil]
73 [ [('['+l(:label_all)+']'), "A", nil]
74 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
74 ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] }
75 }
75 }
76
76
77 search_filter_criteria('category_id') {
77 search_filter_criteria('category_id') {
78 [ [('['+l(:label_all)+']'), "A", nil],
78 [ [('['+l(:label_all)+']'), "A", nil],
79 [('['+l(:label_none)+']'), "N", ["issues.category_id is null"]]
79 [('['+l(:label_none)+']'), "N", ["issues.category_id is null"]]
80 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
80 ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] }
81 }
81 }
82
82
83 search_filter_criteria('fixed_version_id') {
83 search_filter_criteria('fixed_version_id') {
84 [ [('['+l(:label_all)+']'), "A", nil],
84 [ [('['+l(:label_all)+']'), "A", nil],
85 [('['+l(:label_none)+']'), "N", ["issues.fixed_version_id is null"]]
85 [('['+l(:label_none)+']'), "N", ["issues.fixed_version_id is null"]]
86 ] + @project.versions.collect {|s| [s.name, s.id, ["issues.fixed_version_id=?", s.id]] }
86 ] + @project.versions.collect {|s| [s.name, s.id, ["issues.fixed_version_id=?", s.id]] }
87 }
87 }
88
88
89 search_filter_criteria('author_id') {
90 [ [('['+l(:label_all)+']'), "A", nil],
91 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.author_id=?", s.id]] }
92 }
93
89 search_filter_criteria('assigned_to_id') {
94 search_filter_criteria('assigned_to_id') {
90 [ [('['+l(:label_all)+']'), "A", nil],
95 [ [('['+l(:label_all)+']'), "A", nil],
91 [('['+l(:label_none)+']'), "N", ["issues.assigned_to_id is null"]]
96 [('['+l(:label_none)+']'), "N", ["issues.assigned_to_id is null"]]
92 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
97 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] }
93 }
98 }
94
99
95 search_filter_criteria('subproject_id') {
100 search_filter_criteria('subproject_id') {
96 [ [('['+l(:label_none)+']'), "N", ["issues.project_id=?", @project.id]],
101 [ [('['+l(:label_none)+']'), "N", ["issues.project_id=?", @project.id]],
97 [('['+l(:label_all)+']'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]]
102 [('['+l(:label_all)+']'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]]
98 ]
103 ]
99 }
104 }
100 end
105 end
101 end No newline at end of file
106 end
@@ -1,42 +1,46
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Enumeration < ActiveRecord::Base
18 class Enumeration < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20
20
21 validates_presence_of :opt, :name
21 validates_presence_of :opt, :name
22 validates_uniqueness_of :name, :scope => [:opt]
22 validates_uniqueness_of :name, :scope => [:opt]
23
23
24 OPTIONS = {
24 OPTIONS = {
25 "IPRI" => :enumeration_issue_priorities,
25 "IPRI" => :enumeration_issue_priorities,
26 "DCAT" => :enumeration_doc_categories
26 "DCAT" => :enumeration_doc_categories
27 }.freeze
27 }.freeze
28
28
29 def self.get_values(option)
29 def self.get_values(option)
30 find(:all, :conditions => ['opt=?', option])
30 find(:all, :conditions => ['opt=?', option])
31 end
31 end
32
33 def option_name
34 OPTIONS[self.opt]
35 end
32
36
33 private
37 private
34 def check_integrity
38 def check_integrity
35 case self.opt
39 case self.opt
36 when "IPRI"
40 when "IPRI"
37 raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
41 raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
38 when "DCAT"
42 when "DCAT"
39 raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
43 raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
40 end
44 end
41 end
45 end
42 end
46 end
@@ -1,64 +1,69
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Issue < ActiveRecord::Base
18 class Issue < ActiveRecord::Base
19
19
20 belongs_to :project
20 belongs_to :project
21 belongs_to :tracker
21 belongs_to :tracker
22 belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
22 belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
23 belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
23 belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
24 belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id'
24 belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id'
25 belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id'
25 belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id'
26 belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id'
26 belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id'
27 belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
27 belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
28
28
29 has_many :histories, :class_name => 'IssueHistory', :dependent => true, :order => "issue_histories.created_on DESC", :include => :status
29 has_many :histories, :class_name => 'IssueHistory', :dependent => true, :order => "issue_histories.created_on DESC", :include => :status
30 has_many :attachments, :as => :container, :dependent => true
30 has_many :attachments, :as => :container, :dependent => true
31
31
32 has_many :custom_values, :dependent => true, :as => :customized
32 has_many :custom_values, :dependent => true, :as => :customized
33 has_many :custom_fields, :through => :custom_values
33 has_many :custom_fields, :through => :custom_values
34
34
35 validates_presence_of :subject, :description, :priority, :tracker, :author
35 validates_presence_of :subject, :description, :priority, :tracker, :author
36 validates_associated :custom_values, :on => :update
36 validates_associated :custom_values, :on => :update
37
37
38 # set default status for new issues
38 # set default status for new issues
39 def before_validation
39 def before_validation
40 self.status = IssueStatus.default if new_record?
40 self.status = IssueStatus.default if new_record?
41 end
41 end
42
42
43 def validate
43 def validate
44 if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
44 if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
45 errors.add :due_date, :activerecord_error_not_a_date
45 errors.add :due_date, :activerecord_error_not_a_date
46 end
46 end
47 end
47 end
48
48
49 def before_create
49 def before_create
50 build_history
50 build_history
51 end
51 end
52
52
53 def long_id
53 def long_id
54 "%05d" % self.id
54 "%05d" % self.id
55 end
55 end
56
57 def custom_value_for(custom_field)
58 self.custom_values.each {|v| return v if v.custom_field_id == custom_field.id }
59 return nil
60 end
56
61
57 private
62 private
58 # Creates an history for the issue
63 # Creates an history for the issue
59 def build_history
64 def build_history
60 @history = self.histories.build
65 @history = self.histories.build
61 @history.status = self.status
66 @history.status = self.status
62 @history.author = self.author
67 @history.author = self.author
63 end
68 end
64 end
69 end
@@ -1,52 +1,57
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Project < ActiveRecord::Base
18 class Project < ActiveRecord::Base
19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
20 has_many :members, :dependent => true
20 has_many :members, :dependent => true
21 has_many :users, :through => :members
21 has_many :users, :through => :members
22 has_many :custom_values, :dependent => true, :as => :customized
22 has_many :custom_values, :dependent => true, :as => :customized
23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status
24 has_many :documents, :dependent => true
24 has_many :documents, :dependent => true
25 has_many :news, :dependent => true, :include => :author
25 has_many :news, :dependent => true, :include => :author
26 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
26 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
27 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
27 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
28 acts_as_tree :order => "name", :counter_cache => true
28 acts_as_tree :order => "name", :counter_cache => true
29
29
30 validates_presence_of :name, :description
30 validates_presence_of :name, :description
31 validates_uniqueness_of :name
31 validates_uniqueness_of :name
32 validates_associated :custom_values, :on => :update
32 validates_associated :custom_values, :on => :update
33
33
34 # returns 5 last created projects
34 # returns 5 last created projects
35 def self.latest
35 def self.latest
36 find(:all, :limit => 5, :order => "created_on DESC")
36 find(:all, :limit => 5, :order => "created_on DESC")
37 end
37 end
38
38
39 # Returns an array of all custom fields enabled for project issues
39 # Returns an array of all custom fields enabled for project issues
40 # (explictly associated custom fields and custom fields enabled for all projects)
40 # (explictly associated custom fields and custom fields enabled for all projects)
41 def custom_fields_for_issues(tracker)
41 def custom_fields_for_issues(tracker)
42 tracker.custom_fields.find(:all, :include => :projects,
42 tracker.custom_fields.find(:all, :include => :projects,
43 :conditions => ["is_for_all=? or project_id=?", true, self.id])
43 :conditions => ["is_for_all=? or project_id=?", true, self.id])
44 #(CustomField.for_all + custom_fields).uniq
44 #(CustomField.for_all + custom_fields).uniq
45 end
45 end
46
47 def all_custom_fields
48 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
49 :conditions => ["is_for_all=? or project_id=?", true, self.id])
50 end
46
51
47 protected
52 protected
48 def validate
53 def validate
49 errors.add(parent_id, " must be a root project") if parent and parent.parent
54 errors.add(parent_id, " must be a root project") if parent and parent.parent
50 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
55 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
51 end
56 end
52 end
57 end
@@ -1,47 +1,47
1 <h2><%= @document.title %></h2>
1 <h2><%= @document.title %></h2>
2
2
3 <strong><%=l(:field_description)%>:</strong> <%= @document.description %><br />
3 <strong><%=l(:field_description)%>:</strong> <%= @document.description %><br />
4 <strong><%=l(:field_category)%>:</strong> <%= @document.category.name %><br />
4 <strong><%=l(:field_category)%>:</strong> <%= @document.category.name %><br />
5 <br />
5 <br />
6
6
7 <% if authorize_for('documents', 'edit') %>
7 <% if authorize_for('documents', 'edit') %>
8 <%= start_form_tag({ :controller => 'documents', :action => 'edit', :id => @document }, :method => 'get' ) %>
8 <%= start_form_tag({ :controller => 'documents', :action => 'edit', :id => @document }, :method => 'get' ) %>
9 <%= submit_tag l(:button_edit) %>
9 <%= submit_tag l(:button_edit) %>
10 <%= end_form_tag %>
10 <%= end_form_tag %>
11 <% end %>
11 <% end %>
12
12
13 <% if authorize_for('documents', 'destroy') %>
13 <% if authorize_for('documents', 'destroy') %>
14 <%= start_form_tag({ :controller => 'documents', :action => 'destroy', :id => @document } ) %>
14 <%= start_form_tag({ :controller => 'documents', :action => 'destroy', :id => @document } ) %>
15 <%= submit_tag l(:button_delete) %>
15 <%= submit_tag l(:button_delete) %>
16 <%= end_form_tag %>
16 <%= end_form_tag %>
17 <% end %>
17 <% end %>
18
18
19 <br /><br />
19 <br /><br />
20
20
21 <table class="listTableContent">
21 <table class="reportTableContent">
22 <% for attachment in @attachments %>
22 <% for attachment in @attachments %>
23 <tr class="<%= cycle("odd", "even") %>">
23 <tr class="<%= cycle("odd", "even") %>">
24 <td><%= format_date(attachment.created_on) %></td>
24 <td><%= format_date(attachment.created_on) %></td>
25 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
25 <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>
26 <td align="center"><%= attachment.author.display_name %></td>
26 <td align="center"><%= attachment.author.display_name %></td>
27 <td><%= human_size(attachment.filesize) %><br /><%= lwr(:label_download, attachment.downloads) %></td>
27 <td><%= human_size(attachment.filesize) %><br /><%= lwr(:label_download, attachment.downloads) %></td>
28
28
29 <% if authorize_for('documents', 'destroy_attachment') %>
29 <% if authorize_for('documents', 'destroy_attachment') %>
30 <td align="center">
30 <td align="center">
31 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
31 <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>
32 <%= submit_tag l(:button_delete), :class => "button-small" %>
32 <%= submit_tag l(:button_delete), :class => "button-small" %>
33 <%= end_form_tag %>
33 <%= end_form_tag %>
34 </tr>
34 </tr>
35 <% end %>
35 <% end %>
36
36
37 <% end %>
37 <% end %>
38 </table>
38 </table>
39 <br />
39 <br />
40
40
41 <% if authorize_for('documents', 'add_attachment') %>
41 <% if authorize_for('documents', 'add_attachment') %>
42 <%= start_form_tag ({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true) %>
42 <%= start_form_tag ({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true) %>
43 <%=l(:label_attachment_new)%><br /><%= file_field 'attachment', 'file' %>
43 <%=l(:label_attachment_new)%><br /><%= file_field 'attachment', 'file' %>
44 <%= submit_tag l(:button_add) %>
44 <%= submit_tag l(:button_add) %>
45 <%= end_form_tag %>
45 <%= end_form_tag %>
46 <% end %>
46 <% end %>
47
47
@@ -1,6 +1,6
1 <h2><%=l(:label_enumeration_new)%></h2>
1 <h2><%= l(@enumeration.option_name) %>: <%=l(:label_enumeration_new)%></h2>
2
2
3 <%= start_form_tag({:action => 'create'}, :class => "tabular") %>
3 <%= start_form_tag({:action => 'create'}, :class => "tabular") %>
4 <%= render :partial => 'form' %>
4 <%= render :partial => 'form' %>
5 <%= submit_tag l(:button_create) %>
5 <%= submit_tag l(:button_create) %>
6 <%= end_form_tag %>
6 <%= end_form_tag %>
@@ -1,111 +1,119
1 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2>
1 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF', :action => 'export_pdf', :id => @issue %>
5 </small>
6 </div>
2
7
3 <div class="box">
8 <div class="box">
4 <p>
9 <p>
5 <b><%=l(:field_status)%> :</b> <%= @issue.status.name %> &nbsp &nbsp
10 <b><%=l(:field_status)%> :</b> <%= @issue.status.name %> &nbsp &nbsp
6 <b><%=l(:field_priority)%> :</b> <%= @issue.priority.name %> &nbsp &nbsp
11 <b><%=l(:field_priority)%> :</b> <%= @issue.priority.name %> &nbsp &nbsp
7 <b><%=l(:field_assigned_to)%> :</b> <%= @issue.assigned_to ? @issue.assigned_to.display_name : "-" %> &nbsp &nbsp
12 <b><%=l(:field_assigned_to)%> :</b> <%= @issue.assigned_to ? @issue.assigned_to.display_name : "-" %> &nbsp &nbsp
8 <b><%=l(:field_category)%> :</b> <%= @issue.category ? @issue.category.name : "-" %>
13 <b><%=l(:field_category)%> :</b> <%= @issue.category ? @issue.category.name : "-" %>
9 </p>
14 </p>
10 <p><b><%=l(:field_author)%> :</b> <%= @issue.author.display_name %></p>
15 <div class="tabular">
11 <p><b><%=l(:field_subject)%> :</b> <%= @issue.subject %></p>
16 <p><label><%=l(:field_author)%> :</label> <%= link_to_user @issue.author %>&nbsp;</p>
12 <p><b><%=l(:field_description)%> :</b> <%= simple_format auto_link @issue.description %></p>
17 <p><label><%=l(:field_created_on)%> :</label> <%= format_date(@issue.created_on) %>&nbsp;</p>
13 <p><b><%=l(:field_due_date)%> :</b> <%= format_date(@issue.due_date) %></p>
18 <p><label><%=l(:field_subject)%> :</label> <%= @issue.subject %>&nbsp;</p>
14 <p><b><%=l(:field_created_on)%> :</b> <%= format_date(@issue.created_on) %></p>
19 <%= simple_format ("<label>" + l(:field_description) + ": </label>" + auto_link(@issue.description)) %>
20 <p><label><%=l(:field_due_date)%> :</label> <%= format_date(@issue.due_date) %>&nbsp;</p>
15
21
16 <% for custom_value in @custom_values %>
22 <% for custom_value in @custom_values %>
17 <p><b><%= custom_value.custom_field.name %></b> : <%= show_value custom_value %></p>
23 <p><label><%= custom_value.custom_field.name %> :</label> <%= show_value custom_value %></p>
18 <% end %>
24 <% end %>
25 &nbsp;
26 </div>
19
27
20 <% if authorize_for('issues', 'edit') %>
28 <% if authorize_for('issues', 'edit') %>
21 <%= start_form_tag ({:controller => 'issues', :action => 'edit', :id => @issue}, :method => "get" ) %>
29 <%= start_form_tag ({:controller => 'issues', :action => 'edit', :id => @issue}, :method => "get" ) %>
22 <%= submit_tag l(:button_edit) %>
30 <%= submit_tag l(:button_edit) %>
23 <%= end_form_tag %>
31 <%= end_form_tag %>
24 &nbsp;&nbsp;
32 &nbsp;&nbsp;
25 <% end %>
33 <% end %>
26
34
27 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
35 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
28 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
36 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
29 <label for="history_status_id"><%=l(:label_change_status)%> :</label>
37 <%=l(:label_change_status)%> :
30 <select name="history[status_id]">
38 <select name="history[status_id]">
31 <%= options_from_collection_for_select @status_options, "id", "name" %>
39 <%= options_from_collection_for_select @status_options, "id", "name" %>
32 </select>
40 </select>
33 <%= submit_tag l(:button_change) %>
41 <%= submit_tag l(:button_change) %>
34 <%= end_form_tag %>
42 <%= end_form_tag %>
35 &nbsp;&nbsp;
43 &nbsp;&nbsp;
36 <% end %>
44 <% end %>
37
45
38 <% if authorize_for('projects', 'move_issues') %>
46 <% if authorize_for('projects', 'move_issues') %>
39 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project} ) %>
47 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project} ) %>
40 <%= hidden_field_tag "issue_ids[]", @issue.id %>
48 <%= hidden_field_tag "issue_ids[]", @issue.id %>
41 <%= submit_tag l(:button_move) %>
49 <%= submit_tag l(:button_move) %>
42 <%= end_form_tag %>
50 <%= end_form_tag %>
43 &nbsp;&nbsp;
51 &nbsp;&nbsp;
44 <% end %>
52 <% end %>
45
53
46 <% if authorize_for('issues', 'destroy') %>
54 <% if authorize_for('issues', 'destroy') %>
47 <%= start_form_tag ({:controller => 'issues', :action => 'destroy', :id => @issue} ) %>
55 <%= start_form_tag ({:controller => 'issues', :action => 'destroy', :id => @issue} ) %>
48 <%= submit_tag l(:button_delete) %>
56 <%= submit_tag l(:button_delete) %>
49 <%= end_form_tag %>
57 <%= end_form_tag %>
50 &nbsp;&nbsp;
58 &nbsp;&nbsp;
51 <% end %>
59 <% end %>
52 </div>
60 </div>
53
61
54 <% if authorize_for('issues', 'add_note') %>
62 <% if authorize_for('issues', 'add_note') %>
55 <div class="box">
63 <div class="box">
56 <h3><%= l(:label_add_note) %></h3>
64 <h3><%= l(:label_add_note) %></h3>
57 <%= start_form_tag ({:controller => 'issues', :action => 'add_note', :id => @issue}, :class => "tabular" ) %>
65 <%= start_form_tag ({:controller => 'issues', :action => 'add_note', :id => @issue}, :class => "tabular" ) %>
58 <p><label for="history_notes"><%=l(:field_notes)%></label>
66 <p><label for="history_notes"><%=l(:field_notes)%></label>
59 <%= text_area 'history', 'notes', :cols => 60, :rows => 10 %></p>
67 <%= text_area 'history', 'notes', :cols => 60, :rows => 10 %></p>
60 <%= submit_tag l(:button_add) %>
68 <%= submit_tag l(:button_add) %>
61 <%= end_form_tag %>
69 <%= end_form_tag %>
62 </div>
70 </div>
63 <% end %>
71 <% end %>
64
72
65 <div class="splitcontentleft">
73 <div class="splitcontentleft">
66 <div class="box">
74 <div class="box">
67 <h3><%=l(:label_history)%></h3>
75 <h3><%=l(:label_history)%></h3>
68 <table width="100%">
76 <table width="100%">
69 <% for history in @issue.histories.find(:all, :include => [:author, :status]) %>
77 <% for history in @issue.histories.find(:all, :include => [:author, :status]) %>
70 <tr>
78 <tr>
71 <td><%= format_date(history.created_on) %></td>
79 <td><%= format_date(history.created_on) %></td>
72 <td><%= history.author.display_name %></td>
80 <td><%= history.author.display_name %></td>
73 <td><b><%= history.status.name %></b></td>
81 <td><b><%= history.status.name %></b></td>
74 </tr>
82 </tr>
75 <% if history.notes? %>
83 <% if history.notes? %>
76 <tr><td colspan=3><%= simple_format auto_link history.notes %></td></tr>
84 <tr><td colspan=3><%= simple_format auto_link history.notes %></td></tr>
77 <% end %>
85 <% end %>
78 <% end %>
86 <% end %>
79 </table>
87 </table>
80 </div>
88 </div>
81 </div>
89 </div>
82
90
83 <div class="splitcontentright">
91 <div class="splitcontentright">
84 <div class="box">
92 <div class="box">
85 <h3><%=l(:label_attachment_plural)%></h3>
93 <h3><%=l(:label_attachment_plural)%></h3>
86 <table width="100%">
94 <table width="100%">
87 <% for attachment in @issue.attachments %>
95 <% for attachment in @issue.attachments %>
88 <tr>
96 <tr>
89 <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
97 <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
90 <td><%= format_date(attachment.created_on) %></td>
98 <td><%= format_date(attachment.created_on) %></td>
91 <td><%= attachment.author.display_name %></td>
99 <td><%= attachment.author.display_name %></td>
92 <% if authorize_for('issues', 'destroy_attachment') %>
100 <% if authorize_for('issues', 'destroy_attachment') %>
93 <td>
101 <td>
94 <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %>
102 <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %>
95 <%= submit_tag l(:button_delete), :class => "button-small" %>
103 <%= submit_tag l(:button_delete), :class => "button-small" %>
96 <%= end_form_tag %>
104 <%= end_form_tag %>
97 </td>
105 </td>
98 <% end %>
106 <% end %>
99 </tr>
107 </tr>
100 <% end %>
108 <% end %>
101 </table>
109 </table>
102 <br />
110 <br />
103 <% if authorize_for('issues', 'add_attachment') %>
111 <% if authorize_for('issues', 'add_attachment') %>
104 <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true) %>
112 <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true) %>
105 <%=l(:label_attachment_new)%>: <%= file_field 'attachment', 'file' %>
113 <%=l(:label_attachment_new)%>: <%= file_field 'attachment', 'file' %>
106 <%= submit_tag l(:button_add) %>
114 <%= submit_tag l(:button_add) %>
107 <%= end_form_tag %>
115 <%= end_form_tag %>
108 <% end %>
116 <% end %>
109 </div>
117 </div>
110 </div>
118 </div>
111
119
@@ -1,6 +1,7
1 <%=l(:label_issue)%> #<%= issue.id %> - <%= issue.subject %>
1 <%=l(:label_issue)%> #<%= issue.id %> - <%= issue.subject %>
2 <%=l(:field_author)%>: <%= issue.author.display_name %>
2 <%=l(:field_author)%>: <%= issue.author.display_name %>
3 <%=l(:field_status)%>: <%= issue.status.name %>
3
4
4 <%= issue.description %>
5 <%= issue.description %>
5
6
6 http://<%= $RDM_HOST_NAME %>/issues/show/<%= issue.id %> No newline at end of file
7 http://<%= $RDM_HOST_NAME %>/issues/show/<%= issue.id %>
@@ -1,60 +1,75
1 <h2><%=l(:label_issue_plural)%></h2>
1 <h2><%=l(:label_issue_plural)%></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF ', :action => 'export_issues_pdf', :id => @project %> |
5 <%= link_to 'CSV ', :action => 'export_issues_csv', :id => @project %>
6 </small>
7 </div>
2
8
3 <form method="post" class="noborder">
9 <form method="post" class="noborder">
4 <table cellpadding=2>
10 <table cellpadding=2>
5 <tr>
11 <tr>
6 <td><small><%=l(:field_status)%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>
12 <td><small><%=l(:field_status)%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>
7 <td><small><%=l(:field_tracker)%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>
13 <td><small><%=l(:field_tracker)%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>
8 <td><small><%=l(:field_priority)%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
14 <td><small><%=l(:field_priority)%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
9 <td><small><%=l(:field_category)%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>
15 <td><small><%=l(:field_category)%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>
10 <td><small><%=l(:field_fixed_version)%>:</small><br /><%= search_filter_tag 'fixed_version_id', :class => 'select-small' %></td>
16 <td><small><%=l(:field_fixed_version)%>:</small><br /><%= search_filter_tag 'fixed_version_id', :class => 'select-small' %></td>
17 <td><small><%=l(:field_author)%>:</small><br /><%= search_filter_tag 'author_id', :class => 'select-small' %></td>
11 <td><small><%=l(:field_assigned_to)%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>
18 <td><small><%=l(:field_assigned_to)%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>
12 <td><small><%=l(:label_subproject_plural)%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>
19 <td><small><%=l(:label_subproject_plural)%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>
13 <td valign="bottom">
20 <td valign="bottom">
14 <%= hidden_field_tag 'set_filter', 1 %>
21 <%= hidden_field_tag 'set_filter', 1 %>
15 <%= submit_tag l(:button_apply), :class => 'button-small' %>
22 <%= submit_tag l(:button_apply), :class => 'button-small' %>
16 </td>
23 </td>
17 <td valign="bottom">
24 <td valign="bottom">
18 <%= link_to l(:button_clear), :action => 'list_issues', :id => @project, :set_filter => 1 %>
25 <%= link_to l(:button_clear), :action => 'list_issues', :id => @project, :set_filter => 1 %>
19 </td>
26 </td>
20 </tr>
27 </tr>
21 </table>
28 </table>
22 <%= end_form_tag %>
29 <%= end_form_tag %>
23
30
24 &nbsp;
31 &nbsp;
25
26 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
27 <table class="listTableContent">
32 <table class="listTableContent">
28 <tr>
33 <tr>
29 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
34 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
30 <td colspan="2" align="right"><small><%= link_to l(:label_export_csv), :action => 'export_issues_csv', :id => @project.id %></small></td>
35 <td colspan="2" align="right">
31 </tr>
36 <small><%= l(:label_per_page) %>:</small>
37 <%= start_form_tag %>
38 <%= select_tag 'per_page', options_for_select(@results_per_page_options, @results_per_page), :class => 'select-small'%>
39 <%= submit_tag l(:button_apply), :class => 'button-small'%>
40 <%= end_form_tag %>
41 </td>
42 </tr>
43 </table>
44 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
45 <table class="listTableContent">
46
32 <tr class="ListHead">
47 <tr class="ListHead">
33 <td></td>
48 <td></td>
34 <%= sort_header_tag('issues.id', :caption => '#') %>
49 <%= sort_header_tag('issues.id', :caption => '#') %>
35 <%= sort_header_tag('issue_statuses.name', :caption => l(:field_status)) %>
50 <%= sort_header_tag('issue_statuses.name', :caption => l(:field_status)) %>
36 <%= sort_header_tag('issues.tracker_id', :caption => l(:field_tracker)) %>
51 <%= sort_header_tag('issues.tracker_id', :caption => l(:field_tracker)) %>
37 <th><%=l(:field_subject)%></th>
52 <th><%=l(:field_subject)%></th>
38 <%= sort_header_tag('users.lastname', :caption => l(:field_author)) %>
53 <%= sort_header_tag('users.lastname', :caption => l(:field_author)) %>
39 <%= sort_header_tag('issues.created_on', :caption => l(:field_created_on)) %>
54 <%= sort_header_tag('issues.created_on', :caption => l(:field_created_on)) %>
40 <%= sort_header_tag('issues.updated_on', :caption => l(:field_updated_on)) %>
55 <%= sort_header_tag('issues.updated_on', :caption => l(:field_updated_on)) %>
41 </tr>
56 </tr>
42 <% for issue in @issues %>
57 <% for issue in @issues %>
43 <tr bgcolor="#<%= issue.status.html_color %>">
58 <tr bgcolor="#<%= issue.status.html_color %>">
44 <td width="15"><%= check_box_tag "issue_ids[]", issue.id %></td>
59 <td width="15"><%= check_box_tag "issue_ids[]", issue.id %></td>
45 <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td>
60 <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td>
46 <td align="center"><%= issue.status.name %></td>
61 <td align="center"><%= issue.status.name %></td>
47 <td align="center"><%= issue.tracker.name %></td>
62 <td align="center"><%= issue.tracker.name %></td>
48 <td><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></td>
63 <td><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></td>
49 <td align="center"><%= issue.author.display_name %></td>
64 <td align="center"><%= issue.author.display_name %></td>
50 <td align="center"><%= format_time(issue.created_on) %></td>
65 <td align="center"><%= format_time(issue.created_on) %></td>
51 <td align="center"><%= format_time(issue.updated_on) %></td>
66 <td align="center"><%= format_time(issue.updated_on) %></td>
52 </tr>
67 </tr>
53 <% end %>
68 <% end %>
54 </table>
69 </table>
55 <p>
70 <p>
56 <%= pagination_links_full @issue_pages %>
71 <%= pagination_links_full @issue_pages %>
57 [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ]
72 [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ]
58 </p>
73 </p>
59 <%= submit_tag l(:button_move) %>
74 <%= submit_tag l(:button_move) %>
60 <%= end_form_tag %> No newline at end of file
75 <%= end_form_tag %>
@@ -1,22 +1,20
1 <h2><%=l(:label_report_plural)%></h2>
1 <h2><%=l(:label_report_plural)%></h2>
2
2
3 <div class="splitcontentleft">
3 <div class="splitcontentleft">
4 <strong><%=l(:field_tracker)%></strong>
4 <strong><%=l(:field_tracker)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
5 <%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
5 <%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
6 <p align="right"><small><%= link_to l(:label_details), :detail => 'tracker' %></small>&nbsp;</p>
6 <br />
7
7 <strong><%=l(:field_priority)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'priority' %> ]</small>
8 <strong><%=l(:field_priority)%></strong>
9 <%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
8 <%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
10 <p align="right"><small><%= link_to l(:label_details), :detail => 'priority' %></small>&nbsp;</p>
9 <br />
11
10 <strong><%=l(:field_author)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
12 <strong><%=l(:field_author)%></strong>
13 <%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
11 <%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
14 <p align="right"><small><%= link_to l(:label_details), :detail => 'author' %></small>&nbsp;</p>
12 <br />
15 </div>
13 </div>
16
14
17 <div class="splitcontentright">
15 <div class="splitcontentright">
18 <strong><%=l(:field_category)%></strong>
16 <strong><%=l(:field_category)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'category' %> ]</small>
19 <%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %>
17 <%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %>
20 <p align="right"><small><%= link_to l(:label_details), :detail => 'category' %></small>&nbsp;</p>
18 <br />
21 </div>
19 </div>
22
20
@@ -1,296 +1,299
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2
2
3 actionview_datehelper_select_day_prefix:
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 actionview_datehelper_select_month_prefix:
6 actionview_datehelper_select_month_prefix:
7 actionview_datehelper_select_year_prefix:
7 actionview_datehelper_select_year_prefix:
8 actionview_datehelper_time_in_words_day: 1 day
8 actionview_datehelper_time_in_words_day: 1 day
9 actionview_datehelper_time_in_words_day_plural: %d days
9 actionview_datehelper_time_in_words_day_plural: %d days
10 actionview_datehelper_time_in_words_hour_about: about an hour
10 actionview_datehelper_time_in_words_hour_about: about an hour
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 actionview_datehelper_time_in_words_minute: 1 minute
13 actionview_datehelper_time_in_words_minute: 1 minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 actionview_datehelper_time_in_words_minute_single: 1 minute
17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 actionview_datehelper_time_in_words_second_less_than: less than a second
18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 actionview_instancetag_blank_option: Bitte auserwählt
20 actionview_instancetag_blank_option: Bitte auserwählt
21
21
22 activerecord_error_inclusion: ist nicht in der Liste eingeschlossen
22 activerecord_error_inclusion: ist nicht in der Liste eingeschlossen
23 activerecord_error_exclusion: ist reserviert
23 activerecord_error_exclusion: ist reserviert
24 activerecord_error_invalid: ist unzulässig
24 activerecord_error_invalid: ist unzulässig
25 activerecord_error_confirmation: bringt nicht Bestätigung zusammen
25 activerecord_error_confirmation: bringt nicht Bestätigung zusammen
26 activerecord_error_accepted: muß angenommen werden
26 activerecord_error_accepted: muß angenommen werden
27 activerecord_error_empty: kann nicht leer sein
27 activerecord_error_empty: kann nicht leer sein
28 activerecord_error_blank: kann nicht leer sein
28 activerecord_error_blank: kann nicht leer sein
29 activerecord_error_too_long: ist zu lang
29 activerecord_error_too_long: ist zu lang
30 activerecord_error_too_short: ist zu kurz
30 activerecord_error_too_short: ist zu kurz
31 activerecord_error_wrong_length: ist die falsche Länge
31 activerecord_error_wrong_length: ist die falsche Länge
32 activerecord_error_taken: ist bereits genommen worden
32 activerecord_error_taken: ist bereits genommen worden
33 activerecord_error_not_a_number: ist nicht eine Zahl
33 activerecord_error_not_a_number: ist nicht eine Zahl
34 #activerecord_error_not_a_date: is not a valid date
34 #activerecord_error_not_a_date: is not a valid date
35
35
36 general_fmt_age: %d yr
36 general_fmt_age: %d yr
37 general_fmt_age_plural: %d yrs
37 general_fmt_age_plural: %d yrs
38 general_fmt_date: %%b %%d, %%Y (%%a)
38 general_fmt_date: %%b %%d, %%Y (%%a)
39 general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p
39 general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p
40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
41 general_fmt_time: %%I:%%M %%p
41 general_fmt_time: %%I:%%M %%p
42 general_text_No: 'Nein'
42 general_text_No: 'Nein'
43 general_text_Yes: 'Ja'
43 general_text_Yes: 'Ja'
44 general_text_no: 'nein'
44 general_text_no: 'nein'
45 general_text_yes: 'ja'
45 general_text_yes: 'ja'
46 general_lang_de: 'Deutsch'
46 general_lang_de: 'Deutsch'
47 general_csv_separator: ';'
47
48
48 notice_account_updated: Konto wurde erfolgreich aktualisiert.
49 notice_account_updated: Konto wurde erfolgreich aktualisiert.
49 notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort
50 notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort
50 notice_account_password_updated: Passwort wurde erfolgreich aktualisiert.
51 notice_account_password_updated: Passwort wurde erfolgreich aktualisiert.
51 notice_account_wrong_password: Falsches Passwort
52 notice_account_wrong_password: Falsches Passwort
52 notice_account_register_done: Konto wurde erfolgreich verursacht.
53 notice_account_register_done: Konto wurde erfolgreich verursacht.
53 notice_account_unknown_email: Unbekannter Benutzer.
54 notice_account_unknown_email: Unbekannter Benutzer.
54 notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern.
55 notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern.
55 notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden.
56 notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden.
56 notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen.
57 notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen.
57 notice_successful_create: Erfolgreiche Kreation.
58 notice_successful_create: Erfolgreiche Kreation.
58 notice_successful_update: Erfolgreiches Update.
59 notice_successful_update: Erfolgreiches Update.
59 notice_successful_delete: Erfolgreiche Auslassung.
60 notice_successful_delete: Erfolgreiche Auslassung.
60 notice_successful_connection: Erfolgreicher Anschluß.
61 notice_successful_connection: Erfolgreicher Anschluß.
61 notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden.
62 notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden.
62 notice_locking_conflict: Data have been updated by another user.
63 notice_locking_conflict: Data have been updated by another user.
63
64
64 gui_validation_error: 1 Störung
65 gui_validation_error: 1 Störung
65 gui_validation_error_plural: %d Störungen
66 gui_validation_error_plural: %d Störungen
66
67
67 field_name: Name
68 field_name: Name
68 field_description: Beschreibung
69 field_description: Beschreibung
69 field_summary: Zusammenfassung
70 field_summary: Zusammenfassung
70 field_is_required: Erforderlich
71 field_is_required: Erforderlich
71 field_firstname: Vorname
72 field_firstname: Vorname
72 field_lastname: Nachname
73 field_lastname: Nachname
73 field_mail: Email
74 field_mail: Email
74 field_filename: Datei
75 field_filename: Datei
75 field_filesize: Grootte
76 field_filesize: Grootte
76 field_downloads: Downloads
77 field_downloads: Downloads
77 field_author: Autor
78 field_author: Autor
78 field_created_on: Angelegt
79 field_created_on: Angelegt
79 field_updated_on: aktualisiert
80 field_updated_on: aktualisiert
80 field_field_format: Format
81 field_field_format: Format
81 field_is_for_all: Für alle Projekte
82 field_is_for_all: Für alle Projekte
82 field_possible_values: Mögliche Werte
83 field_possible_values: Mögliche Werte
83 field_regexp: Regulärer Ausdruck
84 field_regexp: Regulärer Ausdruck
84 field_min_length: Minimale Länge
85 field_min_length: Minimale Länge
85 field_max_length: Maximale Länge
86 field_max_length: Maximale Länge
86 field_value: Wert
87 field_value: Wert
87 field_category: Kategorie
88 field_category: Kategorie
88 field_title: Títel
89 field_title: Títel
89 field_project: Projekt
90 field_project: Projekt
90 #field_issue: Issue
91 #field_issue: Issue
91 field_status: Status
92 field_status: Status
92 field_notes: Anmerkungen
93 field_notes: Anmerkungen
93 field_is_closed: Problem erledigt
94 field_is_closed: Problem erledigt
94 #field_is_default: Default status
95 #field_is_default: Default status
95 field_html_color: Farbe
96 field_html_color: Farbe
96 field_tracker: Tracker
97 field_tracker: Tracker
97 field_subject: Thema
98 field_subject: Thema
98 #field_due_date: Due date
99 #field_due_date: Due date
99 field_assigned_to: Zugewiesen an
100 field_assigned_to: Zugewiesen an
100 field_priority: Priorität
101 field_priority: Priorität
101 field_fixed_version: Erledigt in Version
102 field_fixed_version: Erledigt in Version
102 field_user: Benutzer
103 field_user: Benutzer
103 field_role: Rolle
104 field_role: Rolle
104 field_homepage: Startseite
105 field_homepage: Startseite
105 field_is_public: Öffentlich
106 field_is_public: Öffentlich
106 #field_parent: Subprojekt von
107 #field_parent: Subprojekt von
107 field_is_in_chlog: Ansicht der Issues in der Historie
108 field_is_in_chlog: Ansicht der Issues in der Historie
108 field_login: Mitgliedsname
109 field_login: Mitgliedsname
109 field_mail_notification: Mailbenachrichtigung
110 field_mail_notification: Mailbenachrichtigung
110 #field_admin: Administrator
111 #field_admin: Administrator
111 field_locked: Gesperrt
112 field_locked: Gesperrt
112 field_last_login_on: Letzte Anmeldung
113 field_last_login_on: Letzte Anmeldung
113 field_language: Sprache
114 field_language: Sprache
114 field_effective_date: Datum
115 field_effective_date: Datum
115 field_password: Passwort
116 field_password: Passwort
116 field_new_password: Neues Passwort
117 field_new_password: Neues Passwort
117 field_password_confirmation: Bestätigung
118 field_password_confirmation: Bestätigung
118 field_version: Version
119 field_version: Version
119 field_type: Typ
120 field_type: Typ
120 field_host: Host
121 field_host: Host
121 #field_port: Port
122 #field_port: Port
122 #field_account: Account
123 #field_account: Account
123 #field_base_dn: Base DN
124 #field_base_dn: Base DN
124 #field_attr_login: Login attribute
125 #field_attr_login: Login attribute
125 #field_attr_firstname: Firstname attribute
126 #field_attr_firstname: Firstname attribute
126 #field_attr_lastname: Lastname attribute
127 #field_attr_lastname: Lastname attribute
127 #field_attr_mail: Email attribute
128 #field_attr_mail: Email attribute
128 #field_onthefly: On-the-fly user creation
129 #field_onthefly: On-the-fly user creation
129
130
130 label_user: Benutzer
131 label_user: Benutzer
131 label_user_plural: Benutzer
132 label_user_plural: Benutzer
132 label_user_new: Neuer Benutzer
133 label_user_new: Neuer Benutzer
133 label_project: Projekt
134 label_project: Projekt
134 label_project_new: Neues Projekt
135 label_project_new: Neues Projekt
135 label_project_plural: Projekte
136 label_project_plural: Projekte
136 #label_project_latest: Latest projects
137 #label_project_latest: Latest projects
137 #label_issue: Issue
138 #label_issue: Issue
138 #label_issue_new: New issue
139 #label_issue_new: New issue
139 #label_issue_plural: Issues
140 #label_issue_plural: Issues
140 #label_issue_view_all: View all issues
141 #label_issue_view_all: View all issues
141 label_document: Dokument
142 label_document: Dokument
142 label_document_new: Neues Dokument
143 label_document_new: Neues Dokument
143 label_document_plural: Dokumente
144 label_document_plural: Dokumente
144 label_role: Rolle
145 label_role: Rolle
145 label_role_plural: Rollen
146 label_role_plural: Rollen
146 label_role_new: Neue Rolle
147 label_role_new: Neue Rolle
147 label_role_and_permissions: Rollen und Rechte
148 label_role_and_permissions: Rollen und Rechte
148 label_member: Mitglied
149 label_member: Mitglied
149 label_member_new: Neues Mitglied
150 label_member_new: Neues Mitglied
150 label_member_plural: Mitglieder
151 label_member_plural: Mitglieder
151 label_tracker: Tracker
152 label_tracker: Tracker
152 label_tracker_plural: Tracker
153 label_tracker_plural: Tracker
153 label_tracker_new: Neuer Tracker
154 label_tracker_new: Neuer Tracker
154 label_workflow: Workflow
155 label_workflow: Workflow
155 label_issue_status: Problem Status
156 label_issue_status: Problem Status
156 label_issue_status_plural: Problem Stati
157 label_issue_status_plural: Problem Stati
157 label_issue_status_new: Neuer Status
158 label_issue_status_new: Neuer Status
158 label_issue_category: Problem Kategorie
159 label_issue_category: Problem Kategorie
159 label_issue_category_plural: Problem Kategorien
160 label_issue_category_plural: Problem Kategorien
160 label_issue_category_new: Neue Kategorie
161 label_issue_category_new: Neue Kategorie
161 label_custom_field: Benutzerdefiniertes Feld
162 label_custom_field: Benutzerdefiniertes Feld
162 label_custom_field_plural: Benutzerdefinierte Felder
163 label_custom_field_plural: Benutzerdefinierte Felder
163 label_custom_field_new: Neues Feld
164 label_custom_field_new: Neues Feld
164 label_enumerations: Enumerationen
165 label_enumerations: Enumerationen
165 label_enumeration_new: Neuer Wert
166 label_enumeration_new: Neuer Wert
166 label_information: Information
167 label_information: Information
167 label_information_plural: Informationen
168 label_information_plural: Informationen
168 #label_please_login: Please login
169 #label_please_login: Please login
169 label_register: Anmelden
170 label_register: Anmelden
170 label_password_lost: Passwort vergessen
171 label_password_lost: Passwort vergessen
171 label_home: Hauptseite
172 label_home: Hauptseite
172 label_my_page: Meine Seite
173 label_my_page: Meine Seite
173 label_my_account: Mein Konto
174 label_my_account: Mein Konto
174 label_my_projects: Meine Projekte
175 label_my_projects: Meine Projekte
175 label_administration: Administration
176 label_administration: Administration
176 label_login: Einloggen
177 label_login: Einloggen
177 label_logout: Abmelden
178 label_logout: Abmelden
178 label_help: Hilfe
179 label_help: Hilfe
179 label_reported_issues: Gemeldete Issues
180 label_reported_issues: Gemeldete Issues
180 label_assigned_to_me_issues: Mir zugewiesen
181 label_assigned_to_me_issues: Mir zugewiesen
181 label_last_login: Letzte Anmeldung
182 label_last_login: Letzte Anmeldung
182 #label_last_updates: Last updated
183 #label_last_updates: Last updated
183 #label_last_updates_plural: %d last updated
184 #label_last_updates_plural: %d last updated
184 label_registered_on: Angemeldet am
185 label_registered_on: Angemeldet am
185 label_activity: Aktivität
186 label_activity: Aktivität
186 label_new: Neue
187 label_new: Neue
187 label_logged_as: Angemeldet als
188 label_logged_as: Angemeldet als
188 #label_environment: Environment
189 #label_environment: Environment
189 label_authentication: Authentisierung
190 label_authentication: Authentisierung
190 #label_auth_source: Authentification mode
191 #label_auth_source: Authentification mode
191 #label_auth_source_new: New authentication mode
192 #label_auth_source_new: New authentication mode
192 #label_auth_source_plural: Authentification modes
193 #label_auth_source_plural: Authentification modes
193 #label_subproject: Subproject
194 #label_subproject: Subproject
194 #label_subproject_plural: Subprojects
195 #label_subproject_plural: Subprojects
195 label_min_max_length: Min - Max Länge
196 label_min_max_length: Min - Max Länge
196 label_list: Liste
197 label_list: Liste
197 label_date: Date
198 label_date: Date
198 label_integer: Zahl
199 label_integer: Zahl
199 label_boolean: Boolesch
200 label_boolean: Boolesch
200 #label_string: String
201 #label_string: String
201 label_text: Text
202 label_text: Text
202 label_attribute: Attribut
203 label_attribute: Attribut
203 label_attribute_plural: Attribute
204 label_attribute_plural: Attribute
204 #label_download: %d Download
205 #label_download: %d Download
205 #label_download_plural: %d Downloads
206 #label_download_plural: %d Downloads
206 label_no_data: Nichts anzuzeigen
207 label_no_data: Nichts anzuzeigen
207 label_change_status: Statuswechsel
208 label_change_status: Statuswechsel
208 label_history: Historie
209 label_history: Historie
209 label_attachment: Datei
210 label_attachment: Datei
210 label_attachment_new: Neue Datei
211 label_attachment_new: Neue Datei
211 #label_attachment_delete: Delete file
212 #label_attachment_delete: Delete file
212 label_attachment_plural: Dateien
213 label_attachment_plural: Dateien
213 label_report: Bericht
214 label_report: Bericht
214 label_report_plural: Berichte
215 label_report_plural: Berichte
215 #label_news: Neuigkeiten
216 #label_news: Neuigkeiten
216 #label_news_new: Add news
217 #label_news_new: Add news
217 #label_news_plural: Neuigkeiten
218 #label_news_plural: Neuigkeiten
218 label_news_latest: Letzte Neuigkeiten
219 label_news_latest: Letzte Neuigkeiten
219 label_news_view_all: Alle Neuigkeiten anzeigen
220 label_news_view_all: Alle Neuigkeiten anzeigen
220 label_change_log: Change log
221 label_change_log: Change log
221 label_settings: Konfiguration
222 label_settings: Konfiguration
222 label_overview: Übersicht
223 label_overview: Übersicht
223 label_version: Version
224 label_version: Version
224 label_version_new: Neue Version
225 label_version_new: Neue Version
225 label_version_plural: Versionen
226 label_version_plural: Versionen
226 label_confirmation: Bestätigung
227 label_confirmation: Bestätigung
227 #label_export_csv: Export to CSV
228 #label_export_csv: Export to CSV
229 #label_export_pdf: Export to PDF
228 label_read: Lesen...
230 label_read: Lesen...
229 label_public_projects: Öffentliche Projekte
231 label_public_projects: Öffentliche Projekte
230 #label_open_issues: Open
232 #label_open_issues: Open
231 #label_open_issues_plural: Open
233 #label_open_issues_plural: Open
232 #label_closed_issues: Closed
234 #label_closed_issues: Closed
233 #label_closed_issues_plural: Closed
235 #label_closed_issues_plural: Closed
234 label_total: Gesamtzahl
236 label_total: Gesamtzahl
235 label_permissions: Berechtigungen
237 label_permissions: Berechtigungen
236 label_current_status: Gegenwärtiger Status
238 label_current_status: Gegenwärtiger Status
237 label_new_statuses_allowed: Neue Status gewährten
239 label_new_statuses_allowed: Neue Status gewährten
238 label_all: Alle
240 label_all: Alle
239 label_none: Kein
241 label_none: Kein
240 label_next: Weiter
242 label_next: Weiter
241 label_previous: Zurück
243 label_previous: Zurück
242 label_used_by: Benutzt von
244 label_used_by: Benutzt von
243 #label_details: Details...
245 #label_details: Details...
244 #label_add_note: Add a note
246 #label_add_note: Add a note
247 #label_per_page: Per page
245
248
246 button_login: Einloggen
249 button_login: Einloggen
247 button_submit: Einreichen
250 button_submit: Einreichen
248 button_save: Speichern
251 button_save: Speichern
249 button_check_all: Alles auswählen
252 button_check_all: Alles auswählen
250 button_uncheck_all: Alles abwählen
253 button_uncheck_all: Alles abwählen
251 button_delete: Löschen
254 button_delete: Löschen
252 button_create: Anlegen
255 button_create: Anlegen
253 button_test: Testen
256 button_test: Testen
254 button_edit: Bearbeiten
257 button_edit: Bearbeiten
255 button_add: Hinzufügen
258 button_add: Hinzufügen
256 button_change: Wechseln
259 button_change: Wechseln
257 button_apply: Anwenden
260 button_apply: Anwenden
258 button_clear: Zurücksetzen
261 button_clear: Zurücksetzen
259 button_lock: Verriegeln
262 button_lock: Verriegeln
260 button_unlock: Entriegeln
263 button_unlock: Entriegeln
261 button_download: Fernzuladen
264 button_download: Fernzuladen
262 button_list: Aufzulisten
265 button_list: Aufzulisten
263 button_view: Siehe
266 button_view: Siehe
264 button_move: Bewegen
267 button_move: Bewegen
265 #button_back: Back
268 #button_back: Back
266
269
267 text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll.
270 text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll.
268 text_regexp_info: eg. ^[A-Z0-9]+$
271 text_regexp_info: eg. ^[A-Z0-9]+$
269 text_min_max_length_info: 0 heisst keine Beschränkung
272 text_min_max_length_info: 0 heisst keine Beschränkung
270 #text_possible_values_info: values separated with |
273 #text_possible_values_info: values separated with |
271 text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ?
274 text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ?
272 text_workflow_edit: Auswahl Workflow zum Bearbeiten
275 text_workflow_edit: Auswahl Workflow zum Bearbeiten
273 text_are_you_sure: Sind sie sicher ?
276 text_are_you_sure: Sind sie sicher ?
274
277
275 default_role_manager: Manager
278 default_role_manager: Manager
276 default_role_developper: Developer
279 default_role_developper: Developer
277 default_role_reporter: Reporter
280 default_role_reporter: Reporter
278 default_tracker_bug: Fehler
281 default_tracker_bug: Fehler
279 default_tracker_feature: Feature
282 default_tracker_feature: Feature
280 default_tracker_support: Support
283 default_tracker_support: Support
281 default_issue_status_new: Neu
284 default_issue_status_new: Neu
282 default_issue_status_assigned: Zugewiesen
285 default_issue_status_assigned: Zugewiesen
283 default_issue_status_resolved: Gelöst
286 default_issue_status_resolved: Gelöst
284 default_issue_status_feedback: Feedback
287 default_issue_status_feedback: Feedback
285 default_issue_status_closed: Erledigt
288 default_issue_status_closed: Erledigt
286 default_issue_status_rejected: Abgewiesen
289 default_issue_status_rejected: Abgewiesen
287 default_doc_category_user: Benutzerdokumentation
290 default_doc_category_user: Benutzerdokumentation
288 default_doc_category_tech: Technische Dokumentation
291 default_doc_category_tech: Technische Dokumentation
289 default_priority_low: Niedrig
292 default_priority_low: Niedrig
290 default_priority_normal: Normal
293 default_priority_normal: Normal
291 default_priority_high: Hoch
294 default_priority_high: Hoch
292 default_priority_urgent: Dringend
295 default_priority_urgent: Dringend
293 default_priority_immediate: Sofort
296 default_priority_immediate: Sofort
294
297
295 enumeration_issue_priorities: Issue-Prioritäten
298 enumeration_issue_priorities: Issue-Prioritäten
296 enumeration_doc_categories: Dokumentenkategorien
299 enumeration_doc_categories: Dokumentenkategorien
@@ -1,296 +1,299
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2
2
3 actionview_datehelper_select_day_prefix:
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 actionview_datehelper_select_month_prefix:
6 actionview_datehelper_select_month_prefix:
7 actionview_datehelper_select_year_prefix:
7 actionview_datehelper_select_year_prefix:
8 actionview_datehelper_time_in_words_day: 1 day
8 actionview_datehelper_time_in_words_day: 1 day
9 actionview_datehelper_time_in_words_day_plural: %d days
9 actionview_datehelper_time_in_words_day_plural: %d days
10 actionview_datehelper_time_in_words_hour_about: about an hour
10 actionview_datehelper_time_in_words_hour_about: about an hour
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 actionview_datehelper_time_in_words_minute: 1 minute
13 actionview_datehelper_time_in_words_minute: 1 minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 actionview_datehelper_time_in_words_minute_single: 1 minute
17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 actionview_datehelper_time_in_words_second_less_than: less than a second
18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 actionview_instancetag_blank_option: Please select
20 actionview_instancetag_blank_option: Please select
21
21
22 activerecord_error_inclusion: is not included in the list
22 activerecord_error_inclusion: is not included in the list
23 activerecord_error_exclusion: is reserved
23 activerecord_error_exclusion: is reserved
24 activerecord_error_invalid: is invalid
24 activerecord_error_invalid: is invalid
25 activerecord_error_confirmation: doesn't match confirmation
25 activerecord_error_confirmation: doesn't match confirmation
26 activerecord_error_accepted: must be accepted
26 activerecord_error_accepted: must be accepted
27 activerecord_error_empty: can't be empty
27 activerecord_error_empty: can't be empty
28 activerecord_error_blank: can't be blank
28 activerecord_error_blank: can't be blank
29 activerecord_error_too_long: is too long
29 activerecord_error_too_long: is too long
30 activerecord_error_too_short: is too short
30 activerecord_error_too_short: is too short
31 activerecord_error_wrong_length: is the wrong length
31 activerecord_error_wrong_length: is the wrong length
32 activerecord_error_taken: has already been taken
32 activerecord_error_taken: has already been taken
33 activerecord_error_not_a_number: is not a number
33 activerecord_error_not_a_number: is not a number
34 activerecord_error_not_a_date: is not a valid date
34 activerecord_error_not_a_date: is not a valid date
35
35
36 general_fmt_age: %d yr
36 general_fmt_age: %d yr
37 general_fmt_age_plural: %d yrs
37 general_fmt_age_plural: %d yrs
38 general_fmt_date: %%m/%%d/%%Y
38 general_fmt_date: %%m/%%d/%%Y
39 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
39 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
40 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
41 general_fmt_time: %%I:%%M %%p
41 general_fmt_time: %%I:%%M %%p
42 general_text_No: 'No'
42 general_text_No: 'No'
43 general_text_Yes: 'Yes'
43 general_text_Yes: 'Yes'
44 general_text_no: 'no'
44 general_text_no: 'no'
45 general_text_yes: 'yes'
45 general_text_yes: 'yes'
46 general_lang_en: 'English'
46 general_lang_en: 'English'
47 general_csv_separator: ','
47
48
48 notice_account_updated: Account was successfully updated.
49 notice_account_updated: Account was successfully updated.
49 notice_account_invalid_creditentials: Invalid user or password
50 notice_account_invalid_creditentials: Invalid user or password
50 notice_account_password_updated: Password was successfully updated.
51 notice_account_password_updated: Password was successfully updated.
51 notice_account_wrong_password: Wrong password
52 notice_account_wrong_password: Wrong password
52 notice_account_register_done: Account was successfully created.
53 notice_account_register_done: Account was successfully created.
53 notice_account_unknown_email: Unknown user.
54 notice_account_unknown_email: Unknown user.
54 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 notice_account_activated: Your account has been activated. You can now log in.
57 notice_account_activated: Your account has been activated. You can now log in.
57 notice_successful_create: Successful creation.
58 notice_successful_create: Successful creation.
58 notice_successful_update: Successful update.
59 notice_successful_update: Successful update.
59 notice_successful_delete: Successful deletion.
60 notice_successful_delete: Successful deletion.
60 notice_successful_connection: Successful connection.
61 notice_successful_connection: Successful connection.
61 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 notice_locking_conflict: Data have been updated by another user.
63 notice_locking_conflict: Data have been updated by another user.
63
64
64 gui_validation_error: 1 error
65 gui_validation_error: 1 error
65 gui_validation_error_plural: %d errors
66 gui_validation_error_plural: %d errors
66
67
67 field_name: Name
68 field_name: Name
68 field_description: Description
69 field_description: Description
69 field_summary: Summary
70 field_summary: Summary
70 field_is_required: Required
71 field_is_required: Required
71 field_firstname: Firstname
72 field_firstname: Firstname
72 field_lastname: Lastname
73 field_lastname: Lastname
73 field_mail: Email
74 field_mail: Email
74 field_filename: File
75 field_filename: File
75 field_filesize: Size
76 field_filesize: Size
76 field_downloads: Downloads
77 field_downloads: Downloads
77 field_author: Author
78 field_author: Author
78 field_created_on: Created
79 field_created_on: Created
79 field_updated_on: Updated
80 field_updated_on: Updated
80 field_field_format: Format
81 field_field_format: Format
81 field_is_for_all: For all projects
82 field_is_for_all: For all projects
82 field_possible_values: Possible values
83 field_possible_values: Possible values
83 field_regexp: Regular expression
84 field_regexp: Regular expression
84 field_min_length: Minimum length
85 field_min_length: Minimum length
85 field_max_length: Maximum length
86 field_max_length: Maximum length
86 field_value: Value
87 field_value: Value
87 field_category: Category
88 field_category: Category
88 field_title: Title
89 field_title: Title
89 field_project: Project
90 field_project: Project
90 field_issue: Issue
91 field_issue: Issue
91 field_status: Status
92 field_status: Status
92 field_notes: Notes
93 field_notes: Notes
93 field_is_closed: Issue closed
94 field_is_closed: Issue closed
94 field_is_default: Default status
95 field_is_default: Default status
95 field_html_color: Color
96 field_html_color: Color
96 field_tracker: Tracker
97 field_tracker: Tracker
97 field_subject: Subject
98 field_subject: Subject
98 field_due_date: Due date
99 field_due_date: Due date
99 field_assigned_to: Assigned to
100 field_assigned_to: Assigned to
100 field_priority: Priority
101 field_priority: Priority
101 field_fixed_version: Fixed version
102 field_fixed_version: Fixed version
102 field_user: User
103 field_user: User
103 field_role: Role
104 field_role: Role
104 field_homepage: Homepage
105 field_homepage: Homepage
105 field_is_public: Public
106 field_is_public: Public
106 field_parent: Subproject of
107 field_parent: Subproject of
107 field_is_in_chlog: Issues displayed in changelog
108 field_is_in_chlog: Issues displayed in changelog
108 field_login: Login
109 field_login: Login
109 field_mail_notification: Mail notifications
110 field_mail_notification: Mail notifications
110 field_admin: Administrator
111 field_admin: Administrator
111 field_locked: Locked
112 field_locked: Locked
112 field_last_login_on: Last connection
113 field_last_login_on: Last connection
113 field_language: Language
114 field_language: Language
114 field_effective_date: Date
115 field_effective_date: Date
115 field_password: Password
116 field_password: Password
116 field_new_password: New password
117 field_new_password: New password
117 field_password_confirmation: Confirmation
118 field_password_confirmation: Confirmation
118 field_version: Version
119 field_version: Version
119 field_type: Type
120 field_type: Type
120 field_host: Host
121 field_host: Host
121 field_port: Port
122 field_port: Port
122 field_account: Account
123 field_account: Account
123 field_base_dn: Base DN
124 field_base_dn: Base DN
124 field_attr_login: Login attribute
125 field_attr_login: Login attribute
125 field_attr_firstname: Firstname attribute
126 field_attr_firstname: Firstname attribute
126 field_attr_lastname: Lastname attribute
127 field_attr_lastname: Lastname attribute
127 field_attr_mail: Email attribute
128 field_attr_mail: Email attribute
128 field_onthefly: On-the-fly user creation
129 field_onthefly: On-the-fly user creation
129
130
130 label_user: User
131 label_user: User
131 label_user_plural: Users
132 label_user_plural: Users
132 label_user_new: New user
133 label_user_new: New user
133 label_project: Project
134 label_project: Project
134 label_project_new: New project
135 label_project_new: New project
135 label_project_plural: Projects
136 label_project_plural: Projects
136 label_project_latest: Latest projects
137 label_project_latest: Latest projects
137 label_issue: Issue
138 label_issue: Issue
138 label_issue_new: New issue
139 label_issue_new: New issue
139 label_issue_plural: Issues
140 label_issue_plural: Issues
140 label_issue_view_all: View all issues
141 label_issue_view_all: View all issues
141 label_document: Document
142 label_document: Document
142 label_document_new: New document
143 label_document_new: New document
143 label_document_plural: Documents
144 label_document_plural: Documents
144 label_role: Role
145 label_role: Role
145 label_role_plural: Roles
146 label_role_plural: Roles
146 label_role_new: New role
147 label_role_new: New role
147 label_role_and_permissions: Roles and permissions
148 label_role_and_permissions: Roles and permissions
148 label_member: Member
149 label_member: Member
149 label_member_new: New member
150 label_member_new: New member
150 label_member_plural: Members
151 label_member_plural: Members
151 label_tracker: Tracker
152 label_tracker: Tracker
152 label_tracker_plural: Trackers
153 label_tracker_plural: Trackers
153 label_tracker_new: New tracker
154 label_tracker_new: New tracker
154 label_workflow: Workflow
155 label_workflow: Workflow
155 label_issue_status: Issue status
156 label_issue_status: Issue status
156 label_issue_status_plural: Issue statuses
157 label_issue_status_plural: Issue statuses
157 label_issue_status_new: New status
158 label_issue_status_new: New status
158 label_issue_category: Issue category
159 label_issue_category: Issue category
159 label_issue_category_plural: Issue categories
160 label_issue_category_plural: Issue categories
160 label_issue_category_new: New category
161 label_issue_category_new: New category
161 label_custom_field: Custom field
162 label_custom_field: Custom field
162 label_custom_field_plural: Custom fields
163 label_custom_field_plural: Custom fields
163 label_custom_field_new: New custom field
164 label_custom_field_new: New custom field
164 label_enumerations: Enumerations
165 label_enumerations: Enumerations
165 label_enumeration_new: New value
166 label_enumeration_new: New value
166 label_information: Information
167 label_information: Information
167 label_information_plural: Information
168 label_information_plural: Information
168 label_please_login: Please login
169 label_please_login: Please login
169 label_register: Register
170 label_register: Register
170 label_password_lost: Lost password
171 label_password_lost: Lost password
171 label_home: Home
172 label_home: Home
172 label_my_page: My page
173 label_my_page: My page
173 label_my_account: My account
174 label_my_account: My account
174 label_my_projects: My projects
175 label_my_projects: My projects
175 label_administration: Administration
176 label_administration: Administration
176 label_login: Login
177 label_login: Login
177 label_logout: Logout
178 label_logout: Logout
178 label_help: Help
179 label_help: Help
179 label_reported_issues: Reported issues
180 label_reported_issues: Reported issues
180 label_assigned_to_me_issues: Issues assigned to me
181 label_assigned_to_me_issues: Issues assigned to me
181 label_last_login: Last connection
182 label_last_login: Last connection
182 label_last_updates: Last updated
183 label_last_updates: Last updated
183 label_last_updates_plural: %d last updated
184 label_last_updates_plural: %d last updated
184 label_registered_on: Registered on
185 label_registered_on: Registered on
185 label_activity: Activity
186 label_activity: Activity
186 label_new: New
187 label_new: New
187 label_logged_as: Logged as
188 label_logged_as: Logged as
188 label_environment: Environment
189 label_environment: Environment
189 label_authentication: Authentication
190 label_authentication: Authentication
190 label_auth_source: Authentification mode
191 label_auth_source: Authentification mode
191 label_auth_source_new: New authentication mode
192 label_auth_source_new: New authentication mode
192 label_auth_source_plural: Authentification modes
193 label_auth_source_plural: Authentification modes
193 label_subproject: Subproject
194 label_subproject: Subproject
194 label_subproject_plural: Subprojects
195 label_subproject_plural: Subprojects
195 label_min_max_length: Min - Max length
196 label_min_max_length: Min - Max length
196 label_list: List
197 label_list: List
197 label_date: Date
198 label_date: Date
198 label_integer: Integer
199 label_integer: Integer
199 label_boolean: Boolean
200 label_boolean: Boolean
200 label_string: String
201 label_string: String
201 label_text: Text
202 label_text: Text
202 label_attribute: Attribute
203 label_attribute: Attribute
203 label_attribute_plural: Attributes
204 label_attribute_plural: Attributes
204 label_download: %d Download
205 label_download: %d Download
205 label_download_plural: %d Downloads
206 label_download_plural: %d Downloads
206 label_no_data: No data to display
207 label_no_data: No data to display
207 label_change_status: Change status
208 label_change_status: Change status
208 label_history: History
209 label_history: History
209 label_attachment: File
210 label_attachment: File
210 label_attachment_new: New file
211 label_attachment_new: New file
211 label_attachment_delete: Delete file
212 label_attachment_delete: Delete file
212 label_attachment_plural: Files
213 label_attachment_plural: Files
213 label_report: Report
214 label_report: Report
214 label_report_plural: Reports
215 label_report_plural: Reports
215 label_news: News
216 label_news: News
216 label_news_new: Add news
217 label_news_new: Add news
217 label_news_plural: News
218 label_news_plural: News
218 label_news_latest: Latest news
219 label_news_latest: Latest news
219 label_news_view_all: View all news
220 label_news_view_all: View all news
220 label_change_log: Change log
221 label_change_log: Change log
221 label_settings: Settings
222 label_settings: Settings
222 label_overview: Overview
223 label_overview: Overview
223 label_version: Version
224 label_version: Version
224 label_version_new: New version
225 label_version_new: New version
225 label_version_plural: Versions
226 label_version_plural: Versions
226 label_confirmation: Confirmation
227 label_confirmation: Confirmation
227 label_export_csv: Export to CSV
228 label_export_csv: Export to CSV
229 label_export_pdf: Export to PDF
228 label_read: Read...
230 label_read: Read...
229 label_public_projects: Public projects
231 label_public_projects: Public projects
230 label_open_issues: Open
232 label_open_issues: Open
231 label_open_issues_plural: Open
233 label_open_issues_plural: Open
232 label_closed_issues: Closed
234 label_closed_issues: Closed
233 label_closed_issues_plural: Closed
235 label_closed_issues_plural: Closed
234 label_total: Total
236 label_total: Total
235 label_permissions: Permissions
237 label_permissions: Permissions
236 label_current_status: Current status
238 label_current_status: Current status
237 label_new_statuses_allowed: New statuses allowed
239 label_new_statuses_allowed: New statuses allowed
238 label_all: All
240 label_all: All
239 label_none: None
241 label_none: None
240 label_next: Next
242 label_next: Next
241 label_previous: Previous
243 label_previous: Previous
242 label_used_by: Used by
244 label_used_by: Used by
243 label_details: Details...
245 label_details: Details...
244 label_add_note: Add a note
246 label_add_note: Add a note
247 label_per_page: Per page
245
248
246 button_login: Login
249 button_login: Login
247 button_submit: Submit
250 button_submit: Submit
248 button_save: Save
251 button_save: Save
249 button_check_all: Check all
252 button_check_all: Check all
250 button_uncheck_all: Uncheck all
253 button_uncheck_all: Uncheck all
251 button_delete: Delete
254 button_delete: Delete
252 button_create: Create
255 button_create: Create
253 button_test: Test
256 button_test: Test
254 button_edit: Edit
257 button_edit: Edit
255 button_add: Add
258 button_add: Add
256 button_change: Change
259 button_change: Change
257 button_apply: Apply
260 button_apply: Apply
258 button_clear: Clear
261 button_clear: Clear
259 button_lock: Lock
262 button_lock: Lock
260 button_unlock: Unlock
263 button_unlock: Unlock
261 button_download: Download
264 button_download: Download
262 button_list: List
265 button_list: List
263 button_view: View
266 button_view: View
264 button_move: Move
267 button_move: Move
265 button_back: Back
268 button_back: Back
266
269
267 text_select_mail_notifications: Select actions for which mail notifications should be sent.
270 text_select_mail_notifications: Select actions for which mail notifications should be sent.
268 text_regexp_info: eg. ^[A-Z0-9]+$
271 text_regexp_info: eg. ^[A-Z0-9]+$
269 text_min_max_length_info: 0 means no restriction
272 text_min_max_length_info: 0 means no restriction
270 text_possible_values_info: values separated with |
273 text_possible_values_info: values separated with |
271 text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
274 text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
272 text_workflow_edit: Select a role and a tracker to edit the workflow
275 text_workflow_edit: Select a role and a tracker to edit the workflow
273 text_are_you_sure: Are you sure ?
276 text_are_you_sure: Are you sure ?
274
277
275 default_role_manager: Manager
278 default_role_manager: Manager
276 default_role_developper: Developer
279 default_role_developper: Developer
277 default_role_reporter: Reporter
280 default_role_reporter: Reporter
278 default_tracker_bug: Bug
281 default_tracker_bug: Bug
279 default_tracker_feature: Feature
282 default_tracker_feature: Feature
280 default_tracker_support: Support
283 default_tracker_support: Support
281 default_issue_status_new: New
284 default_issue_status_new: New
282 default_issue_status_assigned: Assigned
285 default_issue_status_assigned: Assigned
283 default_issue_status_resolved: Resolved
286 default_issue_status_resolved: Resolved
284 default_issue_status_feedback: Feedback
287 default_issue_status_feedback: Feedback
285 default_issue_status_closed: Closed
288 default_issue_status_closed: Closed
286 default_issue_status_rejected: Rejected
289 default_issue_status_rejected: Rejected
287 default_doc_category_user: User documentation
290 default_doc_category_user: User documentation
288 default_doc_category_tech: Technical documentation
291 default_doc_category_tech: Technical documentation
289 default_priority_low: Low
292 default_priority_low: Low
290 default_priority_normal: Normal
293 default_priority_normal: Normal
291 default_priority_high: High
294 default_priority_high: High
292 default_priority_urgent: Urgent
295 default_priority_urgent: Urgent
293 default_priority_immediate: Immediate
296 default_priority_immediate: Immediate
294
297
295 enumeration_issue_priorities: Issue priorities
298 enumeration_issue_priorities: Issue priorities
296 enumeration_doc_categories: Document categories
299 enumeration_doc_categories: Document categories
@@ -1,296 +1,299
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2
2
3 actionview_datehelper_select_day_prefix:
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre
4 actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre
5 actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
5 actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
6 actionview_datehelper_select_month_prefix:
6 actionview_datehelper_select_month_prefix:
7 actionview_datehelper_select_year_prefix:
7 actionview_datehelper_select_year_prefix:
8 actionview_datehelper_time_in_words_day: 1 day
8 actionview_datehelper_time_in_words_day: 1 day
9 actionview_datehelper_time_in_words_day_plural: %d days
9 actionview_datehelper_time_in_words_day_plural: %d days
10 actionview_datehelper_time_in_words_hour_about: about an hour
10 actionview_datehelper_time_in_words_hour_about: about an hour
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 actionview_datehelper_time_in_words_minute: 1 minute
13 actionview_datehelper_time_in_words_minute: 1 minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
14 actionview_datehelper_time_in_words_minute_half: half a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 actionview_datehelper_time_in_words_minute_single: 1 minute
17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 actionview_datehelper_time_in_words_second_less_than: less than a second
18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 actionview_instancetag_blank_option: Please select
20 actionview_instancetag_blank_option: Please select
21
21
22 activerecord_error_inclusion: is not included in the list
22 activerecord_error_inclusion: is not included in the list
23 activerecord_error_exclusion: is reserved
23 activerecord_error_exclusion: is reserved
24 activerecord_error_invalid: is invalid
24 activerecord_error_invalid: is invalid
25 activerecord_error_confirmation: doesn't match confirmation
25 activerecord_error_confirmation: doesn't match confirmation
26 activerecord_error_accepted: must be accepted
26 activerecord_error_accepted: must be accepted
27 activerecord_error_empty: can't be empty
27 activerecord_error_empty: can't be empty
28 activerecord_error_blank: can't be blank
28 activerecord_error_blank: can't be blank
29 activerecord_error_too_long: is too long
29 activerecord_error_too_long: is too long
30 activerecord_error_too_short: is too short
30 activerecord_error_too_short: is too short
31 activerecord_error_wrong_length: is the wrong length
31 activerecord_error_wrong_length: is the wrong length
32 activerecord_error_taken: has already been taken
32 activerecord_error_taken: has already been taken
33 activerecord_error_not_a_number: is not a number
33 activerecord_error_not_a_number: is not a number
34 #activerecord_error_not_a_date: is not a valid date
34 #activerecord_error_not_a_date: is not a valid date
35
35
36 general_fmt_age: %d año
36 general_fmt_age: %d año
37 general_fmt_age_plural: %d años
37 general_fmt_age_plural: %d años
38 general_fmt_date: %%d/%%m/%%Y
38 general_fmt_date: %%d/%%m/%%Y
39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
40 general_fmt_datetime_short: %%d/%%m %%H:%%M
40 general_fmt_datetime_short: %%d/%%m %%H:%%M
41 general_fmt_time: %%H:%%M
41 general_fmt_time: %%H:%%M
42 general_text_No: 'No'
42 general_text_No: 'No'
43 general_text_Yes: 'Sí'
43 general_text_Yes: 'Sí'
44 general_text_no: 'no'
44 general_text_no: 'no'
45 general_text_yes: 'sí'
45 general_text_yes: 'sí'
46 general_lang_es: 'Español'
46 general_lang_es: 'Español'
47 general_csv_separator: ';'
47
48
48 notice_account_updated: Account was successfully updated.
49 notice_account_updated: Account was successfully updated.
49 notice_account_invalid_creditentials: Invalid user or password
50 notice_account_invalid_creditentials: Invalid user or password
50 notice_account_password_updated: Password was successfully updated.
51 notice_account_password_updated: Password was successfully updated.
51 notice_account_wrong_password: Wrong password
52 notice_account_wrong_password: Wrong password
52 notice_account_register_done: Account was successfully created.
53 notice_account_register_done: Account was successfully created.
53 notice_account_unknown_email: Unknown user.
54 notice_account_unknown_email: Unknown user.
54 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
55 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
56 notice_account_activated: Your account has been activated. You can now log in.
57 notice_account_activated: Your account has been activated. You can now log in.
57 notice_successful_create: Successful creation.
58 notice_successful_create: Successful creation.
58 notice_successful_update: Successful update.
59 notice_successful_update: Successful update.
59 notice_successful_delete: Successful deletion.
60 notice_successful_delete: Successful deletion.
60 notice_successful_connection: Successful connection.
61 notice_successful_connection: Successful connection.
61 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 notice_file_not_found: Requested file doesn't exist or has been deleted.
62 notice_locking_conflict: Data have been updated by another user.
63 notice_locking_conflict: Data have been updated by another user.
63
64
64 gui_validation_error: 1 error
65 gui_validation_error: 1 error
65 gui_validation_error_plural: %d errores
66 gui_validation_error_plural: %d errores
66
67
67 field_name: Nombre
68 field_name: Nombre
68 field_description: Descripción
69 field_description: Descripción
69 field_summary: Resumen
70 field_summary: Resumen
70 field_is_required: Obligatorio
71 field_is_required: Obligatorio
71 field_firstname: Nombre
72 field_firstname: Nombre
72 field_lastname: Apellido
73 field_lastname: Apellido
73 field_mail: Email
74 field_mail: Email
74 field_filename: Fichero
75 field_filename: Fichero
75 field_filesize: Tamaño
76 field_filesize: Tamaño
76 field_downloads: Telecargas
77 field_downloads: Telecargas
77 field_author: Autor
78 field_author: Autor
78 field_created_on: Creado
79 field_created_on: Creado
79 field_updated_on: Actualizado
80 field_updated_on: Actualizado
80 field_field_format: Formato
81 field_field_format: Formato
81 field_is_for_all: Para todos los proyectos
82 field_is_for_all: Para todos los proyectos
82 field_possible_values: Valores posibles
83 field_possible_values: Valores posibles
83 field_regexp: Expresión regular
84 field_regexp: Expresión regular
84 #field_min_length: Minimum length
85 #field_min_length: Minimum length
85 #field_max_length: Maximum length
86 #field_max_length: Maximum length
86 field_value: Valor
87 field_value: Valor
87 field_category: Categoría
88 field_category: Categoría
88 field_title: Título
89 field_title: Título
89 field_project: Proyecto
90 field_project: Proyecto
90 field_issue: Petición
91 field_issue: Petición
91 field_status: Estatuto
92 field_status: Estatuto
92 field_notes: Notas
93 field_notes: Notas
93 field_is_closed: Petición resuelta
94 field_is_closed: Petición resuelta
94 field_is_default: Estatuto por defecto
95 field_is_default: Estatuto por defecto
95 field_html_color: Color
96 field_html_color: Color
96 field_tracker: Tracker
97 field_tracker: Tracker
97 field_subject: Tema
98 field_subject: Tema
98 #field_due_date: Due date
99 #field_due_date: Due date
99 field_assigned_to: Asignado a
100 field_assigned_to: Asignado a
100 field_priority: Prioridad
101 field_priority: Prioridad
101 field_fixed_version: Versión corregida
102 field_fixed_version: Versión corregida
102 field_user: Usuario
103 field_user: Usuario
103 field_role: Papel
104 field_role: Papel
104 field_homepage: Sitio web
105 field_homepage: Sitio web
105 field_is_public: Público
106 field_is_public: Público
106 #field_parent: Subproject de
107 #field_parent: Subproject de
107 field_is_in_chlog: Consultar las peticiones en el histórico
108 field_is_in_chlog: Consultar las peticiones en el histórico
108 field_login: Identificador
109 field_login: Identificador
109 field_mail_notification: Notificación por mail
110 field_mail_notification: Notificación por mail
110 field_admin: Administrador
111 field_admin: Administrador
111 field_locked: Cerrado
112 field_locked: Cerrado
112 field_last_login_on: Última conexión
113 field_last_login_on: Última conexión
113 field_language: Lengua
114 field_language: Lengua
114 field_effective_date: Fecha
115 field_effective_date: Fecha
115 field_password: Contraseña
116 field_password: Contraseña
116 field_new_password: Nueva contraseña
117 field_new_password: Nueva contraseña
117 field_password_confirmation: Confirmación
118 field_password_confirmation: Confirmación
118 field_version: Versión
119 field_version: Versión
119 field_type: Tipo
120 field_type: Tipo
120 #field_host: Host
121 #field_host: Host
121 #field_port: Port
122 #field_port: Port
122 #field_account: Account
123 #field_account: Account
123 #field_base_dn: Base DN
124 #field_base_dn: Base DN
124 #field_attr_login: Login attribute
125 #field_attr_login: Login attribute
125 #field_attr_firstname: Firstname attribute
126 #field_attr_firstname: Firstname attribute
126 #field_attr_lastname: Lastname attribute
127 #field_attr_lastname: Lastname attribute
127 #field_attr_mail: Email attribute
128 #field_attr_mail: Email attribute
128 #field_onthefly: On-the-fly user creation
129 #field_onthefly: On-the-fly user creation
129
130
130 label_user: Usuario
131 label_user: Usuario
131 label_user_plural: Usuarios
132 label_user_plural: Usuarios
132 label_user_new: Nuevo usuario
133 label_user_new: Nuevo usuario
133 label_project: Proyecto
134 label_project: Proyecto
134 label_project_new: Nuevo proyecto
135 label_project_new: Nuevo proyecto
135 label_project_plural: Proyectos
136 label_project_plural: Proyectos
136 #label_project_latest: Latest projects
137 #label_project_latest: Latest projects
137 label_issue: Petición
138 label_issue: Petición
138 label_issue_new: Nueva petición
139 label_issue_new: Nueva petición
139 label_issue_plural: Peticiones
140 label_issue_plural: Peticiones
140 label_issue_view_all: Ver todas las peticiones
141 label_issue_view_all: Ver todas las peticiones
141 label_document: Documento
142 label_document: Documento
142 label_document_new: Nuevo documento
143 label_document_new: Nuevo documento
143 label_document_plural: Documentos
144 label_document_plural: Documentos
144 label_role: Papel
145 label_role: Papel
145 label_role_plural: Papeles
146 label_role_plural: Papeles
146 label_role_new: Nuevo papel
147 label_role_new: Nuevo papel
147 label_role_and_permissions: Papeles y permisos
148 label_role_and_permissions: Papeles y permisos
148 label_member: Miembro
149 label_member: Miembro
149 label_member_new: Nuevo miembro
150 label_member_new: Nuevo miembro
150 label_member_plural: Miembros
151 label_member_plural: Miembros
151 label_tracker: Tracker
152 label_tracker: Tracker
152 label_tracker_plural: Trackers
153 label_tracker_plural: Trackers
153 label_tracker_new: Nuevo tracker
154 label_tracker_new: Nuevo tracker
154 label_workflow: Workflow
155 label_workflow: Workflow
155 label_issue_status: Estatuto de petición
156 label_issue_status: Estatuto de petición
156 label_issue_status_plural: Estatutos de las peticiones
157 label_issue_status_plural: Estatutos de las peticiones
157 label_issue_status_new: Nuevo estatuto
158 label_issue_status_new: Nuevo estatuto
158 label_issue_category: Categoría de las peticiones
159 label_issue_category: Categoría de las peticiones
159 label_issue_category_plural: Categorías de las peticiones
160 label_issue_category_plural: Categorías de las peticiones
160 label_issue_category_new: Nueva categoría
161 label_issue_category_new: Nueva categoría
161 label_custom_field: Campo personalizado
162 label_custom_field: Campo personalizado
162 label_custom_field_plural: Campos personalizados
163 label_custom_field_plural: Campos personalizados
163 label_custom_field_new: Nuevo campo personalizado
164 label_custom_field_new: Nuevo campo personalizado
164 label_enumerations: Listas de valores
165 label_enumerations: Listas de valores
165 label_enumeration_new: Nuevo valor
166 label_enumeration_new: Nuevo valor
166 label_information: Informacion
167 label_information: Informacion
167 label_information_plural: Informaciones
168 label_information_plural: Informaciones
168 label_please_login: Conexión
169 label_please_login: Conexión
169 #label_register: Register
170 #label_register: Register
170 label_password_lost: ¿Olvidaste la contraseña?
171 label_password_lost: ¿Olvidaste la contraseña?
171 label_home: Acogida
172 label_home: Acogida
172 label_my_page: Mi página
173 label_my_page: Mi página
173 label_my_account: Mi cuenta
174 label_my_account: Mi cuenta
174 label_my_projects: Mis proyectos
175 label_my_projects: Mis proyectos
175 label_administration: Administración
176 label_administration: Administración
176 label_login: Conexión
177 label_login: Conexión
177 label_logout: Desconexión
178 label_logout: Desconexión
178 label_help: Ayuda
179 label_help: Ayuda
179 label_reported_issues: Peticiones registradas
180 label_reported_issues: Peticiones registradas
180 label_assigned_to_me_issues: Peticiones que me están asignadas
181 label_assigned_to_me_issues: Peticiones que me están asignadas
181 label_last_login: Última conexión
182 label_last_login: Última conexión
182 label_last_updates: Actualizado
183 label_last_updates: Actualizado
183 label_last_updates_plural: %d Actualizados
184 label_last_updates_plural: %d Actualizados
184 label_registered_on: Inscrito el
185 label_registered_on: Inscrito el
185 label_activity: Actividad
186 label_activity: Actividad
186 label_new: Nuevo
187 label_new: Nuevo
187 label_logged_as: Conectado como
188 label_logged_as: Conectado como
188 #label_environment: Environment
189 #label_environment: Environment
189 #label_authentication: Authentication
190 #label_authentication: Authentication
190 #label_auth_source: Authentification mode
191 #label_auth_source: Authentification mode
191 #label_auth_source_new: New authentication mode
192 #label_auth_source_new: New authentication mode
192 #label_auth_source_plural: Authentification modes
193 #label_auth_source_plural: Authentification modes
193 #label_subproject: Subproject
194 #label_subproject: Subproject
194 #label_subproject_plural: Subprojects
195 #label_subproject_plural: Subprojects
195 #label_min_max_length: Min - Max length
196 #label_min_max_length: Min - Max length
196 #label_list: List
197 #label_list: List
197 label_date: Fecha
198 label_date: Fecha
198 #label_integer: Integer
199 #label_integer: Integer
199 #label_boolean: Boolean
200 #label_boolean: Boolean
200 #label_string: String
201 #label_string: String
201 #label_text: Text
202 #label_text: Text
202 #label_attribute: Attribute
203 #label_attribute: Attribute
203 #label_attribute_plural: Attributes
204 #label_attribute_plural: Attributes
204 label_download: %d Telecarga
205 label_download: %d Telecarga
205 label_download_plural: %d Telecargas
206 label_download_plural: %d Telecargas
206 #label_no_data: No data to display
207 #label_no_data: No data to display
207 label_change_status: Cambiar el estatuto
208 label_change_status: Cambiar el estatuto
208 label_history: Histórico
209 label_history: Histórico
209 label_attachment: Fichero
210 label_attachment: Fichero
210 label_attachment_new: Nuevo fichero
211 label_attachment_new: Nuevo fichero
211 #label_attachment_delete: Delete file
212 #label_attachment_delete: Delete file
212 label_attachment_plural: Ficheros
213 label_attachment_plural: Ficheros
213 #label_report: Report
214 #label_report: Report
214 #label_report_plural: Reports
215 #label_report_plural: Reports
215 label_news: Noticia
216 label_news: Noticia
216 label_news_new: Nueva noticia
217 label_news_new: Nueva noticia
217 label_news_plural: Noticias
218 label_news_plural: Noticias
218 label_news_latest: Últimas noticias
219 label_news_latest: Últimas noticias
219 label_news_view_all: Ver todas las noticias
220 label_news_view_all: Ver todas las noticias
220 label_change_log: Cambios
221 label_change_log: Cambios
221 label_settings: Configuración
222 label_settings: Configuración
222 label_overview: Vistazo
223 label_overview: Vistazo
223 label_version: Versión
224 label_version: Versión
224 label_version_new: Nueva versión
225 label_version_new: Nueva versión
225 label_version_plural: Versiónes
226 label_version_plural: Versiónes
226 label_confirmation: Confirmación
227 label_confirmation: Confirmación
227 label_export_csv: Exportar a CSV
228 label_export_csv: Exportar a CSV
229 label_export_pdf: Exportar a PDF
228 label_read: Leer...
230 label_read: Leer...
229 label_public_projects: Proyectos publicos
231 label_public_projects: Proyectos publicos
230 label_open_issues: Abierta
232 label_open_issues: Abierta
231 label_open_issues_plural: Abiertas
233 label_open_issues_plural: Abiertas
232 label_closed_issues: Cerrada
234 label_closed_issues: Cerrada
233 label_closed_issues_plural: Cerradas
235 label_closed_issues_plural: Cerradas
234 label_total: Total
236 label_total: Total
235 label_permissions: Permisos
237 label_permissions: Permisos
236 #label_current_status: Current status
238 #label_current_status: Current status
237 label_new_statuses_allowed: Nuevos estatutos autorizados
239 label_new_statuses_allowed: Nuevos estatutos autorizados
238 label_all: Todos
240 label_all: Todos
239 label_none: Ninguno
241 label_none: Ninguno
240 label_next: Próximo
242 label_next: Próximo
241 label_previous: Precedente
243 label_previous: Precedente
242 label_used_by: Utilizado por
244 label_used_by: Utilizado por
243 #label_details: Details...
245 #label_details: Details...
244 #label_add_note: Add a note
246 #label_add_note: Add a note
247 #label_per_page: Per page
245
248
246 button_login: Conexión
249 button_login: Conexión
247 button_submit: Someter
250 button_submit: Someter
248 button_save: Validar
251 button_save: Validar
249 button_check_all: Seleccionar todo
252 button_check_all: Seleccionar todo
250 button_uncheck_all: No seleccionar nada
253 button_uncheck_all: No seleccionar nada
251 button_delete: Suprimir
254 button_delete: Suprimir
252 button_create: Crear
255 button_create: Crear
253 button_test: Testar
256 button_test: Testar
254 button_edit: Modificar
257 button_edit: Modificar
255 button_add: Añadir
258 button_add: Añadir
256 button_change: Cambiar
259 button_change: Cambiar
257 button_apply: Aplicar
260 button_apply: Aplicar
258 button_clear: Anular
261 button_clear: Anular
259 button_lock: Bloquear
262 button_lock: Bloquear
260 button_unlock: Desbloquear
263 button_unlock: Desbloquear
261 button_download: Telecargar
264 button_download: Telecargar
262 button_list: Listar
265 button_list: Listar
263 button_view: Ver
266 button_view: Ver
264 button_move: Mover
267 button_move: Mover
265 #button_back: Back
268 #button_back: Back
266
269
267 text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail.
270 text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail.
268 text_regexp_info: eg. ^[A-Z0-9]+$
271 text_regexp_info: eg. ^[A-Z0-9]+$
269 text_min_max_length_info: 0 para ninguna restricción
272 text_min_max_length_info: 0 para ninguna restricción
270 #text_possible_values_info: values separated with |
273 #text_possible_values_info: values separated with |
271 text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
274 text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
272 text_workflow_edit: Seleccionar un workflow para actualizar
275 text_workflow_edit: Seleccionar un workflow para actualizar
273 text_are_you_sure: ¿ Estás seguro ?
276 text_are_you_sure: ¿ Estás seguro ?
274
277
275 default_role_manager: Manager
278 default_role_manager: Manager
276 default_role_developper: Desarrollador
279 default_role_developper: Desarrollador
277 default_role_reporter: Informador
280 default_role_reporter: Informador
278 default_tracker_bug: Anomalía
281 default_tracker_bug: Anomalía
279 default_tracker_feature: Evolución
282 default_tracker_feature: Evolución
280 default_tracker_support: Asistencia
283 default_tracker_support: Asistencia
281 default_issue_status_new: Nuevo
284 default_issue_status_new: Nuevo
282 default_issue_status_assigned: Asignada
285 default_issue_status_assigned: Asignada
283 default_issue_status_resolved: Resuelta
286 default_issue_status_resolved: Resuelta
284 default_issue_status_feedback: Comentario
287 default_issue_status_feedback: Comentario
285 default_issue_status_closed: Cerrada
288 default_issue_status_closed: Cerrada
286 default_issue_status_rejected: Rechazada
289 default_issue_status_rejected: Rechazada
287 default_doc_category_user: Documentación del usuario
290 default_doc_category_user: Documentación del usuario
288 default_doc_category_tech: Documentación tecnica
291 default_doc_category_tech: Documentación tecnica
289 default_priority_low: Bajo
292 default_priority_low: Bajo
290 default_priority_normal: Normal
293 default_priority_normal: Normal
291 default_priority_high: Alto
294 default_priority_high: Alto
292 default_priority_urgent: Urgente
295 default_priority_urgent: Urgente
293 default_priority_immediate: Ahora
296 default_priority_immediate: Ahora
294
297
295 enumeration_issue_priorities: Prioridad de las peticiones
298 enumeration_issue_priorities: Prioridad de las peticiones
296 enumeration_doc_categories: Categorías del documento
299 enumeration_doc_categories: Categorías del documento
@@ -1,296 +1,299
1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
2
2
3 actionview_datehelper_select_day_prefix:
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
5 actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc
5 actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc
6 actionview_datehelper_select_month_prefix:
6 actionview_datehelper_select_month_prefix:
7 actionview_datehelper_select_year_prefix:
7 actionview_datehelper_select_year_prefix:
8 actionview_datehelper_time_in_words_day: 1 jour
8 actionview_datehelper_time_in_words_day: 1 jour
9 actionview_datehelper_time_in_words_day_plural: %d jours
9 actionview_datehelper_time_in_words_day_plural: %d jours
10 actionview_datehelper_time_in_words_hour_about: about an hour
10 actionview_datehelper_time_in_words_hour_about: about an hour
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 actionview_datehelper_time_in_words_minute: 1 minute
13 actionview_datehelper_time_in_words_minute: 1 minute
14 actionview_datehelper_time_in_words_minute_half: 30 secondes
14 actionview_datehelper_time_in_words_minute_half: 30 secondes
15 actionview_datehelper_time_in_words_minute_less_than: moins d'une minute
15 actionview_datehelper_time_in_words_minute_less_than: moins d'une minute
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 actionview_datehelper_time_in_words_minute_single: 1 minute
17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 actionview_datehelper_time_in_words_second_less_than: moins d'une seconde
18 actionview_datehelper_time_in_words_second_less_than: moins d'une seconde
19 actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes
19 actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes
20 actionview_instancetag_blank_option: Choisir
20 actionview_instancetag_blank_option: Choisir
21
21
22 activerecord_error_inclusion: n'est pas inclus dans la liste
22 activerecord_error_inclusion: n'est pas inclus dans la liste
23 activerecord_error_exclusion: est reservé
23 activerecord_error_exclusion: est reservé
24 activerecord_error_invalid: est invalide
24 activerecord_error_invalid: est invalide
25 activerecord_error_confirmation: ne correspond pas à la confirmation
25 activerecord_error_confirmation: ne correspond pas à la confirmation
26 activerecord_error_accepted: doit être accepté
26 activerecord_error_accepted: doit être accepté
27 activerecord_error_empty: doit être renseigné
27 activerecord_error_empty: doit être renseigné
28 activerecord_error_blank: doit être renseigné
28 activerecord_error_blank: doit être renseigné
29 activerecord_error_too_long: est trop long
29 activerecord_error_too_long: est trop long
30 activerecord_error_too_short: est trop court
30 activerecord_error_too_short: est trop court
31 activerecord_error_wrong_length: n'est pas de la bonne longueur
31 activerecord_error_wrong_length: n'est pas de la bonne longueur
32 activerecord_error_taken: est déjà utilisé
32 activerecord_error_taken: est déjà utilisé
33 activerecord_error_not_a_number: n'est pas un nombre
33 activerecord_error_not_a_number: n'est pas un nombre
34 activerecord_error_not_a_date: n'est pas une date valide
34 activerecord_error_not_a_date: n'est pas une date valide
35
35
36 general_fmt_age: %d an
36 general_fmt_age: %d an
37 general_fmt_age_plural: %d ans
37 general_fmt_age_plural: %d ans
38 general_fmt_date: %%d/%%m/%%Y
38 general_fmt_date: %%d/%%m/%%Y
39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
39 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
40 general_fmt_datetime_short: %%d/%%m %%H:%%M
40 general_fmt_datetime_short: %%d/%%m %%H:%%M
41 general_fmt_time: %%H:%%M
41 general_fmt_time: %%H:%%M
42 general_text_No: 'Non'
42 general_text_No: 'Non'
43 general_text_Yes: 'Oui'
43 general_text_Yes: 'Oui'
44 general_text_no: 'non'
44 general_text_no: 'non'
45 general_text_yes: 'oui'
45 general_text_yes: 'oui'
46 general_lang_fr: 'Français'
46 general_lang_fr: 'Français'
47 general_csv_separator: ';'
47
48
48 notice_account_updated: Le compte a été mis à jour avec succès.
49 notice_account_updated: Le compte a été mis à jour avec succès.
49 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
50 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
50 notice_account_password_updated: Mot de passe mis à jour avec succès.
51 notice_account_password_updated: Mot de passe mis à jour avec succès.
51 notice_account_wrong_password: Mot de passe incorrect
52 notice_account_wrong_password: Mot de passe incorrect
52 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé.
53 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé.
53 notice_account_unknown_email: Aucun compte ne correspond à cette adresse.
54 notice_account_unknown_email: Aucun compte ne correspond à cette adresse.
54 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
55 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
55 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé.
56 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé.
56 notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter.
57 notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter.
57 notice_successful_create: Création effectuée avec succès.
58 notice_successful_create: Création effectuée avec succès.
58 notice_successful_update: Mise à jour effectuée avec succès.
59 notice_successful_update: Mise à jour effectuée avec succès.
59 notice_successful_delete: Suppression effectuée avec succès.
60 notice_successful_delete: Suppression effectuée avec succès.
60 notice_successful_connection: Connection réussie.
61 notice_successful_connection: Connection réussie.
61 notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé.
62 notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé.
62 notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
63 notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
63
64
64 gui_validation_error: 1 erreur
65 gui_validation_error: 1 erreur
65 gui_validation_error_plural: %d erreurs
66 gui_validation_error_plural: %d erreurs
66
67
67 field_name: Nom
68 field_name: Nom
68 field_description: Description
69 field_description: Description
69 field_summary: Résumé
70 field_summary: Résumé
70 field_is_required: Obligatoire
71 field_is_required: Obligatoire
71 field_firstname: Prénom
72 field_firstname: Prénom
72 field_lastname: Nom
73 field_lastname: Nom
73 field_mail: Email
74 field_mail: Email
74 field_filename: Fichier
75 field_filename: Fichier
75 field_filesize: Taille
76 field_filesize: Taille
76 field_downloads: Téléchargements
77 field_downloads: Téléchargements
77 field_author: Auteur
78 field_author: Auteur
78 field_created_on: Créé
79 field_created_on: Créé
79 field_updated_on: Mis à jour
80 field_updated_on: Mis à jour
80 field_field_format: Format
81 field_field_format: Format
81 field_is_for_all: Pour tous les projets
82 field_is_for_all: Pour tous les projets
82 field_possible_values: Valeurs possibles
83 field_possible_values: Valeurs possibles
83 field_regexp: Expression régulière
84 field_regexp: Expression régulière
84 field_min_length: Longueur minimum
85 field_min_length: Longueur minimum
85 field_max_length: Longueur maximum
86 field_max_length: Longueur maximum
86 field_value: Valeur
87 field_value: Valeur
87 field_category: Catégorie
88 field_category: Catégorie
88 field_title: Titre
89 field_title: Titre
89 field_project: Projet
90 field_project: Projet
90 field_issue: Demande
91 field_issue: Demande
91 field_status: Statut
92 field_status: Statut
92 field_notes: Notes
93 field_notes: Notes
93 field_is_closed: Demande fermée
94 field_is_closed: Demande fermée
94 field_is_default: Statut par défaut
95 field_is_default: Statut par défaut
95 field_html_color: Couleur
96 field_html_color: Couleur
96 field_tracker: Tracker
97 field_tracker: Tracker
97 field_subject: Sujet
98 field_subject: Sujet
98 field_due_date: Date d'échéance
99 field_due_date: Date d'échéance
99 field_assigned_to: Assigné à
100 field_assigned_to: Assigné à
100 field_priority: Priorité
101 field_priority: Priorité
101 field_fixed_version: Version corrigée
102 field_fixed_version: Version corrigée
102 field_user: Utilisateur
103 field_user: Utilisateur
103 field_role: Rôle
104 field_role: Rôle
104 field_homepage: Site web
105 field_homepage: Site web
105 field_is_public: Public
106 field_is_public: Public
106 field_parent: Sous-projet de
107 field_parent: Sous-projet de
107 field_is_in_chlog: Demandes affichées dans l'historique
108 field_is_in_chlog: Demandes affichées dans l'historique
108 field_login: Identifiant
109 field_login: Identifiant
109 field_mail_notification: Notifications par mail
110 field_mail_notification: Notifications par mail
110 field_admin: Administrateur
111 field_admin: Administrateur
111 field_locked: Verrouillé
112 field_locked: Verrouillé
112 field_last_login_on: Dernière connexion
113 field_last_login_on: Dernière connexion
113 field_language: Langue
114 field_language: Langue
114 field_effective_date: Date
115 field_effective_date: Date
115 field_password: Mot de passe
116 field_password: Mot de passe
116 field_new_password: Nouveau mot de passe
117 field_new_password: Nouveau mot de passe
117 field_password_confirmation: Confirmation
118 field_password_confirmation: Confirmation
118 field_version: Version
119 field_version: Version
119 field_type: Type
120 field_type: Type
120 field_host: Hôte
121 field_host: Hôte
121 field_port: Port
122 field_port: Port
122 field_account: Compte
123 field_account: Compte
123 field_base_dn: Base DN
124 field_base_dn: Base DN
124 field_attr_login: Attribut Identifiant
125 field_attr_login: Attribut Identifiant
125 field_attr_firstname: Attribut Prénom
126 field_attr_firstname: Attribut Prénom
126 field_attr_lastname: Attribut Nom
127 field_attr_lastname: Attribut Nom
127 field_attr_mail: Attribut Email
128 field_attr_mail: Attribut Email
128 field_onthefly: Création des utilisateurs à la volée
129 field_onthefly: Création des utilisateurs à la volée
129
130
130 label_user: Utilisateur
131 label_user: Utilisateur
131 label_user_plural: Utilisateurs
132 label_user_plural: Utilisateurs
132 label_user_new: Nouvel utilisateur
133 label_user_new: Nouvel utilisateur
133 label_project: Projet
134 label_project: Projet
134 label_project_new: Nouveau projet
135 label_project_new: Nouveau projet
135 label_project_plural: Projets
136 label_project_plural: Projets
136 label_project_latest: Derniers projets
137 label_project_latest: Derniers projets
137 label_issue: Demande
138 label_issue: Demande
138 label_issue_new: Nouvelle demande
139 label_issue_new: Nouvelle demande
139 label_issue_plural: Demandes
140 label_issue_plural: Demandes
140 label_issue_view_all: Voir toutes les demandes
141 label_issue_view_all: Voir toutes les demandes
141 label_document: Document
142 label_document: Document
142 label_document_new: Nouveau document
143 label_document_new: Nouveau document
143 label_document_plural: Documents
144 label_document_plural: Documents
144 label_role: Rôle
145 label_role: Rôle
145 label_role_plural: Rôles
146 label_role_plural: Rôles
146 label_role_new: Nouveau rôle
147 label_role_new: Nouveau rôle
147 label_role_and_permissions: Rôles et permissions
148 label_role_and_permissions: Rôles et permissions
148 label_member: Membre
149 label_member: Membre
149 label_member_new: Nouveau membre
150 label_member_new: Nouveau membre
150 label_member_plural: Membres
151 label_member_plural: Membres
151 label_tracker: Tracker
152 label_tracker: Tracker
152 label_tracker_plural: Trackers
153 label_tracker_plural: Trackers
153 label_tracker_new: Nouveau tracker
154 label_tracker_new: Nouveau tracker
154 label_workflow: Workflow
155 label_workflow: Workflow
155 label_issue_status: Statut de demandes
156 label_issue_status: Statut de demandes
156 label_issue_status_plural: Statuts de demandes
157 label_issue_status_plural: Statuts de demandes
157 label_issue_status_new: Nouveau statut
158 label_issue_status_new: Nouveau statut
158 label_issue_category: Catégorie de demandes
159 label_issue_category: Catégorie de demandes
159 label_issue_category_plural: Catégories de demandes
160 label_issue_category_plural: Catégories de demandes
160 label_issue_category_new: Nouvelle catégorie
161 label_issue_category_new: Nouvelle catégorie
161 label_custom_field: Champ personnalisé
162 label_custom_field: Champ personnalisé
162 label_custom_field_plural: Champs personnalisés
163 label_custom_field_plural: Champs personnalisés
163 label_custom_field_new: Nouveau champ personnalisé
164 label_custom_field_new: Nouveau champ personnalisé
164 label_enumerations: Listes de valeurs
165 label_enumerations: Listes de valeurs
165 label_enumeration_new: Nouvelle valeur
166 label_enumeration_new: Nouvelle valeur
166 label_information: Information
167 label_information: Information
167 label_information_plural: Informations
168 label_information_plural: Informations
168 label_please_login: Identification
169 label_please_login: Identification
169 label_register: S'enregistrer
170 label_register: S'enregistrer
170 label_password_lost: Mot de passe perdu
171 label_password_lost: Mot de passe perdu
171 label_home: Accueil
172 label_home: Accueil
172 label_my_page: Ma page
173 label_my_page: Ma page
173 label_my_account: Mon compte
174 label_my_account: Mon compte
174 label_my_projects: Mes projets
175 label_my_projects: Mes projets
175 label_administration: Administration
176 label_administration: Administration
176 label_login: Connexion
177 label_login: Connexion
177 label_logout: Déconnexion
178 label_logout: Déconnexion
178 label_help: Aide
179 label_help: Aide
179 label_reported_issues: Demandes soumises
180 label_reported_issues: Demandes soumises
180 label_assigned_to_me_issues: Demandes qui me sont assignées
181 label_assigned_to_me_issues: Demandes qui me sont assignées
181 label_last_login: Dernière connexion
182 label_last_login: Dernière connexion
182 label_last_updates: Dernière mise à jour
183 label_last_updates: Dernière mise à jour
183 label_last_updates_plural: %d dernières mises à jour
184 label_last_updates_plural: %d dernières mises à jour
184 label_registered_on: Inscrit le
185 label_registered_on: Inscrit le
185 label_activity: Activité
186 label_activity: Activité
186 label_new: Nouveau
187 label_new: Nouveau
187 label_logged_as: Connecté en tant que
188 label_logged_as: Connecté en tant que
188 label_environment: Environnement
189 label_environment: Environnement
189 label_authentication: Authentification
190 label_authentication: Authentification
190 label_auth_source: Mode d'authentification
191 label_auth_source: Mode d'authentification
191 label_auth_source_new: Nouveau mode d'authentification
192 label_auth_source_new: Nouveau mode d'authentification
192 label_auth_source_plural: Modes d'authentification
193 label_auth_source_plural: Modes d'authentification
193 label_subproject: Sous-projet
194 label_subproject: Sous-projet
194 label_subproject_plural: Sous-projets
195 label_subproject_plural: Sous-projets
195 label_min_max_length: Longueurs mini - maxi
196 label_min_max_length: Longueurs mini - maxi
196 label_list: Liste
197 label_list: Liste
197 label_date: Date
198 label_date: Date
198 label_integer: Entier
199 label_integer: Entier
199 label_boolean: Booléen
200 label_boolean: Booléen
200 label_string: Chaîne
201 label_string: Chaîne
201 label_text: Texte
202 label_text: Texte
202 label_attribute: Attribut
203 label_attribute: Attribut
203 label_attribute_plural: Attributs
204 label_attribute_plural: Attributs
204 label_download: %d Téléchargement
205 label_download: %d Téléchargement
205 label_download_plural: %d Téléchargements
206 label_download_plural: %d Téléchargements
206 label_no_data: Aucune donnée à afficher
207 label_no_data: Aucune donnée à afficher
207 label_change_status: Changer le statut
208 label_change_status: Changer le statut
208 label_history: Historique
209 label_history: Historique
209 label_attachment: Fichier
210 label_attachment: Fichier
210 label_attachment_new: Nouveau fichier
211 label_attachment_new: Nouveau fichier
211 label_attachment_delete: Supprimer le fichier
212 label_attachment_delete: Supprimer le fichier
212 label_attachment_plural: Fichiers
213 label_attachment_plural: Fichiers
213 label_report: Rapport
214 label_report: Rapport
214 label_report_plural: Rapports
215 label_report_plural: Rapports
215 label_news: Annonce
216 label_news: Annonce
216 label_news_new: Nouvelle annonce
217 label_news_new: Nouvelle annonce
217 label_news_plural: Annonces
218 label_news_plural: Annonces
218 label_news_latest: Dernières annonces
219 label_news_latest: Dernières annonces
219 label_news_view_all: Voir toutes les annonces
220 label_news_view_all: Voir toutes les annonces
220 label_change_log: Historique
221 label_change_log: Historique
221 label_settings: Configuration
222 label_settings: Configuration
222 label_overview: Aperçu
223 label_overview: Aperçu
223 label_version: Version
224 label_version: Version
224 label_version_new: Nouvelle version
225 label_version_new: Nouvelle version
225 label_version_plural: Versions
226 label_version_plural: Versions
226 label_confirmation: Confirmation
227 label_confirmation: Confirmation
227 label_export_csv: Exporter en CSV
228 label_export_csv: Exporter en CSV
229 label_export_pdf: Exporter en PDF
228 label_read: Lire...
230 label_read: Lire...
229 label_public_projects: Projets publics
231 label_public_projects: Projets publics
230 label_open_issues: Ouverte
232 label_open_issues: Ouverte
231 label_open_issues_plural: Ouvertes
233 label_open_issues_plural: Ouvertes
232 label_closed_issues: Fermée
234 label_closed_issues: Fermée
233 label_closed_issues_plural: Fermées
235 label_closed_issues_plural: Fermées
234 label_total: Total
236 label_total: Total
235 label_permissions: Permissions
237 label_permissions: Permissions
236 label_current_status: Statut actuel
238 label_current_status: Statut actuel
237 label_new_statuses_allowed: Nouveaux statuts autorisés
239 label_new_statuses_allowed: Nouveaux statuts autorisés
238 label_all: Tous
240 label_all: Tous
239 label_none: Aucun
241 label_none: Aucun
240 label_next: Suivant
242 label_next: Suivant
241 label_previous: Précédent
243 label_previous: Précédent
242 label_used_by: Utilisé par
244 label_used_by: Utilisé par
243 label_details: Détails...
245 label_details: Détails...
244 label_add_note: Ajouter une note
246 label_add_note: Ajouter une note
247 label_per_page: Par page
245
248
246 button_login: Connexion
249 button_login: Connexion
247 button_submit: Soumettre
250 button_submit: Soumettre
248 button_save: Valider
251 button_save: Valider
249 button_check_all: Tout cocher
252 button_check_all: Tout cocher
250 button_uncheck_all: Tout décocher
253 button_uncheck_all: Tout décocher
251 button_delete: Supprimer
254 button_delete: Supprimer
252 button_create: Créer
255 button_create: Créer
253 button_test: Tester
256 button_test: Tester
254 button_edit: Modifier
257 button_edit: Modifier
255 button_add: Ajouter
258 button_add: Ajouter
256 button_change: Changer
259 button_change: Changer
257 button_apply: Appliquer
260 button_apply: Appliquer
258 button_clear: Effacer
261 button_clear: Effacer
259 button_lock: Verrouiller
262 button_lock: Verrouiller
260 button_unlock: Déverrouiller
263 button_unlock: Déverrouiller
261 button_download: Télécharger
264 button_download: Télécharger
262 button_list: Lister
265 button_list: Lister
263 button_view: Voir
266 button_view: Voir
264 button_move: Déplacer
267 button_move: Déplacer
265 button_back: Retour
268 button_back: Retour
266
269
267 text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée.
270 text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée.
268 text_regexp_info: ex. ^[A-Z0-9]+$
271 text_regexp_info: ex. ^[A-Z0-9]+$
269 text_min_max_length_info: 0 pour aucune restriction
272 text_min_max_length_info: 0 pour aucune restriction
270 text_possible_values_info: valeurs séparées par |
273 text_possible_values_info: valeurs séparées par |
271 text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
274 text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
272 text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
275 text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
273 text_are_you_sure: Etes-vous sûr ?
276 text_are_you_sure: Etes-vous sûr ?
274
277
275 default_role_manager: Manager
278 default_role_manager: Manager
276 default_role_developper: Développeur
279 default_role_developper: Développeur
277 default_role_reporter: Rapporteur
280 default_role_reporter: Rapporteur
278 default_tracker_bug: Anomalie
281 default_tracker_bug: Anomalie
279 default_tracker_feature: Evolution
282 default_tracker_feature: Evolution
280 default_tracker_support: Assistance
283 default_tracker_support: Assistance
281 default_issue_status_new: Nouveau
284 default_issue_status_new: Nouveau
282 default_issue_status_assigned: Assigné
285 default_issue_status_assigned: Assigné
283 default_issue_status_resolved: Résolu
286 default_issue_status_resolved: Résolu
284 default_issue_status_feedback: Commentaire
287 default_issue_status_feedback: Commentaire
285 default_issue_status_closed: Fermé
288 default_issue_status_closed: Fermé
286 default_issue_status_rejected: Rejeté
289 default_issue_status_rejected: Rejeté
287 default_doc_category_user: Documentation utilisateur
290 default_doc_category_user: Documentation utilisateur
288 default_doc_category_tech: Documentation technique
291 default_doc_category_tech: Documentation technique
289 default_priority_low: Bas
292 default_priority_low: Bas
290 default_priority_normal: Normal
293 default_priority_normal: Normal
291 default_priority_high: Haut
294 default_priority_high: Haut
292 default_priority_urgent: Urgent
295 default_priority_urgent: Urgent
293 default_priority_immediate: Immédiat
296 default_priority_immediate: Immédiat
294
297
295 enumeration_issue_priorities: Priorités des demandes
298 enumeration_issue_priorities: Priorités des demandes
296 enumeration_doc_categories: Catégories des documents
299 enumeration_doc_categories: Catégories des documents
@@ -1,409 +1,419
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 /* Edited by Jean-Philippe Lang *>
2 /* Edited by Jean-Philippe Lang *>
3 /**************** Body and tag styles ****************/
3 /**************** Body and tag styles ****************/
4
4
5
5
6 #header * {margin:0; padding:0;}
6 #header * {margin:0; padding:0;}
7 p, ul, ol, li {margin:0; padding:0;}
7 p, ul, ol, li {margin:0; padding:0;}
8
8
9
9
10 body{
10 body{
11 font:76% Verdana,Tahoma,Arial,sans-serif;
11 font:76% Verdana,Tahoma,Arial,sans-serif;
12 line-height:1.4em;
12 line-height:1.4em;
13 text-align:center;
13 text-align:center;
14 color:#303030;
14 color:#303030;
15 background:#e8eaec;
15 background:#e8eaec;
16 margin:0;
16 margin:0;
17 }
17 }
18
18
19
19
20 a{
20 a{
21 color:#467aa7;
21 color:#467aa7;
22 font-weight:bold;
22 font-weight:bold;
23 text-decoration:none;
23 text-decoration:none;
24 background-color:inherit;
24 background-color:inherit;
25 }
25 }
26
26
27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
28 a img{border:none;}
28 a img{border:none;}
29
29
30 p{padding:0 0 1em 0;}
30 p{padding:0 0 1em 0;}
31 p form{margin-top:0; margin-bottom:20px;}
31 p form{margin-top:0; margin-bottom:20px;}
32
32
33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
34 img.left{float:left; margin:0 12px 5px 0;}
34 img.left{float:left; margin:0 12px 5px 0;}
35 img.center{display:block; margin:0 auto 5px auto;}
35 img.center{display:block; margin:0 auto 5px auto;}
36 img.right{float:right; margin:0 0 5px 12px;}
36 img.right{float:right; margin:0 0 5px 12px;}
37
37
38 /**************** Header and navigation styles ****************/
38 /**************** Header and navigation styles ****************/
39
39
40 #container{
40 #container{
41 width:100%;
41 width:100%;
42 min-width: 800px;
42 min-width: 800px;
43 margin:0;
43 margin:0;
44 padding:0;
44 padding:0;
45 text-align:left;
45 text-align:left;
46 background:#ffffff;
46 background:#ffffff;
47 color:#303030;
47 color:#303030;
48 }
48 }
49
49
50 #header{
50 #header{
51 height:4.5em;
51 height:4.5em;
52 /*width:758px;*/
52 /*width:758px;*/
53 margin:0;
53 margin:0;
54 background:#467aa7;
54 background:#467aa7;
55 color:#ffffff;
55 color:#ffffff;
56 margin-bottom:1px;
56 margin-bottom:1px;
57 }
57 }
58
58
59 #header h1{
59 #header h1{
60 padding:10px 0 0 20px;
60 padding:10px 0 0 20px;
61 font-size:1.8em;
61 font-size:1.8em;
62 background-color:inherit;
62 background-color:inherit;
63 color:#fff; /*rgb(152, 26, 33);*/
63 color:#fff; /*rgb(152, 26, 33);*/
64 letter-spacing:-2px;
64 letter-spacing:-2px;
65 font-weight:normal;
65 font-weight:normal;
66 }
66 }
67
67
68 #header h2{
68 #header h2{
69 margin:3px 0 0 40px;
69 margin:3px 0 0 40px;
70 font-size:1.4em;
70 font-size:1.4em;
71 background-color:inherit;
71 background-color:inherit;
72 color:#f0f2f4;
72 color:#f0f2f4;
73 letter-spacing:-1px;
73 letter-spacing:-1px;
74 font-weight:normal;
74 font-weight:normal;
75 }
75 }
76
76
77 #navigation{
77 #navigation{
78 height:2.2em;
78 height:2.2em;
79 line-height:2.2em;
79 line-height:2.2em;
80 /*width:758px;*/
80 /*width:758px;*/
81 margin:0;
81 margin:0;
82 background:#578bb8;
82 background:#578bb8;
83 color:#ffffff;
83 color:#ffffff;
84 }
84 }
85
85
86 #navigation li{
86 #navigation li{
87 float:left;
87 float:left;
88 list-style-type:none;
88 list-style-type:none;
89 border-right:1px solid #ffffff;
89 border-right:1px solid #ffffff;
90 white-space:nowrap;
90 white-space:nowrap;
91 }
91 }
92
92
93 #navigation li.right {
93 #navigation li.right {
94 float:right;
94 float:right;
95 list-style-type:none;
95 list-style-type:none;
96 border-right:0;
96 border-right:0;
97 border-left:1px solid #ffffff;
97 border-left:1px solid #ffffff;
98 white-space:nowrap;
98 white-space:nowrap;
99 }
99 }
100
100
101 #navigation li a{
101 #navigation li a{
102 display:block;
102 display:block;
103 padding:0px 10px 0px 22px;
103 padding:0px 10px 0px 22px;
104 font-size:0.8em;
104 font-size:0.8em;
105 font-weight:normal;
105 font-weight:normal;
106 /*text-transform:uppercase;*/
106 /*text-transform:uppercase;*/
107 text-decoration:none;
107 text-decoration:none;
108 background-color:inherit;
108 background-color:inherit;
109 color: #ffffff;
109 color: #ffffff;
110 }
110 }
111
111
112 * html #navigation a {width:1%;}
112 * html #navigation a {width:1%;}
113
113
114 #navigation .selected,#navigation a:hover{
114 #navigation .selected,#navigation a:hover{
115 color:#ffffff;
115 color:#ffffff;
116 text-decoration:none;
116 text-decoration:none;
117 background-color: #80b0da;
117 background-color: #80b0da;
118 }
118 }
119
119
120 /**************** Icons links *******************/
120 /**************** Icons links *******************/
121 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
121 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
122 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
122 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
123 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
123 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
124 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
124 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
125 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
125 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
126 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
126 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
127 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
127 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
128
128
129 /**************** Content styles ****************/
129 /**************** Content styles ****************/
130
130
131 html>body #content {
131 html>body #content {
132 height: auto;
132 height: auto;
133 min-height: 300px;
133 min-height: 300px;
134 }
134 }
135
135
136 #content{
136 #content{
137 /*float:right;*/
137 /*float:right;*/
138 /*width:530px;*/
138 /*width:530px;*/
139 width: auto;
139 width: auto;
140 height:300px;
140 height:300px;
141 font-size:0.9em;
141 font-size:0.9em;
142 padding:20px 10px 10px 20px;
142 padding:20px 10px 10px 20px;
143 /*position: absolute;*/
143 /*position: absolute;*/
144 margin-left: 120px;
144 margin-left: 120px;
145 border-left: 1px dashed #c0c0c0;
145 border-left: 1px dashed #c0c0c0;
146
146
147 }
147 }
148
148
149 #content h2{
149 #content h2{
150 display:block;
150 display:block;
151 margin:0 0 16px 0;
151 margin:0 0 16px 0;
152 font-size:1.7em;
152 font-size:1.7em;
153 font-weight:normal;
153 font-weight:normal;
154 letter-spacing:-1px;
154 letter-spacing:-1px;
155 color:#505050;
155 color:#505050;
156 background-color:inherit;
156 background-color:inherit;
157 }
157 }
158
158
159 #content h2 a{font-weight:normal;}
159 #content h2 a{font-weight:normal;}
160 #content h3{margin:0 0 12px 0; font-size:1.4em; letter-spacing:-1px;}
160 #content h3{margin:0 0 12px 0; font-size:1.4em; letter-spacing:-1px;}
161 #content a:hover,#subcontent a:hover{text-decoration:underline;}
161 #content a:hover,#subcontent a:hover{text-decoration:underline;}
162 #content ul,#content ol{margin:0 5px 16px 35px;}
162 #content ul,#content ol{margin:0 5px 16px 35px;}
163 #content dl{margin:0 5px 10px 25px;}
163 #content dl{margin:0 5px 10px 25px;}
164 #content dt{font-weight:bold; margin-bottom:5px;}
164 #content dt{font-weight:bold; margin-bottom:5px;}
165 #content dd{margin:0 0 10px 15px;}
165 #content dd{margin:0 0 10px 15px;}
166
166
167
167
168 /***********************************************/
168 /***********************************************/
169
169
170 /*
170 /*
171 form{
171 form{
172 padding:15px;
172 padding:15px;
173 margin:0 0 20px 0;
173 margin:0 0 20px 0;
174 border:1px solid #c0c0c0;
174 border:1px solid #c0c0c0;
175 background-color:#CEE1ED;
175 background-color:#CEE1ED;
176 width:600px;
176 width:600px;
177 }
177 }
178 */
178 */
179
179
180 form {
180 form {
181 display: inline;
181 display: inline;
182 }
182 }
183
183
184 .noborder {
184 .noborder {
185 border:0px;
185 border:0px;
186 Exception exceptions.AssertionError: <exceptions.AssertionError instance at 0xb7c0b20c> in <bound
186 Exception exceptions.AssertionError: <exceptions.AssertionError instance at 0xb7c0b20c> in <bound
187 method SubversionRepository.__del__ of <vclib.svn.SubversionRepository instance at 0xb7c1252c>>
187 method SubversionRepository.__del__ of <vclib.svn.SubversionRepository instance at 0xb7c1252c>>
188 ignored
188 ignored
189
189
190 background-color:#fff;
190 background-color:#fff;
191 width:100%;
191 width:100%;
192 }
192 }
193
193
194 textarea {
194 textarea {
195 padding:0;
195 padding:0;
196 margin:0;
196 margin:0;
197 }
197 }
198
198
199 input {
199 input {
200 vertical-align: middle;
200 vertical-align: middle;
201 }
201 }
202
202
203 input.button-small
203 input.button-small
204 {
204 {
205 font-size: 0.8em;
205 font-size: 0.8em;
206 }
206 }
207
207
208 select {
209 vertical-align: middle;
210 }
211
208 select.select-small
212 select.select-small
209 {
213 {
210 border: 1px solid #7F9DB9;
214 border: 1px solid #7F9DB9;
211 padding: 1px;
215 padding: 1px;
212 font-size: 0.8em;
216 font-size: 0.8em;
213 }
217 }
214
218
215 .active-filter
219 .active-filter
216 {
220 {
217 background-color: #F9FA9E;
221 background-color: #F9FA9E;
218
222
219 }
223 }
220
224
221 label {
225 label {
222 font-weight: bold;
226 font-weight: bold;
223 font-size: 1em;
227 font-size: 1em;
224 }
228 }
225
229
226 fieldset {
230 fieldset {
227 border:1px solid #7F9DB9;
231 border:1px solid #7F9DB9;
228 padding: 6px;
232 padding: 6px;
229 }
233 }
230
234
231 legend {
235 legend {
232 color: #505050;
236 color: #505050;
233
237
234 }
238 }
235
239
236 .required {
240 .required {
237 color: #bb0000;
241 color: #bb0000;
238 }
242 }
239
243
240 table.listTableContent {
244 table.listTableContent {
241 border:1px solid #578bb8;
245 border:1px solid #578bb8;
242 width:99%;
246 width:99%;
243 border-collapse: collapse;
247 border-collapse: collapse;
244 }
248 }
245
249
246 table.listTableContent td {
250 table.listTableContent td {
247 padding:4px;
251 padding:2px;
248 }
252 }
249
253
250 tr.ListHead {
254 tr.ListHead {
251 background-color:#467aa7;
255 background-color:#467aa7;
252 color:#FFFFFF;
256 color:#FFFFFF;
253 text-align:center;
257 text-align:center;
254 }
258 }
255
259
256 tr.ListHead a {
260 tr.ListHead a {
257 color:#FFFFFF;
261 color:#FFFFFF;
258 text-decoration:underline;
262 text-decoration:underline;
259 }
263 }
260
264
261 tr.odd {
265 tr.odd {
262 background-color:#f0f1f2;
266 background-color:#f0f1f2;
263 }
267 }
264 tr.even {
268 tr.even {
265 background-color: #fff;
269 background-color: #fff;
266 }
270 }
267
271
268 table.reportTableContent {
272 table.reportTableContent {
269 border:1px solid #c0c0c0;
273 border:1px solid #c0c0c0;
270 width:99%;
274 width:99%;
271 border-collapse: collapse;
275 border-collapse: collapse;
272 }
276 }
273
277
274 table.reportTableContent td {
278 table.reportTableContent td {
275 padding:2px;
279 padding:2px;
276 }
280 }
277
281
278 hr { border:none; border-bottom: dotted 2px #c0c0c0; }
282 hr { border:none; border-bottom: dotted 2px #c0c0c0; }
279
283
280
284
281 /**************** Sidebar styles ****************/
285 /**************** Sidebar styles ****************/
282
286
283 #subcontent{
287 #subcontent{
284 float:left;
288 float:left;
285 clear:both;
289 clear:both;
286 width:110px;
290 width:110px;
287 padding:20px 20px 10px 5px;
291 padding:20px 20px 10px 5px;
288 }
292 }
289
293
290 #subcontent h2{
294 #subcontent h2{
291 display:block;
295 display:block;
292 margin:0 0 5px 0;
296 margin:0 0 5px 0;
293 font-size:1.0em;
297 font-size:1.0em;
294 font-weight:bold;
298 font-weight:bold;
295 text-align:left;
299 text-align:left;
296 letter-spacing:-1px;
300 letter-spacing:-1px;
297 color:#606060;
301 color:#606060;
298 background-color:inherit;
302 background-color:inherit;
299 }
303 }
300
304
301 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
305 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
302
306
303 /**************** Menublock styles ****************/
307 /**************** Menublock styles ****************/
304
308
305 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
309 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
306 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
310 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
307 .menublock li a{font-weight:bold; text-decoration:none;}
311 .menublock li a{font-weight:bold; text-decoration:none;}
308 .menublock li a:hover{text-decoration:none;}
312 .menublock li a:hover{text-decoration:none;}
309 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
313 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
310 .menublock li ul li{margin-bottom:0;}
314 .menublock li ul li{margin-bottom:0;}
311 .menublock li ul a{font-weight:normal;}
315 .menublock li ul a{font-weight:normal;}
312
316
313 /**************** Searchbar styles ****************/
317 /**************** Searchbar styles ****************/
314
318
315 #searchbar{margin:0 0 20px 0;}
319 #searchbar{margin:0 0 20px 0;}
316 #searchbar form fieldset{margin-left:10px; border:0 solid;}
320 #searchbar form fieldset{margin-left:10px; border:0 solid;}
317
321
318 #searchbar #s{
322 #searchbar #s{
319 height:1.2em;
323 height:1.2em;
320 width:110px;
324 width:110px;
321 margin:0 5px 0 0;
325 margin:0 5px 0 0;
322 border:1px solid #a0a0a0;
326 border:1px solid #a0a0a0;
323 }
327 }
324
328
325 #searchbar #searchbutton{
329 #searchbar #searchbutton{
326 width:auto;
330 width:auto;
327 padding:0 1px;
331 padding:0 1px;
328 border:1px solid #808080;
332 border:1px solid #808080;
329 font-size:0.9em;
333 font-size:0.9em;
330 text-align:center;
334 text-align:center;
331 }
335 }
332
336
333 /**************** Footer styles ****************/
337 /**************** Footer styles ****************/
334
338
335 #footer{
339 #footer{
336 clear:both;
340 clear:both;
337 /*width:758px;*/
341 /*width:758px;*/
338 padding:5px 0;
342 padding:5px 0;
339 margin:0;
343 margin:0;
340 font-size:0.9em;
344 font-size:0.9em;
341 color:#f0f0f0;
345 color:#f0f0f0;
342 background:#467aa7;
346 background:#467aa7;
343 }
347 }
344
348
345 #footer p{padding:0; margin:0; text-align:center;}
349 #footer p{padding:0; margin:0; text-align:center;}
346 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
350 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
347 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
351 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
348
352
349 /**************** Misc classes and styles ****************/
353 /**************** Misc classes and styles ****************/
350
354
351 .splitcontentleft{float:left; width:49%;}
355 .splitcontentleft{float:left; width:49%;}
352 .splitcontentright{float:right; width:49%;}
356 .splitcontentright{float:right; width:49%;}
353 .clear{clear:both;}
357 .clear{clear:both;}
354 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
358 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
355 .hide{display:none;}
359 .hide{display:none;}
356 .textcenter{text-align:center;}
360 .textcenter{text-align:center;}
357 .textright{text-align:right;}
361 .textright{text-align:right;}
358 .important{color:#f02025; background-color:inherit; font-weight:bold;}
362 .important{color:#f02025; background-color:inherit; font-weight:bold;}
359
363
360 .box{
364 .box{
361 margin:0 0 20px 0;
365 margin:0 0 20px 0;
362 padding:10px;
366 padding:10px;
363 border:1px solid #c0c0c0;
367 border:1px solid #c0c0c0;
364 background-color:#fafbfc;
368 background-color:#fafbfc;
365 color:#505050;
369 color:#505050;
366 line-height:1.5em;
370 line-height:1.5em;
367 }
371 }
368
372
373 .topright{
374 position: absolute;
375 right: 25px;
376 top: 100px;
377 }
378
369 .login {
379 .login {
370 width: 50%;
380 width: 50%;
371 text-align: left;
381 text-align: left;
372 }
382 }
373
383
374 img.calendar-trigger {
384 img.calendar-trigger {
375 cursor: pointer;
385 cursor: pointer;
376 vertical-align: middle;
386 vertical-align: middle;
377 margin-left: 4px;
387 margin-left: 4px;
378 }
388 }
379
389
380
390
381 /***** CSS FORM ******/
391 /***** CSS FORM ******/
382 .tabular p{
392 .tabular p{
383 margin: 0;
393 margin: 0;
384 padding: 5px 0 8px 0;
394 padding: 5px 0 8px 0;
385 padding-left: 180px; /*width of left column containing the label elements*/
395 padding-left: 180px; /*width of left column containing the label elements*/
386 height: 1%;
396 height: 1%;
387 }
397 }
388
398
389 .tabular label{
399 .tabular label{
390 font-weight: bold;
400 font-weight: bold;
391 float: left;
401 float: left;
392 margin-left: -180px; /*width of left column*/
402 margin-left: -180px; /*width of left column*/
393 width: 175px; /*width of labels. Should be smaller than left column to create some right
403 width: 175px; /*width of labels. Should be smaller than left column to create some right
394 margin*/
404 margin*/
395 }
405 }
396
406
397 .error {
407 .error {
398 color: #cc0000;
408 color: #cc0000;
399 }
409 }
400
410
401
411
402 /*.threepxfix class below:
412 /*.threepxfix class below:
403 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
413 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
404 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
414 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
405 */
415 */
406
416
407 * html .threepxfix{
417 * html .threepxfix{
408 margin-left: 3px;
418 margin-left: 3px;
409 } No newline at end of file
419 }
General Comments 0
You need to be logged in to leave comments. Login now