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