##// END OF EJS Templates
svn browser merged in trunk...
Jean-Philippe Lang -
r103:bc4415850105
parent child
Show More
@@ -0,0 +1,72
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 class RepositoriesController < ApplicationController
19 layout 'base'
20 before_filter :find_project, :authorize
21
22 def show
23 @entries = @repository.scm.entries('')
24 show_error and return unless @entries
25 @latest_revision = @entries.revisions.latest
26 end
27
28 def browse
29 @entries = @repository.scm.entries(@path, @rev)
30 show_error and return unless @entries
31 end
32
33 def revisions
34 @entry = @repository.scm.entry(@path, @rev)
35 @revisions = @repository.scm.revisions(@path, @rev)
36 show_error and return unless @entry && @revisions
37 end
38
39 def entry
40 if 'raw' == params[:format]
41 content = @repository.scm.cat(@path, @rev)
42 show_error and return unless content
43 send_data content, :filename => @path.split('/').last
44 end
45 end
46
47 def revision
48 @revisions = @repository.scm.revisions '', @rev, @rev, :with_paths => true
49 show_error and return unless @revisions
50 @revision = @revisions.first
51 end
52
53 def diff
54 @rev_to = params[:rev_to] || (@rev-1)
55 @diff = @repository.scm.diff(params[:path], @rev, @rev_to)
56 show_error and return unless @diff
57 end
58
59 private
60 def find_project
61 @project = Project.find(params[:id])
62 @repository = @project.repository
63 @path = params[:path].squeeze('/').gsub(/^\//, '') if params[:path]
64 @path ||= ''
65 @rev = params[:rev].to_i if params[:rev] and params[:rev].to_i > 0
66 end
67
68 def show_error
69 flash.now[:notice] = l(:notice_scm_error)
70 render :nothing => true, :layout => true
71 end
72 end
@@ -0,0 +1,19
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 module RepositoriesHelper
19 end
@@ -0,0 +1,28
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 class Repository < ActiveRecord::Base
19 belongs_to :project
20 validates_presence_of :url
21 validates_format_of :url, :with => /^(http|https|svn):\/\/.+/i
22
23 @scm = nil
24
25 def scm
26 @scm ||= SvnRepos::Base.new url
27 end
28 end
@@ -0,0 +1,214
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require 'rexml/document'
19
20 module SvnRepos
21
22 class CommandFailed < StandardError #:nodoc:
23 end
24
25 class Base
26 @url = nil
27 @login = nil
28 @password = nil
29
30 def initialize(url, login=nil, password=nil)
31 @url = url
32 @login = login if login && !login.empty?
33 @password = (password || "") if @login
34 end
35
36 # Returns the entry identified by path and revision identifier
37 # or nil if entry doesn't exist in the repository
38 def entry(path=nil, identifier=nil)
39 e = entries(path, identifier)
40 e ? e.first : nil
41 end
42
43 # Returns an Entries collection
44 # or nil if the given path doesn't exist in the repository
45 def entries(path=nil, identifier=nil)
46 path ||= ''
47 identifier = 'HEAD' unless identifier and identifier > 0
48 entries = Entries.new
49 cmd = "svn list --xml #{target(path)}@#{identifier}"
50 shellout(cmd) do |io|
51 begin
52 doc = REXML::Document.new(io)
53 doc.elements.each("lists/list/entry") do |entry|
54 entries << Entry.new({:name => entry.elements['name'].text,
55 :path => ((path.empty? ? "" : "#{path}/") + entry.elements['name'].text),
56 :kind => entry.attributes['kind'],
57 :size => (entry.elements['size'] and entry.elements['size'].text).to_i,
58 :lastrev => Revision.new({
59 :identifier => entry.elements['commit'].attributes['revision'],
60 :time => Time.parse(entry.elements['commit'].elements['date'].text),
61 :author => entry.elements['commit'].elements['author'].text
62 })
63 })
64 end
65 rescue
66 end
67 end
68 return nil if $? && $?.exitstatus != 0
69 entries.sort_by_name
70 rescue Errno::ENOENT => e
71 raise CommandFailed
72 end
73
74 def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
75 path ||= ''
76 identifier_from = 'HEAD' unless identifier_from and identifier_from.to_i > 0
77 identifier_to = 1 unless identifier_to and identifier_to.to_i > 0
78 revisions = Revisions.new
79 cmd = "svn log --xml -r #{identifier_from}:#{identifier_to} "
80 cmd << "--verbose " if options[:with_paths]
81 cmd << target(path)
82 shellout(cmd) do |io|
83 begin
84 doc = REXML::Document.new(io)
85 doc.elements.each("log/logentry") do |logentry|
86 paths = []
87 logentry.elements.each("paths/path") do |path|
88 paths << {:action => path.attributes['action'],
89 :path => path.text
90 }
91 end
92 paths.sort! { |x,y| x[:path] <=> y[:path] }
93
94 revisions << Revision.new({:identifier => logentry.attributes['revision'],
95 :author => logentry.elements['author'].text,
96 :time => Time.parse(logentry.elements['date'].text),
97 :message => logentry.elements['msg'].text,
98 :paths => paths
99 })
100 end
101 rescue
102 end
103 end
104 return nil if $? && $?.exitstatus != 0
105 revisions
106 rescue Errno::ENOENT => e
107 raise CommandFailed
108 end
109
110 def diff(path, identifier_from, identifier_to=nil)
111 path ||= ''
112 if identifier_to and identifier_to.to_i > 0
113 identifier_to = identifier_to.to_i
114 else
115 identifier_to = identifier_from.to_i - 1
116 end
117 cmd = "svn diff -r "
118 cmd << "#{identifier_to}:"
119 cmd << "#{identifier_from}"
120 cmd << "#{target(path)}@#{identifier_from}"
121 diff = []
122 shellout(cmd) do |io|
123 io.each_line do |line|
124 diff << line
125 end
126 end
127 return nil if $? && $?.exitstatus != 0
128 diff
129 rescue Errno::ENOENT => e
130 raise CommandFailed
131 end
132
133 def cat(path, identifier=nil)
134 identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
135 cmd = "svn cat #{target(path)}@#{identifier}"
136 cat = nil
137 shellout(cmd) do |io|
138 cat = io.read
139 end
140 return nil if $? && $?.exitstatus != 0
141 cat
142 rescue Errno::ENOENT => e
143 raise CommandFailed
144 end
145
146 private
147 def target(path)
148 " \"" << "#{@url}/#{path}".gsub(/["'?<>\*]/, '') << "\""
149 end
150
151 def logger
152 RAILS_DEFAULT_LOGGER
153 end
154
155 def shellout(cmd, &block)
156 logger.debug "Shelling out: #{cmd}" if logger && logger.debug?
157 IO.popen(cmd) do |io|
158 block.call(io) if block_given?
159 end
160 end
161 end
162
163 class Entries < Array
164 def sort_by_name
165 sort {|x,y|
166 if x.kind == y.kind
167 x.name <=> y.name
168 else
169 x.kind <=> y.kind
170 end
171 }
172 end
173
174 def revisions
175 revisions ||= Revisions.new(collect{|entry| entry.lastrev})
176 end
177 end
178
179 class Entry
180 attr_accessor :name, :path, :kind, :size, :lastrev
181 def initialize(attributes={})
182 self.name = attributes[:name] if attributes[:name]
183 self.path = attributes[:path] if attributes[:path]
184 self.kind = attributes[:kind] if attributes[:kind]
185 self.size = attributes[:size].to_i if attributes[:size]
186 self.lastrev = attributes[:lastrev]
187 end
188
189 def is_file?
190 'file' == self.kind
191 end
192
193 def is_dir?
194 'dir' == self.kind
195 end
196 end
197
198 class Revisions < Array
199 def latest
200 sort {|x,y| x.time <=> y.time}.last
201 end
202 end
203
204 class Revision
205 attr_accessor :identifier, :author, :time, :message, :paths
206 def initialize(attributes={})
207 self.identifier = attributes[:identifier]
208 self.author = attributes[:author]
209 self.time = attributes[:time]
210 self.message = attributes[:message] || ""
211 self.paths = attributes[:paths]
212 end
213 end
214 end No newline at end of file
@@ -0,0 +1,23
1 <table class="list">
2 <thead><tr>
3 <th><%= l(:field_name) %></th>
4 <th><%= l(:field_filesize) %></th>
5 <th><%= l(:label_revision) %></th>
6 <th><%= l(:field_author) %></th>
7 <th><%= l(:label_date) %></th>
8 </tr></thead>
9 <tbody>
10 <% total_size = 0
11 @entries.each do |entry| %>
12 <tr class="<%= cycle 'odd', 'even' %>">
13 <td><%= link_to h(entry.name), { :action => (entry.is_dir? ? 'browse' : 'revisions'), :id => @project, :path => entry.path, :rev => @rev }, :class => "icon " + (entry.is_dir? ? 'folder' : 'file') %></td>
14 <td align="right"><%= human_size(entry.size) unless entry.is_dir? %></td>
15 <td align="right"><%= link_to entry.lastrev.identifier, :action => 'revision', :id => @project, :rev => entry.lastrev.identifier %></td>
16 <td align="center"><em><%=h entry.lastrev.author %></em></td>
17 <td align="center"><%= format_time(entry.lastrev.time) %></td>
18 </tr>
19 <% total_size += entry.size
20 end %>
21 </tbody>
22 </table>
23 <p align="right"><em><%= l(:label_total) %>: <%= human_size(total_size) %></em></p> No newline at end of file
@@ -0,0 +1,18
1 <%= link_to 'root', :action => 'browse', :id => @project, :path => '', :rev => @rev %>
2 <%
3 dirs = path.split('/')
4 if 'file' == kind
5 filename = dirs.pop
6 end
7 link_path = ''
8 dirs.each do |dir|
9 link_path << '/' unless link_path.empty?
10 link_path << "#{dir}"
11 %>
12 / <%= link_to h(dir), :action => 'browse', :id => @project, :path => link_path, :rev => @rev %>
13 <% end %>
14 <% if filename %>
15 / <%= link_to h(filename), :action => 'revisions', :id => @project, :path => "#{link_path}/#{filename}", :rev => @rev %>
16 <% end %>
17
18 <%= "@ #{revision}" if revision %> No newline at end of file
@@ -0,0 +1,11
1 <%= stylesheet_link_tag "scm" %>
2
3 <div class="contextual">
4 <%= start_form_tag %>
5 <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
6 <%= submit_tag 'OK' %>
7 </div>
8
9 <h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'dir', :revision => @rev } %></h2>
10
11 <%= render :partial => 'dir_list' %> No newline at end of file
@@ -0,0 +1,55
1 <h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
2
3 <%= stylesheet_link_tag "scm" %>
4
5 <table class="list">
6 <thead><tr><th>@<%= @rev %></th><th>@<%= @rev_to %></th><th></th></tr></thead>
7 <tbody>
8 <% parsing = false
9 line_num_l = 0
10 line_num_r = 0 %>
11 <% @diff.each do |line| %>
12 <%
13 if line =~ /^@@ (\+|\-)(\d+),\d+ (\+|\-)(\d+),\d+ @@/
14 line_num_l = $2.to_i
15 line_num_r = $4.to_i
16 if parsing %>
17 <tr class="spacing"><td colspan="3">&nbsp;</td></tr>
18 <% end
19 parsing = true
20 next
21 end
22 next unless parsing
23 %>
24
25 <tr>
26
27 <% case line[0, 1]
28 when " " %>
29 <th class="line-num"><%= line_num_l %></th>
30 <th class="line-num"><%= line_num_r %></th>
31 <td class="line-code">
32 <% line_num_l = line_num_l + 1
33 line_num_r = line_num_r + 1
34
35 when "-" %>
36 <th class="line-num"></th>
37 <th class="line-num"><%= line_num_r %></th>
38 <td class="line-code" style="background: #fdd;">
39 <% line_num_r = line_num_r + 1
40
41 when "+" %>
42 <th class="line-num"><%= line_num_l %></th>
43 <th class="line-num"></th>
44 <td class="line-code" style="background: #dfd;">
45 <% line_num_l = line_num_l + 1
46
47 else
48 next
49 end %>
50
51 <%= h(line[1..-1]).gsub(/\s/, "&nbsp;") %></td></tr>
52
53 <% end %>
54 </tbody>
55 </table> No newline at end of file
@@ -0,0 +1,35
1 <%= stylesheet_link_tag "scm" %>
2
3 <div class="contextual">
4 <%= start_form_tag %>
5 <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
6 <%= submit_tag 'OK' %>
7 </div>
8
9 <h2><%= l(:label_revision) %> <%= @revision.identifier %></h2>
10
11 <p><em><%= @revision.author %>, <%= format_time(@revision.time) %></em></p>
12 <%= simple_format @revision.message %>
13
14 <div style="float:right;">
15 <div class="square action_A"></div> <div style="float:left;"><%= l(:label_added) %>&nbsp;</div>
16 <div class="square action_M"></div> <div style="float:left;"><%= l(:label_modified) %>&nbsp;</div>
17 <div class="square action_D"></div> <div style="float:left;"><%= l(:label_deleted) %>&nbsp;</div>
18 </div>
19
20 <h3><%= l(:label_attachment_plural) %></h3>
21 <table class="list">
22 <tbody>
23 <% @revision.paths.each do |path| %>
24 <tr class="<%= cycle 'odd', 'even' %>">
25 <td><div class="square action_<%= path[:action] %>"></div> <%= path[:path] %></td>
26 <td>
27 <% if path[:action] == "M" %>
28 <%= link_to 'View diff', :action => 'diff', :id => @project, :path => path[:path].gsub(/^\//, ''), :rev => @revision.identifier %>
29 <% end %>
30 </td>
31 </tr>
32 <% end %>
33 </tbody>
34 </table>
35 <p><%= lwr(:label_modification, @revision.paths.length) %></p> No newline at end of file
@@ -0,0 +1,38
1 <%= stylesheet_link_tag "scm" %>
2
3 <div class="contextual">
4 <%= start_form_tag %>
5 <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
6 <%= submit_tag 'OK' %>
7 </div>
8
9 <h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => @entry.kind, :revision => @rev } %></h2>
10
11 <% if @entry.is_file? %>
12 <h3><%=h @entry.name %></h3>
13 <p><%= link_to 'Download', {:action => 'entry', :id => @project, :path => @path, :rev => @rev, :format => 'raw' }, :class => "icon file" %> (<%= human_size @entry.size %>)</p>
14 <% end %>
15
16 <h3>Revisions</h3>
17
18 <table class="list">
19 <thead><tr>
20 <th>#</th>
21 <th><%= l(:field_author) %></th>
22 <th><%= l(:label_date) %></th>
23 <th><%= l(:field_description) %></th>
24 <th></th>
25 </tr></thead>
26 <tbody>
27 <% @revisions.each do |revision| %>
28 <tr class="<%= cycle 'odd', 'even' %>">
29 <th align="center"><%= link_to revision.identifier, :action => 'revision', :id => @project, :rev => revision.identifier %></th>
30 <td align="center"><em><%=h revision.author %></em></td>
31 <td align="center"><%= format_time(revision.time) %></td>
32 <td width="70%"><%= simple_format(h(revision.message)) %></td>
33 <td align="center"><%= link_to 'Diff', :action => 'diff', :id => @project, :path => @path, :rev => revision.identifier if @entry.is_file? && revision != @revisions.last %></td>
34 </tr>
35 <% end %>
36 </tbody>
37 </table>
38 <p><%= lwr(:label_modification, @revisions.length) %></p> No newline at end of file
@@ -0,0 +1,15
1 <%= stylesheet_link_tag "scm" %>
2
3 <h2><%= l(:label_repository) %></h2>
4
5 <h3><%= l(:label_revision_plural) %></h3>
6 <% if @latest_revision %>
7 <p><%= l(:label_latest_revision) %>:
8 <%= link_to @latest_revision.identifier, :action => 'revision', :id => @project, :rev => @latest_revision.identifier %><br />
9 <em><%= @latest_revision.author %>, <%= format_time(@latest_revision.time) %></em></p>
10 <% end %>
11 <p><%= link_to l(:label_view_revisions), :action => 'revisions', :id => @project %></p>
12
13
14 <h3><%= l(:label_browse) %></h3>
15 <%= render :partial => 'dir_list' %> No newline at end of file
@@ -0,0 +1,12
1 class CreateRepositories < ActiveRecord::Migration
2 def self.up
3 create_table :repositories, :force => true do |t|
4 t.column "project_id", :integer, :default => 0, :null => false
5 t.column "url", :string, :default => "", :null => false
6 end
7 end
8
9 def self.down
10 drop_table :repositories
11 end
12 end
@@ -0,0 +1,19
1 class AddRepositoriesPermissions < ActiveRecord::Migration
2 def self.up
3 Permission.create :controller => "repositories", :action => "show", :description => "button_view", :sort => 1450, :is_public => true
4 Permission.create :controller => "repositories", :action => "browse", :description => "label_browse", :sort => 1460, :is_public => true
5 Permission.create :controller => "repositories", :action => "entry", :description => "entry", :sort => 1462, :is_public => true
6 Permission.create :controller => "repositories", :action => "revisions", :description => "label_view_revisions", :sort => 1470, :is_public => true
7 Permission.create :controller => "repositories", :action => "revision", :description => "label_view_revisions", :sort => 1472, :is_public => true
8 Permission.create :controller => "repositories", :action => "diff", :description => "diff", :sort => 1480, :is_public => true
9 end
10
11 def self.down
12 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'show']).destroy
13 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'browse']).destroy
14 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'entry']).destroy
15 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'revisions']).destroy
16 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'revision']).destroy
17 Permission.find(:first, :conditions => ["controller=? and action=?", 'repositories', 'diff']).destroy
18 end
19 end
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,66
1
2
3 div.square {
4 border: 1px solid #999;
5 float: left;
6 margin: .4em .5em 0 0;
7 overflow: hidden;
8 width: .6em; height: .6em;
9 }
10
11 div.action_M { background: #fd8 }
12 div.action_D { background: #f88 }
13 div.action_A { background: #bfb }
14
15 table.list {
16 width:100%;
17 border-collapse: collapse;
18 border: 1px dotted #d0d0d0;
19 margin-bottom: 6px;
20 }
21
22 table.list thead th {
23 text-align: center;
24 background: #eee;
25 border: 1px solid #d7d7d7;
26 }
27
28 table.list tbody th {
29 font-weight: normal;
30 text-align: center;
31 background: #eed;
32 border: 1px solid #d7d7d7;
33 }
34
35 .icon {
36 background-position: 0% 40%;
37 background-repeat: no-repeat;
38 padding-left: 20px;
39 }
40
41 .folder { background-image: url(../images/folder.png); }
42 .file { background-image: url(../images/file.png); }
43
44
45
46 tr.spacing {
47 border: 1px solid #d7d7d7;
48 }
49
50 .line-num {
51 border: 1px solid #d7d7d7;
52 font-size: 0.8em;
53 text-align: right;
54 width: 3em;
55 padding-right: 3px;
56 }
57
58 .line-code {
59 font-family: "Courier New", monospace;
60 font-size: 1em;
61 }
62
63 table p {
64 margin:0;
65 padding:0;
66 } No newline at end of file
@@ -1,519 +1,533
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class ProjectsController < ApplicationController
19 19 layout 'base'
20 20 before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
21 21 before_filter :require_admin, :only => [ :add, :destroy ]
22 22
23 23 helper :sort
24 24 include SortHelper
25 25 helper :custom_fields
26 26 include CustomFieldsHelper
27 27 helper :ifpdf
28 28 include IfpdfHelper
29 29 helper IssuesHelper
30 30 helper :queries
31 31 include QueriesHelper
32 32
33 33 def index
34 34 list
35 35 render :action => 'list' unless request.xhr?
36 36 end
37 37
38 38 # Lists public projects
39 39 def list
40 40 sort_init 'name', 'asc'
41 41 sort_update
42 42 @project_count = Project.count(["is_public=?", true])
43 43 @project_pages = Paginator.new self, @project_count,
44 44 15,
45 45 @params['page']
46 46 @projects = Project.find :all, :order => sort_clause,
47 47 :conditions => ["is_public=?", true],
48 48 :limit => @project_pages.items_per_page,
49 49 :offset => @project_pages.current.offset
50 50
51 51 render :action => "list", :layout => false if request.xhr?
52 52 end
53 53
54 54 # Add a new project
55 55 def add
56 56 @custom_fields = IssueCustomField.find(:all)
57 57 @root_projects = Project.find(:all, :conditions => "parent_id is null")
58 58 @project = Project.new(params[:project])
59 59 if request.get?
60 60 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
61 61 else
62 62 @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
63 63 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
64 64 @project.custom_values = @custom_values
65 if params[:repository_enabled] && params[:repository_enabled] == "1"
66 @project.repository = Repository.new
67 @project.repository.attributes = params[:repository]
68 end
65 69 if @project.save
66 70 flash[:notice] = l(:notice_successful_create)
67 71 redirect_to :controller => 'admin', :action => 'projects'
68 72 end
69 73 end
70 74 end
71 75
72 76 # Show @project
73 77 def show
74 78 @custom_values = @project.custom_values.find(:all, :include => :custom_field)
75 79 @members = @project.members.find(:all, :include => [:user, :role])
76 80 @subprojects = @project.children if @project.children_count > 0
77 81 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
78 82 @trackers = Tracker.find(:all)
79 83 end
80 84
81 85 def settings
82 86 @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
83 87 @custom_fields = IssueCustomField::find_all
84 88 @issue_category ||= IssueCategory.new
85 89 @member ||= @project.members.new
86 90 @roles = Role.find_all
87 91 @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }
88 92 @custom_values ||= ProjectCustomField.find(:all).collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
89 93 end
90 94
91 95 # Edit @project
92 96 def edit
93 97 if request.post?
94 98 @project.custom_fields = IssueCustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
95 99 if params[:custom_fields]
96 100 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
97 101 @project.custom_values = @custom_values
98 102 end
99 if @project.update_attributes(params[:project])
103 if params[:repository_enabled]
104 case params[:repository_enabled]
105 when "0"
106 @project.repository = nil
107 when "1"
108 @project.repository ||= Repository.new
109 @project.repository.attributes = params[:repository]
110 end
111 end
112 @project.attributes = params[:project]
113 if @project.save
100 114 flash[:notice] = l(:notice_successful_update)
101 115 redirect_to :action => 'settings', :id => @project
102 116 else
103 117 settings
104 118 render :action => 'settings'
105 119 end
106 120 end
107 121 end
108 122
109 123 # Delete @project
110 124 def destroy
111 125 if request.post? and params[:confirm]
112 126 @project.destroy
113 127 redirect_to :controller => 'admin', :action => 'projects'
114 128 end
115 129 end
116 130
117 131 # Add a new issue category to @project
118 132 def add_issue_category
119 133 if request.post?
120 134 @issue_category = @project.issue_categories.build(params[:issue_category])
121 135 if @issue_category.save
122 136 flash[:notice] = l(:notice_successful_create)
123 137 redirect_to :action => 'settings', :id => @project
124 138 else
125 139 settings
126 140 render :action => 'settings'
127 141 end
128 142 end
129 143 end
130 144
131 145 # Add a new version to @project
132 146 def add_version
133 147 @version = @project.versions.build(params[:version])
134 148 if request.post? and @version.save
135 149 flash[:notice] = l(:notice_successful_create)
136 150 redirect_to :action => 'settings', :id => @project
137 151 end
138 152 end
139 153
140 154 # Add a new member to @project
141 155 def add_member
142 156 @member = @project.members.build(params[:member])
143 157 if request.post?
144 158 if @member.save
145 159 flash[:notice] = l(:notice_successful_create)
146 160 redirect_to :action => 'settings', :id => @project
147 161 else
148 162 settings
149 163 render :action => 'settings'
150 164 end
151 165 end
152 166 end
153 167
154 168 # Show members list of @project
155 169 def list_members
156 170 @members = @project.members
157 171 end
158 172
159 173 # Add a new document to @project
160 174 def add_document
161 175 @categories = Enumeration::get_values('DCAT')
162 176 @document = @project.documents.build(params[:document])
163 177 if request.post?
164 178 # Save the attachment
165 179 if params[:attachment][:file].size > 0
166 180 @attachment = @document.attachments.build(params[:attachment])
167 181 @attachment.author_id = self.logged_in_user.id if self.logged_in_user
168 182 end
169 183 if @document.save
170 184 flash[:notice] = l(:notice_successful_create)
171 185 redirect_to :action => 'list_documents', :id => @project
172 186 end
173 187 end
174 188 end
175 189
176 190 # Show documents list of @project
177 191 def list_documents
178 192 @documents = @project.documents.find :all, :include => :category
179 193 end
180 194
181 195 # Add a new issue to @project
182 196 def add_issue
183 197 @tracker = Tracker.find(params[:tracker_id])
184 198 @priorities = Enumeration::get_values('IPRI')
185 199 @issue = Issue.new(:project => @project, :tracker => @tracker)
186 200 if request.get?
187 201 @issue.start_date = Date.today
188 202 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) }
189 203 else
190 204 @issue.attributes = params[:issue]
191 205 @issue.author_id = self.logged_in_user.id if self.logged_in_user
192 206 # Multiple file upload
193 207 params[:attachments].each { |a|
194 208 @attachment = @issue.attachments.build(:file => a, :author => self.logged_in_user) unless a.size == 0
195 209 } if params[:attachments] and params[:attachments].is_a? Array
196 210 @custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
197 211 @issue.custom_values = @custom_values
198 212 if @issue.save
199 213 flash[:notice] = l(:notice_successful_create)
200 214 Mailer.deliver_issue_add(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled?
201 215 redirect_to :action => 'list_issues', :id => @project
202 216 end
203 217 end
204 218 end
205 219
206 220 # Show filtered/sorted issues list of @project
207 221 def list_issues
208 222 sort_init 'issues.id', 'desc'
209 223 sort_update
210 224
211 225 retrieve_query
212 226
213 227 @results_per_page_options = [ 15, 25, 50, 100 ]
214 228 if params[:per_page] and @results_per_page_options.include? params[:per_page].to_i
215 229 @results_per_page = params[:per_page].to_i
216 230 session[:results_per_page] = @results_per_page
217 231 else
218 232 @results_per_page = session[:results_per_page] || 25
219 233 end
220 234
221 235 if @query.valid?
222 236 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
223 237 @issue_pages = Paginator.new self, @issue_count, @results_per_page, @params['page']
224 238 @issues = Issue.find :all, :order => sort_clause,
225 239 :include => [ :author, :status, :tracker, :project ],
226 240 :conditions => @query.statement,
227 241 :limit => @issue_pages.items_per_page,
228 242 :offset => @issue_pages.current.offset
229 243 end
230 244 render :layout => false if request.xhr?
231 245 end
232 246
233 247 # Export filtered/sorted issues list to CSV
234 248 def export_issues_csv
235 249 sort_init 'issues.id', 'desc'
236 250 sort_update
237 251
238 252 retrieve_query
239 253 render :action => 'list_issues' and return unless @query.valid?
240 254
241 255 @issues = Issue.find :all, :order => sort_clause,
242 256 :include => [ :author, :status, :tracker, :project, :custom_values ],
243 257 :conditions => @query.statement
244 258
245 259 ic = Iconv.new('ISO-8859-1', 'UTF-8')
246 260 export = StringIO.new
247 261 CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
248 262 # csv header fields
249 263 headers = [ "#", l(:field_status), l(:field_tracker), l(:field_subject), l(:field_author), l(:field_created_on), l(:field_updated_on) ]
250 264 for custom_field in @project.all_custom_fields
251 265 headers << custom_field.name
252 266 end
253 267 csv << headers.collect {|c| ic.iconv(c) }
254 268 # csv lines
255 269 @issues.each do |issue|
256 270 fields = [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
257 271 for custom_field in @project.all_custom_fields
258 272 fields << (show_value issue.custom_value_for(custom_field))
259 273 end
260 274 csv << fields.collect {|c| ic.iconv(c.to_s) }
261 275 end
262 276 end
263 277 export.rewind
264 278 send_data(export.read, :type => 'text/csv; header=present', :filename => 'export.csv')
265 279 end
266 280
267 281 # Export filtered/sorted issues to PDF
268 282 def export_issues_pdf
269 283 sort_init 'issues.id', 'desc'
270 284 sort_update
271 285
272 286 retrieve_query
273 287 render :action => 'list_issues' and return unless @query.valid?
274 288
275 289 @issues = Issue.find :all, :order => sort_clause,
276 290 :include => [ :author, :status, :tracker, :project, :custom_values ],
277 291 :conditions => @query.statement
278 292
279 293 @options_for_rfpdf ||= {}
280 294 @options_for_rfpdf[:file_name] = "export.pdf"
281 295 render :layout => false
282 296 end
283 297
284 298 def move_issues
285 299 @issues = @project.issues.find(params[:issue_ids]) if params[:issue_ids]
286 300 redirect_to :action => 'list_issues', :id => @project and return unless @issues
287 301 @projects = []
288 302 # find projects to which the user is allowed to move the issue
289 303 @logged_in_user.memberships.each {|m| @projects << m.project if Permission.allowed_to_role("projects/move_issues", m.role_id)}
290 304 # issue can be moved to any tracker
291 305 @trackers = Tracker.find(:all)
292 306 if request.post? and params[:new_project_id] and params[:new_tracker_id]
293 307 new_project = Project.find(params[:new_project_id])
294 308 new_tracker = Tracker.find(params[:new_tracker_id])
295 309 @issues.each { |i|
296 310 # project dependent properties
297 311 unless i.project_id == new_project.id
298 312 i.category = nil
299 313 i.fixed_version = nil
300 314 end
301 315 # move the issue
302 316 i.project = new_project
303 317 i.tracker = new_tracker
304 318 i.save
305 319 }
306 320 flash[:notice] = l(:notice_successful_update)
307 321 redirect_to :action => 'list_issues', :id => @project
308 322 end
309 323 end
310 324
311 325 def add_query
312 326 @query = Query.new(params[:query])
313 327 @query.project = @project
314 328 @query.user = logged_in_user
315 329
316 330 params[:fields].each do |field|
317 331 @query.add_filter(field, params[:operators][field], params[:values][field])
318 332 end if params[:fields]
319 333
320 334 if request.post? and @query.save
321 335 flash[:notice] = l(:notice_successful_create)
322 336 redirect_to :controller => 'reports', :action => 'issue_report', :id => @project
323 337 end
324 338 render :layout => false if request.xhr?
325 339 end
326 340
327 341 # Add a news to @project
328 342 def add_news
329 343 @news = News.new(:project => @project)
330 344 if request.post?
331 345 @news.attributes = params[:news]
332 346 @news.author_id = self.logged_in_user.id if self.logged_in_user
333 347 if @news.save
334 348 flash[:notice] = l(:notice_successful_create)
335 349 redirect_to :action => 'list_news', :id => @project
336 350 end
337 351 end
338 352 end
339 353
340 354 # Show news list of @project
341 355 def list_news
342 356 @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC"
343 357 render :action => "list_news", :layout => false if request.xhr?
344 358 end
345 359
346 360 def add_file
347 361 @attachment = Attachment.new(params[:attachment])
348 362 if request.post? and params[:attachment][:file].size > 0
349 363 @attachment.container = @project.versions.find_by_id(params[:version_id])
350 364 @attachment.author = logged_in_user
351 365 if @attachment.save
352 366 flash[:notice] = l(:notice_successful_create)
353 367 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
354 368 end
355 369 end
356 370 @versions = @project.versions
357 371 end
358 372
359 373 def list_files
360 374 @versions = @project.versions
361 375 end
362 376
363 377 # Show changelog for @project
364 378 def changelog
365 379 @trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true])
366 380 if request.get?
367 381 @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
368 382 else
369 383 @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
370 384 end
371 385 @selected_tracker_ids ||= []
372 386 @fixed_issues = @project.issues.find(:all,
373 387 :include => [ :fixed_version, :status, :tracker ],
374 388 :conditions => [ "issue_statuses.is_closed=? and issues.tracker_id in (#{@selected_tracker_ids.join(',')}) and issues.fixed_version_id is not null", true],
375 389 :order => "versions.effective_date DESC, issues.id DESC"
376 390 ) unless @selected_tracker_ids.empty?
377 391 @fixed_issues ||= []
378 392 end
379 393
380 394 def activity
381 395 if params[:year] and params[:year].to_i > 1900
382 396 @year = params[:year].to_i
383 397 if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
384 398 @month = params[:month].to_i
385 399 end
386 400 end
387 401 @year ||= Date.today.year
388 402 @month ||= Date.today.month
389 403
390 404 @date_from = Date.civil(@year, @month, 1)
391 405 @date_to = (@date_from >> 1)-1
392 406
393 407 @events_by_day = {}
394 408
395 409 unless params[:show_issues] == "0"
396 410 @project.issues.find(:all, :include => [:author, :status], :conditions => ["issues.created_on>=? and issues.created_on<=?", @date_from, @date_to] ).each { |i|
397 411 @events_by_day[i.created_on.to_date] ||= []
398 412 @events_by_day[i.created_on.to_date] << i
399 413 }
400 414 @show_issues = 1
401 415 end
402 416
403 417 unless params[:show_news] == "0"
404 418 @project.news.find(:all, :conditions => ["news.created_on>=? and news.created_on<=?", @date_from, @date_to], :include => :author ).each { |i|
405 419 @events_by_day[i.created_on.to_date] ||= []
406 420 @events_by_day[i.created_on.to_date] << i
407 421 }
408 422 @show_news = 1
409 423 end
410 424
411 425 unless params[:show_files] == "0"
412 426 Attachment.find(:all, :select => "attachments.*", :joins => "LEFT JOIN versions ON versions.id = attachments.container_id", :conditions => ["attachments.container_type='Version' and versions.project_id=? and attachments.created_on>=? and attachments.created_on<=?", @project.id, @date_from, @date_to], :include => :author ).each { |i|
413 427 @events_by_day[i.created_on.to_date] ||= []
414 428 @events_by_day[i.created_on.to_date] << i
415 429 }
416 430 @show_files = 1
417 431 end
418 432
419 433 unless params[:show_documents] == "0"
420 434 @project.documents.find(:all, :conditions => ["documents.created_on>=? and documents.created_on<=?", @date_from, @date_to] ).each { |i|
421 435 @events_by_day[i.created_on.to_date] ||= []
422 436 @events_by_day[i.created_on.to_date] << i
423 437 }
424 438 Attachment.find(:all, :select => "attachments.*", :joins => "LEFT JOIN documents ON documents.id = attachments.container_id", :conditions => ["attachments.container_type='Document' and documents.project_id=? and attachments.created_on>=? and attachments.created_on<=?", @project.id, @date_from, @date_to], :include => :author ).each { |i|
425 439 @events_by_day[i.created_on.to_date] ||= []
426 440 @events_by_day[i.created_on.to_date] << i
427 441 }
428 442 @show_documents = 1
429 443 end
430 444
431 445 render :layout => false if request.xhr?
432 446 end
433 447
434 448 def calendar
435 449 if params[:year] and params[:year].to_i > 1900
436 450 @year = params[:year].to_i
437 451 if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
438 452 @month = params[:month].to_i
439 453 end
440 454 end
441 455 @year ||= Date.today.year
442 456 @month ||= Date.today.month
443 457
444 458 @date_from = Date.civil(@year, @month, 1)
445 459 @date_to = (@date_from >> 1)-1
446 460 # start on monday
447 461 @date_from = @date_from - (@date_from.cwday-1)
448 462 # finish on sunday
449 463 @date_to = @date_to + (7-@date_to.cwday)
450 464
451 465 @issues = @project.issues.find(:all, :include => :tracker, :conditions => ["((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", @date_from, @date_to, @date_from, @date_to])
452 466 render :layout => false if request.xhr?
453 467 end
454 468
455 469 def gantt
456 470 if params[:year] and params[:year].to_i >0
457 471 @year_from = params[:year].to_i
458 472 if params[:month] and params[:month].to_i >=1 and params[:month].to_i <= 12
459 473 @month_from = params[:month].to_i
460 474 else
461 475 @month_from = 1
462 476 end
463 477 else
464 478 @month_from ||= (Date.today << 1).month
465 479 @year_from ||= (Date.today << 1).year
466 480 end
467 481
468 482 @zoom = (params[:zoom].to_i > 0 and params[:zoom].to_i < 5) ? params[:zoom].to_i : 2
469 483 @months = (params[:months].to_i > 0 and params[:months].to_i < 25) ? params[:months].to_i : 6
470 484
471 485 @date_from = Date.civil(@year_from, @month_from, 1)
472 486 @date_to = (@date_from >> @months) - 1
473 487 @issues = @project.issues.find(:all, :order => "start_date, due_date", :conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null)", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to])
474 488
475 489 if params[:output]=='pdf'
476 490 @options_for_rfpdf ||= {}
477 491 @options_for_rfpdf[:file_name] = "gantt.pdf"
478 492 render :template => "projects/gantt.rfpdf", :layout => false
479 493 else
480 494 render :template => "projects/gantt.rhtml"
481 495 end
482 496 end
483 497
484 498 private
485 499 # Find project of id params[:id]
486 500 # if not found, redirect to project list
487 501 # Used as a before_filter
488 502 def find_project
489 503 @project = Project.find(params[:id])
490 504 @html_title = @project.name
491 505 rescue
492 506 redirect_to :action => 'list'
493 507 end
494 508
495 509 # Retrieve query from session or build a new query
496 510 def retrieve_query
497 511 if params[:query_id]
498 512 @query = @project.queries.find(params[:query_id])
499 513 else
500 514 if params[:set_filter] or !session[:query] or session[:query].project_id != @project.id
501 515 # Give it a name, required to be valid
502 516 @query = Query.new(:name => "_")
503 517 @query.project = @project
504 518 if params[:fields] and params[:fields].is_a? Array
505 519 params[:fields].each do |field|
506 520 @query.add_filter(field, params[:operators][field], params[:values][field])
507 521 end
508 522 else
509 523 @query.available_filters.keys.each do |field|
510 524 @query.add_short_filter(field, params[field]) if params[field]
511 525 end
512 526 end
513 527 session[:query] = @query
514 528 else
515 529 @query = session[:query]
516 530 end
517 531 end
518 532 end
519 533 end
@@ -1,184 +1,184
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module ApplicationHelper
19 19
20 20 # Return current logged in user or nil
21 21 def loggedin?
22 22 @logged_in_user
23 23 end
24 24
25 25 # Return true if user is logged in and is admin, otherwise false
26 26 def admin_loggedin?
27 27 @logged_in_user and @logged_in_user.admin?
28 28 end
29 29
30 30 # Return true if user is authorized for controller/action, otherwise false
31 31 def authorize_for(controller, action)
32 32 # check if action is allowed on public projects
33 33 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
34 34 return true
35 35 end
36 36 # check if user is authorized
37 37 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) )
38 38 return true
39 39 end
40 40 return false
41 41 end
42 42
43 43 # Display a link if user is authorized
44 44 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
45 45 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
46 46 end
47 47
48 48 # Display a link to user's account page
49 49 def link_to_user(user)
50 50 link_to user.display_name, :controller => 'account', :action => 'show', :id => user
51 51 end
52 52
53 53 def format_date(date)
54 54 l_date(date) if date
55 55 end
56 56
57 57 def format_time(time)
58 58 l_datetime(time) if time
59 59 end
60 60
61 61 def day_name(day)
62 62 l(:general_day_names).split(',')[day-1]
63 63 end
64 64
65 65 def month_name(month)
66 66 l(:actionview_datehelper_select_month_names).split(',')[month-1]
67 67 end
68 68
69 69 def pagination_links_full(paginator, options={}, html_options={})
70 70 html = ''
71 71 html << link_to_remote(('&#171; ' + l(:label_previous)),
72 72 {:update => "content", :url => { :page => paginator.current.previous }},
73 73 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.previous}))}) + ' ' if paginator.current.previous
74 74
75 75 html << (pagination_links_each(paginator, options) do |n|
76 76 link_to_remote(n.to_s,
77 77 {:url => {:action => 'list', :params => @params.merge({:page => n})}, :update => 'content'},
78 78 {:href => url_for(:action => 'list', :params => @params.merge({:page => n}))})
79 79 end || '')
80 80
81 81 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
82 82 {:update => "content", :url => { :page => paginator.current.next }},
83 83 {:href => url_for(:action => 'list', :params => @params.merge({:page => paginator.current.next}))}) if paginator.current.next
84 84 html
85 85 end
86 86
87 87 def textilizable(text)
88 88 $RDM_TEXTILE_DISABLED ? text : RedCloth.new(text).to_html
89 89 end
90 90
91 91 def error_messages_for(object_name, options = {})
92 92 options = options.symbolize_keys
93 93 object = instance_variable_get("@#{object_name}")
94 94 if object && !object.errors.empty?
95 95 # build full_messages here with controller current language
96 96 full_messages = []
97 97 object.errors.each do |attr, msg|
98 98 next if msg.nil?
99 99 if attr == "base"
100 100 full_messages << l(msg)
101 101 else
102 102 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
103 103 end
104 104 end
105 105 # retrieve custom values error messages
106 106 if object.errors[:custom_values]
107 107 object.custom_values.each do |v|
108 108 v.errors.each do |attr, msg|
109 109 next if msg.nil?
110 110 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
111 111 end
112 112 end
113 113 end
114 114 content_tag("div",
115 115 content_tag(
116 116 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
117 117 ) +
118 118 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
119 119 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
120 120 )
121 121 else
122 122 ""
123 123 end
124 124 end
125 125
126 126 def lang_options_for_select
127 127 (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]}
128 128 end
129 129
130 130 def label_tag_for(name, option_tags = nil, options = {})
131 131 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
132 132 content_tag("label", label_text)
133 133 end
134 134
135 135 def labelled_tabular_form_for(name, object, options, &proc)
136 136 options[:html] ||= {}
137 137 options[:html].store :class, "tabular"
138 138 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
139 139 end
140 140
141 141 def check_all_links(form_name)
142 142 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
143 143 " | " +
144 144 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
145 145 end
146 146
147 147 def calendar_for(field_id)
148 148 image_tag("calendar", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
149 149 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
150 150 end
151 151 end
152 152
153 153 class TabularFormBuilder < ActionView::Helpers::FormBuilder
154 154 include GLoc
155 155
156 156 def initialize(object_name, object, template, options, proc)
157 157 set_language_if_valid options.delete(:lang)
158 158 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
159 159 end
160 160
161 161 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
162 162 src = <<-END_SRC
163 163 def #{selector}(field, options = {})
164 164 return super if options.delete :no_label
165 165 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
166 166 label = @template.content_tag("label", label_text,
167 :class => (@object.errors[field] ? "error" : nil),
167 :class => (@object && @object.errors[field] ? "error" : nil),
168 168 :for => (@object_name.to_s + "_" + field.to_s))
169 169 label + super
170 170 end
171 171 END_SRC
172 172 class_eval src, __FILE__, __LINE__
173 173 end
174 174
175 175 def select(field, choices, options = {}, html_options = {})
176 176 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
177 177 label = @template.content_tag("label", label_text,
178 :class => (@object.errors[field] ? "error" : nil),
178 :class => (@object && @object.errors[field] ? "error" : nil),
179 179 :for => (@object_name.to_s + "_" + field.to_s))
180 180 label + super
181 181 end
182 182
183 183 end
184 184
@@ -1,64 +1,65
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Permission < ActiveRecord::Base
19 19 has_and_belongs_to_many :roles
20 20
21 21 validates_presence_of :controller, :action, :description
22 22
23 23 GROUPS = {
24 24 100 => :label_project,
25 25 200 => :label_member_plural,
26 26 300 => :label_version_plural,
27 27 400 => :label_issue_category_plural,
28 28 600 => :label_query_plural,
29 29 1000 => :label_issue_plural,
30 30 1100 => :label_news_plural,
31 31 1200 => :label_document_plural,
32 32 1300 => :label_attachment_plural,
33 1400 => :label_repository
33 34 }.freeze
34 35
35 36 @@cached_perms_for_public = nil
36 37 @@cached_perms_for_roles = nil
37 38
38 39 def name
39 40 self.controller + "/" + self.action
40 41 end
41 42
42 43 def group_id
43 44 (self.sort / 100)*100
44 45 end
45 46
46 47 def self.allowed_to_public(action)
47 48 @@cached_perms_for_public ||= find(:all, :conditions => ["is_public=?", true]).collect {|p| "#{p.controller}/#{p.action}"}
48 49 @@cached_perms_for_public.include? action
49 50 end
50 51
51 52 def self.allowed_to_role(action, role)
52 53 @@cached_perms_for_roles ||=
53 54 begin
54 55 perms = {}
55 56 find(:all, :include => :roles).each {|p| perms.store "#{p.controller}/#{p.action}", p.roles.collect {|r| r.id } }
56 57 perms
57 58 end
58 59 @@cached_perms_for_roles[action] and @@cached_perms_for_roles[action].include? role
59 60 end
60 61
61 62 def self.allowed_to_role_expired
62 63 @@cached_perms_for_roles = nil
63 64 end
64 65 end
@@ -1,59 +1,61
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Project < ActiveRecord::Base
19 19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
20 20 has_many :members, :dependent => true
21 21 has_many :users, :through => :members
22 22 has_many :custom_values, :dependent => true, :as => :customized
23 23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => [:status, :tracker]
24 24 has_many :queries, :dependent => true
25 25 has_many :documents, :dependent => true
26 26 has_many :news, :dependent => true, :include => :author
27 27 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
28 has_one :repository, :dependent => true
28 29 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
29 30 acts_as_tree :order => "name", :counter_cache => true
30 31
31 32 validates_presence_of :name, :description
32 33 validates_uniqueness_of :name
33 34 validates_associated :custom_values, :on => :update
35 validates_associated :repository
34 36 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
35 37
36 38 # returns 5 last created projects
37 39 def self.latest
38 40 find(:all, :limit => 5, :order => "created_on DESC")
39 41 end
40 42
41 43 # Returns an array of all custom fields enabled for project issues
42 44 # (explictly associated custom fields and custom fields enabled for all projects)
43 45 def custom_fields_for_issues(tracker)
44 46 tracker.custom_fields.find(:all, :include => :projects,
45 47 :conditions => ["is_for_all=? or project_id=?", true, self.id])
46 48 #(CustomField.for_all + custom_fields).uniq
47 49 end
48 50
49 51 def all_custom_fields
50 52 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
51 53 :conditions => ["is_for_all=? or project_id=?", true, self.id])
52 54 end
53 55
54 56 protected
55 57 def validate
56 58 errors.add(parent_id, " must be a root project") if parent and parent.parent
57 59 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
58 60 end
59 61 end
@@ -1,143 +1,145
1 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
3 3 <head>
4 4 <title><%= $RDM_HEADER_TITLE + (@html_title ? ": #{@html_title}" : "") %></title>
5 5 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6 6 <meta name="description" content="redMine" />
7 7 <meta name="keywords" content="issue,bug,tracker" />
8 8 <%= stylesheet_link_tag "application" %>
9 9 <%= stylesheet_link_tag "menu" %>
10 10 <%= stylesheet_link_tag "rails" %>
11 11 <%= stylesheet_link_tag "print", :media => "print" %>
12 12 <%= javascript_include_tag :defaults %>
13 13 <%= javascript_include_tag 'menu' %>
14 14 <%= javascript_include_tag 'calendar/calendar' %>
15 15 <%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
16 16 <%= javascript_include_tag 'calendar/calendar-setup' %>
17 17 <%= stylesheet_link_tag 'calendar' %>
18 18 <%= stylesheet_link_tag 'jstoolbar' %>
19 19 </head>
20 20
21 21 <body>
22 22 <div id="container" >
23 23
24 24 <div id="header">
25 25 <div style="float: left;">
26 26 <h1><%= $RDM_HEADER_TITLE %></h1>
27 27 <h2><%= $RDM_HEADER_SUBTITLE %></h2>
28 28 </div>
29 29 <div style="float: right; padding-right: 1em; padding-top: 0.2em;">
30 30 <% if loggedin? %><small><%=l(:label_logged_as)%> <b><%= @logged_in_user.login %></b></small><% end %>
31 31 </div>
32 32 </div>
33 33
34 34 <div id="navigation">
35 35 <ul>
36 36 <li class="selected"><%= link_to l(:label_home), { :controller => '' }, :class => "picHome" %></li>
37 37 <li><%= link_to l(:label_my_page), { :controller => 'my', :action => 'page'}, :class => "picUserPage" %></li>
38 38 <li><%= link_to l(:label_project_plural), { :controller => 'projects' }, :class => "picProject" %></li>
39 39
40 40 <% unless @project.nil? || @project.id.nil? %>
41 41 <li><%= link_to @project.name, { :controller => 'projects', :action => 'show', :id => @project }, :class => "picProject", :onmouseover => "buttonMouseover(event, 'menuProject');" %></li>
42 42 <% end %>
43 43
44 44 <% if loggedin? %>
45 45 <li><%= link_to l(:label_my_account), { :controller => 'my', :action => 'account' }, :class => "picUser" %></li>
46 46 <% end %>
47 47
48 48 <% if admin_loggedin? %>
49 49 <li><%= link_to l(:label_administration), { :controller => 'admin' }, :class => "picAdmin", :onmouseover => "buttonMouseover(event, 'menuAdmin');" %></li>
50 50 <% end %>
51 51
52 52 <li class="right"><%= link_to l(:label_help), { :controller => 'help', :ctrl => @params[:controller], :page => @params[:action] }, :target => "new", :class => "picHelp" %></li>
53 53
54 54 <% if loggedin? %>
55 55 <li class="right"><%= link_to l(:label_logout), { :controller => 'account', :action => 'logout' }, :class => "picUser" %></li>
56 56 <% else %>
57 57 <li class="right"><%= link_to l(:label_login), { :controller => 'account', :action => 'login' }, :class => "picUser" %></li>
58 58 <% end %>
59 59 </ul>
60 60 </div>
61 61
62 62 <% if admin_loggedin? %>
63 63 <div id="menuAdmin" class="menu" onmouseover="menuMouseover(event)">
64 64 <a class="menuItem" href="/admin/projects" onmouseover="menuItemMouseover(event,'menuProjects');"><span class="menuItemText"><%=l(:label_project_plural)%></span><span class="menuItemArrow">&#9654;</span></a>
65 65 <a class="menuItem" href="/users" onmouseover="menuItemMouseover(event,'menuUsers');"><span class="menuItemText"><%=l(:label_user_plural)%></span><span class="menuItemArrow">&#9654;</span></a>
66 66 <a class="menuItem" href="/roles"><%=l(:label_role_and_permissions)%></a>
67 67 <a class="menuItem" href="/trackers" onmouseover="menuItemMouseover(event,'menuTrackers');"><span class="menuItemText"><%=l(:label_tracker_plural)%></span><span class="menuItemArrow">&#9654;</span></a>
68 68 <a class="menuItem" href="/custom_fields"><%=l(:label_custom_field_plural)%></a>
69 69 <a class="menuItem" href="/enumerations"><%=l(:label_enumerations)%></a>
70 70 <a class="menuItem" href="/admin/mail_options"><%=l(:field_mail_notification)%></a>
71 71 <a class="menuItem" href="/auth_sources"><%=l(:label_authentication)%></a>
72 72 <a class="menuItem" href="/admin/info"><%=l(:label_information_plural)%></a>
73 73 </div>
74 74 <div id="menuTrackers" class="menu">
75 75 <a class="menuItem" href="/issue_statuses"><%=l(:label_issue_status_plural)%></a>
76 76 <a class="menuItem" href="/roles/workflow"><%=l(:label_workflow)%></a>
77 77 </div>
78 78 <div id="menuProjects" class="menu"><a class="menuItem" href="/projects/add"><%=l(:label_new)%></a></div>
79 79 <div id="menuUsers" class="menu"><a class="menuItem" href="/users/add"><%=l(:label_new)%></a></div>
80 80 <% end %>
81 81
82 82 <% unless @project.nil? || @project.id.nil? %>
83 83 <div id="menuProject" class="menu" onmouseover="menuMouseover(event)">
84 84 <%= link_to l(:label_calendar), {:controller => 'projects', :action => 'calendar', :id => @project }, :class => "menuItem" %>
85 85 <%= link_to l(:label_gantt), {:controller => 'projects', :action => 'gantt', :id => @project }, :class => "menuItem" %>
86 86 <%= link_to l(:label_issue_plural), {:controller => 'projects', :action => 'list_issues', :id => @project }, :class => "menuItem" %>
87 87 <%= link_to l(:label_report_plural), {:controller => 'reports', :action => 'issue_report', :id => @project }, :class => "menuItem" %>
88 88 <%= link_to l(:label_activity), {:controller => 'projects', :action => 'activity', :id => @project }, :class => "menuItem" %>
89 89 <%= link_to l(:label_news_plural), {:controller => 'projects', :action => 'list_news', :id => @project }, :class => "menuItem" %>
90 90 <%= link_to l(:label_change_log), {:controller => 'projects', :action => 'changelog', :id => @project }, :class => "menuItem" %>
91 91 <%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %>
92 92 <%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %>
93 93 <%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %>
94 <%= link_to l(:label_repository), {:controller => 'repositories', :action => 'show', :id => @project}, :class => "menuItem" if @project.repository and !@project.repository.new_record? %></li>
94 95 <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project }, :class => "menuItem" %>
95 96 </div>
96 97 <% end %>
97 98
98 99
99 100 <div id="subcontent">
100 101
101 102 <% unless @project.nil? || @project.id.nil? %>
102 103 <h2><%= @project.name %></h2>
103 104 <ul class="menublock">
104 105 <li><%= link_to l(:label_overview), :controller => 'projects', :action => 'show', :id => @project %></li>
105 106 <li><%= link_to l(:label_calendar), :controller => 'projects', :action => 'calendar', :id => @project %></li>
106 107 <li><%= link_to l(:label_gantt), :controller => 'projects', :action => 'gantt', :id => @project %></li>
107 108 <li><%= link_to l(:label_issue_plural), :controller => 'projects', :action => 'list_issues', :id => @project %></li>
108 109 <li><%= link_to l(:label_report_plural), :controller => 'reports', :action => 'issue_report', :id => @project %></li>
109 110 <li><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => @project %></li>
110 111 <li><%= link_to l(:label_news_plural), :controller => 'projects', :action => 'list_news', :id => @project %></li>
111 112 <li><%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %></li>
112 113 <li><%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %></li>
113 114 <li><%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %></li>
114 115 <li><%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %></li>
116 <li><%= link_to l(:label_repository), :controller => 'repositories', :action => 'show', :id => @project if @project.repository and !@project.repository.new_record? %></li>
115 117 <li><%= link_to_if_authorized l(:label_settings), :controller => 'projects', :action => 'settings', :id => @project %></li>
116 118 </ul>
117 119 <% end %>
118 120
119 121 <% if loggedin? and @logged_in_user.memberships.length > 0 %>
120 122 <h2><%=l(:label_my_projects) %></h2>
121 123 <ul class="menublock">
122 124 <% for membership in @logged_in_user.memberships %>
123 125 <li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %></li>
124 126 <% end %>
125 127 </ul>
126 128 <% end %>
127 129 </div>
128 130
129 131 <div id="content">
130 132 <% if flash[:notice] %><p style="color: green"><%= flash[:notice] %></p><% end %>
131 133 <%= @content_for_layout %>
132 134 </div>
133 135
134 136 <div id="footer">
135 137 <p>
136 138 <%= auto_link $RDM_FOOTER_SIG %> |
137 139 <a href="http://redmine.rubyforge.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %>
138 140 </p>
139 141 </div>
140 142
141 143 </div>
142 144 </body>
143 145 </html> No newline at end of file
@@ -1,26 +1,37
1 1 <%= error_messages_for 'project' %>
2
2 3 <div class="box">
3 4 <!--[form:project]-->
4 5 <p><%= f.text_field :name, :required => true %></p>
5 6
6 7 <% if admin_loggedin? and !@root_projects.empty? %>
7 8 <p><%= f.select :parent_id, (@root_projects.collect {|p| [p.name, p.id]}), { :include_blank => true } %></p>
8 9 <% end %>
9 10
10 11 <p><%= f.text_area :description, :required => true, :cols => 60, :rows => 3 %></p>
11 12 <p><%= f.text_field :homepage, :size => 40 %></p>
12 13 <p><%= f.check_box :is_public %></p>
13 14
14 15 <% for @custom_value in @custom_values %>
15 16 <p><%= custom_field_tag_with_label @custom_value %></p>
16 17 <% end %>
17 18
18 19 <% unless @custom_fields.empty? %>
19 20 <p><label><%=l(:label_custom_field_plural)%></label>
20 21 <% for custom_field in @custom_fields %>
21 22 <%= check_box_tag "custom_field_ids[]", custom_field.id, ((@project.custom_fields.include? custom_field) or custom_field.is_for_all?), (custom_field.is_for_all? ? {:disabled => "disabled"} : {}) %>
22 23 <%= custom_field.name %>
23 24 <% end %></p>
24 25 <% end %>
25 <!--[eoform:project]-->
26 <!--[eoform:project]-->
27 </div>
28
29 <div class="box"><h3><%= check_box_tag "repository_enabled", 1, !@project.repository.nil?, :onclick => "Element.toggle('repository');" %> <%= l(:label_repository) %></h3>
30 <%= hidden_field_tag "repository_enabled", 0 %>
31 <div id="repository">
32 <% fields_for :repository, @project.repository, { :builder => TabularFormBuilder, :lang => current_language} do |repository| %>
33 <p><%= repository.text_field :url, :size => 60, :required => true %><br />(http://, https://, svn://)</p>
34 <% end %>
35 </div>
36 <%= javascript_tag "Element.hide('repository');" if @project.repository.nil? %>
26 37 </div>
@@ -1,24 +1,25
1 1 ActionController::Routing::Routes.draw do |map|
2 2 # Add your own custom routes here.
3 3 # The priority is based upon order of creation: first created -> highest priority.
4 4
5 5 # Here's a sample route:
6 6 # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
7 7 # Keep in mind you can assign values other than :controller and :action
8 8
9 9 # You can have the root of your site routed by hooking up ''
10 10 # -- just remember to delete public/index.html.
11 11 map.connect '', :controller => "welcome"
12
12
13 map.connect 'repositories/:action/:id/:path', :controller => 'repositories'
13 14 map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow'
14 15 map.connect 'help/:ctrl/:page', :controller => 'help'
15 16 map.connect ':controller/:action/:id/:sort_key/:sort_order'
16 17
17 18 # Allow downloading Web Service WSDL as a file with an extension
18 19 # instead of a file named 'wsdl'
19 20 map.connect ':controller/service.wsdl', :action => 'wsdl'
20 21
21 22
22 23 # Install the default route as the lowest priority.
23 24 map.connect ':controller/:action/:id'
24 25 end
@@ -1,100 +1,101
1 1 == redMine changelog
2 2
3 3 redMine - project management software
4 4 Copyright (C) 2006 Jean-Philippe Lang
5 5 http://redmine.org/
6 6
7 7
8 8 == xx/xx/2006 v0.x.x
9 9
10 * simple SVN browser added (just needs svn binaries in PATH)
10 11 * comments can now be added on news
11 12 * "my page" is now customizable
12 13 * more powerfull and savable filters for issues lists
13 14 * improved issues change history
14 15 * new functionality: move an issue to another project or tracker
15 16 * new functionality: add a note to an issue
16 17 * new report: project activity
17 18 * "start date" and "% done" fields added on issues
18 19 * project calendar added
19 20 * gantt chart added (exportable to pdf)
20 21 * single/multiple issues pdf export added
21 22 * issues reports improvements
22 23 * multiple file upload for issues attachments
23 24 * textile formating of issue and news descritions (RedCloth required)
24 25 * integration of DotClear jstoolbar for textile formatting
25 26 * calendar date picker for date fields (LGPL DHTML Calendar http://sourceforge.net/projects/jscalendar)
26 27 * new filter in issues list: Author
27 28 * ajaxified paginators
28 29 * option to set number of results per page on issues list
29 30 * localized csv separator (comma/semicolon)
30 31 * csv output encoded to ISO-8859-1
31 32 * user custom field displayed on account/show
32 33 * default configuration improved (default roles, trackers, status, permissions and workflows)
33 34 * javascript added on custom field form to show/hide fields according to the format of custom field
34 35 * fixed: custom fields not in csv exports
35 36 * fixed: project settings now displayed according to user's permissions
36 37 * fixed: application error when no version is selected on projects/add_file
37 38
38 39 == 10/08/2006 v0.3.0
39 40
40 41 * user authentication against multiple LDAP (optional)
41 42 * token based "lost password" functionality
42 43 * user self-registration functionality (optional)
43 44 * custom fields now available for issues, users and projects
44 45 * new custom field format "text" (displayed as a textarea field)
45 46 * project & administration drop down menus in navigation bar for quicker access
46 47 * text formatting is preserved for long text fields (issues, projects and news descriptions)
47 48 * urls and emails are turned into clickable links in long text fields
48 49 * "due date" field added on issues
49 50 * tracker selection filter added on change log
50 51 * Localization plugin replaced with GLoc 1.1.0 (iconv required)
51 52 * error messages internationalization
52 53 * german translation added (thanks to Karim Trott)
53 54 * data locking for issues to prevent update conflicts (using ActiveRecord builtin optimistic locking)
54 55 * new filter in issues list: "Fixed version"
55 56 * active filters are displayed with colored background on issues list
56 57 * custom configuration is now defined in config/config_custom.rb
57 58 * user object no more stored in session (only user_id)
58 59 * news summary field is no longer required
59 60 * tables and forms redesign
60 61 * Fixed: boolean custom field not working
61 62 * Fixed: error messages for custom fields are not displayed
62 63 * Fixed: invalid custom fields should have a red border
63 64 * Fixed: custom fields values are not validated on issue update
64 65 * Fixed: unable to choose an empty value for 'List' custom fields
65 66 * Fixed: no issue categories sorting
66 67 * Fixed: incorrect versions sorting
67 68
68 69
69 70 == 07/12/2006 - v0.2.2
70 71
71 72 * Fixed: bug in "issues list"
72 73
73 74
74 75 == 07/09/2006 - v0.2.1
75 76
76 77 * new databases supported: Oracle, PostgreSQL, SQL Server
77 78 * projects/subprojects hierarchy (1 level of subprojects only)
78 79 * environment information display in admin/info
79 80 * more filter options in issues list (rev6)
80 81 * default language based on browser settings (Accept-Language HTTP header)
81 82 * issues list exportable to CSV (rev6)
82 83 * simple_format and auto_link on long text fields
83 84 * more data validations
84 85 * Fixed: error when all mail notifications are unchecked in admin/mail_options
85 86 * Fixed: all project news are displayed on project summary
86 87 * Fixed: Can't change user password in users/edit
87 88 * Fixed: Error on tables creation with PostgreSQL (rev5)
88 89 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
89 90
90 91
91 92 == 06/25/2006 - v0.1.0
92 93
93 94 * multiple users/multiple projects
94 95 * role based access control
95 96 * issue tracking system
96 97 * fully customizable workflow
97 98 * documents/files repository
98 99 * email notifications on issue creation and update
99 100 * multilanguage support (except for error messages):english, french, spanish
100 101 * online manual in french (unfinished) No newline at end of file
@@ -1,343 +1,356
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Bitte auserwΓ€hlt
21 21
22 22 activerecord_error_inclusion: ist nicht in der Liste eingeschlossen
23 23 activerecord_error_exclusion: ist reserviert
24 24 activerecord_error_invalid: ist unzulΓ€ssig
25 25 activerecord_error_confirmation: bringt nicht BestΓ€tigung zusammen
26 26 activerecord_error_accepted: muß angenommen werden
27 27 activerecord_error_empty: kann nicht leer sein
28 28 activerecord_error_blank: kann nicht leer sein
29 29 activerecord_error_too_long: ist zu lang
30 30 activerecord_error_too_short: ist zu kurz
31 31 activerecord_error_wrong_length: ist die falsche LΓ€nge
32 32 activerecord_error_taken: ist bereits genommen worden
33 33 activerecord_error_not_a_number: ist nicht eine Zahl
34 34 activerecord_error_not_a_date: ist nicht ein gΓΌltiges Datum
35 35 activerecord_error_greater_than_start_date: muß als grâsser sein beginnen Datum
36 36
37 37 general_fmt_age: %d yr
38 38 general_fmt_age_plural: %d yrs
39 39 general_fmt_date: %%b %%d, %%Y (%%a)
40 40 general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p
41 41 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
42 42 general_fmt_time: %%I:%%M %%p
43 43 general_text_No: 'Nein'
44 44 general_text_Yes: 'Ja'
45 45 general_text_no: 'nein'
46 46 general_text_yes: 'ja'
47 47 general_lang_de: 'Deutsch'
48 48 general_csv_separator: ';'
49 49 general_day_names: Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag
50 50
51 51 notice_account_updated: Konto wurde erfolgreich aktualisiert.
52 52 notice_account_invalid_creditentials: UnzulΓ€ssiger Benutzer oder Passwort
53 53 notice_account_password_updated: Passwort wurde erfolgreich aktualisiert.
54 54 notice_account_wrong_password: Falsches Passwort
55 55 notice_account_register_done: Konto wurde erfolgreich verursacht.
56 56 notice_account_unknown_email: Unbekannter Benutzer.
57 57 notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. UnmΓΆglich, das Kennwort zu Γ€ndern.
58 58 notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wΓ€hlen ist dir geschickt worden.
59 59 notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen.
60 60 notice_successful_create: Erfolgreiche Kreation.
61 61 notice_successful_update: Erfolgreiches Update.
62 62 notice_successful_delete: Erfolgreiche Auslassung.
63 63 notice_successful_connection: Erfolgreicher Anschluß.
64 64 notice_file_not_found: Erbetene Akte besteht nicht oder ist gelΓΆscht worden.
65 65 notice_locking_conflict: Data have been updated by another user.
66 notice_scm_error: Eintragung und/oder Neuausgabe besteht nicht im BehΓ€lter.
66 67
67 68 mail_subject_lost_password: Dein redMine Kennwort
68 69 mail_subject_register: redMine Kontoaktivierung
69 70
70 71 gui_validation_error: 1 StΓΆrung
71 72 gui_validation_error_plural: %d StΓΆrungen
72 73
73 74 field_name: Name
74 75 field_description: Beschreibung
75 76 field_summary: Zusammenfassung
76 77 field_is_required: Erforderlich
77 78 field_firstname: Vorname
78 79 field_lastname: Nachname
79 80 field_mail: Email
80 81 field_filename: Datei
81 82 field_filesize: Grootte
82 83 field_downloads: Downloads
83 84 field_author: Autor
84 85 field_created_on: Angelegt
85 86 field_updated_on: aktualisiert
86 87 field_field_format: Format
87 88 field_is_for_all: FΓΌr alle Projekte
88 89 field_possible_values: MΓΆgliche Werte
89 90 field_regexp: RegulΓ€rer Ausdruck
90 91 field_min_length: Minimale LΓ€nge
91 92 field_max_length: Maximale LΓ€nge
92 93 field_value: Wert
93 94 field_category: Kategorie
94 95 field_title: TΓ­tel
95 96 field_project: Projekt
96 97 field_issue: Antrag
97 98 field_status: Status
98 99 field_notes: Anmerkungen
99 100 field_is_closed: Problem erledigt
100 101 field_is_default: RΓΌckstellung status
101 102 field_html_color: Farbe
102 103 field_tracker: Tracker
103 104 field_subject: Thema
104 105 field_due_date: Abgabedatum
105 106 field_assigned_to: Zugewiesen an
106 107 field_priority: PrioritΓ€t
107 108 field_fixed_version: Erledigt in Version
108 109 field_user: Benutzer
109 110 field_role: Rolle
110 111 field_homepage: Startseite
111 112 field_is_public: Γ–ffentlich
112 113 field_parent: Subprojekt von
113 114 field_is_in_chlog: Ansicht der Issues in der Historie
114 115 field_login: Mitgliedsname
115 116 field_mail_notification: Mailbenachrichtigung
116 117 field_admin: Administrator
117 118 field_locked: Gesperrt
118 119 field_last_login_on: Letzte Anmeldung
119 120 field_language: Sprache
120 121 field_effective_date: Datum
121 122 field_password: Passwort
122 123 field_new_password: Neues Passwort
123 124 field_password_confirmation: BestΓ€tigung
124 125 field_version: Version
125 126 field_type: Typ
126 127 field_host: Host
127 128 field_port: Port
128 129 field_account: Konto
129 130 field_base_dn: Base DN
130 131 field_attr_login: Mitgliedsnameattribut
131 132 field_attr_firstname: Vornamensattribut
132 133 field_attr_lastname: Namenattribut
133 134 field_attr_mail: Emailattribut
134 135 field_onthefly: On-the-fly Benutzerkreation
135 136 field_start_date: Beginn
136 137 field_done_ratio: %% Getan
137 138 field_hide_mail: Mein email address verstecken
138 139 field_comment: Anmerkung
140 field_url: URL
139 141
140 142 label_user: Benutzer
141 143 label_user_plural: Benutzer
142 144 label_user_new: Neuer Benutzer
143 145 label_project: Projekt
144 146 label_project_new: Neues Projekt
145 147 label_project_plural: Projekte
146 148 label_project_latest: Neueste Projekte
147 149 label_issue: Antrag
148 150 label_issue_new: Neue Antrag
149 151 label_issue_plural: AntrΓ€ge
150 152 label_issue_view_all: Alle AntrΓ€ge ansehen
151 153 label_document: Dokument
152 154 label_document_new: Neues Dokument
153 155 label_document_plural: Dokumente
154 156 label_role: Rolle
155 157 label_role_plural: Rollen
156 158 label_role_new: Neue Rolle
157 159 label_role_and_permissions: Rollen und Rechte
158 160 label_member: Mitglied
159 161 label_member_new: Neues Mitglied
160 162 label_member_plural: Mitglieder
161 163 label_tracker: Tracker
162 164 label_tracker_plural: Tracker
163 165 label_tracker_new: Neuer Tracker
164 166 label_workflow: Workflow
165 167 label_issue_status: Antrag Status
166 168 label_issue_status_plural: Antrag Stati
167 169 label_issue_status_new: Neuer Status
168 170 label_issue_category: Antrag Kategorie
169 171 label_issue_category_plural: Antrag Kategorien
170 172 label_issue_category_new: Neue Kategorie
171 173 label_custom_field: Benutzerdefiniertes Feld
172 174 label_custom_field_plural: Benutzerdefinierte Felder
173 175 label_custom_field_new: Neues Feld
174 176 label_enumerations: Enumerationen
175 177 label_enumeration_new: Neuer Wert
176 178 label_information: Information
177 179 label_information_plural: Informationen
178 180 label_please_login: Anmelden
179 181 label_register: Anmelden
180 182 label_password_lost: Passwort vergessen
181 183 label_home: Hauptseite
182 184 label_my_page: Meine Seite
183 185 label_my_account: Mein Konto
184 186 label_my_projects: Meine Projekte
185 187 label_administration: Administration
186 188 label_login: Einloggen
187 189 label_logout: Abmelden
188 190 label_help: Hilfe
189 191 label_reported_issues: Gemeldete Issues
190 192 label_assigned_to_me_issues: Mir zugewiesen
191 193 label_last_login: Letzte Anmeldung
192 194 label_last_updates: Letztes aktualisiertes
193 195 label_last_updates_plural: %d Letztes aktualisiertes
194 196 label_registered_on: Angemeldet am
195 197 label_activity: AktivitΓ€t
196 198 label_new: Neue
197 199 label_logged_as: Angemeldet als
198 200 label_environment: Environment
199 201 label_authentication: Authentisierung
200 202 label_auth_source: Authentisierung Modus
201 203 label_auth_source_new: Neuer Authentisierung Modus
202 204 label_auth_source_plural: Authentisierung Modi
203 205 label_subproject: Vorprojekt von
204 206 label_subproject_plural: Vorprojekte
205 207 label_min_max_length: Min - Max LΓ€nge
206 208 label_list: Liste
207 209 label_date: Date
208 210 label_integer: Zahl
209 211 label_boolean: Boolesch
210 212 label_string: Text
211 213 label_text: Langer Text
212 214 label_attribute: Attribut
213 215 label_attribute_plural: Attribute
214 216 label_download: %d Herunterlade
215 217 label_download_plural: %d Herunterlade
216 218 label_no_data: Nichts anzuzeigen
217 219 label_change_status: Statuswechsel
218 220 label_history: Historie
219 221 label_attachment: Datei
220 222 label_attachment_new: Neue Datei
221 223 label_attachment_delete: LΓΆschungakten
222 224 label_attachment_plural: Dateien
223 225 label_report: Bericht
224 226 label_report_plural: Berichte
225 227 label_news: Neuigkeit
226 228 label_news_new: Neuigkeite addieren
227 229 label_news_plural: Neuigkeiten
228 230 label_news_latest: Letzte Neuigkeiten
229 231 label_news_view_all: Alle Neuigkeiten anzeigen
230 232 label_change_log: Change log
231 233 label_settings: Konfiguration
232 234 label_overview: Übersicht
233 235 label_version: Version
234 236 label_version_new: Neue Version
235 237 label_version_plural: Versionen
236 238 label_confirmation: BestΓ€tigung
237 239 label_export_to: Export zu
238 240 label_read: Lesen...
239 241 label_public_projects: Γ–ffentliche Projekte
240 242 label_open_issues: GeΓΆffnet
241 243 label_open_issues_plural: GeΓΆffnet
242 244 label_closed_issues: Geschlossen
243 245 label_closed_issues_plural: Geschlossen
244 246 label_total: Gesamtzahl
245 247 label_permissions: Berechtigungen
246 248 label_current_status: GegenwΓ€rtiger Status
247 249 label_new_statuses_allowed: Neue Status gewΓ€hrten
248 250 label_all: Alle
249 251 label_none: Kein
250 252 label_next: Weiter
251 253 label_previous: ZurΓΌck
252 254 label_used_by: Benutzt von
253 255 label_details: Details...
254 256 label_add_note: Eine Anmerkung addieren
255 257 label_per_page: Pro Seite
256 258 label_calendar: Kalender
257 259 label_months_from: Monate von
258 260 label_gantt: Gantt
259 261 label_internal: Intern
260 262 label_last_changes: %d Γ€nderungen des Letzten
261 263 label_change_view_all: Alle Γ€nderungen ansehen
262 264 label_personalize_page: Diese Seite personifizieren
263 265 label_comment: Anmerkung
264 266 label_comment_plural: Anmerkungen
265 267 label_comment_add: Anmerkung addieren
266 268 label_comment_added: Anmerkung fΓΌgte hinzu
267 269 label_comment_delete: Anmerkungen lΓΆschen
268 270 label_query: Benutzerdefiniertes Frage
269 271 label_query_plural: Benutzerdefinierte Fragen
270 272 label_query_new: Neue Frage
271 273 label_filter_add: Filter addieren
272 274 label_filter_plural: Filter
273 275 label_equals: ist
274 276 label_not_equals: ist nicht
275 277 label_in_less_than: an weniger als
276 278 label_in_more_than: an mehr als
277 279 label_in: an
278 280 label_today: heute
279 281 label_less_than_ago: vor weniger als
280 282 label_more_than_ago: vor mehr als
281 283 label_ago: vor
282 284 label_contains: enthΓ€lt
283 285 label_not_contains: enthΓ€lt nicht
284 286 label_day_plural: Tage
287 label_repository: SVN BehΓ€lter
288 label_browse: Grasen
289 label_modification: %d Γ€nderung
290 label_modification_plural: %d Γ€nderungen
291 label_revision: Neuausgabe
292 label_revision_plural: Neuausgaben
293 label_added: hinzugefΓΌgt
294 label_modified: geΓ€ndert
295 label_deleted: gelΓΆscht
296 label_latest_revision: Neueste Neuausgabe
297 label_view_revisions: Die Neuausgaben ansehen
285 298
286 299 button_login: Einloggen
287 300 button_submit: Einreichen
288 301 button_save: Speichern
289 302 button_check_all: Alles auswΓ€hlen
290 303 button_uncheck_all: Alles abwΓ€hlen
291 304 button_delete: LΓΆschen
292 305 button_create: Anlegen
293 306 button_test: Testen
294 307 button_edit: Bearbeiten
295 308 button_add: HinzufΓΌgen
296 309 button_change: Wechseln
297 310 button_apply: Anwenden
298 311 button_clear: ZurΓΌcksetzen
299 312 button_lock: Verriegeln
300 313 button_unlock: Entriegeln
301 314 button_download: Fernzuladen
302 315 button_list: Aufzulisten
303 316 button_view: Siehe
304 317 button_move: Bewegen
305 318 button_back: RΓΌckkehr
306 319 button_cancel: Annullieren
307 320
308 321 text_select_mail_notifications: Aktionen fΓΌr die Mailbenachrichtigung aktiviert werden soll.
309 322 text_regexp_info: eg. ^[A-Z0-9]+$
310 323 text_min_max_length_info: 0 heisst keine BeschrΓ€nkung
311 324 text_possible_values_info: Werte trennten sich mit |
312 325 text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt lâschen wollen ?
313 326 text_workflow_edit: Auswahl Workflow zum Bearbeiten
314 327 text_are_you_sure: Sind sie sicher ?
315 328 text_journal_changed: geΓ€ndert von %s zu %s
316 329 text_journal_set_to: gestellt zu %s
317 330 text_journal_deleted: gelΓΆscht
318 331 text_tip_task_begin_day: Aufgabe, die an diesem Tag beginnt
319 332 text_tip_task_end_day: Aufgabe, die an diesem Tag beendet
320 333 text_tip_task_begin_end_day: Aufgabe, die an diesem Tag beginnt und beendet
321 334
322 335 default_role_manager: Manager
323 336 default_role_developper: Developer
324 337 default_role_reporter: Reporter
325 338 default_tracker_bug: Fehler
326 339 default_tracker_feature: Feature
327 340 default_tracker_support: Support
328 341 default_issue_status_new: Neu
329 342 default_issue_status_assigned: Zugewiesen
330 343 default_issue_status_resolved: GelΓΆst
331 344 default_issue_status_feedback: Feedback
332 345 default_issue_status_closed: Erledigt
333 346 default_issue_status_rejected: Abgewiesen
334 347 default_doc_category_user: Benutzerdokumentation
335 348 default_doc_category_tech: Technische Dokumentation
336 349 default_priority_low: Niedrig
337 350 default_priority_normal: Normal
338 351 default_priority_high: Hoch
339 352 default_priority_urgent: Dringend
340 353 default_priority_immediate: Sofort
341 354
342 355 enumeration_issue_priorities: Issue-PrioritΓ€ten
343 356 enumeration_doc_categories: Dokumentenkategorien
@@ -1,343 +1,356
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: is not a valid date
35 35 activerecord_error_greater_than_start_date: must be greater than start date
36 36
37 37 general_fmt_age: %d yr
38 38 general_fmt_age_plural: %d yrs
39 39 general_fmt_date: %%m/%%d/%%Y
40 40 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
41 41 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
42 42 general_fmt_time: %%I:%%M %%p
43 43 general_text_No: 'No'
44 44 general_text_Yes: 'Yes'
45 45 general_text_no: 'no'
46 46 general_text_yes: 'yes'
47 47 general_lang_en: 'English'
48 48 general_csv_separator: ','
49 49 general_day_names: Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
50 50
51 51 notice_account_updated: Account was successfully updated.
52 52 notice_account_invalid_creditentials: Invalid user or password
53 53 notice_account_password_updated: Password was successfully updated.
54 54 notice_account_wrong_password: Wrong password
55 55 notice_account_register_done: Account was successfully created.
56 56 notice_account_unknown_email: Unknown user.
57 57 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
58 58 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
59 59 notice_account_activated: Your account has been activated. You can now log in.
60 60 notice_successful_create: Successful creation.
61 61 notice_successful_update: Successful update.
62 62 notice_successful_delete: Successful deletion.
63 63 notice_successful_connection: Successful connection.
64 64 notice_file_not_found: Requested file doesn't exist or has been deleted.
65 65 notice_locking_conflict: Data have been updated by another user.
66 notice_scm_error: Entry and/or revision doesn't exist in the repository.
66 67
67 68 mail_subject_lost_password: Your redMine password
68 69 mail_subject_register: redMine account activation
69 70
70 71 gui_validation_error: 1 error
71 72 gui_validation_error_plural: %d errors
72 73
73 74 field_name: Name
74 75 field_description: Description
75 76 field_summary: Summary
76 77 field_is_required: Required
77 78 field_firstname: Firstname
78 79 field_lastname: Lastname
79 80 field_mail: Email
80 81 field_filename: File
81 82 field_filesize: Size
82 83 field_downloads: Downloads
83 84 field_author: Author
84 85 field_created_on: Created
85 86 field_updated_on: Updated
86 87 field_field_format: Format
87 88 field_is_for_all: For all projects
88 89 field_possible_values: Possible values
89 90 field_regexp: Regular expression
90 91 field_min_length: Minimum length
91 92 field_max_length: Maximum length
92 93 field_value: Value
93 94 field_category: Category
94 95 field_title: Title
95 96 field_project: Project
96 97 field_issue: Issue
97 98 field_status: Status
98 99 field_notes: Notes
99 100 field_is_closed: Issue closed
100 101 field_is_default: Default status
101 102 field_html_color: Color
102 103 field_tracker: Tracker
103 104 field_subject: Subject
104 105 field_due_date: Due date
105 106 field_assigned_to: Assigned to
106 107 field_priority: Priority
107 108 field_fixed_version: Fixed version
108 109 field_user: User
109 110 field_role: Role
110 111 field_homepage: Homepage
111 112 field_is_public: Public
112 113 field_parent: Subproject of
113 114 field_is_in_chlog: Issues displayed in changelog
114 115 field_login: Login
115 116 field_mail_notification: Mail notifications
116 117 field_admin: Administrator
117 118 field_locked: Locked
118 119 field_last_login_on: Last connection
119 120 field_language: Language
120 121 field_effective_date: Date
121 122 field_password: Password
122 123 field_new_password: New password
123 124 field_password_confirmation: Confirmation
124 125 field_version: Version
125 126 field_type: Type
126 127 field_host: Host
127 128 field_port: Port
128 129 field_account: Account
129 130 field_base_dn: Base DN
130 131 field_attr_login: Login attribute
131 132 field_attr_firstname: Firstname attribute
132 133 field_attr_lastname: Lastname attribute
133 134 field_attr_mail: Email attribute
134 135 field_onthefly: On-the-fly user creation
135 136 field_start_date: Start
136 137 field_done_ratio: %% Done
137 138 field_hide_mail: Hide my email address
138 139 field_comment: Comment
140 field_url: URL
139 141
140 142 label_user: User
141 143 label_user_plural: Users
142 144 label_user_new: New user
143 145 label_project: Project
144 146 label_project_new: New project
145 147 label_project_plural: Projects
146 148 label_project_latest: Latest projects
147 149 label_issue: Issue
148 150 label_issue_new: New issue
149 151 label_issue_plural: Issues
150 152 label_issue_view_all: View all issues
151 153 label_document: Document
152 154 label_document_new: New document
153 155 label_document_plural: Documents
154 156 label_role: Role
155 157 label_role_plural: Roles
156 158 label_role_new: New role
157 159 label_role_and_permissions: Roles and permissions
158 160 label_member: Member
159 161 label_member_new: New member
160 162 label_member_plural: Members
161 163 label_tracker: Tracker
162 164 label_tracker_plural: Trackers
163 165 label_tracker_new: New tracker
164 166 label_workflow: Workflow
165 167 label_issue_status: Issue status
166 168 label_issue_status_plural: Issue statuses
167 169 label_issue_status_new: New status
168 170 label_issue_category: Issue category
169 171 label_issue_category_plural: Issue categories
170 172 label_issue_category_new: New category
171 173 label_custom_field: Custom field
172 174 label_custom_field_plural: Custom fields
173 175 label_custom_field_new: New custom field
174 176 label_enumerations: Enumerations
175 177 label_enumeration_new: New value
176 178 label_information: Information
177 179 label_information_plural: Information
178 180 label_please_login: Please login
179 181 label_register: Register
180 182 label_password_lost: Lost password
181 183 label_home: Home
182 184 label_my_page: My page
183 185 label_my_account: My account
184 186 label_my_projects: My projects
185 187 label_administration: Administration
186 188 label_login: Login
187 189 label_logout: Logout
188 190 label_help: Help
189 191 label_reported_issues: Reported issues
190 192 label_assigned_to_me_issues: Issues assigned to me
191 193 label_last_login: Last connection
192 194 label_last_updates: Last updated
193 195 label_last_updates_plural: %d last updated
194 196 label_registered_on: Registered on
195 197 label_activity: Activity
196 198 label_new: New
197 199 label_logged_as: Logged as
198 200 label_environment: Environment
199 201 label_authentication: Authentication
200 202 label_auth_source: Authentication mode
201 203 label_auth_source_new: New authentication mode
202 204 label_auth_source_plural: Authentication modes
203 205 label_subproject: Subproject
204 206 label_subproject_plural: Subprojects
205 207 label_min_max_length: Min - Max length
206 208 label_list: List
207 209 label_date: Date
208 210 label_integer: Integer
209 211 label_boolean: Boolean
210 212 label_string: Text
211 213 label_text: Long text
212 214 label_attribute: Attribute
213 215 label_attribute_plural: Attributes
214 216 label_download: %d Download
215 217 label_download_plural: %d Downloads
216 218 label_no_data: No data to display
217 219 label_change_status: Change status
218 220 label_history: History
219 221 label_attachment: File
220 222 label_attachment_new: New file
221 223 label_attachment_delete: Delete file
222 224 label_attachment_plural: Files
223 225 label_report: Report
224 226 label_report_plural: Reports
225 227 label_news: News
226 228 label_news_new: Add news
227 229 label_news_plural: News
228 230 label_news_latest: Latest news
229 231 label_news_view_all: View all news
230 232 label_change_log: Change log
231 233 label_settings: Settings
232 234 label_overview: Overview
233 235 label_version: Version
234 236 label_version_new: New version
235 237 label_version_plural: Versions
236 238 label_confirmation: Confirmation
237 239 label_export_to: Export to
238 240 label_read: Read...
239 241 label_public_projects: Public projects
240 242 label_open_issues: Open
241 243 label_open_issues_plural: Open
242 244 label_closed_issues: Closed
243 245 label_closed_issues_plural: Closed
244 246 label_total: Total
245 247 label_permissions: Permissions
246 248 label_current_status: Current status
247 249 label_new_statuses_allowed: New statuses allowed
248 250 label_all: All
249 251 label_none: None
250 252 label_next: Next
251 253 label_previous: Previous
252 254 label_used_by: Used by
253 255 label_details: Details...
254 256 label_add_note: Add a note
255 257 label_per_page: Per page
256 258 label_calendar: Calendar
257 259 label_months_from: months from
258 260 label_gantt: Gantt
259 261 label_internal: Internal
260 262 label_last_changes: last %d changes
261 263 label_change_view_all: View all changes
262 264 label_personalize_page: Personalize this page
263 265 label_comment: Comment
264 266 label_comment_plural: Comments
265 267 label_comment_add: Add a comment
266 268 label_comment_added: Comment added
267 269 label_comment_delete: Delete comments
268 270 label_query: Custom query
269 271 label_query_plural: Custom queries
270 272 label_query_new: New query
271 273 label_filter_add: Add filter
272 274 label_filter_plural: Filters
273 275 label_equals: is
274 276 label_not_equals: is not
275 277 label_in_less_than: in less than
276 278 label_in_more_than: in more than
277 279 label_in: in
278 280 label_today: today
279 281 label_less_than_ago: less than days ago
280 282 label_more_than_ago: more than days ago
281 283 label_ago: days ago
282 284 label_contains: contains
283 285 label_not_contains: doesn't contain
284 286 label_day_plural: days
287 label_repository: SVN Repository
288 label_browse: Browse
289 label_modification: %d change
290 label_modification_plural: %d changes
291 label_revision: Revision
292 label_revision_plural: Revisions
293 label_added: added
294 label_modified: modified
295 label_deleted: deleted
296 label_latest_revision: Latest revision
297 label_view_revisions: View revisions
285 298
286 299 button_login: Login
287 300 button_submit: Submit
288 301 button_save: Save
289 302 button_check_all: Check all
290 303 button_uncheck_all: Uncheck all
291 304 button_delete: Delete
292 305 button_create: Create
293 306 button_test: Test
294 307 button_edit: Edit
295 308 button_add: Add
296 309 button_change: Change
297 310 button_apply: Apply
298 311 button_clear: Clear
299 312 button_lock: Lock
300 313 button_unlock: Unlock
301 314 button_download: Download
302 315 button_list: List
303 316 button_view: View
304 317 button_move: Move
305 318 button_back: Back
306 319 button_cancel: Cancel
307 320
308 321 text_select_mail_notifications: Select actions for which mail notifications should be sent.
309 322 text_regexp_info: eg. ^[A-Z0-9]+$
310 323 text_min_max_length_info: 0 means no restriction
311 324 text_possible_values_info: values separated with |
312 325 text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
313 326 text_workflow_edit: Select a role and a tracker to edit the workflow
314 327 text_are_you_sure: Are you sure ?
315 328 text_journal_changed: changed from %s to %s
316 329 text_journal_set_to: set to %s
317 330 text_journal_deleted: deleted
318 331 text_tip_task_begin_day: task beginning this day
319 332 text_tip_task_end_day: task ending this day
320 333 text_tip_task_begin_end_day: task beginning and ending this day
321 334
322 335 default_role_manager: Manager
323 336 default_role_developper: Developer
324 337 default_role_reporter: Reporter
325 338 default_tracker_bug: Bug
326 339 default_tracker_feature: Feature
327 340 default_tracker_support: Support
328 341 default_issue_status_new: New
329 342 default_issue_status_assigned: Assigned
330 343 default_issue_status_resolved: Resolved
331 344 default_issue_status_feedback: Feedback
332 345 default_issue_status_closed: Closed
333 346 default_issue_status_rejected: Rejected
334 347 default_doc_category_user: User documentation
335 348 default_doc_category_tech: Technical documentation
336 349 default_priority_low: Low
337 350 default_priority_normal: Normal
338 351 default_priority_high: High
339 352 default_priority_urgent: Urgent
340 353 default_priority_immediate: Immediate
341 354
342 355 enumeration_issue_priorities: Issue priorities
343 356 enumeration_doc_categories: Document categories
@@ -1,343 +1,356
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre
5 5 actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: no es una fecha vΓ‘lida
35 35 activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
36 36
37 37 general_fmt_age: %d aΓ±o
38 38 general_fmt_age_plural: %d aΓ±os
39 39 general_fmt_date: %%d/%%m/%%Y
40 40 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
41 41 general_fmt_datetime_short: %%d/%%m %%H:%%M
42 42 general_fmt_time: %%H:%%M
43 43 general_text_No: 'No'
44 44 general_text_Yes: 'SΓ­'
45 45 general_text_no: 'no'
46 46 general_text_yes: 'sΓ­'
47 47 general_lang_es: 'EspaΓ±ol'
48 48 general_csv_separator: ';'
49 49 general_day_names: Lunes,Martes,MiΓ©rcoles,Jueves,Viernes,SΓ‘bado,Domingo
50 50
51 51 notice_account_updated: Account was successfully updated.
52 52 notice_account_invalid_creditentials: Invalid user or password
53 53 notice_account_password_updated: Password was successfully updated.
54 54 notice_account_wrong_password: Wrong password
55 55 notice_account_register_done: Account was successfully created.
56 56 notice_account_unknown_email: Unknown user.
57 57 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
58 58 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
59 59 notice_account_activated: Your account has been activated. You can now log in.
60 60 notice_successful_create: Successful creation.
61 61 notice_successful_update: Successful update.
62 62 notice_successful_delete: Successful deletion.
63 63 notice_successful_connection: Successful connection.
64 64 notice_file_not_found: Requested file doesn't exist or has been deleted.
65 65 notice_locking_conflict: Data have been updated by another user.
66 notice_scm_error: La entrada y/o la revisiΓ³n no existe en el depΓ³sito.
66 67
67 68 mail_subject_lost_password: Tu contraseΓ±a del redMine
68 69 mail_subject_register: ActivaciΓ³n de la cuenta del redMine
69 70
70 71 gui_validation_error: 1 error
71 72 gui_validation_error_plural: %d errores
72 73
73 74 field_name: Nombre
74 75 field_description: DescripciΓ³n
75 76 field_summary: Resumen
76 77 field_is_required: Obligatorio
77 78 field_firstname: Nombre
78 79 field_lastname: Apellido
79 80 field_mail: Email
80 81 field_filename: Fichero
81 82 field_filesize: TamaΓ±o
82 83 field_downloads: Telecargas
83 84 field_author: Autor
84 85 field_created_on: Creado
85 86 field_updated_on: Actualizado
86 87 field_field_format: Formato
87 88 field_is_for_all: Para todos los proyectos
88 89 field_possible_values: Valores posibles
89 90 field_regexp: ExpresiΓ³n regular
90 91 field_min_length: Longitud mΓ­nima
91 92 field_max_length: Longitud mΓ‘xima
92 93 field_value: Valor
93 94 field_category: CategorΓ­a
94 95 field_title: TΓ­tulo
95 96 field_project: Proyecto
96 97 field_issue: PeticiΓ³n
97 98 field_status: Estatuto
98 99 field_notes: Notas
99 100 field_is_closed: PeticiΓ³n resuelta
100 101 field_is_default: Estatuto por defecto
101 102 field_html_color: Color
102 103 field_tracker: Tracker
103 104 field_subject: Tema
104 105 field_due_date: Fecha debida
105 106 field_assigned_to: Asignado a
106 107 field_priority: Prioridad
107 108 field_fixed_version: VersiΓ³n corregida
108 109 field_user: Usuario
109 110 field_role: Papel
110 111 field_homepage: Sitio web
111 112 field_is_public: PΓΊblico
112 113 field_parent: Proyecto secundario de
113 114 field_is_in_chlog: Consultar las peticiones en el histΓ³rico
114 115 field_login: Identificador
115 116 field_mail_notification: NotificaciΓ³n por mail
116 117 field_admin: Administrador
117 118 field_locked: Cerrado
118 119 field_last_login_on: Última conexión
119 120 field_language: Lengua
120 121 field_effective_date: Fecha
121 122 field_password: ContraseΓ±a
122 123 field_new_password: Nueva contraseΓ±a
123 124 field_password_confirmation: ConfirmaciΓ³n
124 125 field_version: VersiΓ³n
125 126 field_type: Tipo
126 127 field_host: AnfitriΓ³n
127 128 field_port: Puerto
128 129 field_account: Cuenta
129 130 field_base_dn: Base DN
130 131 field_attr_login: Cualidad del identificador
131 132 field_attr_firstname: Cualidad del nombre
132 133 field_attr_lastname: Cualidad del apellido
133 134 field_attr_mail: Cualidad del Email
134 135 field_onthefly: CreaciΓ³n del usuario On-the-fly
135 136 field_start_date: Comienzo
136 137 field_done_ratio: %% Realizado
137 138 field_hide_mail: Ocultar mi email address
138 139 field_comment: Comentario
140 field_url: URL
139 141
140 142 label_user: Usuario
141 143 label_user_plural: Usuarios
142 144 label_user_new: Nuevo usuario
143 145 label_project: Proyecto
144 146 label_project_new: Nuevo proyecto
145 147 label_project_plural: Proyectos
146 148 label_project_latest: Los proyectos mΓ‘s ΓΊltimos
147 149 label_issue: PeticiΓ³n
148 150 label_issue_new: Nueva peticiΓ³n
149 151 label_issue_plural: Peticiones
150 152 label_issue_view_all: Ver todas las peticiones
151 153 label_document: Documento
152 154 label_document_new: Nuevo documento
153 155 label_document_plural: Documentos
154 156 label_role: Papel
155 157 label_role_plural: Papeles
156 158 label_role_new: Nuevo papel
157 159 label_role_and_permissions: Papeles y permisos
158 160 label_member: Miembro
159 161 label_member_new: Nuevo miembro
160 162 label_member_plural: Miembros
161 163 label_tracker: Tracker
162 164 label_tracker_plural: Trackers
163 165 label_tracker_new: Nuevo tracker
164 166 label_workflow: Workflow
165 167 label_issue_status: Estatuto de peticiΓ³n
166 168 label_issue_status_plural: Estatutos de las peticiones
167 169 label_issue_status_new: Nuevo estatuto
168 170 label_issue_category: CategorΓ­a de las peticiones
169 171 label_issue_category_plural: CategorΓ­as de las peticiones
170 172 label_issue_category_new: Nueva categorΓ­a
171 173 label_custom_field: Campo personalizado
172 174 label_custom_field_plural: Campos personalizados
173 175 label_custom_field_new: Nuevo campo personalizado
174 176 label_enumerations: Listas de valores
175 177 label_enumeration_new: Nuevo valor
176 178 label_information: Informacion
177 179 label_information_plural: Informaciones
178 180 label_please_login: ConexiΓ³n
179 181 label_register: Registrar
180 182 label_password_lost: ΒΏOlvidaste la contraseΓ±a?
181 183 label_home: Acogida
182 184 label_my_page: Mi pΓ‘gina
183 185 label_my_account: Mi cuenta
184 186 label_my_projects: Mis proyectos
185 187 label_administration: AdministraciΓ³n
186 188 label_login: ConexiΓ³n
187 189 label_logout: DesconexiΓ³n
188 190 label_help: Ayuda
189 191 label_reported_issues: Peticiones registradas
190 192 label_assigned_to_me_issues: Peticiones que me estΓ‘n asignadas
191 193 label_last_login: Última conexión
192 194 label_last_updates: Actualizado
193 195 label_last_updates_plural: %d Actualizados
194 196 label_registered_on: Inscrito el
195 197 label_activity: Actividad
196 198 label_new: Nuevo
197 199 label_logged_as: Conectado como
198 200 label_environment: Environment
199 201 label_authentication: AutentificaciΓ³n
200 202 label_auth_source: Modo de la autentificaciΓ³n
201 203 label_auth_source_new: Nuevo modo de la autentificaciΓ³n
202 204 label_auth_source_plural: Modos de la autentificaciΓ³n
203 205 label_subproject: Proyecto secundario
204 206 label_subproject_plural: Proyectos secundarios
205 207 label_min_max_length: Longitud mΓ­n - mΓ‘x
206 208 label_list: Lista
207 209 label_date: Fecha
208 210 label_integer: NΓΊmero
209 211 label_boolean: Boleano
210 212 label_string: Texto
211 213 label_text: Texto largo
212 214 label_attribute: Cualidad
213 215 label_attribute_plural: Cualidades
214 216 label_download: %d Telecarga
215 217 label_download_plural: %d Telecargas
216 218 label_no_data: Ningunos datos a exhibir
217 219 label_change_status: Cambiar el estatuto
218 220 label_history: HistΓ³rico
219 221 label_attachment: Fichero
220 222 label_attachment_new: Nuevo fichero
221 223 label_attachment_delete: Suprimir el fichero
222 224 label_attachment_plural: Ficheros
223 225 label_report: Informe
224 226 label_report_plural: Informes
225 227 label_news: Noticia
226 228 label_news_new: Nueva noticia
227 229 label_news_plural: Noticias
228 230 label_news_latest: Últimas noticias
229 231 label_news_view_all: Ver todas las noticias
230 232 label_change_log: Cambios
231 233 label_settings: ConfiguraciΓ³n
232 234 label_overview: Vistazo
233 235 label_version: VersiΓ³n
234 236 label_version_new: Nueva versiΓ³n
235 237 label_version_plural: VersiΓ³nes
236 238 label_confirmation: ConfirmaciΓ³n
237 239 label_export_to: Exportar a
238 240 label_read: Leer...
239 241 label_public_projects: Proyectos publicos
240 242 label_open_issues: Abierta
241 243 label_open_issues_plural: Abiertas
242 244 label_closed_issues: Cerrada
243 245 label_closed_issues_plural: Cerradas
244 246 label_total: Total
245 247 label_permissions: Permisos
246 248 label_current_status: Estado actual
247 249 label_new_statuses_allowed: Nuevos estatutos autorizados
248 250 label_all: Todos
249 251 label_none: Ninguno
250 252 label_next: PrΓ³ximo
251 253 label_previous: Precedente
252 254 label_used_by: Utilizado por
253 255 label_details: Detalles...
254 256 label_add_note: Agregar una nota
255 257 label_per_page: Por la pΓ‘gina
256 258 label_calendar: Calendario
257 259 label_months_from: meses de
258 260 label_gantt: Gantt
259 261 label_internal: Interno
260 262 label_last_changes: %d cambios del ΓΊltimo
261 263 label_change_view_all: Ver todos los cambios
262 264 label_personalize_page: Personalizar esta pΓ‘gina
263 265 label_comment: Comentario
264 266 label_comment_plural: Comentarios
265 267 label_comment_add: Agregar un comentario
266 268 label_comment_added: Comentario agregΓ³
267 269 label_comment_delete: Suprimir comentarios
268 270 label_query: Pregunta personalizada
269 271 label_query_plural: Preguntas personalizadas
270 272 label_query_new: Nueva preguntas
271 273 label_filter_add: Agregar el filtro
272 274 label_filter_plural: Filtros
273 275 label_equals: igual
274 276 label_not_equals: no igual
275 277 label_in_less_than: en menos que
276 278 label_in_more_than: en mΓ‘s que
277 279 label_in: en
278 280 label_today: hoy
279 281 label_less_than_ago: hace menos de
280 282 label_more_than_ago: hace mΓ‘s de
281 283 label_ago: hace
282 284 label_contains: contiene
283 285 label_not_contains: no contiene
284 286 label_day_plural: dΓ­as
287 label_repository: DepΓ³sito SVN
288 label_browse: Hojear
289 label_modification: %d modificaciΓ³n
290 label_modification_plural: %d modificaciones
291 label_revision: RevisiΓ³n
292 label_revision_plural: Revisiones
293 label_added: agregado
294 label_modified: modificado
295 label_deleted: suprimido
296 label_latest_revision: La revisiΓ³n mΓ‘s ΓΊltima
297 label_view_revisions: Ver las revisiones
285 298
286 299 button_login: ConexiΓ³n
287 300 button_submit: Someter
288 301 button_save: Validar
289 302 button_check_all: Seleccionar todo
290 303 button_uncheck_all: No seleccionar nada
291 304 button_delete: Suprimir
292 305 button_create: Crear
293 306 button_test: Testar
294 307 button_edit: Modificar
295 308 button_add: AΓ±adir
296 309 button_change: Cambiar
297 310 button_apply: Aplicar
298 311 button_clear: Anular
299 312 button_lock: Bloquear
300 313 button_unlock: Desbloquear
301 314 button_download: Telecargar
302 315 button_list: Listar
303 316 button_view: Ver
304 317 button_move: Mover
305 318 button_back: AtrΓ‘s
306 319 button_cancel: Cancelar
307 320
308 321 text_select_mail_notifications: Seleccionar las actividades que necesitan la activaciΓ³n de la notificaciΓ³n por mail.
309 322 text_regexp_info: eg. ^[A-Z0-9]+$
310 323 text_min_max_length_info: 0 para ninguna restricciΓ³n
311 324 text_possible_values_info: Los valores se separaron con |
312 325 text_project_destroy_confirmation: ΒΏ EstΓ‘s seguro de querer eliminar el proyecto ?
313 326 text_workflow_edit: Seleccionar un workflow para actualizar
314 327 text_are_you_sure: ΒΏ EstΓ‘s seguro ?
315 328 text_journal_changed: cambiado de %s a %s
316 329 text_journal_set_to: fijado a %s
317 330 text_journal_deleted: suprimido
318 331 text_tip_task_begin_day: tarea que comienza este dΓ­a
319 332 text_tip_task_end_day: tarea que termina este dΓ­a
320 333 text_tip_task_begin_end_day: tarea que comienza y termina este dΓ­a
321 334
322 335 default_role_manager: Manager
323 336 default_role_developper: Desarrollador
324 337 default_role_reporter: Informador
325 338 default_tracker_bug: AnomalΓ­a
326 339 default_tracker_feature: EvoluciΓ³n
327 340 default_tracker_support: Asistencia
328 341 default_issue_status_new: Nuevo
329 342 default_issue_status_assigned: Asignada
330 343 default_issue_status_resolved: Resuelta
331 344 default_issue_status_feedback: Comentario
332 345 default_issue_status_closed: Cerrada
333 346 default_issue_status_rejected: Rechazada
334 347 default_doc_category_user: DocumentaciΓ³n del usuario
335 348 default_doc_category_tech: DocumentaciΓ³n tecnica
336 349 default_priority_low: Bajo
337 350 default_priority_normal: Normal
338 351 default_priority_high: Alto
339 352 default_priority_urgent: Urgente
340 353 default_priority_immediate: Ahora
341 354
342 355 enumeration_issue_priorities: Prioridad de las peticiones
343 356 enumeration_doc_categories: CategorΓ­as del documento
@@ -1,344 +1,357
1 1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Janvier,FΓ©vrier,Mars,Avril,Mai,Juin,Juillet,AoΓ»t,Septembre,Octobre,Novembre,DΓ©cembre
5 5 actionview_datehelper_select_month_names_abbr: Jan,FΓ©v,Mars,Avril,Mai,Juin,Juil,AoΓ»t,Sept,Oct,Nov,DΓ©c
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 jour
9 9 actionview_datehelper_time_in_words_day_plural: %d jours
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: 30 secondes
15 15 actionview_datehelper_time_in_words_minute_less_than: moins d'une minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: moins d'une seconde
19 19 actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes
20 20 actionview_instancetag_blank_option: Choisir
21 21
22 22 activerecord_error_inclusion: n'est pas inclus dans la liste
23 23 activerecord_error_exclusion: est reservΓ©
24 24 activerecord_error_invalid: est invalide
25 25 activerecord_error_confirmation: ne correspond pas Γ  la confirmation
26 26 activerecord_error_accepted: doit Γͺtre acceptΓ©
27 27 activerecord_error_empty: doit Γͺtre renseignΓ©
28 28 activerecord_error_blank: doit Γͺtre renseignΓ©
29 29 activerecord_error_too_long: est trop long
30 30 activerecord_error_too_short: est trop court
31 31 activerecord_error_wrong_length: n'est pas de la bonne longueur
32 32 activerecord_error_taken: est dΓ©jΓ  utilisΓ©
33 33 activerecord_error_not_a_number: n'est pas un nombre
34 34 activerecord_error_not_a_date: n'est pas une date valide
35 35 activerecord_error_greater_than_start_date: doit Γͺtre postΓ©rieur Γ  la date de dΓ©but
36 36
37 37 general_fmt_age: %d an
38 38 general_fmt_age_plural: %d ans
39 39 general_fmt_date: %%d/%%m/%%Y
40 40 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
41 41 general_fmt_datetime_short: %%d/%%m %%H:%%M
42 42 general_fmt_time: %%H:%%M
43 43 general_text_No: 'Non'
44 44 general_text_Yes: 'Oui'
45 45 general_text_no: 'non'
46 46 general_text_yes: 'oui'
47 47 general_lang_fr: 'FranΓ§ais'
48 48 general_csv_separator: ';'
49 49 general_day_names: Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche
50 50
51 51 notice_account_updated: Le compte a été mis à jour avec succès.
52 52 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
53 53 notice_account_password_updated: Mot de passe mis à jour avec succès.
54 54 notice_account_wrong_password: Mot de passe incorrect
55 55 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a Γ©tΓ© envoyΓ©.
56 56 notice_account_unknown_email: Aucun compte ne correspond Γ  cette adresse.
57 57 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
58 58 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a Γ©tΓ© envoyΓ©.
59 59 notice_account_activated: Votre compte a Γ©tΓ© activΓ©. Vous pouvez Γ  prΓ©sent vous connecter.
60 60 notice_successful_create: Création effectuée avec succès.
61 61 notice_successful_update: Mise à jour effectuée avec succès.
62 62 notice_successful_delete: Suppression effectuée avec succès.
63 63 notice_successful_connection: Connection rΓ©ussie.
64 64 notice_file_not_found: Le fichier demandΓ© n'existe pas ou a Γ©tΓ© supprimΓ©.
65 65 notice_locking_conflict: Les donnΓ©es ont Γ©tΓ© mises Γ  jour par un autre utilisateur. Mise Γ  jour impossible.
66 notice_scm_error: L'entrΓ©e et/ou la rΓ©vision demandΓ©e n'existe pas dans le dΓ©pΓ΄t.
66 67
67 68 mail_subject_lost_password: Votre mot de passe redMine
68 69 mail_subject_register: Activation de votre compte redMine
69 70
70 71 gui_validation_error: 1 erreur
71 72 gui_validation_error_plural: %d erreurs
72 73
73 74 field_name: Nom
74 75 field_description: Description
75 76 field_summary: RΓ©sumΓ©
76 77 field_is_required: Obligatoire
77 78 field_firstname: PrΓ©nom
78 79 field_lastname: Nom
79 80 field_mail: Email
80 81 field_filename: Fichier
81 82 field_filesize: Taille
82 83 field_downloads: TΓ©lΓ©chargements
83 84 field_author: Auteur
84 85 field_created_on: Créé
85 86 field_updated_on: Mis Γ  jour
86 87 field_field_format: Format
87 88 field_is_for_all: Pour tous les projets
88 89 field_possible_values: Valeurs possibles
89 90 field_regexp: Expression régulière
90 91 field_min_length: Longueur minimum
91 92 field_max_length: Longueur maximum
92 93 field_value: Valeur
93 94 field_category: CatΓ©gorie
94 95 field_title: Titre
95 96 field_project: Projet
96 97 field_issue: Demande
97 98 field_status: Statut
98 99 field_notes: Notes
99 100 field_is_closed: Demande fermΓ©e
100 101 field_is_default: Statut par dΓ©faut
101 102 field_html_color: Couleur
102 103 field_tracker: Tracker
103 104 field_subject: Sujet
104 105 field_due_date: Date d'Γ©chΓ©ance
105 106 field_assigned_to: AssignΓ© Γ 
106 107 field_priority: PrioritΓ©
107 108 field_fixed_version: Version corrigΓ©e
108 109 field_user: Utilisateur
109 110 field_role: RΓ΄le
110 111 field_homepage: Site web
111 112 field_is_public: Public
112 113 field_parent: Sous-projet de
113 114 field_is_in_chlog: Demandes affichΓ©es dans l'historique
114 115 field_login: Identifiant
115 116 field_mail_notification: Notifications par mail
116 117 field_admin: Administrateur
117 118 field_locked: VerrouillΓ©
118 119 field_last_login_on: Dernière connexion
119 120 field_language: Langue
120 121 field_effective_date: Date
121 122 field_password: Mot de passe
122 123 field_new_password: Nouveau mot de passe
123 124 field_password_confirmation: Confirmation
124 125 field_version: Version
125 126 field_type: Type
126 127 field_host: HΓ΄te
127 128 field_port: Port
128 129 field_account: Compte
129 130 field_base_dn: Base DN
130 131 field_attr_login: Attribut Identifiant
131 132 field_attr_firstname: Attribut PrΓ©nom
132 133 field_attr_lastname: Attribut Nom
133 134 field_attr_mail: Attribut Email
134 135 field_onthefly: CrΓ©ation des utilisateurs Γ  la volΓ©e
135 136 field_start_date: DΓ©but
136 137 field_done_ratio: %% RΓ©alisΓ©
137 138 field_auth_source: Mode d'authentification
138 139 field_hide_mail: Cacher mon adresse mail
139 140 field_comment: Commentaire
141 field_url: URL
140 142
141 143 label_user: Utilisateur
142 144 label_user_plural: Utilisateurs
143 145 label_user_new: Nouvel utilisateur
144 146 label_project: Projet
145 147 label_project_new: Nouveau projet
146 148 label_project_plural: Projets
147 149 label_project_latest: Derniers projets
148 150 label_issue: Demande
149 151 label_issue_new: Nouvelle demande
150 152 label_issue_plural: Demandes
151 153 label_issue_view_all: Voir toutes les demandes
152 154 label_document: Document
153 155 label_document_new: Nouveau document
154 156 label_document_plural: Documents
155 157 label_role: RΓ΄le
156 158 label_role_plural: RΓ΄les
157 159 label_role_new: Nouveau rΓ΄le
158 160 label_role_and_permissions: RΓ΄les et permissions
159 161 label_member: Membre
160 162 label_member_new: Nouveau membre
161 163 label_member_plural: Membres
162 164 label_tracker: Tracker
163 165 label_tracker_plural: Trackers
164 166 label_tracker_new: Nouveau tracker
165 167 label_workflow: Workflow
166 168 label_issue_status: Statut de demandes
167 169 label_issue_status_plural: Statuts de demandes
168 170 label_issue_status_new: Nouveau statut
169 171 label_issue_category: CatΓ©gorie de demandes
170 172 label_issue_category_plural: CatΓ©gories de demandes
171 173 label_issue_category_new: Nouvelle catΓ©gorie
172 174 label_custom_field: Champ personnalisΓ©
173 175 label_custom_field_plural: Champs personnalisΓ©s
174 176 label_custom_field_new: Nouveau champ personnalisΓ©
175 177 label_enumerations: Listes de valeurs
176 178 label_enumeration_new: Nouvelle valeur
177 179 label_information: Information
178 180 label_information_plural: Informations
179 181 label_please_login: Identification
180 182 label_register: S'enregistrer
181 183 label_password_lost: Mot de passe perdu
182 184 label_home: Accueil
183 185 label_my_page: Ma page
184 186 label_my_account: Mon compte
185 187 label_my_projects: Mes projets
186 188 label_administration: Administration
187 189 label_login: Connexion
188 190 label_logout: DΓ©connexion
189 191 label_help: Aide
190 192 label_reported_issues: Demandes soumises
191 193 label_assigned_to_me_issues: Demandes qui me sont assignΓ©es
192 194 label_last_login: Dernière connexion
193 195 label_last_updates: Dernière mise à jour
194 196 label_last_updates_plural: %d dernières mises à jour
195 197 label_registered_on: Inscrit le
196 198 label_activity: ActivitΓ©
197 199 label_new: Nouveau
198 200 label_logged_as: ConnectΓ© en tant que
199 201 label_environment: Environnement
200 202 label_authentication: Authentification
201 203 label_auth_source: Mode d'authentification
202 204 label_auth_source_new: Nouveau mode d'authentification
203 205 label_auth_source_plural: Modes d'authentification
204 206 label_subproject: Sous-projet
205 207 label_subproject_plural: Sous-projets
206 208 label_min_max_length: Longueurs mini - maxi
207 209 label_list: Liste
208 210 label_date: Date
209 211 label_integer: Entier
210 212 label_boolean: BoolΓ©en
211 213 label_string: Texte
212 214 label_text: Texte long
213 215 label_attribute: Attribut
214 216 label_attribute_plural: Attributs
215 217 label_download: %d TΓ©lΓ©chargement
216 218 label_download_plural: %d TΓ©lΓ©chargements
217 219 label_no_data: Aucune donnΓ©e Γ  afficher
218 220 label_change_status: Changer le statut
219 221 label_history: Historique
220 222 label_attachment: Fichier
221 223 label_attachment_new: Nouveau fichier
222 224 label_attachment_delete: Supprimer le fichier
223 225 label_attachment_plural: Fichiers
224 226 label_report: Rapport
225 227 label_report_plural: Rapports
226 228 label_news: Annonce
227 229 label_news_new: Nouvelle annonce
228 230 label_news_plural: Annonces
229 231 label_news_latest: Dernières annonces
230 232 label_news_view_all: Voir toutes les annonces
231 233 label_change_log: Historique
232 234 label_settings: Configuration
233 235 label_overview: AperΓ§u
234 236 label_version: Version
235 237 label_version_new: Nouvelle version
236 238 label_version_plural: Versions
237 239 label_confirmation: Confirmation
238 240 label_export_to: Exporter en
239 241 label_read: Lire...
240 242 label_public_projects: Projets publics
241 243 label_open_issues: ouvert
242 244 label_open_issues_plural: ouverts
243 245 label_closed_issues: fermΓ©
244 246 label_closed_issues_plural: fermΓ©s
245 247 label_total: Total
246 248 label_permissions: Permissions
247 249 label_current_status: Statut actuel
248 250 label_new_statuses_allowed: Nouveaux statuts autorisΓ©s
249 251 label_all: tous
250 252 label_none: aucun
251 253 label_next: Suivant
252 254 label_previous: PrΓ©cΓ©dent
253 255 label_used_by: UtilisΓ© par
254 256 label_details: DΓ©tails...
255 257 label_add_note: Ajouter une note
256 258 label_per_page: Par page
257 259 label_calendar: Calendrier
258 260 label_months_from: mois depuis
259 261 label_gantt: Gantt
260 262 label_internal: Interne
261 263 label_last_changes: %d derniers changements
262 264 label_change_view_all: Voir tous les changements
263 265 label_personalize_page: Personnaliser cette page
264 266 label_comment: Commentaire
265 267 label_comment_plural: Commentaires
266 268 label_comment_add: Ajouter un commentaire
267 269 label_comment_added: Commentaire ajoutΓ©
268 270 label_comment_delete: Supprimer les commentaires
269 271 label_query: Rapport personnalisΓ©
270 272 label_query_plural: Rapports personnalisΓ©s
271 273 label_query_new: Nouveau rapport
272 274 label_filter_add: Ajouter le filtre
273 275 label_filter_plural: Filtres
274 276 label_equals: Γ©gal
275 277 label_not_equals: diffΓ©rent
276 278 label_in_less_than: dans moins de
277 279 label_in_more_than: dans plus de
278 280 label_in: dans
279 281 label_today: aujourd'hui
280 282 label_less_than_ago: il y a moins de
281 283 label_more_than_ago: il y a plus de
282 284 label_ago: il y a
283 285 label_contains: contient
284 286 label_not_contains: ne contient pas
285 287 label_day_plural: jours
288 label_repository: DΓ©pΓ΄t SVN
289 label_browse: Parcourir
290 label_modification: %d modification
291 label_modification_plural: %d modifications
292 label_revision: RΓ©vision
293 label_revision_plural: RΓ©visions
294 label_added: ajoutΓ©
295 label_modified: modifiΓ©
296 label_deleted: supprimΓ©
297 label_latest_revision: Dernière révision
298 label_view_revisions: Voir les rΓ©visions
286 299
287 300 button_login: Connexion
288 301 button_submit: Soumettre
289 302 button_save: Sauvegarder
290 303 button_check_all: Tout cocher
291 304 button_uncheck_all: Tout dΓ©cocher
292 305 button_delete: Supprimer
293 306 button_create: CrΓ©er
294 307 button_test: Tester
295 308 button_edit: Modifier
296 309 button_add: Ajouter
297 310 button_change: Changer
298 311 button_apply: Appliquer
299 312 button_clear: Effacer
300 313 button_lock: Verrouiller
301 314 button_unlock: DΓ©verrouiller
302 315 button_download: TΓ©lΓ©charger
303 316 button_list: Lister
304 317 button_view: Voir
305 318 button_move: DΓ©placer
306 319 button_back: Retour
307 320 button_cancel: Annuler
308 321
309 322 text_select_mail_notifications: SΓ©lectionner les actions pour lesquelles la notification par mail doit Γͺtre activΓ©e.
310 323 text_regexp_info: ex. ^[A-Z0-9]+$
311 324 text_min_max_length_info: 0 pour aucune restriction
312 325 text_possible_values_info: valeurs sΓ©parΓ©es par |
313 326 text_project_destroy_confirmation: Etes-vous sΓ»r de vouloir supprimer ce projet et tout ce qui lui est rattachΓ© ?
314 327 text_workflow_edit: SΓ©lectionner un tracker et un rΓ΄le pour Γ©diter le workflow
315 328 text_are_you_sure: Etes-vous sΓ»r ?
316 329 text_journal_changed: changΓ© de %s Γ  %s
317 330 text_journal_set_to: mis Γ  %s
318 331 text_journal_deleted: supprimΓ©
319 332 text_tip_task_begin_day: tΓ’che commenΓ§ant ce jour
320 333 text_tip_task_end_day: tΓ’che finissant ce jour
321 334 text_tip_task_begin_end_day: tΓ’che commenΓ§ant et finissant ce jour
322 335
323 336 default_role_manager: Manager
324 337 default_role_developper: DΓ©veloppeur
325 338 default_role_reporter: Rapporteur
326 339 default_tracker_bug: Anomalie
327 340 default_tracker_feature: Evolution
328 341 default_tracker_support: Assistance
329 342 default_issue_status_new: Nouveau
330 343 default_issue_status_assigned: AssignΓ©
331 344 default_issue_status_resolved: RΓ©solu
332 345 default_issue_status_feedback: Commentaire
333 346 default_issue_status_closed: FermΓ©
334 347 default_issue_status_rejected: RejetΓ©
335 348 default_doc_category_user: Documentation utilisateur
336 349 default_doc_category_tech: Documentation technique
337 350 default_priority_low: Bas
338 351 default_priority_normal: Normal
339 352 default_priority_high: Haut
340 353 default_priority_urgent: Urgent
341 354 default_priority_immediate: ImmΓ©diat
342 355
343 356 enumeration_issue_priorities: PrioritΓ©s des demandes
344 357 enumeration_doc_categories: CatΓ©gories des documents
@@ -1,509 +1,509
1 1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 2 /* Edited by Jean-Philippe Lang *>
3 3 /**************** Body and tag styles ****************/
4 4
5 5
6 6 #header * {margin:0; padding:0;}
7 7 p, ul, ol, li {margin:0; padding:0;}
8 8
9 9
10 10 body{
11 11 font:76% Verdana,Tahoma,Arial,sans-serif;
12 12 line-height:1.4em;
13 13 text-align:center;
14 14 color:#303030;
15 15 background:#e8eaec;
16 16 margin:0;
17 17 }
18 18
19 19
20 20 a{
21 21 color:#467aa7;
22 22 font-weight:bold;
23 23 text-decoration:none;
24 24 background-color:inherit;
25 25 }
26 26
27 27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
28 28 a img{border:none;}
29 29
30 30 p{padding:0 0 1em 0;}
31 31 p form{margin-top:0; margin-bottom:20px;}
32 32
33 33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
34 34 img.left{float:left; margin:0 12px 5px 0;}
35 35 img.center{display:block; margin:0 auto 5px auto;}
36 36 img.right{float:right; margin:0 0 5px 12px;}
37 37
38 38 /**************** Header and navigation styles ****************/
39 39
40 40 #container{
41 41 width:100%;
42 42 min-width: 800px;
43 43 margin:0;
44 44 padding:0;
45 45 text-align:left;
46 46 background:#ffffff;
47 47 color:#303030;
48 48 }
49 49
50 50 #header{
51 51 height:4.5em;
52 52 /*width:758px;*/
53 53 margin:0;
54 54 background:#467aa7;
55 55 color:#ffffff;
56 56 margin-bottom:1px;
57 57 }
58 58
59 59 #header h1{
60 60 padding:10px 0 0 20px;
61 61 font-size:2em;
62 62 background-color:inherit;
63 63 color:#fff; /*rgb(152, 26, 33);*/
64 64 letter-spacing:-1px;
65 65 font-weight:bold;
66 66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
67 67 }
68 68
69 69 #header h2{
70 70 margin:3px 0 0 40px;
71 71 font-size:1.5em;
72 72 background-color:inherit;
73 73 color:#f0f2f4;
74 74 letter-spacing:-1px;
75 75 font-weight:normal;
76 76 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
77 77 }
78 78
79 79 #navigation{
80 80 height:2.2em;
81 81 line-height:2.2em;
82 82 /*width:758px;*/
83 83 margin:0;
84 84 background:#578bb8;
85 85 color:#ffffff;
86 86 }
87 87
88 88 #navigation li{
89 89 float:left;
90 90 list-style-type:none;
91 91 border-right:1px solid #ffffff;
92 92 white-space:nowrap;
93 93 }
94 94
95 95 #navigation li.right {
96 96 float:right;
97 97 list-style-type:none;
98 98 border-right:0;
99 99 border-left:1px solid #ffffff;
100 100 white-space:nowrap;
101 101 }
102 102
103 103 #navigation li a{
104 104 display:block;
105 105 padding:0px 10px 0px 22px;
106 106 font-size:0.8em;
107 107 font-weight:normal;
108 108 /*text-transform:uppercase;*/
109 109 text-decoration:none;
110 110 background-color:inherit;
111 111 color: #ffffff;
112 112 }
113 113
114 114 * html #navigation a {width:1%;}
115 115
116 116 #navigation .selected,#navigation a:hover{
117 117 color:#ffffff;
118 118 text-decoration:none;
119 119 background-color: #80b0da;
120 120 }
121 121
122 122 /**************** Icons links *******************/
123 123 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
124 124 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
125 125 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
126 126 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
127 127 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
128 128 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
129 129 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
130 130
131 131 .picEdit { background: url(../images/edit.png) no-repeat 4px 50%; }
132 132 .picDelete { background: url(../images/delete.png) no-repeat 4px 50%; }
133 133 .picAdd { background: url(../images/add.png) no-repeat 4px 50%; }
134 134 .picMove { background: url(../images/move.png) no-repeat 4px 50%; }
135 135 .picCheck { background: url(../images/check.png) no-repeat 4px 70%; }
136 136 .picPdf { background: url(../images/pdf.png) no-repeat 4px 50%;}
137 137 .picCsv { background: url(../images/csv.png) no-repeat 4px 50%;}
138 138
139 139 .pic { padding-left: 18px; margin-left: 3px; }
140 140 /**************** Content styles ****************/
141 141
142 142 html>body #content {
143 143 height: auto;
144 144 min-height: 500px;
145 145 }
146 146
147 147 #content{
148 148 /*float:right;*/
149 149 /*width:530px;*/
150 150 width: auto;
151 151 height:500px;
152 152 font-size:0.9em;
153 153 padding:20px 10px 10px 20px;
154 154 /*position: absolute;*/
155 155 margin-left: 120px;
156 156 border-left: 1px dashed #c0c0c0;
157 157
158 158 }
159 159
160 160 #content h2{
161 161 display:block;
162 162 margin:0 0 16px 0;
163 163 font-size:1.7em;
164 164 font-weight:normal;
165 165 letter-spacing:-1px;
166 166 color:#606060;
167 167 background-color:inherit;
168 168 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
169 169 }
170 170
171 171 #content h2 a{font-weight:normal;}
172 172 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
173 173 #content a:hover,#subcontent a:hover{text-decoration:underline;}
174 174 #content ul,#content ol{margin:0 5px 16px 35px;}
175 175 #content dl{margin:0 5px 10px 25px;}
176 176 #content dt{font-weight:bold; margin-bottom:5px;}
177 177 #content dd{margin:0 0 10px 15px;}
178 178
179 179
180 180 /***********************************************/
181 181
182 182 /*
183 183 form{
184 184 padding:15px;
185 185 margin:0 0 20px 0;
186 186 border:1px solid #c0c0c0;
187 187 background-color:#CEE1ED;
188 188 width:600px;
189 189 }
190 190 */
191 191
192 192 form {
193 193 display: inline;
194 194 }
195 195
196 196 .noborder {
197 197 border:0px;
198 198 background-color:#fff;
199 199 width:100%;
200 200 }
201 201
202 202 textarea {
203 203 padding:0;
204 204 margin:0;
205 205 }
206 206
207 207 blockquote {
208 208 padding-left: 6px;
209 209 border-left: 2px solid #ccc;
210 210 }
211 211
212 212 input {
213 213 vertical-align: middle;
214 214 }
215 215
216 216 input.button-small
217 217 {
218 218 font-size: 0.8em;
219 219 }
220 220
221 221 select {
222 222 vertical-align: middle;
223 223 }
224 224
225 225 .select-small
226 226 {
227 227 border: 1px solid #7F9DB9;
228 228 padding: 1px;
229 229 font-size: 0.8em;
230 230 }
231 231
232 232 .active-filter
233 233 {
234 234 background-color: #F9FA9E;
235 235
236 236 }
237 237
238 238 label {
239 239 font-weight: bold;
240 240 font-size: 1em;
241 241 }
242 242
243 243 fieldset {
244 244 border:1px solid #7F9DB9;
245 245 padding: 6px;
246 246 }
247 247
248 248 legend {
249 249 color: #505050;
250 250
251 251 }
252 252
253 253 .required {
254 254 color: #bb0000;
255 255 }
256 256
257 257 table.listTableContent {
258 258 border:1px solid #578bb8;
259 259 width:100%;
260 260 border-collapse: collapse;
261 261 }
262 262
263 263 table.listTableContent td {
264 264 padding:2px;
265 265 }
266 266
267 267 tr.ListHead {
268 268 background-color:#467aa7;
269 269 color:#FFFFFF;
270 270 text-align:center;
271 271 }
272 272
273 273 tr.ListHead a {
274 274 color:#FFFFFF;
275 275 text-decoration:underline;
276 276 }
277 277
278 278 .odd {
279 279 background-color:#f0f1f2;
280 280 }
281 281 .even {
282 282 background-color: #fff;
283 283 }
284 284
285 285 table.reportTableContent {
286 286 border:1px solid #c0c0c0;
287 287 width:99%;
288 288 border-collapse: collapse;
289 289 }
290 290
291 291 table.reportTableContent td {
292 292 padding:2px;
293 293 }
294 294
295 295 table.calenderTable {
296 296 border:1px solid #578bb8;
297 297 width:99%;
298 298 border-collapse: collapse;
299 299 }
300 300
301 301 table.calenderTable td {
302 302 border:1px solid #578bb8;
303 303 }
304 304
305 305 hr { border:none; border-bottom: dotted 1px #c0c0c0; }
306 306
307 307
308 308 /**************** Sidebar styles ****************/
309 309
310 310 #subcontent{
311 311 position: absolute;
312 312 left: 0px;
313 313 width:110px;
314 314 padding:20px 20px 10px 5px;
315 315 }
316 316
317 317 #subcontent h2{
318 318 display:block;
319 319 margin:0 0 5px 0;
320 320 font-size:1.0em;
321 321 font-weight:bold;
322 322 text-align:left;
323 323 color:#606060;
324 324 background-color:inherit;
325 325 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
326 326 }
327 327
328 328 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
329 329
330 330 /**************** Menublock styles ****************/
331 331
332 332 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
333 333 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
334 334 .menublock li a{font-weight:bold; text-decoration:none;}
335 335 .menublock li a:hover{text-decoration:none;}
336 336 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
337 337 .menublock li ul li{margin-bottom:0;}
338 338 .menublock li ul a{font-weight:normal;}
339 339
340 340 /**************** Searchbar styles ****************/
341 341
342 342 #searchbar{margin:0 0 20px 0;}
343 343 #searchbar form fieldset{margin-left:10px; border:0 solid;}
344 344
345 345 #searchbar #s{
346 346 height:1.2em;
347 347 width:110px;
348 348 margin:0 5px 0 0;
349 349 border:1px solid #a0a0a0;
350 350 }
351 351
352 352 #searchbar #searchbutton{
353 353 width:auto;
354 354 padding:0 1px;
355 355 border:1px solid #808080;
356 356 font-size:0.9em;
357 357 text-align:center;
358 358 }
359 359
360 360 /**************** Footer styles ****************/
361 361
362 362 #footer{
363 363 clear:both;
364 364 /*width:758px;*/
365 365 padding:5px 0;
366 366 margin:0;
367 367 font-size:0.9em;
368 368 color:#f0f0f0;
369 369 background:#467aa7;
370 370 }
371 371
372 372 #footer p{padding:0; margin:0; text-align:center;}
373 373 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
374 374 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
375 375
376 376 /**************** Misc classes and styles ****************/
377 377
378 378 .splitcontentleft{float:left; width:49%;}
379 379 .splitcontentright{float:right; width:49%;}
380 380 .clear{clear:both;}
381 381 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
382 382 .hide{display:none;}
383 383 .textcenter{text-align:center;}
384 384 .textright{text-align:right;}
385 385 .important{color:#f02025; background-color:inherit; font-weight:bold;}
386 386
387 387 .box{
388 388 margin:0 0 20px 0;
389 389 padding:10px;
390 390 border:1px solid #c0c0c0;
391 391 background-color:#fafbfc;
392 392 color:#505050;
393 393 line-height:1.5em;
394 394 }
395 395
396 396 a.close-icon {
397 397 display:block;
398 398 margin-top:3px;
399 399 overflow:hidden;
400 400 width:12px;
401 401 height:12px;
402 402 background-repeat: no-repeat;
403 403 cursor:hand;
404 404 cursor:pointer;
405 405 background-image:url('../images/close.png');
406 406 }
407 407
408 408 a.close-icon:hover {
409 409 background-image:url('../images/close_hl.png');
410 410 }
411 411
412 412 .rightbox{
413 413 background: #fafbfc;
414 414 border: 1px solid #c0c0c0;
415 415 float: right;
416 416 padding: 8px;
417 417 position: relative;
418 418 margin: 0 5px 5px;
419 419 }
420 420
421 421 .layout-active {
422 422 background: #ECF3E1;
423 423 }
424 424
425 425 .block-receiver {
426 426 border:1px dashed #c0c0c0;
427 427 margin-bottom: 20px;
428 428 padding: 15px 0 15px 0;
429 429 }
430 430
431 431 .mypage-box {
432 432 margin:0 0 20px 0;
433 433 color:#505050;
434 434 line-height:1.5em;
435 435 }
436 436
437 437 .handle {
438 438 cursor: move;
439 439 }
440 440
441 441 .topright{
442 442 position: absolute;
443 443 right: 25px;
444 444 top: 100px;
445 445 }
446 446
447 447 .login {
448 448 width: 50%;
449 449 text-align: left;
450 450 }
451 451
452 452 img.calendar-trigger {
453 453 cursor: pointer;
454 454 vertical-align: middle;
455 455 margin-left: 4px;
456 456 }
457 457
458 458 #history h4, #comments h4 {
459 459 font-size: 1em;
460 460 margin-bottom: 12px;
461 461 margin-top: 20px;
462 462 font-weight: normal;
463 463 border-bottom: dotted 1px #c0c0c0;
464 464 }
465 465
466 466 #history p {
467 467 margin-left: 34px;
468 468 }
469 469
470 470 /***** Contextual links div *****/
471 471 .contextual {
472 472 float: right;
473 473 font-size: 0.8em;
474 474 }
475 475
476 .contextual select {
476 .contextual select, .contextual input {
477 477 font-size: 1em;
478 478 }
479 479
480 480
481 481 /***** CSS FORM ******/
482 482 .tabular p{
483 483 margin: 0;
484 484 padding: 5px 0 8px 0;
485 485 padding-left: 180px; /*width of left column containing the label elements*/
486 486 height: 1%;
487 487 }
488 488
489 489 .tabular label{
490 490 font-weight: bold;
491 491 float: left;
492 492 margin-left: -180px; /*width of left column*/
493 493 width: 175px; /*width of labels. Should be smaller than left column to create some right
494 494 margin*/
495 495 }
496 496
497 497 .error {
498 498 color: #cc0000;
499 499 }
500 500
501 501
502 502 /*.threepxfix class below:
503 503 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
504 504 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
505 505 */
506 506
507 507 * html .threepxfix{
508 508 margin-left: 3px;
509 509 } No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now