##// END OF EJS Templates
Adds a role setting that viewing all or own time entries (#8929)....
Jean-Philippe Lang -
r13893:6659aad3ef65
parent child
Show More
@@ -0,0 +1,9
1 class AddRolesTimeEntriesVisibility < ActiveRecord::Migration
2 def self.up
3 add_column :roles, :time_entries_visibility, :string, :limit => 30, :default => 'all', :null => false
4 end
5
6 def self.down
7 remove_column :roles, :time_entries_visibility
8 end
9 end
@@ -1,233 +1,233
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2015 Jean-Philippe Lang
2 # Copyright (C) 2006-2015 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 menu_item :overview
19 menu_item :overview
20 menu_item :settings, :only => :settings
20 menu_item :settings, :only => :settings
21
21
22 before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
22 before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
23 before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
23 before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
24 before_filter :authorize_global, :only => [:new, :create]
24 before_filter :authorize_global, :only => [:new, :create]
25 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
25 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
26 accept_rss_auth :index
26 accept_rss_auth :index
27 accept_api_auth :index, :show, :create, :update, :destroy
27 accept_api_auth :index, :show, :create, :update, :destroy
28
28
29 after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
29 after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
30 if controller.request.post?
30 if controller.request.post?
31 controller.send :expire_action, :controller => 'welcome', :action => 'robots'
31 controller.send :expire_action, :controller => 'welcome', :action => 'robots'
32 end
32 end
33 end
33 end
34
34
35 helper :custom_fields
35 helper :custom_fields
36 helper :issues
36 helper :issues
37 helper :queries
37 helper :queries
38 helper :repositories
38 helper :repositories
39 helper :members
39 helper :members
40
40
41 # Lists visible projects
41 # Lists visible projects
42 def index
42 def index
43 scope = Project.visible.sorted
43 scope = Project.visible.sorted
44
44
45 respond_to do |format|
45 respond_to do |format|
46 format.html {
46 format.html {
47 unless params[:closed]
47 unless params[:closed]
48 scope = scope.active
48 scope = scope.active
49 end
49 end
50 @projects = scope.to_a
50 @projects = scope.to_a
51 }
51 }
52 format.api {
52 format.api {
53 @offset, @limit = api_offset_and_limit
53 @offset, @limit = api_offset_and_limit
54 @project_count = scope.count
54 @project_count = scope.count
55 @projects = scope.offset(@offset).limit(@limit).to_a
55 @projects = scope.offset(@offset).limit(@limit).to_a
56 }
56 }
57 format.atom {
57 format.atom {
58 projects = scope.reorder(:created_on => :desc).limit(Setting.feeds_limit.to_i).to_a
58 projects = scope.reorder(:created_on => :desc).limit(Setting.feeds_limit.to_i).to_a
59 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
59 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
60 }
60 }
61 end
61 end
62 end
62 end
63
63
64 def new
64 def new
65 @issue_custom_fields = IssueCustomField.sorted.to_a
65 @issue_custom_fields = IssueCustomField.sorted.to_a
66 @trackers = Tracker.sorted.to_a
66 @trackers = Tracker.sorted.to_a
67 @project = Project.new
67 @project = Project.new
68 @project.safe_attributes = params[:project]
68 @project.safe_attributes = params[:project]
69 end
69 end
70
70
71 def create
71 def create
72 @issue_custom_fields = IssueCustomField.sorted.to_a
72 @issue_custom_fields = IssueCustomField.sorted.to_a
73 @trackers = Tracker.sorted.to_a
73 @trackers = Tracker.sorted.to_a
74 @project = Project.new
74 @project = Project.new
75 @project.safe_attributes = params[:project]
75 @project.safe_attributes = params[:project]
76
76
77 if @project.save
77 if @project.save
78 unless User.current.admin?
78 unless User.current.admin?
79 @project.add_default_member(User.current)
79 @project.add_default_member(User.current)
80 end
80 end
81 respond_to do |format|
81 respond_to do |format|
82 format.html {
82 format.html {
83 flash[:notice] = l(:notice_successful_create)
83 flash[:notice] = l(:notice_successful_create)
84 if params[:continue]
84 if params[:continue]
85 attrs = {:parent_id => @project.parent_id}.reject {|k,v| v.nil?}
85 attrs = {:parent_id => @project.parent_id}.reject {|k,v| v.nil?}
86 redirect_to new_project_path(attrs)
86 redirect_to new_project_path(attrs)
87 else
87 else
88 redirect_to settings_project_path(@project)
88 redirect_to settings_project_path(@project)
89 end
89 end
90 }
90 }
91 format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
91 format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
92 end
92 end
93 else
93 else
94 respond_to do |format|
94 respond_to do |format|
95 format.html { render :action => 'new' }
95 format.html { render :action => 'new' }
96 format.api { render_validation_errors(@project) }
96 format.api { render_validation_errors(@project) }
97 end
97 end
98 end
98 end
99 end
99 end
100
100
101 def copy
101 def copy
102 @issue_custom_fields = IssueCustomField.sorted.to_a
102 @issue_custom_fields = IssueCustomField.sorted.to_a
103 @trackers = Tracker.sorted.to_a
103 @trackers = Tracker.sorted.to_a
104 @source_project = Project.find(params[:id])
104 @source_project = Project.find(params[:id])
105 if request.get?
105 if request.get?
106 @project = Project.copy_from(@source_project)
106 @project = Project.copy_from(@source_project)
107 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
107 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
108 else
108 else
109 Mailer.with_deliveries(params[:notifications] == '1') do
109 Mailer.with_deliveries(params[:notifications] == '1') do
110 @project = Project.new
110 @project = Project.new
111 @project.safe_attributes = params[:project]
111 @project.safe_attributes = params[:project]
112 if @project.copy(@source_project, :only => params[:only])
112 if @project.copy(@source_project, :only => params[:only])
113 flash[:notice] = l(:notice_successful_create)
113 flash[:notice] = l(:notice_successful_create)
114 redirect_to settings_project_path(@project)
114 redirect_to settings_project_path(@project)
115 elsif !@project.new_record?
115 elsif !@project.new_record?
116 # Project was created
116 # Project was created
117 # But some objects were not copied due to validation failures
117 # But some objects were not copied due to validation failures
118 # (eg. issues from disabled trackers)
118 # (eg. issues from disabled trackers)
119 # TODO: inform about that
119 # TODO: inform about that
120 redirect_to settings_project_path(@project)
120 redirect_to settings_project_path(@project)
121 end
121 end
122 end
122 end
123 end
123 end
124 rescue ActiveRecord::RecordNotFound
124 rescue ActiveRecord::RecordNotFound
125 # source_project not found
125 # source_project not found
126 render_404
126 render_404
127 end
127 end
128
128
129 # Show @project
129 # Show @project
130 def show
130 def show
131 # try to redirect to the requested menu item
131 # try to redirect to the requested menu item
132 if params[:jump] && redirect_to_project_menu_item(@project, params[:jump])
132 if params[:jump] && redirect_to_project_menu_item(@project, params[:jump])
133 return
133 return
134 end
134 end
135
135
136 @users_by_role = @project.users_by_role
136 @users_by_role = @project.users_by_role
137 @subprojects = @project.children.visible.to_a
137 @subprojects = @project.children.visible.to_a
138 @news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
138 @news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
139 @trackers = @project.rolled_up_trackers
139 @trackers = @project.rolled_up_trackers
140
140
141 cond = @project.project_condition(Setting.display_subprojects_issues?)
141 cond = @project.project_condition(Setting.display_subprojects_issues?)
142
142
143 @open_issues_by_tracker = Issue.visible.open.where(cond).group(:tracker).count
143 @open_issues_by_tracker = Issue.visible.open.where(cond).group(:tracker).count
144 @total_issues_by_tracker = Issue.visible.where(cond).group(:tracker).count
144 @total_issues_by_tracker = Issue.visible.where(cond).group(:tracker).count
145
145
146 if User.current.allowed_to?(:view_time_entries, @project)
146 if User.current.allowed_to_view_all_time_entries?(@project)
147 @total_hours = TimeEntry.visible.where(cond).sum(:hours).to_f
147 @total_hours = TimeEntry.visible.where(cond).sum(:hours).to_f
148 end
148 end
149
149
150 @key = User.current.rss_key
150 @key = User.current.rss_key
151
151
152 respond_to do |format|
152 respond_to do |format|
153 format.html
153 format.html
154 format.api
154 format.api
155 end
155 end
156 end
156 end
157
157
158 def settings
158 def settings
159 @issue_custom_fields = IssueCustomField.sorted.to_a
159 @issue_custom_fields = IssueCustomField.sorted.to_a
160 @issue_category ||= IssueCategory.new
160 @issue_category ||= IssueCategory.new
161 @member ||= @project.members.new
161 @member ||= @project.members.new
162 @trackers = Tracker.sorted.to_a
162 @trackers = Tracker.sorted.to_a
163 @wiki ||= @project.wiki || Wiki.new(:project => @project)
163 @wiki ||= @project.wiki || Wiki.new(:project => @project)
164 end
164 end
165
165
166 def edit
166 def edit
167 end
167 end
168
168
169 def update
169 def update
170 @project.safe_attributes = params[:project]
170 @project.safe_attributes = params[:project]
171 if @project.save
171 if @project.save
172 respond_to do |format|
172 respond_to do |format|
173 format.html {
173 format.html {
174 flash[:notice] = l(:notice_successful_update)
174 flash[:notice] = l(:notice_successful_update)
175 redirect_to settings_project_path(@project)
175 redirect_to settings_project_path(@project)
176 }
176 }
177 format.api { render_api_ok }
177 format.api { render_api_ok }
178 end
178 end
179 else
179 else
180 respond_to do |format|
180 respond_to do |format|
181 format.html {
181 format.html {
182 settings
182 settings
183 render :action => 'settings'
183 render :action => 'settings'
184 }
184 }
185 format.api { render_validation_errors(@project) }
185 format.api { render_validation_errors(@project) }
186 end
186 end
187 end
187 end
188 end
188 end
189
189
190 def modules
190 def modules
191 @project.enabled_module_names = params[:enabled_module_names]
191 @project.enabled_module_names = params[:enabled_module_names]
192 flash[:notice] = l(:notice_successful_update)
192 flash[:notice] = l(:notice_successful_update)
193 redirect_to settings_project_path(@project, :tab => 'modules')
193 redirect_to settings_project_path(@project, :tab => 'modules')
194 end
194 end
195
195
196 def archive
196 def archive
197 unless @project.archive
197 unless @project.archive
198 flash[:error] = l(:error_can_not_archive_project)
198 flash[:error] = l(:error_can_not_archive_project)
199 end
199 end
200 redirect_to admin_projects_path(:status => params[:status])
200 redirect_to admin_projects_path(:status => params[:status])
201 end
201 end
202
202
203 def unarchive
203 def unarchive
204 unless @project.active?
204 unless @project.active?
205 @project.unarchive
205 @project.unarchive
206 end
206 end
207 redirect_to admin_projects_path(:status => params[:status])
207 redirect_to admin_projects_path(:status => params[:status])
208 end
208 end
209
209
210 def close
210 def close
211 @project.close
211 @project.close
212 redirect_to project_path(@project)
212 redirect_to project_path(@project)
213 end
213 end
214
214
215 def reopen
215 def reopen
216 @project.reopen
216 @project.reopen
217 redirect_to project_path(@project)
217 redirect_to project_path(@project)
218 end
218 end
219
219
220 # Delete @project
220 # Delete @project
221 def destroy
221 def destroy
222 @project_to_destroy = @project
222 @project_to_destroy = @project
223 if api_request? || params[:confirm]
223 if api_request? || params[:confirm]
224 @project_to_destroy.destroy
224 @project_to_destroy.destroy
225 respond_to do |format|
225 respond_to do |format|
226 format.html { redirect_to admin_projects_path }
226 format.html { redirect_to admin_projects_path }
227 format.api { render_api_ok }
227 format.api { render_api_ok }
228 end
228 end
229 end
229 end
230 # hide project in layout
230 # hide project in layout
231 @project = nil
231 @project = nil
232 end
232 end
233 end
233 end
@@ -1,221 +1,229
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2015 Jean-Philippe Lang
2 # Copyright (C) 2006-2015 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 Role < ActiveRecord::Base
18 class Role < ActiveRecord::Base
19 # Custom coder for the permissions attribute that should be an
19 # Custom coder for the permissions attribute that should be an
20 # array of symbols. Rails 3 uses Psych which can be *unbelievably*
20 # array of symbols. Rails 3 uses Psych which can be *unbelievably*
21 # slow on some platforms (eg. mingw32).
21 # slow on some platforms (eg. mingw32).
22 class PermissionsAttributeCoder
22 class PermissionsAttributeCoder
23 def self.load(str)
23 def self.load(str)
24 str.to_s.scan(/:([a-z0-9_]+)/).flatten.map(&:to_sym)
24 str.to_s.scan(/:([a-z0-9_]+)/).flatten.map(&:to_sym)
25 end
25 end
26
26
27 def self.dump(value)
27 def self.dump(value)
28 YAML.dump(value)
28 YAML.dump(value)
29 end
29 end
30 end
30 end
31
31
32 # Built-in roles
32 # Built-in roles
33 BUILTIN_NON_MEMBER = 1
33 BUILTIN_NON_MEMBER = 1
34 BUILTIN_ANONYMOUS = 2
34 BUILTIN_ANONYMOUS = 2
35
35
36 ISSUES_VISIBILITY_OPTIONS = [
36 ISSUES_VISIBILITY_OPTIONS = [
37 ['all', :label_issues_visibility_all],
37 ['all', :label_issues_visibility_all],
38 ['default', :label_issues_visibility_public],
38 ['default', :label_issues_visibility_public],
39 ['own', :label_issues_visibility_own]
39 ['own', :label_issues_visibility_own]
40 ]
40 ]
41
41
42 TIME_ENTRIES_VISIBILITY_OPTIONS = [
43 ['all', :label_time_entries_visibility_all],
44 ['own', :label_time_entries_visibility_own]
45 ]
46
42 USERS_VISIBILITY_OPTIONS = [
47 USERS_VISIBILITY_OPTIONS = [
43 ['all', :label_users_visibility_all],
48 ['all', :label_users_visibility_all],
44 ['members_of_visible_projects', :label_users_visibility_members_of_visible_projects]
49 ['members_of_visible_projects', :label_users_visibility_members_of_visible_projects]
45 ]
50 ]
46
51
47 scope :sorted, lambda { order(:builtin, :position) }
52 scope :sorted, lambda { order(:builtin, :position) }
48 scope :givable, lambda { order(:position).where(:builtin => 0) }
53 scope :givable, lambda { order(:position).where(:builtin => 0) }
49 scope :builtin, lambda { |*args|
54 scope :builtin, lambda { |*args|
50 compare = (args.first == true ? 'not' : '')
55 compare = (args.first == true ? 'not' : '')
51 where("#{compare} builtin = 0")
56 where("#{compare} builtin = 0")
52 }
57 }
53
58
54 before_destroy :check_deletable
59 before_destroy :check_deletable
55 has_many :workflow_rules, :dependent => :delete_all do
60 has_many :workflow_rules, :dependent => :delete_all do
56 def copy(source_role)
61 def copy(source_role)
57 WorkflowRule.copy(nil, source_role, nil, proxy_association.owner)
62 WorkflowRule.copy(nil, source_role, nil, proxy_association.owner)
58 end
63 end
59 end
64 end
60 has_and_belongs_to_many :custom_fields, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "role_id"
65 has_and_belongs_to_many :custom_fields, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "role_id"
61
66
62 has_many :member_roles, :dependent => :destroy
67 has_many :member_roles, :dependent => :destroy
63 has_many :members, :through => :member_roles
68 has_many :members, :through => :member_roles
64 acts_as_list
69 acts_as_list
65
70
66 serialize :permissions, ::Role::PermissionsAttributeCoder
71 serialize :permissions, ::Role::PermissionsAttributeCoder
67 attr_protected :builtin
72 attr_protected :builtin
68
73
69 validates_presence_of :name
74 validates_presence_of :name
70 validates_uniqueness_of :name
75 validates_uniqueness_of :name
71 validates_length_of :name, :maximum => 30
76 validates_length_of :name, :maximum => 30
72 validates_inclusion_of :issues_visibility,
77 validates_inclusion_of :issues_visibility,
73 :in => ISSUES_VISIBILITY_OPTIONS.collect(&:first),
78 :in => ISSUES_VISIBILITY_OPTIONS.collect(&:first),
74 :if => lambda {|role| role.respond_to?(:issues_visibility) && role.issues_visibility_changed?}
79 :if => lambda {|role| role.respond_to?(:issues_visibility) && role.issues_visibility_changed?}
75 validates_inclusion_of :users_visibility,
80 validates_inclusion_of :users_visibility,
76 :in => USERS_VISIBILITY_OPTIONS.collect(&:first),
81 :in => USERS_VISIBILITY_OPTIONS.collect(&:first),
77 :if => lambda {|role| role.respond_to?(:users_visibility) && role.users_visibility_changed?}
82 :if => lambda {|role| role.respond_to?(:users_visibility) && role.users_visibility_changed?}
83 validates_inclusion_of :time_entries_visibility,
84 :in => TIME_ENTRIES_VISIBILITY_OPTIONS.collect(&:first),
85 :if => lambda {|role| role.respond_to?(:time_entries_visibility) && role.time_entries_visibility_changed?}
78
86
79 # Copies attributes from another role, arg can be an id or a Role
87 # Copies attributes from another role, arg can be an id or a Role
80 def copy_from(arg, options={})
88 def copy_from(arg, options={})
81 return unless arg.present?
89 return unless arg.present?
82 role = arg.is_a?(Role) ? arg : Role.find_by_id(arg.to_s)
90 role = arg.is_a?(Role) ? arg : Role.find_by_id(arg.to_s)
83 self.attributes = role.attributes.dup.except("id", "name", "position", "builtin", "permissions")
91 self.attributes = role.attributes.dup.except("id", "name", "position", "builtin", "permissions")
84 self.permissions = role.permissions.dup
92 self.permissions = role.permissions.dup
85 self
93 self
86 end
94 end
87
95
88 def permissions=(perms)
96 def permissions=(perms)
89 perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms
97 perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms
90 write_attribute(:permissions, perms)
98 write_attribute(:permissions, perms)
91 end
99 end
92
100
93 def add_permission!(*perms)
101 def add_permission!(*perms)
94 self.permissions = [] unless permissions.is_a?(Array)
102 self.permissions = [] unless permissions.is_a?(Array)
95
103
96 permissions_will_change!
104 permissions_will_change!
97 perms.each do |p|
105 perms.each do |p|
98 p = p.to_sym
106 p = p.to_sym
99 permissions << p unless permissions.include?(p)
107 permissions << p unless permissions.include?(p)
100 end
108 end
101 save!
109 save!
102 end
110 end
103
111
104 def remove_permission!(*perms)
112 def remove_permission!(*perms)
105 return unless permissions.is_a?(Array)
113 return unless permissions.is_a?(Array)
106 permissions_will_change!
114 permissions_will_change!
107 perms.each { |p| permissions.delete(p.to_sym) }
115 perms.each { |p| permissions.delete(p.to_sym) }
108 save!
116 save!
109 end
117 end
110
118
111 # Returns true if the role has the given permission
119 # Returns true if the role has the given permission
112 def has_permission?(perm)
120 def has_permission?(perm)
113 !permissions.nil? && permissions.include?(perm.to_sym)
121 !permissions.nil? && permissions.include?(perm.to_sym)
114 end
122 end
115
123
116 def consider_workflow?
124 def consider_workflow?
117 has_permission?(:add_issues) || has_permission?(:edit_issues)
125 has_permission?(:add_issues) || has_permission?(:edit_issues)
118 end
126 end
119
127
120 def <=>(role)
128 def <=>(role)
121 if role
129 if role
122 if builtin == role.builtin
130 if builtin == role.builtin
123 position <=> role.position
131 position <=> role.position
124 else
132 else
125 builtin <=> role.builtin
133 builtin <=> role.builtin
126 end
134 end
127 else
135 else
128 -1
136 -1
129 end
137 end
130 end
138 end
131
139
132 def to_s
140 def to_s
133 name
141 name
134 end
142 end
135
143
136 def name
144 def name
137 case builtin
145 case builtin
138 when 1; l(:label_role_non_member, :default => read_attribute(:name))
146 when 1; l(:label_role_non_member, :default => read_attribute(:name))
139 when 2; l(:label_role_anonymous, :default => read_attribute(:name))
147 when 2; l(:label_role_anonymous, :default => read_attribute(:name))
140 else; read_attribute(:name)
148 else; read_attribute(:name)
141 end
149 end
142 end
150 end
143
151
144 # Return true if the role is a builtin role
152 # Return true if the role is a builtin role
145 def builtin?
153 def builtin?
146 self.builtin != 0
154 self.builtin != 0
147 end
155 end
148
156
149 # Return true if the role is the anonymous role
157 # Return true if the role is the anonymous role
150 def anonymous?
158 def anonymous?
151 builtin == 2
159 builtin == 2
152 end
160 end
153
161
154 # Return true if the role is a project member role
162 # Return true if the role is a project member role
155 def member?
163 def member?
156 !self.builtin?
164 !self.builtin?
157 end
165 end
158
166
159 # Return true if role is allowed to do the specified action
167 # Return true if role is allowed to do the specified action
160 # action can be:
168 # action can be:
161 # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
169 # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
162 # * a permission Symbol (eg. :edit_project)
170 # * a permission Symbol (eg. :edit_project)
163 def allowed_to?(action)
171 def allowed_to?(action)
164 if action.is_a? Hash
172 if action.is_a? Hash
165 allowed_actions.include? "#{action[:controller]}/#{action[:action]}"
173 allowed_actions.include? "#{action[:controller]}/#{action[:action]}"
166 else
174 else
167 allowed_permissions.include? action
175 allowed_permissions.include? action
168 end
176 end
169 end
177 end
170
178
171 # Return all the permissions that can be given to the role
179 # Return all the permissions that can be given to the role
172 def setable_permissions
180 def setable_permissions
173 setable_permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions
181 setable_permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions
174 setable_permissions -= Redmine::AccessControl.members_only_permissions if self.builtin == BUILTIN_NON_MEMBER
182 setable_permissions -= Redmine::AccessControl.members_only_permissions if self.builtin == BUILTIN_NON_MEMBER
175 setable_permissions -= Redmine::AccessControl.loggedin_only_permissions if self.builtin == BUILTIN_ANONYMOUS
183 setable_permissions -= Redmine::AccessControl.loggedin_only_permissions if self.builtin == BUILTIN_ANONYMOUS
176 setable_permissions
184 setable_permissions
177 end
185 end
178
186
179 # Find all the roles that can be given to a project member
187 # Find all the roles that can be given to a project member
180 def self.find_all_givable
188 def self.find_all_givable
181 Role.givable.to_a
189 Role.givable.to_a
182 end
190 end
183
191
184 # Return the builtin 'non member' role. If the role doesn't exist,
192 # Return the builtin 'non member' role. If the role doesn't exist,
185 # it will be created on the fly.
193 # it will be created on the fly.
186 def self.non_member
194 def self.non_member
187 find_or_create_system_role(BUILTIN_NON_MEMBER, 'Non member')
195 find_or_create_system_role(BUILTIN_NON_MEMBER, 'Non member')
188 end
196 end
189
197
190 # Return the builtin 'anonymous' role. If the role doesn't exist,
198 # Return the builtin 'anonymous' role. If the role doesn't exist,
191 # it will be created on the fly.
199 # it will be created on the fly.
192 def self.anonymous
200 def self.anonymous
193 find_or_create_system_role(BUILTIN_ANONYMOUS, 'Anonymous')
201 find_or_create_system_role(BUILTIN_ANONYMOUS, 'Anonymous')
194 end
202 end
195
203
196 private
204 private
197
205
198 def allowed_permissions
206 def allowed_permissions
199 @allowed_permissions ||= permissions + Redmine::AccessControl.public_permissions.collect {|p| p.name}
207 @allowed_permissions ||= permissions + Redmine::AccessControl.public_permissions.collect {|p| p.name}
200 end
208 end
201
209
202 def allowed_actions
210 def allowed_actions
203 @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten
211 @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten
204 end
212 end
205
213
206 def check_deletable
214 def check_deletable
207 raise "Cannot delete role" if members.any?
215 raise "Cannot delete role" if members.any?
208 raise "Cannot delete builtin role" if builtin?
216 raise "Cannot delete builtin role" if builtin?
209 end
217 end
210
218
211 def self.find_or_create_system_role(builtin, name)
219 def self.find_or_create_system_role(builtin, name)
212 role = where(:builtin => builtin).first
220 role = where(:builtin => builtin).first
213 if role.nil?
221 if role.nil?
214 role = create(:name => name, :position => 0) do |r|
222 role = create(:name => name, :position => 0) do |r|
215 r.builtin = builtin
223 r.builtin = builtin
216 end
224 end
217 raise "Unable to create the #{name} role." if role.new_record?
225 raise "Unable to create the #{name} role." if role.new_record?
218 end
226 end
219 role
227 role
220 end
228 end
221 end
229 end
@@ -1,131 +1,159
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2015 Jean-Philippe Lang
2 # Copyright (C) 2006-2015 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 TimeEntry < ActiveRecord::Base
18 class TimeEntry < ActiveRecord::Base
19 include Redmine::SafeAttributes
19 include Redmine::SafeAttributes
20 # could have used polymorphic association
20 # could have used polymorphic association
21 # project association here allows easy loading of time entries at project level with one database trip
21 # project association here allows easy loading of time entries at project level with one database trip
22 belongs_to :project
22 belongs_to :project
23 belongs_to :issue
23 belongs_to :issue
24 belongs_to :user
24 belongs_to :user
25 belongs_to :activity, :class_name => 'TimeEntryActivity'
25 belongs_to :activity, :class_name => 'TimeEntryActivity'
26
26
27 attr_protected :user_id, :tyear, :tmonth, :tweek
27 attr_protected :user_id, :tyear, :tmonth, :tweek
28
28
29 acts_as_customizable
29 acts_as_customizable
30 acts_as_event :title => Proc.new {|o| "#{l_hours(o.hours)} (#{(o.issue || o.project).event_title})"},
30 acts_as_event :title => Proc.new {|o| "#{l_hours(o.hours)} (#{(o.issue || o.project).event_title})"},
31 :url => Proc.new {|o| {:controller => 'timelog', :action => 'index', :project_id => o.project, :issue_id => o.issue}},
31 :url => Proc.new {|o| {:controller => 'timelog', :action => 'index', :project_id => o.project, :issue_id => o.issue}},
32 :author => :user,
32 :author => :user,
33 :group => :issue,
33 :group => :issue,
34 :description => :comments
34 :description => :comments
35
35
36 acts_as_activity_provider :timestamp => "#{table_name}.created_on",
36 acts_as_activity_provider :timestamp => "#{table_name}.created_on",
37 :author_key => :user_id,
37 :author_key => :user_id,
38 :scope => joins(:project).preload(:project)
38 :scope => joins(:project).preload(:project)
39
39
40 validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on
40 validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on
41 validates_numericality_of :hours, :allow_nil => true, :message => :invalid
41 validates_numericality_of :hours, :allow_nil => true, :message => :invalid
42 validates_length_of :comments, :maximum => 255, :allow_nil => true
42 validates_length_of :comments, :maximum => 255, :allow_nil => true
43 validates :spent_on, :date => true
43 validates :spent_on, :date => true
44 before_validation :set_project_if_nil
44 before_validation :set_project_if_nil
45 validate :validate_time_entry
45 validate :validate_time_entry
46
46
47 scope :visible, lambda {|*args|
47 scope :visible, lambda {|*args|
48 joins(:project).
48 joins(:project).
49 where(Project.allowed_to_condition(args.shift || User.current, :view_time_entries, *args))
49 where(TimeEntry.visible_condition(args.shift || User.current, *args))
50 }
50 }
51 scope :on_issue, lambda {|issue|
51 scope :on_issue, lambda {|issue|
52 joins(:issue).
52 joins(:issue).
53 where("#{Issue.table_name}.root_id = #{issue.root_id} AND #{Issue.table_name}.lft >= #{issue.lft} AND #{Issue.table_name}.rgt <= #{issue.rgt}")
53 where("#{Issue.table_name}.root_id = #{issue.root_id} AND #{Issue.table_name}.lft >= #{issue.lft} AND #{Issue.table_name}.rgt <= #{issue.rgt}")
54 }
54 }
55
55
56 safe_attributes 'hours', 'comments', 'project_id', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields'
56 safe_attributes 'hours', 'comments', 'project_id', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields'
57
57
58 # Returns a SQL conditions string used to find all time entries visible by the specified user
59 def self.visible_condition(user, options={})
60 Project.allowed_to_condition(user, :view_time_entries, options) do |role, user|
61 if role.time_entries_visibility == 'all'
62 nil
63 elsif role.time_entries_visibility == 'own' && user.id && user.logged?
64 "#{table_name}.user_id = #{user.id}"
65 else
66 '1=0'
67 end
68 end
69 end
70
71 # Returns true if user or current user is allowed to view the time entry
72 def visible?(user=nil)
73 (user || User.current).allowed_to?(:view_time_entries, self.project) do |role, user|
74 if role.time_entries_visibility == 'all'
75 true
76 elsif role.time_entries_visibility == 'own'
77 self.user == user
78 else
79 false
80 end
81 end
82 end
83
58 def initialize(attributes=nil, *args)
84 def initialize(attributes=nil, *args)
59 super
85 super
60 if new_record? && self.activity.nil?
86 if new_record? && self.activity.nil?
61 if default_activity = TimeEntryActivity.default
87 if default_activity = TimeEntryActivity.default
62 self.activity_id = default_activity.id
88 self.activity_id = default_activity.id
63 end
89 end
64 self.hours = nil if hours == 0
90 self.hours = nil if hours == 0
65 end
91 end
66 end
92 end
67
93
68 def safe_attributes=(attrs, user=User.current)
94 def safe_attributes=(attrs, user=User.current)
69 if attrs
95 if attrs
70 attrs = super(attrs)
96 attrs = super(attrs)
71 if issue_id_changed? && issue
97 if issue_id_changed? && issue
72 if user.allowed_to?(:log_time, issue.project)
98 if user.allowed_to?(:log_time, issue.project)
73 if attrs[:project_id].blank? && issue.project_id != project_id
99 if attrs[:project_id].blank? && issue.project_id != project_id
74 self.project_id = issue.project_id
100 self.project_id = issue.project_id
75 end
101 end
76 @invalid_issue_id = nil
102 @invalid_issue_id = nil
77 else
103 else
78 @invalid_issue_id = issue_id
104 @invalid_issue_id = issue_id
79 end
105 end
80 end
106 end
81 end
107 end
82 attrs
108 attrs
83 end
109 end
84
110
85 def set_project_if_nil
111 def set_project_if_nil
86 self.project = issue.project if issue && project.nil?
112 self.project = issue.project if issue && project.nil?
87 end
113 end
88
114
89 def validate_time_entry
115 def validate_time_entry
90 errors.add :hours, :invalid if hours && (hours < 0 || hours >= 1000)
116 errors.add :hours, :invalid if hours && (hours < 0 || hours >= 1000)
91 errors.add :project_id, :invalid if project.nil?
117 errors.add :project_id, :invalid if project.nil?
92 errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) || @invalid_issue_id
118 errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) || @invalid_issue_id
93 end
119 end
94
120
95 def hours=(h)
121 def hours=(h)
96 write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h)
122 write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h)
97 end
123 end
98
124
99 def hours
125 def hours
100 h = read_attribute(:hours)
126 h = read_attribute(:hours)
101 if h.is_a?(Float)
127 if h.is_a?(Float)
102 h.round(2)
128 h.round(2)
103 else
129 else
104 h
130 h
105 end
131 end
106 end
132 end
107
133
108 # tyear, tmonth, tweek assigned where setting spent_on attributes
134 # tyear, tmonth, tweek assigned where setting spent_on attributes
109 # these attributes make time aggregations easier
135 # these attributes make time aggregations easier
110 def spent_on=(date)
136 def spent_on=(date)
111 super
137 super
112 self.tyear = spent_on ? spent_on.year : nil
138 self.tyear = spent_on ? spent_on.year : nil
113 self.tmonth = spent_on ? spent_on.month : nil
139 self.tmonth = spent_on ? spent_on.month : nil
114 self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil
140 self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil
115 end
141 end
116
142
117 # Returns true if the time entry can be edited by usr, otherwise false
143 # Returns true if the time entry can be edited by usr, otherwise false
118 def editable_by?(usr)
144 def editable_by?(usr)
119 (usr == user && usr.allowed_to?(:edit_own_time_entries, project)) || usr.allowed_to?(:edit_time_entries, project)
145 visible?(usr) && (
146 (usr == user && usr.allowed_to?(:edit_own_time_entries, project)) || usr.allowed_to?(:edit_time_entries, project)
147 )
120 end
148 end
121
149
122 # Returns the custom_field_values that can be edited by the given user
150 # Returns the custom_field_values that can be edited by the given user
123 def editable_custom_field_values(user=nil)
151 def editable_custom_field_values(user=nil)
124 visible_custom_field_values
152 visible_custom_field_values
125 end
153 end
126
154
127 # Returns the custom fields that can be edited by the given user
155 # Returns the custom fields that can be edited by the given user
128 def editable_custom_fields(user=nil)
156 def editable_custom_fields(user=nil)
129 editable_custom_field_values(user).map(&:custom_field).uniq
157 editable_custom_field_values(user).map(&:custom_field).uniq
130 end
158 end
131 end
159 end
@@ -1,846 +1,852
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2015 Jean-Philippe Lang
2 # Copyright (C) 2006-2015 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 require "digest/sha1"
18 require "digest/sha1"
19
19
20 class User < Principal
20 class User < Principal
21 include Redmine::SafeAttributes
21 include Redmine::SafeAttributes
22
22
23 # Different ways of displaying/sorting users
23 # Different ways of displaying/sorting users
24 USER_FORMATS = {
24 USER_FORMATS = {
25 :firstname_lastname => {
25 :firstname_lastname => {
26 :string => '#{firstname} #{lastname}',
26 :string => '#{firstname} #{lastname}',
27 :order => %w(firstname lastname id),
27 :order => %w(firstname lastname id),
28 :setting_order => 1
28 :setting_order => 1
29 },
29 },
30 :firstname_lastinitial => {
30 :firstname_lastinitial => {
31 :string => '#{firstname} #{lastname.to_s.chars.first}.',
31 :string => '#{firstname} #{lastname.to_s.chars.first}.',
32 :order => %w(firstname lastname id),
32 :order => %w(firstname lastname id),
33 :setting_order => 2
33 :setting_order => 2
34 },
34 },
35 :firstinitial_lastname => {
35 :firstinitial_lastname => {
36 :string => '#{firstname.to_s.gsub(/(([[:alpha:]])[[:alpha:]]*\.?)/, \'\2.\')} #{lastname}',
36 :string => '#{firstname.to_s.gsub(/(([[:alpha:]])[[:alpha:]]*\.?)/, \'\2.\')} #{lastname}',
37 :order => %w(firstname lastname id),
37 :order => %w(firstname lastname id),
38 :setting_order => 2
38 :setting_order => 2
39 },
39 },
40 :firstname => {
40 :firstname => {
41 :string => '#{firstname}',
41 :string => '#{firstname}',
42 :order => %w(firstname id),
42 :order => %w(firstname id),
43 :setting_order => 3
43 :setting_order => 3
44 },
44 },
45 :lastname_firstname => {
45 :lastname_firstname => {
46 :string => '#{lastname} #{firstname}',
46 :string => '#{lastname} #{firstname}',
47 :order => %w(lastname firstname id),
47 :order => %w(lastname firstname id),
48 :setting_order => 4
48 :setting_order => 4
49 },
49 },
50 :lastname_coma_firstname => {
50 :lastname_coma_firstname => {
51 :string => '#{lastname}, #{firstname}',
51 :string => '#{lastname}, #{firstname}',
52 :order => %w(lastname firstname id),
52 :order => %w(lastname firstname id),
53 :setting_order => 5
53 :setting_order => 5
54 },
54 },
55 :lastname => {
55 :lastname => {
56 :string => '#{lastname}',
56 :string => '#{lastname}',
57 :order => %w(lastname id),
57 :order => %w(lastname id),
58 :setting_order => 6
58 :setting_order => 6
59 },
59 },
60 :username => {
60 :username => {
61 :string => '#{login}',
61 :string => '#{login}',
62 :order => %w(login id),
62 :order => %w(login id),
63 :setting_order => 7
63 :setting_order => 7
64 },
64 },
65 }
65 }
66
66
67 MAIL_NOTIFICATION_OPTIONS = [
67 MAIL_NOTIFICATION_OPTIONS = [
68 ['all', :label_user_mail_option_all],
68 ['all', :label_user_mail_option_all],
69 ['selected', :label_user_mail_option_selected],
69 ['selected', :label_user_mail_option_selected],
70 ['only_my_events', :label_user_mail_option_only_my_events],
70 ['only_my_events', :label_user_mail_option_only_my_events],
71 ['only_assigned', :label_user_mail_option_only_assigned],
71 ['only_assigned', :label_user_mail_option_only_assigned],
72 ['only_owner', :label_user_mail_option_only_owner],
72 ['only_owner', :label_user_mail_option_only_owner],
73 ['none', :label_user_mail_option_none]
73 ['none', :label_user_mail_option_none]
74 ]
74 ]
75
75
76 has_and_belongs_to_many :groups,
76 has_and_belongs_to_many :groups,
77 :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}",
77 :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}",
78 :after_add => Proc.new {|user, group| group.user_added(user)},
78 :after_add => Proc.new {|user, group| group.user_added(user)},
79 :after_remove => Proc.new {|user, group| group.user_removed(user)}
79 :after_remove => Proc.new {|user, group| group.user_removed(user)}
80 has_many :changesets, :dependent => :nullify
80 has_many :changesets, :dependent => :nullify
81 has_one :preference, :dependent => :destroy, :class_name => 'UserPreference'
81 has_one :preference, :dependent => :destroy, :class_name => 'UserPreference'
82 has_one :rss_token, lambda {where "action='feeds'"}, :class_name => 'Token'
82 has_one :rss_token, lambda {where "action='feeds'"}, :class_name => 'Token'
83 has_one :api_token, lambda {where "action='api'"}, :class_name => 'Token'
83 has_one :api_token, lambda {where "action='api'"}, :class_name => 'Token'
84 has_one :email_address, lambda {where :is_default => true}, :autosave => true
84 has_one :email_address, lambda {where :is_default => true}, :autosave => true
85 has_many :email_addresses, :dependent => :delete_all
85 has_many :email_addresses, :dependent => :delete_all
86 belongs_to :auth_source
86 belongs_to :auth_source
87
87
88 scope :logged, lambda { where("#{User.table_name}.status <> #{STATUS_ANONYMOUS}") }
88 scope :logged, lambda { where("#{User.table_name}.status <> #{STATUS_ANONYMOUS}") }
89 scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) }
89 scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) }
90
90
91 acts_as_customizable
91 acts_as_customizable
92
92
93 attr_accessor :password, :password_confirmation, :generate_password
93 attr_accessor :password, :password_confirmation, :generate_password
94 attr_accessor :last_before_login_on
94 attr_accessor :last_before_login_on
95 # Prevents unauthorized assignments
95 # Prevents unauthorized assignments
96 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
96 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
97
97
98 LOGIN_LENGTH_LIMIT = 60
98 LOGIN_LENGTH_LIMIT = 60
99 MAIL_LENGTH_LIMIT = 60
99 MAIL_LENGTH_LIMIT = 60
100
100
101 validates_presence_of :login, :firstname, :lastname, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
101 validates_presence_of :login, :firstname, :lastname, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
102 validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, :case_sensitive => false
102 validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, :case_sensitive => false
103 # Login must contain letters, numbers, underscores only
103 # Login must contain letters, numbers, underscores only
104 validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i
104 validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i
105 validates_length_of :login, :maximum => LOGIN_LENGTH_LIMIT
105 validates_length_of :login, :maximum => LOGIN_LENGTH_LIMIT
106 validates_length_of :firstname, :lastname, :maximum => 30
106 validates_length_of :firstname, :lastname, :maximum => 30
107 validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true
107 validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true
108 validate :validate_password_length
108 validate :validate_password_length
109 validate do
109 validate do
110 if password_confirmation && password != password_confirmation
110 if password_confirmation && password != password_confirmation
111 errors.add(:password, :confirmation)
111 errors.add(:password, :confirmation)
112 end
112 end
113 end
113 end
114
114
115 before_validation :instantiate_email_address
115 before_validation :instantiate_email_address
116 before_create :set_mail_notification
116 before_create :set_mail_notification
117 before_save :generate_password_if_needed, :update_hashed_password
117 before_save :generate_password_if_needed, :update_hashed_password
118 before_destroy :remove_references_before_destroy
118 before_destroy :remove_references_before_destroy
119 after_save :update_notified_project_ids, :destroy_tokens
119 after_save :update_notified_project_ids, :destroy_tokens
120
120
121 scope :in_group, lambda {|group|
121 scope :in_group, lambda {|group|
122 group_id = group.is_a?(Group) ? group.id : group.to_i
122 group_id = group.is_a?(Group) ? group.id : group.to_i
123 where("#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
123 where("#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
124 }
124 }
125 scope :not_in_group, lambda {|group|
125 scope :not_in_group, lambda {|group|
126 group_id = group.is_a?(Group) ? group.id : group.to_i
126 group_id = group.is_a?(Group) ? group.id : group.to_i
127 where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
127 where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
128 }
128 }
129 scope :sorted, lambda { order(*User.fields_for_order_statement)}
129 scope :sorted, lambda { order(*User.fields_for_order_statement)}
130 scope :having_mail, lambda {|arg|
130 scope :having_mail, lambda {|arg|
131 addresses = Array.wrap(arg).map {|a| a.to_s.downcase}
131 addresses = Array.wrap(arg).map {|a| a.to_s.downcase}
132 if addresses.any?
132 if addresses.any?
133 joins(:email_addresses).where("LOWER(address) IN (?)", addresses).uniq
133 joins(:email_addresses).where("LOWER(address) IN (?)", addresses).uniq
134 else
134 else
135 none
135 none
136 end
136 end
137 }
137 }
138
138
139 def set_mail_notification
139 def set_mail_notification
140 self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
140 self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
141 true
141 true
142 end
142 end
143
143
144 def update_hashed_password
144 def update_hashed_password
145 # update hashed_password if password was set
145 # update hashed_password if password was set
146 if self.password && self.auth_source_id.blank?
146 if self.password && self.auth_source_id.blank?
147 salt_password(password)
147 salt_password(password)
148 end
148 end
149 end
149 end
150
150
151 alias :base_reload :reload
151 alias :base_reload :reload
152 def reload(*args)
152 def reload(*args)
153 @name = nil
153 @name = nil
154 @projects_by_role = nil
154 @projects_by_role = nil
155 @membership_by_project_id = nil
155 @membership_by_project_id = nil
156 @notified_projects_ids = nil
156 @notified_projects_ids = nil
157 @notified_projects_ids_changed = false
157 @notified_projects_ids_changed = false
158 @builtin_role = nil
158 @builtin_role = nil
159 @visible_project_ids = nil
159 @visible_project_ids = nil
160 base_reload(*args)
160 base_reload(*args)
161 end
161 end
162
162
163 def mail
163 def mail
164 email_address.try(:address)
164 email_address.try(:address)
165 end
165 end
166
166
167 def mail=(arg)
167 def mail=(arg)
168 email = email_address || build_email_address
168 email = email_address || build_email_address
169 email.address = arg
169 email.address = arg
170 end
170 end
171
171
172 def mail_changed?
172 def mail_changed?
173 email_address.try(:address_changed?)
173 email_address.try(:address_changed?)
174 end
174 end
175
175
176 def mails
176 def mails
177 email_addresses.pluck(:address)
177 email_addresses.pluck(:address)
178 end
178 end
179
179
180 def self.find_or_initialize_by_identity_url(url)
180 def self.find_or_initialize_by_identity_url(url)
181 user = where(:identity_url => url).first
181 user = where(:identity_url => url).first
182 unless user
182 unless user
183 user = User.new
183 user = User.new
184 user.identity_url = url
184 user.identity_url = url
185 end
185 end
186 user
186 user
187 end
187 end
188
188
189 def identity_url=(url)
189 def identity_url=(url)
190 if url.blank?
190 if url.blank?
191 write_attribute(:identity_url, '')
191 write_attribute(:identity_url, '')
192 else
192 else
193 begin
193 begin
194 write_attribute(:identity_url, OpenIdAuthentication.normalize_identifier(url))
194 write_attribute(:identity_url, OpenIdAuthentication.normalize_identifier(url))
195 rescue OpenIdAuthentication::InvalidOpenId
195 rescue OpenIdAuthentication::InvalidOpenId
196 # Invalid url, don't save
196 # Invalid url, don't save
197 end
197 end
198 end
198 end
199 self.read_attribute(:identity_url)
199 self.read_attribute(:identity_url)
200 end
200 end
201
201
202 # Returns the user that matches provided login and password, or nil
202 # Returns the user that matches provided login and password, or nil
203 def self.try_to_login(login, password, active_only=true)
203 def self.try_to_login(login, password, active_only=true)
204 login = login.to_s
204 login = login.to_s
205 password = password.to_s
205 password = password.to_s
206
206
207 # Make sure no one can sign in with an empty login or password
207 # Make sure no one can sign in with an empty login or password
208 return nil if login.empty? || password.empty?
208 return nil if login.empty? || password.empty?
209 user = find_by_login(login)
209 user = find_by_login(login)
210 if user
210 if user
211 # user is already in local database
211 # user is already in local database
212 return nil unless user.check_password?(password)
212 return nil unless user.check_password?(password)
213 return nil if !user.active? && active_only
213 return nil if !user.active? && active_only
214 else
214 else
215 # user is not yet registered, try to authenticate with available sources
215 # user is not yet registered, try to authenticate with available sources
216 attrs = AuthSource.authenticate(login, password)
216 attrs = AuthSource.authenticate(login, password)
217 if attrs
217 if attrs
218 user = new(attrs)
218 user = new(attrs)
219 user.login = login
219 user.login = login
220 user.language = Setting.default_language
220 user.language = Setting.default_language
221 if user.save
221 if user.save
222 user.reload
222 user.reload
223 logger.info("User '#{user.login}' created from external auth source: #{user.auth_source.type} - #{user.auth_source.name}") if logger && user.auth_source
223 logger.info("User '#{user.login}' created from external auth source: #{user.auth_source.type} - #{user.auth_source.name}") if logger && user.auth_source
224 end
224 end
225 end
225 end
226 end
226 end
227 user.update_column(:last_login_on, Time.now) if user && !user.new_record? && user.active?
227 user.update_column(:last_login_on, Time.now) if user && !user.new_record? && user.active?
228 user
228 user
229 rescue => text
229 rescue => text
230 raise text
230 raise text
231 end
231 end
232
232
233 # Returns the user who matches the given autologin +key+ or nil
233 # Returns the user who matches the given autologin +key+ or nil
234 def self.try_to_autologin(key)
234 def self.try_to_autologin(key)
235 user = Token.find_active_user('autologin', key, Setting.autologin.to_i)
235 user = Token.find_active_user('autologin', key, Setting.autologin.to_i)
236 if user
236 if user
237 user.update_column(:last_login_on, Time.now)
237 user.update_column(:last_login_on, Time.now)
238 user
238 user
239 end
239 end
240 end
240 end
241
241
242 def self.name_formatter(formatter = nil)
242 def self.name_formatter(formatter = nil)
243 USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname]
243 USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname]
244 end
244 end
245
245
246 # Returns an array of fields names than can be used to make an order statement for users
246 # Returns an array of fields names than can be used to make an order statement for users
247 # according to how user names are displayed
247 # according to how user names are displayed
248 # Examples:
248 # Examples:
249 #
249 #
250 # User.fields_for_order_statement => ['users.login', 'users.id']
250 # User.fields_for_order_statement => ['users.login', 'users.id']
251 # User.fields_for_order_statement('authors') => ['authors.login', 'authors.id']
251 # User.fields_for_order_statement('authors') => ['authors.login', 'authors.id']
252 def self.fields_for_order_statement(table=nil)
252 def self.fields_for_order_statement(table=nil)
253 table ||= table_name
253 table ||= table_name
254 name_formatter[:order].map {|field| "#{table}.#{field}"}
254 name_formatter[:order].map {|field| "#{table}.#{field}"}
255 end
255 end
256
256
257 # Return user's full name for display
257 # Return user's full name for display
258 def name(formatter = nil)
258 def name(formatter = nil)
259 f = self.class.name_formatter(formatter)
259 f = self.class.name_formatter(formatter)
260 if formatter
260 if formatter
261 eval('"' + f[:string] + '"')
261 eval('"' + f[:string] + '"')
262 else
262 else
263 @name ||= eval('"' + f[:string] + '"')
263 @name ||= eval('"' + f[:string] + '"')
264 end
264 end
265 end
265 end
266
266
267 def active?
267 def active?
268 self.status == STATUS_ACTIVE
268 self.status == STATUS_ACTIVE
269 end
269 end
270
270
271 def registered?
271 def registered?
272 self.status == STATUS_REGISTERED
272 self.status == STATUS_REGISTERED
273 end
273 end
274
274
275 def locked?
275 def locked?
276 self.status == STATUS_LOCKED
276 self.status == STATUS_LOCKED
277 end
277 end
278
278
279 def activate
279 def activate
280 self.status = STATUS_ACTIVE
280 self.status = STATUS_ACTIVE
281 end
281 end
282
282
283 def register
283 def register
284 self.status = STATUS_REGISTERED
284 self.status = STATUS_REGISTERED
285 end
285 end
286
286
287 def lock
287 def lock
288 self.status = STATUS_LOCKED
288 self.status = STATUS_LOCKED
289 end
289 end
290
290
291 def activate!
291 def activate!
292 update_attribute(:status, STATUS_ACTIVE)
292 update_attribute(:status, STATUS_ACTIVE)
293 end
293 end
294
294
295 def register!
295 def register!
296 update_attribute(:status, STATUS_REGISTERED)
296 update_attribute(:status, STATUS_REGISTERED)
297 end
297 end
298
298
299 def lock!
299 def lock!
300 update_attribute(:status, STATUS_LOCKED)
300 update_attribute(:status, STATUS_LOCKED)
301 end
301 end
302
302
303 # Returns true if +clear_password+ is the correct user's password, otherwise false
303 # Returns true if +clear_password+ is the correct user's password, otherwise false
304 def check_password?(clear_password)
304 def check_password?(clear_password)
305 if auth_source_id.present?
305 if auth_source_id.present?
306 auth_source.authenticate(self.login, clear_password)
306 auth_source.authenticate(self.login, clear_password)
307 else
307 else
308 User.hash_password("#{salt}#{User.hash_password clear_password}") == hashed_password
308 User.hash_password("#{salt}#{User.hash_password clear_password}") == hashed_password
309 end
309 end
310 end
310 end
311
311
312 # Generates a random salt and computes hashed_password for +clear_password+
312 # Generates a random salt and computes hashed_password for +clear_password+
313 # The hashed password is stored in the following form: SHA1(salt + SHA1(password))
313 # The hashed password is stored in the following form: SHA1(salt + SHA1(password))
314 def salt_password(clear_password)
314 def salt_password(clear_password)
315 self.salt = User.generate_salt
315 self.salt = User.generate_salt
316 self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}")
316 self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}")
317 self.passwd_changed_on = Time.now.change(:usec => 0)
317 self.passwd_changed_on = Time.now.change(:usec => 0)
318 end
318 end
319
319
320 # Does the backend storage allow this user to change their password?
320 # Does the backend storage allow this user to change their password?
321 def change_password_allowed?
321 def change_password_allowed?
322 return true if auth_source.nil?
322 return true if auth_source.nil?
323 return auth_source.allow_password_changes?
323 return auth_source.allow_password_changes?
324 end
324 end
325
325
326 # Returns true if the user password has expired
326 # Returns true if the user password has expired
327 def password_expired?
327 def password_expired?
328 period = Setting.password_max_age.to_i
328 period = Setting.password_max_age.to_i
329 if period.zero?
329 if period.zero?
330 false
330 false
331 else
331 else
332 changed_on = self.passwd_changed_on || Time.at(0)
332 changed_on = self.passwd_changed_on || Time.at(0)
333 changed_on < period.days.ago
333 changed_on < period.days.ago
334 end
334 end
335 end
335 end
336
336
337 def must_change_password?
337 def must_change_password?
338 (must_change_passwd? || password_expired?) && change_password_allowed?
338 (must_change_passwd? || password_expired?) && change_password_allowed?
339 end
339 end
340
340
341 def generate_password?
341 def generate_password?
342 generate_password == '1' || generate_password == true
342 generate_password == '1' || generate_password == true
343 end
343 end
344
344
345 # Generate and set a random password on given length
345 # Generate and set a random password on given length
346 def random_password(length=40)
346 def random_password(length=40)
347 chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
347 chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
348 chars -= %w(0 O 1 l)
348 chars -= %w(0 O 1 l)
349 password = ''
349 password = ''
350 length.times {|i| password << chars[SecureRandom.random_number(chars.size)] }
350 length.times {|i| password << chars[SecureRandom.random_number(chars.size)] }
351 self.password = password
351 self.password = password
352 self.password_confirmation = password
352 self.password_confirmation = password
353 self
353 self
354 end
354 end
355
355
356 def pref
356 def pref
357 self.preference ||= UserPreference.new(:user => self)
357 self.preference ||= UserPreference.new(:user => self)
358 end
358 end
359
359
360 def time_zone
360 def time_zone
361 @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
361 @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
362 end
362 end
363
363
364 def force_default_language?
364 def force_default_language?
365 Setting.force_default_language_for_loggedin?
365 Setting.force_default_language_for_loggedin?
366 end
366 end
367
367
368 def language
368 def language
369 if force_default_language?
369 if force_default_language?
370 Setting.default_language
370 Setting.default_language
371 else
371 else
372 super
372 super
373 end
373 end
374 end
374 end
375
375
376 def wants_comments_in_reverse_order?
376 def wants_comments_in_reverse_order?
377 self.pref[:comments_sorting] == 'desc'
377 self.pref[:comments_sorting] == 'desc'
378 end
378 end
379
379
380 # Return user's RSS key (a 40 chars long string), used to access feeds
380 # Return user's RSS key (a 40 chars long string), used to access feeds
381 def rss_key
381 def rss_key
382 if rss_token.nil?
382 if rss_token.nil?
383 create_rss_token(:action => 'feeds')
383 create_rss_token(:action => 'feeds')
384 end
384 end
385 rss_token.value
385 rss_token.value
386 end
386 end
387
387
388 # Return user's API key (a 40 chars long string), used to access the API
388 # Return user's API key (a 40 chars long string), used to access the API
389 def api_key
389 def api_key
390 if api_token.nil?
390 if api_token.nil?
391 create_api_token(:action => 'api')
391 create_api_token(:action => 'api')
392 end
392 end
393 api_token.value
393 api_token.value
394 end
394 end
395
395
396 # Return an array of project ids for which the user has explicitly turned mail notifications on
396 # Return an array of project ids for which the user has explicitly turned mail notifications on
397 def notified_projects_ids
397 def notified_projects_ids
398 @notified_projects_ids ||= memberships.select {|m| m.mail_notification?}.collect(&:project_id)
398 @notified_projects_ids ||= memberships.select {|m| m.mail_notification?}.collect(&:project_id)
399 end
399 end
400
400
401 def notified_project_ids=(ids)
401 def notified_project_ids=(ids)
402 @notified_projects_ids_changed = true
402 @notified_projects_ids_changed = true
403 @notified_projects_ids = ids.map(&:to_i).uniq.select {|n| n > 0}
403 @notified_projects_ids = ids.map(&:to_i).uniq.select {|n| n > 0}
404 end
404 end
405
405
406 # Updates per project notifications (after_save callback)
406 # Updates per project notifications (after_save callback)
407 def update_notified_project_ids
407 def update_notified_project_ids
408 if @notified_projects_ids_changed
408 if @notified_projects_ids_changed
409 ids = (mail_notification == 'selected' ? Array.wrap(notified_projects_ids).reject(&:blank?) : [])
409 ids = (mail_notification == 'selected' ? Array.wrap(notified_projects_ids).reject(&:blank?) : [])
410 members.update_all(:mail_notification => false)
410 members.update_all(:mail_notification => false)
411 members.where(:project_id => ids).update_all(:mail_notification => true) if ids.any?
411 members.where(:project_id => ids).update_all(:mail_notification => true) if ids.any?
412 end
412 end
413 end
413 end
414 private :update_notified_project_ids
414 private :update_notified_project_ids
415
415
416 def valid_notification_options
416 def valid_notification_options
417 self.class.valid_notification_options(self)
417 self.class.valid_notification_options(self)
418 end
418 end
419
419
420 # Only users that belong to more than 1 project can select projects for which they are notified
420 # Only users that belong to more than 1 project can select projects for which they are notified
421 def self.valid_notification_options(user=nil)
421 def self.valid_notification_options(user=nil)
422 # Note that @user.membership.size would fail since AR ignores
422 # Note that @user.membership.size would fail since AR ignores
423 # :include association option when doing a count
423 # :include association option when doing a count
424 if user.nil? || user.memberships.length < 1
424 if user.nil? || user.memberships.length < 1
425 MAIL_NOTIFICATION_OPTIONS.reject {|option| option.first == 'selected'}
425 MAIL_NOTIFICATION_OPTIONS.reject {|option| option.first == 'selected'}
426 else
426 else
427 MAIL_NOTIFICATION_OPTIONS
427 MAIL_NOTIFICATION_OPTIONS
428 end
428 end
429 end
429 end
430
430
431 # Find a user account by matching the exact login and then a case-insensitive
431 # Find a user account by matching the exact login and then a case-insensitive
432 # version. Exact matches will be given priority.
432 # version. Exact matches will be given priority.
433 def self.find_by_login(login)
433 def self.find_by_login(login)
434 login = Redmine::CodesetUtil.replace_invalid_utf8(login.to_s)
434 login = Redmine::CodesetUtil.replace_invalid_utf8(login.to_s)
435 if login.present?
435 if login.present?
436 # First look for an exact match
436 # First look for an exact match
437 user = where(:login => login).detect {|u| u.login == login}
437 user = where(:login => login).detect {|u| u.login == login}
438 unless user
438 unless user
439 # Fail over to case-insensitive if none was found
439 # Fail over to case-insensitive if none was found
440 user = where("LOWER(login) = ?", login.downcase).first
440 user = where("LOWER(login) = ?", login.downcase).first
441 end
441 end
442 user
442 user
443 end
443 end
444 end
444 end
445
445
446 def self.find_by_rss_key(key)
446 def self.find_by_rss_key(key)
447 Token.find_active_user('feeds', key)
447 Token.find_active_user('feeds', key)
448 end
448 end
449
449
450 def self.find_by_api_key(key)
450 def self.find_by_api_key(key)
451 Token.find_active_user('api', key)
451 Token.find_active_user('api', key)
452 end
452 end
453
453
454 # Makes find_by_mail case-insensitive
454 # Makes find_by_mail case-insensitive
455 def self.find_by_mail(mail)
455 def self.find_by_mail(mail)
456 having_mail(mail).first
456 having_mail(mail).first
457 end
457 end
458
458
459 # Returns true if the default admin account can no longer be used
459 # Returns true if the default admin account can no longer be used
460 def self.default_admin_account_changed?
460 def self.default_admin_account_changed?
461 !User.active.find_by_login("admin").try(:check_password?, "admin")
461 !User.active.find_by_login("admin").try(:check_password?, "admin")
462 end
462 end
463
463
464 def to_s
464 def to_s
465 name
465 name
466 end
466 end
467
467
468 CSS_CLASS_BY_STATUS = {
468 CSS_CLASS_BY_STATUS = {
469 STATUS_ANONYMOUS => 'anon',
469 STATUS_ANONYMOUS => 'anon',
470 STATUS_ACTIVE => 'active',
470 STATUS_ACTIVE => 'active',
471 STATUS_REGISTERED => 'registered',
471 STATUS_REGISTERED => 'registered',
472 STATUS_LOCKED => 'locked'
472 STATUS_LOCKED => 'locked'
473 }
473 }
474
474
475 def css_classes
475 def css_classes
476 "user #{CSS_CLASS_BY_STATUS[status]}"
476 "user #{CSS_CLASS_BY_STATUS[status]}"
477 end
477 end
478
478
479 # Returns the current day according to user's time zone
479 # Returns the current day according to user's time zone
480 def today
480 def today
481 if time_zone.nil?
481 if time_zone.nil?
482 Date.today
482 Date.today
483 else
483 else
484 Time.now.in_time_zone(time_zone).to_date
484 Time.now.in_time_zone(time_zone).to_date
485 end
485 end
486 end
486 end
487
487
488 # Returns the day of +time+ according to user's time zone
488 # Returns the day of +time+ according to user's time zone
489 def time_to_date(time)
489 def time_to_date(time)
490 if time_zone.nil?
490 if time_zone.nil?
491 time.to_date
491 time.to_date
492 else
492 else
493 time.in_time_zone(time_zone).to_date
493 time.in_time_zone(time_zone).to_date
494 end
494 end
495 end
495 end
496
496
497 def logged?
497 def logged?
498 true
498 true
499 end
499 end
500
500
501 def anonymous?
501 def anonymous?
502 !logged?
502 !logged?
503 end
503 end
504
504
505 # Returns user's membership for the given project
505 # Returns user's membership for the given project
506 # or nil if the user is not a member of project
506 # or nil if the user is not a member of project
507 def membership(project)
507 def membership(project)
508 project_id = project.is_a?(Project) ? project.id : project
508 project_id = project.is_a?(Project) ? project.id : project
509
509
510 @membership_by_project_id ||= Hash.new {|h, project_id|
510 @membership_by_project_id ||= Hash.new {|h, project_id|
511 h[project_id] = memberships.where(:project_id => project_id).first
511 h[project_id] = memberships.where(:project_id => project_id).first
512 }
512 }
513 @membership_by_project_id[project_id]
513 @membership_by_project_id[project_id]
514 end
514 end
515
515
516 # Returns the user's bult-in role
516 # Returns the user's bult-in role
517 def builtin_role
517 def builtin_role
518 @builtin_role ||= Role.non_member
518 @builtin_role ||= Role.non_member
519 end
519 end
520
520
521 # Return user's roles for project
521 # Return user's roles for project
522 def roles_for_project(project)
522 def roles_for_project(project)
523 # No role on archived projects
523 # No role on archived projects
524 return [] if project.nil? || project.archived?
524 return [] if project.nil? || project.archived?
525 if membership = membership(project)
525 if membership = membership(project)
526 membership.roles.dup
526 membership.roles.dup
527 elsif project.is_public?
527 elsif project.is_public?
528 project.override_roles(builtin_role)
528 project.override_roles(builtin_role)
529 else
529 else
530 []
530 []
531 end
531 end
532 end
532 end
533
533
534 # Returns a hash of user's projects grouped by roles
534 # Returns a hash of user's projects grouped by roles
535 def projects_by_role
535 def projects_by_role
536 return @projects_by_role if @projects_by_role
536 return @projects_by_role if @projects_by_role
537
537
538 hash = Hash.new([])
538 hash = Hash.new([])
539
539
540 group_class = anonymous? ? GroupAnonymous : GroupNonMember
540 group_class = anonymous? ? GroupAnonymous : GroupNonMember
541 members = Member.joins(:project, :principal).
541 members = Member.joins(:project, :principal).
542 where("#{Project.table_name}.status <> 9").
542 where("#{Project.table_name}.status <> 9").
543 where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Principal.table_name}.type = ?)", self.id, true, group_class.name).
543 where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Principal.table_name}.type = ?)", self.id, true, group_class.name).
544 preload(:project, :roles).
544 preload(:project, :roles).
545 to_a
545 to_a
546
546
547 members.reject! {|member| member.user_id != id && project_ids.include?(member.project_id)}
547 members.reject! {|member| member.user_id != id && project_ids.include?(member.project_id)}
548 members.each do |member|
548 members.each do |member|
549 if member.project
549 if member.project
550 member.roles.each do |role|
550 member.roles.each do |role|
551 hash[role] = [] unless hash.key?(role)
551 hash[role] = [] unless hash.key?(role)
552 hash[role] << member.project
552 hash[role] << member.project
553 end
553 end
554 end
554 end
555 end
555 end
556
556
557 hash.each do |role, projects|
557 hash.each do |role, projects|
558 projects.uniq!
558 projects.uniq!
559 end
559 end
560
560
561 @projects_by_role = hash
561 @projects_by_role = hash
562 end
562 end
563
563
564 # Returns the ids of visible projects
564 # Returns the ids of visible projects
565 def visible_project_ids
565 def visible_project_ids
566 @visible_project_ids ||= Project.visible(self).pluck(:id)
566 @visible_project_ids ||= Project.visible(self).pluck(:id)
567 end
567 end
568
568
569 # Returns true if user is arg or belongs to arg
569 # Returns true if user is arg or belongs to arg
570 def is_or_belongs_to?(arg)
570 def is_or_belongs_to?(arg)
571 if arg.is_a?(User)
571 if arg.is_a?(User)
572 self == arg
572 self == arg
573 elsif arg.is_a?(Group)
573 elsif arg.is_a?(Group)
574 arg.users.include?(self)
574 arg.users.include?(self)
575 else
575 else
576 false
576 false
577 end
577 end
578 end
578 end
579
579
580 # Return true if the user is allowed to do the specified action on a specific context
580 # Return true if the user is allowed to do the specified action on a specific context
581 # Action can be:
581 # Action can be:
582 # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
582 # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
583 # * a permission Symbol (eg. :edit_project)
583 # * a permission Symbol (eg. :edit_project)
584 # Context can be:
584 # Context can be:
585 # * a project : returns true if user is allowed to do the specified action on this project
585 # * a project : returns true if user is allowed to do the specified action on this project
586 # * an array of projects : returns true if user is allowed on every project
586 # * an array of projects : returns true if user is allowed on every project
587 # * nil with options[:global] set : check if user has at least one role allowed for this action,
587 # * nil with options[:global] set : check if user has at least one role allowed for this action,
588 # or falls back to Non Member / Anonymous permissions depending if the user is logged
588 # or falls back to Non Member / Anonymous permissions depending if the user is logged
589 def allowed_to?(action, context, options={}, &block)
589 def allowed_to?(action, context, options={}, &block)
590 if context && context.is_a?(Project)
590 if context && context.is_a?(Project)
591 return false unless context.allows_to?(action)
591 return false unless context.allows_to?(action)
592 # Admin users are authorized for anything else
592 # Admin users are authorized for anything else
593 return true if admin?
593 return true if admin?
594
594
595 roles = roles_for_project(context)
595 roles = roles_for_project(context)
596 return false unless roles
596 return false unless roles
597 roles.any? {|role|
597 roles.any? {|role|
598 (context.is_public? || role.member?) &&
598 (context.is_public? || role.member?) &&
599 role.allowed_to?(action) &&
599 role.allowed_to?(action) &&
600 (block_given? ? yield(role, self) : true)
600 (block_given? ? yield(role, self) : true)
601 }
601 }
602 elsif context && context.is_a?(Array)
602 elsif context && context.is_a?(Array)
603 if context.empty?
603 if context.empty?
604 false
604 false
605 else
605 else
606 # Authorize if user is authorized on every element of the array
606 # Authorize if user is authorized on every element of the array
607 context.map {|project| allowed_to?(action, project, options, &block)}.reduce(:&)
607 context.map {|project| allowed_to?(action, project, options, &block)}.reduce(:&)
608 end
608 end
609 elsif context
609 elsif context
610 raise ArgumentError.new("#allowed_to? context argument must be a Project, an Array of projects or nil")
610 raise ArgumentError.new("#allowed_to? context argument must be a Project, an Array of projects or nil")
611 elsif options[:global]
611 elsif options[:global]
612 # Admin users are always authorized
612 # Admin users are always authorized
613 return true if admin?
613 return true if admin?
614
614
615 # authorize if user has at least one role that has this permission
615 # authorize if user has at least one role that has this permission
616 roles = memberships.collect {|m| m.roles}.flatten.uniq
616 roles = memberships.collect {|m| m.roles}.flatten.uniq
617 roles << (self.logged? ? Role.non_member : Role.anonymous)
617 roles << (self.logged? ? Role.non_member : Role.anonymous)
618 roles.any? {|role|
618 roles.any? {|role|
619 role.allowed_to?(action) &&
619 role.allowed_to?(action) &&
620 (block_given? ? yield(role, self) : true)
620 (block_given? ? yield(role, self) : true)
621 }
621 }
622 else
622 else
623 false
623 false
624 end
624 end
625 end
625 end
626
626
627 # Is the user allowed to do the specified action on any project?
627 # Is the user allowed to do the specified action on any project?
628 # See allowed_to? for the actions and valid options.
628 # See allowed_to? for the actions and valid options.
629 #
629 #
630 # NB: this method is not used anywhere in the core codebase as of
630 # NB: this method is not used anywhere in the core codebase as of
631 # 2.5.2, but it's used by many plugins so if we ever want to remove
631 # 2.5.2, but it's used by many plugins so if we ever want to remove
632 # it it has to be carefully deprecated for a version or two.
632 # it it has to be carefully deprecated for a version or two.
633 def allowed_to_globally?(action, options={}, &block)
633 def allowed_to_globally?(action, options={}, &block)
634 allowed_to?(action, nil, options.reverse_merge(:global => true), &block)
634 allowed_to?(action, nil, options.reverse_merge(:global => true), &block)
635 end
635 end
636
636
637 def allowed_to_view_all_time_entries?(context)
638 allowed_to?(:view_time_entries, context) do |role, user|
639 role.time_entries_visibility == 'all'
640 end
641 end
642
637 # Returns true if the user is allowed to delete the user's own account
643 # Returns true if the user is allowed to delete the user's own account
638 def own_account_deletable?
644 def own_account_deletable?
639 Setting.unsubscribe? &&
645 Setting.unsubscribe? &&
640 (!admin? || User.active.where("admin = ? AND id <> ?", true, id).exists?)
646 (!admin? || User.active.where("admin = ? AND id <> ?", true, id).exists?)
641 end
647 end
642
648
643 safe_attributes 'login',
649 safe_attributes 'login',
644 'firstname',
650 'firstname',
645 'lastname',
651 'lastname',
646 'mail',
652 'mail',
647 'mail_notification',
653 'mail_notification',
648 'notified_project_ids',
654 'notified_project_ids',
649 'language',
655 'language',
650 'custom_field_values',
656 'custom_field_values',
651 'custom_fields',
657 'custom_fields',
652 'identity_url'
658 'identity_url'
653
659
654 safe_attributes 'status',
660 safe_attributes 'status',
655 'auth_source_id',
661 'auth_source_id',
656 'generate_password',
662 'generate_password',
657 'must_change_passwd',
663 'must_change_passwd',
658 :if => lambda {|user, current_user| current_user.admin?}
664 :if => lambda {|user, current_user| current_user.admin?}
659
665
660 safe_attributes 'group_ids',
666 safe_attributes 'group_ids',
661 :if => lambda {|user, current_user| current_user.admin? && !user.new_record?}
667 :if => lambda {|user, current_user| current_user.admin? && !user.new_record?}
662
668
663 # Utility method to help check if a user should be notified about an
669 # Utility method to help check if a user should be notified about an
664 # event.
670 # event.
665 #
671 #
666 # TODO: only supports Issue events currently
672 # TODO: only supports Issue events currently
667 def notify_about?(object)
673 def notify_about?(object)
668 if mail_notification == 'all'
674 if mail_notification == 'all'
669 true
675 true
670 elsif mail_notification.blank? || mail_notification == 'none'
676 elsif mail_notification.blank? || mail_notification == 'none'
671 false
677 false
672 else
678 else
673 case object
679 case object
674 when Issue
680 when Issue
675 case mail_notification
681 case mail_notification
676 when 'selected', 'only_my_events'
682 when 'selected', 'only_my_events'
677 # user receives notifications for created/assigned issues on unselected projects
683 # user receives notifications for created/assigned issues on unselected projects
678 object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was)
684 object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was)
679 when 'only_assigned'
685 when 'only_assigned'
680 is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was)
686 is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was)
681 when 'only_owner'
687 when 'only_owner'
682 object.author == self
688 object.author == self
683 end
689 end
684 when News
690 when News
685 # always send to project members except when mail_notification is set to 'none'
691 # always send to project members except when mail_notification is set to 'none'
686 true
692 true
687 end
693 end
688 end
694 end
689 end
695 end
690
696
691 def self.current=(user)
697 def self.current=(user)
692 RequestStore.store[:current_user] = user
698 RequestStore.store[:current_user] = user
693 end
699 end
694
700
695 def self.current
701 def self.current
696 RequestStore.store[:current_user] ||= User.anonymous
702 RequestStore.store[:current_user] ||= User.anonymous
697 end
703 end
698
704
699 # Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only
705 # Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only
700 # one anonymous user per database.
706 # one anonymous user per database.
701 def self.anonymous
707 def self.anonymous
702 anonymous_user = AnonymousUser.first
708 anonymous_user = AnonymousUser.first
703 if anonymous_user.nil?
709 if anonymous_user.nil?
704 anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :login => '', :status => 0)
710 anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :login => '', :status => 0)
705 raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
711 raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
706 end
712 end
707 anonymous_user
713 anonymous_user
708 end
714 end
709
715
710 # Salts all existing unsalted passwords
716 # Salts all existing unsalted passwords
711 # It changes password storage scheme from SHA1(password) to SHA1(salt + SHA1(password))
717 # It changes password storage scheme from SHA1(password) to SHA1(salt + SHA1(password))
712 # This method is used in the SaltPasswords migration and is to be kept as is
718 # This method is used in the SaltPasswords migration and is to be kept as is
713 def self.salt_unsalted_passwords!
719 def self.salt_unsalted_passwords!
714 transaction do
720 transaction do
715 User.where("salt IS NULL OR salt = ''").find_each do |user|
721 User.where("salt IS NULL OR salt = ''").find_each do |user|
716 next if user.hashed_password.blank?
722 next if user.hashed_password.blank?
717 salt = User.generate_salt
723 salt = User.generate_salt
718 hashed_password = User.hash_password("#{salt}#{user.hashed_password}")
724 hashed_password = User.hash_password("#{salt}#{user.hashed_password}")
719 User.where(:id => user.id).update_all(:salt => salt, :hashed_password => hashed_password)
725 User.where(:id => user.id).update_all(:salt => salt, :hashed_password => hashed_password)
720 end
726 end
721 end
727 end
722 end
728 end
723
729
724 protected
730 protected
725
731
726 def validate_password_length
732 def validate_password_length
727 return if password.blank? && generate_password?
733 return if password.blank? && generate_password?
728 # Password length validation based on setting
734 # Password length validation based on setting
729 if !password.nil? && password.size < Setting.password_min_length.to_i
735 if !password.nil? && password.size < Setting.password_min_length.to_i
730 errors.add(:password, :too_short, :count => Setting.password_min_length.to_i)
736 errors.add(:password, :too_short, :count => Setting.password_min_length.to_i)
731 end
737 end
732 end
738 end
733
739
734 def instantiate_email_address
740 def instantiate_email_address
735 email_address || build_email_address
741 email_address || build_email_address
736 end
742 end
737
743
738 private
744 private
739
745
740 def generate_password_if_needed
746 def generate_password_if_needed
741 if generate_password? && auth_source.nil?
747 if generate_password? && auth_source.nil?
742 length = [Setting.password_min_length.to_i + 2, 10].max
748 length = [Setting.password_min_length.to_i + 2, 10].max
743 random_password(length)
749 random_password(length)
744 end
750 end
745 end
751 end
746
752
747 # Delete all outstanding password reset tokens on password change.
753 # Delete all outstanding password reset tokens on password change.
748 # Delete the autologin tokens on password change to prohibit session leakage.
754 # Delete the autologin tokens on password change to prohibit session leakage.
749 # This helps to keep the account secure in case the associated email account
755 # This helps to keep the account secure in case the associated email account
750 # was compromised.
756 # was compromised.
751 def destroy_tokens
757 def destroy_tokens
752 if hashed_password_changed?
758 if hashed_password_changed?
753 tokens = ['recovery', 'autologin']
759 tokens = ['recovery', 'autologin']
754 Token.where(:user_id => id, :action => tokens).delete_all
760 Token.where(:user_id => id, :action => tokens).delete_all
755 end
761 end
756 end
762 end
757
763
758 # Removes references that are not handled by associations
764 # Removes references that are not handled by associations
759 # Things that are not deleted are reassociated with the anonymous user
765 # Things that are not deleted are reassociated with the anonymous user
760 def remove_references_before_destroy
766 def remove_references_before_destroy
761 return if self.id.nil?
767 return if self.id.nil?
762
768
763 substitute = User.anonymous
769 substitute = User.anonymous
764 Attachment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
770 Attachment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
765 Comment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
771 Comment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
766 Issue.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
772 Issue.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
767 Issue.where(['assigned_to_id = ?', id]).update_all('assigned_to_id = NULL')
773 Issue.where(['assigned_to_id = ?', id]).update_all('assigned_to_id = NULL')
768 Journal.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
774 Journal.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
769 JournalDetail.
775 JournalDetail.
770 where(["property = 'attr' AND prop_key = 'assigned_to_id' AND old_value = ?", id.to_s]).
776 where(["property = 'attr' AND prop_key = 'assigned_to_id' AND old_value = ?", id.to_s]).
771 update_all(['old_value = ?', substitute.id.to_s])
777 update_all(['old_value = ?', substitute.id.to_s])
772 JournalDetail.
778 JournalDetail.
773 where(["property = 'attr' AND prop_key = 'assigned_to_id' AND value = ?", id.to_s]).
779 where(["property = 'attr' AND prop_key = 'assigned_to_id' AND value = ?", id.to_s]).
774 update_all(['value = ?', substitute.id.to_s])
780 update_all(['value = ?', substitute.id.to_s])
775 Message.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
781 Message.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
776 News.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
782 News.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
777 # Remove private queries and keep public ones
783 # Remove private queries and keep public ones
778 ::Query.delete_all ['user_id = ? AND visibility = ?', id, ::Query::VISIBILITY_PRIVATE]
784 ::Query.delete_all ['user_id = ? AND visibility = ?', id, ::Query::VISIBILITY_PRIVATE]
779 ::Query.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
785 ::Query.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
780 TimeEntry.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
786 TimeEntry.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id])
781 Token.delete_all ['user_id = ?', id]
787 Token.delete_all ['user_id = ?', id]
782 Watcher.delete_all ['user_id = ?', id]
788 Watcher.delete_all ['user_id = ?', id]
783 WikiContent.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
789 WikiContent.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
784 WikiContent::Version.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
790 WikiContent::Version.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id])
785 end
791 end
786
792
787 # Return password digest
793 # Return password digest
788 def self.hash_password(clear_password)
794 def self.hash_password(clear_password)
789 Digest::SHA1.hexdigest(clear_password || "")
795 Digest::SHA1.hexdigest(clear_password || "")
790 end
796 end
791
797
792 # Returns a 128bits random salt as a hex string (32 chars long)
798 # Returns a 128bits random salt as a hex string (32 chars long)
793 def self.generate_salt
799 def self.generate_salt
794 Redmine::Utils.random_hex(16)
800 Redmine::Utils.random_hex(16)
795 end
801 end
796
802
797 end
803 end
798
804
799 class AnonymousUser < User
805 class AnonymousUser < User
800 validate :validate_anonymous_uniqueness, :on => :create
806 validate :validate_anonymous_uniqueness, :on => :create
801
807
802 def validate_anonymous_uniqueness
808 def validate_anonymous_uniqueness
803 # There should be only one AnonymousUser in the database
809 # There should be only one AnonymousUser in the database
804 errors.add :base, 'An anonymous user already exists.' if AnonymousUser.exists?
810 errors.add :base, 'An anonymous user already exists.' if AnonymousUser.exists?
805 end
811 end
806
812
807 def available_custom_fields
813 def available_custom_fields
808 []
814 []
809 end
815 end
810
816
811 # Overrides a few properties
817 # Overrides a few properties
812 def logged?; false end
818 def logged?; false end
813 def admin; false end
819 def admin; false end
814 def name(*args); I18n.t(:label_user_anonymous) end
820 def name(*args); I18n.t(:label_user_anonymous) end
815 def mail=(*args); nil end
821 def mail=(*args); nil end
816 def mail; nil end
822 def mail; nil end
817 def time_zone; nil end
823 def time_zone; nil end
818 def rss_key; nil end
824 def rss_key; nil end
819
825
820 def pref
826 def pref
821 UserPreference.new(:user => self)
827 UserPreference.new(:user => self)
822 end
828 end
823
829
824 # Returns the user's bult-in role
830 # Returns the user's bult-in role
825 def builtin_role
831 def builtin_role
826 @builtin_role ||= Role.anonymous
832 @builtin_role ||= Role.anonymous
827 end
833 end
828
834
829 def membership(*args)
835 def membership(*args)
830 nil
836 nil
831 end
837 end
832
838
833 def member_of?(*args)
839 def member_of?(*args)
834 false
840 false
835 end
841 end
836
842
837 # Anonymous user can not be destroyed
843 # Anonymous user can not be destroyed
838 def destroy
844 def destroy
839 false
845 false
840 end
846 end
841
847
842 protected
848 protected
843
849
844 def instantiate_email_address
850 def instantiate_email_address
845 end
851 end
846 end
852 end
@@ -1,162 +1,162
1 <%= render :partial => 'action_menu' %>
1 <%= render :partial => 'action_menu' %>
2
2
3 <h2><%= issue_heading(@issue) %></h2>
3 <h2><%= issue_heading(@issue) %></h2>
4
4
5 <div class="<%= @issue.css_classes %> details">
5 <div class="<%= @issue.css_classes %> details">
6 <% if @prev_issue_id || @next_issue_id %>
6 <% if @prev_issue_id || @next_issue_id %>
7 <div class="next-prev-links contextual">
7 <div class="next-prev-links contextual">
8 <%= link_to_if @prev_issue_id,
8 <%= link_to_if @prev_issue_id,
9 "\xc2\xab #{l(:label_previous)}",
9 "\xc2\xab #{l(:label_previous)}",
10 (@prev_issue_id ? issue_path(@prev_issue_id) : nil),
10 (@prev_issue_id ? issue_path(@prev_issue_id) : nil),
11 :title => "##{@prev_issue_id}",
11 :title => "##{@prev_issue_id}",
12 :accesskey => accesskey(:previous) %> |
12 :accesskey => accesskey(:previous) %> |
13 <% if @issue_position && @issue_count %>
13 <% if @issue_position && @issue_count %>
14 <span class="position"><%= l(:label_item_position, :position => @issue_position, :count => @issue_count) %></span> |
14 <span class="position"><%= l(:label_item_position, :position => @issue_position, :count => @issue_count) %></span> |
15 <% end %>
15 <% end %>
16 <%= link_to_if @next_issue_id,
16 <%= link_to_if @next_issue_id,
17 "#{l(:label_next)} \xc2\xbb",
17 "#{l(:label_next)} \xc2\xbb",
18 (@next_issue_id ? issue_path(@next_issue_id) : nil),
18 (@next_issue_id ? issue_path(@next_issue_id) : nil),
19 :title => "##{@next_issue_id}",
19 :title => "##{@next_issue_id}",
20 :accesskey => accesskey(:next) %>
20 :accesskey => accesskey(:next) %>
21 </div>
21 </div>
22 <% end %>
22 <% end %>
23
23
24 <%= avatar(@issue.author, :size => "50") %>
24 <%= avatar(@issue.author, :size => "50") %>
25
25
26 <div class="subject">
26 <div class="subject">
27 <%= render_issue_subject_with_tree(@issue) %>
27 <%= render_issue_subject_with_tree(@issue) %>
28 </div>
28 </div>
29 <p class="author">
29 <p class="author">
30 <%= authoring @issue.created_on, @issue.author %>.
30 <%= authoring @issue.created_on, @issue.author %>.
31 <% if @issue.created_on != @issue.updated_on %>
31 <% if @issue.created_on != @issue.updated_on %>
32 <%= l(:label_updated_time, time_tag(@issue.updated_on)).html_safe %>.
32 <%= l(:label_updated_time, time_tag(@issue.updated_on)).html_safe %>.
33 <% end %>
33 <% end %>
34 </p>
34 </p>
35
35
36 <table class="attributes">
36 <table class="attributes">
37 <%= issue_fields_rows do |rows|
37 <%= issue_fields_rows do |rows|
38 rows.left l(:field_status), @issue.status.name, :class => 'status'
38 rows.left l(:field_status), @issue.status.name, :class => 'status'
39 rows.left l(:field_priority), @issue.priority.name, :class => 'priority'
39 rows.left l(:field_priority), @issue.priority.name, :class => 'priority'
40
40
41 unless @issue.disabled_core_fields.include?('assigned_to_id')
41 unless @issue.disabled_core_fields.include?('assigned_to_id')
42 rows.left l(:field_assigned_to), avatar(@issue.assigned_to, :size => "14").to_s.html_safe + (@issue.assigned_to ? link_to_user(@issue.assigned_to) : "-"), :class => 'assigned-to'
42 rows.left l(:field_assigned_to), avatar(@issue.assigned_to, :size => "14").to_s.html_safe + (@issue.assigned_to ? link_to_user(@issue.assigned_to) : "-"), :class => 'assigned-to'
43 end
43 end
44 unless @issue.disabled_core_fields.include?('category_id')
44 unless @issue.disabled_core_fields.include?('category_id')
45 rows.left l(:field_category), (@issue.category ? @issue.category.name : "-"), :class => 'category'
45 rows.left l(:field_category), (@issue.category ? @issue.category.name : "-"), :class => 'category'
46 end
46 end
47 unless @issue.disabled_core_fields.include?('fixed_version_id')
47 unless @issue.disabled_core_fields.include?('fixed_version_id')
48 rows.left l(:field_fixed_version), (@issue.fixed_version ? link_to_version(@issue.fixed_version) : "-"), :class => 'fixed-version'
48 rows.left l(:field_fixed_version), (@issue.fixed_version ? link_to_version(@issue.fixed_version) : "-"), :class => 'fixed-version'
49 end
49 end
50
50
51 unless @issue.disabled_core_fields.include?('start_date')
51 unless @issue.disabled_core_fields.include?('start_date')
52 rows.right l(:field_start_date), format_date(@issue.start_date), :class => 'start-date'
52 rows.right l(:field_start_date), format_date(@issue.start_date), :class => 'start-date'
53 end
53 end
54 unless @issue.disabled_core_fields.include?('due_date')
54 unless @issue.disabled_core_fields.include?('due_date')
55 rows.right l(:field_due_date), format_date(@issue.due_date), :class => 'due-date'
55 rows.right l(:field_due_date), format_date(@issue.due_date), :class => 'due-date'
56 end
56 end
57 unless @issue.disabled_core_fields.include?('done_ratio')
57 unless @issue.disabled_core_fields.include?('done_ratio')
58 rows.right l(:field_done_ratio), progress_bar(@issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%"), :class => 'progress'
58 rows.right l(:field_done_ratio), progress_bar(@issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%"), :class => 'progress'
59 end
59 end
60 unless @issue.disabled_core_fields.include?('estimated_hours')
60 unless @issue.disabled_core_fields.include?('estimated_hours')
61 unless @issue.total_estimated_hours.nil?
61 unless @issue.total_estimated_hours.nil?
62 rows.right l(:field_estimated_hours), issue_estimated_hours_details(@issue), :class => 'estimated-hours'
62 rows.right l(:field_estimated_hours), issue_estimated_hours_details(@issue), :class => 'estimated-hours'
63 end
63 end
64 end
64 end
65 if User.current.allowed_to?(:view_time_entries, @project)
65 if User.current.allowed_to_view_all_time_entries?(@project)
66 if @issue.total_spent_hours > 0
66 if @issue.total_spent_hours > 0
67 rows.right l(:label_spent_time), issue_spent_hours_details(@issue), :class => 'spent-time'
67 rows.right l(:label_spent_time), issue_spent_hours_details(@issue), :class => 'spent-time'
68 end
68 end
69 end
69 end
70 end %>
70 end %>
71 <%= render_custom_fields_rows(@issue) %>
71 <%= render_custom_fields_rows(@issue) %>
72 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
72 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
73 </table>
73 </table>
74
74
75 <% if @issue.description? || @issue.attachments.any? -%>
75 <% if @issue.description? || @issue.attachments.any? -%>
76 <hr />
76 <hr />
77 <% if @issue.description? %>
77 <% if @issue.description? %>
78 <div class="description">
78 <div class="description">
79 <div class="contextual">
79 <div class="contextual">
80 <%= link_to l(:button_quote), quoted_issue_path(@issue), :remote => true, :method => 'post', :class => 'icon icon-comment' if authorize_for('issues', 'edit') %>
80 <%= link_to l(:button_quote), quoted_issue_path(@issue), :remote => true, :method => 'post', :class => 'icon icon-comment' if authorize_for('issues', 'edit') %>
81 </div>
81 </div>
82
82
83 <p><strong><%=l(:field_description)%></strong></p>
83 <p><strong><%=l(:field_description)%></strong></p>
84 <div class="wiki">
84 <div class="wiki">
85 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
85 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
86 </div>
86 </div>
87 </div>
87 </div>
88 <% end %>
88 <% end %>
89 <%= link_to_attachments @issue, :thumbnails => true %>
89 <%= link_to_attachments @issue, :thumbnails => true %>
90 <% end -%>
90 <% end -%>
91
91
92 <%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
92 <%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
93
93
94 <% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %>
94 <% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %>
95 <hr />
95 <hr />
96 <div id="issue_tree">
96 <div id="issue_tree">
97 <div class="contextual">
97 <div class="contextual">
98 <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %>
98 <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %>
99 </div>
99 </div>
100 <p><strong><%=l(:label_subtask_plural)%></strong></p>
100 <p><strong><%=l(:label_subtask_plural)%></strong></p>
101 <%= render_descendants_tree(@issue) unless @issue.leaf? %>
101 <%= render_descendants_tree(@issue) unless @issue.leaf? %>
102 </div>
102 </div>
103 <% end %>
103 <% end %>
104
104
105 <% if @relations.present? || User.current.allowed_to?(:manage_issue_relations, @project) %>
105 <% if @relations.present? || User.current.allowed_to?(:manage_issue_relations, @project) %>
106 <hr />
106 <hr />
107 <div id="relations">
107 <div id="relations">
108 <%= render :partial => 'relations' %>
108 <%= render :partial => 'relations' %>
109 </div>
109 </div>
110 <% end %>
110 <% end %>
111
111
112 </div>
112 </div>
113
113
114 <% if @changesets.present? %>
114 <% if @changesets.present? %>
115 <div id="issue-changesets">
115 <div id="issue-changesets">
116 <h3><%=l(:label_associated_revisions)%></h3>
116 <h3><%=l(:label_associated_revisions)%></h3>
117 <%= render :partial => 'changesets', :locals => { :changesets => @changesets} %>
117 <%= render :partial => 'changesets', :locals => { :changesets => @changesets} %>
118 </div>
118 </div>
119 <% end %>
119 <% end %>
120
120
121 <% if @journals.present? %>
121 <% if @journals.present? %>
122 <div id="history">
122 <div id="history">
123 <h3><%=l(:label_history)%></h3>
123 <h3><%=l(:label_history)%></h3>
124 <%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %>
124 <%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %>
125 </div>
125 </div>
126 <% end %>
126 <% end %>
127
127
128
128
129 <div style="clear: both;"></div>
129 <div style="clear: both;"></div>
130 <%= render :partial => 'action_menu' %>
130 <%= render :partial => 'action_menu' %>
131
131
132 <div style="clear: both;"></div>
132 <div style="clear: both;"></div>
133 <% if @issue.editable? %>
133 <% if @issue.editable? %>
134 <div id="update" style="display:none;">
134 <div id="update" style="display:none;">
135 <h3><%= l(:button_edit) %></h3>
135 <h3><%= l(:button_edit) %></h3>
136 <%= render :partial => 'edit' %>
136 <%= render :partial => 'edit' %>
137 </div>
137 </div>
138 <% end %>
138 <% end %>
139
139
140 <% other_formats_links do |f| %>
140 <% other_formats_links do |f| %>
141 <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
141 <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
142 <%= f.link_to 'PDF' %>
142 <%= f.link_to 'PDF' %>
143 <% end %>
143 <% end %>
144
144
145 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
145 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
146
146
147 <% content_for :sidebar do %>
147 <% content_for :sidebar do %>
148 <%= render :partial => 'issues/sidebar' %>
148 <%= render :partial => 'issues/sidebar' %>
149
149
150 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
150 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
151 (@issue.watchers.present? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
151 (@issue.watchers.present? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
152 <div id="watchers">
152 <div id="watchers">
153 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
153 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
154 </div>
154 </div>
155 <% end %>
155 <% end %>
156 <% end %>
156 <% end %>
157
157
158 <% content_for :header_tags do %>
158 <% content_for :header_tags do %>
159 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
159 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
160 <% end %>
160 <% end %>
161
161
162 <%= context_menu issues_context_menu_path %>
162 <%= context_menu issues_context_menu_path %>
@@ -1,12 +1,14
1 <% if @total_hours.present? %>
1 <% if User.current.allowed_to?(:view_time_entries, @project) %>
2 <h3><%= l(:label_spent_time) %></h3>
2 <h3><%= l(:label_spent_time) %></h3>
3 <p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p>
3 <% if @total_hours.present? %>
4 <p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p>
5 <% end %>
4 <p>
6 <p>
5 <% if User.current.allowed_to?(:log_time, @project) %>
7 <% if User.current.allowed_to?(:log_time, @project) %>
6 <%= link_to l(:button_log_time), new_project_time_entry_path(@project) %> |
8 <%= link_to l(:button_log_time), new_project_time_entry_path(@project) %> |
7 <% end %>
9 <% end %>
8 <%= link_to(l(:label_details), project_time_entries_path(@project)) %> |
10 <%= link_to(l(:label_details), project_time_entries_path(@project)) %> |
9 <%= link_to(l(:label_report), report_project_time_entries_path(@project)) %>
11 <%= link_to(l(:label_report), report_project_time_entries_path(@project)) %>
10 </p>
12 </p>
11 <% end %>
13 <% end %>
12 <%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
14 <%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
@@ -1,36 +1,40
1 <%= error_messages_for 'role' %>
1 <%= error_messages_for 'role' %>
2
2
3 <div class="box tabular">
3 <div class="box tabular">
4 <% unless @role.builtin? %>
4 <% unless @role.builtin? %>
5 <p><%= f.text_field :name, :required => true %></p>
5 <p><%= f.text_field :name, :required => true %></p>
6 <p><%= f.check_box :assignable %></p>
6 <p><%= f.check_box :assignable %></p>
7 <% end %>
7 <% end %>
8
8
9 <% unless @role.anonymous? %>
9 <% unless @role.anonymous? %>
10 <p><%= f.select :issues_visibility, Role::ISSUES_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %></p>
10 <p><%= f.select :issues_visibility, Role::ISSUES_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %></p>
11 <% end %>
11 <% end %>
12
12
13 <% unless @role.anonymous? %>
14 <p><%= f.select :time_entries_visibility, Role::TIME_ENTRIES_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %></p>
15 <% end %>
16
13 <p><%= f.select :users_visibility, Role::USERS_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %></p>
17 <p><%= f.select :users_visibility, Role::USERS_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %></p>
14
18
15 <% if @role.new_record? && @roles.any? %>
19 <% if @role.new_record? && @roles.any? %>
16 <p><label for="copy_workflow_from"><%= l(:label_copy_workflow_from) %></label>
20 <p><label for="copy_workflow_from"><%= l(:label_copy_workflow_from) %></label>
17 <%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name, params[:copy_workflow_from] || @copy_from.try(:id))) %></p>
21 <%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name, params[:copy_workflow_from] || @copy_from.try(:id))) %></p>
18 <% end %>
22 <% end %>
19 </div>
23 </div>
20
24
21 <h3><%= l(:label_permissions) %></h3>
25 <h3><%= l(:label_permissions) %></h3>
22 <div class="box tabular" id="permissions">
26 <div class="box tabular" id="permissions">
23 <% perms_by_module = @role.setable_permissions.group_by {|p| p.project_module.to_s} %>
27 <% perms_by_module = @role.setable_permissions.group_by {|p| p.project_module.to_s} %>
24 <% perms_by_module.keys.sort.each do |mod| %>
28 <% perms_by_module.keys.sort.each do |mod| %>
25 <fieldset><legend><%= mod.blank? ? l(:label_project) : l_or_humanize(mod, :prefix => 'project_module_') %></legend>
29 <fieldset><legend><%= mod.blank? ? l(:label_project) : l_or_humanize(mod, :prefix => 'project_module_') %></legend>
26 <% perms_by_module[mod].each do |permission| %>
30 <% perms_by_module[mod].each do |permission| %>
27 <label class="floating">
31 <label class="floating">
28 <%= check_box_tag 'role[permissions][]', permission.name, (@role.permissions.include? permission.name), :id => nil %>
32 <%= check_box_tag 'role[permissions][]', permission.name, (@role.permissions.include? permission.name), :id => nil %>
29 <%= l_or_humanize(permission.name, :prefix => 'permission_') %>
33 <%= l_or_humanize(permission.name, :prefix => 'permission_') %>
30 </label>
34 </label>
31 <% end %>
35 <% end %>
32 </fieldset>
36 </fieldset>
33 <% end %>
37 <% end %>
34 <br /><%= check_all_links 'permissions' %>
38 <br /><%= check_all_links 'permissions' %>
35 <%= hidden_field_tag 'role[permissions][]', '' %>
39 <%= hidden_field_tag 'role[permissions][]', '' %>
36 </div>
40 </div>
@@ -1,55 +1,55
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to(l(:button_edit), edit_version_path(@version), :class => 'icon icon-edit') if User.current.allowed_to?(:manage_versions, @version.project) %>
2 <%= link_to(l(:button_edit), edit_version_path(@version), :class => 'icon icon-edit') if User.current.allowed_to?(:manage_versions, @version.project) %>
3 <%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :project_id => @version.project, :id => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %>
3 <%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :project_id => @version.project, :id => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %>
4 <%= delete_link version_path(@version, :back_url => url_for(:controller => 'versions', :action => 'index', :project_id => @version.project)) if User.current.allowed_to?(:manage_versions, @version.project) %>
4 <%= delete_link version_path(@version, :back_url => url_for(:controller => 'versions', :action => 'index', :project_id => @version.project)) if User.current.allowed_to?(:manage_versions, @version.project) %>
5 <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
5 <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
6 </div>
6 </div>
7
7
8 <h2><%= @version.name %></h2>
8 <h2><%= @version.name %></h2>
9
9
10 <div id="roadmap">
10 <div id="roadmap">
11 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
11 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
12 <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
12 <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
13
13
14 <div id="version-summary">
14 <div id="version-summary">
15 <% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
15 <% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
16 <fieldset class="time-tracking"><legend><%= l(:label_time_tracking) %></legend>
16 <fieldset class="time-tracking"><legend><%= l(:label_time_tracking) %></legend>
17 <table>
17 <table>
18 <tr>
18 <tr>
19 <th><%= l(:field_estimated_hours) %></th>
19 <th><%= l(:field_estimated_hours) %></th>
20 <td class="total-hours"><%= html_hours(l_hours(@version.estimated_hours)) %></td>
20 <td class="total-hours"><%= html_hours(l_hours(@version.estimated_hours)) %></td>
21 </tr>
21 </tr>
22 <% if User.current.allowed_to?(:view_time_entries, @project) %>
22 <% if User.current.allowed_to_view_all_time_entries?(@project) %>
23 <tr>
23 <tr>
24 <th><%= l(:label_spent_time) %></th>
24 <th><%= l(:label_spent_time) %></th>
25 <td class="total-hours"><%= html_hours(l_hours(@version.spent_hours)) %></td>
25 <td class="total-hours"><%= html_hours(l_hours(@version.spent_hours)) %></td>
26 </tr>
26 </tr>
27 <% end %>
27 <% end %>
28 </table>
28 </table>
29 </fieldset>
29 </fieldset>
30 <% end %>
30 <% end %>
31
31
32 <div id="status_by">
32 <div id="status_by">
33 <%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
33 <%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
34 </div>
34 </div>
35 </div>
35 </div>
36
36
37 <% if @issues.present? %>
37 <% if @issues.present? %>
38 <%= form_tag({}) do -%>
38 <%= form_tag({}) do -%>
39 <table class="list related-issues">
39 <table class="list related-issues">
40 <caption><%= l(:label_related_issues) %></caption>
40 <caption><%= l(:label_related_issues) %></caption>
41 <%- @issues.each do |issue| -%>
41 <%- @issues.each do |issue| -%>
42 <tr class="issue hascontextmenu">
42 <tr class="issue hascontextmenu">
43 <td class="checkbox"><%= check_box_tag 'ids[]', issue.id, false, :id => nil %></td>
43 <td class="checkbox"><%= check_box_tag 'ids[]', issue.id, false, :id => nil %></td>
44 <td class="subject"><%= link_to_issue(issue, :project => (@project != issue.project)) %></td>
44 <td class="subject"><%= link_to_issue(issue, :project => (@project != issue.project)) %></td>
45 </tr>
45 </tr>
46 <% end %>
46 <% end %>
47 </table>
47 </table>
48 <% end %>
48 <% end %>
49 <%= context_menu issues_context_menu_path %>
49 <%= context_menu issues_context_menu_path %>
50 <% end %>
50 <% end %>
51 </div>
51 </div>
52
52
53 <%= call_hook :view_versions_show_bottom, :version => @version %>
53 <%= call_hook :view_versions_show_bottom, :version => @version %>
54
54
55 <% html_title @version.name %>
55 <% html_title @version.name %>
@@ -1,1138 +1,1139
1 en:
1 en:
2 # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
2 # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
3 direction: ltr
3 direction: ltr
4 date:
4 date:
5 formats:
5 formats:
6 # Use the strftime parameters for formats.
6 # Use the strftime parameters for formats.
7 # When no format has been given, it uses default.
7 # When no format has been given, it uses default.
8 # You can provide other formats here if you like!
8 # You can provide other formats here if you like!
9 default: "%m/%d/%Y"
9 default: "%m/%d/%Y"
10 short: "%b %d"
10 short: "%b %d"
11 long: "%B %d, %Y"
11 long: "%B %d, %Y"
12
12
13 day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
13 day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
14 abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
14 abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
15
15
16 # Don't forget the nil at the beginning; there's no such thing as a 0th month
16 # Don't forget the nil at the beginning; there's no such thing as a 0th month
17 month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
17 month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
18 abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
18 abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
19 # Used in date_select and datime_select.
19 # Used in date_select and datime_select.
20 order:
20 order:
21 - :year
21 - :year
22 - :month
22 - :month
23 - :day
23 - :day
24
24
25 time:
25 time:
26 formats:
26 formats:
27 default: "%m/%d/%Y %I:%M %p"
27 default: "%m/%d/%Y %I:%M %p"
28 time: "%I:%M %p"
28 time: "%I:%M %p"
29 short: "%d %b %H:%M"
29 short: "%d %b %H:%M"
30 long: "%B %d, %Y %H:%M"
30 long: "%B %d, %Y %H:%M"
31 am: "am"
31 am: "am"
32 pm: "pm"
32 pm: "pm"
33
33
34 datetime:
34 datetime:
35 distance_in_words:
35 distance_in_words:
36 half_a_minute: "half a minute"
36 half_a_minute: "half a minute"
37 less_than_x_seconds:
37 less_than_x_seconds:
38 one: "less than 1 second"
38 one: "less than 1 second"
39 other: "less than %{count} seconds"
39 other: "less than %{count} seconds"
40 x_seconds:
40 x_seconds:
41 one: "1 second"
41 one: "1 second"
42 other: "%{count} seconds"
42 other: "%{count} seconds"
43 less_than_x_minutes:
43 less_than_x_minutes:
44 one: "less than a minute"
44 one: "less than a minute"
45 other: "less than %{count} minutes"
45 other: "less than %{count} minutes"
46 x_minutes:
46 x_minutes:
47 one: "1 minute"
47 one: "1 minute"
48 other: "%{count} minutes"
48 other: "%{count} minutes"
49 about_x_hours:
49 about_x_hours:
50 one: "about 1 hour"
50 one: "about 1 hour"
51 other: "about %{count} hours"
51 other: "about %{count} hours"
52 x_hours:
52 x_hours:
53 one: "1 hour"
53 one: "1 hour"
54 other: "%{count} hours"
54 other: "%{count} hours"
55 x_days:
55 x_days:
56 one: "1 day"
56 one: "1 day"
57 other: "%{count} days"
57 other: "%{count} days"
58 about_x_months:
58 about_x_months:
59 one: "about 1 month"
59 one: "about 1 month"
60 other: "about %{count} months"
60 other: "about %{count} months"
61 x_months:
61 x_months:
62 one: "1 month"
62 one: "1 month"
63 other: "%{count} months"
63 other: "%{count} months"
64 about_x_years:
64 about_x_years:
65 one: "about 1 year"
65 one: "about 1 year"
66 other: "about %{count} years"
66 other: "about %{count} years"
67 over_x_years:
67 over_x_years:
68 one: "over 1 year"
68 one: "over 1 year"
69 other: "over %{count} years"
69 other: "over %{count} years"
70 almost_x_years:
70 almost_x_years:
71 one: "almost 1 year"
71 one: "almost 1 year"
72 other: "almost %{count} years"
72 other: "almost %{count} years"
73
73
74 number:
74 number:
75 format:
75 format:
76 separator: "."
76 separator: "."
77 delimiter: ""
77 delimiter: ""
78 precision: 3
78 precision: 3
79
79
80 human:
80 human:
81 format:
81 format:
82 delimiter: ""
82 delimiter: ""
83 precision: 3
83 precision: 3
84 storage_units:
84 storage_units:
85 format: "%n %u"
85 format: "%n %u"
86 units:
86 units:
87 byte:
87 byte:
88 one: "Byte"
88 one: "Byte"
89 other: "Bytes"
89 other: "Bytes"
90 kb: "KB"
90 kb: "KB"
91 mb: "MB"
91 mb: "MB"
92 gb: "GB"
92 gb: "GB"
93 tb: "TB"
93 tb: "TB"
94
94
95 # Used in array.to_sentence.
95 # Used in array.to_sentence.
96 support:
96 support:
97 array:
97 array:
98 sentence_connector: "and"
98 sentence_connector: "and"
99 skip_last_comma: false
99 skip_last_comma: false
100
100
101 activerecord:
101 activerecord:
102 errors:
102 errors:
103 template:
103 template:
104 header:
104 header:
105 one: "1 error prohibited this %{model} from being saved"
105 one: "1 error prohibited this %{model} from being saved"
106 other: "%{count} errors prohibited this %{model} from being saved"
106 other: "%{count} errors prohibited this %{model} from being saved"
107 messages:
107 messages:
108 inclusion: "is not included in the list"
108 inclusion: "is not included in the list"
109 exclusion: "is reserved"
109 exclusion: "is reserved"
110 invalid: "is invalid"
110 invalid: "is invalid"
111 confirmation: "doesn't match confirmation"
111 confirmation: "doesn't match confirmation"
112 accepted: "must be accepted"
112 accepted: "must be accepted"
113 empty: "cannot be empty"
113 empty: "cannot be empty"
114 blank: "cannot be blank"
114 blank: "cannot be blank"
115 too_long: "is too long (maximum is %{count} characters)"
115 too_long: "is too long (maximum is %{count} characters)"
116 too_short: "is too short (minimum is %{count} characters)"
116 too_short: "is too short (minimum is %{count} characters)"
117 wrong_length: "is the wrong length (should be %{count} characters)"
117 wrong_length: "is the wrong length (should be %{count} characters)"
118 taken: "has already been taken"
118 taken: "has already been taken"
119 not_a_number: "is not a number"
119 not_a_number: "is not a number"
120 not_a_date: "is not a valid date"
120 not_a_date: "is not a valid date"
121 greater_than: "must be greater than %{count}"
121 greater_than: "must be greater than %{count}"
122 greater_than_or_equal_to: "must be greater than or equal to %{count}"
122 greater_than_or_equal_to: "must be greater than or equal to %{count}"
123 equal_to: "must be equal to %{count}"
123 equal_to: "must be equal to %{count}"
124 less_than: "must be less than %{count}"
124 less_than: "must be less than %{count}"
125 less_than_or_equal_to: "must be less than or equal to %{count}"
125 less_than_or_equal_to: "must be less than or equal to %{count}"
126 odd: "must be odd"
126 odd: "must be odd"
127 even: "must be even"
127 even: "must be even"
128 greater_than_start_date: "must be greater than start date"
128 greater_than_start_date: "must be greater than start date"
129 not_same_project: "doesn't belong to the same project"
129 not_same_project: "doesn't belong to the same project"
130 circular_dependency: "This relation would create a circular dependency"
130 circular_dependency: "This relation would create a circular dependency"
131 cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks"
131 cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks"
132 earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues"
132 earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues"
133
133
134 actionview_instancetag_blank_option: Please select
134 actionview_instancetag_blank_option: Please select
135
135
136 general_text_No: 'No'
136 general_text_No: 'No'
137 general_text_Yes: 'Yes'
137 general_text_Yes: 'Yes'
138 general_text_no: 'no'
138 general_text_no: 'no'
139 general_text_yes: 'yes'
139 general_text_yes: 'yes'
140 general_lang_name: 'English'
140 general_lang_name: 'English'
141 general_csv_separator: ','
141 general_csv_separator: ','
142 general_csv_decimal_separator: '.'
142 general_csv_decimal_separator: '.'
143 general_csv_encoding: ISO-8859-1
143 general_csv_encoding: ISO-8859-1
144 general_pdf_fontname: freesans
144 general_pdf_fontname: freesans
145 general_first_day_of_week: '7'
145 general_first_day_of_week: '7'
146
146
147 notice_account_updated: Account was successfully updated.
147 notice_account_updated: Account was successfully updated.
148 notice_account_invalid_creditentials: Invalid user or password
148 notice_account_invalid_creditentials: Invalid user or password
149 notice_account_password_updated: Password was successfully updated.
149 notice_account_password_updated: Password was successfully updated.
150 notice_account_wrong_password: Wrong password
150 notice_account_wrong_password: Wrong password
151 notice_account_register_done: Account was successfully created. An email containing the instructions to activate your account was sent to %{email}.
151 notice_account_register_done: Account was successfully created. An email containing the instructions to activate your account was sent to %{email}.
152 notice_account_unknown_email: Unknown user.
152 notice_account_unknown_email: Unknown user.
153 notice_account_not_activated_yet: You haven't activated your account yet. If you want to receive a new activation email, please <a href="%{url}">click this link</a>.
153 notice_account_not_activated_yet: You haven't activated your account yet. If you want to receive a new activation email, please <a href="%{url}">click this link</a>.
154 notice_account_locked: Your account is locked.
154 notice_account_locked: Your account is locked.
155 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
155 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
156 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
156 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
157 notice_account_activated: Your account has been activated. You can now log in.
157 notice_account_activated: Your account has been activated. You can now log in.
158 notice_successful_create: Successful creation.
158 notice_successful_create: Successful creation.
159 notice_successful_update: Successful update.
159 notice_successful_update: Successful update.
160 notice_successful_delete: Successful deletion.
160 notice_successful_delete: Successful deletion.
161 notice_successful_connection: Successful connection.
161 notice_successful_connection: Successful connection.
162 notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
162 notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
163 notice_locking_conflict: Data has been updated by another user.
163 notice_locking_conflict: Data has been updated by another user.
164 notice_not_authorized: You are not authorized to access this page.
164 notice_not_authorized: You are not authorized to access this page.
165 notice_not_authorized_archived_project: The project you're trying to access has been archived.
165 notice_not_authorized_archived_project: The project you're trying to access has been archived.
166 notice_email_sent: "An email was sent to %{value}"
166 notice_email_sent: "An email was sent to %{value}"
167 notice_email_error: "An error occurred while sending mail (%{value})"
167 notice_email_error: "An error occurred while sending mail (%{value})"
168 notice_feeds_access_key_reseted: Your Atom access key was reset.
168 notice_feeds_access_key_reseted: Your Atom access key was reset.
169 notice_api_access_key_reseted: Your API access key was reset.
169 notice_api_access_key_reseted: Your API access key was reset.
170 notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}."
170 notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}."
171 notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
171 notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
172 notice_failed_to_save_members: "Failed to save member(s): %{errors}."
172 notice_failed_to_save_members: "Failed to save member(s): %{errors}."
173 notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
173 notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
174 notice_account_pending: "Your account was created and is now pending administrator approval."
174 notice_account_pending: "Your account was created and is now pending administrator approval."
175 notice_default_data_loaded: Default configuration successfully loaded.
175 notice_default_data_loaded: Default configuration successfully loaded.
176 notice_unable_delete_version: Unable to delete version.
176 notice_unable_delete_version: Unable to delete version.
177 notice_unable_delete_time_entry: Unable to delete time log entry.
177 notice_unable_delete_time_entry: Unable to delete time log entry.
178 notice_issue_done_ratios_updated: Issue done ratios updated.
178 notice_issue_done_ratios_updated: Issue done ratios updated.
179 notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
179 notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
180 notice_issue_successful_create: "Issue %{id} created."
180 notice_issue_successful_create: "Issue %{id} created."
181 notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it."
181 notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it."
182 notice_account_deleted: "Your account has been permanently deleted."
182 notice_account_deleted: "Your account has been permanently deleted."
183 notice_user_successful_create: "User %{id} created."
183 notice_user_successful_create: "User %{id} created."
184 notice_new_password_must_be_different: The new password must be different from the current password
184 notice_new_password_must_be_different: The new password must be different from the current password
185
185
186 error_can_t_load_default_data: "Default configuration could not be loaded: %{value}"
186 error_can_t_load_default_data: "Default configuration could not be loaded: %{value}"
187 error_scm_not_found: "The entry or revision was not found in the repository."
187 error_scm_not_found: "The entry or revision was not found in the repository."
188 error_scm_command_failed: "An error occurred when trying to access the repository: %{value}"
188 error_scm_command_failed: "An error occurred when trying to access the repository: %{value}"
189 error_scm_annotate: "The entry does not exist or cannot be annotated."
189 error_scm_annotate: "The entry does not exist or cannot be annotated."
190 error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size."
190 error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size."
191 error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
191 error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
192 error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
192 error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
193 error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
193 error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
194 error_can_not_delete_custom_field: Unable to delete custom field
194 error_can_not_delete_custom_field: Unable to delete custom field
195 error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted."
195 error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted."
196 error_can_not_remove_role: "This role is in use and cannot be deleted."
196 error_can_not_remove_role: "This role is in use and cannot be deleted."
197 error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened'
197 error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened'
198 error_can_not_archive_project: This project cannot be archived
198 error_can_not_archive_project: This project cannot be archived
199 error_issue_done_ratios_not_updated: "Issue done ratios not updated."
199 error_issue_done_ratios_not_updated: "Issue done ratios not updated."
200 error_workflow_copy_source: 'Please select a source tracker or role'
200 error_workflow_copy_source: 'Please select a source tracker or role'
201 error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
201 error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
202 error_unable_delete_issue_status: 'Unable to delete issue status'
202 error_unable_delete_issue_status: 'Unable to delete issue status'
203 error_unable_to_connect: "Unable to connect (%{value})"
203 error_unable_to_connect: "Unable to connect (%{value})"
204 error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
204 error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
205 error_session_expired: "Your session has expired. Please login again."
205 error_session_expired: "Your session has expired. Please login again."
206 warning_attachments_not_saved: "%{count} file(s) could not be saved."
206 warning_attachments_not_saved: "%{count} file(s) could not be saved."
207 error_password_expired: "Your password has expired or the administrator requires you to change it."
207 error_password_expired: "Your password has expired or the administrator requires you to change it."
208
208
209 mail_subject_lost_password: "Your %{value} password"
209 mail_subject_lost_password: "Your %{value} password"
210 mail_body_lost_password: 'To change your password, click on the following link:'
210 mail_body_lost_password: 'To change your password, click on the following link:'
211 mail_subject_register: "Your %{value} account activation"
211 mail_subject_register: "Your %{value} account activation"
212 mail_body_register: 'To activate your account, click on the following link:'
212 mail_body_register: 'To activate your account, click on the following link:'
213 mail_body_account_information_external: "You can use your %{value} account to log in."
213 mail_body_account_information_external: "You can use your %{value} account to log in."
214 mail_body_account_information: Your account information
214 mail_body_account_information: Your account information
215 mail_subject_account_activation_request: "%{value} account activation request"
215 mail_subject_account_activation_request: "%{value} account activation request"
216 mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:"
216 mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:"
217 mail_subject_reminder: "%{count} issue(s) due in the next %{days} days"
217 mail_subject_reminder: "%{count} issue(s) due in the next %{days} days"
218 mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:"
218 mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:"
219 mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
219 mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
220 mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}."
220 mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}."
221 mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
221 mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
222 mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}."
222 mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}."
223
223
224 field_name: Name
224 field_name: Name
225 field_description: Description
225 field_description: Description
226 field_summary: Summary
226 field_summary: Summary
227 field_is_required: Required
227 field_is_required: Required
228 field_firstname: First name
228 field_firstname: First name
229 field_lastname: Last name
229 field_lastname: Last name
230 field_mail: Email
230 field_mail: Email
231 field_address: Email
231 field_address: Email
232 field_filename: File
232 field_filename: File
233 field_filesize: Size
233 field_filesize: Size
234 field_downloads: Downloads
234 field_downloads: Downloads
235 field_author: Author
235 field_author: Author
236 field_created_on: Created
236 field_created_on: Created
237 field_updated_on: Updated
237 field_updated_on: Updated
238 field_closed_on: Closed
238 field_closed_on: Closed
239 field_field_format: Format
239 field_field_format: Format
240 field_is_for_all: For all projects
240 field_is_for_all: For all projects
241 field_possible_values: Possible values
241 field_possible_values: Possible values
242 field_regexp: Regular expression
242 field_regexp: Regular expression
243 field_min_length: Minimum length
243 field_min_length: Minimum length
244 field_max_length: Maximum length
244 field_max_length: Maximum length
245 field_value: Value
245 field_value: Value
246 field_category: Category
246 field_category: Category
247 field_title: Title
247 field_title: Title
248 field_project: Project
248 field_project: Project
249 field_issue: Issue
249 field_issue: Issue
250 field_status: Status
250 field_status: Status
251 field_notes: Notes
251 field_notes: Notes
252 field_is_closed: Issue closed
252 field_is_closed: Issue closed
253 field_is_default: Default value
253 field_is_default: Default value
254 field_tracker: Tracker
254 field_tracker: Tracker
255 field_subject: Subject
255 field_subject: Subject
256 field_due_date: Due date
256 field_due_date: Due date
257 field_assigned_to: Assignee
257 field_assigned_to: Assignee
258 field_priority: Priority
258 field_priority: Priority
259 field_fixed_version: Target version
259 field_fixed_version: Target version
260 field_user: User
260 field_user: User
261 field_principal: Principal
261 field_principal: Principal
262 field_role: Role
262 field_role: Role
263 field_homepage: Homepage
263 field_homepage: Homepage
264 field_is_public: Public
264 field_is_public: Public
265 field_parent: Subproject of
265 field_parent: Subproject of
266 field_is_in_roadmap: Issues displayed in roadmap
266 field_is_in_roadmap: Issues displayed in roadmap
267 field_login: Login
267 field_login: Login
268 field_mail_notification: Email notifications
268 field_mail_notification: Email notifications
269 field_admin: Administrator
269 field_admin: Administrator
270 field_last_login_on: Last connection
270 field_last_login_on: Last connection
271 field_language: Language
271 field_language: Language
272 field_effective_date: Date
272 field_effective_date: Date
273 field_password: Password
273 field_password: Password
274 field_new_password: New password
274 field_new_password: New password
275 field_password_confirmation: Confirmation
275 field_password_confirmation: Confirmation
276 field_version: Version
276 field_version: Version
277 field_type: Type
277 field_type: Type
278 field_host: Host
278 field_host: Host
279 field_port: Port
279 field_port: Port
280 field_account: Account
280 field_account: Account
281 field_base_dn: Base DN
281 field_base_dn: Base DN
282 field_attr_login: Login attribute
282 field_attr_login: Login attribute
283 field_attr_firstname: Firstname attribute
283 field_attr_firstname: Firstname attribute
284 field_attr_lastname: Lastname attribute
284 field_attr_lastname: Lastname attribute
285 field_attr_mail: Email attribute
285 field_attr_mail: Email attribute
286 field_onthefly: On-the-fly user creation
286 field_onthefly: On-the-fly user creation
287 field_start_date: Start date
287 field_start_date: Start date
288 field_done_ratio: "% Done"
288 field_done_ratio: "% Done"
289 field_auth_source: Authentication mode
289 field_auth_source: Authentication mode
290 field_hide_mail: Hide my email address
290 field_hide_mail: Hide my email address
291 field_comments: Comment
291 field_comments: Comment
292 field_url: URL
292 field_url: URL
293 field_start_page: Start page
293 field_start_page: Start page
294 field_subproject: Subproject
294 field_subproject: Subproject
295 field_hours: Hours
295 field_hours: Hours
296 field_activity: Activity
296 field_activity: Activity
297 field_spent_on: Date
297 field_spent_on: Date
298 field_identifier: Identifier
298 field_identifier: Identifier
299 field_is_filter: Used as a filter
299 field_is_filter: Used as a filter
300 field_issue_to: Related issue
300 field_issue_to: Related issue
301 field_delay: Delay
301 field_delay: Delay
302 field_assignable: Issues can be assigned to this role
302 field_assignable: Issues can be assigned to this role
303 field_redirect_existing_links: Redirect existing links
303 field_redirect_existing_links: Redirect existing links
304 field_estimated_hours: Estimated time
304 field_estimated_hours: Estimated time
305 field_column_names: Columns
305 field_column_names: Columns
306 field_time_entries: Log time
306 field_time_entries: Log time
307 field_time_zone: Time zone
307 field_time_zone: Time zone
308 field_searchable: Searchable
308 field_searchable: Searchable
309 field_default_value: Default value
309 field_default_value: Default value
310 field_comments_sorting: Display comments
310 field_comments_sorting: Display comments
311 field_parent_title: Parent page
311 field_parent_title: Parent page
312 field_editable: Editable
312 field_editable: Editable
313 field_watcher: Watcher
313 field_watcher: Watcher
314 field_identity_url: OpenID URL
314 field_identity_url: OpenID URL
315 field_content: Content
315 field_content: Content
316 field_group_by: Group results by
316 field_group_by: Group results by
317 field_sharing: Sharing
317 field_sharing: Sharing
318 field_parent_issue: Parent task
318 field_parent_issue: Parent task
319 field_member_of_group: "Assignee's group"
319 field_member_of_group: "Assignee's group"
320 field_assigned_to_role: "Assignee's role"
320 field_assigned_to_role: "Assignee's role"
321 field_text: Text field
321 field_text: Text field
322 field_visible: Visible
322 field_visible: Visible
323 field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text"
323 field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text"
324 field_issues_visibility: Issues visibility
324 field_issues_visibility: Issues visibility
325 field_is_private: Private
325 field_is_private: Private
326 field_commit_logs_encoding: Commit messages encoding
326 field_commit_logs_encoding: Commit messages encoding
327 field_scm_path_encoding: Path encoding
327 field_scm_path_encoding: Path encoding
328 field_path_to_repository: Path to repository
328 field_path_to_repository: Path to repository
329 field_root_directory: Root directory
329 field_root_directory: Root directory
330 field_cvsroot: CVSROOT
330 field_cvsroot: CVSROOT
331 field_cvs_module: Module
331 field_cvs_module: Module
332 field_repository_is_default: Main repository
332 field_repository_is_default: Main repository
333 field_multiple: Multiple values
333 field_multiple: Multiple values
334 field_auth_source_ldap_filter: LDAP filter
334 field_auth_source_ldap_filter: LDAP filter
335 field_core_fields: Standard fields
335 field_core_fields: Standard fields
336 field_timeout: "Timeout (in seconds)"
336 field_timeout: "Timeout (in seconds)"
337 field_board_parent: Parent forum
337 field_board_parent: Parent forum
338 field_private_notes: Private notes
338 field_private_notes: Private notes
339 field_inherit_members: Inherit members
339 field_inherit_members: Inherit members
340 field_generate_password: Generate password
340 field_generate_password: Generate password
341 field_must_change_passwd: Must change password at next logon
341 field_must_change_passwd: Must change password at next logon
342 field_default_status: Default status
342 field_default_status: Default status
343 field_users_visibility: Users visibility
343 field_users_visibility: Users visibility
344 field_time_entries_visibility: Time logs visibility
344
345
345 setting_app_title: Application title
346 setting_app_title: Application title
346 setting_app_subtitle: Application subtitle
347 setting_app_subtitle: Application subtitle
347 setting_welcome_text: Welcome text
348 setting_welcome_text: Welcome text
348 setting_default_language: Default language
349 setting_default_language: Default language
349 setting_login_required: Authentication required
350 setting_login_required: Authentication required
350 setting_self_registration: Self-registration
351 setting_self_registration: Self-registration
351 setting_attachment_max_size: Maximum attachment size
352 setting_attachment_max_size: Maximum attachment size
352 setting_issues_export_limit: Issues export limit
353 setting_issues_export_limit: Issues export limit
353 setting_mail_from: Emission email address
354 setting_mail_from: Emission email address
354 setting_bcc_recipients: Blind carbon copy recipients (bcc)
355 setting_bcc_recipients: Blind carbon copy recipients (bcc)
355 setting_plain_text_mail: Plain text mail (no HTML)
356 setting_plain_text_mail: Plain text mail (no HTML)
356 setting_host_name: Host name and path
357 setting_host_name: Host name and path
357 setting_text_formatting: Text formatting
358 setting_text_formatting: Text formatting
358 setting_wiki_compression: Wiki history compression
359 setting_wiki_compression: Wiki history compression
359 setting_feeds_limit: Maximum number of items in Atom feeds
360 setting_feeds_limit: Maximum number of items in Atom feeds
360 setting_default_projects_public: New projects are public by default
361 setting_default_projects_public: New projects are public by default
361 setting_autofetch_changesets: Fetch commits automatically
362 setting_autofetch_changesets: Fetch commits automatically
362 setting_sys_api_enabled: Enable WS for repository management
363 setting_sys_api_enabled: Enable WS for repository management
363 setting_commit_ref_keywords: Referencing keywords
364 setting_commit_ref_keywords: Referencing keywords
364 setting_commit_fix_keywords: Fixing keywords
365 setting_commit_fix_keywords: Fixing keywords
365 setting_autologin: Autologin
366 setting_autologin: Autologin
366 setting_date_format: Date format
367 setting_date_format: Date format
367 setting_time_format: Time format
368 setting_time_format: Time format
368 setting_cross_project_issue_relations: Allow cross-project issue relations
369 setting_cross_project_issue_relations: Allow cross-project issue relations
369 setting_cross_project_subtasks: Allow cross-project subtasks
370 setting_cross_project_subtasks: Allow cross-project subtasks
370 setting_issue_list_default_columns: Default columns displayed on the issue list
371 setting_issue_list_default_columns: Default columns displayed on the issue list
371 setting_repositories_encodings: Attachments and repositories encodings
372 setting_repositories_encodings: Attachments and repositories encodings
372 setting_emails_header: Email header
373 setting_emails_header: Email header
373 setting_emails_footer: Email footer
374 setting_emails_footer: Email footer
374 setting_protocol: Protocol
375 setting_protocol: Protocol
375 setting_per_page_options: Objects per page options
376 setting_per_page_options: Objects per page options
376 setting_user_format: Users display format
377 setting_user_format: Users display format
377 setting_activity_days_default: Days displayed on project activity
378 setting_activity_days_default: Days displayed on project activity
378 setting_display_subprojects_issues: Display subprojects issues on main projects by default
379 setting_display_subprojects_issues: Display subprojects issues on main projects by default
379 setting_enabled_scm: Enabled SCM
380 setting_enabled_scm: Enabled SCM
380 setting_mail_handler_body_delimiters: "Truncate emails after one of these lines"
381 setting_mail_handler_body_delimiters: "Truncate emails after one of these lines"
381 setting_mail_handler_api_enabled: Enable WS for incoming emails
382 setting_mail_handler_api_enabled: Enable WS for incoming emails
382 setting_mail_handler_api_key: API key
383 setting_mail_handler_api_key: API key
383 setting_sequential_project_identifiers: Generate sequential project identifiers
384 setting_sequential_project_identifiers: Generate sequential project identifiers
384 setting_gravatar_enabled: Use Gravatar user icons
385 setting_gravatar_enabled: Use Gravatar user icons
385 setting_gravatar_default: Default Gravatar image
386 setting_gravatar_default: Default Gravatar image
386 setting_diff_max_lines_displayed: Maximum number of diff lines displayed
387 setting_diff_max_lines_displayed: Maximum number of diff lines displayed
387 setting_file_max_size_displayed: Maximum size of text files displayed inline
388 setting_file_max_size_displayed: Maximum size of text files displayed inline
388 setting_repository_log_display_limit: Maximum number of revisions displayed on file log
389 setting_repository_log_display_limit: Maximum number of revisions displayed on file log
389 setting_openid: Allow OpenID login and registration
390 setting_openid: Allow OpenID login and registration
390 setting_password_max_age: Require password change after
391 setting_password_max_age: Require password change after
391 setting_password_min_length: Minimum password length
392 setting_password_min_length: Minimum password length
392 setting_new_project_user_role_id: Role given to a non-admin user who creates a project
393 setting_new_project_user_role_id: Role given to a non-admin user who creates a project
393 setting_default_projects_modules: Default enabled modules for new projects
394 setting_default_projects_modules: Default enabled modules for new projects
394 setting_issue_done_ratio: Calculate the issue done ratio with
395 setting_issue_done_ratio: Calculate the issue done ratio with
395 setting_issue_done_ratio_issue_field: Use the issue field
396 setting_issue_done_ratio_issue_field: Use the issue field
396 setting_issue_done_ratio_issue_status: Use the issue status
397 setting_issue_done_ratio_issue_status: Use the issue status
397 setting_start_of_week: Start calendars on
398 setting_start_of_week: Start calendars on
398 setting_rest_api_enabled: Enable REST web service
399 setting_rest_api_enabled: Enable REST web service
399 setting_cache_formatted_text: Cache formatted text
400 setting_cache_formatted_text: Cache formatted text
400 setting_default_notification_option: Default notification option
401 setting_default_notification_option: Default notification option
401 setting_commit_logtime_enabled: Enable time logging
402 setting_commit_logtime_enabled: Enable time logging
402 setting_commit_logtime_activity_id: Activity for logged time
403 setting_commit_logtime_activity_id: Activity for logged time
403 setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
404 setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
404 setting_issue_group_assignment: Allow issue assignment to groups
405 setting_issue_group_assignment: Allow issue assignment to groups
405 setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
406 setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
406 setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
407 setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
407 setting_unsubscribe: Allow users to delete their own account
408 setting_unsubscribe: Allow users to delete their own account
408 setting_session_lifetime: Session maximum lifetime
409 setting_session_lifetime: Session maximum lifetime
409 setting_session_timeout: Session inactivity timeout
410 setting_session_timeout: Session inactivity timeout
410 setting_thumbnails_enabled: Display attachment thumbnails
411 setting_thumbnails_enabled: Display attachment thumbnails
411 setting_thumbnails_size: Thumbnails size (in pixels)
412 setting_thumbnails_size: Thumbnails size (in pixels)
412 setting_non_working_week_days: Non-working days
413 setting_non_working_week_days: Non-working days
413 setting_jsonp_enabled: Enable JSONP support
414 setting_jsonp_enabled: Enable JSONP support
414 setting_default_projects_tracker_ids: Default trackers for new projects
415 setting_default_projects_tracker_ids: Default trackers for new projects
415 setting_mail_handler_excluded_filenames: Exclude attachments by name
416 setting_mail_handler_excluded_filenames: Exclude attachments by name
416 setting_force_default_language_for_anonymous: Force default language for anonymous users
417 setting_force_default_language_for_anonymous: Force default language for anonymous users
417 setting_force_default_language_for_loggedin: Force default language for logged-in users
418 setting_force_default_language_for_loggedin: Force default language for logged-in users
418 setting_link_copied_issue: Link issues on copy
419 setting_link_copied_issue: Link issues on copy
419 setting_max_additional_emails: Maximum number of additional email addresses
420 setting_max_additional_emails: Maximum number of additional email addresses
420 setting_search_results_per_page: Search results per page
421 setting_search_results_per_page: Search results per page
421
422
422 permission_add_project: Create project
423 permission_add_project: Create project
423 permission_add_subprojects: Create subprojects
424 permission_add_subprojects: Create subprojects
424 permission_edit_project: Edit project
425 permission_edit_project: Edit project
425 permission_close_project: Close / reopen the project
426 permission_close_project: Close / reopen the project
426 permission_select_project_modules: Select project modules
427 permission_select_project_modules: Select project modules
427 permission_manage_members: Manage members
428 permission_manage_members: Manage members
428 permission_manage_project_activities: Manage project activities
429 permission_manage_project_activities: Manage project activities
429 permission_manage_versions: Manage versions
430 permission_manage_versions: Manage versions
430 permission_manage_categories: Manage issue categories
431 permission_manage_categories: Manage issue categories
431 permission_view_issues: View Issues
432 permission_view_issues: View Issues
432 permission_add_issues: Add issues
433 permission_add_issues: Add issues
433 permission_edit_issues: Edit issues
434 permission_edit_issues: Edit issues
434 permission_copy_issues: Copy issues
435 permission_copy_issues: Copy issues
435 permission_manage_issue_relations: Manage issue relations
436 permission_manage_issue_relations: Manage issue relations
436 permission_set_issues_private: Set issues public or private
437 permission_set_issues_private: Set issues public or private
437 permission_set_own_issues_private: Set own issues public or private
438 permission_set_own_issues_private: Set own issues public or private
438 permission_add_issue_notes: Add notes
439 permission_add_issue_notes: Add notes
439 permission_edit_issue_notes: Edit notes
440 permission_edit_issue_notes: Edit notes
440 permission_edit_own_issue_notes: Edit own notes
441 permission_edit_own_issue_notes: Edit own notes
441 permission_view_private_notes: View private notes
442 permission_view_private_notes: View private notes
442 permission_set_notes_private: Set notes as private
443 permission_set_notes_private: Set notes as private
443 permission_move_issues: Move issues
444 permission_move_issues: Move issues
444 permission_delete_issues: Delete issues
445 permission_delete_issues: Delete issues
445 permission_manage_public_queries: Manage public queries
446 permission_manage_public_queries: Manage public queries
446 permission_save_queries: Save queries
447 permission_save_queries: Save queries
447 permission_view_gantt: View gantt chart
448 permission_view_gantt: View gantt chart
448 permission_view_calendar: View calendar
449 permission_view_calendar: View calendar
449 permission_view_issue_watchers: View watchers list
450 permission_view_issue_watchers: View watchers list
450 permission_add_issue_watchers: Add watchers
451 permission_add_issue_watchers: Add watchers
451 permission_delete_issue_watchers: Delete watchers
452 permission_delete_issue_watchers: Delete watchers
452 permission_log_time: Log spent time
453 permission_log_time: Log spent time
453 permission_view_time_entries: View spent time
454 permission_view_time_entries: View spent time
454 permission_edit_time_entries: Edit time logs
455 permission_edit_time_entries: Edit time logs
455 permission_edit_own_time_entries: Edit own time logs
456 permission_edit_own_time_entries: Edit own time logs
456 permission_manage_news: Manage news
457 permission_manage_news: Manage news
457 permission_comment_news: Comment news
458 permission_comment_news: Comment news
458 permission_view_documents: View documents
459 permission_view_documents: View documents
459 permission_add_documents: Add documents
460 permission_add_documents: Add documents
460 permission_edit_documents: Edit documents
461 permission_edit_documents: Edit documents
461 permission_delete_documents: Delete documents
462 permission_delete_documents: Delete documents
462 permission_manage_files: Manage files
463 permission_manage_files: Manage files
463 permission_view_files: View files
464 permission_view_files: View files
464 permission_manage_wiki: Manage wiki
465 permission_manage_wiki: Manage wiki
465 permission_rename_wiki_pages: Rename wiki pages
466 permission_rename_wiki_pages: Rename wiki pages
466 permission_delete_wiki_pages: Delete wiki pages
467 permission_delete_wiki_pages: Delete wiki pages
467 permission_view_wiki_pages: View wiki
468 permission_view_wiki_pages: View wiki
468 permission_view_wiki_edits: View wiki history
469 permission_view_wiki_edits: View wiki history
469 permission_edit_wiki_pages: Edit wiki pages
470 permission_edit_wiki_pages: Edit wiki pages
470 permission_delete_wiki_pages_attachments: Delete attachments
471 permission_delete_wiki_pages_attachments: Delete attachments
471 permission_protect_wiki_pages: Protect wiki pages
472 permission_protect_wiki_pages: Protect wiki pages
472 permission_manage_repository: Manage repository
473 permission_manage_repository: Manage repository
473 permission_browse_repository: Browse repository
474 permission_browse_repository: Browse repository
474 permission_view_changesets: View changesets
475 permission_view_changesets: View changesets
475 permission_commit_access: Commit access
476 permission_commit_access: Commit access
476 permission_manage_boards: Manage forums
477 permission_manage_boards: Manage forums
477 permission_view_messages: View messages
478 permission_view_messages: View messages
478 permission_add_messages: Post messages
479 permission_add_messages: Post messages
479 permission_edit_messages: Edit messages
480 permission_edit_messages: Edit messages
480 permission_edit_own_messages: Edit own messages
481 permission_edit_own_messages: Edit own messages
481 permission_delete_messages: Delete messages
482 permission_delete_messages: Delete messages
482 permission_delete_own_messages: Delete own messages
483 permission_delete_own_messages: Delete own messages
483 permission_export_wiki_pages: Export wiki pages
484 permission_export_wiki_pages: Export wiki pages
484 permission_manage_subtasks: Manage subtasks
485 permission_manage_subtasks: Manage subtasks
485 permission_manage_related_issues: Manage related issues
486 permission_manage_related_issues: Manage related issues
486
487
487 project_module_issue_tracking: Issue tracking
488 project_module_issue_tracking: Issue tracking
488 project_module_time_tracking: Time tracking
489 project_module_time_tracking: Time tracking
489 project_module_news: News
490 project_module_news: News
490 project_module_documents: Documents
491 project_module_documents: Documents
491 project_module_files: Files
492 project_module_files: Files
492 project_module_wiki: Wiki
493 project_module_wiki: Wiki
493 project_module_repository: Repository
494 project_module_repository: Repository
494 project_module_boards: Forums
495 project_module_boards: Forums
495 project_module_calendar: Calendar
496 project_module_calendar: Calendar
496 project_module_gantt: Gantt
497 project_module_gantt: Gantt
497
498
498 label_user: User
499 label_user: User
499 label_user_plural: Users
500 label_user_plural: Users
500 label_user_new: New user
501 label_user_new: New user
501 label_user_anonymous: Anonymous
502 label_user_anonymous: Anonymous
502 label_project: Project
503 label_project: Project
503 label_project_new: New project
504 label_project_new: New project
504 label_project_plural: Projects
505 label_project_plural: Projects
505 label_x_projects:
506 label_x_projects:
506 zero: no projects
507 zero: no projects
507 one: 1 project
508 one: 1 project
508 other: "%{count} projects"
509 other: "%{count} projects"
509 label_project_all: All Projects
510 label_project_all: All Projects
510 label_project_latest: Latest projects
511 label_project_latest: Latest projects
511 label_issue: Issue
512 label_issue: Issue
512 label_issue_new: New issue
513 label_issue_new: New issue
513 label_issue_plural: Issues
514 label_issue_plural: Issues
514 label_issue_view_all: View all issues
515 label_issue_view_all: View all issues
515 label_issues_by: "Issues by %{value}"
516 label_issues_by: "Issues by %{value}"
516 label_issue_added: Issue added
517 label_issue_added: Issue added
517 label_issue_updated: Issue updated
518 label_issue_updated: Issue updated
518 label_issue_note_added: Note added
519 label_issue_note_added: Note added
519 label_issue_status_updated: Status updated
520 label_issue_status_updated: Status updated
520 label_issue_assigned_to_updated: Assignee updated
521 label_issue_assigned_to_updated: Assignee updated
521 label_issue_priority_updated: Priority updated
522 label_issue_priority_updated: Priority updated
522 label_document: Document
523 label_document: Document
523 label_document_new: New document
524 label_document_new: New document
524 label_document_plural: Documents
525 label_document_plural: Documents
525 label_document_added: Document added
526 label_document_added: Document added
526 label_role: Role
527 label_role: Role
527 label_role_plural: Roles
528 label_role_plural: Roles
528 label_role_new: New role
529 label_role_new: New role
529 label_role_and_permissions: Roles and permissions
530 label_role_and_permissions: Roles and permissions
530 label_role_anonymous: Anonymous
531 label_role_anonymous: Anonymous
531 label_role_non_member: Non member
532 label_role_non_member: Non member
532 label_member: Member
533 label_member: Member
533 label_member_new: New member
534 label_member_new: New member
534 label_member_plural: Members
535 label_member_plural: Members
535 label_tracker: Tracker
536 label_tracker: Tracker
536 label_tracker_plural: Trackers
537 label_tracker_plural: Trackers
537 label_tracker_new: New tracker
538 label_tracker_new: New tracker
538 label_workflow: Workflow
539 label_workflow: Workflow
539 label_issue_status: Issue status
540 label_issue_status: Issue status
540 label_issue_status_plural: Issue statuses
541 label_issue_status_plural: Issue statuses
541 label_issue_status_new: New status
542 label_issue_status_new: New status
542 label_issue_category: Issue category
543 label_issue_category: Issue category
543 label_issue_category_plural: Issue categories
544 label_issue_category_plural: Issue categories
544 label_issue_category_new: New category
545 label_issue_category_new: New category
545 label_custom_field: Custom field
546 label_custom_field: Custom field
546 label_custom_field_plural: Custom fields
547 label_custom_field_plural: Custom fields
547 label_custom_field_new: New custom field
548 label_custom_field_new: New custom field
548 label_enumerations: Enumerations
549 label_enumerations: Enumerations
549 label_enumeration_new: New value
550 label_enumeration_new: New value
550 label_information: Information
551 label_information: Information
551 label_information_plural: Information
552 label_information_plural: Information
552 label_please_login: Please log in
553 label_please_login: Please log in
553 label_register: Register
554 label_register: Register
554 label_login_with_open_id_option: or login with OpenID
555 label_login_with_open_id_option: or login with OpenID
555 label_password_lost: Lost password
556 label_password_lost: Lost password
556 label_home: Home
557 label_home: Home
557 label_my_page: My page
558 label_my_page: My page
558 label_my_account: My account
559 label_my_account: My account
559 label_my_projects: My projects
560 label_my_projects: My projects
560 label_my_page_block: My page block
561 label_my_page_block: My page block
561 label_administration: Administration
562 label_administration: Administration
562 label_login: Sign in
563 label_login: Sign in
563 label_logout: Sign out
564 label_logout: Sign out
564 label_help: Help
565 label_help: Help
565 label_reported_issues: Reported issues
566 label_reported_issues: Reported issues
566 label_assigned_to_me_issues: Issues assigned to me
567 label_assigned_to_me_issues: Issues assigned to me
567 label_last_login: Last connection
568 label_last_login: Last connection
568 label_registered_on: Registered on
569 label_registered_on: Registered on
569 label_activity: Activity
570 label_activity: Activity
570 label_overall_activity: Overall activity
571 label_overall_activity: Overall activity
571 label_user_activity: "%{value}'s activity"
572 label_user_activity: "%{value}'s activity"
572 label_new: New
573 label_new: New
573 label_logged_as: Logged in as
574 label_logged_as: Logged in as
574 label_environment: Environment
575 label_environment: Environment
575 label_authentication: Authentication
576 label_authentication: Authentication
576 label_auth_source: Authentication mode
577 label_auth_source: Authentication mode
577 label_auth_source_new: New authentication mode
578 label_auth_source_new: New authentication mode
578 label_auth_source_plural: Authentication modes
579 label_auth_source_plural: Authentication modes
579 label_subproject_plural: Subprojects
580 label_subproject_plural: Subprojects
580 label_subproject_new: New subproject
581 label_subproject_new: New subproject
581 label_and_its_subprojects: "%{value} and its subprojects"
582 label_and_its_subprojects: "%{value} and its subprojects"
582 label_min_max_length: Min - Max length
583 label_min_max_length: Min - Max length
583 label_list: List
584 label_list: List
584 label_date: Date
585 label_date: Date
585 label_integer: Integer
586 label_integer: Integer
586 label_float: Float
587 label_float: Float
587 label_boolean: Boolean
588 label_boolean: Boolean
588 label_string: Text
589 label_string: Text
589 label_text: Long text
590 label_text: Long text
590 label_attribute: Attribute
591 label_attribute: Attribute
591 label_attribute_plural: Attributes
592 label_attribute_plural: Attributes
592 label_no_data: No data to display
593 label_no_data: No data to display
593 label_change_status: Change status
594 label_change_status: Change status
594 label_history: History
595 label_history: History
595 label_attachment: File
596 label_attachment: File
596 label_attachment_new: New file
597 label_attachment_new: New file
597 label_attachment_delete: Delete file
598 label_attachment_delete: Delete file
598 label_attachment_plural: Files
599 label_attachment_plural: Files
599 label_file_added: File added
600 label_file_added: File added
600 label_report: Report
601 label_report: Report
601 label_report_plural: Reports
602 label_report_plural: Reports
602 label_news: News
603 label_news: News
603 label_news_new: Add news
604 label_news_new: Add news
604 label_news_plural: News
605 label_news_plural: News
605 label_news_latest: Latest news
606 label_news_latest: Latest news
606 label_news_view_all: View all news
607 label_news_view_all: View all news
607 label_news_added: News added
608 label_news_added: News added
608 label_news_comment_added: Comment added to a news
609 label_news_comment_added: Comment added to a news
609 label_settings: Settings
610 label_settings: Settings
610 label_overview: Overview
611 label_overview: Overview
611 label_version: Version
612 label_version: Version
612 label_version_new: New version
613 label_version_new: New version
613 label_version_plural: Versions
614 label_version_plural: Versions
614 label_close_versions: Close completed versions
615 label_close_versions: Close completed versions
615 label_confirmation: Confirmation
616 label_confirmation: Confirmation
616 label_export_to: 'Also available in:'
617 label_export_to: 'Also available in:'
617 label_read: Read...
618 label_read: Read...
618 label_public_projects: Public projects
619 label_public_projects: Public projects
619 label_open_issues: open
620 label_open_issues: open
620 label_open_issues_plural: open
621 label_open_issues_plural: open
621 label_closed_issues: closed
622 label_closed_issues: closed
622 label_closed_issues_plural: closed
623 label_closed_issues_plural: closed
623 label_x_open_issues_abbr_on_total:
624 label_x_open_issues_abbr_on_total:
624 zero: 0 open / %{total}
625 zero: 0 open / %{total}
625 one: 1 open / %{total}
626 one: 1 open / %{total}
626 other: "%{count} open / %{total}"
627 other: "%{count} open / %{total}"
627 label_x_open_issues_abbr:
628 label_x_open_issues_abbr:
628 zero: 0 open
629 zero: 0 open
629 one: 1 open
630 one: 1 open
630 other: "%{count} open"
631 other: "%{count} open"
631 label_x_closed_issues_abbr:
632 label_x_closed_issues_abbr:
632 zero: 0 closed
633 zero: 0 closed
633 one: 1 closed
634 one: 1 closed
634 other: "%{count} closed"
635 other: "%{count} closed"
635 label_x_issues:
636 label_x_issues:
636 zero: 0 issues
637 zero: 0 issues
637 one: 1 issue
638 one: 1 issue
638 other: "%{count} issues"
639 other: "%{count} issues"
639 label_total: Total
640 label_total: Total
640 label_total_time: Total time
641 label_total_time: Total time
641 label_permissions: Permissions
642 label_permissions: Permissions
642 label_current_status: Current status
643 label_current_status: Current status
643 label_new_statuses_allowed: New statuses allowed
644 label_new_statuses_allowed: New statuses allowed
644 label_all: all
645 label_all: all
645 label_any: any
646 label_any: any
646 label_none: none
647 label_none: none
647 label_nobody: nobody
648 label_nobody: nobody
648 label_next: Next
649 label_next: Next
649 label_previous: Previous
650 label_previous: Previous
650 label_used_by: Used by
651 label_used_by: Used by
651 label_details: Details
652 label_details: Details
652 label_add_note: Add a note
653 label_add_note: Add a note
653 label_calendar: Calendar
654 label_calendar: Calendar
654 label_months_from: months from
655 label_months_from: months from
655 label_gantt: Gantt
656 label_gantt: Gantt
656 label_internal: Internal
657 label_internal: Internal
657 label_last_changes: "last %{count} changes"
658 label_last_changes: "last %{count} changes"
658 label_change_view_all: View all changes
659 label_change_view_all: View all changes
659 label_personalize_page: Personalize this page
660 label_personalize_page: Personalize this page
660 label_comment: Comment
661 label_comment: Comment
661 label_comment_plural: Comments
662 label_comment_plural: Comments
662 label_x_comments:
663 label_x_comments:
663 zero: no comments
664 zero: no comments
664 one: 1 comment
665 one: 1 comment
665 other: "%{count} comments"
666 other: "%{count} comments"
666 label_comment_add: Add a comment
667 label_comment_add: Add a comment
667 label_comment_added: Comment added
668 label_comment_added: Comment added
668 label_comment_delete: Delete comments
669 label_comment_delete: Delete comments
669 label_query: Custom query
670 label_query: Custom query
670 label_query_plural: Custom queries
671 label_query_plural: Custom queries
671 label_query_new: New query
672 label_query_new: New query
672 label_my_queries: My custom queries
673 label_my_queries: My custom queries
673 label_filter_add: Add filter
674 label_filter_add: Add filter
674 label_filter_plural: Filters
675 label_filter_plural: Filters
675 label_equals: is
676 label_equals: is
676 label_not_equals: is not
677 label_not_equals: is not
677 label_in_less_than: in less than
678 label_in_less_than: in less than
678 label_in_more_than: in more than
679 label_in_more_than: in more than
679 label_in_the_next_days: in the next
680 label_in_the_next_days: in the next
680 label_in_the_past_days: in the past
681 label_in_the_past_days: in the past
681 label_greater_or_equal: '>='
682 label_greater_or_equal: '>='
682 label_less_or_equal: '<='
683 label_less_or_equal: '<='
683 label_between: between
684 label_between: between
684 label_in: in
685 label_in: in
685 label_today: today
686 label_today: today
686 label_all_time: all time
687 label_all_time: all time
687 label_yesterday: yesterday
688 label_yesterday: yesterday
688 label_this_week: this week
689 label_this_week: this week
689 label_last_week: last week
690 label_last_week: last week
690 label_last_n_weeks: "last %{count} weeks"
691 label_last_n_weeks: "last %{count} weeks"
691 label_last_n_days: "last %{count} days"
692 label_last_n_days: "last %{count} days"
692 label_this_month: this month
693 label_this_month: this month
693 label_last_month: last month
694 label_last_month: last month
694 label_this_year: this year
695 label_this_year: this year
695 label_date_range: Date range
696 label_date_range: Date range
696 label_less_than_ago: less than days ago
697 label_less_than_ago: less than days ago
697 label_more_than_ago: more than days ago
698 label_more_than_ago: more than days ago
698 label_ago: days ago
699 label_ago: days ago
699 label_contains: contains
700 label_contains: contains
700 label_not_contains: doesn't contain
701 label_not_contains: doesn't contain
701 label_any_issues_in_project: any issues in project
702 label_any_issues_in_project: any issues in project
702 label_any_issues_not_in_project: any issues not in project
703 label_any_issues_not_in_project: any issues not in project
703 label_no_issues_in_project: no issues in project
704 label_no_issues_in_project: no issues in project
704 label_day_plural: days
705 label_day_plural: days
705 label_repository: Repository
706 label_repository: Repository
706 label_repository_new: New repository
707 label_repository_new: New repository
707 label_repository_plural: Repositories
708 label_repository_plural: Repositories
708 label_browse: Browse
709 label_browse: Browse
709 label_branch: Branch
710 label_branch: Branch
710 label_tag: Tag
711 label_tag: Tag
711 label_revision: Revision
712 label_revision: Revision
712 label_revision_plural: Revisions
713 label_revision_plural: Revisions
713 label_revision_id: "Revision %{value}"
714 label_revision_id: "Revision %{value}"
714 label_associated_revisions: Associated revisions
715 label_associated_revisions: Associated revisions
715 label_added: added
716 label_added: added
716 label_modified: modified
717 label_modified: modified
717 label_copied: copied
718 label_copied: copied
718 label_renamed: renamed
719 label_renamed: renamed
719 label_deleted: deleted
720 label_deleted: deleted
720 label_latest_revision: Latest revision
721 label_latest_revision: Latest revision
721 label_latest_revision_plural: Latest revisions
722 label_latest_revision_plural: Latest revisions
722 label_view_revisions: View revisions
723 label_view_revisions: View revisions
723 label_view_all_revisions: View all revisions
724 label_view_all_revisions: View all revisions
724 label_max_size: Maximum size
725 label_max_size: Maximum size
725 label_sort_highest: Move to top
726 label_sort_highest: Move to top
726 label_sort_higher: Move up
727 label_sort_higher: Move up
727 label_sort_lower: Move down
728 label_sort_lower: Move down
728 label_sort_lowest: Move to bottom
729 label_sort_lowest: Move to bottom
729 label_roadmap: Roadmap
730 label_roadmap: Roadmap
730 label_roadmap_due_in: "Due in %{value}"
731 label_roadmap_due_in: "Due in %{value}"
731 label_roadmap_overdue: "%{value} late"
732 label_roadmap_overdue: "%{value} late"
732 label_roadmap_no_issues: No issues for this version
733 label_roadmap_no_issues: No issues for this version
733 label_search: Search
734 label_search: Search
734 label_result_plural: Results
735 label_result_plural: Results
735 label_all_words: All words
736 label_all_words: All words
736 label_wiki: Wiki
737 label_wiki: Wiki
737 label_wiki_edit: Wiki edit
738 label_wiki_edit: Wiki edit
738 label_wiki_edit_plural: Wiki edits
739 label_wiki_edit_plural: Wiki edits
739 label_wiki_page: Wiki page
740 label_wiki_page: Wiki page
740 label_wiki_page_plural: Wiki pages
741 label_wiki_page_plural: Wiki pages
741 label_index_by_title: Index by title
742 label_index_by_title: Index by title
742 label_index_by_date: Index by date
743 label_index_by_date: Index by date
743 label_current_version: Current version
744 label_current_version: Current version
744 label_preview: Preview
745 label_preview: Preview
745 label_feed_plural: Feeds
746 label_feed_plural: Feeds
746 label_changes_details: Details of all changes
747 label_changes_details: Details of all changes
747 label_issue_tracking: Issue tracking
748 label_issue_tracking: Issue tracking
748 label_spent_time: Spent time
749 label_spent_time: Spent time
749 label_overall_spent_time: Overall spent time
750 label_overall_spent_time: Overall spent time
750 label_f_hour: "%{value} hour"
751 label_f_hour: "%{value} hour"
751 label_f_hour_plural: "%{value} hours"
752 label_f_hour_plural: "%{value} hours"
752 label_time_tracking: Time tracking
753 label_time_tracking: Time tracking
753 label_change_plural: Changes
754 label_change_plural: Changes
754 label_statistics: Statistics
755 label_statistics: Statistics
755 label_commits_per_month: Commits per month
756 label_commits_per_month: Commits per month
756 label_commits_per_author: Commits per author
757 label_commits_per_author: Commits per author
757 label_diff: diff
758 label_diff: diff
758 label_view_diff: View differences
759 label_view_diff: View differences
759 label_diff_inline: inline
760 label_diff_inline: inline
760 label_diff_side_by_side: side by side
761 label_diff_side_by_side: side by side
761 label_options: Options
762 label_options: Options
762 label_copy_workflow_from: Copy workflow from
763 label_copy_workflow_from: Copy workflow from
763 label_permissions_report: Permissions report
764 label_permissions_report: Permissions report
764 label_watched_issues: Watched issues
765 label_watched_issues: Watched issues
765 label_related_issues: Related issues
766 label_related_issues: Related issues
766 label_applied_status: Applied status
767 label_applied_status: Applied status
767 label_loading: Loading...
768 label_loading: Loading...
768 label_relation_new: New relation
769 label_relation_new: New relation
769 label_relation_delete: Delete relation
770 label_relation_delete: Delete relation
770 label_relates_to: Related to
771 label_relates_to: Related to
771 label_duplicates: Duplicates
772 label_duplicates: Duplicates
772 label_duplicated_by: Duplicated by
773 label_duplicated_by: Duplicated by
773 label_blocks: Blocks
774 label_blocks: Blocks
774 label_blocked_by: Blocked by
775 label_blocked_by: Blocked by
775 label_precedes: Precedes
776 label_precedes: Precedes
776 label_follows: Follows
777 label_follows: Follows
777 label_copied_to: Copied to
778 label_copied_to: Copied to
778 label_copied_from: Copied from
779 label_copied_from: Copied from
779 label_end_to_start: end to start
780 label_end_to_start: end to start
780 label_end_to_end: end to end
781 label_end_to_end: end to end
781 label_start_to_start: start to start
782 label_start_to_start: start to start
782 label_start_to_end: start to end
783 label_start_to_end: start to end
783 label_stay_logged_in: Stay logged in
784 label_stay_logged_in: Stay logged in
784 label_disabled: disabled
785 label_disabled: disabled
785 label_show_completed_versions: Show completed versions
786 label_show_completed_versions: Show completed versions
786 label_me: me
787 label_me: me
787 label_board: Forum
788 label_board: Forum
788 label_board_new: New forum
789 label_board_new: New forum
789 label_board_plural: Forums
790 label_board_plural: Forums
790 label_board_locked: Locked
791 label_board_locked: Locked
791 label_board_sticky: Sticky
792 label_board_sticky: Sticky
792 label_topic_plural: Topics
793 label_topic_plural: Topics
793 label_message_plural: Messages
794 label_message_plural: Messages
794 label_message_last: Last message
795 label_message_last: Last message
795 label_message_new: New message
796 label_message_new: New message
796 label_message_posted: Message added
797 label_message_posted: Message added
797 label_reply_plural: Replies
798 label_reply_plural: Replies
798 label_send_information: Send account information to the user
799 label_send_information: Send account information to the user
799 label_year: Year
800 label_year: Year
800 label_month: Month
801 label_month: Month
801 label_week: Week
802 label_week: Week
802 label_date_from: From
803 label_date_from: From
803 label_date_to: To
804 label_date_to: To
804 label_language_based: Based on user's language
805 label_language_based: Based on user's language
805 label_sort_by: "Sort by %{value}"
806 label_sort_by: "Sort by %{value}"
806 label_send_test_email: Send a test email
807 label_send_test_email: Send a test email
807 label_feeds_access_key: Atom access key
808 label_feeds_access_key: Atom access key
808 label_missing_feeds_access_key: Missing a Atom access key
809 label_missing_feeds_access_key: Missing a Atom access key
809 label_feeds_access_key_created_on: "Atom access key created %{value} ago"
810 label_feeds_access_key_created_on: "Atom access key created %{value} ago"
810 label_module_plural: Modules
811 label_module_plural: Modules
811 label_added_time_by: "Added by %{author} %{age} ago"
812 label_added_time_by: "Added by %{author} %{age} ago"
812 label_updated_time_by: "Updated by %{author} %{age} ago"
813 label_updated_time_by: "Updated by %{author} %{age} ago"
813 label_updated_time: "Updated %{value} ago"
814 label_updated_time: "Updated %{value} ago"
814 label_jump_to_a_project: Jump to a project...
815 label_jump_to_a_project: Jump to a project...
815 label_file_plural: Files
816 label_file_plural: Files
816 label_changeset_plural: Changesets
817 label_changeset_plural: Changesets
817 label_default_columns: Default columns
818 label_default_columns: Default columns
818 label_no_change_option: (No change)
819 label_no_change_option: (No change)
819 label_bulk_edit_selected_issues: Bulk edit selected issues
820 label_bulk_edit_selected_issues: Bulk edit selected issues
820 label_bulk_edit_selected_time_entries: Bulk edit selected time entries
821 label_bulk_edit_selected_time_entries: Bulk edit selected time entries
821 label_theme: Theme
822 label_theme: Theme
822 label_default: Default
823 label_default: Default
823 label_search_titles_only: Search titles only
824 label_search_titles_only: Search titles only
824 label_user_mail_option_all: "For any event on all my projects"
825 label_user_mail_option_all: "For any event on all my projects"
825 label_user_mail_option_selected: "For any event on the selected projects only..."
826 label_user_mail_option_selected: "For any event on the selected projects only..."
826 label_user_mail_option_none: "No events"
827 label_user_mail_option_none: "No events"
827 label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in"
828 label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in"
828 label_user_mail_option_only_assigned: "Only for things I am assigned to"
829 label_user_mail_option_only_assigned: "Only for things I am assigned to"
829 label_user_mail_option_only_owner: "Only for things I am the owner of"
830 label_user_mail_option_only_owner: "Only for things I am the owner of"
830 label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
831 label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
831 label_registration_activation_by_email: account activation by email
832 label_registration_activation_by_email: account activation by email
832 label_registration_manual_activation: manual account activation
833 label_registration_manual_activation: manual account activation
833 label_registration_automatic_activation: automatic account activation
834 label_registration_automatic_activation: automatic account activation
834 label_display_per_page: "Per page: %{value}"
835 label_display_per_page: "Per page: %{value}"
835 label_age: Age
836 label_age: Age
836 label_change_properties: Change properties
837 label_change_properties: Change properties
837 label_general: General
838 label_general: General
838 label_more: More
839 label_more: More
839 label_scm: SCM
840 label_scm: SCM
840 label_plugins: Plugins
841 label_plugins: Plugins
841 label_ldap_authentication: LDAP authentication
842 label_ldap_authentication: LDAP authentication
842 label_downloads_abbr: D/L
843 label_downloads_abbr: D/L
843 label_optional_description: Optional description
844 label_optional_description: Optional description
844 label_add_another_file: Add another file
845 label_add_another_file: Add another file
845 label_preferences: Preferences
846 label_preferences: Preferences
846 label_chronological_order: In chronological order
847 label_chronological_order: In chronological order
847 label_reverse_chronological_order: In reverse chronological order
848 label_reverse_chronological_order: In reverse chronological order
848 label_planning: Planning
849 label_planning: Planning
849 label_incoming_emails: Incoming emails
850 label_incoming_emails: Incoming emails
850 label_generate_key: Generate a key
851 label_generate_key: Generate a key
851 label_issue_watchers: Watchers
852 label_issue_watchers: Watchers
852 label_example: Example
853 label_example: Example
853 label_display: Display
854 label_display: Display
854 label_sort: Sort
855 label_sort: Sort
855 label_ascending: Ascending
856 label_ascending: Ascending
856 label_descending: Descending
857 label_descending: Descending
857 label_date_from_to: From %{start} to %{end}
858 label_date_from_to: From %{start} to %{end}
858 label_wiki_content_added: Wiki page added
859 label_wiki_content_added: Wiki page added
859 label_wiki_content_updated: Wiki page updated
860 label_wiki_content_updated: Wiki page updated
860 label_group: Group
861 label_group: Group
861 label_group_plural: Groups
862 label_group_plural: Groups
862 label_group_new: New group
863 label_group_new: New group
863 label_group_anonymous: Anonymous users
864 label_group_anonymous: Anonymous users
864 label_group_non_member: Non member users
865 label_group_non_member: Non member users
865 label_time_entry_plural: Spent time
866 label_time_entry_plural: Spent time
866 label_version_sharing_none: Not shared
867 label_version_sharing_none: Not shared
867 label_version_sharing_descendants: With subprojects
868 label_version_sharing_descendants: With subprojects
868 label_version_sharing_hierarchy: With project hierarchy
869 label_version_sharing_hierarchy: With project hierarchy
869 label_version_sharing_tree: With project tree
870 label_version_sharing_tree: With project tree
870 label_version_sharing_system: With all projects
871 label_version_sharing_system: With all projects
871 label_update_issue_done_ratios: Update issue done ratios
872 label_update_issue_done_ratios: Update issue done ratios
872 label_copy_source: Source
873 label_copy_source: Source
873 label_copy_target: Target
874 label_copy_target: Target
874 label_copy_same_as_target: Same as target
875 label_copy_same_as_target: Same as target
875 label_display_used_statuses_only: Only display statuses that are used by this tracker
876 label_display_used_statuses_only: Only display statuses that are used by this tracker
876 label_api_access_key: API access key
877 label_api_access_key: API access key
877 label_missing_api_access_key: Missing an API access key
878 label_missing_api_access_key: Missing an API access key
878 label_api_access_key_created_on: "API access key created %{value} ago"
879 label_api_access_key_created_on: "API access key created %{value} ago"
879 label_profile: Profile
880 label_profile: Profile
880 label_subtask_plural: Subtasks
881 label_subtask_plural: Subtasks
881 label_project_copy_notifications: Send email notifications during the project copy
882 label_project_copy_notifications: Send email notifications during the project copy
882 label_principal_search: "Search for user or group:"
883 label_principal_search: "Search for user or group:"
883 label_user_search: "Search for user:"
884 label_user_search: "Search for user:"
884 label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
885 label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
885 label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
886 label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
886 label_issues_visibility_all: All issues
887 label_issues_visibility_all: All issues
887 label_issues_visibility_public: All non private issues
888 label_issues_visibility_public: All non private issues
888 label_issues_visibility_own: Issues created by or assigned to the user
889 label_issues_visibility_own: Issues created by or assigned to the user
889 label_git_report_last_commit: Report last commit for files and directories
890 label_git_report_last_commit: Report last commit for files and directories
890 label_parent_revision: Parent
891 label_parent_revision: Parent
891 label_child_revision: Child
892 label_child_revision: Child
892 label_export_options: "%{export_format} export options"
893 label_export_options: "%{export_format} export options"
893 label_copy_attachments: Copy attachments
894 label_copy_attachments: Copy attachments
894 label_copy_subtasks: Copy subtasks
895 label_copy_subtasks: Copy subtasks
895 label_item_position: "%{position} of %{count}"
896 label_item_position: "%{position} of %{count}"
896 label_completed_versions: Completed versions
897 label_completed_versions: Completed versions
897 label_search_for_watchers: Search for watchers to add
898 label_search_for_watchers: Search for watchers to add
898 label_session_expiration: Session expiration
899 label_session_expiration: Session expiration
899 label_show_closed_projects: View closed projects
900 label_show_closed_projects: View closed projects
900 label_status_transitions: Status transitions
901 label_status_transitions: Status transitions
901 label_fields_permissions: Fields permissions
902 label_fields_permissions: Fields permissions
902 label_readonly: Read-only
903 label_readonly: Read-only
903 label_required: Required
904 label_required: Required
904 label_hidden: Hidden
905 label_hidden: Hidden
905 label_attribute_of_project: "Project's %{name}"
906 label_attribute_of_project: "Project's %{name}"
906 label_attribute_of_issue: "Issue's %{name}"
907 label_attribute_of_issue: "Issue's %{name}"
907 label_attribute_of_author: "Author's %{name}"
908 label_attribute_of_author: "Author's %{name}"
908 label_attribute_of_assigned_to: "Assignee's %{name}"
909 label_attribute_of_assigned_to: "Assignee's %{name}"
909 label_attribute_of_user: "User's %{name}"
910 label_attribute_of_user: "User's %{name}"
910 label_attribute_of_fixed_version: "Target version's %{name}"
911 label_attribute_of_fixed_version: "Target version's %{name}"
911 label_cross_project_descendants: With subprojects
912 label_cross_project_descendants: With subprojects
912 label_cross_project_tree: With project tree
913 label_cross_project_tree: With project tree
913 label_cross_project_hierarchy: With project hierarchy
914 label_cross_project_hierarchy: With project hierarchy
914 label_cross_project_system: With all projects
915 label_cross_project_system: With all projects
915 label_gantt_progress_line: Progress line
916 label_gantt_progress_line: Progress line
916 label_visibility_private: to me only
917 label_visibility_private: to me only
917 label_visibility_roles: to these roles only
918 label_visibility_roles: to these roles only
918 label_visibility_public: to any users
919 label_visibility_public: to any users
919 label_link: Link
920 label_link: Link
920 label_only: only
921 label_only: only
921 label_drop_down_list: drop-down list
922 label_drop_down_list: drop-down list
922 label_checkboxes: checkboxes
923 label_checkboxes: checkboxes
923 label_radio_buttons: radio buttons
924 label_radio_buttons: radio buttons
924 label_link_values_to: Link values to URL
925 label_link_values_to: Link values to URL
925 label_custom_field_select_type: Select the type of object to which the custom field is to be attached
926 label_custom_field_select_type: Select the type of object to which the custom field is to be attached
926 label_check_for_updates: Check for updates
927 label_check_for_updates: Check for updates
927 label_latest_compatible_version: Latest compatible version
928 label_latest_compatible_version: Latest compatible version
928 label_unknown_plugin: Unknown plugin
929 label_unknown_plugin: Unknown plugin
929 label_add_projects: Add projects
930 label_add_projects: Add projects
930 label_users_visibility_all: All active users
931 label_users_visibility_all: All active users
931 label_users_visibility_members_of_visible_projects: Members of visible projects
932 label_users_visibility_members_of_visible_projects: Members of visible projects
932 label_edit_attachments: Edit attached files
933 label_edit_attachments: Edit attached files
933 label_link_copied_issue: Link copied issue
934 label_link_copied_issue: Link copied issue
934 label_ask: Ask
935 label_ask: Ask
935 label_search_attachments_yes: Search attachment filenames and descriptions
936 label_search_attachments_yes: Search attachment filenames and descriptions
936 label_search_attachments_no: Do not search attachments
937 label_search_attachments_no: Do not search attachments
937 label_search_attachments_only: Search attachments only
938 label_search_attachments_only: Search attachments only
938 label_search_open_issues_only: Open issues only
939 label_search_open_issues_only: Open issues only
939 label_email_address_plural: Emails
940 label_email_address_plural: Emails
940 label_email_address_add: Add email address
941 label_email_address_add: Add email address
941 label_enable_notifications: Enable notifications
942 label_enable_notifications: Enable notifications
942 label_disable_notifications: Disable notifications
943 label_disable_notifications: Disable notifications
943 label_blank_value: blank
944 label_blank_value: blank
944 label_parent_task_attributes: Parent tasks attributes
945 label_parent_task_attributes: Parent tasks attributes
945 label_parent_task_attributes_derived: Calculated from subtasks
946 label_parent_task_attributes_derived: Calculated from subtasks
946 label_parent_task_attributes_independent: Independent of subtasks
947 label_parent_task_attributes_independent: Independent of subtasks
947
948
948 button_login: Login
949 button_login: Login
949 button_submit: Submit
950 button_submit: Submit
950 button_save: Save
951 button_save: Save
951 button_check_all: Check all
952 button_check_all: Check all
952 button_uncheck_all: Uncheck all
953 button_uncheck_all: Uncheck all
953 button_collapse_all: Collapse all
954 button_collapse_all: Collapse all
954 button_expand_all: Expand all
955 button_expand_all: Expand all
955 button_delete: Delete
956 button_delete: Delete
956 button_create: Create
957 button_create: Create
957 button_create_and_continue: Create and continue
958 button_create_and_continue: Create and continue
958 button_test: Test
959 button_test: Test
959 button_edit: Edit
960 button_edit: Edit
960 button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
961 button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
961 button_add: Add
962 button_add: Add
962 button_change: Change
963 button_change: Change
963 button_apply: Apply
964 button_apply: Apply
964 button_clear: Clear
965 button_clear: Clear
965 button_lock: Lock
966 button_lock: Lock
966 button_unlock: Unlock
967 button_unlock: Unlock
967 button_download: Download
968 button_download: Download
968 button_list: List
969 button_list: List
969 button_view: View
970 button_view: View
970 button_move: Move
971 button_move: Move
971 button_move_and_follow: Move and follow
972 button_move_and_follow: Move and follow
972 button_back: Back
973 button_back: Back
973 button_cancel: Cancel
974 button_cancel: Cancel
974 button_activate: Activate
975 button_activate: Activate
975 button_sort: Sort
976 button_sort: Sort
976 button_log_time: Log time
977 button_log_time: Log time
977 button_rollback: Rollback to this version
978 button_rollback: Rollback to this version
978 button_watch: Watch
979 button_watch: Watch
979 button_unwatch: Unwatch
980 button_unwatch: Unwatch
980 button_reply: Reply
981 button_reply: Reply
981 button_archive: Archive
982 button_archive: Archive
982 button_unarchive: Unarchive
983 button_unarchive: Unarchive
983 button_reset: Reset
984 button_reset: Reset
984 button_rename: Rename
985 button_rename: Rename
985 button_change_password: Change password
986 button_change_password: Change password
986 button_copy: Copy
987 button_copy: Copy
987 button_copy_and_follow: Copy and follow
988 button_copy_and_follow: Copy and follow
988 button_annotate: Annotate
989 button_annotate: Annotate
989 button_update: Update
990 button_update: Update
990 button_configure: Configure
991 button_configure: Configure
991 button_quote: Quote
992 button_quote: Quote
992 button_duplicate: Duplicate
993 button_duplicate: Duplicate
993 button_show: Show
994 button_show: Show
994 button_hide: Hide
995 button_hide: Hide
995 button_edit_section: Edit this section
996 button_edit_section: Edit this section
996 button_export: Export
997 button_export: Export
997 button_delete_my_account: Delete my account
998 button_delete_my_account: Delete my account
998 button_close: Close
999 button_close: Close
999 button_reopen: Reopen
1000 button_reopen: Reopen
1000
1001
1001 status_active: active
1002 status_active: active
1002 status_registered: registered
1003 status_registered: registered
1003 status_locked: locked
1004 status_locked: locked
1004
1005
1005 project_status_active: active
1006 project_status_active: active
1006 project_status_closed: closed
1007 project_status_closed: closed
1007 project_status_archived: archived
1008 project_status_archived: archived
1008
1009
1009 version_status_open: open
1010 version_status_open: open
1010 version_status_locked: locked
1011 version_status_locked: locked
1011 version_status_closed: closed
1012 version_status_closed: closed
1012
1013
1013 field_active: Active
1014 field_active: Active
1014
1015
1015 text_select_mail_notifications: Select actions for which email notifications should be sent.
1016 text_select_mail_notifications: Select actions for which email notifications should be sent.
1016 text_regexp_info: eg. ^[A-Z0-9]+$
1017 text_regexp_info: eg. ^[A-Z0-9]+$
1017 text_min_max_length_info: 0 means no restriction
1018 text_min_max_length_info: 0 means no restriction
1018 text_project_destroy_confirmation: Are you sure you want to delete this project and related data?
1019 text_project_destroy_confirmation: Are you sure you want to delete this project and related data?
1019 text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted."
1020 text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted."
1020 text_workflow_edit: Select a role and a tracker to edit the workflow
1021 text_workflow_edit: Select a role and a tracker to edit the workflow
1021 text_are_you_sure: Are you sure?
1022 text_are_you_sure: Are you sure?
1022 text_journal_changed: "%{label} changed from %{old} to %{new}"
1023 text_journal_changed: "%{label} changed from %{old} to %{new}"
1023 text_journal_changed_no_detail: "%{label} updated"
1024 text_journal_changed_no_detail: "%{label} updated"
1024 text_journal_set_to: "%{label} set to %{value}"
1025 text_journal_set_to: "%{label} set to %{value}"
1025 text_journal_deleted: "%{label} deleted (%{old})"
1026 text_journal_deleted: "%{label} deleted (%{old})"
1026 text_journal_added: "%{label} %{value} added"
1027 text_journal_added: "%{label} %{value} added"
1027 text_tip_issue_begin_day: issue beginning this day
1028 text_tip_issue_begin_day: issue beginning this day
1028 text_tip_issue_end_day: issue ending this day
1029 text_tip_issue_end_day: issue ending this day
1029 text_tip_issue_begin_end_day: issue beginning and ending this day
1030 text_tip_issue_begin_end_day: issue beginning and ending this day
1030 text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.<br />Once saved, the identifier cannot be changed.'
1031 text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.<br />Once saved, the identifier cannot be changed.'
1031 text_caracters_maximum: "%{count} characters maximum."
1032 text_caracters_maximum: "%{count} characters maximum."
1032 text_caracters_minimum: "Must be at least %{count} characters long."
1033 text_caracters_minimum: "Must be at least %{count} characters long."
1033 text_length_between: "Length between %{min} and %{max} characters."
1034 text_length_between: "Length between %{min} and %{max} characters."
1034 text_tracker_no_workflow: No workflow defined for this tracker
1035 text_tracker_no_workflow: No workflow defined for this tracker
1035 text_unallowed_characters: Unallowed characters
1036 text_unallowed_characters: Unallowed characters
1036 text_comma_separated: Multiple values allowed (comma separated).
1037 text_comma_separated: Multiple values allowed (comma separated).
1037 text_line_separated: Multiple values allowed (one line for each value).
1038 text_line_separated: Multiple values allowed (one line for each value).
1038 text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
1039 text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
1039 text_issue_added: "Issue %{id} has been reported by %{author}."
1040 text_issue_added: "Issue %{id} has been reported by %{author}."
1040 text_issue_updated: "Issue %{id} has been updated by %{author}."
1041 text_issue_updated: "Issue %{id} has been updated by %{author}."
1041 text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content?
1042 text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content?
1042 text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?"
1043 text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?"
1043 text_issue_category_destroy_assignments: Remove category assignments
1044 text_issue_category_destroy_assignments: Remove category assignments
1044 text_issue_category_reassign_to: Reassign issues to this category
1045 text_issue_category_reassign_to: Reassign issues to this category
1045 text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
1046 text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
1046 text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
1047 text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
1047 text_load_default_configuration: Load the default configuration
1048 text_load_default_configuration: Load the default configuration
1048 text_status_changed_by_changeset: "Applied in changeset %{value}."
1049 text_status_changed_by_changeset: "Applied in changeset %{value}."
1049 text_time_logged_by_changeset: "Applied in changeset %{value}."
1050 text_time_logged_by_changeset: "Applied in changeset %{value}."
1050 text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?'
1051 text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?'
1051 text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)."
1052 text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)."
1052 text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?'
1053 text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?'
1053 text_select_project_modules: 'Select modules to enable for this project:'
1054 text_select_project_modules: 'Select modules to enable for this project:'
1054 text_default_administrator_account_changed: Default administrator account changed
1055 text_default_administrator_account_changed: Default administrator account changed
1055 text_file_repository_writable: Attachments directory writable
1056 text_file_repository_writable: Attachments directory writable
1056 text_plugin_assets_writable: Plugin assets directory writable
1057 text_plugin_assets_writable: Plugin assets directory writable
1057 text_rmagick_available: RMagick available (optional)
1058 text_rmagick_available: RMagick available (optional)
1058 text_convert_available: ImageMagick convert available (optional)
1059 text_convert_available: ImageMagick convert available (optional)
1059 text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?"
1060 text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?"
1060 text_destroy_time_entries: Delete reported hours
1061 text_destroy_time_entries: Delete reported hours
1061 text_assign_time_entries_to_project: Assign reported hours to the project
1062 text_assign_time_entries_to_project: Assign reported hours to the project
1062 text_reassign_time_entries: 'Reassign reported hours to this issue:'
1063 text_reassign_time_entries: 'Reassign reported hours to this issue:'
1063 text_user_wrote: "%{value} wrote:"
1064 text_user_wrote: "%{value} wrote:"
1064 text_enumeration_destroy_question: "%{count} objects are assigned to this value."
1065 text_enumeration_destroy_question: "%{count} objects are assigned to this value."
1065 text_enumeration_category_reassign_to: 'Reassign them to this value:'
1066 text_enumeration_category_reassign_to: 'Reassign them to this value:'
1066 text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them."
1067 text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them."
1067 text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
1068 text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
1068 text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
1069 text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
1069 text_custom_field_possible_values_info: 'One line for each value'
1070 text_custom_field_possible_values_info: 'One line for each value'
1070 text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?"
1071 text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?"
1071 text_wiki_page_nullify_children: "Keep child pages as root pages"
1072 text_wiki_page_nullify_children: "Keep child pages as root pages"
1072 text_wiki_page_destroy_children: "Delete child pages and all their descendants"
1073 text_wiki_page_destroy_children: "Delete child pages and all their descendants"
1073 text_wiki_page_reassign_children: "Reassign child pages to this parent page"
1074 text_wiki_page_reassign_children: "Reassign child pages to this parent page"
1074 text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
1075 text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
1075 text_zoom_in: Zoom in
1076 text_zoom_in: Zoom in
1076 text_zoom_out: Zoom out
1077 text_zoom_out: Zoom out
1077 text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page."
1078 text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page."
1078 text_scm_path_encoding_note: "Default: UTF-8"
1079 text_scm_path_encoding_note: "Default: UTF-8"
1079 text_subversion_repository_note: "Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://"
1080 text_subversion_repository_note: "Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://"
1080 text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
1081 text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
1081 text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
1082 text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
1082 text_scm_command: Command
1083 text_scm_command: Command
1083 text_scm_command_version: Version
1084 text_scm_command_version: Version
1084 text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it.
1085 text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it.
1085 text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel.
1086 text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel.
1086 text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)"
1087 text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)"
1087 text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
1088 text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
1088 text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
1089 text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
1089 text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
1090 text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
1090 text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
1091 text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
1091 text_project_closed: This project is closed and read-only.
1092 text_project_closed: This project is closed and read-only.
1092 text_turning_multiple_off: "If you disable multiple values, multiple values will be removed in order to preserve only one value per item."
1093 text_turning_multiple_off: "If you disable multiple values, multiple values will be removed in order to preserve only one value per item."
1093
1094
1094 default_role_manager: Manager
1095 default_role_manager: Manager
1095 default_role_developer: Developer
1096 default_role_developer: Developer
1096 default_role_reporter: Reporter
1097 default_role_reporter: Reporter
1097 default_tracker_bug: Bug
1098 default_tracker_bug: Bug
1098 default_tracker_feature: Feature
1099 default_tracker_feature: Feature
1099 default_tracker_support: Support
1100 default_tracker_support: Support
1100 default_issue_status_new: New
1101 default_issue_status_new: New
1101 default_issue_status_in_progress: In Progress
1102 default_issue_status_in_progress: In Progress
1102 default_issue_status_resolved: Resolved
1103 default_issue_status_resolved: Resolved
1103 default_issue_status_feedback: Feedback
1104 default_issue_status_feedback: Feedback
1104 default_issue_status_closed: Closed
1105 default_issue_status_closed: Closed
1105 default_issue_status_rejected: Rejected
1106 default_issue_status_rejected: Rejected
1106 default_doc_category_user: User documentation
1107 default_doc_category_user: User documentation
1107 default_doc_category_tech: Technical documentation
1108 default_doc_category_tech: Technical documentation
1108 default_priority_low: Low
1109 default_priority_low: Low
1109 default_priority_normal: Normal
1110 default_priority_normal: Normal
1110 default_priority_high: High
1111 default_priority_high: High
1111 default_priority_urgent: Urgent
1112 default_priority_urgent: Urgent
1112 default_priority_immediate: Immediate
1113 default_priority_immediate: Immediate
1113 default_activity_design: Design
1114 default_activity_design: Design
1114 default_activity_development: Development
1115 default_activity_development: Development
1115
1116
1116 enumeration_issue_priorities: Issue priorities
1117 enumeration_issue_priorities: Issue priorities
1117 enumeration_doc_categories: Document categories
1118 enumeration_doc_categories: Document categories
1118 enumeration_activities: Activities (time tracking)
1119 enumeration_activities: Activities (time tracking)
1119 enumeration_system_activity: System Activity
1120 enumeration_system_activity: System Activity
1120 description_filter: Filter
1121 description_filter: Filter
1121 description_search: Searchfield
1122 description_search: Searchfield
1122 description_choose_project: Projects
1123 description_choose_project: Projects
1123 description_project_scope: Search scope
1124 description_project_scope: Search scope
1124 description_notes: Notes
1125 description_notes: Notes
1125 description_message_content: Message content
1126 description_message_content: Message content
1126 description_query_sort_criteria_attribute: Sort attribute
1127 description_query_sort_criteria_attribute: Sort attribute
1127 description_query_sort_criteria_direction: Sort direction
1128 description_query_sort_criteria_direction: Sort direction
1128 description_user_mail_notification: Mail notification settings
1129 description_user_mail_notification: Mail notification settings
1129 description_available_columns: Available Columns
1130 description_available_columns: Available Columns
1130 description_selected_columns: Selected Columns
1131 description_selected_columns: Selected Columns
1131 description_all_columns: All Columns
1132 description_all_columns: All Columns
1132 description_issue_category_reassign: Choose issue category
1133 description_issue_category_reassign: Choose issue category
1133 description_wiki_subpages_reassign: Choose new parent page
1134 description_wiki_subpages_reassign: Choose new parent page
1134 description_date_range_list: Choose range from list
1135 description_date_range_list: Choose range from list
1135 description_date_range_interval: Choose range by selecting start and end date
1136 description_date_range_interval: Choose range by selecting start and end date
1136 description_date_from: Enter start date
1137 description_date_from: Enter start date
1137 description_date_to: Enter end date
1138 description_date_to: Enter end date
1138 text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.'
1139 text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.'
@@ -1,1156 +1,1159
1 # French translations for Ruby on Rails
1 # French translations for Ruby on Rails
2 # by Christian Lescuyer (christian@flyingcoders.com)
2 # by Christian Lescuyer (christian@flyingcoders.com)
3 # contributor: Sebastien Grosjean - ZenCocoon.com
3 # contributor: Sebastien Grosjean - ZenCocoon.com
4 # contributor: Thibaut Cuvelier - Developpez.com
4 # contributor: Thibaut Cuvelier - Developpez.com
5
5
6 fr:
6 fr:
7 direction: ltr
7 direction: ltr
8 date:
8 date:
9 formats:
9 formats:
10 default: "%d/%m/%Y"
10 default: "%d/%m/%Y"
11 short: "%e %b"
11 short: "%e %b"
12 long: "%e %B %Y"
12 long: "%e %B %Y"
13 long_ordinal: "%e %B %Y"
13 long_ordinal: "%e %B %Y"
14 only_day: "%e"
14 only_day: "%e"
15
15
16 day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
16 day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
17 abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
17 abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
18
18
19 # Don't forget the nil at the beginning; there's no such thing as a 0th month
19 # Don't forget the nil at the beginning; there's no such thing as a 0th month
20 month_names: [~, janvier, fΓ©vrier, mars, avril, mai, juin, juillet, aoΓ»t, septembre, octobre, novembre, dΓ©cembre]
20 month_names: [~, janvier, fΓ©vrier, mars, avril, mai, juin, juillet, aoΓ»t, septembre, octobre, novembre, dΓ©cembre]
21 abbr_month_names: [~, jan., fΓ©v., mar., avr., mai, juin, juil., aoΓ»t, sept., oct., nov., dΓ©c.]
21 abbr_month_names: [~, jan., fΓ©v., mar., avr., mai, juin, juil., aoΓ»t, sept., oct., nov., dΓ©c.]
22 # Used in date_select and datime_select.
22 # Used in date_select and datime_select.
23 order:
23 order:
24 - :day
24 - :day
25 - :month
25 - :month
26 - :year
26 - :year
27
27
28 time:
28 time:
29 formats:
29 formats:
30 default: "%d/%m/%Y %H:%M"
30 default: "%d/%m/%Y %H:%M"
31 time: "%H:%M"
31 time: "%H:%M"
32 short: "%d %b %H:%M"
32 short: "%d %b %H:%M"
33 long: "%A %d %B %Y %H:%M:%S %Z"
33 long: "%A %d %B %Y %H:%M:%S %Z"
34 long_ordinal: "%A %d %B %Y %H:%M:%S %Z"
34 long_ordinal: "%A %d %B %Y %H:%M:%S %Z"
35 only_second: "%S"
35 only_second: "%S"
36 am: 'am'
36 am: 'am'
37 pm: 'pm'
37 pm: 'pm'
38
38
39 datetime:
39 datetime:
40 distance_in_words:
40 distance_in_words:
41 half_a_minute: "30 secondes"
41 half_a_minute: "30 secondes"
42 less_than_x_seconds:
42 less_than_x_seconds:
43 zero: "moins d'une seconde"
43 zero: "moins d'une seconde"
44 one: "moins d'uneΒ seconde"
44 one: "moins d'uneΒ seconde"
45 other: "moins de %{count}Β secondes"
45 other: "moins de %{count}Β secondes"
46 x_seconds:
46 x_seconds:
47 one: "1Β seconde"
47 one: "1Β seconde"
48 other: "%{count}Β secondes"
48 other: "%{count}Β secondes"
49 less_than_x_minutes:
49 less_than_x_minutes:
50 zero: "moins d'une minute"
50 zero: "moins d'une minute"
51 one: "moins d'uneΒ minute"
51 one: "moins d'uneΒ minute"
52 other: "moins de %{count}Β minutes"
52 other: "moins de %{count}Β minutes"
53 x_minutes:
53 x_minutes:
54 one: "1Β minute"
54 one: "1Β minute"
55 other: "%{count}Β minutes"
55 other: "%{count}Β minutes"
56 about_x_hours:
56 about_x_hours:
57 one: "environ une heure"
57 one: "environ une heure"
58 other: "environ %{count}Β heures"
58 other: "environ %{count}Β heures"
59 x_hours:
59 x_hours:
60 one: "une heure"
60 one: "une heure"
61 other: "%{count}Β heures"
61 other: "%{count}Β heures"
62 x_days:
62 x_days:
63 one: "unΒ jour"
63 one: "unΒ jour"
64 other: "%{count}Β jours"
64 other: "%{count}Β jours"
65 about_x_months:
65 about_x_months:
66 one: "environ un mois"
66 one: "environ un mois"
67 other: "environ %{count}Β mois"
67 other: "environ %{count}Β mois"
68 x_months:
68 x_months:
69 one: "unΒ mois"
69 one: "unΒ mois"
70 other: "%{count}Β mois"
70 other: "%{count}Β mois"
71 about_x_years:
71 about_x_years:
72 one: "environ un an"
72 one: "environ un an"
73 other: "environ %{count}Β ans"
73 other: "environ %{count}Β ans"
74 over_x_years:
74 over_x_years:
75 one: "plus d'un an"
75 one: "plus d'un an"
76 other: "plus de %{count}Β ans"
76 other: "plus de %{count}Β ans"
77 almost_x_years:
77 almost_x_years:
78 one: "presqu'un an"
78 one: "presqu'un an"
79 other: "presque %{count} ans"
79 other: "presque %{count} ans"
80 prompts:
80 prompts:
81 year: "AnnΓ©e"
81 year: "AnnΓ©e"
82 month: "Mois"
82 month: "Mois"
83 day: "Jour"
83 day: "Jour"
84 hour: "Heure"
84 hour: "Heure"
85 minute: "Minute"
85 minute: "Minute"
86 second: "Seconde"
86 second: "Seconde"
87
87
88 number:
88 number:
89 format:
89 format:
90 precision: 3
90 precision: 3
91 separator: ','
91 separator: ','
92 delimiter: 'Β '
92 delimiter: 'Β '
93 currency:
93 currency:
94 format:
94 format:
95 unit: '€'
95 unit: '€'
96 precision: 2
96 precision: 2
97 format: '%nΒ %u'
97 format: '%nΒ %u'
98 human:
98 human:
99 format:
99 format:
100 precision: 3
100 precision: 3
101 storage_units:
101 storage_units:
102 format: "%n %u"
102 format: "%n %u"
103 units:
103 units:
104 byte:
104 byte:
105 one: "octet"
105 one: "octet"
106 other: "octets"
106 other: "octets"
107 kb: "ko"
107 kb: "ko"
108 mb: "Mo"
108 mb: "Mo"
109 gb: "Go"
109 gb: "Go"
110 tb: "To"
110 tb: "To"
111
111
112 support:
112 support:
113 array:
113 array:
114 sentence_connector: 'et'
114 sentence_connector: 'et'
115 skip_last_comma: true
115 skip_last_comma: true
116 word_connector: ", "
116 word_connector: ", "
117 two_words_connector: " et "
117 two_words_connector: " et "
118 last_word_connector: " et "
118 last_word_connector: " et "
119
119
120 activerecord:
120 activerecord:
121 errors:
121 errors:
122 template:
122 template:
123 header:
123 header:
124 one: "Impossible d'enregistrer %{model} : une erreur"
124 one: "Impossible d'enregistrer %{model} : une erreur"
125 other: "Impossible d'enregistrer %{model} : %{count} erreurs."
125 other: "Impossible d'enregistrer %{model} : %{count} erreurs."
126 body: "Veuillez vΓ©rifier les champs suivantsΒ :"
126 body: "Veuillez vΓ©rifier les champs suivantsΒ :"
127 messages:
127 messages:
128 inclusion: "n'est pas inclus(e) dans la liste"
128 inclusion: "n'est pas inclus(e) dans la liste"
129 exclusion: "n'est pas disponible"
129 exclusion: "n'est pas disponible"
130 invalid: "n'est pas valide"
130 invalid: "n'est pas valide"
131 confirmation: "ne concorde pas avec la confirmation"
131 confirmation: "ne concorde pas avec la confirmation"
132 accepted: "doit Γͺtre acceptΓ©(e)"
132 accepted: "doit Γͺtre acceptΓ©(e)"
133 empty: "doit Γͺtre renseignΓ©(e)"
133 empty: "doit Γͺtre renseignΓ©(e)"
134 blank: "doit Γͺtre renseignΓ©(e)"
134 blank: "doit Γͺtre renseignΓ©(e)"
135 too_long: "est trop long (pas plus de %{count} caractères)"
135 too_long: "est trop long (pas plus de %{count} caractères)"
136 too_short: "est trop court (au moins %{count} caractères)"
136 too_short: "est trop court (au moins %{count} caractères)"
137 wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
137 wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
138 taken: "est dΓ©jΓ  utilisΓ©"
138 taken: "est dΓ©jΓ  utilisΓ©"
139 not_a_number: "n'est pas un nombre"
139 not_a_number: "n'est pas un nombre"
140 not_a_date: "n'est pas une date valide"
140 not_a_date: "n'est pas une date valide"
141 greater_than: "doit Γͺtre supΓ©rieur Γ  %{count}"
141 greater_than: "doit Γͺtre supΓ©rieur Γ  %{count}"
142 greater_than_or_equal_to: "doit Γͺtre supΓ©rieur ou Γ©gal Γ  %{count}"
142 greater_than_or_equal_to: "doit Γͺtre supΓ©rieur ou Γ©gal Γ  %{count}"
143 equal_to: "doit Γͺtre Γ©gal Γ  %{count}"
143 equal_to: "doit Γͺtre Γ©gal Γ  %{count}"
144 less_than: "doit Γͺtre infΓ©rieur Γ  %{count}"
144 less_than: "doit Γͺtre infΓ©rieur Γ  %{count}"
145 less_than_or_equal_to: "doit Γͺtre infΓ©rieur ou Γ©gal Γ  %{count}"
145 less_than_or_equal_to: "doit Γͺtre infΓ©rieur ou Γ©gal Γ  %{count}"
146 odd: "doit Γͺtre impair"
146 odd: "doit Γͺtre impair"
147 even: "doit Γͺtre pair"
147 even: "doit Γͺtre pair"
148 greater_than_start_date: "doit Γͺtre postΓ©rieure Γ  la date de dΓ©but"
148 greater_than_start_date: "doit Γͺtre postΓ©rieure Γ  la date de dΓ©but"
149 not_same_project: "n'appartient pas au mΓͺme projet"
149 not_same_project: "n'appartient pas au mΓͺme projet"
150 circular_dependency: "Cette relation crΓ©erait une dΓ©pendance circulaire"
150 circular_dependency: "Cette relation crΓ©erait une dΓ©pendance circulaire"
151 cant_link_an_issue_with_a_descendant: "Une demande ne peut pas Γͺtre liΓ©e Γ  l'une de ses sous-tΓ’ches"
151 cant_link_an_issue_with_a_descendant: "Une demande ne peut pas Γͺtre liΓ©e Γ  l'une de ses sous-tΓ’ches"
152 earlier_than_minimum_start_date: "ne peut pas Γͺtre antΓ©rieure au %{date} Γ  cause des demandes qui prΓ©cΓ¨dent"
152 earlier_than_minimum_start_date: "ne peut pas Γͺtre antΓ©rieure au %{date} Γ  cause des demandes qui prΓ©cΓ¨dent"
153
153
154 actionview_instancetag_blank_option: Choisir
154 actionview_instancetag_blank_option: Choisir
155
155
156 general_text_No: 'Non'
156 general_text_No: 'Non'
157 general_text_Yes: 'Oui'
157 general_text_Yes: 'Oui'
158 general_text_no: 'non'
158 general_text_no: 'non'
159 general_text_yes: 'oui'
159 general_text_yes: 'oui'
160 general_lang_name: 'French (FranΓ§ais)'
160 general_lang_name: 'French (FranΓ§ais)'
161 general_csv_separator: ';'
161 general_csv_separator: ';'
162 general_csv_decimal_separator: ','
162 general_csv_decimal_separator: ','
163 general_csv_encoding: ISO-8859-1
163 general_csv_encoding: ISO-8859-1
164 general_pdf_fontname: freesans
164 general_pdf_fontname: freesans
165 general_first_day_of_week: '1'
165 general_first_day_of_week: '1'
166
166
167 notice_account_updated: Le compte a été mis à jour avec succès.
167 notice_account_updated: Le compte a été mis à jour avec succès.
168 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
168 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
169 notice_account_password_updated: Mot de passe mis à jour avec succès.
169 notice_account_password_updated: Mot de passe mis à jour avec succès.
170 notice_account_wrong_password: Mot de passe incorrect
170 notice_account_wrong_password: Mot de passe incorrect
171 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a Γ©tΓ© envoyΓ© Γ  l'adresse %{email}.
171 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a Γ©tΓ© envoyΓ© Γ  l'adresse %{email}.
172 notice_account_unknown_email: Aucun compte ne correspond Γ  cette adresse.
172 notice_account_unknown_email: Aucun compte ne correspond Γ  cette adresse.
173 notice_account_not_activated_yet: Vous n'avez pas encore activΓ© votre compte. Si vous voulez recevoir un nouveau message d'activation, veuillez <a href="%{url}">cliquer sur ce lien</a>.
173 notice_account_not_activated_yet: Vous n'avez pas encore activΓ© votre compte. Si vous voulez recevoir un nouveau message d'activation, veuillez <a href="%{url}">cliquer sur ce lien</a>.
174 notice_account_locked: Votre compte est verrouillΓ©.
174 notice_account_locked: Votre compte est verrouillΓ©.
175 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
175 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
176 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a Γ©tΓ© envoyΓ©.
176 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a Γ©tΓ© envoyΓ©.
177 notice_account_activated: Votre compte a Γ©tΓ© activΓ©. Vous pouvez Γ  prΓ©sent vous connecter.
177 notice_account_activated: Votre compte a Γ©tΓ© activΓ©. Vous pouvez Γ  prΓ©sent vous connecter.
178 notice_successful_create: Création effectuée avec succès.
178 notice_successful_create: Création effectuée avec succès.
179 notice_successful_update: Mise à jour effectuée avec succès.
179 notice_successful_update: Mise à jour effectuée avec succès.
180 notice_successful_delete: Suppression effectuée avec succès.
180 notice_successful_delete: Suppression effectuée avec succès.
181 notice_successful_connection: Connexion rΓ©ussie.
181 notice_successful_connection: Connexion rΓ©ussie.
182 notice_file_not_found: "La page Γ  laquelle vous souhaitez accΓ©der n'existe pas ou a Γ©tΓ© supprimΓ©e."
182 notice_file_not_found: "La page Γ  laquelle vous souhaitez accΓ©der n'existe pas ou a Γ©tΓ© supprimΓ©e."
183 notice_locking_conflict: Les donnΓ©es ont Γ©tΓ© mises Γ  jour par un autre utilisateur. Mise Γ  jour impossible.
183 notice_locking_conflict: Les donnΓ©es ont Γ©tΓ© mises Γ  jour par un autre utilisateur. Mise Γ  jour impossible.
184 notice_not_authorized: "Vous n'Γͺtes pas autorisΓ© Γ  accΓ©der Γ  cette page."
184 notice_not_authorized: "Vous n'Γͺtes pas autorisΓ© Γ  accΓ©der Γ  cette page."
185 notice_not_authorized_archived_project: Le projet auquel vous tentez d'accΓ©der a Γ©tΓ© archivΓ©.
185 notice_not_authorized_archived_project: Le projet auquel vous tentez d'accΓ©der a Γ©tΓ© archivΓ©.
186 notice_email_sent: "Un email a Γ©tΓ© envoyΓ© Γ  %{value}"
186 notice_email_sent: "Un email a Γ©tΓ© envoyΓ© Γ  %{value}"
187 notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
187 notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
188 notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée."
188 notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée."
189 notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
189 notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
190 notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sΓ©lectionnΓ©es n'ont pas pu Γͺtre mise(s) Γ  jour : %{ids}."
190 notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sΓ©lectionnΓ©es n'ont pas pu Γͺtre mise(s) Γ  jour : %{ids}."
191 notice_failed_to_save_time_entries: "%{count} temps passΓ©(s) sur les %{total} sΓ©lectionnΓ©s n'ont pas pu Γͺtre mis Γ  jour: %{ids}."
191 notice_failed_to_save_time_entries: "%{count} temps passΓ©(s) sur les %{total} sΓ©lectionnΓ©s n'ont pas pu Γͺtre mis Γ  jour: %{ids}."
192 notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
192 notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
193 notice_no_issue_selected: "Aucune demande sΓ©lectionnΓ©e ! Cochez les demandes que vous voulez mettre Γ  jour."
193 notice_no_issue_selected: "Aucune demande sΓ©lectionnΓ©e ! Cochez les demandes que vous voulez mettre Γ  jour."
194 notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur."
194 notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur."
195 notice_default_data_loaded: Paramétrage par défaut chargé avec succès.
195 notice_default_data_loaded: Paramétrage par défaut chargé avec succès.
196 notice_unable_delete_version: Impossible de supprimer cette version.
196 notice_unable_delete_version: Impossible de supprimer cette version.
197 notice_unable_delete_time_entry: Impossible de supprimer le temps passΓ©.
197 notice_unable_delete_time_entry: Impossible de supprimer le temps passΓ©.
198 notice_issue_done_ratios_updated: L'avancement des demandes a Γ©tΓ© mis Γ  jour.
198 notice_issue_done_ratios_updated: L'avancement des demandes a Γ©tΓ© mis Γ  jour.
199 notice_gantt_chart_truncated: "Le diagramme a Γ©tΓ© tronquΓ© car il excΓ¨de le nombre maximal d'Γ©lΓ©ments pouvant Γͺtre affichΓ©s (%{max})"
199 notice_gantt_chart_truncated: "Le diagramme a Γ©tΓ© tronquΓ© car il excΓ¨de le nombre maximal d'Γ©lΓ©ments pouvant Γͺtre affichΓ©s (%{max})"
200 notice_issue_successful_create: "Demande %{id} créée."
200 notice_issue_successful_create: "Demande %{id} créée."
201 notice_issue_update_conflict: "La demande a Γ©tΓ© mise Γ  jour par un autre utilisateur pendant que vous la modifiez."
201 notice_issue_update_conflict: "La demande a Γ©tΓ© mise Γ  jour par un autre utilisateur pendant que vous la modifiez."
202 notice_account_deleted: "Votre compte a Γ©tΓ© dΓ©finitivement supprimΓ©."
202 notice_account_deleted: "Votre compte a Γ©tΓ© dΓ©finitivement supprimΓ©."
203 notice_user_successful_create: "Utilisateur %{id} créé."
203 notice_user_successful_create: "Utilisateur %{id} créé."
204 notice_new_password_must_be_different: Votre nouveau mot de passe doit Γͺtre diffΓ©rent de votre mot de passe actuel
204 notice_new_password_must_be_different: Votre nouveau mot de passe doit Γͺtre diffΓ©rent de votre mot de passe actuel
205
205
206 error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramΓ©trage : %{value}"
206 error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramΓ©trage : %{value}"
207 error_scm_not_found: "L'entrΓ©e et/ou la rΓ©vision demandΓ©e n'existe pas dans le dΓ©pΓ΄t."
207 error_scm_not_found: "L'entrΓ©e et/ou la rΓ©vision demandΓ©e n'existe pas dans le dΓ©pΓ΄t."
208 error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}"
208 error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}"
209 error_scm_annotate: "L'entrΓ©e n'existe pas ou ne peut pas Γͺtre annotΓ©e."
209 error_scm_annotate: "L'entrΓ©e n'existe pas ou ne peut pas Γͺtre annotΓ©e."
210 error_scm_annotate_big_text_file: Cette entrΓ©e ne peut pas Γͺtre annotΓ©e car elle excΓ¨de la taille maximale.
210 error_scm_annotate_big_text_file: Cette entrΓ©e ne peut pas Γͺtre annotΓ©e car elle excΓ¨de la taille maximale.
211 error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas Γ  ce projet"
211 error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas Γ  ce projet"
212 error_no_tracker_in_project: "Aucun tracker n'est associΓ© Γ  ce projet. VΓ©rifier la configuration du projet."
212 error_no_tracker_in_project: "Aucun tracker n'est associΓ© Γ  ce projet. VΓ©rifier la configuration du projet."
213 error_no_default_issue_status: "Aucun statut de demande n'est dΓ©fini par dΓ©faut. VΓ©rifier votre configuration (Administration -> Statuts de demandes)."
213 error_no_default_issue_status: "Aucun statut de demande n'est dΓ©fini par dΓ©faut. VΓ©rifier votre configuration (Administration -> Statuts de demandes)."
214 error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisΓ©
214 error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisΓ©
215 error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas Γͺtre supprimΓ©.
215 error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas Γͺtre supprimΓ©.
216 error_can_not_remove_role: Ce rΓ΄le est utilisΓ© et ne peut pas Γͺtre supprimΓ©.
216 error_can_not_remove_role: Ce rΓ΄le est utilisΓ© et ne peut pas Γͺtre supprimΓ©.
217 error_can_not_reopen_issue_on_closed_version: 'Une demande assignΓ©e Γ  une version fermΓ©e ne peut pas Γͺtre rΓ©ouverte'
217 error_can_not_reopen_issue_on_closed_version: 'Une demande assignΓ©e Γ  une version fermΓ©e ne peut pas Γͺtre rΓ©ouverte'
218 error_can_not_archive_project: "Ce projet ne peut pas Γͺtre archivΓ©"
218 error_can_not_archive_project: "Ce projet ne peut pas Γͺtre archivΓ©"
219 error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu Γͺtre mis Γ  jour.
219 error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu Γͺtre mis Γ  jour.
220 error_workflow_copy_source: 'Veuillez sΓ©lectionner un tracker et/ou un rΓ΄le source'
220 error_workflow_copy_source: 'Veuillez sΓ©lectionner un tracker et/ou un rΓ΄le source'
221 error_workflow_copy_target: 'Veuillez sΓ©lectionner les trackers et rΓ΄les cibles'
221 error_workflow_copy_target: 'Veuillez sΓ©lectionner les trackers et rΓ΄les cibles'
222 error_unable_delete_issue_status: Impossible de supprimer le statut de demande
222 error_unable_delete_issue_status: Impossible de supprimer le statut de demande
223 error_unable_to_connect: Connexion impossible (%{value})
223 error_unable_to_connect: Connexion impossible (%{value})
224 error_attachment_too_big: Ce fichier ne peut pas Γͺtre attachΓ© car il excΓ¨de la taille maximale autorisΓ©e (%{max_size})
224 error_attachment_too_big: Ce fichier ne peut pas Γͺtre attachΓ© car il excΓ¨de la taille maximale autorisΓ©e (%{max_size})
225 error_session_expired: "Votre session a expirΓ©. Veuillez vous reconnecter."
225 error_session_expired: "Votre session a expirΓ©. Veuillez vous reconnecter."
226 warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu Γͺtre sauvegardΓ©s."
226 warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu Γͺtre sauvegardΓ©s."
227 error_password_expired: "Votre mot de passe a expirΓ© ou nΓ©cessite d'Γͺtre changΓ©."
227 error_password_expired: "Votre mot de passe a expirΓ© ou nΓ©cessite d'Γͺtre changΓ©."
228
228
229 mail_subject_lost_password: "Votre mot de passe %{value}"
229 mail_subject_lost_password: "Votre mot de passe %{value}"
230 mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant :'
230 mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant :'
231 mail_subject_register: "Activation de votre compte %{value}"
231 mail_subject_register: "Activation de votre compte %{value}"
232 mail_body_register: 'Pour activer votre compte, cliquez sur le lien suivant :'
232 mail_body_register: 'Pour activer votre compte, cliquez sur le lien suivant :'
233 mail_body_account_information_external: "Vous pouvez utiliser votre compte %{value} pour vous connecter."
233 mail_body_account_information_external: "Vous pouvez utiliser votre compte %{value} pour vous connecter."
234 mail_body_account_information: Paramètres de connexion de votre compte
234 mail_body_account_information: Paramètres de connexion de votre compte
235 mail_subject_account_activation_request: "Demande d'activation d'un compte %{value}"
235 mail_subject_account_activation_request: "Demande d'activation d'un compte %{value}"
236 mail_body_account_activation_request: "Un nouvel utilisateur (%{value}) s'est inscrit. Son compte nΓ©cessite votre approbation :"
236 mail_body_account_activation_request: "Un nouvel utilisateur (%{value}) s'est inscrit. Son compte nΓ©cessite votre approbation :"
237 mail_subject_reminder: "%{count} demande(s) arrivent Γ  Γ©chΓ©ance (%{days})"
237 mail_subject_reminder: "%{count} demande(s) arrivent Γ  Γ©chΓ©ance (%{days})"
238 mail_body_reminder: "%{count} demande(s) qui vous sont assignΓ©es arrivent Γ  Γ©chΓ©ance dans les %{days} prochains jours :"
238 mail_body_reminder: "%{count} demande(s) qui vous sont assignΓ©es arrivent Γ  Γ©chΓ©ance dans les %{days} prochains jours :"
239 mail_subject_wiki_content_added: "Page wiki '%{id}' ajoutΓ©e"
239 mail_subject_wiki_content_added: "Page wiki '%{id}' ajoutΓ©e"
240 mail_body_wiki_content_added: "La page wiki '%{id}' a Γ©tΓ© ajoutΓ©e par %{author}."
240 mail_body_wiki_content_added: "La page wiki '%{id}' a Γ©tΓ© ajoutΓ©e par %{author}."
241 mail_subject_wiki_content_updated: "Page wiki '%{id}' mise Γ  jour"
241 mail_subject_wiki_content_updated: "Page wiki '%{id}' mise Γ  jour"
242 mail_body_wiki_content_updated: "La page wiki '%{id}' a Γ©tΓ© mise Γ  jour par %{author}."
242 mail_body_wiki_content_updated: "La page wiki '%{id}' a Γ©tΓ© mise Γ  jour par %{author}."
243
243
244 field_name: Nom
244 field_name: Nom
245 field_description: Description
245 field_description: Description
246 field_summary: RΓ©sumΓ©
246 field_summary: RΓ©sumΓ©
247 field_is_required: Obligatoire
247 field_is_required: Obligatoire
248 field_firstname: PrΓ©nom
248 field_firstname: PrΓ©nom
249 field_lastname: Nom
249 field_lastname: Nom
250 field_mail: Email
250 field_mail: Email
251 field_address: Email
251 field_address: Email
252 field_filename: Fichier
252 field_filename: Fichier
253 field_filesize: Taille
253 field_filesize: Taille
254 field_downloads: TΓ©lΓ©chargements
254 field_downloads: TΓ©lΓ©chargements
255 field_author: Auteur
255 field_author: Auteur
256 field_created_on: Créé
256 field_created_on: Créé
257 field_updated_on: Mis-Γ -jour
257 field_updated_on: Mis-Γ -jour
258 field_closed_on: FermΓ©
258 field_closed_on: FermΓ©
259 field_field_format: Format
259 field_field_format: Format
260 field_is_for_all: Pour tous les projets
260 field_is_for_all: Pour tous les projets
261 field_possible_values: Valeurs possibles
261 field_possible_values: Valeurs possibles
262 field_regexp: Expression régulière
262 field_regexp: Expression régulière
263 field_min_length: Longueur minimum
263 field_min_length: Longueur minimum
264 field_max_length: Longueur maximum
264 field_max_length: Longueur maximum
265 field_value: Valeur
265 field_value: Valeur
266 field_category: CatΓ©gorie
266 field_category: CatΓ©gorie
267 field_title: Titre
267 field_title: Titre
268 field_project: Projet
268 field_project: Projet
269 field_issue: Demande
269 field_issue: Demande
270 field_status: Statut
270 field_status: Statut
271 field_notes: Notes
271 field_notes: Notes
272 field_is_closed: Demande fermΓ©e
272 field_is_closed: Demande fermΓ©e
273 field_is_default: Valeur par dΓ©faut
273 field_is_default: Valeur par dΓ©faut
274 field_tracker: Tracker
274 field_tracker: Tracker
275 field_subject: Sujet
275 field_subject: Sujet
276 field_due_date: EchΓ©ance
276 field_due_date: EchΓ©ance
277 field_assigned_to: AssignΓ© Γ 
277 field_assigned_to: AssignΓ© Γ 
278 field_priority: PrioritΓ©
278 field_priority: PrioritΓ©
279 field_fixed_version: Version cible
279 field_fixed_version: Version cible
280 field_user: Utilisateur
280 field_user: Utilisateur
281 field_principal: Principal
281 field_principal: Principal
282 field_role: RΓ΄le
282 field_role: RΓ΄le
283 field_homepage: Site web
283 field_homepage: Site web
284 field_is_public: Public
284 field_is_public: Public
285 field_parent: Sous-projet de
285 field_parent: Sous-projet de
286 field_is_in_roadmap: Demandes affichΓ©es dans la roadmap
286 field_is_in_roadmap: Demandes affichΓ©es dans la roadmap
287 field_login: Identifiant
287 field_login: Identifiant
288 field_mail_notification: Notifications par mail
288 field_mail_notification: Notifications par mail
289 field_admin: Administrateur
289 field_admin: Administrateur
290 field_last_login_on: Dernière connexion
290 field_last_login_on: Dernière connexion
291 field_language: Langue
291 field_language: Langue
292 field_effective_date: Date
292 field_effective_date: Date
293 field_password: Mot de passe
293 field_password: Mot de passe
294 field_new_password: Nouveau mot de passe
294 field_new_password: Nouveau mot de passe
295 field_password_confirmation: Confirmation
295 field_password_confirmation: Confirmation
296 field_version: Version
296 field_version: Version
297 field_type: Type
297 field_type: Type
298 field_host: HΓ΄te
298 field_host: HΓ΄te
299 field_port: Port
299 field_port: Port
300 field_account: Compte
300 field_account: Compte
301 field_base_dn: Base DN
301 field_base_dn: Base DN
302 field_attr_login: Attribut Identifiant
302 field_attr_login: Attribut Identifiant
303 field_attr_firstname: Attribut PrΓ©nom
303 field_attr_firstname: Attribut PrΓ©nom
304 field_attr_lastname: Attribut Nom
304 field_attr_lastname: Attribut Nom
305 field_attr_mail: Attribut Email
305 field_attr_mail: Attribut Email
306 field_onthefly: CrΓ©ation des utilisateurs Γ  la volΓ©e
306 field_onthefly: CrΓ©ation des utilisateurs Γ  la volΓ©e
307 field_start_date: DΓ©but
307 field_start_date: DΓ©but
308 field_done_ratio: "% rΓ©alisΓ©"
308 field_done_ratio: "% rΓ©alisΓ©"
309 field_auth_source: Mode d'authentification
309 field_auth_source: Mode d'authentification
310 field_hide_mail: Cacher mon adresse mail
310 field_hide_mail: Cacher mon adresse mail
311 field_comments: Commentaire
311 field_comments: Commentaire
312 field_url: URL
312 field_url: URL
313 field_start_page: Page de dΓ©marrage
313 field_start_page: Page de dΓ©marrage
314 field_subproject: Sous-projet
314 field_subproject: Sous-projet
315 field_hours: Heures
315 field_hours: Heures
316 field_activity: ActivitΓ©
316 field_activity: ActivitΓ©
317 field_spent_on: Date
317 field_spent_on: Date
318 field_identifier: Identifiant
318 field_identifier: Identifiant
319 field_is_filter: UtilisΓ© comme filtre
319 field_is_filter: UtilisΓ© comme filtre
320 field_issue_to: Demande liΓ©e
320 field_issue_to: Demande liΓ©e
321 field_delay: Retard
321 field_delay: Retard
322 field_assignable: Demandes assignables Γ  ce rΓ΄le
322 field_assignable: Demandes assignables Γ  ce rΓ΄le
323 field_redirect_existing_links: Rediriger les liens existants
323 field_redirect_existing_links: Rediriger les liens existants
324 field_estimated_hours: Temps estimΓ©
324 field_estimated_hours: Temps estimΓ©
325 field_column_names: Colonnes
325 field_column_names: Colonnes
326 field_time_entries: Temps passΓ©
326 field_time_entries: Temps passΓ©
327 field_time_zone: Fuseau horaire
327 field_time_zone: Fuseau horaire
328 field_searchable: UtilisΓ© pour les recherches
328 field_searchable: UtilisΓ© pour les recherches
329 field_default_value: Valeur par dΓ©faut
329 field_default_value: Valeur par dΓ©faut
330 field_comments_sorting: Afficher les commentaires
330 field_comments_sorting: Afficher les commentaires
331 field_parent_title: Page parent
331 field_parent_title: Page parent
332 field_editable: Modifiable
332 field_editable: Modifiable
333 field_watcher: Observateur
333 field_watcher: Observateur
334 field_identity_url: URL OpenID
334 field_identity_url: URL OpenID
335 field_content: Contenu
335 field_content: Contenu
336 field_group_by: Grouper par
336 field_group_by: Grouper par
337 field_sharing: Partage
337 field_sharing: Partage
338 field_parent_issue: TΓ’che parente
338 field_parent_issue: TΓ’che parente
339 field_member_of_group: Groupe de l'assignΓ©
339 field_member_of_group: Groupe de l'assignΓ©
340 field_assigned_to_role: RΓ΄le de l'assignΓ©
340 field_assigned_to_role: RΓ΄le de l'assignΓ©
341 field_text: Champ texte
341 field_text: Champ texte
342 field_visible: Visible
342 field_visible: Visible
343 field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardΓ©"
343 field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardΓ©"
344 field_issues_visibility: VisibilitΓ© des demandes
344 field_issues_visibility: VisibilitΓ© des demandes
345 field_is_private: PrivΓ©e
345 field_is_private: PrivΓ©e
346 field_commit_logs_encoding: Encodage des messages de commit
346 field_commit_logs_encoding: Encodage des messages de commit
347 field_scm_path_encoding: Encodage des chemins
347 field_scm_path_encoding: Encodage des chemins
348 field_path_to_repository: Chemin du dΓ©pΓ΄t
348 field_path_to_repository: Chemin du dΓ©pΓ΄t
349 field_root_directory: RΓ©pertoire racine
349 field_root_directory: RΓ©pertoire racine
350 field_cvsroot: CVSROOT
350 field_cvsroot: CVSROOT
351 field_cvs_module: Module
351 field_cvs_module: Module
352 field_repository_is_default: DΓ©pΓ΄t principal
352 field_repository_is_default: DΓ©pΓ΄t principal
353 field_multiple: Valeurs multiples
353 field_multiple: Valeurs multiples
354 field_auth_source_ldap_filter: Filtre LDAP
354 field_auth_source_ldap_filter: Filtre LDAP
355 field_core_fields: Champs standards
355 field_core_fields: Champs standards
356 field_timeout: "Timeout (en secondes)"
356 field_timeout: "Timeout (en secondes)"
357 field_board_parent: Forum parent
357 field_board_parent: Forum parent
358 field_private_notes: Notes privΓ©es
358 field_private_notes: Notes privΓ©es
359 field_inherit_members: HΓ©riter les membres
359 field_inherit_members: HΓ©riter les membres
360 field_generate_password: GΓ©nΓ©rer un mot de passe
360 field_generate_password: GΓ©nΓ©rer un mot de passe
361 field_must_change_passwd: Doit changer de mot de passe Γ  la prochaine connexion
361 field_must_change_passwd: Doit changer de mot de passe Γ  la prochaine connexion
362 field_default_status: Statut par dΓ©faut
362 field_default_status: Statut par dΓ©faut
363 field_users_visibility: VisibilitΓ© des utilisateurs
363 field_users_visibility: VisibilitΓ© des utilisateurs
364 field_time_entries_visibility: VisibilitΓ© du temps passΓ©
364
365
365 setting_app_title: Titre de l'application
366 setting_app_title: Titre de l'application
366 setting_app_subtitle: Sous-titre de l'application
367 setting_app_subtitle: Sous-titre de l'application
367 setting_welcome_text: Texte d'accueil
368 setting_welcome_text: Texte d'accueil
368 setting_default_language: Langue par dΓ©faut
369 setting_default_language: Langue par dΓ©faut
369 setting_login_required: Authentification obligatoire
370 setting_login_required: Authentification obligatoire
370 setting_self_registration: Inscription des nouveaux utilisateurs
371 setting_self_registration: Inscription des nouveaux utilisateurs
371 setting_attachment_max_size: Taille maximale des fichiers
372 setting_attachment_max_size: Taille maximale des fichiers
372 setting_issues_export_limit: Limite d'exportation des demandes
373 setting_issues_export_limit: Limite d'exportation des demandes
373 setting_mail_from: Adresse d'Γ©mission
374 setting_mail_from: Adresse d'Γ©mission
374 setting_bcc_recipients: Destinataires en copie cachΓ©e (cci)
375 setting_bcc_recipients: Destinataires en copie cachΓ©e (cci)
375 setting_plain_text_mail: Mail en texte brut (non HTML)
376 setting_plain_text_mail: Mail en texte brut (non HTML)
376 setting_host_name: Nom d'hΓ΄te et chemin
377 setting_host_name: Nom d'hΓ΄te et chemin
377 setting_text_formatting: Formatage du texte
378 setting_text_formatting: Formatage du texte
378 setting_wiki_compression: Compression de l'historique des pages wiki
379 setting_wiki_compression: Compression de l'historique des pages wiki
379 setting_feeds_limit: Nombre maximal d'Γ©lΓ©ments dans les flux Atom
380 setting_feeds_limit: Nombre maximal d'Γ©lΓ©ments dans les flux Atom
380 setting_default_projects_public: DΓ©finir les nouveaux projets comme publics par dΓ©faut
381 setting_default_projects_public: DΓ©finir les nouveaux projets comme publics par dΓ©faut
381 setting_autofetch_changesets: RΓ©cupΓ©ration automatique des commits
382 setting_autofetch_changesets: RΓ©cupΓ©ration automatique des commits
382 setting_sys_api_enabled: Activer les WS pour la gestion des dΓ©pΓ΄ts
383 setting_sys_api_enabled: Activer les WS pour la gestion des dΓ©pΓ΄ts
383 setting_commit_ref_keywords: Mots-clΓ©s de rΓ©fΓ©rencement
384 setting_commit_ref_keywords: Mots-clΓ©s de rΓ©fΓ©rencement
384 setting_commit_fix_keywords: Mots-clΓ©s de rΓ©solution
385 setting_commit_fix_keywords: Mots-clΓ©s de rΓ©solution
385 setting_autologin: DurΓ©e maximale de connexion automatique
386 setting_autologin: DurΓ©e maximale de connexion automatique
386 setting_date_format: Format de date
387 setting_date_format: Format de date
387 setting_time_format: Format d'heure
388 setting_time_format: Format d'heure
388 setting_cross_project_issue_relations: Autoriser les relations entre demandes de diffΓ©rents projets
389 setting_cross_project_issue_relations: Autoriser les relations entre demandes de diffΓ©rents projets
389 setting_cross_project_subtasks: Autoriser les sous-tΓ’ches dans des projets diffΓ©rents
390 setting_cross_project_subtasks: Autoriser les sous-tΓ’ches dans des projets diffΓ©rents
390 setting_issue_list_default_columns: Colonnes affichΓ©es par dΓ©faut sur la liste des demandes
391 setting_issue_list_default_columns: Colonnes affichΓ©es par dΓ©faut sur la liste des demandes
391 setting_repositories_encodings: Encodages des fichiers et des dΓ©pΓ΄ts
392 setting_repositories_encodings: Encodages des fichiers et des dΓ©pΓ΄ts
392 setting_emails_header: En-tΓͺte des emails
393 setting_emails_header: En-tΓͺte des emails
393 setting_emails_footer: Pied-de-page des emails
394 setting_emails_footer: Pied-de-page des emails
394 setting_protocol: Protocole
395 setting_protocol: Protocole
395 setting_per_page_options: Options d'objets affichΓ©s par page
396 setting_per_page_options: Options d'objets affichΓ©s par page
396 setting_user_format: Format d'affichage des utilisateurs
397 setting_user_format: Format d'affichage des utilisateurs
397 setting_activity_days_default: Nombre de jours affichΓ©s sur l'activitΓ© des projets
398 setting_activity_days_default: Nombre de jours affichΓ©s sur l'activitΓ© des projets
398 setting_display_subprojects_issues: Afficher par dΓ©faut les demandes des sous-projets sur les projets principaux
399 setting_display_subprojects_issues: Afficher par dΓ©faut les demandes des sous-projets sur les projets principaux
399 setting_enabled_scm: SCM activΓ©s
400 setting_enabled_scm: SCM activΓ©s
400 setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes"
401 setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes"
401 setting_mail_handler_api_enabled: "Activer le WS pour la rΓ©ception d'emails"
402 setting_mail_handler_api_enabled: "Activer le WS pour la rΓ©ception d'emails"
402 setting_mail_handler_api_key: ClΓ© de protection de l'API
403 setting_mail_handler_api_key: ClΓ© de protection de l'API
403 setting_sequential_project_identifiers: GΓ©nΓ©rer des identifiants de projet sΓ©quentiels
404 setting_sequential_project_identifiers: GΓ©nΓ©rer des identifiants de projet sΓ©quentiels
404 setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
405 setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
405 setting_gravatar_default: Image Gravatar par dΓ©faut
406 setting_gravatar_default: Image Gravatar par dΓ©faut
406 setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichΓ©es
407 setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichΓ©es
407 setting_file_max_size_displayed: Taille maximum des fichiers texte affichΓ©s en ligne
408 setting_file_max_size_displayed: Taille maximum des fichiers texte affichΓ©s en ligne
408 setting_repository_log_display_limit: "Nombre maximum de rΓ©visions affichΓ©es sur l'historique d'un fichier"
409 setting_repository_log_display_limit: "Nombre maximum de rΓ©visions affichΓ©es sur l'historique d'un fichier"
409 setting_openid: "Autoriser l'authentification et l'enregistrement OpenID"
410 setting_openid: "Autoriser l'authentification et l'enregistrement OpenID"
410 setting_password_max_age: Expiration des mots de passe après
411 setting_password_max_age: Expiration des mots de passe après
411 setting_password_min_length: Longueur minimum des mots de passe
412 setting_password_min_length: Longueur minimum des mots de passe
412 setting_new_project_user_role_id: RΓ΄le donnΓ© Γ  un utilisateur non-administrateur qui crΓ©e un projet
413 setting_new_project_user_role_id: RΓ΄le donnΓ© Γ  un utilisateur non-administrateur qui crΓ©e un projet
413 setting_default_projects_modules: Modules activΓ©s par dΓ©faut pour les nouveaux projets
414 setting_default_projects_modules: Modules activΓ©s par dΓ©faut pour les nouveaux projets
414 setting_issue_done_ratio: Calcul de l'avancement des demandes
415 setting_issue_done_ratio: Calcul de l'avancement des demandes
415 setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectuΓ©'
416 setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectuΓ©'
416 setting_issue_done_ratio_issue_status: Utiliser le statut
417 setting_issue_done_ratio_issue_status: Utiliser le statut
417 setting_start_of_week: Jour de dΓ©but des calendriers
418 setting_start_of_week: Jour de dΓ©but des calendriers
418 setting_rest_api_enabled: Activer l'API REST
419 setting_rest_api_enabled: Activer l'API REST
419 setting_cache_formatted_text: Mettre en cache le texte formatΓ©
420 setting_cache_formatted_text: Mettre en cache le texte formatΓ©
420 setting_default_notification_option: Option de notification par dΓ©faut
421 setting_default_notification_option: Option de notification par dΓ©faut
421 setting_commit_logtime_enabled: Permettre la saisie de temps
422 setting_commit_logtime_enabled: Permettre la saisie de temps
422 setting_commit_logtime_activity_id: ActivitΓ© pour le temps saisi
423 setting_commit_logtime_activity_id: ActivitΓ© pour le temps saisi
423 setting_gantt_items_limit: Nombre maximum d'Γ©lΓ©ments affichΓ©s sur le gantt
424 setting_gantt_items_limit: Nombre maximum d'Γ©lΓ©ments affichΓ©s sur le gantt
424 setting_issue_group_assignment: Permettre l'assignement des demandes aux groupes
425 setting_issue_group_assignment: Permettre l'assignement des demandes aux groupes
425 setting_default_issue_start_date_to_creation_date: Donner Γ  la date de dΓ©but d'une nouvelle demande la valeur de la date du jour
426 setting_default_issue_start_date_to_creation_date: Donner Γ  la date de dΓ©but d'une nouvelle demande la valeur de la date du jour
426 setting_commit_cross_project_ref: Permettre le rΓ©fΓ©rencement et la rΓ©solution des demandes de tous les autres projets
427 setting_commit_cross_project_ref: Permettre le rΓ©fΓ©rencement et la rΓ©solution des demandes de tous les autres projets
427 setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
428 setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
428 setting_session_lifetime: DurΓ©e de vie maximale des sessions
429 setting_session_lifetime: DurΓ©e de vie maximale des sessions
429 setting_session_timeout: DurΓ©e maximale d'inactivitΓ©
430 setting_session_timeout: DurΓ©e maximale d'inactivitΓ©
430 setting_thumbnails_enabled: Afficher les vignettes des images
431 setting_thumbnails_enabled: Afficher les vignettes des images
431 setting_thumbnails_size: Taille des vignettes (en pixels)
432 setting_thumbnails_size: Taille des vignettes (en pixels)
432 setting_non_working_week_days: Jours non travaillΓ©s
433 setting_non_working_week_days: Jours non travaillΓ©s
433 setting_jsonp_enabled: Activer le support JSONP
434 setting_jsonp_enabled: Activer le support JSONP
434 setting_default_projects_tracker_ids: Trackers par dΓ©faut pour les nouveaux projets
435 setting_default_projects_tracker_ids: Trackers par dΓ©faut pour les nouveaux projets
435 setting_mail_handler_excluded_filenames: Exclure les fichiers attachΓ©s par leur nom
436 setting_mail_handler_excluded_filenames: Exclure les fichiers attachΓ©s par leur nom
436 setting_force_default_language_for_anonymous: Forcer la langue par dΓ©fault pour les utilisateurs anonymes
437 setting_force_default_language_for_anonymous: Forcer la langue par dΓ©fault pour les utilisateurs anonymes
437 setting_force_default_language_for_loggedin: Forcer la langue par dΓ©fault pour les utilisateurs identifiΓ©s
438 setting_force_default_language_for_loggedin: Forcer la langue par dΓ©fault pour les utilisateurs identifiΓ©s
438 setting_link_copied_issue: Lier les demandes lors de la copie
439 setting_link_copied_issue: Lier les demandes lors de la copie
439 setting_max_additional_emails: Nombre maximal d'adresses email additionnelles
440 setting_max_additional_emails: Nombre maximal d'adresses email additionnelles
440 setting_search_results_per_page: RΓ©sultats de recherche affichΓ©s par page
441 setting_search_results_per_page: RΓ©sultats de recherche affichΓ©s par page
441
442
442 permission_add_project: CrΓ©er un projet
443 permission_add_project: CrΓ©er un projet
443 permission_add_subprojects: CrΓ©er des sous-projets
444 permission_add_subprojects: CrΓ©er des sous-projets
444 permission_edit_project: Modifier le projet
445 permission_edit_project: Modifier le projet
445 permission_close_project: Fermer / rΓ©ouvrir le projet
446 permission_close_project: Fermer / rΓ©ouvrir le projet
446 permission_select_project_modules: Choisir les modules
447 permission_select_project_modules: Choisir les modules
447 permission_manage_members: GΓ©rer les membres
448 permission_manage_members: GΓ©rer les membres
448 permission_manage_project_activities: GΓ©rer les activitΓ©s
449 permission_manage_project_activities: GΓ©rer les activitΓ©s
449 permission_manage_versions: GΓ©rer les versions
450 permission_manage_versions: GΓ©rer les versions
450 permission_manage_categories: GΓ©rer les catΓ©gories de demandes
451 permission_manage_categories: GΓ©rer les catΓ©gories de demandes
451 permission_view_issues: Voir les demandes
452 permission_view_issues: Voir les demandes
452 permission_add_issues: CrΓ©er des demandes
453 permission_add_issues: CrΓ©er des demandes
453 permission_edit_issues: Modifier les demandes
454 permission_edit_issues: Modifier les demandes
454 permission_copy_issues: Copier les demandes
455 permission_copy_issues: Copier les demandes
455 permission_manage_issue_relations: GΓ©rer les relations
456 permission_manage_issue_relations: GΓ©rer les relations
456 permission_set_issues_private: Rendre les demandes publiques ou privΓ©es
457 permission_set_issues_private: Rendre les demandes publiques ou privΓ©es
457 permission_set_own_issues_private: Rendre ses propres demandes publiques ou privΓ©es
458 permission_set_own_issues_private: Rendre ses propres demandes publiques ou privΓ©es
458 permission_add_issue_notes: Ajouter des notes
459 permission_add_issue_notes: Ajouter des notes
459 permission_edit_issue_notes: Modifier les notes
460 permission_edit_issue_notes: Modifier les notes
460 permission_edit_own_issue_notes: Modifier ses propres notes
461 permission_edit_own_issue_notes: Modifier ses propres notes
461 permission_view_private_notes: Voir les notes privΓ©es
462 permission_view_private_notes: Voir les notes privΓ©es
462 permission_set_notes_private: Rendre les notes privΓ©es
463 permission_set_notes_private: Rendre les notes privΓ©es
463 permission_move_issues: DΓ©placer les demandes
464 permission_move_issues: DΓ©placer les demandes
464 permission_delete_issues: Supprimer les demandes
465 permission_delete_issues: Supprimer les demandes
465 permission_manage_public_queries: GΓ©rer les requΓͺtes publiques
466 permission_manage_public_queries: GΓ©rer les requΓͺtes publiques
466 permission_save_queries: Sauvegarder les requΓͺtes
467 permission_save_queries: Sauvegarder les requΓͺtes
467 permission_view_gantt: Voir le gantt
468 permission_view_gantt: Voir le gantt
468 permission_view_calendar: Voir le calendrier
469 permission_view_calendar: Voir le calendrier
469 permission_view_issue_watchers: Voir la liste des observateurs
470 permission_view_issue_watchers: Voir la liste des observateurs
470 permission_add_issue_watchers: Ajouter des observateurs
471 permission_add_issue_watchers: Ajouter des observateurs
471 permission_delete_issue_watchers: Supprimer des observateurs
472 permission_delete_issue_watchers: Supprimer des observateurs
472 permission_log_time: Saisir le temps passΓ©
473 permission_log_time: Saisir le temps passΓ©
473 permission_view_time_entries: Voir le temps passΓ©
474 permission_view_time_entries: Voir le temps passΓ©
474 permission_edit_time_entries: Modifier les temps passΓ©s
475 permission_edit_time_entries: Modifier les temps passΓ©s
475 permission_edit_own_time_entries: Modifier son propre temps passΓ©
476 permission_edit_own_time_entries: Modifier son propre temps passΓ©
476 permission_manage_news: GΓ©rer les annonces
477 permission_manage_news: GΓ©rer les annonces
477 permission_comment_news: Commenter les annonces
478 permission_comment_news: Commenter les annonces
478 permission_view_documents: Voir les documents
479 permission_view_documents: Voir les documents
479 permission_add_documents: Ajouter des documents
480 permission_add_documents: Ajouter des documents
480 permission_edit_documents: Modifier les documents
481 permission_edit_documents: Modifier les documents
481 permission_delete_documents: Supprimer les documents
482 permission_delete_documents: Supprimer les documents
482 permission_manage_files: GΓ©rer les fichiers
483 permission_manage_files: GΓ©rer les fichiers
483 permission_view_files: Voir les fichiers
484 permission_view_files: Voir les fichiers
484 permission_manage_wiki: GΓ©rer le wiki
485 permission_manage_wiki: GΓ©rer le wiki
485 permission_rename_wiki_pages: Renommer les pages
486 permission_rename_wiki_pages: Renommer les pages
486 permission_delete_wiki_pages: Supprimer les pages
487 permission_delete_wiki_pages: Supprimer les pages
487 permission_view_wiki_pages: Voir le wiki
488 permission_view_wiki_pages: Voir le wiki
488 permission_view_wiki_edits: "Voir l'historique des modifications"
489 permission_view_wiki_edits: "Voir l'historique des modifications"
489 permission_edit_wiki_pages: Modifier les pages
490 permission_edit_wiki_pages: Modifier les pages
490 permission_delete_wiki_pages_attachments: Supprimer les fichiers joints
491 permission_delete_wiki_pages_attachments: Supprimer les fichiers joints
491 permission_protect_wiki_pages: ProtΓ©ger les pages
492 permission_protect_wiki_pages: ProtΓ©ger les pages
492 permission_manage_repository: GΓ©rer le dΓ©pΓ΄t de sources
493 permission_manage_repository: GΓ©rer le dΓ©pΓ΄t de sources
493 permission_browse_repository: Parcourir les sources
494 permission_browse_repository: Parcourir les sources
494 permission_view_changesets: Voir les rΓ©visions
495 permission_view_changesets: Voir les rΓ©visions
495 permission_commit_access: Droit de commit
496 permission_commit_access: Droit de commit
496 permission_manage_boards: GΓ©rer les forums
497 permission_manage_boards: GΓ©rer les forums
497 permission_view_messages: Voir les messages
498 permission_view_messages: Voir les messages
498 permission_add_messages: Poster un message
499 permission_add_messages: Poster un message
499 permission_edit_messages: Modifier les messages
500 permission_edit_messages: Modifier les messages
500 permission_edit_own_messages: Modifier ses propres messages
501 permission_edit_own_messages: Modifier ses propres messages
501 permission_delete_messages: Supprimer les messages
502 permission_delete_messages: Supprimer les messages
502 permission_delete_own_messages: Supprimer ses propres messages
503 permission_delete_own_messages: Supprimer ses propres messages
503 permission_export_wiki_pages: Exporter les pages
504 permission_export_wiki_pages: Exporter les pages
504 permission_manage_subtasks: GΓ©rer les sous-tΓ’ches
505 permission_manage_subtasks: GΓ©rer les sous-tΓ’ches
505 permission_manage_related_issues: GΓ©rer les demandes associΓ©es
506 permission_manage_related_issues: GΓ©rer les demandes associΓ©es
506
507
507 project_module_issue_tracking: Suivi des demandes
508 project_module_issue_tracking: Suivi des demandes
508 project_module_time_tracking: Suivi du temps passΓ©
509 project_module_time_tracking: Suivi du temps passΓ©
509 project_module_news: Publication d'annonces
510 project_module_news: Publication d'annonces
510 project_module_documents: Publication de documents
511 project_module_documents: Publication de documents
511 project_module_files: Publication de fichiers
512 project_module_files: Publication de fichiers
512 project_module_wiki: Wiki
513 project_module_wiki: Wiki
513 project_module_repository: DΓ©pΓ΄t de sources
514 project_module_repository: DΓ©pΓ΄t de sources
514 project_module_boards: Forums de discussion
515 project_module_boards: Forums de discussion
515 project_module_calendar: Calendrier
516 project_module_calendar: Calendrier
516 project_module_gantt: Gantt
517 project_module_gantt: Gantt
517
518
518 label_user: Utilisateur
519 label_user: Utilisateur
519 label_user_plural: Utilisateurs
520 label_user_plural: Utilisateurs
520 label_user_new: Nouvel utilisateur
521 label_user_new: Nouvel utilisateur
521 label_user_anonymous: Anonyme
522 label_user_anonymous: Anonyme
522 label_project: Projet
523 label_project: Projet
523 label_project_new: Nouveau projet
524 label_project_new: Nouveau projet
524 label_project_plural: Projets
525 label_project_plural: Projets
525 label_x_projects:
526 label_x_projects:
526 zero: aucun projet
527 zero: aucun projet
527 one: un projet
528 one: un projet
528 other: "%{count} projets"
529 other: "%{count} projets"
529 label_project_all: Tous les projets
530 label_project_all: Tous les projets
530 label_project_latest: Derniers projets
531 label_project_latest: Derniers projets
531 label_issue: Demande
532 label_issue: Demande
532 label_issue_new: Nouvelle demande
533 label_issue_new: Nouvelle demande
533 label_issue_plural: Demandes
534 label_issue_plural: Demandes
534 label_issue_view_all: Voir toutes les demandes
535 label_issue_view_all: Voir toutes les demandes
535 label_issues_by: "Demandes par %{value}"
536 label_issues_by: "Demandes par %{value}"
536 label_issue_added: Demande ajoutΓ©e
537 label_issue_added: Demande ajoutΓ©e
537 label_issue_updated: Demande mise Γ  jour
538 label_issue_updated: Demande mise Γ  jour
538 label_issue_note_added: Note ajoutΓ©e
539 label_issue_note_added: Note ajoutΓ©e
539 label_issue_status_updated: Statut changΓ©
540 label_issue_status_updated: Statut changΓ©
540 label_issue_assigned_to_updated: AssignΓ© changΓ©
541 label_issue_assigned_to_updated: AssignΓ© changΓ©
541 label_issue_priority_updated: PrioritΓ© changΓ©e
542 label_issue_priority_updated: PrioritΓ© changΓ©e
542 label_document: Document
543 label_document: Document
543 label_document_new: Nouveau document
544 label_document_new: Nouveau document
544 label_document_plural: Documents
545 label_document_plural: Documents
545 label_document_added: Document ajoutΓ©
546 label_document_added: Document ajoutΓ©
546 label_role: RΓ΄le
547 label_role: RΓ΄le
547 label_role_plural: RΓ΄les
548 label_role_plural: RΓ΄les
548 label_role_new: Nouveau rΓ΄le
549 label_role_new: Nouveau rΓ΄le
549 label_role_and_permissions: RΓ΄les et permissions
550 label_role_and_permissions: RΓ΄les et permissions
550 label_role_anonymous: Anonyme
551 label_role_anonymous: Anonyme
551 label_role_non_member: Non membre
552 label_role_non_member: Non membre
552 label_member: Membre
553 label_member: Membre
553 label_member_new: Nouveau membre
554 label_member_new: Nouveau membre
554 label_member_plural: Membres
555 label_member_plural: Membres
555 label_tracker: Tracker
556 label_tracker: Tracker
556 label_tracker_plural: Trackers
557 label_tracker_plural: Trackers
557 label_tracker_new: Nouveau tracker
558 label_tracker_new: Nouveau tracker
558 label_workflow: Workflow
559 label_workflow: Workflow
559 label_issue_status: Statut de demandes
560 label_issue_status: Statut de demandes
560 label_issue_status_plural: Statuts de demandes
561 label_issue_status_plural: Statuts de demandes
561 label_issue_status_new: Nouveau statut
562 label_issue_status_new: Nouveau statut
562 label_issue_category: CatΓ©gorie de demandes
563 label_issue_category: CatΓ©gorie de demandes
563 label_issue_category_plural: CatΓ©gories de demandes
564 label_issue_category_plural: CatΓ©gories de demandes
564 label_issue_category_new: Nouvelle catΓ©gorie
565 label_issue_category_new: Nouvelle catΓ©gorie
565 label_custom_field: Champ personnalisΓ©
566 label_custom_field: Champ personnalisΓ©
566 label_custom_field_plural: Champs personnalisΓ©s
567 label_custom_field_plural: Champs personnalisΓ©s
567 label_custom_field_new: Nouveau champ personnalisΓ©
568 label_custom_field_new: Nouveau champ personnalisΓ©
568 label_enumerations: Listes de valeurs
569 label_enumerations: Listes de valeurs
569 label_enumeration_new: Nouvelle valeur
570 label_enumeration_new: Nouvelle valeur
570 label_information: Information
571 label_information: Information
571 label_information_plural: Informations
572 label_information_plural: Informations
572 label_please_login: Identification
573 label_please_login: Identification
573 label_register: S'enregistrer
574 label_register: S'enregistrer
574 label_login_with_open_id_option: S'authentifier avec OpenID
575 label_login_with_open_id_option: S'authentifier avec OpenID
575 label_password_lost: Mot de passe perdu
576 label_password_lost: Mot de passe perdu
576 label_home: Accueil
577 label_home: Accueil
577 label_my_page: Ma page
578 label_my_page: Ma page
578 label_my_account: Mon compte
579 label_my_account: Mon compte
579 label_my_projects: Mes projets
580 label_my_projects: Mes projets
580 label_my_page_block: Blocs disponibles
581 label_my_page_block: Blocs disponibles
581 label_administration: Administration
582 label_administration: Administration
582 label_login: Connexion
583 label_login: Connexion
583 label_logout: DΓ©connexion
584 label_logout: DΓ©connexion
584 label_help: Aide
585 label_help: Aide
585 label_reported_issues: Demandes soumises
586 label_reported_issues: Demandes soumises
586 label_assigned_to_me_issues: Demandes qui me sont assignΓ©es
587 label_assigned_to_me_issues: Demandes qui me sont assignΓ©es
587 label_last_login: Dernière connexion
588 label_last_login: Dernière connexion
588 label_registered_on: Inscrit le
589 label_registered_on: Inscrit le
589 label_activity: ActivitΓ©
590 label_activity: ActivitΓ©
590 label_overall_activity: ActivitΓ© globale
591 label_overall_activity: ActivitΓ© globale
591 label_user_activity: "ActivitΓ© de %{value}"
592 label_user_activity: "ActivitΓ© de %{value}"
592 label_new: Nouveau
593 label_new: Nouveau
593 label_logged_as: ConnectΓ© en tant que
594 label_logged_as: ConnectΓ© en tant que
594 label_environment: Environnement
595 label_environment: Environnement
595 label_authentication: Authentification
596 label_authentication: Authentification
596 label_auth_source: Mode d'authentification
597 label_auth_source: Mode d'authentification
597 label_auth_source_new: Nouveau mode d'authentification
598 label_auth_source_new: Nouveau mode d'authentification
598 label_auth_source_plural: Modes d'authentification
599 label_auth_source_plural: Modes d'authentification
599 label_subproject_plural: Sous-projets
600 label_subproject_plural: Sous-projets
600 label_subproject_new: Nouveau sous-projet
601 label_subproject_new: Nouveau sous-projet
601 label_and_its_subprojects: "%{value} et ses sous-projets"
602 label_and_its_subprojects: "%{value} et ses sous-projets"
602 label_min_max_length: Longueurs mini - maxi
603 label_min_max_length: Longueurs mini - maxi
603 label_list: Liste
604 label_list: Liste
604 label_date: Date
605 label_date: Date
605 label_integer: Entier
606 label_integer: Entier
606 label_float: Nombre dΓ©cimal
607 label_float: Nombre dΓ©cimal
607 label_boolean: BoolΓ©en
608 label_boolean: BoolΓ©en
608 label_string: Texte
609 label_string: Texte
609 label_text: Texte long
610 label_text: Texte long
610 label_attribute: Attribut
611 label_attribute: Attribut
611 label_attribute_plural: Attributs
612 label_attribute_plural: Attributs
612 label_no_data: Aucune donnΓ©e Γ  afficher
613 label_no_data: Aucune donnΓ©e Γ  afficher
613 label_change_status: Changer le statut
614 label_change_status: Changer le statut
614 label_history: Historique
615 label_history: Historique
615 label_attachment: Fichier
616 label_attachment: Fichier
616 label_attachment_new: Nouveau fichier
617 label_attachment_new: Nouveau fichier
617 label_attachment_delete: Supprimer le fichier
618 label_attachment_delete: Supprimer le fichier
618 label_attachment_plural: Fichiers
619 label_attachment_plural: Fichiers
619 label_file_added: Fichier ajoutΓ©
620 label_file_added: Fichier ajoutΓ©
620 label_report: Rapport
621 label_report: Rapport
621 label_report_plural: Rapports
622 label_report_plural: Rapports
622 label_news: Annonce
623 label_news: Annonce
623 label_news_new: Nouvelle annonce
624 label_news_new: Nouvelle annonce
624 label_news_plural: Annonces
625 label_news_plural: Annonces
625 label_news_latest: Dernières annonces
626 label_news_latest: Dernières annonces
626 label_news_view_all: Voir toutes les annonces
627 label_news_view_all: Voir toutes les annonces
627 label_news_added: Annonce ajoutΓ©e
628 label_news_added: Annonce ajoutΓ©e
628 label_news_comment_added: Commentaire ajoutΓ© Γ  une annonce
629 label_news_comment_added: Commentaire ajoutΓ© Γ  une annonce
629 label_settings: Configuration
630 label_settings: Configuration
630 label_overview: AperΓ§u
631 label_overview: AperΓ§u
631 label_version: Version
632 label_version: Version
632 label_version_new: Nouvelle version
633 label_version_new: Nouvelle version
633 label_version_plural: Versions
634 label_version_plural: Versions
634 label_close_versions: Fermer les versions terminΓ©es
635 label_close_versions: Fermer les versions terminΓ©es
635 label_confirmation: Confirmation
636 label_confirmation: Confirmation
636 label_export_to: 'Formats disponibles :'
637 label_export_to: 'Formats disponibles :'
637 label_read: Lire...
638 label_read: Lire...
638 label_public_projects: Projets publics
639 label_public_projects: Projets publics
639 label_open_issues: ouvert
640 label_open_issues: ouvert
640 label_open_issues_plural: ouverts
641 label_open_issues_plural: ouverts
641 label_closed_issues: fermΓ©
642 label_closed_issues: fermΓ©
642 label_closed_issues_plural: fermΓ©s
643 label_closed_issues_plural: fermΓ©s
643 label_x_open_issues_abbr_on_total:
644 label_x_open_issues_abbr_on_total:
644 zero: 0 ouverte sur %{total}
645 zero: 0 ouverte sur %{total}
645 one: 1 ouverte sur %{total}
646 one: 1 ouverte sur %{total}
646 other: "%{count} ouvertes sur %{total}"
647 other: "%{count} ouvertes sur %{total}"
647 label_x_open_issues_abbr:
648 label_x_open_issues_abbr:
648 zero: 0 ouverte
649 zero: 0 ouverte
649 one: 1 ouverte
650 one: 1 ouverte
650 other: "%{count} ouvertes"
651 other: "%{count} ouvertes"
651 label_x_closed_issues_abbr:
652 label_x_closed_issues_abbr:
652 zero: 0 fermΓ©e
653 zero: 0 fermΓ©e
653 one: 1 fermΓ©e
654 one: 1 fermΓ©e
654 other: "%{count} fermΓ©es"
655 other: "%{count} fermΓ©es"
655 label_x_issues:
656 label_x_issues:
656 zero: 0 demande
657 zero: 0 demande
657 one: 1 demande
658 one: 1 demande
658 other: "%{count} demandes"
659 other: "%{count} demandes"
659 label_total: Total
660 label_total: Total
660 label_total_time: Temps total
661 label_total_time: Temps total
661 label_permissions: Permissions
662 label_permissions: Permissions
662 label_current_status: Statut actuel
663 label_current_status: Statut actuel
663 label_new_statuses_allowed: Nouveaux statuts autorisΓ©s
664 label_new_statuses_allowed: Nouveaux statuts autorisΓ©s
664 label_all: tous
665 label_all: tous
665 label_any: tous
666 label_any: tous
666 label_none: aucun
667 label_none: aucun
667 label_nobody: personne
668 label_nobody: personne
668 label_next: Suivant
669 label_next: Suivant
669 label_previous: PrΓ©cΓ©dent
670 label_previous: PrΓ©cΓ©dent
670 label_used_by: UtilisΓ© par
671 label_used_by: UtilisΓ© par
671 label_details: DΓ©tails
672 label_details: DΓ©tails
672 label_add_note: Ajouter une note
673 label_add_note: Ajouter une note
673 label_calendar: Calendrier
674 label_calendar: Calendrier
674 label_months_from: mois depuis
675 label_months_from: mois depuis
675 label_gantt: Gantt
676 label_gantt: Gantt
676 label_internal: Interne
677 label_internal: Interne
677 label_last_changes: "%{count} derniers changements"
678 label_last_changes: "%{count} derniers changements"
678 label_change_view_all: Voir tous les changements
679 label_change_view_all: Voir tous les changements
679 label_personalize_page: Personnaliser cette page
680 label_personalize_page: Personnaliser cette page
680 label_comment: Commentaire
681 label_comment: Commentaire
681 label_comment_plural: Commentaires
682 label_comment_plural: Commentaires
682 label_x_comments:
683 label_x_comments:
683 zero: aucun commentaire
684 zero: aucun commentaire
684 one: un commentaire
685 one: un commentaire
685 other: "%{count} commentaires"
686 other: "%{count} commentaires"
686 label_comment_add: Ajouter un commentaire
687 label_comment_add: Ajouter un commentaire
687 label_comment_added: Commentaire ajoutΓ©
688 label_comment_added: Commentaire ajoutΓ©
688 label_comment_delete: Supprimer les commentaires
689 label_comment_delete: Supprimer les commentaires
689 label_query: Rapport personnalisΓ©
690 label_query: Rapport personnalisΓ©
690 label_query_plural: Rapports personnalisΓ©s
691 label_query_plural: Rapports personnalisΓ©s
691 label_query_new: Nouveau rapport
692 label_query_new: Nouveau rapport
692 label_my_queries: Mes rapports personnalisΓ©s
693 label_my_queries: Mes rapports personnalisΓ©s
693 label_filter_add: Ajouter le filtre
694 label_filter_add: Ajouter le filtre
694 label_filter_plural: Filtres
695 label_filter_plural: Filtres
695 label_equals: Γ©gal
696 label_equals: Γ©gal
696 label_not_equals: diffΓ©rent
697 label_not_equals: diffΓ©rent
697 label_in_less_than: dans moins de
698 label_in_less_than: dans moins de
698 label_in_more_than: dans plus de
699 label_in_more_than: dans plus de
699 label_in_the_next_days: dans les prochains jours
700 label_in_the_next_days: dans les prochains jours
700 label_in_the_past_days: dans les derniers jours
701 label_in_the_past_days: dans les derniers jours
701 label_greater_or_equal: '>='
702 label_greater_or_equal: '>='
702 label_less_or_equal: '<='
703 label_less_or_equal: '<='
703 label_between: entre
704 label_between: entre
704 label_in: dans
705 label_in: dans
705 label_today: aujourd'hui
706 label_today: aujourd'hui
706 label_all_time: toute la pΓ©riode
707 label_all_time: toute la pΓ©riode
707 label_yesterday: hier
708 label_yesterday: hier
708 label_this_week: cette semaine
709 label_this_week: cette semaine
709 label_last_week: la semaine dernière
710 label_last_week: la semaine dernière
710 label_last_n_weeks: "les %{count} dernières semaines"
711 label_last_n_weeks: "les %{count} dernières semaines"
711 label_last_n_days: "les %{count} derniers jours"
712 label_last_n_days: "les %{count} derniers jours"
712 label_this_month: ce mois-ci
713 label_this_month: ce mois-ci
713 label_last_month: le mois dernier
714 label_last_month: le mois dernier
714 label_this_year: cette annΓ©e
715 label_this_year: cette annΓ©e
715 label_date_range: PΓ©riode
716 label_date_range: PΓ©riode
716 label_less_than_ago: il y a moins de
717 label_less_than_ago: il y a moins de
717 label_more_than_ago: il y a plus de
718 label_more_than_ago: il y a plus de
718 label_ago: il y a
719 label_ago: il y a
719 label_contains: contient
720 label_contains: contient
720 label_not_contains: ne contient pas
721 label_not_contains: ne contient pas
721 label_any_issues_in_project: une demande du projet
722 label_any_issues_in_project: une demande du projet
722 label_any_issues_not_in_project: une demande hors du projet
723 label_any_issues_not_in_project: une demande hors du projet
723 label_no_issues_in_project: aucune demande du projet
724 label_no_issues_in_project: aucune demande du projet
724 label_day_plural: jours
725 label_day_plural: jours
725 label_repository: DΓ©pΓ΄t
726 label_repository: DΓ©pΓ΄t
726 label_repository_new: Nouveau dΓ©pΓ΄t
727 label_repository_new: Nouveau dΓ©pΓ΄t
727 label_repository_plural: DΓ©pΓ΄ts
728 label_repository_plural: DΓ©pΓ΄ts
728 label_browse: Parcourir
729 label_browse: Parcourir
729 label_branch: Branche
730 label_branch: Branche
730 label_tag: Tag
731 label_tag: Tag
731 label_revision: RΓ©vision
732 label_revision: RΓ©vision
732 label_revision_plural: RΓ©visions
733 label_revision_plural: RΓ©visions
733 label_revision_id: "RΓ©vision %{value}"
734 label_revision_id: "RΓ©vision %{value}"
734 label_associated_revisions: RΓ©visions associΓ©es
735 label_associated_revisions: RΓ©visions associΓ©es
735 label_added: ajoutΓ©
736 label_added: ajoutΓ©
736 label_modified: modifiΓ©
737 label_modified: modifiΓ©
737 label_copied: copiΓ©
738 label_copied: copiΓ©
738 label_renamed: renommΓ©
739 label_renamed: renommΓ©
739 label_deleted: supprimΓ©
740 label_deleted: supprimΓ©
740 label_latest_revision: Dernière révision
741 label_latest_revision: Dernière révision
741 label_latest_revision_plural: Dernières révisions
742 label_latest_revision_plural: Dernières révisions
742 label_view_revisions: Voir les rΓ©visions
743 label_view_revisions: Voir les rΓ©visions
743 label_view_all_revisions: Voir toutes les rΓ©visions
744 label_view_all_revisions: Voir toutes les rΓ©visions
744 label_max_size: Taille maximale
745 label_max_size: Taille maximale
745 label_sort_highest: Remonter en premier
746 label_sort_highest: Remonter en premier
746 label_sort_higher: Remonter
747 label_sort_higher: Remonter
747 label_sort_lower: Descendre
748 label_sort_lower: Descendre
748 label_sort_lowest: Descendre en dernier
749 label_sort_lowest: Descendre en dernier
749 label_roadmap: Roadmap
750 label_roadmap: Roadmap
750 label_roadmap_due_in: "Γ‰chΓ©ance dans %{value}"
751 label_roadmap_due_in: "Γ‰chΓ©ance dans %{value}"
751 label_roadmap_overdue: "En retard de %{value}"
752 label_roadmap_overdue: "En retard de %{value}"
752 label_roadmap_no_issues: Aucune demande pour cette version
753 label_roadmap_no_issues: Aucune demande pour cette version
753 label_search: Recherche
754 label_search: Recherche
754 label_result_plural: RΓ©sultats
755 label_result_plural: RΓ©sultats
755 label_all_words: Tous les mots
756 label_all_words: Tous les mots
756 label_wiki: Wiki
757 label_wiki: Wiki
757 label_wiki_edit: RΓ©vision wiki
758 label_wiki_edit: RΓ©vision wiki
758 label_wiki_edit_plural: RΓ©visions wiki
759 label_wiki_edit_plural: RΓ©visions wiki
759 label_wiki_page: Page wiki
760 label_wiki_page: Page wiki
760 label_wiki_page_plural: Pages wiki
761 label_wiki_page_plural: Pages wiki
761 label_index_by_title: Index par titre
762 label_index_by_title: Index par titre
762 label_index_by_date: Index par date
763 label_index_by_date: Index par date
763 label_current_version: Version actuelle
764 label_current_version: Version actuelle
764 label_preview: PrΓ©visualisation
765 label_preview: PrΓ©visualisation
765 label_feed_plural: Flux Atom
766 label_feed_plural: Flux Atom
766 label_changes_details: DΓ©tails de tous les changements
767 label_changes_details: DΓ©tails de tous les changements
767 label_issue_tracking: Suivi des demandes
768 label_issue_tracking: Suivi des demandes
768 label_spent_time: Temps passΓ©
769 label_spent_time: Temps passΓ©
769 label_overall_spent_time: Temps passΓ© global
770 label_overall_spent_time: Temps passΓ© global
770 label_f_hour: "%{value} heure"
771 label_f_hour: "%{value} heure"
771 label_f_hour_plural: "%{value} heures"
772 label_f_hour_plural: "%{value} heures"
772 label_time_tracking: Suivi du temps
773 label_time_tracking: Suivi du temps
773 label_change_plural: Changements
774 label_change_plural: Changements
774 label_statistics: Statistiques
775 label_statistics: Statistiques
775 label_commits_per_month: Commits par mois
776 label_commits_per_month: Commits par mois
776 label_commits_per_author: Commits par auteur
777 label_commits_per_author: Commits par auteur
777 label_diff: diff
778 label_diff: diff
778 label_view_diff: Voir les diffΓ©rences
779 label_view_diff: Voir les diffΓ©rences
779 label_diff_inline: en ligne
780 label_diff_inline: en ligne
780 label_diff_side_by_side: cΓ΄te Γ  cΓ΄te
781 label_diff_side_by_side: cΓ΄te Γ  cΓ΄te
781 label_options: Options
782 label_options: Options
782 label_copy_workflow_from: Copier le workflow de
783 label_copy_workflow_from: Copier le workflow de
783 label_permissions_report: Synthèse des permissions
784 label_permissions_report: Synthèse des permissions
784 label_watched_issues: Demandes surveillΓ©es
785 label_watched_issues: Demandes surveillΓ©es
785 label_related_issues: Demandes liΓ©es
786 label_related_issues: Demandes liΓ©es
786 label_applied_status: Statut appliquΓ©
787 label_applied_status: Statut appliquΓ©
787 label_loading: Chargement...
788 label_loading: Chargement...
788 label_relation_new: Nouvelle relation
789 label_relation_new: Nouvelle relation
789 label_relation_delete: Supprimer la relation
790 label_relation_delete: Supprimer la relation
790 label_relates_to: LiΓ© Γ 
791 label_relates_to: LiΓ© Γ 
791 label_duplicates: Duplique
792 label_duplicates: Duplique
792 label_duplicated_by: DupliquΓ© par
793 label_duplicated_by: DupliquΓ© par
793 label_blocks: Bloque
794 label_blocks: Bloque
794 label_blocked_by: BloquΓ© par
795 label_blocked_by: BloquΓ© par
795 label_precedes: Précède
796 label_precedes: Précède
796 label_follows: Suit
797 label_follows: Suit
797 label_copied_to: CopiΓ© vers
798 label_copied_to: CopiΓ© vers
798 label_copied_from: CopiΓ© depuis
799 label_copied_from: CopiΓ© depuis
799 label_end_to_start: fin Γ  dΓ©but
800 label_end_to_start: fin Γ  dΓ©but
800 label_end_to_end: fin Γ  fin
801 label_end_to_end: fin Γ  fin
801 label_start_to_start: dΓ©but Γ  dΓ©but
802 label_start_to_start: dΓ©but Γ  dΓ©but
802 label_start_to_end: dΓ©but Γ  fin
803 label_start_to_end: dΓ©but Γ  fin
803 label_stay_logged_in: Rester connectΓ©
804 label_stay_logged_in: Rester connectΓ©
804 label_disabled: dΓ©sactivΓ©
805 label_disabled: dΓ©sactivΓ©
805 label_show_completed_versions: Voir les versions passΓ©es
806 label_show_completed_versions: Voir les versions passΓ©es
806 label_me: moi
807 label_me: moi
807 label_board: Forum
808 label_board: Forum
808 label_board_new: Nouveau forum
809 label_board_new: Nouveau forum
809 label_board_plural: Forums
810 label_board_plural: Forums
810 label_board_locked: VerrouillΓ©
811 label_board_locked: VerrouillΓ©
811 label_board_sticky: Sticky
812 label_board_sticky: Sticky
812 label_topic_plural: Discussions
813 label_topic_plural: Discussions
813 label_message_plural: Messages
814 label_message_plural: Messages
814 label_message_last: Dernier message
815 label_message_last: Dernier message
815 label_message_new: Nouveau message
816 label_message_new: Nouveau message
816 label_message_posted: Message ajoutΓ©
817 label_message_posted: Message ajoutΓ©
817 label_reply_plural: RΓ©ponses
818 label_reply_plural: RΓ©ponses
818 label_send_information: Envoyer les informations Γ  l'utilisateur
819 label_send_information: Envoyer les informations Γ  l'utilisateur
819 label_year: AnnΓ©e
820 label_year: AnnΓ©e
820 label_month: Mois
821 label_month: Mois
821 label_week: Semaine
822 label_week: Semaine
822 label_date_from: Du
823 label_date_from: Du
823 label_date_to: Au
824 label_date_to: Au
824 label_language_based: BasΓ© sur la langue de l'utilisateur
825 label_language_based: BasΓ© sur la langue de l'utilisateur
825 label_sort_by: "Trier par %{value}"
826 label_sort_by: "Trier par %{value}"
826 label_send_test_email: Envoyer un email de test
827 label_send_test_email: Envoyer un email de test
827 label_feeds_access_key: Clé d'accès Atom
828 label_feeds_access_key: Clé d'accès Atom
828 label_missing_feeds_access_key: Clé d'accès Atom manquante
829 label_missing_feeds_access_key: Clé d'accès Atom manquante
829 label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}"
830 label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}"
830 label_module_plural: Modules
831 label_module_plural: Modules
831 label_added_time_by: "AjoutΓ© par %{author} il y a %{age}"
832 label_added_time_by: "AjoutΓ© par %{author} il y a %{age}"
832 label_updated_time_by: "Mis Γ  jour par %{author} il y a %{age}"
833 label_updated_time_by: "Mis Γ  jour par %{author} il y a %{age}"
833 label_updated_time: "Mis Γ  jour il y a %{value}"
834 label_updated_time: "Mis Γ  jour il y a %{value}"
834 label_jump_to_a_project: Aller Γ  un projet...
835 label_jump_to_a_project: Aller Γ  un projet...
835 label_file_plural: Fichiers
836 label_file_plural: Fichiers
836 label_changeset_plural: RΓ©visions
837 label_changeset_plural: RΓ©visions
837 label_default_columns: Colonnes par dΓ©faut
838 label_default_columns: Colonnes par dΓ©faut
838 label_no_change_option: (Pas de changement)
839 label_no_change_option: (Pas de changement)
839 label_bulk_edit_selected_issues: Modifier les demandes sΓ©lectionnΓ©es
840 label_bulk_edit_selected_issues: Modifier les demandes sΓ©lectionnΓ©es
840 label_bulk_edit_selected_time_entries: Modifier les temps passΓ©s sΓ©lectionnΓ©s
841 label_bulk_edit_selected_time_entries: Modifier les temps passΓ©s sΓ©lectionnΓ©s
841 label_theme: Thème
842 label_theme: Thème
842 label_default: DΓ©faut
843 label_default: DΓ©faut
843 label_search_titles_only: Uniquement dans les titres
844 label_search_titles_only: Uniquement dans les titres
844 label_user_mail_option_all: "Pour tous les Γ©vΓ©nements de tous mes projets"
845 label_user_mail_option_all: "Pour tous les Γ©vΓ©nements de tous mes projets"
845 label_user_mail_option_selected: "Pour tous les Γ©vΓ©nements des projets sΓ©lectionnΓ©s..."
846 label_user_mail_option_selected: "Pour tous les Γ©vΓ©nements des projets sΓ©lectionnΓ©s..."
846 label_user_mail_option_none: Aucune notification
847 label_user_mail_option_none: Aucune notification
847 label_user_mail_option_only_my_events: Seulement pour ce que je surveille
848 label_user_mail_option_only_my_events: Seulement pour ce que je surveille
848 label_user_mail_option_only_assigned: Seulement pour ce qui m'est assignΓ©
849 label_user_mail_option_only_assigned: Seulement pour ce qui m'est assignΓ©
849 label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
850 label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
850 label_user_mail_no_self_notified: "Je ne veux pas Γͺtre notifiΓ© des changements que j'effectue"
851 label_user_mail_no_self_notified: "Je ne veux pas Γͺtre notifiΓ© des changements que j'effectue"
851 label_registration_activation_by_email: activation du compte par email
852 label_registration_activation_by_email: activation du compte par email
852 label_registration_manual_activation: activation manuelle du compte
853 label_registration_manual_activation: activation manuelle du compte
853 label_registration_automatic_activation: activation automatique du compte
854 label_registration_automatic_activation: activation automatique du compte
854 label_display_per_page: "Par page : %{value}"
855 label_display_per_page: "Par page : %{value}"
855 label_age: Γ‚ge
856 label_age: Γ‚ge
856 label_change_properties: Changer les propriΓ©tΓ©s
857 label_change_properties: Changer les propriΓ©tΓ©s
857 label_general: GΓ©nΓ©ral
858 label_general: GΓ©nΓ©ral
858 label_more: Plus
859 label_more: Plus
859 label_scm: SCM
860 label_scm: SCM
860 label_plugins: Plugins
861 label_plugins: Plugins
861 label_ldap_authentication: Authentification LDAP
862 label_ldap_authentication: Authentification LDAP
862 label_downloads_abbr: D/L
863 label_downloads_abbr: D/L
863 label_optional_description: Description facultative
864 label_optional_description: Description facultative
864 label_add_another_file: Ajouter un autre fichier
865 label_add_another_file: Ajouter un autre fichier
865 label_preferences: PrΓ©fΓ©rences
866 label_preferences: PrΓ©fΓ©rences
866 label_chronological_order: Dans l'ordre chronologique
867 label_chronological_order: Dans l'ordre chronologique
867 label_reverse_chronological_order: Dans l'ordre chronologique inverse
868 label_reverse_chronological_order: Dans l'ordre chronologique inverse
868 label_planning: Planning
869 label_planning: Planning
869 label_incoming_emails: Emails entrants
870 label_incoming_emails: Emails entrants
870 label_generate_key: GΓ©nΓ©rer une clΓ©
871 label_generate_key: GΓ©nΓ©rer une clΓ©
871 label_issue_watchers: Observateurs
872 label_issue_watchers: Observateurs
872 label_example: Exemple
873 label_example: Exemple
873 label_display: Affichage
874 label_display: Affichage
874 label_sort: Tri
875 label_sort: Tri
875 label_ascending: Croissant
876 label_ascending: Croissant
876 label_descending: DΓ©croissant
877 label_descending: DΓ©croissant
877 label_date_from_to: Du %{start} au %{end}
878 label_date_from_to: Du %{start} au %{end}
878 label_wiki_content_added: Page wiki ajoutΓ©e
879 label_wiki_content_added: Page wiki ajoutΓ©e
879 label_wiki_content_updated: Page wiki mise Γ  jour
880 label_wiki_content_updated: Page wiki mise Γ  jour
880 label_group: Groupe
881 label_group: Groupe
881 label_group_plural: Groupes
882 label_group_plural: Groupes
882 label_group_new: Nouveau groupe
883 label_group_new: Nouveau groupe
883 label_group_anonymous: Utilisateurs anonymes
884 label_group_anonymous: Utilisateurs anonymes
884 label_group_non_member: Utilisateurs non membres
885 label_group_non_member: Utilisateurs non membres
885 label_time_entry_plural: Temps passΓ©
886 label_time_entry_plural: Temps passΓ©
886 label_version_sharing_none: Non partagΓ©
887 label_version_sharing_none: Non partagΓ©
887 label_version_sharing_descendants: Avec les sous-projets
888 label_version_sharing_descendants: Avec les sous-projets
888 label_version_sharing_hierarchy: Avec toute la hiΓ©rarchie
889 label_version_sharing_hierarchy: Avec toute la hiΓ©rarchie
889 label_version_sharing_tree: Avec tout l'arbre
890 label_version_sharing_tree: Avec tout l'arbre
890 label_version_sharing_system: Avec tous les projets
891 label_version_sharing_system: Avec tous les projets
891 label_update_issue_done_ratios: Mettre Γ  jour l'avancement des demandes
892 label_update_issue_done_ratios: Mettre Γ  jour l'avancement des demandes
892 label_copy_source: Source
893 label_copy_source: Source
893 label_copy_target: Cible
894 label_copy_target: Cible
894 label_copy_same_as_target: Comme la cible
895 label_copy_same_as_target: Comme la cible
895 label_display_used_statuses_only: N'afficher que les statuts utilisΓ©s dans ce tracker
896 label_display_used_statuses_only: N'afficher que les statuts utilisΓ©s dans ce tracker
896 label_api_access_key: Clé d'accès API
897 label_api_access_key: Clé d'accès API
897 label_missing_api_access_key: Clé d'accès API manquante
898 label_missing_api_access_key: Clé d'accès API manquante
898 label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
899 label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
899 label_profile: Profil
900 label_profile: Profil
900 label_subtask_plural: Sous-tΓ’ches
901 label_subtask_plural: Sous-tΓ’ches
901 label_project_copy_notifications: Envoyer les notifications durant la copie du projet
902 label_project_copy_notifications: Envoyer les notifications durant la copie du projet
902 label_principal_search: "Rechercher un utilisateur ou un groupe :"
903 label_principal_search: "Rechercher un utilisateur ou un groupe :"
903 label_user_search: "Rechercher un utilisateur :"
904 label_user_search: "Rechercher un utilisateur :"
904 label_additional_workflow_transitions_for_author: Autorisations supplémentaires lorsque l'utilisateur a créé la demande
905 label_additional_workflow_transitions_for_author: Autorisations supplémentaires lorsque l'utilisateur a créé la demande
905 label_additional_workflow_transitions_for_assignee: Autorisations supplΓ©mentaires lorsque la demande est assignΓ©e Γ  l'utilisateur
906 label_additional_workflow_transitions_for_assignee: Autorisations supplΓ©mentaires lorsque la demande est assignΓ©e Γ  l'utilisateur
906 label_issues_visibility_all: Toutes les demandes
907 label_issues_visibility_all: Toutes les demandes
907 label_issues_visibility_public: Toutes les demandes non privΓ©es
908 label_issues_visibility_public: Toutes les demandes non privΓ©es
908 label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur
909 label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur
909 label_git_report_last_commit: Afficher le dernier commit des fichiers et rΓ©pertoires
910 label_git_report_last_commit: Afficher le dernier commit des fichiers et rΓ©pertoires
910 label_parent_revision: Parent
911 label_parent_revision: Parent
911 label_child_revision: Enfant
912 label_child_revision: Enfant
912 label_export_options: Options d'exportation %{export_format}
913 label_export_options: Options d'exportation %{export_format}
913 label_copy_attachments: Copier les fichiers
914 label_copy_attachments: Copier les fichiers
914 label_copy_subtasks: Copier les sous-tΓ’ches
915 label_copy_subtasks: Copier les sous-tΓ’ches
915 label_item_position: "%{position} sur %{count}"
916 label_item_position: "%{position} sur %{count}"
916 label_completed_versions: Versions passΓ©es
917 label_completed_versions: Versions passΓ©es
917 label_search_for_watchers: Rechercher des observateurs
918 label_search_for_watchers: Rechercher des observateurs
918 label_session_expiration: Expiration des sessions
919 label_session_expiration: Expiration des sessions
919 label_show_closed_projects: Voir les projets fermΓ©s
920 label_show_closed_projects: Voir les projets fermΓ©s
920 label_status_transitions: Changements de statut
921 label_status_transitions: Changements de statut
921 label_fields_permissions: Permissions sur les champs
922 label_fields_permissions: Permissions sur les champs
922 label_readonly: Lecture
923 label_readonly: Lecture
923 label_required: Obligatoire
924 label_required: Obligatoire
924 label_hidden: CachΓ©
925 label_hidden: CachΓ©
925 label_attribute_of_project: "%{name} du projet"
926 label_attribute_of_project: "%{name} du projet"
926 label_attribute_of_issue: "%{name} de la demande"
927 label_attribute_of_issue: "%{name} de la demande"
927 label_attribute_of_author: "%{name} de l'auteur"
928 label_attribute_of_author: "%{name} de l'auteur"
928 label_attribute_of_assigned_to: "%{name} de l'assignΓ©"
929 label_attribute_of_assigned_to: "%{name} de l'assignΓ©"
929 label_attribute_of_user: "%{name} de l'utilisateur"
930 label_attribute_of_user: "%{name} de l'utilisateur"
930 label_attribute_of_fixed_version: "%{name} de la version cible"
931 label_attribute_of_fixed_version: "%{name} de la version cible"
931 label_cross_project_descendants: Avec les sous-projets
932 label_cross_project_descendants: Avec les sous-projets
932 label_cross_project_tree: Avec tout l'arbre
933 label_cross_project_tree: Avec tout l'arbre
933 label_cross_project_hierarchy: Avec toute la hiΓ©rarchie
934 label_cross_project_hierarchy: Avec toute la hiΓ©rarchie
934 label_cross_project_system: Avec tous les projets
935 label_cross_project_system: Avec tous les projets
935 label_gantt_progress_line: Ligne de progression
936 label_gantt_progress_line: Ligne de progression
936 label_visibility_private: par moi uniquement
937 label_visibility_private: par moi uniquement
937 label_visibility_roles: par ces rΓ΄les uniquement
938 label_visibility_roles: par ces rΓ΄les uniquement
938 label_visibility_public: par tout le monde
939 label_visibility_public: par tout le monde
939 label_link: Lien
940 label_link: Lien
940 label_only: seulement
941 label_only: seulement
941 label_drop_down_list: liste dΓ©roulante
942 label_drop_down_list: liste dΓ©roulante
942 label_checkboxes: cases Γ  cocher
943 label_checkboxes: cases Γ  cocher
943 label_radio_buttons: boutons radio
944 label_radio_buttons: boutons radio
944 label_link_values_to: Lier les valeurs vers l'URL
945 label_link_values_to: Lier les valeurs vers l'URL
945 label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisΓ©
946 label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisΓ©
946 label_check_for_updates: VΓ©rifier les mises Γ  jour
947 label_check_for_updates: VΓ©rifier les mises Γ  jour
947 label_latest_compatible_version: Dernière version compatible
948 label_latest_compatible_version: Dernière version compatible
948 label_unknown_plugin: Plugin inconnu
949 label_unknown_plugin: Plugin inconnu
949 label_add_projects: Ajouter des projets
950 label_add_projects: Ajouter des projets
950 label_users_visibility_all: Tous les utilisateurs actifs
951 label_users_visibility_all: Tous les utilisateurs actifs
951 label_users_visibility_members_of_visible_projects: Membres des projets visibles
952 label_users_visibility_members_of_visible_projects: Membres des projets visibles
952 label_edit_attachments: Modifier les fichiers attachΓ©s
953 label_edit_attachments: Modifier les fichiers attachΓ©s
953 label_link_copied_issue: Lier la demande copiΓ©e
954 label_link_copied_issue: Lier la demande copiΓ©e
954 label_ask: Demander
955 label_ask: Demander
955 label_search_attachments_yes: Rechercher les noms et descriptions de fichiers
956 label_search_attachments_yes: Rechercher les noms et descriptions de fichiers
956 label_search_attachments_no: Ne pas rechercher les fichiers
957 label_search_attachments_no: Ne pas rechercher les fichiers
957 label_search_attachments_only: Rechercher les fichiers uniquement
958 label_search_attachments_only: Rechercher les fichiers uniquement
958 label_search_open_issues_only: Demandes ouvertes uniquement
959 label_search_open_issues_only: Demandes ouvertes uniquement
959 label_email_address_plural: Emails
960 label_email_address_plural: Emails
960 label_email_address_add: Ajouter une adresse email
961 label_email_address_add: Ajouter une adresse email
961 label_enable_notifications: Activer les notifications
962 label_enable_notifications: Activer les notifications
962 label_disable_notifications: DΓ©sactiver les notifications
963 label_disable_notifications: DΓ©sactiver les notifications
963 label_blank_value: non renseignΓ©
964 label_blank_value: non renseignΓ©
964 label_parent_task_attributes: Attributs des tΓ’ches parentes
965 label_parent_task_attributes: Attributs des tΓ’ches parentes
966 label_time_entries_visibility_all: Tous les temps passΓ©s
967 label_time_entries_visibility_own: Ses propres temps passΓ©s
965
968
966 button_login: Connexion
969 button_login: Connexion
967 button_submit: Soumettre
970 button_submit: Soumettre
968 button_save: Sauvegarder
971 button_save: Sauvegarder
969 button_check_all: Tout cocher
972 button_check_all: Tout cocher
970 button_uncheck_all: Tout dΓ©cocher
973 button_uncheck_all: Tout dΓ©cocher
971 button_collapse_all: Plier tout
974 button_collapse_all: Plier tout
972 button_expand_all: DΓ©plier tout
975 button_expand_all: DΓ©plier tout
973 button_delete: Supprimer
976 button_delete: Supprimer
974 button_create: CrΓ©er
977 button_create: CrΓ©er
975 button_create_and_continue: CrΓ©er et continuer
978 button_create_and_continue: CrΓ©er et continuer
976 button_test: Tester
979 button_test: Tester
977 button_edit: Modifier
980 button_edit: Modifier
978 button_edit_associated_wikipage: "Modifier la page wiki associΓ©e: %{page_title}"
981 button_edit_associated_wikipage: "Modifier la page wiki associΓ©e: %{page_title}"
979 button_add: Ajouter
982 button_add: Ajouter
980 button_change: Changer
983 button_change: Changer
981 button_apply: Appliquer
984 button_apply: Appliquer
982 button_clear: Effacer
985 button_clear: Effacer
983 button_lock: Verrouiller
986 button_lock: Verrouiller
984 button_unlock: DΓ©verrouiller
987 button_unlock: DΓ©verrouiller
985 button_download: TΓ©lΓ©charger
988 button_download: TΓ©lΓ©charger
986 button_list: Lister
989 button_list: Lister
987 button_view: Voir
990 button_view: Voir
988 button_move: DΓ©placer
991 button_move: DΓ©placer
989 button_move_and_follow: DΓ©placer et suivre
992 button_move_and_follow: DΓ©placer et suivre
990 button_back: Retour
993 button_back: Retour
991 button_cancel: Annuler
994 button_cancel: Annuler
992 button_activate: Activer
995 button_activate: Activer
993 button_sort: Trier
996 button_sort: Trier
994 button_log_time: Saisir temps
997 button_log_time: Saisir temps
995 button_rollback: Revenir Γ  cette version
998 button_rollback: Revenir Γ  cette version
996 button_watch: Surveiller
999 button_watch: Surveiller
997 button_unwatch: Ne plus surveiller
1000 button_unwatch: Ne plus surveiller
998 button_reply: RΓ©pondre
1001 button_reply: RΓ©pondre
999 button_archive: Archiver
1002 button_archive: Archiver
1000 button_unarchive: DΓ©sarchiver
1003 button_unarchive: DΓ©sarchiver
1001 button_reset: RΓ©initialiser
1004 button_reset: RΓ©initialiser
1002 button_rename: Renommer
1005 button_rename: Renommer
1003 button_change_password: Changer de mot de passe
1006 button_change_password: Changer de mot de passe
1004 button_copy: Copier
1007 button_copy: Copier
1005 button_copy_and_follow: Copier et suivre
1008 button_copy_and_follow: Copier et suivre
1006 button_annotate: Annoter
1009 button_annotate: Annoter
1007 button_update: Mettre Γ  jour
1010 button_update: Mettre Γ  jour
1008 button_configure: Configurer
1011 button_configure: Configurer
1009 button_quote: Citer
1012 button_quote: Citer
1010 button_duplicate: Dupliquer
1013 button_duplicate: Dupliquer
1011 button_show: Afficher
1014 button_show: Afficher
1012 button_hide: Cacher
1015 button_hide: Cacher
1013 button_edit_section: Modifier cette section
1016 button_edit_section: Modifier cette section
1014 button_export: Exporter
1017 button_export: Exporter
1015 button_delete_my_account: Supprimer mon compte
1018 button_delete_my_account: Supprimer mon compte
1016 button_close: Fermer
1019 button_close: Fermer
1017 button_reopen: RΓ©ouvrir
1020 button_reopen: RΓ©ouvrir
1018
1021
1019 status_active: actif
1022 status_active: actif
1020 status_registered: enregistrΓ©
1023 status_registered: enregistrΓ©
1021 status_locked: verrouillΓ©
1024 status_locked: verrouillΓ©
1022
1025
1023 project_status_active: actif
1026 project_status_active: actif
1024 project_status_closed: fermΓ©
1027 project_status_closed: fermΓ©
1025 project_status_archived: archivΓ©
1028 project_status_archived: archivΓ©
1026
1029
1027 version_status_open: ouvert
1030 version_status_open: ouvert
1028 version_status_locked: verrouillΓ©
1031 version_status_locked: verrouillΓ©
1029 version_status_closed: fermΓ©
1032 version_status_closed: fermΓ©
1030
1033
1031 field_active: Actif
1034 field_active: Actif
1032
1035
1033 text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyΓ©e
1036 text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyΓ©e
1034 text_regexp_info: ex. ^[A-Z0-9]+$
1037 text_regexp_info: ex. ^[A-Z0-9]+$
1035 text_min_max_length_info: 0 pour aucune restriction
1038 text_min_max_length_info: 0 pour aucune restriction
1036 text_project_destroy_confirmation: Êtes-vous sûr de vouloir supprimer ce projet et toutes ses données ?
1039 text_project_destroy_confirmation: Êtes-vous sûr de vouloir supprimer ce projet et toutes ses données ?
1037 text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront Γ©galement supprimΓ©s."
1040 text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront Γ©galement supprimΓ©s."
1038 text_workflow_edit: SΓ©lectionner un tracker et un rΓ΄le pour Γ©diter le workflow
1041 text_workflow_edit: SΓ©lectionner un tracker et un rΓ΄le pour Γ©diter le workflow
1039 text_are_you_sure: Êtes-vous sûr ?
1042 text_are_you_sure: Êtes-vous sûr ?
1040 text_journal_changed: "%{label} changΓ© de %{old} Γ  %{new}"
1043 text_journal_changed: "%{label} changΓ© de %{old} Γ  %{new}"
1041 text_journal_changed_no_detail: "%{label} mis Γ  jour"
1044 text_journal_changed_no_detail: "%{label} mis Γ  jour"
1042 text_journal_set_to: "%{label} mis Γ  %{value}"
1045 text_journal_set_to: "%{label} mis Γ  %{value}"
1043 text_journal_deleted: "%{label} %{old} supprimΓ©"
1046 text_journal_deleted: "%{label} %{old} supprimΓ©"
1044 text_journal_added: "%{label} %{value} ajoutΓ©"
1047 text_journal_added: "%{label} %{value} ajoutΓ©"
1045 text_tip_issue_begin_day: tΓ’che commenΓ§ant ce jour
1048 text_tip_issue_begin_day: tΓ’che commenΓ§ant ce jour
1046 text_tip_issue_end_day: tΓ’che finissant ce jour
1049 text_tip_issue_end_day: tΓ’che finissant ce jour
1047 text_tip_issue_begin_end_day: tΓ’che commenΓ§ant et finissant ce jour
1050 text_tip_issue_begin_end_day: tΓ’che commenΓ§ant et finissant ce jour
1048 text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisΓ©s, doit commencer par une minuscule.<br />Un fois sauvegardΓ©, l''identifiant ne pourra plus Γͺtre modifiΓ©.'
1051 text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisΓ©s, doit commencer par une minuscule.<br />Un fois sauvegardΓ©, l''identifiant ne pourra plus Γͺtre modifiΓ©.'
1049 text_caracters_maximum: "%{count} caractères maximum."
1052 text_caracters_maximum: "%{count} caractères maximum."
1050 text_caracters_minimum: "%{count} caractères minimum."
1053 text_caracters_minimum: "%{count} caractères minimum."
1051 text_length_between: "Longueur comprise entre %{min} et %{max} caractères."
1054 text_length_between: "Longueur comprise entre %{min} et %{max} caractères."
1052 text_tracker_no_workflow: Aucun worflow n'est dΓ©fini pour ce tracker
1055 text_tracker_no_workflow: Aucun worflow n'est dΓ©fini pour ce tracker
1053 text_unallowed_characters: Caractères non autorisés
1056 text_unallowed_characters: Caractères non autorisés
1054 text_comma_separated: Plusieurs valeurs possibles (sΓ©parΓ©es par des virgules).
1057 text_comma_separated: Plusieurs valeurs possibles (sΓ©parΓ©es par des virgules).
1055 text_line_separated: Plusieurs valeurs possibles (une valeur par ligne).
1058 text_line_separated: Plusieurs valeurs possibles (une valeur par ligne).
1056 text_issues_ref_in_commit_messages: RΓ©fΓ©rencement et rΓ©solution des demandes dans les commentaires de commits
1059 text_issues_ref_in_commit_messages: RΓ©fΓ©rencement et rΓ©solution des demandes dans les commentaires de commits
1057 text_issue_added: "La demande %{id} a Γ©tΓ© soumise par %{author}."
1060 text_issue_added: "La demande %{id} a Γ©tΓ© soumise par %{author}."
1058 text_issue_updated: "La demande %{id} a Γ©tΓ© mise Γ  jour par %{author}."
1061 text_issue_updated: "La demande %{id} a Γ©tΓ© mise Γ  jour par %{author}."
1059 text_wiki_destroy_confirmation: Etes-vous sΓ»r de vouloir supprimer ce wiki et tout son contenu ?
1062 text_wiki_destroy_confirmation: Etes-vous sΓ»r de vouloir supprimer ce wiki et tout son contenu ?
1060 text_issue_category_destroy_question: "%{count} demandes sont affectΓ©es Γ  cette catΓ©gorie. Que voulez-vous faire ?"
1063 text_issue_category_destroy_question: "%{count} demandes sont affectΓ©es Γ  cette catΓ©gorie. Que voulez-vous faire ?"
1061 text_issue_category_destroy_assignments: N'affecter les demandes Γ  aucune autre catΓ©gorie
1064 text_issue_category_destroy_assignments: N'affecter les demandes Γ  aucune autre catΓ©gorie
1062 text_issue_category_reassign_to: RΓ©affecter les demandes Γ  cette catΓ©gorie
1065 text_issue_category_reassign_to: RΓ©affecter les demandes Γ  cette catΓ©gorie
1063 text_user_mail_option: "Pour les projets non sΓ©lectionnΓ©s, vous recevrez seulement des notifications pour ce que vous surveillez ou Γ  quoi vous participez (exemple: demandes dont vous Γͺtes l'auteur ou la personne assignΓ©e)."
1066 text_user_mail_option: "Pour les projets non sΓ©lectionnΓ©s, vous recevrez seulement des notifications pour ce que vous surveillez ou Γ  quoi vous participez (exemple: demandes dont vous Γͺtes l'auteur ou la personne assignΓ©e)."
1064 text_no_configuration_data: "Les rΓ΄les, trackers, statuts et le workflow ne sont pas encore paramΓ©trΓ©s.\nIl est vivement recommandΓ© de charger le paramΓ©trage par defaut. Vous pourrez le modifier une fois chargΓ©."
1067 text_no_configuration_data: "Les rΓ΄les, trackers, statuts et le workflow ne sont pas encore paramΓ©trΓ©s.\nIl est vivement recommandΓ© de charger le paramΓ©trage par defaut. Vous pourrez le modifier une fois chargΓ©."
1065 text_load_default_configuration: Charger le paramΓ©trage par dΓ©faut
1068 text_load_default_configuration: Charger le paramΓ©trage par dΓ©faut
1066 text_status_changed_by_changeset: "AppliquΓ© par commit %{value}."
1069 text_status_changed_by_changeset: "AppliquΓ© par commit %{value}."
1067 text_time_logged_by_changeset: "AppliquΓ© par commit %{value}"
1070 text_time_logged_by_changeset: "AppliquΓ© par commit %{value}"
1068 text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?'
1071 text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?'
1069 text_issues_destroy_descendants_confirmation: "Cela entrainera Γ©galement la suppression de %{count} sous-tΓ’che(s)."
1072 text_issues_destroy_descendants_confirmation: "Cela entrainera Γ©galement la suppression de %{count} sous-tΓ’che(s)."
1070 text_time_entries_destroy_confirmation: "Etes-vous sΓ»r de vouloir supprimer les temps passΓ©s sΓ©lectionnΓ©s ?"
1073 text_time_entries_destroy_confirmation: "Etes-vous sΓ»r de vouloir supprimer les temps passΓ©s sΓ©lectionnΓ©s ?"
1071 text_select_project_modules: 'SΓ©lectionner les modules Γ  activer pour ce projet :'
1074 text_select_project_modules: 'SΓ©lectionner les modules Γ  activer pour ce projet :'
1072 text_default_administrator_account_changed: Compte administrateur par dΓ©faut changΓ©
1075 text_default_administrator_account_changed: Compte administrateur par dΓ©faut changΓ©
1073 text_file_repository_writable: RΓ©pertoire de stockage des fichiers accessible en Γ©criture
1076 text_file_repository_writable: RΓ©pertoire de stockage des fichiers accessible en Γ©criture
1074 text_plugin_assets_writable: RΓ©pertoire public des plugins accessible en Γ©criture
1077 text_plugin_assets_writable: RΓ©pertoire public des plugins accessible en Γ©criture
1075 text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
1078 text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
1076 text_convert_available: Binaire convert de ImageMagick prΓ©sent (optionel)
1079 text_convert_available: Binaire convert de ImageMagick prΓ©sent (optionel)
1077 text_destroy_time_entries_question: "%{hours} heures ont Γ©tΓ© enregistrΓ©es sur les demandes Γ  supprimer. Que voulez-vous faire ?"
1080 text_destroy_time_entries_question: "%{hours} heures ont Γ©tΓ© enregistrΓ©es sur les demandes Γ  supprimer. Que voulez-vous faire ?"
1078 text_destroy_time_entries: Supprimer les heures
1081 text_destroy_time_entries: Supprimer les heures
1079 text_assign_time_entries_to_project: Reporter les heures sur le projet
1082 text_assign_time_entries_to_project: Reporter les heures sur le projet
1080 text_reassign_time_entries: 'Reporter les heures sur cette demande:'
1083 text_reassign_time_entries: 'Reporter les heures sur cette demande:'
1081 text_user_wrote: "%{value} a Γ©crit :"
1084 text_user_wrote: "%{value} a Γ©crit :"
1082 text_enumeration_destroy_question: "Cette valeur est affectΓ©e Γ  %{count} objets."
1085 text_enumeration_destroy_question: "Cette valeur est affectΓ©e Γ  %{count} objets."
1083 text_enumeration_category_reassign_to: 'RΓ©affecter les objets Γ  cette valeur:'
1086 text_enumeration_category_reassign_to: 'RΓ©affecter les objets Γ  cette valeur:'
1084 text_email_delivery_not_configured: "L'envoi de mail n'est pas configurΓ©, les notifications sont dΓ©sactivΓ©es.\nConfigurez votre serveur SMTP dans config/configuration.yml et redΓ©marrez l'application pour les activer."
1087 text_email_delivery_not_configured: "L'envoi de mail n'est pas configurΓ©, les notifications sont dΓ©sactivΓ©es.\nConfigurez votre serveur SMTP dans config/configuration.yml et redΓ©marrez l'application pour les activer."
1085 text_repository_usernames_mapping: "Vous pouvez sΓ©lectionner ou modifier l'utilisateur Redmine associΓ© Γ  chaque nom d'utilisateur figurant dans l'historique du dΓ©pΓ΄t.\nLes utilisateurs avec le mΓͺme identifiant ou la mΓͺme adresse mail seront automatiquement associΓ©s."
1088 text_repository_usernames_mapping: "Vous pouvez sΓ©lectionner ou modifier l'utilisateur Redmine associΓ© Γ  chaque nom d'utilisateur figurant dans l'historique du dΓ©pΓ΄t.\nLes utilisateurs avec le mΓͺme identifiant ou la mΓͺme adresse mail seront automatiquement associΓ©s."
1086 text_diff_truncated: '... Ce diffΓ©rentiel a Γ©tΓ© tronquΓ© car il excΓ¨de la taille maximale pouvant Γͺtre affichΓ©e.'
1089 text_diff_truncated: '... Ce diffΓ©rentiel a Γ©tΓ© tronquΓ© car il excΓ¨de la taille maximale pouvant Γͺtre affichΓ©e.'
1087 text_custom_field_possible_values_info: 'Une ligne par valeur'
1090 text_custom_field_possible_values_info: 'Une ligne par valeur'
1088 text_wiki_page_destroy_question: "Cette page possède %{descendants} sous-page(s) et descendante(s). Que voulez-vous faire ?"
1091 text_wiki_page_destroy_question: "Cette page possède %{descendants} sous-page(s) et descendante(s). Que voulez-vous faire ?"
1089 text_wiki_page_nullify_children: "Conserver les sous-pages en tant que pages racines"
1092 text_wiki_page_nullify_children: "Conserver les sous-pages en tant que pages racines"
1090 text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
1093 text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
1091 text_wiki_page_reassign_children: "RΓ©affecter les sous-pages Γ  cette page"
1094 text_wiki_page_reassign_children: "RΓ©affecter les sous-pages Γ  cette page"
1092 text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-Γͺtre plus autorisΓ© Γ  modifier ce projet.\nEtes-vous sΓ»r de vouloir continuer ?"
1095 text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-Γͺtre plus autorisΓ© Γ  modifier ce projet.\nEtes-vous sΓ»r de vouloir continuer ?"
1093 text_zoom_in: Zoom avant
1096 text_zoom_in: Zoom avant
1094 text_zoom_out: Zoom arrière
1097 text_zoom_out: Zoom arrière
1095 text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardΓ© qui sera perdu si vous quittez la page."
1098 text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardΓ© qui sera perdu si vous quittez la page."
1096 text_scm_path_encoding_note: "DΓ©faut : UTF-8"
1099 text_scm_path_encoding_note: "DΓ©faut : UTF-8"
1097 text_subversion_repository_note: "Exemples (en fonction des protocoles supportΓ©s) : file:///, http://, https://, svn://, svn+[tunnelscheme]://"
1100 text_subversion_repository_note: "Exemples (en fonction des protocoles supportΓ©s) : file:///, http://, https://, svn://, svn+[tunnelscheme]://"
1098 text_git_repository_note: "Chemin vers un dΓ©pΓ΄t vide et local (exemples : /gitrepo, c:\\gitrepo)"
1101 text_git_repository_note: "Chemin vers un dΓ©pΓ΄t vide et local (exemples : /gitrepo, c:\\gitrepo)"
1099 text_mercurial_repository_note: "Chemin vers un dΓ©pΓ΄t local (exemples : /hgrepo, c:\\hgrepo)"
1102 text_mercurial_repository_note: "Chemin vers un dΓ©pΓ΄t local (exemples : /hgrepo, c:\\hgrepo)"
1100 text_scm_command: Commande
1103 text_scm_command: Commande
1101 text_scm_command_version: Version
1104 text_scm_command_version: Version
1102 text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
1105 text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
1103 text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
1106 text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
1104 text_issue_conflict_resolution_overwrite: "Appliquer quand mΓͺme ma mise Γ  jour (les notes prΓ©cΓ©dentes seront conservΓ©es mais des changements pourront Γͺtre Γ©crasΓ©s)"
1107 text_issue_conflict_resolution_overwrite: "Appliquer quand mΓͺme ma mise Γ  jour (les notes prΓ©cΓ©dentes seront conservΓ©es mais des changements pourront Γͺtre Γ©crasΓ©s)"
1105 text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
1108 text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
1106 text_issue_conflict_resolution_cancel: "Annuler ma mise Γ  jour et rΓ©afficher %{link}"
1109 text_issue_conflict_resolution_cancel: "Annuler ma mise Γ  jour et rΓ©afficher %{link}"
1107 text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
1110 text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
1108 text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
1111 text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
1109 text_project_closed: Ce projet est fermΓ© et accessible en lecture seule.
1112 text_project_closed: Ce projet est fermΓ© et accessible en lecture seule.
1110 text_turning_multiple_off: "Si vous dΓ©sactivez les valeurs multiples, les valeurs multiples seront supprimΓ©es pour n'en conserver qu'une par objet."
1113 text_turning_multiple_off: "Si vous dΓ©sactivez les valeurs multiples, les valeurs multiples seront supprimΓ©es pour n'en conserver qu'une par objet."
1111
1114
1112 default_role_manager: Manager
1115 default_role_manager: Manager
1113 default_role_developer: DΓ©veloppeur
1116 default_role_developer: DΓ©veloppeur
1114 default_role_reporter: Rapporteur
1117 default_role_reporter: Rapporteur
1115 default_tracker_bug: Anomalie
1118 default_tracker_bug: Anomalie
1116 default_tracker_feature: Evolution
1119 default_tracker_feature: Evolution
1117 default_tracker_support: Assistance
1120 default_tracker_support: Assistance
1118 default_issue_status_new: Nouveau
1121 default_issue_status_new: Nouveau
1119 default_issue_status_in_progress: En cours
1122 default_issue_status_in_progress: En cours
1120 default_issue_status_resolved: RΓ©solu
1123 default_issue_status_resolved: RΓ©solu
1121 default_issue_status_feedback: Commentaire
1124 default_issue_status_feedback: Commentaire
1122 default_issue_status_closed: FermΓ©
1125 default_issue_status_closed: FermΓ©
1123 default_issue_status_rejected: RejetΓ©
1126 default_issue_status_rejected: RejetΓ©
1124 default_doc_category_user: Documentation utilisateur
1127 default_doc_category_user: Documentation utilisateur
1125 default_doc_category_tech: Documentation technique
1128 default_doc_category_tech: Documentation technique
1126 default_priority_low: Bas
1129 default_priority_low: Bas
1127 default_priority_normal: Normal
1130 default_priority_normal: Normal
1128 default_priority_high: Haut
1131 default_priority_high: Haut
1129 default_priority_urgent: Urgent
1132 default_priority_urgent: Urgent
1130 default_priority_immediate: ImmΓ©diat
1133 default_priority_immediate: ImmΓ©diat
1131 default_activity_design: Conception
1134 default_activity_design: Conception
1132 default_activity_development: DΓ©veloppement
1135 default_activity_development: DΓ©veloppement
1133
1136
1134 enumeration_issue_priorities: PrioritΓ©s des demandes
1137 enumeration_issue_priorities: PrioritΓ©s des demandes
1135 enumeration_doc_categories: CatΓ©gories des documents
1138 enumeration_doc_categories: CatΓ©gories des documents
1136 enumeration_activities: ActivitΓ©s (suivi du temps)
1139 enumeration_activities: ActivitΓ©s (suivi du temps)
1137 enumeration_system_activity: Activité système
1140 enumeration_system_activity: Activité système
1138 description_filter: Filtre
1141 description_filter: Filtre
1139 description_search: Champ de recherche
1142 description_search: Champ de recherche
1140 description_choose_project: Projets
1143 description_choose_project: Projets
1141 description_project_scope: Périmètre de recherche
1144 description_project_scope: Périmètre de recherche
1142 description_notes: Notes
1145 description_notes: Notes
1143 description_message_content: Contenu du message
1146 description_message_content: Contenu du message
1144 description_query_sort_criteria_attribute: Critère de tri
1147 description_query_sort_criteria_attribute: Critère de tri
1145 description_query_sort_criteria_direction: Ordre de tri
1148 description_query_sort_criteria_direction: Ordre de tri
1146 description_user_mail_notification: Option de notification
1149 description_user_mail_notification: Option de notification
1147 description_available_columns: Colonnes disponibles
1150 description_available_columns: Colonnes disponibles
1148 description_selected_columns: Colonnes sΓ©lectionnΓ©es
1151 description_selected_columns: Colonnes sΓ©lectionnΓ©es
1149 description_all_columns: Toutes les colonnes
1152 description_all_columns: Toutes les colonnes
1150 description_issue_category_reassign: Choisir une catΓ©gorie
1153 description_issue_category_reassign: Choisir une catΓ©gorie
1151 description_wiki_subpages_reassign: Choisir une nouvelle page parent
1154 description_wiki_subpages_reassign: Choisir une nouvelle page parent
1152 description_date_range_list: Choisir une pΓ©riode prΓ©dΓ©finie
1155 description_date_range_list: Choisir une pΓ©riode prΓ©dΓ©finie
1153 description_date_range_interval: Choisir une pΓ©riode
1156 description_date_range_interval: Choisir une pΓ©riode
1154 description_date_from: Date de dΓ©but
1157 description_date_from: Date de dΓ©but
1155 description_date_to: Date de fin
1158 description_date_to: Date de fin
1156 text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisΓ©s.<br />Un fois sauvegardΓ©, l''identifiant ne pourra plus Γͺtre modifiΓ©.'
1159 text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisΓ©s.<br />Un fois sauvegardΓ©, l''identifiant ne pourra plus Γͺtre modifiΓ©.'
@@ -1,135 +1,167
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2015 Jean-Philippe Lang
2 # Copyright (C) 2006-2015 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 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class TimeEntryTest < ActiveSupport::TestCase
20 class TimeEntryTest < ActiveSupport::TestCase
21 fixtures :issues, :projects, :users, :time_entries,
21 fixtures :issues, :projects, :users, :time_entries,
22 :members, :roles, :member_roles,
22 :members, :roles, :member_roles,
23 :trackers, :issue_statuses,
23 :trackers, :issue_statuses,
24 :projects_trackers,
24 :projects_trackers,
25 :journals, :journal_details,
25 :journals, :journal_details,
26 :issue_categories, :enumerations,
26 :issue_categories, :enumerations,
27 :groups_users,
27 :groups_users,
28 :enabled_modules
28 :enabled_modules
29
29
30 def test_visibility_with_permission_to_view_all_time_entries
31 user = User.generate!
32 role = Role.generate!(:permissions => [:view_time_entries], :time_entries_visibility => 'all')
33 Role.non_member.remove_permission! :view_time_entries
34 project = Project.find(1)
35 User.add_to_project user, project, role
36 own = TimeEntry.generate! :user => user, :project => project
37 other = TimeEntry.generate! :user => User.find(2), :project => project
38
39 assert TimeEntry.visible(user).find_by_id(own.id)
40 assert TimeEntry.visible(user).find_by_id(other.id)
41
42 assert own.visible?(user)
43 assert other.visible?(user)
44 end
45
46 def test_visibility_with_permission_to_view_own_time_entries
47 user = User.generate!
48 role = Role.generate!(:permissions => [:view_time_entries], :time_entries_visibility => 'own')
49 Role.non_member.remove_permission! :view_time_entries
50 project = Project.find(1)
51 User.add_to_project user, project, role
52 own = TimeEntry.generate! :user => user, :project => project
53 other = TimeEntry.generate! :user => User.find(2), :project => project
54
55 assert TimeEntry.visible(user).find_by_id(own.id)
56 assert_nil TimeEntry.visible(user).find_by_id(other.id)
57
58 assert own.visible?(user)
59 assert_equal false, other.visible?(user)
60 end
61
30 def test_hours_format
62 def test_hours_format
31 assertions = { "2" => 2.0,
63 assertions = { "2" => 2.0,
32 "21.1" => 21.1,
64 "21.1" => 21.1,
33 "2,1" => 2.1,
65 "2,1" => 2.1,
34 "1,5h" => 1.5,
66 "1,5h" => 1.5,
35 "7:12" => 7.2,
67 "7:12" => 7.2,
36 "10h" => 10.0,
68 "10h" => 10.0,
37 "10 h" => 10.0,
69 "10 h" => 10.0,
38 "45m" => 0.75,
70 "45m" => 0.75,
39 "45 m" => 0.75,
71 "45 m" => 0.75,
40 "3h15" => 3.25,
72 "3h15" => 3.25,
41 "3h 15" => 3.25,
73 "3h 15" => 3.25,
42 "3 h 15" => 3.25,
74 "3 h 15" => 3.25,
43 "3 h 15m" => 3.25,
75 "3 h 15m" => 3.25,
44 "3 h 15 m" => 3.25,
76 "3 h 15 m" => 3.25,
45 "3 hours" => 3.0,
77 "3 hours" => 3.0,
46 "12min" => 0.2,
78 "12min" => 0.2,
47 "12 Min" => 0.2,
79 "12 Min" => 0.2,
48 }
80 }
49
81
50 assertions.each do |k, v|
82 assertions.each do |k, v|
51 t = TimeEntry.new(:hours => k)
83 t = TimeEntry.new(:hours => k)
52 assert_equal v, t.hours, "Converting #{k} failed:"
84 assert_equal v, t.hours, "Converting #{k} failed:"
53 end
85 end
54 end
86 end
55
87
56 def test_hours_should_default_to_nil
88 def test_hours_should_default_to_nil
57 assert_nil TimeEntry.new.hours
89 assert_nil TimeEntry.new.hours
58 end
90 end
59
91
60 def test_spent_on_with_blank
92 def test_spent_on_with_blank
61 c = TimeEntry.new
93 c = TimeEntry.new
62 c.spent_on = ''
94 c.spent_on = ''
63 assert_nil c.spent_on
95 assert_nil c.spent_on
64 end
96 end
65
97
66 def test_spent_on_with_nil
98 def test_spent_on_with_nil
67 c = TimeEntry.new
99 c = TimeEntry.new
68 c.spent_on = nil
100 c.spent_on = nil
69 assert_nil c.spent_on
101 assert_nil c.spent_on
70 end
102 end
71
103
72 def test_spent_on_with_string
104 def test_spent_on_with_string
73 c = TimeEntry.new
105 c = TimeEntry.new
74 c.spent_on = "2011-01-14"
106 c.spent_on = "2011-01-14"
75 assert_equal Date.parse("2011-01-14"), c.spent_on
107 assert_equal Date.parse("2011-01-14"), c.spent_on
76 end
108 end
77
109
78 def test_spent_on_with_invalid_string
110 def test_spent_on_with_invalid_string
79 c = TimeEntry.new
111 c = TimeEntry.new
80 c.spent_on = "foo"
112 c.spent_on = "foo"
81 assert_nil c.spent_on
113 assert_nil c.spent_on
82 end
114 end
83
115
84 def test_spent_on_with_date
116 def test_spent_on_with_date
85 c = TimeEntry.new
117 c = TimeEntry.new
86 c.spent_on = Date.today
118 c.spent_on = Date.today
87 assert_equal Date.today, c.spent_on
119 assert_equal Date.today, c.spent_on
88 end
120 end
89
121
90 def test_spent_on_with_time
122 def test_spent_on_with_time
91 c = TimeEntry.new
123 c = TimeEntry.new
92 c.spent_on = Time.now
124 c.spent_on = Time.now
93 assert_equal Date.today, c.spent_on
125 assert_equal Date.today, c.spent_on
94 end
126 end
95
127
96 def test_validate_time_entry
128 def test_validate_time_entry
97 anon = User.anonymous
129 anon = User.anonymous
98 project = Project.find(1)
130 project = Project.find(1)
99 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => anon.id, :status_id => 1,
131 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => anon.id, :status_id => 1,
100 :priority => IssuePriority.all.first, :subject => 'test_create',
132 :priority => IssuePriority.all.first, :subject => 'test_create',
101 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
133 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
102 assert issue.save
134 assert issue.save
103 activity = TimeEntryActivity.find_by_name('Design')
135 activity = TimeEntryActivity.find_by_name('Design')
104 te = TimeEntry.create(:spent_on => '2010-01-01',
136 te = TimeEntry.create(:spent_on => '2010-01-01',
105 :hours => 100000,
137 :hours => 100000,
106 :issue => issue,
138 :issue => issue,
107 :project => project,
139 :project => project,
108 :user => anon,
140 :user => anon,
109 :activity => activity)
141 :activity => activity)
110 assert_equal 1, te.errors.count
142 assert_equal 1, te.errors.count
111 end
143 end
112
144
113 def test_spent_on_with_2_digits_year_should_not_be_valid
145 def test_spent_on_with_2_digits_year_should_not_be_valid
114 entry = TimeEntry.new(:project => Project.find(1), :user => User.find(1), :activity => TimeEntryActivity.first, :hours => 1)
146 entry = TimeEntry.new(:project => Project.find(1), :user => User.find(1), :activity => TimeEntryActivity.first, :hours => 1)
115 entry.spent_on = "09-02-04"
147 entry.spent_on = "09-02-04"
116 assert !entry.valid?
148 assert !entry.valid?
117 assert_include I18n.translate('activerecord.errors.messages.not_a_date'), entry.errors[:spent_on]
149 assert_include I18n.translate('activerecord.errors.messages.not_a_date'), entry.errors[:spent_on]
118 end
150 end
119
151
120 def test_set_project_if_nil
152 def test_set_project_if_nil
121 anon = User.anonymous
153 anon = User.anonymous
122 project = Project.find(1)
154 project = Project.find(1)
123 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => anon.id, :status_id => 1,
155 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => anon.id, :status_id => 1,
124 :priority => IssuePriority.all.first, :subject => 'test_create',
156 :priority => IssuePriority.all.first, :subject => 'test_create',
125 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
157 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
126 assert issue.save
158 assert issue.save
127 activity = TimeEntryActivity.find_by_name('Design')
159 activity = TimeEntryActivity.find_by_name('Design')
128 te = TimeEntry.create(:spent_on => '2010-01-01',
160 te = TimeEntry.create(:spent_on => '2010-01-01',
129 :hours => 10,
161 :hours => 10,
130 :issue => issue,
162 :issue => issue,
131 :user => anon,
163 :user => anon,
132 :activity => activity)
164 :activity => activity)
133 assert_equal project.id, te.project.id
165 assert_equal project.id, te.project.id
134 end
166 end
135 end
167 end
General Comments 0
You need to be logged in to leave comments. Login now