##// END OF EJS Templates
- new controller "myController"...
Jean-Philippe Lang -
r60:362633d486e3
parent child
Show More
@@ -0,0 +1,128
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 MyController < ApplicationController
19 layout 'base'
20 before_filter :require_login
21
22 BLOCKS = { 'issues_assigned_to_me' => :label_assigned_to_me_issues,
23 'issues_reported_by_me' => :label_reported_issues,
24 'latest_news' => :label_news_latest,
25 'calendar' => :label_calendar,
26 'documents' => :label_document_plural
27 }.freeze
28
29 verify :xhr => true,
30 :session => :page_layout,
31 :only => [:add_block, :remove_block, :order_blocks]
32
33 def index
34 page
35 render :action => 'page'
36 end
37
38 # Show user's page
39 def page
40 @user = self.logged_in_user
41 @blocks = @user.pref[:my_page_layout] || { 'left' => ['issues_assigned_to_me'], 'right' => ['issues_reported_by_me'] }
42 end
43
44 # Edit user's account
45 def account
46 @user = self.logged_in_user
47 if request.post? and @user.update_attributes(@params[:user])
48 set_localization
49 flash.now[:notice] = l(:notice_account_updated)
50 self.logged_in_user.reload
51 end
52 end
53
54 # Change user's password
55 def change_password
56 @user = self.logged_in_user
57 flash[:notice] = l(:notice_can_t_change_password) and redirect_to :action => 'account' and return if @user.auth_source_id
58 if @user.check_password?(@params[:password])
59 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
60 if @user.save
61 flash[:notice] = l(:notice_account_password_updated)
62 else
63 render :action => 'account'
64 return
65 end
66 else
67 flash[:notice] = l(:notice_account_wrong_password)
68 end
69 redirect_to :action => 'account'
70 end
71
72 # User's page layout configuration
73 def page_layout
74 @user = self.logged_in_user
75 @blocks = @user.pref[:my_page_layout] || { 'left' => ['issues_assigned_to_me'], 'right' => ['issues_reported_by_me'] }
76 session[:page_layout] = @blocks
77 %w(top left right).each {|f| session[:page_layout][f] ||= [] }
78 @block_options = []
79 BLOCKS.each {|k, v| @block_options << [l(v), k]}
80 end
81
82 # Add a block to user's page
83 # The block is added on top of the page
84 # params[:block] : id of the block to add
85 def add_block
86 @user = self.logged_in_user
87 block = params[:block]
88 # remove if already present in a group
89 %w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block }
90 # add it on top
91 session[:page_layout]['top'].unshift block
92 render :partial => "block", :locals => {:user => @user, :block_name => block}
93 end
94
95 # Remove a block to user's page
96 # params[:block] : id of the block to remove
97 def remove_block
98 block = params[:block]
99 # remove block in all groups
100 %w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block }
101 render :nothing => true
102 end
103
104 # Change blocks order on user's page
105 # params[:group] : group to order (top, left or right)
106 # params[:list-(top|left|right)] : array of block ids of the group
107 def order_blocks
108 group = params[:group]
109 group_items = params["list-#{group}"]
110 if group_items and group_items.is_a? Array
111 # remove group blocks if they are presents in other groups
112 %w(top left right).each {|f|
113 session[:page_layout][f] = (session[:page_layout][f] || []) - group_items
114 }
115 session[:page_layout][group] = group_items
116 end
117 render :nothing => true
118 end
119
120 # Save user's page layout
121 def page_layout_save
122 @user = self.logged_in_user
123 @user.pref[:my_page_layout] = session[:page_layout] if session[:page_layout]
124 @user.pref.save
125 session[:page_layout] = nil
126 redirect_to :action => 'page'
127 end
128 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 MyHelper
19 end
@@ -0,0 +1,44
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 UserPreference < ActiveRecord::Base
19 belongs_to :user
20 serialize :others, Hash
21
22 attr_protected :others
23
24 def initialize(attributes = nil)
25 super
26 self.others ||= {}
27 end
28
29 def [](attr_name)
30 if attribute_present? attr_name
31 super
32 else
33 others[attr_name]
34 end
35 end
36
37 def []=(attr_name, value)
38 if attribute_present? attr_name
39 super
40 else
41 others.store attr_name, value
42 end
43 end
44 end
@@ -0,0 +1,16
1 <div id="block_<%= block_name %>" class="mypage-box">
2
3 <div style="float:right;margin-right:16px;z-index:500;">
4 <%= link_to_remote "", {
5 :url => { :action => "remove_block", :block => block_name },
6 :complete => "removeBlock('block_#{block_name}')",
7 :loading => "Element.show('indicator')",
8 :loaded => "Element.hide('indicator')" },
9 :class => "close-icon"
10 %>
11 </div>
12
13 <div class="handle">
14 <%= render :partial => "my/blocks/#{block_name}", :locals => { :user => user } %>
15 </div>
16 </div> No newline at end of file
@@ -0,0 +1,45
1 <h3><%= l(:label_calendar) %></h3>
2
3 <%
4 @date_from = Date.today - (Date.today.cwday-1)
5 @date_to = Date.today + (7-Date.today.cwday)
6 @issues = Issue.find :all,
7 :conditions => ["issues.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", @date_from, @date_to, @date_from, @date_to],
8 :include => [:project, :tracker] unless @user.projects.empty?
9 @issues ||= []
10 %>
11
12 <table class="calenderTable">
13 <tr class="ListHead">
14 <td></td>
15 <% 1.upto(7) do |d| %>
16 <td align="center" width="14%"><%= day_name(d) %></td>
17 <% end %>
18 </tr>
19 <tr height="100">
20 <% day = @date_from
21 while day <= @date_to
22 if day.cwday == 1 %>
23 <td valign="middle"><%= day.cweek %></td>
24 <% end %>
25 <td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>">
26 <p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p>
27 <% day_issues = []
28 @issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day }
29 day_issues.each do |i| %>
30 <%= if day == i.start_date and day == i.due_date
31 image_tag('arrow_bw')
32 elsif day == i.start_date
33 image_tag('arrow_from')
34 elsif day == i.due_date
35 image_tag('arrow_to')
36 end %>
37 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>: <%= i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br />
38 <% end %>
39 </td>
40 <%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %>
41 <%
42 day = day + 1
43 end %>
44 </tr>
45 </table> No newline at end of file
@@ -0,0 +1,15
1 <h3><%=l(:label_document_plural)%></h3>
2
3 <ul>
4 <% for document in Document.find :all,
5 :limit => 10,
6 :conditions => "documents.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
7 :include => [:project] %>
8 <li>
9 <b><%= link_to document.title, :controller => 'documents', :action => 'show', :id => document %></b>
10 <br />
11 <%= truncate document.description, 150 %><br />
12 <em><%= format_time(document.created_on) %></em><br />&nbsp;
13 </li>
14 <% end unless @user.projects.empty? %>
15 </ul> No newline at end of file
@@ -0,0 +1,10
1 <h3><%=l(:label_assigned_to_me_issues)%></h3>
2 <% assigned_issues = Issue.find(:all,
3 :conditions => ["assigned_to_id=?", user.id],
4 :limit => 10,
5 :include => [ :status, :project, :tracker ],
6 :order => 'issues.updated_on DESC') %>
7 <%= render :partial => 'issues/list_simple', :locals => { :issues => assigned_issues } %>
8 <% if assigned_issues.length > 0 %>
9 <p><%=lwr(:label_last_updates, assigned_issues.length)%></p>
10 <% end %>
@@ -0,0 +1,10
1 <h3><%=l(:label_reported_issues)%></h3>
2 <% reported_issues = Issue.find(:all,
3 :conditions => ["author_id=?", user.id],
4 :limit => 10,
5 :include => [ :status, :project, :tracker ],
6 :order => 'issues.updated_on DESC') %>
7 <%= render :partial => 'issues/list_simple', :locals => { :issues => reported_issues } %>
8 <% if reported_issues.length > 0 %>
9 <p><%=lwr(:label_last_updates, reported_issues.length)%></p>
10 <% end %> No newline at end of file
@@ -0,0 +1,13
1 <h3><%=l(:label_news_latest)%></h3>
2
3 <ul>
4 <% for news in News.find :all,
5 :limit => 10,
6 :conditions => "news.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
7 :include => [:project, :author] %>
8 <li><%= link_to news.title, :controller => 'news', :action => 'show', :id => news %><br />
9 <% unless news.summary.empty? %><%= news.summary %><br /><% end %>
10 <em><%= news.author.name %>, <%= format_time(news.created_on) %></em><br />&nbsp;
11 </li>
12 <% end unless @user.projects.empty? %>
13 </ul> No newline at end of file
@@ -0,0 +1,30
1 <h2><%=l(:label_my_page)%></h2>
2
3 <div class="topright">
4 <small><%= link_to l(:label_personalize_page), :action => 'page_layout' %></small>
5 </div>
6
7 <div id="list-top">
8 <% @blocks['top'].each do |b| %>
9 <div class="mypage-box">
10 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
11 </div>
12 <% end if @blocks['top'] %>
13 </div>
14
15 <div id="list-left" class="splitcontentleft">
16 <% @blocks['left'].each do |b| %>
17 <div class="mypage-box">
18 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
19 </div>
20 <% end if @blocks['left'] %>
21 </div>
22
23 <div id="list-right" class="splitcontentright">
24 <% @blocks['right'].each do |b| %>
25 <div class="mypage-box">
26 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
27 </div>
28 <% end if @blocks['right'] %>
29 </div>
30
@@ -0,0 +1,121
1 <script language="JavaScript">
2
3 function recreateSortables() {
4 Sortable.destroy('list-top');
5 Sortable.destroy('list-left');
6 Sortable.destroy('list-right');
7
8 Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=top', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-top",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'})
9 Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=left', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-left",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'})
10 Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=right', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-right",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'})
11 }
12
13 function updateSelect() {
14 s = $('block-select')
15 for (var i = 0; i < s.options.length; i++) {
16 if ($('block_' + s.options[i].value)) {
17 s.options[i].disabled = true;
18 } else {
19 s.options[i].disabled = false;
20 }
21 }
22 s.options[0].selected = true;
23 }
24
25 function afterAddBlock() {
26 recreateSortables();
27 updateSelect();
28 }
29
30 function removeBlock(block) {
31 $(block).parentNode.removeChild($(block));
32 updateSelect();
33 }
34
35 </script>
36
37 <div style="float:right;">
38 <%= start_form_tag({:action => "add_block"}, :id => "block-form") %>
39
40 <%= select_tag 'block', "<option></option>" + options_for_select(@block_options), :id => "block-select", :class => "select-small" %>
41 <small>
42 <%= link_to_remote l(:button_add),
43 :url => { :action => "add_block" },
44 :with => "Form.serialize('block-form')",
45 :update => "list-top",
46 :position => :top,
47 :complete => "afterAddBlock();",
48 :loading => "Element.show('indicator')",
49 :loaded => "Element.hide('indicator')"
50 %>
51 </small>
52 <%= end_form_tag %>
53 <small>|
54 <%= link_to l(:button_save), :action => 'page_layout_save' %> |
55 <%= link_to l(:button_cancel), :action => 'page' %>
56 </small>
57 </div>
58
59 <div style="float:right;margin-right:20px;">
60 <span id="indicator" style="display:none"><%= image_tag "loading.gif" %></span>
61 </div>
62
63 <h2><%=l(:label_my_page)%></h2>
64
65 <div id="list-top" class="block-receiver">
66 <% @blocks['top'].each do |b| %>
67 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
68 <% end if @blocks['top'] %>
69 </div>
70
71 <div id="list-left" class="splitcontentleft block-receiver">
72 <% @blocks['left'].each do |b| %>
73 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
74 <% end if @blocks['left'] %>
75 </div>
76
77 <div id="list-right" class="splitcontentright block-receiver">
78 <% @blocks['right'].each do |b| %>
79 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
80 <% end if @blocks['right'] %>
81 </div>
82
83 <%= sortable_element 'list-top',
84 :tag => 'div',
85 :only => 'mypage-box',
86 :handle => "handle",
87 :dropOnEmpty => true,
88 :containment => ['list-top', 'list-left', 'list-right'],
89 :constraint => false,
90 :complete => visual_effect(:highlight, 'list-top'),
91 :url => { :action => "order_blocks", :group => "top" },
92 :loading => "Element.show('indicator')",
93 :loaded => "Element.hide('indicator')"
94 %>
95
96
97 <%= sortable_element 'list-left',
98 :tag => 'div',
99 :only => 'mypage-box',
100 :handle => "handle",
101 :dropOnEmpty => true,
102 :containment => ['list-top', 'list-left', 'list-right'],
103 :constraint => false,
104 :complete => visual_effect(:highlight, 'list-left'),
105 :url => { :action => "order_blocks", :group => "left" },
106 :loading => "Element.show('indicator')",
107 :loaded => "Element.hide('indicator')" %>
108
109 <%= sortable_element 'list-right',
110 :tag => 'div',
111 :only => 'mypage-box',
112 :handle => "handle",
113 :dropOnEmpty => true,
114 :containment => ['list-top', 'list-left', 'list-right'],
115 :constraint => false,
116 :complete => visual_effect(:highlight, 'list-right'),
117 :url => { :action => "order_blocks", :group => "right" },
118 :loading => "Element.show('indicator')",
119 :loaded => "Element.hide('indicator')" %>
120
121 <%= javascript_tag "updateSelect()" %> No newline at end of file
@@ -0,0 +1,12
1 class CreateUserPreferences < ActiveRecord::Migration
2 def self.up
3 create_table :user_preferences do |t|
4 t.column "user_id", :integer, :default => 0, :null => false
5 t.column "others", :text
6 end
7 end
8
9 def self.down
10 drop_table :user_preferences
11 end
12 end
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,5
1 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 first:
3 id: 1
4 another:
5 id: 2
@@ -0,0 +1,18
1 require File.dirname(__FILE__) + '/../test_helper'
2 require 'my_controller'
3
4 # Re-raise errors caught by the controller.
5 class MyController; def rescue_action(e) raise e end; end
6
7 class MyControllerTest < Test::Unit::TestCase
8 def setup
9 @controller = MyController.new
10 @request = ActionController::TestRequest.new
11 @response = ActionController::TestResponse.new
12 end
13
14 # Replace this with your real tests.
15 def test_truth
16 assert true
17 end
18 end
@@ -0,0 +1,10
1 require File.dirname(__FILE__) + '/../test_helper'
2
3 class UserPreferenceTest < Test::Unit::TestCase
4 fixtures :user_preferences
5
6 # Replace this with your real tests.
7 def test_truth
8 assert true
9 end
10 end
@@ -1,166 +1,131
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class AccountController < ApplicationController
19 19 layout 'base'
20 20 helper :custom_fields
21 21 include CustomFieldsHelper
22 22
23 23 # prevents login action to be filtered by check_if_login_required application scope filter
24 24 skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register]
25 25 before_filter :require_login, :except => [:show, :login, :lost_password, :register]
26 26
27 27 # Show user's account
28 28 def show
29 29 @user = User.find(params[:id])
30 30 @custom_values = @user.custom_values.find(:all, :include => :custom_field)
31 31 end
32 32
33 33 # Login request and validation
34 34 def login
35 35 if request.get?
36 36 # Logout user
37 37 self.logged_in_user = nil
38 38 else
39 39 # Authenticate user
40 40 user = User.try_to_login(params[:login], params[:password])
41 41 if user
42 42 self.logged_in_user = user
43 redirect_back_or_default :controller => 'account', :action => 'my_page'
43 redirect_back_or_default :controller => 'my', :action => 'page'
44 44 else
45 45 flash.now[:notice] = l(:notice_account_invalid_creditentials)
46 46 end
47 47 end
48 48 end
49 49
50 50 # Log out current user and redirect to welcome page
51 51 def logout
52 52 self.logged_in_user = nil
53 53 redirect_to :controller => ''
54 54 end
55
56 # Show logged in user's page
57 def my_page
58 @user = self.logged_in_user
59 @reported_issues = Issue.find(:all, :conditions => ["author_id=?", @user.id], :limit => 10, :include => [ :status, :project, :tracker ], :order => 'issues.updated_on DESC')
60 @assigned_issues = Issue.find(:all, :conditions => ["assigned_to_id=?", @user.id], :limit => 10, :include => [ :status, :project, :tracker ], :order => 'issues.updated_on DESC')
61 end
62
63 # Edit logged in user's account
64 def my_account
65 @user = self.logged_in_user
66 if request.post? and @user.update_attributes(@params[:user])
67 set_localization
68 flash.now[:notice] = l(:notice_account_updated)
69 self.logged_in_user.reload
70 end
71 end
72
73 # Change logged in user's password
74 def change_password
75 @user = self.logged_in_user
76 flash[:notice] = l(:notice_can_t_change_password) and redirect_to :action => 'my_account' and return if @user.auth_source_id
77 if @user.check_password?(@params[:password])
78 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
79 if @user.save
80 flash[:notice] = l(:notice_account_password_updated)
81 else
82 render :action => 'my_account'
83 return
84 end
85 else
86 flash[:notice] = l(:notice_account_wrong_password)
87 end
88 redirect_to :action => 'my_account'
89 end
90 55
91 56 # Enable user to choose a new password
92 57 def lost_password
93 58 if params[:token]
94 59 @token = Token.find_by_action_and_value("recovery", params[:token])
95 60 redirect_to :controller => '' and return unless @token and !@token.expired?
96 61 @user = @token.user
97 62 if request.post?
98 63 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
99 64 if @user.save
100 65 @token.destroy
101 66 flash[:notice] = l(:notice_account_password_updated)
102 67 redirect_to :action => 'login'
103 68 return
104 69 end
105 70 end
106 71 render :template => "account/password_recovery"
107 72 return
108 73 else
109 74 if request.post?
110 75 user = User.find_by_mail(params[:mail])
111 76 # user not found in db
112 77 flash.now[:notice] = l(:notice_account_unknown_email) and return unless user
113 78 # user uses an external authentification
114 79 flash.now[:notice] = l(:notice_can_t_change_password) and return if user.auth_source_id
115 80 # create a new token for password recovery
116 81 token = Token.new(:user => user, :action => "recovery")
117 82 if token.save
118 83 # send token to user via email
119 84 Mailer.set_language_if_valid(user.language)
120 85 Mailer.deliver_lost_password(token)
121 86 flash[:notice] = l(:notice_account_lost_email_sent)
122 87 redirect_to :action => 'login'
123 88 return
124 89 end
125 90 end
126 91 end
127 92 end
128 93
129 94 # User self-registration
130 95 def register
131 96 redirect_to :controller => '' and return if $RDM_SELF_REGISTRATION == false
132 97 if params[:token]
133 98 token = Token.find_by_action_and_value("register", params[:token])
134 99 redirect_to :controller => '' and return unless token and !token.expired?
135 100 user = token.user
136 101 redirect_to :controller => '' and return unless user.status == User::STATUS_REGISTERED
137 102 user.status = User::STATUS_ACTIVE
138 103 if user.save
139 104 token.destroy
140 105 flash[:notice] = l(:notice_account_activated)
141 106 redirect_to :action => 'login'
142 107 return
143 108 end
144 109 else
145 110 if request.get?
146 111 @user = User.new(:language => $RDM_DEFAULT_LANG)
147 112 @custom_values = UserCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @user) }
148 113 else
149 114 @user = User.new(params[:user])
150 115 @user.admin = false
151 116 @user.login = params[:user][:login]
152 117 @user.status = User::STATUS_REGISTERED
153 118 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
154 119 @custom_values = UserCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @user, :value => params["custom_fields"][x.id.to_s]) }
155 120 @user.custom_values = @custom_values
156 121 token = Token.new(:user => @user, :action => "register")
157 122 if @user.save and token.save
158 123 Mailer.set_language_if_valid(@user.language)
159 124 Mailer.deliver_register(token)
160 125 flash[:notice] = l(:notice_account_register_done)
161 126 redirect_to :controller => ''
162 127 end
163 128 end
164 129 end
165 130 end
166 131 end
@@ -1,123 +1,129
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require "digest/sha1"
19 19
20 20 class User < ActiveRecord::Base
21 21 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true
22 has_many :projects, :through => :memberships
22 23 has_many :custom_values, :dependent => true, :as => :customized
24 has_one :preference, :dependent => true, :class_name => 'UserPreference'
23 25 belongs_to :auth_source
24 26
25 27 attr_accessor :password, :password_confirmation
26 28 attr_accessor :last_before_login_on
27 29 # Prevents unauthorized assignments
28 30 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
29 31
30 32 validates_presence_of :login, :firstname, :lastname, :mail
31 33 validates_uniqueness_of :login, :mail
32 34 # Login must contain lettres, numbers, underscores only
33 35 validates_format_of :login, :with => /^[a-z0-9_]+$/i
34 36 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
35 37 # Password length between 4 and 12
36 38 validates_length_of :password, :in => 4..12, :allow_nil => true
37 39 validates_confirmation_of :password, :allow_nil => true
38 40 validates_associated :custom_values, :on => :update
39 41
40 42 # Account statuses
41 43 STATUS_ACTIVE = 1
42 44 STATUS_REGISTERED = 2
43 45 STATUS_LOCKED = 3
44 46
45 47 def before_save
46 48 # update hashed_password if password was set
47 49 self.hashed_password = User.hash_password(self.password) if self.password
48 50 end
49 51
50 52 # Returns the user that matches provided login and password, or nil
51 53 def self.try_to_login(login, password)
52 54 user = find(:first, :conditions => ["login=?", login])
53 55 if user
54 56 # user is already in local database
55 57 return nil if !user.active?
56 58 if user.auth_source
57 59 # user has an external authentication method
58 60 return nil unless user.auth_source.authenticate(login, password)
59 61 else
60 62 # authentication with local password
61 63 return nil unless User.hash_password(password) == user.hashed_password
62 64 end
63 65 else
64 66 # user is not yet registered, try to authenticate with available sources
65 67 attrs = AuthSource.authenticate(login, password)
66 68 if attrs
67 69 onthefly = new(*attrs)
68 70 onthefly.login = login
69 71 onthefly.language = $RDM_DEFAULT_LANG
70 72 if onthefly.save
71 73 user = find(:first, :conditions => ["login=?", login])
72 74 logger.info("User '#{user.login}' created on the fly.") if logger
73 75 end
74 76 end
75 77 end
76 78 user.update_attribute(:last_login_on, Time.now) if user
77 79 user
78 80
79 81 rescue => text
80 82 raise text
81 83 end
82 84
83 85 # Return user's full name for display
84 86 def display_name
85 87 firstname + " " + lastname
86 88 end
87 89
88 90 def name
89 91 display_name
90 92 end
91 93
92 94 def active?
93 95 self.status == STATUS_ACTIVE
94 96 end
95 97
96 98 def registered?
97 99 self.status == STATUS_REGISTERED
98 100 end
99 101
100 102 def locked?
101 103 self.status == STATUS_LOCKED
102 104 end
103 105
104 106 def check_password?(clear_password)
105 107 User.hash_password(clear_password) == self.hashed_password
106 108 end
107 109
108 110 def role_for_project(project_id)
109 111 @role_for_projects ||=
110 112 begin
111 113 roles = {}
112 114 self.memberships.each { |m| roles.store m.project_id, m.role_id }
113 115 roles
114 116 end
115 117 @role_for_projects[project_id]
116 118 end
119
120 def pref
121 self.preference ||= UserPreference.new(:user => self)
122 end
117 123
118 124 private
119 125 # Return password digest
120 126 def self.hash_password(clear_password)
121 127 Digest::SHA1.hexdigest(clear_password || "")
122 128 end
123 129 end
@@ -1,142 +1,142
1 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
3 3 <head>
4 4 <title><%= $RDM_HEADER_TITLE + (@html_title ? ": #{@html_title}" : "") %></title>
5 5 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6 6 <meta name="description" content="redMine" />
7 7 <meta name="keywords" content="issue,bug,tracker" />
8 8 <%= stylesheet_link_tag "application" %>
9 9 <%= stylesheet_link_tag "menu" %>
10 10 <%= stylesheet_link_tag "rails" %>
11 11 <%= javascript_include_tag :defaults %>
12 12 <%= javascript_include_tag 'menu' %>
13 13 <%= javascript_include_tag 'calendar/calendar' %>
14 14 <%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
15 15 <%= javascript_include_tag 'calendar/calendar-setup' %>
16 16 <%= stylesheet_link_tag 'calendar' %>
17 17 <%= stylesheet_link_tag 'jstoolbar' %>
18 18 <script type='text/javascript'>
19 19 var menu_contenu=' \
20 20 <div id="menuAdmin" class="menu" onmouseover="menuMouseover(event)"> \
21 21 <a class="menuItem" href="\/admin\/projects" onmouseover="menuItemMouseover(event,\'menuProjects\');"><span class="menuItemText"><%=l(:label_project_plural)%><\/span><span class="menuItemArrow">&#9654;<\/span><\/a> \
22 22 <a class="menuItem" href="\/users" onmouseover="menuItemMouseover(event,\'menuUsers\');"><span class="menuItemText"><%=l(:label_user_plural)%><\/span><span class="menuItemArrow">&#9654;<\/span><\/a> \
23 23 <a class="menuItem" href="\/roles"><%=l(:label_role_and_permissions)%><\/a> \
24 24 <a class="menuItem" href="\/trackers" onmouseover="menuItemMouseover(event,\'menuTrackers\');"><span class="menuItemText"><%=l(:label_tracker_plural)%><\/span><span class="menuItemArrow">&#9654;<\/span><\/a> \
25 25 <a class="menuItem" href="\/custom_fields"><%=l(:label_custom_field_plural)%><\/a> \
26 26 <a class="menuItem" href="\/enumerations"><%=l(:label_enumerations)%><\/a> \
27 27 <a class="menuItem" href="\/admin\/mail_options"><%=l(:field_mail_notification)%><\/a> \
28 28 <a class="menuItem" href="\/auth_sources"><%=l(:label_authentication)%><\/a> \
29 29 <a class="menuItem" href="\/admin\/info"><%=l(:label_information_plural)%><\/a> \
30 30 <\/div> \
31 31 <div id="menuTrackers" class="menu"> \
32 32 <a class="menuItem" href="\/issue_statuses"><%=l(:label_issue_status_plural)%><\/a> \
33 33 <a class="menuItem" href="\/roles\/workflow"><%=l(:label_workflow)%><\/a> \
34 34 <\/div> \
35 35 <div id="menuProjects" class="menu"><a class="menuItem" href="\/projects\/add"><%=l(:label_new)%><\/a><\/div> \
36 36 <div id="menuUsers" class="menu"><a class="menuItem" href="\/users\/add"><%=l(:label_new)%><\/a><\/div> \
37 37 \
38 38 <% unless @project.nil? || @project.id.nil? %> \
39 39 <div id="menuProject" class="menu" onmouseover="menuMouseover(event)"> \
40 40 <%= link_to l(:label_calendar), {:controller => 'projects', :action => 'calendar', :id => @project }, :class => "menuItem" %> \
41 41 <%= link_to l(:label_issue_plural), {:controller => 'projects', :action => 'list_issues', :id => @project }, :class => "menuItem" %> \
42 42 <%= link_to l(:label_report_plural), {:controller => 'reports', :action => 'issue_report', :id => @project }, :class => "menuItem" %> \
43 43 <%= link_to l(:label_activity), {:controller => 'projects', :action => 'activity', :id => @project }, :class => "menuItem" %> \
44 44 <%= link_to l(:label_news_plural), {:controller => 'projects', :action => 'list_news', :id => @project }, :class => "menuItem" %> \
45 45 <%= link_to l(:label_change_log), {:controller => 'projects', :action => 'changelog', :id => @project }, :class => "menuItem" %> \
46 46 <%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %> \
47 47 <%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %> \
48 48 <%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %> \
49 49 <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project }, :class => "menuItem" %> \
50 50 <\/div> \
51 51 <% end %> \
52 52 ';
53 53 </script>
54 54
55 55 </head>
56 56
57 57 <body>
58 58 <div id="container" >
59 59
60 60 <div id="header">
61 61 <div style="float: left;">
62 62 <h1><%= $RDM_HEADER_TITLE %></h1>
63 63 <h2><%= $RDM_HEADER_SUBTITLE %></h2>
64 64 </div>
65 65 <div style="float: right; padding-right: 1em; padding-top: 0.2em;">
66 66 <% if loggedin? %><small><%=l(:label_logged_as)%> <b><%= @logged_in_user.login %></b></small><% end %>
67 67 </div>
68 68 </div>
69 69
70 70 <div id="navigation">
71 71 <ul>
72 72 <li class="selected"><%= link_to l(:label_home), { :controller => '' }, :class => "picHome" %></li>
73 <li><%= link_to l(:label_my_page), { :controller => 'account', :action => 'my_page'}, :class => "picUserPage" %></li>
73 <li><%= link_to l(:label_my_page), { :controller => 'my', :action => 'page'}, :class => "picUserPage" %></li>
74 74 <li><%= link_to l(:label_project_plural), { :controller => 'projects' }, :class => "picProject" %></li>
75 75
76 76 <% unless @project.nil? || @project.id.nil? %>
77 77 <li><%= link_to @project.name, { :controller => 'projects', :action => 'show', :id => @project }, :class => "picProject", :onmouseover => "buttonMouseover(event, 'menuProject');" %></li>
78 78 <% end %>
79 79
80 80 <% if loggedin? %>
81 <li><%= link_to l(:label_my_account), { :controller => 'account', :action => 'my_account' }, :class => "picUser" %></li>
81 <li><%= link_to l(:label_my_account), { :controller => 'my', :action => 'account' }, :class => "picUser" %></li>
82 82 <% end %>
83 83
84 84 <% if admin_loggedin? %>
85 85 <li><%= link_to l(:label_administration), { :controller => 'admin' }, :class => "picAdmin", :onmouseover => "buttonMouseover(event, 'menuAdmin');" %></li>
86 86 <% end %>
87 87
88 88 <li class="right"><%= link_to l(:label_help), { :controller => 'help', :ctrl => @params[:controller], :page => @params[:action] }, :target => "new", :class => "picHelp" %></li>
89 89
90 90 <% if loggedin? %>
91 91 <li class="right"><%= link_to l(:label_logout), { :controller => 'account', :action => 'logout' }, :class => "picUser" %></li>
92 92 <% else %>
93 93 <li class="right"><%= link_to l(:label_login), { :controller => 'account', :action => 'login' }, :class => "picUser" %></li>
94 94 <% end %>
95 95 </ul>
96 96 </div>
97 97 <script type='text/javascript'>if(document.getElementById) {document.write(menu_contenu);}</script>
98 98
99 99 <div id="subcontent">
100 100
101 101 <% unless @project.nil? || @project.id.nil? %>
102 102 <h2><%= @project.name %></h2>
103 103 <ul class="menublock">
104 104 <li><%= link_to l(:label_overview), :controller => 'projects', :action => 'show', :id => @project %></li>
105 105 <li><%= link_to l(:label_calendar), :controller => 'projects', :action => 'calendar', :id => @project %></li>
106 106 <li><%= link_to l(:label_issue_plural), :controller => 'projects', :action => 'list_issues', :id => @project %></li>
107 107 <li><%= link_to l(:label_report_plural), :controller => 'reports', :action => 'issue_report', :id => @project %></li>
108 108 <li><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => @project %></li>
109 109 <li><%= link_to l(:label_news_plural), :controller => 'projects', :action => 'list_news', :id => @project %></li>
110 110 <li><%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %></li>
111 111 <li><%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %></li>
112 112 <li><%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %></li>
113 113 <li><%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %></li>
114 114 <li><%= link_to_if_authorized l(:label_settings), :controller => 'projects', :action => 'settings', :id => @project %></li>
115 115 </ul>
116 116 <% end %>
117 117
118 118 <% if loggedin? and @logged_in_user.memberships.length > 0 %>
119 119 <h2><%=l(:label_my_projects) %></h2>
120 120 <ul class="menublock">
121 121 <% for membership in @logged_in_user.memberships %>
122 122 <li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %></li>
123 123 <% end %>
124 124 </ul>
125 125 <% end %>
126 126 </div>
127 127
128 128 <div id="content">
129 129 <% if flash[:notice] %><p style="color: green"><%= flash[:notice] %></p><% end %>
130 130 <%= @content_for_layout %>
131 131 </div>
132 132
133 133 <div id="footer">
134 134 <p>
135 135 <%= auto_link $RDM_FOOTER_SIG %> |
136 136 <a href="http://redmine.rubyforge.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %>
137 137 </p>
138 138 </div>
139 139
140 140 </div>
141 141 </body>
142 142 </html> No newline at end of file
@@ -1,54 +1,54
1 1 <h2><%=l(:label_my_account)%></h2>
2 2
3 3 <p><%=l(:field_login)%>: <strong><%= @user.login %></strong><br />
4 4 <%=l(:field_created_on)%>: <%= format_time(@user.created_on) %>,
5 5 <%=l(:field_updated_on)%>: <%= format_time(@user.updated_on) %></p>
6 6
7 7 <%= error_messages_for 'user' %>
8 8
9 9 <div class="box">
10 10 <h3><%=l(:label_information_plural)%></h3>
11 11
12 <%= start_form_tag({:action => 'my_account'}, :class => "tabular") %>
12 <%= start_form_tag({:action => 'account'}, :class => "tabular") %>
13 13
14 14 <!--[form:user]-->
15 15 <p><label for="user_firstname"><%=l(:field_firstname)%> <span class="required">*</span></label>
16 16 <%= text_field 'user', 'firstname' %></p>
17 17
18 18 <p><label for="user_lastname"><%=l(:field_lastname)%> <span class="required">*</span></label>
19 19 <%= text_field 'user', 'lastname' %></p>
20 20
21 21 <p><label for="user_mail"><%=l(:field_mail)%> <span class="required">*</span></label>
22 22 <%= text_field 'user', 'mail', :size => 40 %></p>
23 23
24 24 <p><label for="user_language"><%=l(:field_language)%></label>
25 25 <%= select("user", "language", lang_options_for_select) %></p>
26 26 <!--[eoform:user]-->
27 27
28 28 <p><label for="user_mail_notification"><%=l(:field_mail_notification)%></label>
29 29 <%= check_box 'user', 'mail_notification' %></p>
30 30
31 31 <center><%= submit_tag l(:button_save) %></center>
32 32 <%= end_form_tag %>
33 33 </div>
34 34
35 35
36 36 <% unless @user.auth_source_id %>
37 37 <div class="box">
38 38 <h3><%=l(:field_password)%></h3>
39 39
40 40 <%= start_form_tag({:action => 'change_password'}, :class => "tabular") %>
41 41
42 42 <p><label for="password"><%=l(:field_password)%> <span class="required">*</span></label>
43 43 <%= password_field_tag 'password', nil, :size => 25 %></p>
44 44
45 45 <p><label for="new_password"><%=l(:field_new_password)%> <span class="required">*</span></label>
46 46 <%= password_field_tag 'new_password', nil, :size => 25 %></p>
47 47
48 48 <p><label for="new_password_confirmation"><%=l(:field_password_confirmation)%> <span class="required">*</span></label>
49 49 <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %></p>
50 50
51 51 <center><%= submit_tag l(:button_save) %></center>
52 52 <%= end_form_tag %>
53 53 </div>
54 54 <% end %>
@@ -1,95 +1,96
1 1 == redMine changelog
2 2
3 3 redMine - project management software
4 4 Copyright (C) 2006 Jean-Philippe Lang
5 5 http://redmine.org/
6 6
7 7
8 8 == xx/xx/2006 v0.x.x
9 9
10 * "my page" is now customizable
10 11 * improved issues change history
11 12 * new functionality: move an issue to another project or tracker
12 13 * new functionality: add a note to an issue
13 14 * new report: project activity
14 15 * "start date" and "% done" fields added on issues
15 16 * project calendar added
16 17 * gantt chart added (exportable to pdf)
17 18 * single/multiple issues pdf export added
18 19 * issues reports improvements
19 20 * multiple file upload for issues attachments
20 21 * textile formating of issue and news descritions (RedCloth required)
21 22 * integration of DotClear jstoolbar for textile formatting
22 23 * calendar date picker for date fields (LGPL DHTML Calendar http://sourceforge.net/projects/jscalendar)
23 24 * new filter in issues list: Author
24 25 * ajaxified paginators
25 26 * option to set number of results per page on issues list
26 27 * localized csv separator (comma/semicolon)
27 28 * csv output encoded to ISO-8859-1
28 29 * user custom field displayed on account/show
29 30 * default configuration improved (default roles, trackers, status, permissions and workflows)
30 31 * fixed: custom fields not in csv exports
31 32 * fixed: project settings now displayed according to user's permissions
32 33
33 34 == 10/08/2006 v0.3.0
34 35
35 36 * user authentication against multiple LDAP (optional)
36 37 * token based "lost password" functionality
37 38 * user self-registration functionality (optional)
38 39 * custom fields now available for issues, users and projects
39 40 * new custom field format "text" (displayed as a textarea field)
40 41 * project & administration drop down menus in navigation bar for quicker access
41 42 * text formatting is preserved for long text fields (issues, projects and news descriptions)
42 43 * urls and emails are turned into clickable links in long text fields
43 44 * "due date" field added on issues
44 45 * tracker selection filter added on change log
45 46 * Localization plugin replaced with GLoc 1.1.0 (iconv required)
46 47 * error messages internationalization
47 48 * german translation added (thanks to Karim Trott)
48 49 * data locking for issues to prevent update conflicts (using ActiveRecord builtin optimistic locking)
49 50 * new filter in issues list: "Fixed version"
50 51 * active filters are displayed with colored background on issues list
51 52 * custom configuration is now defined in config/config_custom.rb
52 53 * user object no more stored in session (only user_id)
53 54 * news summary field is no longer required
54 55 * tables and forms redesign
55 56 * Fixed: boolean custom field not working
56 57 * Fixed: error messages for custom fields are not displayed
57 58 * Fixed: invalid custom fields should have a red border
58 59 * Fixed: custom fields values are not validated on issue update
59 60 * Fixed: unable to choose an empty value for 'List' custom fields
60 61 * Fixed: no issue categories sorting
61 62 * Fixed: incorrect versions sorting
62 63
63 64
64 65 == 07/12/2006 - v0.2.2
65 66
66 67 * Fixed: bug in "issues list"
67 68
68 69
69 70 == 07/09/2006 - v0.2.1
70 71
71 72 * new databases supported: Oracle, PostgreSQL, SQL Server
72 73 * projects/subprojects hierarchy (1 level of subprojects only)
73 74 * environment information display in admin/info
74 75 * more filter options in issues list (rev6)
75 76 * default language based on browser settings (Accept-Language HTTP header)
76 77 * issues list exportable to CSV (rev6)
77 78 * simple_format and auto_link on long text fields
78 79 * more data validations
79 80 * Fixed: error when all mail notifications are unchecked in admin/mail_options
80 81 * Fixed: all project news are displayed on project summary
81 82 * Fixed: Can't change user password in users/edit
82 83 * Fixed: Error on tables creation with PostgreSQL (rev5)
83 84 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
84 85
85 86
86 87 == 06/25/2006 - v0.1.0
87 88
88 89 * multiple users/multiple projects
89 90 * role based access control
90 91 * issue tracking system
91 92 * fully customizable workflow
92 93 * documents/files repository
93 94 * email notifications on issue creation and update
94 95 * multilanguage support (except for error messages):english, french, spanish
95 96 * online manual in french (unfinished) No newline at end of file
@@ -1,317 +1,319
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Bitte auserwählt
21 21
22 22 activerecord_error_inclusion: ist nicht in der Liste eingeschlossen
23 23 activerecord_error_exclusion: ist reserviert
24 24 activerecord_error_invalid: ist unzulässig
25 25 activerecord_error_confirmation: bringt nicht Bestätigung zusammen
26 26 activerecord_error_accepted: muß angenommen werden
27 27 activerecord_error_empty: kann nicht leer sein
28 28 activerecord_error_blank: kann nicht leer sein
29 29 activerecord_error_too_long: ist zu lang
30 30 activerecord_error_too_short: ist zu kurz
31 31 activerecord_error_wrong_length: ist die falsche Länge
32 32 activerecord_error_taken: ist bereits genommen worden
33 33 activerecord_error_not_a_number: ist nicht eine Zahl
34 34 activerecord_error_not_a_date: ist nicht ein gültiges Datum
35 35 activerecord_error_greater_than_start_date: muß als grösser sein beginnen Datum
36 36
37 37 general_fmt_age: %d yr
38 38 general_fmt_age_plural: %d yrs
39 39 general_fmt_date: %%b %%d, %%Y (%%a)
40 40 general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p
41 41 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
42 42 general_fmt_time: %%I:%%M %%p
43 43 general_text_No: 'Nein'
44 44 general_text_Yes: 'Ja'
45 45 general_text_no: 'nein'
46 46 general_text_yes: 'ja'
47 47 general_lang_de: 'Deutsch'
48 48 general_csv_separator: ';'
49 49 general_day_names: Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag
50 50
51 51 notice_account_updated: Konto wurde erfolgreich aktualisiert.
52 52 notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort
53 53 notice_account_password_updated: Passwort wurde erfolgreich aktualisiert.
54 54 notice_account_wrong_password: Falsches Passwort
55 55 notice_account_register_done: Konto wurde erfolgreich verursacht.
56 56 notice_account_unknown_email: Unbekannter Benutzer.
57 57 notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern.
58 58 notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden.
59 59 notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen.
60 60 notice_successful_create: Erfolgreiche Kreation.
61 61 notice_successful_update: Erfolgreiches Update.
62 62 notice_successful_delete: Erfolgreiche Auslassung.
63 63 notice_successful_connection: Erfolgreicher Anschluß.
64 64 notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden.
65 65 notice_locking_conflict: Data have been updated by another user.
66 66
67 67 mail_subject_lost_password: Dein redMine Kennwort
68 68 mail_subject_register: redMine Kontoaktivierung
69 69
70 70 gui_validation_error: 1 Störung
71 71 gui_validation_error_plural: %d Störungen
72 72
73 73 field_name: Name
74 74 field_description: Beschreibung
75 75 field_summary: Zusammenfassung
76 76 field_is_required: Erforderlich
77 77 field_firstname: Vorname
78 78 field_lastname: Nachname
79 79 field_mail: Email
80 80 field_filename: Datei
81 81 field_filesize: Grootte
82 82 field_downloads: Downloads
83 83 field_author: Autor
84 84 field_created_on: Angelegt
85 85 field_updated_on: aktualisiert
86 86 field_field_format: Format
87 87 field_is_for_all: Für alle Projekte
88 88 field_possible_values: Mögliche Werte
89 89 field_regexp: Regulärer Ausdruck
90 90 field_min_length: Minimale Länge
91 91 field_max_length: Maximale Länge
92 92 field_value: Wert
93 93 field_category: Kategorie
94 94 field_title: Títel
95 95 field_project: Projekt
96 96 field_issue: Antrag
97 97 field_status: Status
98 98 field_notes: Anmerkungen
99 99 field_is_closed: Problem erledigt
100 100 field_is_default: Rückstellung status
101 101 field_html_color: Farbe
102 102 field_tracker: Tracker
103 103 field_subject: Thema
104 104 field_due_date: Abgabedatum
105 105 field_assigned_to: Zugewiesen an
106 106 field_priority: Priorität
107 107 field_fixed_version: Erledigt in Version
108 108 field_user: Benutzer
109 109 field_role: Rolle
110 110 field_homepage: Startseite
111 111 field_is_public: Öffentlich
112 112 field_parent: Subprojekt von
113 113 field_is_in_chlog: Ansicht der Issues in der Historie
114 114 field_login: Mitgliedsname
115 115 field_mail_notification: Mailbenachrichtigung
116 116 field_admin: Administrator
117 117 field_locked: Gesperrt
118 118 field_last_login_on: Letzte Anmeldung
119 119 field_language: Sprache
120 120 field_effective_date: Datum
121 121 field_password: Passwort
122 122 field_new_password: Neues Passwort
123 123 field_password_confirmation: Bestätigung
124 124 field_version: Version
125 125 field_type: Typ
126 126 field_host: Host
127 127 field_port: Port
128 128 field_account: Konto
129 129 field_base_dn: Base DN
130 130 field_attr_login: Mitgliedsnameattribut
131 131 field_attr_firstname: Vornamensattribut
132 132 field_attr_lastname: Namenattribut
133 133 field_attr_mail: Emailattribut
134 134 field_onthefly: On-the-fly Benutzerkreation
135 135 field_start_date: Beginn
136 136 field_done_ratio: %% Getan
137 137
138 138 label_user: Benutzer
139 139 label_user_plural: Benutzer
140 140 label_user_new: Neuer Benutzer
141 141 label_project: Projekt
142 142 label_project_new: Neues Projekt
143 143 label_project_plural: Projekte
144 144 label_project_latest: Neueste Projekte
145 145 label_issue: Antrag
146 146 label_issue_new: Neue Antrag
147 147 label_issue_plural: Anträge
148 148 label_issue_view_all: Alle Anträge ansehen
149 149 label_document: Dokument
150 150 label_document_new: Neues Dokument
151 151 label_document_plural: Dokumente
152 152 label_role: Rolle
153 153 label_role_plural: Rollen
154 154 label_role_new: Neue Rolle
155 155 label_role_and_permissions: Rollen und Rechte
156 156 label_member: Mitglied
157 157 label_member_new: Neues Mitglied
158 158 label_member_plural: Mitglieder
159 159 label_tracker: Tracker
160 160 label_tracker_plural: Tracker
161 161 label_tracker_new: Neuer Tracker
162 162 label_workflow: Workflow
163 163 label_issue_status: Antrag Status
164 164 label_issue_status_plural: Antrag Stati
165 165 label_issue_status_new: Neuer Status
166 166 label_issue_category: Antrag Kategorie
167 167 label_issue_category_plural: Antrag Kategorien
168 168 label_issue_category_new: Neue Kategorie
169 169 label_custom_field: Benutzerdefiniertes Feld
170 170 label_custom_field_plural: Benutzerdefinierte Felder
171 171 label_custom_field_new: Neues Feld
172 172 label_enumerations: Enumerationen
173 173 label_enumeration_new: Neuer Wert
174 174 label_information: Information
175 175 label_information_plural: Informationen
176 176 label_please_login: Anmelden
177 177 label_register: Anmelden
178 178 label_password_lost: Passwort vergessen
179 179 label_home: Hauptseite
180 180 label_my_page: Meine Seite
181 181 label_my_account: Mein Konto
182 182 label_my_projects: Meine Projekte
183 183 label_administration: Administration
184 184 label_login: Einloggen
185 185 label_logout: Abmelden
186 186 label_help: Hilfe
187 187 label_reported_issues: Gemeldete Issues
188 188 label_assigned_to_me_issues: Mir zugewiesen
189 189 label_last_login: Letzte Anmeldung
190 190 label_last_updates: Letztes aktualisiertes
191 191 label_last_updates_plural: %d Letztes aktualisiertes
192 192 label_registered_on: Angemeldet am
193 193 label_activity: Aktivität
194 194 label_new: Neue
195 195 label_logged_as: Angemeldet als
196 196 label_environment: Environment
197 197 label_authentication: Authentisierung
198 198 label_auth_source: Authentisierung Modus
199 199 label_auth_source_new: Neuer Authentisierung Modus
200 200 label_auth_source_plural: Authentisierung Modi
201 201 label_subproject: Vorprojekt von
202 202 label_subproject_plural: Vorprojekte
203 203 label_min_max_length: Min - Max Länge
204 204 label_list: Liste
205 205 label_date: Date
206 206 label_integer: Zahl
207 207 label_boolean: Boolesch
208 208 label_string: Text
209 209 label_text: Langer Text
210 210 label_attribute: Attribut
211 211 label_attribute_plural: Attribute
212 212 label_download: %d Herunterlade
213 213 label_download_plural: %d Herunterlade
214 214 label_no_data: Nichts anzuzeigen
215 215 label_change_status: Statuswechsel
216 216 label_history: Historie
217 217 label_attachment: Datei
218 218 label_attachment_new: Neue Datei
219 219 label_attachment_delete: Löschungakten
220 220 label_attachment_plural: Dateien
221 221 label_report: Bericht
222 222 label_report_plural: Berichte
223 223 label_news: Neuigkeit
224 224 label_news_new: Neuigkeite addieren
225 225 label_news_plural: Neuigkeiten
226 226 label_news_latest: Letzte Neuigkeiten
227 227 label_news_view_all: Alle Neuigkeiten anzeigen
228 228 label_change_log: Change log
229 229 label_settings: Konfiguration
230 230 label_overview: Übersicht
231 231 label_version: Version
232 232 label_version_new: Neue Version
233 233 label_version_plural: Versionen
234 234 label_confirmation: Bestätigung
235 235 label_export_to: Export zu
236 236 label_read: Lesen...
237 237 label_public_projects: Öffentliche Projekte
238 238 label_open_issues: Geöffnet
239 239 label_open_issues_plural: Geöffnet
240 240 label_closed_issues: Geschlossen
241 241 label_closed_issues_plural: Geschlossen
242 242 label_total: Gesamtzahl
243 243 label_permissions: Berechtigungen
244 244 label_current_status: Gegenwärtiger Status
245 245 label_new_statuses_allowed: Neue Status gewährten
246 246 label_all: Alle
247 247 label_none: Kein
248 248 label_next: Weiter
249 249 label_previous: Zurück
250 250 label_used_by: Benutzt von
251 251 label_details: Details...
252 252 label_add_note: Eine Anmerkung addieren
253 253 label_per_page: Pro Seite
254 254 label_calendar: Kalender
255 255 label_months_from: Monate von
256 256 label_gantt_chart: Gantt Diagramm
257 257 label_internal: Intern
258 258 label_last_changes: %d änderungen des Letzten
259 259 label_change_view_all: Alle änderungen ansehen
260 label_personalize_page: Diese Seite personifizieren
260 261
261 262 button_login: Einloggen
262 263 button_submit: Einreichen
263 264 button_save: Speichern
264 265 button_check_all: Alles auswählen
265 266 button_uncheck_all: Alles abwählen
266 267 button_delete: Löschen
267 268 button_create: Anlegen
268 269 button_test: Testen
269 270 button_edit: Bearbeiten
270 271 button_add: Hinzufügen
271 272 button_change: Wechseln
272 273 button_apply: Anwenden
273 274 button_clear: Zurücksetzen
274 275 button_lock: Verriegeln
275 276 button_unlock: Entriegeln
276 277 button_download: Fernzuladen
277 278 button_list: Aufzulisten
278 279 button_view: Siehe
279 280 button_move: Bewegen
280 281 button_back: Rückkehr
282 button_cancel: Annullieren
281 283
282 284 text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll.
283 285 text_regexp_info: eg. ^[A-Z0-9]+$
284 286 text_min_max_length_info: 0 heisst keine Beschränkung
285 287 text_possible_values_info: Werte trennten sich mit |
286 288 text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ?
287 289 text_workflow_edit: Auswahl Workflow zum Bearbeiten
288 290 text_are_you_sure: Sind sie sicher ?
289 291 text_journal_changed: geändert von %s zu %s
290 292 text_journal_set_to: gestellt zu %s
291 293 text_journal_deleted: gelöscht
292 294 text_tip_task_begin_day: Aufgabe, die an diesem Tag beginnt
293 295 text_tip_task_end_day: Aufgabe, die an diesem Tag beendet
294 296 text_tip_task_begin_end_day: Aufgabe, die an diesem Tag beginnt und beendet
295 297
296 298 default_role_manager: Manager
297 299 default_role_developper: Developer
298 300 default_role_reporter: Reporter
299 301 default_tracker_bug: Fehler
300 302 default_tracker_feature: Feature
301 303 default_tracker_support: Support
302 304 default_issue_status_new: Neu
303 305 default_issue_status_assigned: Zugewiesen
304 306 default_issue_status_resolved: Gelöst
305 307 default_issue_status_feedback: Feedback
306 308 default_issue_status_closed: Erledigt
307 309 default_issue_status_rejected: Abgewiesen
308 310 default_doc_category_user: Benutzerdokumentation
309 311 default_doc_category_tech: Technische Dokumentation
310 312 default_priority_low: Niedrig
311 313 default_priority_normal: Normal
312 314 default_priority_high: Hoch
313 315 default_priority_urgent: Dringend
314 316 default_priority_immediate: Sofort
315 317
316 318 enumeration_issue_priorities: Issue-Prioritäten
317 319 enumeration_doc_categories: Dokumentenkategorien
@@ -1,317 +1,319
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: is not a valid date
35 35 activerecord_error_greater_than_start_date: must be greater than start date
36 36
37 37 general_fmt_age: %d yr
38 38 general_fmt_age_plural: %d yrs
39 39 general_fmt_date: %%m/%%d/%%Y
40 40 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
41 41 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
42 42 general_fmt_time: %%I:%%M %%p
43 43 general_text_No: 'No'
44 44 general_text_Yes: 'Yes'
45 45 general_text_no: 'no'
46 46 general_text_yes: 'yes'
47 47 general_lang_en: 'English'
48 48 general_csv_separator: ','
49 49 general_day_names: Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
50 50
51 51 notice_account_updated: Account was successfully updated.
52 52 notice_account_invalid_creditentials: Invalid user or password
53 53 notice_account_password_updated: Password was successfully updated.
54 54 notice_account_wrong_password: Wrong password
55 55 notice_account_register_done: Account was successfully created.
56 56 notice_account_unknown_email: Unknown user.
57 57 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
58 58 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
59 59 notice_account_activated: Your account has been activated. You can now log in.
60 60 notice_successful_create: Successful creation.
61 61 notice_successful_update: Successful update.
62 62 notice_successful_delete: Successful deletion.
63 63 notice_successful_connection: Successful connection.
64 64 notice_file_not_found: Requested file doesn't exist or has been deleted.
65 65 notice_locking_conflict: Data have been updated by another user.
66 66
67 67 mail_subject_lost_password: Your redMine password
68 68 mail_subject_register: redMine account activation
69 69
70 70 gui_validation_error: 1 error
71 71 gui_validation_error_plural: %d errors
72 72
73 73 field_name: Name
74 74 field_description: Description
75 75 field_summary: Summary
76 76 field_is_required: Required
77 77 field_firstname: Firstname
78 78 field_lastname: Lastname
79 79 field_mail: Email
80 80 field_filename: File
81 81 field_filesize: Size
82 82 field_downloads: Downloads
83 83 field_author: Author
84 84 field_created_on: Created
85 85 field_updated_on: Updated
86 86 field_field_format: Format
87 87 field_is_for_all: For all projects
88 88 field_possible_values: Possible values
89 89 field_regexp: Regular expression
90 90 field_min_length: Minimum length
91 91 field_max_length: Maximum length
92 92 field_value: Value
93 93 field_category: Category
94 94 field_title: Title
95 95 field_project: Project
96 96 field_issue: Issue
97 97 field_status: Status
98 98 field_notes: Notes
99 99 field_is_closed: Issue closed
100 100 field_is_default: Default status
101 101 field_html_color: Color
102 102 field_tracker: Tracker
103 103 field_subject: Subject
104 104 field_due_date: Due date
105 105 field_assigned_to: Assigned to
106 106 field_priority: Priority
107 107 field_fixed_version: Fixed version
108 108 field_user: User
109 109 field_role: Role
110 110 field_homepage: Homepage
111 111 field_is_public: Public
112 112 field_parent: Subproject of
113 113 field_is_in_chlog: Issues displayed in changelog
114 114 field_login: Login
115 115 field_mail_notification: Mail notifications
116 116 field_admin: Administrator
117 117 field_locked: Locked
118 118 field_last_login_on: Last connection
119 119 field_language: Language
120 120 field_effective_date: Date
121 121 field_password: Password
122 122 field_new_password: New password
123 123 field_password_confirmation: Confirmation
124 124 field_version: Version
125 125 field_type: Type
126 126 field_host: Host
127 127 field_port: Port
128 128 field_account: Account
129 129 field_base_dn: Base DN
130 130 field_attr_login: Login attribute
131 131 field_attr_firstname: Firstname attribute
132 132 field_attr_lastname: Lastname attribute
133 133 field_attr_mail: Email attribute
134 134 field_onthefly: On-the-fly user creation
135 135 field_start_date: Start
136 136 field_done_ratio: %% Done
137 137
138 138 label_user: User
139 139 label_user_plural: Users
140 140 label_user_new: New user
141 141 label_project: Project
142 142 label_project_new: New project
143 143 label_project_plural: Projects
144 144 label_project_latest: Latest projects
145 145 label_issue: Issue
146 146 label_issue_new: New issue
147 147 label_issue_plural: Issues
148 148 label_issue_view_all: View all issues
149 149 label_document: Document
150 150 label_document_new: New document
151 151 label_document_plural: Documents
152 152 label_role: Role
153 153 label_role_plural: Roles
154 154 label_role_new: New role
155 155 label_role_and_permissions: Roles and permissions
156 156 label_member: Member
157 157 label_member_new: New member
158 158 label_member_plural: Members
159 159 label_tracker: Tracker
160 160 label_tracker_plural: Trackers
161 161 label_tracker_new: New tracker
162 162 label_workflow: Workflow
163 163 label_issue_status: Issue status
164 164 label_issue_status_plural: Issue statuses
165 165 label_issue_status_new: New status
166 166 label_issue_category: Issue category
167 167 label_issue_category_plural: Issue categories
168 168 label_issue_category_new: New category
169 169 label_custom_field: Custom field
170 170 label_custom_field_plural: Custom fields
171 171 label_custom_field_new: New custom field
172 172 label_enumerations: Enumerations
173 173 label_enumeration_new: New value
174 174 label_information: Information
175 175 label_information_plural: Information
176 176 label_please_login: Please login
177 177 label_register: Register
178 178 label_password_lost: Lost password
179 179 label_home: Home
180 180 label_my_page: My page
181 181 label_my_account: My account
182 182 label_my_projects: My projects
183 183 label_administration: Administration
184 184 label_login: Login
185 185 label_logout: Logout
186 186 label_help: Help
187 187 label_reported_issues: Reported issues
188 188 label_assigned_to_me_issues: Issues assigned to me
189 189 label_last_login: Last connection
190 190 label_last_updates: Last updated
191 191 label_last_updates_plural: %d last updated
192 192 label_registered_on: Registered on
193 193 label_activity: Activity
194 194 label_new: New
195 195 label_logged_as: Logged as
196 196 label_environment: Environment
197 197 label_authentication: Authentication
198 198 label_auth_source: Authentication mode
199 199 label_auth_source_new: New authentication mode
200 200 label_auth_source_plural: Authentication modes
201 201 label_subproject: Subproject
202 202 label_subproject_plural: Subprojects
203 203 label_min_max_length: Min - Max length
204 204 label_list: List
205 205 label_date: Date
206 206 label_integer: Integer
207 207 label_boolean: Boolean
208 208 label_string: Text
209 209 label_text: Long text
210 210 label_attribute: Attribute
211 211 label_attribute_plural: Attributes
212 212 label_download: %d Download
213 213 label_download_plural: %d Downloads
214 214 label_no_data: No data to display
215 215 label_change_status: Change status
216 216 label_history: History
217 217 label_attachment: File
218 218 label_attachment_new: New file
219 219 label_attachment_delete: Delete file
220 220 label_attachment_plural: Files
221 221 label_report: Report
222 222 label_report_plural: Reports
223 223 label_news: News
224 224 label_news_new: Add news
225 225 label_news_plural: News
226 226 label_news_latest: Latest news
227 227 label_news_view_all: View all news
228 228 label_change_log: Change log
229 229 label_settings: Settings
230 230 label_overview: Overview
231 231 label_version: Version
232 232 label_version_new: New version
233 233 label_version_plural: Versions
234 234 label_confirmation: Confirmation
235 235 label_export_to: Export to
236 236 label_read: Read...
237 237 label_public_projects: Public projects
238 238 label_open_issues: Open
239 239 label_open_issues_plural: Open
240 240 label_closed_issues: Closed
241 241 label_closed_issues_plural: Closed
242 242 label_total: Total
243 243 label_permissions: Permissions
244 244 label_current_status: Current status
245 245 label_new_statuses_allowed: New statuses allowed
246 246 label_all: All
247 247 label_none: None
248 248 label_next: Next
249 249 label_previous: Previous
250 250 label_used_by: Used by
251 251 label_details: Details...
252 252 label_add_note: Add a note
253 253 label_per_page: Per page
254 254 label_calendar: Calendar
255 255 label_months_from: months from
256 256 label_gantt_chart: Gantt chart
257 257 label_internal: Internal
258 258 label_last_changes: last %d changes
259 259 label_change_view_all: View all changes
260 label_personalize_page: Personalize this page
260 261
261 262 button_login: Login
262 263 button_submit: Submit
263 264 button_save: Save
264 265 button_check_all: Check all
265 266 button_uncheck_all: Uncheck all
266 267 button_delete: Delete
267 268 button_create: Create
268 269 button_test: Test
269 270 button_edit: Edit
270 271 button_add: Add
271 272 button_change: Change
272 273 button_apply: Apply
273 274 button_clear: Clear
274 275 button_lock: Lock
275 276 button_unlock: Unlock
276 277 button_download: Download
277 278 button_list: List
278 279 button_view: View
279 280 button_move: Move
280 281 button_back: Back
282 button_cancel: Cancel
281 283
282 284 text_select_mail_notifications: Select actions for which mail notifications should be sent.
283 285 text_regexp_info: eg. ^[A-Z0-9]+$
284 286 text_min_max_length_info: 0 means no restriction
285 287 text_possible_values_info: values separated with |
286 288 text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
287 289 text_workflow_edit: Select a role and a tracker to edit the workflow
288 290 text_are_you_sure: Are you sure ?
289 291 text_journal_changed: changed from %s to %s
290 292 text_journal_set_to: set to %s
291 293 text_journal_deleted: deleted
292 294 text_tip_task_begin_day: task beginning this day
293 295 text_tip_task_end_day: task ending this day
294 296 text_tip_task_begin_end_day: task beginning and ending this day
295 297
296 298 default_role_manager: Manager
297 299 default_role_developper: Developer
298 300 default_role_reporter: Reporter
299 301 default_tracker_bug: Bug
300 302 default_tracker_feature: Feature
301 303 default_tracker_support: Support
302 304 default_issue_status_new: New
303 305 default_issue_status_assigned: Assigned
304 306 default_issue_status_resolved: Resolved
305 307 default_issue_status_feedback: Feedback
306 308 default_issue_status_closed: Closed
307 309 default_issue_status_rejected: Rejected
308 310 default_doc_category_user: User documentation
309 311 default_doc_category_tech: Technical documentation
310 312 default_priority_low: Low
311 313 default_priority_normal: Normal
312 314 default_priority_high: High
313 315 default_priority_urgent: Urgent
314 316 default_priority_immediate: Immediate
315 317
316 318 enumeration_issue_priorities: Issue priorities
317 319 enumeration_doc_categories: Document categories
@@ -1,317 +1,319
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre
5 5 actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: no es una fecha válida
35 35 activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
36 36
37 37 general_fmt_age: %d año
38 38 general_fmt_age_plural: %d años
39 39 general_fmt_date: %%d/%%m/%%Y
40 40 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
41 41 general_fmt_datetime_short: %%d/%%m %%H:%%M
42 42 general_fmt_time: %%H:%%M
43 43 general_text_No: 'No'
44 44 general_text_Yes: 'Sí'
45 45 general_text_no: 'no'
46 46 general_text_yes: 'sí'
47 47 general_lang_es: 'Español'
48 48 general_csv_separator: ';'
49 49 general_day_names: Lunes,Martes,Miércoles,Jueves,Viernes,Sábado,Domingo
50 50
51 51 notice_account_updated: Account was successfully updated.
52 52 notice_account_invalid_creditentials: Invalid user or password
53 53 notice_account_password_updated: Password was successfully updated.
54 54 notice_account_wrong_password: Wrong password
55 55 notice_account_register_done: Account was successfully created.
56 56 notice_account_unknown_email: Unknown user.
57 57 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
58 58 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
59 59 notice_account_activated: Your account has been activated. You can now log in.
60 60 notice_successful_create: Successful creation.
61 61 notice_successful_update: Successful update.
62 62 notice_successful_delete: Successful deletion.
63 63 notice_successful_connection: Successful connection.
64 64 notice_file_not_found: Requested file doesn't exist or has been deleted.
65 65 notice_locking_conflict: Data have been updated by another user.
66 66
67 67 mail_subject_lost_password: Tu contraseña del redMine
68 68 mail_subject_register: Activación de la cuenta del redMine
69 69
70 70 gui_validation_error: 1 error
71 71 gui_validation_error_plural: %d errores
72 72
73 73 field_name: Nombre
74 74 field_description: Descripción
75 75 field_summary: Resumen
76 76 field_is_required: Obligatorio
77 77 field_firstname: Nombre
78 78 field_lastname: Apellido
79 79 field_mail: Email
80 80 field_filename: Fichero
81 81 field_filesize: Tamaño
82 82 field_downloads: Telecargas
83 83 field_author: Autor
84 84 field_created_on: Creado
85 85 field_updated_on: Actualizado
86 86 field_field_format: Formato
87 87 field_is_for_all: Para todos los proyectos
88 88 field_possible_values: Valores posibles
89 89 field_regexp: Expresión regular
90 90 field_min_length: Longitud mínima
91 91 field_max_length: Longitud máxima
92 92 field_value: Valor
93 93 field_category: Categoría
94 94 field_title: Título
95 95 field_project: Proyecto
96 96 field_issue: Petición
97 97 field_status: Estatuto
98 98 field_notes: Notas
99 99 field_is_closed: Petición resuelta
100 100 field_is_default: Estatuto por defecto
101 101 field_html_color: Color
102 102 field_tracker: Tracker
103 103 field_subject: Tema
104 104 field_due_date: Fecha debida
105 105 field_assigned_to: Asignado a
106 106 field_priority: Prioridad
107 107 field_fixed_version: Versión corregida
108 108 field_user: Usuario
109 109 field_role: Papel
110 110 field_homepage: Sitio web
111 111 field_is_public: Público
112 112 field_parent: Proyecto secundario de
113 113 field_is_in_chlog: Consultar las peticiones en el histórico
114 114 field_login: Identificador
115 115 field_mail_notification: Notificación por mail
116 116 field_admin: Administrador
117 117 field_locked: Cerrado
118 118 field_last_login_on: Última conexión
119 119 field_language: Lengua
120 120 field_effective_date: Fecha
121 121 field_password: Contraseña
122 122 field_new_password: Nueva contraseña
123 123 field_password_confirmation: Confirmación
124 124 field_version: Versión
125 125 field_type: Tipo
126 126 field_host: Anfitrión
127 127 field_port: Puerto
128 128 field_account: Cuenta
129 129 field_base_dn: Base DN
130 130 field_attr_login: Cualidad del identificador
131 131 field_attr_firstname: Cualidad del nombre
132 132 field_attr_lastname: Cualidad del apellido
133 133 field_attr_mail: Cualidad del Email
134 134 field_onthefly: Creación del usuario On-the-fly
135 135 field_start_date: Comienzo
136 136 field_done_ratio: %% Realizado
137 137
138 138 label_user: Usuario
139 139 label_user_plural: Usuarios
140 140 label_user_new: Nuevo usuario
141 141 label_project: Proyecto
142 142 label_project_new: Nuevo proyecto
143 143 label_project_plural: Proyectos
144 144 label_project_latest: Los proyectos más últimos
145 145 label_issue: Petición
146 146 label_issue_new: Nueva petición
147 147 label_issue_plural: Peticiones
148 148 label_issue_view_all: Ver todas las peticiones
149 149 label_document: Documento
150 150 label_document_new: Nuevo documento
151 151 label_document_plural: Documentos
152 152 label_role: Papel
153 153 label_role_plural: Papeles
154 154 label_role_new: Nuevo papel
155 155 label_role_and_permissions: Papeles y permisos
156 156 label_member: Miembro
157 157 label_member_new: Nuevo miembro
158 158 label_member_plural: Miembros
159 159 label_tracker: Tracker
160 160 label_tracker_plural: Trackers
161 161 label_tracker_new: Nuevo tracker
162 162 label_workflow: Workflow
163 163 label_issue_status: Estatuto de petición
164 164 label_issue_status_plural: Estatutos de las peticiones
165 165 label_issue_status_new: Nuevo estatuto
166 166 label_issue_category: Categoría de las peticiones
167 167 label_issue_category_plural: Categorías de las peticiones
168 168 label_issue_category_new: Nueva categoría
169 169 label_custom_field: Campo personalizado
170 170 label_custom_field_plural: Campos personalizados
171 171 label_custom_field_new: Nuevo campo personalizado
172 172 label_enumerations: Listas de valores
173 173 label_enumeration_new: Nuevo valor
174 174 label_information: Informacion
175 175 label_information_plural: Informaciones
176 176 label_please_login: Conexión
177 177 label_register: Registrar
178 178 label_password_lost: ¿Olvidaste la contraseña?
179 179 label_home: Acogida
180 180 label_my_page: Mi página
181 181 label_my_account: Mi cuenta
182 182 label_my_projects: Mis proyectos
183 183 label_administration: Administración
184 184 label_login: Conexión
185 185 label_logout: Desconexión
186 186 label_help: Ayuda
187 187 label_reported_issues: Peticiones registradas
188 188 label_assigned_to_me_issues: Peticiones que me están asignadas
189 189 label_last_login: Última conexión
190 190 label_last_updates: Actualizado
191 191 label_last_updates_plural: %d Actualizados
192 192 label_registered_on: Inscrito el
193 193 label_activity: Actividad
194 194 label_new: Nuevo
195 195 label_logged_as: Conectado como
196 196 label_environment: Environment
197 197 label_authentication: Autentificación
198 198 label_auth_source: Modo de la autentificación
199 199 label_auth_source_new: Nuevo modo de la autentificación
200 200 label_auth_source_plural: Modos de la autentificación
201 201 label_subproject: Proyecto secundario
202 202 label_subproject_plural: Proyectos secundarios
203 203 label_min_max_length: Longitud mín - máx
204 204 label_list: Lista
205 205 label_date: Fecha
206 206 label_integer: Número
207 207 label_boolean: Boleano
208 208 label_string: Texto
209 209 label_text: Texto largo
210 210 label_attribute: Cualidad
211 211 label_attribute_plural: Cualidades
212 212 label_download: %d Telecarga
213 213 label_download_plural: %d Telecargas
214 214 label_no_data: Ningunos datos a exhibir
215 215 label_change_status: Cambiar el estatuto
216 216 label_history: Histórico
217 217 label_attachment: Fichero
218 218 label_attachment_new: Nuevo fichero
219 219 label_attachment_delete: Suprimir el fichero
220 220 label_attachment_plural: Ficheros
221 221 label_report: Informe
222 222 label_report_plural: Informes
223 223 label_news: Noticia
224 224 label_news_new: Nueva noticia
225 225 label_news_plural: Noticias
226 226 label_news_latest: Últimas noticias
227 227 label_news_view_all: Ver todas las noticias
228 228 label_change_log: Cambios
229 229 label_settings: Configuración
230 230 label_overview: Vistazo
231 231 label_version: Versión
232 232 label_version_new: Nueva versión
233 233 label_version_plural: Versiónes
234 234 label_confirmation: Confirmación
235 235 label_export_to: Exportar a
236 236 label_read: Leer...
237 237 label_public_projects: Proyectos publicos
238 238 label_open_issues: Abierta
239 239 label_open_issues_plural: Abiertas
240 240 label_closed_issues: Cerrada
241 241 label_closed_issues_plural: Cerradas
242 242 label_total: Total
243 243 label_permissions: Permisos
244 244 label_current_status: Estado actual
245 245 label_new_statuses_allowed: Nuevos estatutos autorizados
246 246 label_all: Todos
247 247 label_none: Ninguno
248 248 label_next: Próximo
249 249 label_previous: Precedente
250 250 label_used_by: Utilizado por
251 251 label_details: Detalles...
252 252 label_add_note: Agregar una nota
253 253 label_per_page: Por la página
254 254 label_calendar: Calendario
255 255 label_months_from: meses de
256 256 label_gantt_chart: Diagrama de Gantt
257 257 label_internal: Interno
258 258 label_last_changes: %d cambios del último
259 259 label_change_view_all: Ver todos los cambios
260 label_personalize_page: Personalizar esta página
260 261
261 262 button_login: Conexión
262 263 button_submit: Someter
263 264 button_save: Validar
264 265 button_check_all: Seleccionar todo
265 266 button_uncheck_all: No seleccionar nada
266 267 button_delete: Suprimir
267 268 button_create: Crear
268 269 button_test: Testar
269 270 button_edit: Modificar
270 271 button_add: Añadir
271 272 button_change: Cambiar
272 273 button_apply: Aplicar
273 274 button_clear: Anular
274 275 button_lock: Bloquear
275 276 button_unlock: Desbloquear
276 277 button_download: Telecargar
277 278 button_list: Listar
278 279 button_view: Ver
279 280 button_move: Mover
280 281 button_back: Atrás
282 button_cancel: Cancelar
281 283
282 284 text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail.
283 285 text_regexp_info: eg. ^[A-Z0-9]+$
284 286 text_min_max_length_info: 0 para ninguna restricción
285 287 text_possible_values_info: Los valores se separaron con |
286 288 text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
287 289 text_workflow_edit: Seleccionar un workflow para actualizar
288 290 text_are_you_sure: ¿ Estás seguro ?
289 291 text_journal_changed: cambiado de %s a %s
290 292 text_journal_set_to: fijado a %s
291 293 text_journal_deleted: suprimido
292 294 text_tip_task_begin_day: tarea que comienza este día
293 295 text_tip_task_end_day: tarea que termina este día
294 296 text_tip_task_begin_end_day: tarea que comienza y termina este día
295 297
296 298 default_role_manager: Manager
297 299 default_role_developper: Desarrollador
298 300 default_role_reporter: Informador
299 301 default_tracker_bug: Anomalía
300 302 default_tracker_feature: Evolución
301 303 default_tracker_support: Asistencia
302 304 default_issue_status_new: Nuevo
303 305 default_issue_status_assigned: Asignada
304 306 default_issue_status_resolved: Resuelta
305 307 default_issue_status_feedback: Comentario
306 308 default_issue_status_closed: Cerrada
307 309 default_issue_status_rejected: Rechazada
308 310 default_doc_category_user: Documentación del usuario
309 311 default_doc_category_tech: Documentación tecnica
310 312 default_priority_low: Bajo
311 313 default_priority_normal: Normal
312 314 default_priority_high: Alto
313 315 default_priority_urgent: Urgente
314 316 default_priority_immediate: Ahora
315 317
316 318 enumeration_issue_priorities: Prioridad de las peticiones
317 319 enumeration_doc_categories: Categorías del documento
@@ -1,318 +1,320
1 1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
5 5 actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 jour
9 9 actionview_datehelper_time_in_words_day_plural: %d jours
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: 30 secondes
15 15 actionview_datehelper_time_in_words_minute_less_than: moins d'une minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: moins d'une seconde
19 19 actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes
20 20 actionview_instancetag_blank_option: Choisir
21 21
22 22 activerecord_error_inclusion: n'est pas inclus dans la liste
23 23 activerecord_error_exclusion: est reservé
24 24 activerecord_error_invalid: est invalide
25 25 activerecord_error_confirmation: ne correspond pas à la confirmation
26 26 activerecord_error_accepted: doit être accepté
27 27 activerecord_error_empty: doit être renseigné
28 28 activerecord_error_blank: doit être renseigné
29 29 activerecord_error_too_long: est trop long
30 30 activerecord_error_too_short: est trop court
31 31 activerecord_error_wrong_length: n'est pas de la bonne longueur
32 32 activerecord_error_taken: est déjà utilisé
33 33 activerecord_error_not_a_number: n'est pas un nombre
34 34 activerecord_error_not_a_date: n'est pas une date valide
35 35 activerecord_error_greater_than_start_date: doit être postérieur à la date de début
36 36
37 37 general_fmt_age: %d an
38 38 general_fmt_age_plural: %d ans
39 39 general_fmt_date: %%d/%%m/%%Y
40 40 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
41 41 general_fmt_datetime_short: %%d/%%m %%H:%%M
42 42 general_fmt_time: %%H:%%M
43 43 general_text_No: 'Non'
44 44 general_text_Yes: 'Oui'
45 45 general_text_no: 'non'
46 46 general_text_yes: 'oui'
47 47 general_lang_fr: 'Français'
48 48 general_csv_separator: ';'
49 49 general_day_names: Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche
50 50
51 51 notice_account_updated: Le compte a été mis à jour avec succès.
52 52 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
53 53 notice_account_password_updated: Mot de passe mis à jour avec succès.
54 54 notice_account_wrong_password: Mot de passe incorrect
55 55 notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé.
56 56 notice_account_unknown_email: Aucun compte ne correspond à cette adresse.
57 57 notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe.
58 58 notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé.
59 59 notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter.
60 60 notice_successful_create: Création effectuée avec succès.
61 61 notice_successful_update: Mise à jour effectuée avec succès.
62 62 notice_successful_delete: Suppression effectuée avec succès.
63 63 notice_successful_connection: Connection réussie.
64 64 notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé.
65 65 notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
66 66
67 67 mail_subject_lost_password: Votre mot de passe redMine
68 68 mail_subject_register: Activation de votre compte redMine
69 69
70 70 gui_validation_error: 1 erreur
71 71 gui_validation_error_plural: %d erreurs
72 72
73 73 field_name: Nom
74 74 field_description: Description
75 75 field_summary: Résumé
76 76 field_is_required: Obligatoire
77 77 field_firstname: Prénom
78 78 field_lastname: Nom
79 79 field_mail: Email
80 80 field_filename: Fichier
81 81 field_filesize: Taille
82 82 field_downloads: Téléchargements
83 83 field_author: Auteur
84 84 field_created_on: Créé
85 85 field_updated_on: Mis à jour
86 86 field_field_format: Format
87 87 field_is_for_all: Pour tous les projets
88 88 field_possible_values: Valeurs possibles
89 89 field_regexp: Expression régulière
90 90 field_min_length: Longueur minimum
91 91 field_max_length: Longueur maximum
92 92 field_value: Valeur
93 93 field_category: Catégorie
94 94 field_title: Titre
95 95 field_project: Projet
96 96 field_issue: Demande
97 97 field_status: Statut
98 98 field_notes: Notes
99 99 field_is_closed: Demande fermée
100 100 field_is_default: Statut par défaut
101 101 field_html_color: Couleur
102 102 field_tracker: Tracker
103 103 field_subject: Sujet
104 104 field_due_date: Date d'échéance
105 105 field_assigned_to: Assigné à
106 106 field_priority: Priorité
107 107 field_fixed_version: Version corrigée
108 108 field_user: Utilisateur
109 109 field_role: Rôle
110 110 field_homepage: Site web
111 111 field_is_public: Public
112 112 field_parent: Sous-projet de
113 113 field_is_in_chlog: Demandes affichées dans l'historique
114 114 field_login: Identifiant
115 115 field_mail_notification: Notifications par mail
116 116 field_admin: Administrateur
117 117 field_locked: Verrouillé
118 118 field_last_login_on: Dernière connexion
119 119 field_language: Langue
120 120 field_effective_date: Date
121 121 field_password: Mot de passe
122 122 field_new_password: Nouveau mot de passe
123 123 field_password_confirmation: Confirmation
124 124 field_version: Version
125 125 field_type: Type
126 126 field_host: Hôte
127 127 field_port: Port
128 128 field_account: Compte
129 129 field_base_dn: Base DN
130 130 field_attr_login: Attribut Identifiant
131 131 field_attr_firstname: Attribut Prénom
132 132 field_attr_lastname: Attribut Nom
133 133 field_attr_mail: Attribut Email
134 134 field_onthefly: Création des utilisateurs à la volée
135 135 field_start_date: Début
136 136 field_done_ratio: %% Réalisé
137 137 field_auth_source: Mode d'authentification
138 138
139 139 label_user: Utilisateur
140 140 label_user_plural: Utilisateurs
141 141 label_user_new: Nouvel utilisateur
142 142 label_project: Projet
143 143 label_project_new: Nouveau projet
144 144 label_project_plural: Projets
145 145 label_project_latest: Derniers projets
146 146 label_issue: Demande
147 147 label_issue_new: Nouvelle demande
148 148 label_issue_plural: Demandes
149 149 label_issue_view_all: Voir toutes les demandes
150 150 label_document: Document
151 151 label_document_new: Nouveau document
152 152 label_document_plural: Documents
153 153 label_role: Rôle
154 154 label_role_plural: Rôles
155 155 label_role_new: Nouveau rôle
156 156 label_role_and_permissions: Rôles et permissions
157 157 label_member: Membre
158 158 label_member_new: Nouveau membre
159 159 label_member_plural: Membres
160 160 label_tracker: Tracker
161 161 label_tracker_plural: Trackers
162 162 label_tracker_new: Nouveau tracker
163 163 label_workflow: Workflow
164 164 label_issue_status: Statut de demandes
165 165 label_issue_status_plural: Statuts de demandes
166 166 label_issue_status_new: Nouveau statut
167 167 label_issue_category: Catégorie de demandes
168 168 label_issue_category_plural: Catégories de demandes
169 169 label_issue_category_new: Nouvelle catégorie
170 170 label_custom_field: Champ personnalisé
171 171 label_custom_field_plural: Champs personnalisés
172 172 label_custom_field_new: Nouveau champ personnalisé
173 173 label_enumerations: Listes de valeurs
174 174 label_enumeration_new: Nouvelle valeur
175 175 label_information: Information
176 176 label_information_plural: Informations
177 177 label_please_login: Identification
178 178 label_register: S'enregistrer
179 179 label_password_lost: Mot de passe perdu
180 180 label_home: Accueil
181 181 label_my_page: Ma page
182 182 label_my_account: Mon compte
183 183 label_my_projects: Mes projets
184 184 label_administration: Administration
185 185 label_login: Connexion
186 186 label_logout: Déconnexion
187 187 label_help: Aide
188 188 label_reported_issues: Demandes soumises
189 189 label_assigned_to_me_issues: Demandes qui me sont assignées
190 190 label_last_login: Dernière connexion
191 191 label_last_updates: Dernière mise à jour
192 192 label_last_updates_plural: %d dernières mises à jour
193 193 label_registered_on: Inscrit le
194 194 label_activity: Activité
195 195 label_new: Nouveau
196 196 label_logged_as: Connecté en tant que
197 197 label_environment: Environnement
198 198 label_authentication: Authentification
199 199 label_auth_source: Mode d'authentification
200 200 label_auth_source_new: Nouveau mode d'authentification
201 201 label_auth_source_plural: Modes d'authentification
202 202 label_subproject: Sous-projet
203 203 label_subproject_plural: Sous-projets
204 204 label_min_max_length: Longueurs mini - maxi
205 205 label_list: Liste
206 206 label_date: Date
207 207 label_integer: Entier
208 208 label_boolean: Booléen
209 209 label_string: Texte
210 210 label_text: Texte long
211 211 label_attribute: Attribut
212 212 label_attribute_plural: Attributs
213 213 label_download: %d Téléchargement
214 214 label_download_plural: %d Téléchargements
215 215 label_no_data: Aucune donnée à afficher
216 216 label_change_status: Changer le statut
217 217 label_history: Historique
218 218 label_attachment: Fichier
219 219 label_attachment_new: Nouveau fichier
220 220 label_attachment_delete: Supprimer le fichier
221 221 label_attachment_plural: Fichiers
222 222 label_report: Rapport
223 223 label_report_plural: Rapports
224 224 label_news: Annonce
225 225 label_news_new: Nouvelle annonce
226 226 label_news_plural: Annonces
227 227 label_news_latest: Dernières annonces
228 228 label_news_view_all: Voir toutes les annonces
229 229 label_change_log: Historique
230 230 label_settings: Configuration
231 231 label_overview: Aperçu
232 232 label_version: Version
233 233 label_version_new: Nouvelle version
234 234 label_version_plural: Versions
235 235 label_confirmation: Confirmation
236 236 label_export_to: Exporter en
237 237 label_read: Lire...
238 238 label_public_projects: Projets publics
239 239 label_open_issues: Ouverte
240 240 label_open_issues_plural: Ouvertes
241 241 label_closed_issues: Fermée
242 242 label_closed_issues_plural: Fermées
243 243 label_total: Total
244 244 label_permissions: Permissions
245 245 label_current_status: Statut actuel
246 246 label_new_statuses_allowed: Nouveaux statuts autorisés
247 247 label_all: Tous
248 248 label_none: Aucun
249 249 label_next: Suivant
250 250 label_previous: Précédent
251 251 label_used_by: Utilisé par
252 252 label_details: Détails...
253 253 label_add_note: Ajouter une note
254 254 label_per_page: Par page
255 255 label_calendar: Calendrier
256 256 label_months_from: mois depuis
257 257 label_gantt_chart: Diagramme de Gantt
258 258 label_internal: Interne
259 259 label_last_changes: %d derniers changements
260 260 label_change_view_all: Voir tous les changements
261 label_personalize_page: Personnaliser cette page
261 262
262 263 button_login: Connexion
263 264 button_submit: Soumettre
264 button_save: Valider
265 button_save: Sauvegarder
265 266 button_check_all: Tout cocher
266 267 button_uncheck_all: Tout décocher
267 268 button_delete: Supprimer
268 269 button_create: Créer
269 270 button_test: Tester
270 271 button_edit: Modifier
271 272 button_add: Ajouter
272 273 button_change: Changer
273 274 button_apply: Appliquer
274 275 button_clear: Effacer
275 276 button_lock: Verrouiller
276 277 button_unlock: Déverrouiller
277 278 button_download: Télécharger
278 279 button_list: Lister
279 280 button_view: Voir
280 281 button_move: Déplacer
281 282 button_back: Retour
283 button_cancel: Annuler
282 284
283 285 text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée.
284 286 text_regexp_info: ex. ^[A-Z0-9]+$
285 287 text_min_max_length_info: 0 pour aucune restriction
286 288 text_possible_values_info: valeurs séparées par |
287 289 text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
288 290 text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
289 291 text_are_you_sure: Etes-vous sûr ?
290 292 text_journal_changed: changé de %s à %s
291 293 text_journal_set_to: mis à %s
292 294 text_journal_deleted: supprimé
293 295 text_tip_task_begin_day: tâche commençant ce jour
294 296 text_tip_task_end_day: tâche finissant ce jour
295 297 text_tip_task_begin_end_day: tâche commençant et finissant ce jour
296 298
297 299 default_role_manager: Manager
298 300 default_role_developper: Développeur
299 301 default_role_reporter: Rapporteur
300 302 default_tracker_bug: Anomalie
301 303 default_tracker_feature: Evolution
302 304 default_tracker_support: Assistance
303 305 default_issue_status_new: Nouveau
304 306 default_issue_status_assigned: Assigné
305 307 default_issue_status_resolved: Résolu
306 308 default_issue_status_feedback: Commentaire
307 309 default_issue_status_closed: Fermé
308 310 default_issue_status_rejected: Rejeté
309 311 default_doc_category_user: Documentation utilisateur
310 312 default_doc_category_tech: Documentation technique
311 313 default_priority_low: Bas
312 314 default_priority_normal: Normal
313 315 default_priority_high: Haut
314 316 default_priority_urgent: Urgent
315 317 default_priority_immediate: Immédiat
316 318
317 319 enumeration_issue_priorities: Priorités des demandes
318 320 enumeration_doc_categories: Catégories des documents
@@ -1,448 +1,484
1 1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 2 /* Edited by Jean-Philippe Lang *>
3 3 /**************** Body and tag styles ****************/
4 4
5 5
6 6 #header * {margin:0; padding:0;}
7 7 p, ul, ol, li {margin:0; padding:0;}
8 8
9 9
10 10 body{
11 11 font:76% Verdana,Tahoma,Arial,sans-serif;
12 12 line-height:1.4em;
13 13 text-align:center;
14 14 color:#303030;
15 15 background:#e8eaec;
16 16 margin:0;
17 17 }
18 18
19 19
20 20 a{
21 21 color:#467aa7;
22 22 font-weight:bold;
23 23 text-decoration:none;
24 24 background-color:inherit;
25 25 }
26 26
27 27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
28 28 a img{border:none;}
29 29
30 30 p{padding:0 0 1em 0;}
31 31 p form{margin-top:0; margin-bottom:20px;}
32 32
33 33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
34 34 img.left{float:left; margin:0 12px 5px 0;}
35 35 img.center{display:block; margin:0 auto 5px auto;}
36 36 img.right{float:right; margin:0 0 5px 12px;}
37 37
38 38 /**************** Header and navigation styles ****************/
39 39
40 40 #container{
41 41 width:100%;
42 42 min-width: 800px;
43 43 margin:0;
44 44 padding:0;
45 45 text-align:left;
46 46 background:#ffffff;
47 47 color:#303030;
48 48 }
49 49
50 50 #header{
51 51 height:4.5em;
52 52 /*width:758px;*/
53 53 margin:0;
54 54 background:#467aa7;
55 55 color:#ffffff;
56 56 margin-bottom:1px;
57 57 }
58 58
59 59 #header h1{
60 60 padding:10px 0 0 20px;
61 61 font-size:2em;
62 62 background-color:inherit;
63 63 color:#fff; /*rgb(152, 26, 33);*/
64 64 letter-spacing:-1px;
65 65 font-weight:bold;
66 66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
67 67 }
68 68
69 69 #header h2{
70 70 margin:3px 0 0 40px;
71 71 font-size:1.5em;
72 72 background-color:inherit;
73 73 color:#f0f2f4;
74 74 letter-spacing:-1px;
75 75 font-weight:normal;
76 76 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
77 77 }
78 78
79 79 #navigation{
80 80 height:2.2em;
81 81 line-height:2.2em;
82 82 /*width:758px;*/
83 83 margin:0;
84 84 background:#578bb8;
85 85 color:#ffffff;
86 86 }
87 87
88 88 #navigation li{
89 89 float:left;
90 90 list-style-type:none;
91 91 border-right:1px solid #ffffff;
92 92 white-space:nowrap;
93 93 }
94 94
95 95 #navigation li.right {
96 96 float:right;
97 97 list-style-type:none;
98 98 border-right:0;
99 99 border-left:1px solid #ffffff;
100 100 white-space:nowrap;
101 101 }
102 102
103 103 #navigation li a{
104 104 display:block;
105 105 padding:0px 10px 0px 22px;
106 106 font-size:0.8em;
107 107 font-weight:normal;
108 108 /*text-transform:uppercase;*/
109 109 text-decoration:none;
110 110 background-color:inherit;
111 111 color: #ffffff;
112 112 }
113 113
114 114 * html #navigation a {width:1%;}
115 115
116 116 #navigation .selected,#navigation a:hover{
117 117 color:#ffffff;
118 118 text-decoration:none;
119 119 background-color: #80b0da;
120 120 }
121 121
122 122 /**************** Icons links *******************/
123 123 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
124 124 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
125 125 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
126 126 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
127 127 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
128 128 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
129 129 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
130 130
131 131 /**************** Content styles ****************/
132 132
133 133 html>body #content {
134 134 height: auto;
135 135 min-height: 500px;
136 136 }
137 137
138 138 #content{
139 139 /*float:right;*/
140 140 /*width:530px;*/
141 141 width: auto;
142 142 height:500px;
143 143 font-size:0.9em;
144 144 padding:20px 10px 10px 20px;
145 145 /*position: absolute;*/
146 146 margin-left: 120px;
147 147 border-left: 1px dashed #c0c0c0;
148 148
149 149 }
150 150
151 151 #content h2{
152 152 display:block;
153 153 margin:0 0 16px 0;
154 154 font-size:1.7em;
155 155 font-weight:normal;
156 156 letter-spacing:-1px;
157 157 color:#606060;
158 158 background-color:inherit;
159 159 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
160 160 }
161 161
162 162 #content h2 a{font-weight:normal;}
163 163 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
164 164 #content a:hover,#subcontent a:hover{text-decoration:underline;}
165 165 #content ul,#content ol{margin:0 5px 16px 35px;}
166 166 #content dl{margin:0 5px 10px 25px;}
167 167 #content dt{font-weight:bold; margin-bottom:5px;}
168 168 #content dd{margin:0 0 10px 15px;}
169 169
170 170
171 171 /***********************************************/
172 172
173 173 /*
174 174 form{
175 175 padding:15px;
176 176 margin:0 0 20px 0;
177 177 border:1px solid #c0c0c0;
178 178 background-color:#CEE1ED;
179 179 width:600px;
180 180 }
181 181 */
182 182
183 183 form {
184 184 display: inline;
185 185 }
186 186
187 187 .noborder {
188 188 border:0px;
189 189 background-color:#fff;
190 190 width:100%;
191 191 }
192 192
193 193 textarea {
194 194 padding:0;
195 195 margin:0;
196 196 }
197 197
198 198 input {
199 199 vertical-align: middle;
200 200 }
201 201
202 202 input.button-small
203 203 {
204 204 font-size: 0.8em;
205 205 }
206 206
207 207 select {
208 208 vertical-align: middle;
209 209 }
210 210
211 211 select.select-small
212 212 {
213 213 border: 1px solid #7F9DB9;
214 214 padding: 1px;
215 215 font-size: 0.8em;
216 216 }
217 217
218 218 .active-filter
219 219 {
220 220 background-color: #F9FA9E;
221 221
222 222 }
223 223
224 224 label {
225 225 font-weight: bold;
226 226 font-size: 1em;
227 227 }
228 228
229 229 fieldset {
230 230 border:1px solid #7F9DB9;
231 231 padding: 6px;
232 232 }
233 233
234 234 legend {
235 235 color: #505050;
236 236
237 237 }
238 238
239 239 .required {
240 240 color: #bb0000;
241 241 }
242 242
243 243 table.listTableContent {
244 244 border:1px solid #578bb8;
245 245 width:99%;
246 246 border-collapse: collapse;
247 247 }
248 248
249 249 table.listTableContent td {
250 250 padding:2px;
251 251 }
252 252
253 253 tr.ListHead {
254 254 background-color:#467aa7;
255 255 color:#FFFFFF;
256 256 text-align:center;
257 257 }
258 258
259 259 tr.ListHead a {
260 260 color:#FFFFFF;
261 261 text-decoration:underline;
262 262 }
263 263
264 264 .odd {
265 265 background-color:#f0f1f2;
266 266 }
267 267 .even {
268 268 background-color: #fff;
269 269 }
270 270
271 271 table.reportTableContent {
272 272 border:1px solid #c0c0c0;
273 273 width:99%;
274 274 border-collapse: collapse;
275 275 }
276 276
277 277 table.reportTableContent td {
278 278 padding:2px;
279 279 }
280 280
281 281 table.calenderTable {
282 282 border:1px solid #578bb8;
283 283 width:99%;
284 284 border-collapse: collapse;
285 285 }
286 286
287 287 table.calenderTable td {
288 288 border:1px solid #578bb8;
289 289 }
290 290
291 291 hr { border:none; border-bottom: dotted 1px #c0c0c0; }
292 292
293 293
294 294 /**************** Sidebar styles ****************/
295 295
296 296 #subcontent{
297 297 position: absolute;
298 298 left: 0px;
299 299 width:110px;
300 300 padding:20px 20px 10px 5px;
301 301 }
302 302
303 303 #subcontent h2{
304 304 display:block;
305 305 margin:0 0 5px 0;
306 306 font-size:1.0em;
307 307 font-weight:bold;
308 308 text-align:left;
309 309 color:#606060;
310 310 background-color:inherit;
311 311 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
312 312 }
313 313
314 314 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
315 315
316 316 /**************** Menublock styles ****************/
317 317
318 318 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
319 319 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
320 320 .menublock li a{font-weight:bold; text-decoration:none;}
321 321 .menublock li a:hover{text-decoration:none;}
322 322 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
323 323 .menublock li ul li{margin-bottom:0;}
324 324 .menublock li ul a{font-weight:normal;}
325 325
326 326 /**************** Searchbar styles ****************/
327 327
328 328 #searchbar{margin:0 0 20px 0;}
329 329 #searchbar form fieldset{margin-left:10px; border:0 solid;}
330 330
331 331 #searchbar #s{
332 332 height:1.2em;
333 333 width:110px;
334 334 margin:0 5px 0 0;
335 335 border:1px solid #a0a0a0;
336 336 }
337 337
338 338 #searchbar #searchbutton{
339 339 width:auto;
340 340 padding:0 1px;
341 341 border:1px solid #808080;
342 342 font-size:0.9em;
343 343 text-align:center;
344 344 }
345 345
346 346 /**************** Footer styles ****************/
347 347
348 348 #footer{
349 349 clear:both;
350 350 /*width:758px;*/
351 351 padding:5px 0;
352 352 margin:0;
353 353 font-size:0.9em;
354 354 color:#f0f0f0;
355 355 background:#467aa7;
356 356 }
357 357
358 358 #footer p{padding:0; margin:0; text-align:center;}
359 359 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
360 360 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
361 361
362 362 /**************** Misc classes and styles ****************/
363 363
364 364 .splitcontentleft{float:left; width:49%;}
365 365 .splitcontentright{float:right; width:49%;}
366 366 .clear{clear:both;}
367 367 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
368 368 .hide{display:none;}
369 369 .textcenter{text-align:center;}
370 370 .textright{text-align:right;}
371 371 .important{color:#f02025; background-color:inherit; font-weight:bold;}
372 372
373 373 .box{
374 374 margin:0 0 20px 0;
375 375 padding:10px;
376 376 border:1px solid #c0c0c0;
377 377 background-color:#fafbfc;
378 378 color:#505050;
379 379 line-height:1.5em;
380 380 }
381 381
382 a.close-icon {
383 display:block;
384 margin-top:3px;
385 overflow:hidden;
386 width:12px;
387 height:12px;
388 background-repeat: no-repeat;
389 cursor:hand;
390 cursor:pointer;
391 background-image:url('../images/close.png');
392 }
393
394 a.close-icon:hover {
395 background-image:url('../images/close_hl.png');
396 }
397
382 398 .rightbox{
383 399 background: #fafbfc;
384 400 border: 1px solid #c0c0c0;
385 401 float: right;
386 402 padding: 8px;
387 403 position: relative;
388 404 margin: 0 5px 5px;
389 405 }
390 406
407 .layout-active {
408 background: #ECF3E1;
409 }
410
411 .block-receiver {
412 border:1px dashed #c0c0c0;
413 margin-bottom: 20px;
414 padding: 15px 0 15px 0;
415 }
416
417 .mypage-box {
418 margin:0 0 20px 0;
419 color:#505050;
420 line-height:1.5em;
421 }
422
423 .blocks {
424 cursor: move;
425 }
426
391 427 .topright{
392 428 position: absolute;
393 429 right: 25px;
394 430 top: 100px;
395 431 }
396 432
397 433 .login {
398 434 width: 50%;
399 435 text-align: left;
400 436 }
401 437
402 438 img.calendar-trigger {
403 439 cursor: pointer;
404 440 vertical-align: middle;
405 441 margin-left: 4px;
406 442 }
407 443
408 444 #history h4 {
409 445 font-size: 1em;
410 446 margin-bottom: 12px;
411 447 margin-top: 20px;
412 448 font-weight: normal;
413 449 border-bottom: dotted 1px #c0c0c0;
414 450 }
415 451
416 452 #history p {
417 453 margin-left: 34px;
418 454 }
419 455
420 456 /***** CSS FORM ******/
421 457 .tabular p{
422 458 margin: 0;
423 459 padding: 5px 0 8px 0;
424 460 padding-left: 180px; /*width of left column containing the label elements*/
425 461 height: 1%;
426 462 }
427 463
428 464 .tabular label{
429 465 font-weight: bold;
430 466 float: left;
431 467 margin-left: -180px; /*width of left column*/
432 468 width: 175px; /*width of labels. Should be smaller than left column to create some right
433 469 margin*/
434 470 }
435 471
436 472 .error {
437 473 color: #cc0000;
438 474 }
439 475
440 476
441 477 /*.threepxfix class below:
442 478 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
443 479 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
444 480 */
445 481
446 482 * html .threepxfix{
447 483 margin-left: 3px;
448 484 } No newline at end of file
@@ -1,100 +1,100
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require "#{File.dirname(__FILE__)}/../test_helper"
19 19
20 20 class AccountTest < ActionController::IntegrationTest
21 21 fixtures :users
22 22
23 23 # Replace this with your real tests.
24 24 def test_login
25 get "account/my_page"
25 get "my/page"
26 26 assert_redirected_to "account/login"
27 27 log_user('jsmith', 'jsmith')
28 28
29 get "account/my_account"
29 get "my/account"
30 30 assert_response :success
31 assert_template "account/my_account"
31 assert_template "my/account"
32 32 end
33 33
34 34 def test_change_password
35 35 log_user('jsmith', 'jsmith')
36 get "account/my_account"
36 get "my/account"
37 37 assert_response :success
38 assert_template "account/my_account"
38 assert_template "my/account"
39 39
40 post "account/change_password", :password => 'jsmith', :new_password => "hello", :new_password_confirmation => "hello2"
40 post "my/change_password", :password => 'jsmith', :new_password => "hello", :new_password_confirmation => "hello2"
41 41 assert_response :success
42 assert_template "account/my_account"
42 assert_template "my/account"
43 43 assert_tag :tag => "div", :attributes => { :class => "errorExplanation" }
44 44
45 post "account/change_password", :password => 'jsmithZZ', :new_password => "hello", :new_password_confirmation => "hello"
46 assert_redirected_to "account/my_account"
45 post "my/change_password", :password => 'jsmithZZ', :new_password => "hello", :new_password_confirmation => "hello"
46 assert_redirected_to "my/account"
47 47 assert_equal 'Wrong password', flash[:notice]
48 48
49 post "account/change_password", :password => 'jsmith', :new_password => "hello", :new_password_confirmation => "hello"
50 assert_redirected_to "account/my_account"
49 post "my/change_password", :password => 'jsmith', :new_password => "hello", :new_password_confirmation => "hello"
50 assert_redirected_to "my/account"
51 51 log_user('jsmith', 'hello')
52 52 end
53 53
54 54 def test_my_account
55 55 log_user('jsmith', 'jsmith')
56 get "account/my_account"
56 get "my/account"
57 57 assert_response :success
58 assert_template "account/my_account"
58 assert_template "my/account"
59 59
60 post "account/my_account", :user => {:firstname => "Joe", :login => "root", :admin => 1}
60 post "my/account", :user => {:firstname => "Joe", :login => "root", :admin => 1}
61 61 assert_response :success
62 assert_template "account/my_account"
62 assert_template "my/account"
63 63 user = User.find(2)
64 64 assert_equal "Joe", user.firstname
65 65 assert_equal "jsmith", user.login
66 66 assert_equal false, user.admin?
67 67 end
68 68
69 69 def test_my_page
70 70 log_user('jsmith', 'jsmith')
71 get "account/my_page"
71 get "my/page"
72 72 assert_response :success
73 assert_template "account/my_page"
73 assert_template "my/page"
74 74 end
75 75
76 76 def test_lost_password
77 77 get "account/lost_password"
78 78 assert_response :success
79 79 assert_template "account/lost_password"
80 80
81 81 post "account/lost_password", :mail => 'jsmith@somenet.foo'
82 82 assert_redirected_to "account/login"
83 83
84 84 token = Token.find(:first)
85 85 assert_equal 'recovery', token.action
86 86 assert_equal 'jsmith@somenet.foo', token.user.mail
87 87 assert !token.expired?
88 88
89 89 get "account/lost_password", :token => token.value
90 90 assert_response :success
91 91 assert_template "account/password_recovery"
92 92
93 93 post "account/lost_password", :token => token.value, :new_password => 'newpass', :new_password_confirmation => 'newpass'
94 94 assert_redirected_to "account/login"
95 95 assert_equal 'Password was successfully updated.', flash[:notice]
96 96
97 97 log_user('jsmith', 'newpass')
98 98 assert_equal 0, Token.count
99 99 end
100 100 end
@@ -1,55 +1,55
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 ENV["RAILS_ENV"] ||= "test"
19 19 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
20 20 require 'test_help'
21 21
22 22 class Test::Unit::TestCase
23 23 # Transactional fixtures accelerate your tests by wrapping each test method
24 24 # in a transaction that's rolled back on completion. This ensures that the
25 25 # test database remains unchanged so your fixtures don't have to be reloaded
26 26 # between every test method. Fewer database queries means faster tests.
27 27 #
28 28 # Read Mike Clark's excellent walkthrough at
29 29 # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
30 30 #
31 31 # Every Active Record database supports transactions except MyISAM tables
32 32 # in MySQL. Turn off transactional fixtures in this case; however, if you
33 33 # don't care one way or the other, switching from MyISAM to InnoDB tables
34 34 # is recommended.
35 35 self.use_transactional_fixtures = true
36 36
37 37 # Instantiated fixtures are slow, but give you @david where otherwise you
38 38 # would need people(:david). If you don't want to migrate your existing
39 39 # test cases which use the @david style and don't mind the speed hit (each
40 40 # instantiated fixtures translates to a database query per test method),
41 41 # then set this back to true.
42 42 self.use_instantiated_fixtures = false
43 43
44 44 # Add more helper methods to be used by all tests here...
45 45
46 46 def log_user(login, password)
47 47 get "/account/login"
48 48 assert_equal nil, session[:user_id]
49 49 assert_response :success
50 50 assert_template "account/login"
51 51 post "/account/login", :login => login, :password => password
52 assert_redirected_to "account/my_page"
52 assert_redirected_to "my/page"
53 53 assert_equal login, User.find(session[:user_id]).login
54 54 end
55 55 end
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now