Compare commits

..
1 Commits
Author SHA1 Message Date
Eric Davis cac7b0423f Tagging 1.0.0 (RC)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.0.0@3858 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 18:19:20 +00:00
221 changed files with 5275 additions and 8346 deletions
+6 -6
View File
@@ -83,9 +83,9 @@ class AccountController < ApplicationController
else else
@user = User.new(params[:user]) @user = User.new(params[:user])
@user.admin = false @user.admin = false
@user.register @user.status = User::STATUS_REGISTERED
if session[:auth_source_registration] if session[:auth_source_registration]
@user.activate @user.status = User::STATUS_ACTIVE
@user.login = session[:auth_source_registration][:login] @user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id] @user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save if @user.save
@@ -116,8 +116,8 @@ class AccountController < ApplicationController
token = Token.find_by_action_and_value('register', params[:token]) token = Token.find_by_action_and_value('register', params[:token])
redirect_to(home_url) && return unless token and !token.expired? redirect_to(home_url) && return unless token and !token.expired?
user = token.user user = token.user
redirect_to(home_url) && return unless user.registered? redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
user.activate user.status = User::STATUS_ACTIVE
if user.save if user.save
token.destroy token.destroy
flash[:notice] = l(:notice_account_activated) flash[:notice] = l(:notice_account_activated)
@@ -170,7 +170,7 @@ class AccountController < ApplicationController
user.mail = registration['email'] unless registration['email'].nil? user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password user.random_password
user.register user.status = User::STATUS_REGISTERED
case Setting.self_registration case Setting.self_registration
when '1' when '1'
@@ -241,7 +241,7 @@ class AccountController < ApplicationController
# Pass a block for behavior when a user fails to save # Pass a block for behavior when a user fails to save
def register_automatically(user, &block) def register_automatically(user, &block)
# Automatic activation # Automatic activation
user.activate user.status = User::STATUS_ACTIVE
user.last_login_on = Time.now user.last_login_on = Time.now
if user.save if user.save
self.logged_user = user self.logged_user = user
-59
View File
@@ -1,59 +0,0 @@
class ActivitiesController < ApplicationController
menu_item :activity
before_filter :find_optional_project
accept_key_auth :index
def index
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private
# TODO: refactor, duplicated in projects_controller
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
end
+4 -46
View File
@@ -201,23 +201,7 @@ class ApplicationController < ActionController::Base
def self.model_object(model) def self.model_object(model)
write_inheritable_attribute('model_object', model) write_inheritable_attribute('model_object', model)
end end
# Filter for bulk issue operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
# make sure that the user is a member of the project (or admin) if project is private # make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project # used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy def check_project_privacy
@@ -234,10 +218,6 @@ class ApplicationController < ActionController::Base
end end
end end
def back_url
params[:back_url] || request.env['HTTP_REFERER']
end
def redirect_back_or_default(default) def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s) back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank? if !back_url.blank?
@@ -258,7 +238,7 @@ class ApplicationController < ActionController::Base
def render_403 def render_403
@project = nil @project = nil
respond_to do |format| respond_to do |format|
format.html { render :template => "common/403", :layout => use_layout, :status => 403 } format.html { render :template => "common/403", :layout => (request.xhr? ? false : 'base'), :status => 403 }
format.atom { head 403 } format.atom { head 403 }
format.xml { head 403 } format.xml { head 403 }
format.js { head 403 } format.js { head 403 }
@@ -269,7 +249,7 @@ class ApplicationController < ActionController::Base
def render_404 def render_404
respond_to do |format| respond_to do |format|
format.html { render :template => "common/404", :layout => use_layout, :status => 404 } format.html { render :template => "common/404", :layout => !request.xhr?, :status => 404 }
format.atom { head 404 } format.atom { head 404 }
format.xml { head 404 } format.xml { head 404 }
format.js { head 404 } format.js { head 404 }
@@ -282,7 +262,7 @@ class ApplicationController < ActionController::Base
respond_to do |format| respond_to do |format|
format.html { format.html {
flash.now[:error] = msg flash.now[:error] = msg
render :text => '', :layout => use_layout, :status => 500 render :text => '', :layout => !request.xhr?, :status => 500
} }
format.atom { head 500 } format.atom { head 500 }
format.xml { head 500 } format.xml { head 500 }
@@ -290,13 +270,6 @@ class ApplicationController < ActionController::Base
format.json { head 500 } format.json { head 500 }
end end
end end
# Picks which layout to use based on the request
#
# @return [boolean, string] name of the layout to use or false for no layout
def use_layout
request.xhr? ? false : 'base'
end
def invalid_authenticity_token def invalid_authenticity_token
if api_request? if api_request?
@@ -372,21 +345,6 @@ class ApplicationController < ActionController::Base
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present? flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
end end
# Sets the `flash` notice or error based the number of issues that did not save
#
# @param [Array, Issue] issues all of the saved and unsaved Issues
# @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
# Rescues an invalid query statement. Just in case... # Rescues an invalid query statement. Just in case...
def query_statement_invalid(exception) def query_statement_invalid(exception)
logger.error "Query::StatementInvalid: #{exception.message}" if logger logger.error "Query::StatementInvalid: #{exception.message}" if logger
@@ -1,25 +0,0 @@
class AutoCompletesController < ApplicationController
before_filter :find_project
def issues
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end
-1
View File
@@ -18,7 +18,6 @@
class BoardsController < ApplicationController class BoardsController < ApplicationController
default_search_scope :messages default_search_scope :messages
before_filter :find_project, :find_board_if_available, :authorize before_filter :find_project, :find_board_if_available, :authorize
accept_key_auth :index, :show
helper :messages helper :messages
include MessagesHelper include MessagesHelper
-3
View File
@@ -1,5 +1,4 @@
class CalendarsController < ApplicationController class CalendarsController < ApplicationController
menu_item :calendar
before_filter :find_optional_project before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -8,8 +7,6 @@ class CalendarsController < ApplicationController
helper :projects helper :projects
helper :queries helper :queries
include QueriesHelper include QueriesHelper
helper :sort
include SortHelper
def show def show
if params[:year] and params[:year].to_i > 1900 if params[:year] and params[:year].to_i > 1900
@@ -1,39 +0,0 @@
class ContextMenusController < ApplicationController
helper :watchers
def issues
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
else
@allowed_statuses = @issues.map do |i|
i.new_statuses_allowed_to(User.current)
end.inject do |memo,s|
memo & s
end
end
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = back_url
render :layout => false
end
end
-37
View File
@@ -1,37 +0,0 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project
before_filter :authorize
helper :sort
include SortHelper
def index
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
# TODO: split method into new (GET) and create (POST)
def new
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'files', :action => 'index', :id => @project
return
end
@versions = @project.versions.sort
end
end
+1 -2
View File
@@ -1,5 +1,4 @@
class GanttsController < ApplicationController class GanttsController < ApplicationController
menu_item :gantt
before_filter :find_optional_project before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -38,7 +37,7 @@ class GanttsController < ApplicationController
respond_to do |format| respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? } format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image') format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") } format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
end end
end end
+8 -16
View File
@@ -141,22 +141,14 @@ class GroupsController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group) @membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
@membership.save if request.post? @membership.save if request.post?
respond_to do |format| respond_to do |format|
if @membership.valid? format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' } format.js {
format.js { render(:update) {|page|
render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
page.replace_html "tab-content-memberships", :partial => 'groups/memberships' page.visual_effect(:highlight, "member-#{@membership.id}")
page.visual_effect(:highlight, "member-#{@membership.id}") }
} }
} end
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end end
def destroy_membership def destroy_membership
-68
View File
@@ -1,68 +0,0 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues
before_filter :authorize
def new
prepare_for_issue_move
render :layout => false if request.xhr?
end
def create
prepare_for_issue_move
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
issue.init_journal(User.current)
issue.current_journal.notes = @notes if @notes.present?
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
end
return
end
end
private
def prepare_for_issue_move
@issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
@notes = params[:notes]
@notes ||= ''
end
def extract_changed_attributes_for_move(params)
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date, :priority_id].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
changed_attributes
end
end
+207 -47
View File
@@ -19,14 +19,14 @@ class IssuesController < ApplicationController
menu_item :new_issue, :only => [:new, :create] menu_item :new_issue, :only => [:new, :create]
default_search_scope :issues default_search_scope :issues
before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issue, :only => [:show, :edit, :update, :reply]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy] before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
before_filter :find_project, :only => [:new, :create] before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete]
before_filter :authorize, :except => [:index] before_filter :authorize, :except => [:index, :changes, :preview, :context_menu]
before_filter :find_optional_project, :only => [:index] before_filter :find_optional_project, :only => [:index, :changes]
before_filter :check_for_default_issue_status, :only => [:new, :create] before_filter :check_for_default_issue_status, :only => [:new, :create]
before_filter :build_new_issue_from_params, :only => [:new, :create] before_filter :build_new_issue_from_params, :only => [:new, :create]
accept_key_auth :index, :show accept_key_auth :index, :show, :changes
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -54,7 +54,6 @@ class IssuesController < ApplicationController
:render => { :nothing => true, :status => :method_not_allowed } :render => { :nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def index def index
@@ -96,6 +95,21 @@ class IssuesController < ApplicationController
render_404 render_404
end end
def changes
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def show def show
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@journals.each_with_index {|j,i| j.indice = i+1} @journals.each_with_index {|j,i| j.indice = i+1}
@@ -110,7 +124,7 @@ class IssuesController < ApplicationController
format.html { render :template => 'issues/show.rhtml' } format.html { render :template => 'issues/show.rhtml' }
format.xml { render :layout => false } format.xml { render :layout => false }
format.json { render :text => @issue.to_json, :layout => false } format.json { render :text => @issue.to_json, :layout => false }
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' } format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
end end
end end
@@ -118,10 +132,7 @@ class IssuesController < ApplicationController
# Add a new issue # Add a new issue
# The new issue will be created from an existing one if copy_from parameter is given # The new issue will be created from an existing one if copy_from parameter is given
def new def new
respond_to do |format| render :action => 'new', :layout => !request.xhr?
format.html { render :action => 'new', :layout => !request.xhr? }
format.js { render :partial => 'attributes' }
end
end end
def create def create
@@ -133,7 +144,7 @@ class IssuesController < ApplicationController
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue}) call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format| respond_to do |format|
format.html { format.html {
redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } : redirect_to(params[:continue] ? { :action => 'new', :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
{ :action => 'show', :id => @issue }) { :action => 'show', :id => @issue })
} }
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) } format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) }
@@ -189,30 +200,98 @@ class IssuesController < ApplicationController
end end
end end
def reply
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
# Bulk edit a set of issues # Bulk edit a set of issues
def bulk_edit def bulk_edit
@issues.sort! @issues.sort!
if request.post?
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
unsaved_issue_ids = []
@issues.each do |issue|
issue.reload
journal = issue.init_journal(User.current, params[:notes])
issue.safe_attributes = attributes
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
unless issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
return
end
@available_statuses = Workflow.available_statuses(@project) @available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields @custom_fields = @project.all_issue_custom_fields
end end
def bulk_update def move
@issues.sort! @issues.sort!
attributes = parse_params_for_bulk_issue_attributes(params) @copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = Issue.allowed_target_projects_on_move
unsaved_issue_ids = [] @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@issues.each do |issue| @target_project ||= @project
issue.reload @trackers = @target_project.trackers
journal = issue.init_journal(User.current, params[:notes]) @available_statuses = Workflow.available_statuses(@project)
issue.safe_attributes = attributes if request.post?
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue }) new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unless issue.save unsaved_issue_ids = []
# Keep unsaved issue ids to display them in flash error moved_issues = []
unsaved_issue_ids << issue.id @issues.each do |issue|
issue.reload
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
end
return
end end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) render :layout => false if request.xhr?
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
end end
def destroy def destroy
@@ -245,7 +324,77 @@ class IssuesController < ApplicationController
format.json { head :ok } format.json { head :ok }
end end
end end
def context_menu
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
end
projects = @issues.collect(&:project).compact.uniq
@project = projects.first if projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = params[:back_url] || request.env['HTTP_REFERER']
render :layout => false
end
def update_form
if params[:id].blank?
@issue = Issue.new
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.attributes = params[:issue]
@allowed_statuses = ([@issue.status] + @issue.status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
@priorities = IssuePriority.all
render :partial => 'attributes'
end
def preview
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
def auto_complete
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private private
def find_issue def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@@ -254,6 +403,22 @@ private
render_404 render_404
end end
# Filter for bulk operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id) @project = Project.find(project_id)
@@ -270,7 +435,7 @@ private
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@time_entry = TimeEntry.new @time_entry = TimeEntry.new
@notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil) @notes = params[:notes]
@issue.init_journal(User.current, @notes) @issue.init_journal(User.current, @notes)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue] if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
@@ -283,16 +448,9 @@ private
end end
# TODO: Refactor, lots of extra code in here # TODO: Refactor, lots of extra code in here
# TODO: Changing tracker on an existing issue should not trigger this
def build_new_issue_from_params def build_new_issue_from_params
if params[:id].blank? @issue = Issue.new
@issue = Issue.new @issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.project = @project @issue.project = @project
# Tracker must be set before custom field values # Tracker must be set before custom field values
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first) @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
@@ -302,9 +460,7 @@ private
end end
if params[:issue].is_a?(Hash) if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue] @issue.safe_attributes = params[:issue]
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record? @issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
@issue.watcher_user_ids = params[:issue]['watcher_user_ids']
end
end end
@issue.author = User.current @issue.author = User.current
@issue.start_date ||= Date.today @issue.start_date ||= Date.today
@@ -312,17 +468,21 @@ private
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true) @allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end end
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
def check_for_default_issue_status def check_for_default_issue_status
if IssueStatus.default.nil? if IssueStatus.default.nil?
render_error l(:error_no_default_issue_status) render_error l(:error_no_default_issue_status)
return false return false
end end
end end
def parse_params_for_bulk_issue_attributes(params)
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
attributes
end
end end
+1 -56
View File
@@ -16,54 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class JournalsController < ApplicationController class JournalsController < ApplicationController
before_filter :find_journal, :only => [:edit] before_filter :find_journal
before_filter :find_issue, :only => [:new]
before_filter :find_optional_project, :only => [:index]
accept_key_auth :index
helper :issues
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def index
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def new
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
def edit def edit
if request.post? if request.post?
@@ -85,12 +38,4 @@ private
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
# TODO: duplicated in IssuesController
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end end
-28
View File
@@ -1,28 +0,0 @@
class PreviewsController < ApplicationController
before_filter :find_project
def issue
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end
@@ -1,26 +0,0 @@
class ProjectEnumerationsController < ApplicationController
before_filter :find_project
before_filter :authorize
def save
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def destroy
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
end
+183 -65
View File
@@ -17,24 +17,24 @@
class ProjectsController < ApplicationController class ProjectsController < ApplicationController
menu_item :overview menu_item :overview
menu_item :activity, :only => :activity
menu_item :roadmap, :only => :roadmap menu_item :roadmap, :only => :roadmap
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings menu_item :settings, :only => :settings
before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ] before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy] before_filter :find_optional_project, :only => :activity
before_filter :authorize_global, :only => [:new, :create] before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
before_filter :authorize_global, :only => :add
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ] before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :index accept_key_auth :activity, :index
after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller| after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
if controller.request.post? if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt' controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end end
end end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
helper :sort helper :sort
include SortHelper include SortHelper
helper :custom_fields helper :custom_fields
@@ -63,45 +63,40 @@ class ProjectsController < ApplicationController
end end
end end
def new # Add a new project
def add
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all @trackers = Tracker.all
@project = Project.new(params[:project]) @project = Project.new(params[:project])
if request.get?
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers? @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
@project.trackers = Tracker.all @project.trackers = Tracker.all
@project.is_public = Setting.default_projects_public? @project.is_public = Setting.default_projects_public?
@project.enabled_module_names = Setting.default_projects_modules @project.enabled_module_names = Setting.default_projects_modules
end
def create
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
unless User.current.admin?
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
@project.members << m
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else else
respond_to do |format| @project.enabled_module_names = params[:enabled_modules]
format.html { render :action => 'new' } if validate_parent_id && @project.save
format.xml { render :xml => @project.errors, :status => :unprocessable_entity } @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
unless User.current.admin?
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
@project.members << m
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end end
end end
end end
def copy def copy
@@ -125,13 +120,13 @@ class ProjectsController < ApplicationController
if validate_parent_id && @project.copy(@source_project, :only => params[:only]) if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings' redirect_to :controller => 'admin', :action => 'projects'
elsif !@project.new_record? elsif !@project.new_record?
# Project was created # Project was created
# But some objects were not copied due to validation failures # But some objects were not copied due to validation failures
# (eg. issues from disabled trackers) # (eg. issues from disabled trackers)
# TODO: inform about that # TODO: inform about that
redirect_to :controller => 'projects', :action => 'settings' redirect_to :controller => 'admin', :action => 'projects'
end end
end end
end end
@@ -182,27 +177,28 @@ class ProjectsController < ApplicationController
@wiki ||= @project.wiki @wiki ||= @project.wiki
end end
# Edit @project
def edit def edit
end if request.get?
def update
@project.attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else else
respond_to do |format| @project.attributes = params[:project]
format.html { if validate_parent_id && @project.save
settings @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
render :action => 'settings' respond_to do |format|
} format.html {
format.xml { render :xml => @project.errors, :status => :unprocessable_entity } flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else
respond_to do |format|
format.html {
settings
render :action => 'settings'
}
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end end
end end
end end
@@ -245,6 +241,120 @@ class ProjectsController < ApplicationController
@project = nil @project = nil
end end
def add_file
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
return
end
@versions = @project.versions.sort
end
def save_activities
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def reset_activities
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def list_files
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
def roadmap
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def activity
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private private
def find_optional_project def find_optional_project
return true unless params[:id] return true unless params[:id]
@@ -254,6 +364,14 @@ private
render_404 render_404
end end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
# Validates parent_id param according to user's permissions # Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current # TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id def validate_parent_id
+4 -11
View File
@@ -55,7 +55,8 @@ class TimelogController < ApplicationController
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours" sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}" sql << " FROM #{TimeEntry.table_name}"
sql << time_report_joins sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
sql << " WHERE" sql << " WHERE"
sql << " (%s) AND" % sql_condition sql << " (%s) AND" % sql_condition
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)] sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
@@ -260,8 +261,8 @@ private
end end
@from, @to = @to, @from if @from && @to && @from > @to @from, @to = @to, @from if @from && @to && @from > @to
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today) @from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) - 1
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today) @to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today)
end end
def load_available_criterias def load_available_criterias
@@ -313,12 +314,4 @@ private
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project }) call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias @available_criterias
end end
def time_report_joins
sql = ''
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end end
+13 -21
View File
@@ -53,8 +53,10 @@ class UsersController < ApplicationController
@user = User.find(params[:id]) @user = User.find(params[:id])
@custom_values = @user.custom_values @custom_values = @user.custom_values
# show projects based on current user visibility # show only public projects and private projects that the logged in user is also a member of
@memberships = @user.memberships.all(:conditions => Project.visible_by(User.current)) @memberships = @user.memberships.select do |membership|
membership.project.is_public? || (User.current.member_of?(membership.project))
end
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10) events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
@events_by_day = events.group_by(&:event_date) @events_by_day = events.group_by(&:event_date)
@@ -95,9 +97,7 @@ class UsersController < ApplicationController
if request.post? if request.post?
@user.admin = params[:user][:admin] if params[:user][:admin] @user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login] @user.login = params[:user][:login] if params[:user][:login]
if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?) @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
end
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids] @user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
@user.attributes = params[:user] @user.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change) # Was the account actived ? (do it before User#save clears the change)
@@ -123,22 +123,14 @@ class UsersController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user) @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
@membership.save if request.post? @membership.save if request.post?
respond_to do |format| respond_to do |format|
if @membership.valid? format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' } format.js {
format.js { render(:update) {|page|
render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'
page.replace_html "tab-content-memberships", :partial => 'users/memberships' page.visual_effect(:highlight, "member-#{@membership.id}")
page.visual_effect(:highlight, "member-#{@membership.id}") }
} }
} end
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end end
def destroy_membership def destroy_membership
+5 -55
View File
@@ -18,42 +18,15 @@
class VersionsController < ApplicationController class VersionsController < ApplicationController
menu_item :roadmap menu_item :roadmap
model_object Version model_object Version
before_filter :find_model_object, :except => [:index, :new, :create, :close_completed] before_filter :find_model_object, :except => [:new, :close_completed]
before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed] before_filter :find_project_from_association, :except => [:new, :close_completed]
before_filter :find_project, :only => [:index, :new, :create, :close_completed] before_filter :find_project, :only => [:new, :close_completed]
before_filter :authorize before_filter :authorize
helper :custom_fields helper :custom_fields
helper :projects helper :projects
def index
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def show def show
@issues = @version.fixed_issues.visible.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
end end
def new def new
@@ -63,17 +36,6 @@ class VersionsController < ApplicationController
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes @version.attributes = attributes
end end
end
def create
# TODO: refactor with code above in #new
@version = @project.versions.build
if params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
if request.post? if request.post?
if @version.save if @version.save
respond_to do |format| respond_to do |format|
@@ -90,7 +52,7 @@ class VersionsController < ApplicationController
end end
else else
respond_to do |format| respond_to do |format|
format.html { render :action => 'new' } format.html
format.js do format.js do
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) } render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
end end
@@ -98,11 +60,8 @@ class VersionsController < ApplicationController
end end
end end
end end
def edit
end
def update def edit
if request.post? && params[:version] if request.post? && params[:version]
attributes = params[:version].dup attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
@@ -143,13 +102,4 @@ private
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
end end
+8
View File
@@ -20,4 +20,12 @@ module AdminHelper
options_for_select([[l(:label_all), ''], options_for_select([[l(:label_all), ''],
[l(:status_active), 1]], selected) [l(:status_active), 1]], selected)
end end
def css_project_classes(project)
s = 'project'
s << ' root' if project.root?
s << ' child' if project.child?
s << (project.leaf? ? ' leaf' : ' parent')
s
end
end end
+8 -50
View File
@@ -32,11 +32,6 @@ module ApplicationHelper
end end
# Display a link if user is authorized # Display a link if user is authorized
#
# @param [String] name Anchor text (passed to link_to)
# @param [Hash] options Hash params. This will checked by authorize_for to see if the user is authorized
# @param [optional, Hash] html_options Options passed to link_to
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action]) link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
end end
@@ -108,23 +103,6 @@ module ApplicationHelper
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision)) link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
end end
# Generates a link to a project if active
# Examples:
#
# link_to_project(project) # => link to the specified project overview
# link_to_project(project, :action=>'settings') # => link to project settings
# link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options
# link_to_project(project, {}, :class => "project") # => html options with default url (project overview)
#
def link_to_project(project, options={}, html_options = nil)
if project.active?
url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
link_to(h(project), url, html_options)
else
h(project)
end
end
def toggle_link(name, id, options={}) def toggle_link(name, id, options={})
onclick = "Element.toggle('#{id}'); " onclick = "Element.toggle('#{id}'); "
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ") onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
@@ -307,7 +285,7 @@ module ApplicationHelper
def time_tag(time) def time_tag(time)
text = distance_of_time_in_words(Time.now, time) text = distance_of_time_in_words(Time.now, time)
if @project if @project
link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => time.to_date}, :title => format_time(time)) link_to(text, {:controller => 'projects', :action => 'activity', :id => @project, :from => time.to_date}, :title => format_time(time))
else else
content_tag('acronym', text, :title => format_time(time)) content_tag('acronym', text, :title => format_time(time))
end end
@@ -390,12 +368,12 @@ module ApplicationHelper
ancestors = (@project.root? ? [] : @project.ancestors.visible) ancestors = (@project.root? ? [] : @project.ancestors.visible)
if ancestors.any? if ancestors.any?
root = ancestors.shift root = ancestors.shift
b << link_to_project(root, {:jump => current_menu_item}, :class => 'root') b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root')
if ancestors.size > 2 if ancestors.size > 2
b << '&#8230;' b << '&#8230;'
ancestors = ancestors[-2, 2] ancestors = ancestors[-2, 2]
end end
b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') } b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') }
end end
b << h(@project) b << h(@project)
b.join(' &#187; ') b.join(' &#187; ')
@@ -415,19 +393,6 @@ module ApplicationHelper
end end
end end
# Returns the theme, controller name, and action as css classes for the
# HTML body.
def body_css_classes
css = []
if theme = Redmine::Themes.theme(Setting.ui_theme)
css << 'theme-' + theme.name
end
css << 'controller-' + params[:controller]
css << 'action-' + params[:action]
css.join(' ')
end
def accesskey(s) def accesskey(s)
Redmine::AccessKeys.key_for s Redmine::AccessKeys.key_for s
end end
@@ -627,7 +592,8 @@ module ApplicationHelper
end end
when 'project' when 'project'
if p = Project.visible.find_by_id(oid) if p = Project.visible.find_by_id(oid)
link = link_to_project(p, {:only_path => only_path}, :class => 'project') link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
end end
end end
elsif sep == ':' elsif sep == ':'
@@ -669,7 +635,8 @@ module ApplicationHelper
end end
when 'project' when 'project'
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}]) if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
link = link_to_project(p, {:only_path => only_path}, :class => 'project') link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
end end
end end
end end
@@ -742,11 +709,6 @@ module ApplicationHelper
javascript_include_tag('context_menu') + javascript_include_tag('context_menu') +
stylesheet_link_tag('context_menu') stylesheet_link_tag('context_menu')
end end
if l(:direction) == 'rtl'
content_for :header_tags do
stylesheet_link_tag('context_menu_rtl')
end
end
@context_menu_included = true @context_menu_included = true
end end
javascript_tag "new ContextMenu('#{ url_for(url) }')" javascript_tag "new ContextMenu('#{ url_for(url) }')"
@@ -810,7 +772,7 @@ module ApplicationHelper
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>') # +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
def avatar(user, options = { }) def avatar(user, options = { })
if Setting.gravatar_enabled? if Setting.gravatar_enabled?
options.merge!({:ssl => (defined?(request) && request.ssl?), :default => Setting.gravatar_default}) options.merge!({:ssl => Setting.protocol == 'https', :default => Setting.gravatar_default})
email = nil email = nil
if user.respond_to?(:mail) if user.respond_to?(:mail)
email = user.mail email = user.mail
@@ -821,10 +783,6 @@ module ApplicationHelper
end end
end end
def favicon
"<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
end
private private
def wiki_helper def wiki_helper
-38
View File
@@ -1,38 +0,0 @@
module CalendarsHelper
def link_to_previous_month(year, month)
target_year, target_month = if month == 1
[year - 1, 12]
else
[year, month - 1]
end
name = if target_month == 12
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote ('&#171; ' + name),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
end
def link_to_next_month(year, month)
target_year, target_month = if month == 12
[year + 1, 1]
else
[year, month + 1]
end
name = if target_month == 1
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote (name + ' &#187;'),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
end
end
-2
View File
@@ -1,2 +0,0 @@
module IssueMovesHelper
end
+1 -12
View File
@@ -28,25 +28,14 @@ module IssuesHelper
ancestors << issue unless issue.leaf? ancestors << issue unless issue.leaf?
end end
end end
# Renders a HTML/CSS tooltip
#
# To use, a trigger div is needed. This is a div with the class of "tooltip"
# that contains this method wrapped in a span with the class of "tip"
#
# <div class="tooltip"><%= link_to_issue(issue) %>
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
# </div>
#
def render_issue_tooltip(issue) def render_issue_tooltip(issue)
@cached_label_status ||= l(:field_status)
@cached_label_start_date ||= l(:field_start_date) @cached_label_start_date ||= l(:field_start_date)
@cached_label_due_date ||= l(:field_due_date) @cached_label_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to) @cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority) @cached_label_priority ||= l(:field_priority)
link_to_issue(issue) + "<br /><br />" + link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" + "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
+1 -1
View File
@@ -22,7 +22,7 @@ module JournalsHelper
links = [] links = []
if !journal.notes.blank? if !journal.notes.blank?
links << link_to_remote(image_tag('comment.png'), links << link_to_remote(image_tag('comment.png'),
{ :url => {:controller => 'journals', :action => 'new', :id => issue, :journal_id => journal} }, { :url => {:controller => 'issues', :action => 'reply', :id => issue, :journal_id => journal} },
:title => l(:button_quote)) if options[:reply_links] :title => l(:button_quote)) if options[:reply_links]
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes", links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
{ :controller => 'journals', :action => 'edit', :id => journal }, { :controller => 'journals', :action => 'edit', :id => journal },
+1 -1
View File
@@ -72,7 +72,7 @@ module ProjectsHelper
end end
classes = (ancestors.empty? ? 'root' : 'child') classes = (ancestors.empty? ? 'root' : 'child')
s << "<li class='#{classes}'><div class='#{classes}'>" + s << "<li class='#{classes}'><div class='#{classes}'>" +
link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}") link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank? s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
s << "</div>\n" s << "</div>\n"
ancestors << project ancestors << project
+1 -1
View File
@@ -50,7 +50,7 @@ module QueriesHelper
when 'User' when 'User'
link_to_user value link_to_user value
when 'Project' when 'Project'
link_to_project value link_to(h(value), :controller => 'projects', :action => 'show', :id => value)
when 'Version' when 'Version'
link_to(h(value), :controller => 'versions', :action => 'show', :id => value) link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
when 'TrueClass' when 'TrueClass'
+2 -3
View File
@@ -19,13 +19,12 @@ class Change < ActiveRecord::Base
belongs_to :changeset belongs_to :changeset
validates_presence_of :changeset_id, :action, :path validates_presence_of :changeset_id, :action, :path
before_save :init_path
def relative_path def relative_path
changeset.repository.relative_path(path) changeset.repository.relative_path(path)
end end
def init_path def before_save
self.path ||= "" path ||= ""
end end
end end
+1
View File
@@ -76,6 +76,7 @@ class Changeset < ActiveRecord::Base
def after_create def after_create
scan_comment_for_issue_ids scan_comment_for_issue_ids
end end
require 'pp'
def scan_comment_for_issue_ids def scan_comment_for_issue_ids
return if comments.blank? return if comments.blank?
+7 -14
View File
@@ -68,8 +68,8 @@ class Issue < ActiveRecord::Base
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"] :conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
before_create :default_assign before_create :default_assign
before_save :close_duplicates, :update_done_ratio_from_issue_status before_save :reschedule_following_issues, :close_duplicates, :update_done_ratio_from_issue_status
after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal after_save :update_nested_set_attributes, :update_parent_attributes, :create_journal
after_destroy :destroy_children after_destroy :destroy_children
after_destroy :update_parent_attributes after_destroy :update_parent_attributes
@@ -245,7 +245,7 @@ class Issue < ActiveRecord::Base
end end
def done_ratio def done_ratio
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
status.default_done_ratio status.default_done_ratio
else else
read_attribute(:done_ratio) read_attribute(:done_ratio)
@@ -308,7 +308,7 @@ class Issue < ActiveRecord::Base
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios # Set the done_ratio using the status if that setting is set. This will keep the done_ratios
# even if the user turns off the setting later # even if the user turns off the setting later
def update_done_ratio_from_issue_status def update_done_ratio_from_issue_status
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
self.done_ratio = status.default_done_ratio self.done_ratio = status.default_done_ratio
end end
end end
@@ -357,17 +357,10 @@ class Issue < ActiveRecord::Base
def overdue? def overdue?
!due_date.nil? && (due_date < Date.today) && !status.is_closed? !due_date.nil? && (due_date < Date.today) && !status.is_closed?
end end
# Does this issue have children?
def children?
!leaf?
end
# Users the issue can be assigned to # Users the issue can be assigned to
def assignable_users def assignable_users
users = project.assignable_users project.assignable_users
users << author if author
users.uniq.sort
end end
# Versions that the issue can be assigned to # Versions that the issue can be assigned to
@@ -691,7 +684,7 @@ class Issue < ActiveRecord::Base
end end
# done ratio = weighted average ratio of leaves # done ratio = weighted average ratio of leaves
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio?
leaves_count = p.leaves.count leaves_count = p.leaves.count
if leaves_count > 0 if leaves_count > 0
average = p.leaves.average(:estimated_hours).to_f average = p.leaves.average(:estimated_hours).to_f
@@ -828,7 +821,7 @@ class Issue < ActiveRecord::Base
j.id as #{select_field}, j.id as #{select_field},
count(i.id) as total count(i.id) as total
from from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} j #{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} as j
where where
i.status_id=s.id i.status_id=s.id
and #{where} and #{where}
+1 -8
View File
@@ -17,10 +17,8 @@
class IssueStatus < ActiveRecord::Base class IssueStatus < ActiveRecord::Base
before_destroy :check_integrity before_destroy :check_integrity
has_many :workflows, :foreign_key => "old_status_id" has_many :workflows, :foreign_key => "old_status_id", :dependent => :delete_all
acts_as_list acts_as_list
before_destroy :delete_workflows
validates_presence_of :name validates_presence_of :name
validates_uniqueness_of :name validates_uniqueness_of :name
@@ -91,9 +89,4 @@ private
def check_integrity def check_integrity
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id]) raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
end end
# Deletes associated workflows
def delete_workflows
Workflow.delete_all(["old_status_id = :id OR new_status_id = :id", {:id => id}])
end
end end
-8
View File
@@ -65,12 +65,4 @@ class Journal < ActiveRecord::Base
def attachments def attachments
journalized.respond_to?(:attachments) ? journalized.attachments : nil journalized.respond_to?(:attachments) ? journalized.attachments : nil
end end
# Returns a string of css classes
def css_classes
s = 'journal'
s << ' has-notes' unless notes.blank?
s << ' has-details' unless details.blank?
s
end
end end
+1 -6
View File
@@ -15,8 +15,6 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'ar_condition'
class Mailer < ActionMailer::Base class Mailer < ActionMailer::Base
layout 'mailer' layout 'mailer'
helper :application helper :application
@@ -82,7 +80,7 @@ class Mailer < ActionMailer::Base
def reminder(user, issues, days) def reminder(user, issues, days)
set_language_if_valid user.language set_language_if_valid user.language
recipients user.mail recipients user.mail
subject l(:mail_subject_reminder, :count => issues.size, :days => days) subject l(:mail_subject_reminder, issues.size)
body :issues => issues, body :issues => issues,
:days => days, :days => days,
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc') :issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')
@@ -308,16 +306,13 @@ class Mailer < ActionMailer::Base
# * :days => how many days in the future to remind about (defaults to 7) # * :days => how many days in the future to remind about (defaults to 7)
# * :tracker => id of tracker for filtering issues (defaults to all trackers) # * :tracker => id of tracker for filtering issues (defaults to all trackers)
# * :project => id or identifier of project to process (defaults to all projects) # * :project => id or identifier of project to process (defaults to all projects)
# * :users => array of user ids who should be reminded
def self.reminders(options={}) def self.reminders(options={})
days = options[:days] || 7 days = options[:days] || 7
project = options[:project] ? Project.find(options[:project]) : nil project = options[:project] ? Project.find(options[:project]) : nil
tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
user_ids = options[:users]
s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date] s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
s << "#{Issue.table_name}.assigned_to_id IS NOT NULL" s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
s << ["#{Issue.table_name}.assigned_to_id IN (?)", user_ids] if user_ids.present?
s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}" s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
s << "#{Issue.table_name}.project_id = #{project.id}" if project s << "#{Issue.table_name}.project_id = #{project.id}" if project
s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
+1 -1
View File
@@ -82,7 +82,7 @@ class Member < ActiveRecord::Base
protected protected
def validate def validate
errors.add_on_empty :role if member_roles.empty? && roles.empty? errors.add_to_base "Role can't be blank" if member_roles.empty? && roles.empty?
end end
private private
+1 -5
View File
@@ -33,11 +33,7 @@ class Principal < ActiveRecord::Base
} }
before_create :set_default_empty_values before_create :set_default_empty_values
def name(formatter = nil)
to_s
end
def <=>(principal) def <=>(principal)
if self.class.name == principal.class.name if self.class.name == principal.class.name
self.to_s.downcase <=> principal.to_s.downcase self.to_s.downcase <=> principal.to_s.downcase
+1 -18
View File
@@ -412,15 +412,7 @@ class Project < ActiveRecord::Base
def short_description(length = 255) def short_description(length = 255)
description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
end end
def css_classes
s = 'project'
s << ' root' if root?
s << ' child' if child?
s << (leaf? ? ' leaf' : ' parent')
s
end
# Return true if this project is allowed to do the specified action. # Return true if this project is allowed to do the specified action.
# action can be: # action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
@@ -449,15 +441,6 @@ class Project < ActiveRecord::Base
enabled_modules.clear enabled_modules.clear
end end
end end
# Returns an array of projects that are in this project's hierarchy
#
# Example: parents, children, siblings
def hierarchy
parents = project.self_and_ancestors || []
descendants = project.descendants || []
project_hierarchy = parents | descendants # Set union
end
# Returns an auto-generated project identifier based on the last identifier used # Returns an auto-generated project identifier based on the last identifier used
def self.next_identifier def self.next_identifier
+1 -7
View File
@@ -187,7 +187,7 @@ class Query < ActiveRecord::Base
if project if project
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] } user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
else else
project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id) project_ids = User.current.projects.collect(&:id)
if project_ids.any? if project_ids.any?
# members of the user's projects # members of the user's projects
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] } user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
@@ -219,12 +219,6 @@ class Query < ActiveRecord::Base
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } } @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
end end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true})) add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
# project filter
project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
["#{pre}#{p.name}",p.id.to_s]
end
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
end end
@available_filters @available_filters
end end
-16
View File
@@ -81,20 +81,4 @@ class TimeEntry < ActiveRecord::Base
yield yield
end end
end end
def self.earilest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.minimum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
def self.latest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.maximum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
end end
-34
View File
@@ -79,10 +79,6 @@ class User < Principal
super super
end end
def mail=(arg)
write_attribute(:mail, arg.to_s.strip)
end
def identity_url=(url) def identity_url=(url)
if url.blank? if url.blank?
write_attribute(:identity_url, '') write_attribute(:identity_url, '')
@@ -164,30 +160,6 @@ class User < Principal
self.status == STATUS_LOCKED self.status == STATUS_LOCKED
end end
def activate
self.status = STATUS_ACTIVE
end
def register
self.status = STATUS_REGISTERED
end
def lock
self.status = STATUS_LOCKED
end
def activate!
update_attribute(:status, STATUS_ACTIVE)
end
def register!
update_attribute(:status, STATUS_REGISTERED)
end
def lock!
update_attribute(:status, STATUS_LOCKED)
end
def check_password?(clear_password) def check_password?(clear_password)
if auth_source_id.present? if auth_source_id.present?
auth_source.authenticate(self.login, clear_password) auth_source.authenticate(self.login, clear_password)
@@ -352,12 +324,6 @@ class User < Principal
false false
end end
end end
# Is the user allowed to do the specified action on any project?
# See allowed_to? for the actions and valid options.
def allowed_to_globally?(action, options)
allowed_to?(action, nil, options.reverse_merge(:global => true))
end
def self.current=(user) def self.current=(user)
@current_user = user @current_user = user
+18 -3
View File
@@ -1,5 +1,20 @@
<div id="admin-menu"> <div id="admin-menu">
<ul> <ul>
<%= render_menu :admin_menu %> <li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %></li>
</ul> <li><%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %></li>
<li><%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %></li>
<li><%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %></li>
<li><%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %></li>
<li><%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %></li>
<li><%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %></li>
<li><%= link_to l(:label_workflow), {:controller => 'workflows', :action => 'edit'}, :class => 'workflows' %></li>
<li><%= link_to l(:label_custom_field_plural), {:controller => 'custom_fields'}, :class => 'custom_fields' %></li>
<li><%= link_to l(:label_enumerations), {:controller => 'enumerations'}, :class => 'enumerations' %></li>
<li><%= link_to l(:label_settings), {:controller => 'settings'}, :class => 'settings' %></li>
<% menu_items_for(:admin_menu) do |item| -%>
<li><%= link_to h(item.caption), item.url, item.html_options %></li>
<% end -%>
<li><%= link_to l(:label_plugins), {:controller => 'admin', :action => 'plugins'}, :class => 'plugins' %></li>
<li><%= link_to l(:label_information_plural), {:controller => 'admin', :action => 'info'}, :class => 'info' %></li>
</ul>
</div> </div>
+3 -3
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %> <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_project_plural)%></h2> <h2><%=l(:label_project_plural)%></h2>
@@ -26,8 +26,8 @@
</tr></thead> </tr></thead>
<tbody> <tbody>
<% project_tree(@projects) do |project, level| %> <% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr class="<%= cycle("odd", "even") %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= link_to_project(project, :action => 'settings') %></td> <td class="name"><%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %></td>
<td><%= textilizable project.short_description, :project => project %></td> <td><%= textilizable project.short_description, :project => project %></td>
<td align="center"><%= checked_image project.is_public? %></td> <td align="center"><%= checked_image project.is_public? %></td>
<td align="center"><%= format_date(project.created_on) %></td> <td align="center"><%= format_date(project.created_on) %></td>
+2 -1
View File
@@ -1,5 +1,6 @@
<span id="attachments_fields"> <span id="attachments_fields">
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%><label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %> <%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%>
<label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
</label> </label>
</span> </span>
<br /> <br />
+2 -2
View File
@@ -30,11 +30,11 @@
</table> </table>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_messages => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %> <%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
<% end %> <% end %>
<% html_title l(:label_board_plural) %> <% html_title l(:label_board_plural) %>
+11 -4
View File
@@ -9,7 +9,14 @@
</fieldset> </fieldset>
<p style="float:right;"> <p style="float:right;">
<%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %> <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
{:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
{:href => url_for(:action => 'show', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
%> |
<%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
{:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
{:href => url_for(:action => 'show', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
%>
</p> </p>
<p class="buttons"> <p class="buttons">
@@ -36,9 +43,9 @@
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %> <%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
<p class="legend cal"> <p class="legend cal">
<span class="starting"><%= l(:text_tip_issue_begin_day) %></span> <span class="starting"><%= l(:text_tip_task_begin_day) %></span>
<span class="ending"><%= l(:text_tip_issue_end_day) %></span> <span class="ending"><%= l(:text_tip_task_end_day) %></span>
<span class="starting ending"><%= l(:text_tip_issue_begin_end_day) %></span> <span class="starting ending"><%= l(:text_tip_task_begin_end_day) %></span>
</p> </p>
<% end %> <% end %>
+1 -1
View File
@@ -29,7 +29,7 @@
<% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %> <% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_user_new)%></legend> <fieldset><legend><%=l(:label_user_new)%></legend>
<p><%= label_tag "user_search", l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p> <p><%= text_field_tag 'user_search', nil %></p>
<%= observe_field(:user_search, <%= observe_field(:user_search,
:frequency => 0.5, :frequency => 0.5,
:update => :users, :update => :users,
+3 -3
View File
@@ -4,7 +4,7 @@
<% replace_watcher ||= 'watcher' %> <% replace_watcher ||= 'watcher' %>
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %> <%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %> <%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
<%= link_to_if_authorized l(:button_copy), {:controller => 'issue_moves', :action => 'new', :id => @issue, :copy_options => {:copy => 't'}}, :class => 'icon icon-copy' %> <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'move', :id => @issue, :copy_options => {:copy => 't'} }, :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), {:controller => 'issue_moves', :action => 'new', :id => @issue}, :class => 'icon icon-move' %> <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
</div> </div>
+2 -2
View File
@@ -23,7 +23,7 @@
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'), <%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
l(:label_version_new), l(:label_version_new),
'version[name]', 'version[name]',
{:controller => 'versions', :action => 'create', :project_id => @project}, {:controller => 'versions', :action => 'new', :project_id => @project},
:title => l(:label_version_new), :title => l(:label_version_new),
:tabindex => 200) if authorize_for('versions', 'new') %> :tabindex => 200) if authorize_for('versions', 'new') %>
</p> </p>
@@ -40,6 +40,6 @@
</div> </div>
<div style="clear:both;"> </div> <div style="clear:both;"> </div>
<%= render :partial => 'issues/form_custom_fields' %> <%= render :partial => 'form_custom_fields' %>
<% end %> <% end %>
+1 -3
View File
@@ -3,8 +3,6 @@
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}", <p><%= link_to("#{l(:label_revision)} #{changeset.revision}",
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br /> :controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br />
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p> <span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
<div class="changeset-changes"> <%= textilizable(changeset, :comments) %>
<%= textilizable(changeset, :comments) %>
</div>
</div> </div>
<% end %> <% end %>
+1 -1
View File
@@ -44,7 +44,7 @@
<%= f.hidden_field :lock_version %> <%= f.hidden_field :lock_version %>
<%= submit_tag l(:button_submit) %> <%= submit_tag l(:button_submit) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_issue_path(:project_id => @project, :id => @issue), { :url => { :controller => 'issues', :action => 'preview', :project_id => @project, :id => @issue },
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => 'Form.serialize("issue-form")', :with => 'Form.serialize("issue-form")',
+10 -9
View File
@@ -1,17 +1,18 @@
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>> <div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p> <p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
<%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue }, <%= observe_field :issue_tracker_id, :url => { :action => :update_form, :project_id => @project, :id => @issue },
:update => :attributes, :update => :attributes,
:with => "Form.serialize('issue-form')" %> :with => "Form.serialize('issue-form')" %>
<p><%= f.text_field :subject, :size => 80, :required => true %></p> <p><%= f.text_field :subject, :size => 80, :required => true %></p>
<% if User.current.allowed_to?(:manage_subtasks, @project) %> <% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p> <p><%= f.text_field :parent_issue_id, :size => 10 %></p>
<div id="parent_issue_candidates" class="autocomplete"></div> <div id="parent_issue_candidates" class="autocomplete"></div>
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %> <%= javascript_tag "observeParentIssueField('#{url_for(:controller => :issues,
:action => :auto_complete,
:id => @issue,
:project_id => @project) }')" %>
<% end %> <% end %>
<p><%= f.text_area :description, <p><%= f.text_area :description,
@@ -22,15 +23,15 @@
</div> </div>
<div id="attributes" class="attributes"> <div id="attributes" class="attributes">
<%= render :partial => 'issues/attributes' %> <%= render :partial => 'attributes' %>
</div> </div>
<% if @issue.new_record? %> <% if @issue.new_record? %>
<p id="attachments_form"><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p> <p><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
<% end %> <% end %>
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%> <% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
<p id="watchers_form"><label><%= l(:label_issue_watchers) %></label> <p><label><%= l(:label_issue_watchers) %></label>
<% @issue.project.users.sort.each do |user| -%> <% @issue.project.users.sort.each do |user| -%>
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label> <label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label>
<% end -%> <% end -%>
+2 -2
View File
@@ -1,7 +1,7 @@
<% reply_links = authorize_for('issues', 'edit') -%> <% reply_links = authorize_for('issues', 'edit') -%>
<% for journal in journals %> <% for journal in journals %>
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>"> <div id="change-<%= journal.id %>" class="journal">
<h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div> <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
<%= avatar(journal.user, :size => "24") %> <%= avatar(journal.user, :size => "24") %>
<%= content_tag('a', '', :name => "note-#{journal.indice}")%> <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4> <%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>
+2 -2
View File
@@ -3,7 +3,7 @@
<div class="autoscroll"> <div class="autoscroll">
<table class="list issues"> <table class="list issues">
<thead><tr> <thead><tr>
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;', <th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %> :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th> </th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %> <%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
@@ -25,7 +25,7 @@
<% previous_group = group %> <% previous_group = group %>
<% end %> <% end %>
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> <td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
</tr> </tr>
+1 -1
View File
@@ -14,7 +14,7 @@
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %> <%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
</td> </td>
<td class="project"><%= link_to_project(issue.project) %></td> <td class="project"><%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %></td>
<td class="tracker"><%=h issue.tracker %></td> <td class="tracker"><%=h issue.tracker %></td>
<td class="subject"> <td class="subject">
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>) <%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)
+1 -2
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<% if authorize_for('issue_relations', 'new') %> <% if authorize_for('issue_relations', 'new') %>
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %> <%= toggle_link l(:button_add), 'new-relation-form'%>
<% end %> <% end %>
</div> </div>
@@ -28,7 +28,6 @@
<% remote_form_for(:relation, @relation, <% remote_form_for(:relation, @relation,
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue}, :url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
:method => :post, :method => :post,
:complete => "Form.Element.focus('relation_issue_to_id');",
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %> :html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%> <%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
<% end %> <% end %>
+1 -1
View File
@@ -6,7 +6,7 @@
<%= call_hook(:view_issues_sidebar_issues_bottom) %> <%= call_hook(:view_issues_sidebar_issues_bottom) %>
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %> <% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
<%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br /> <%= link_to(l(:label_calendar), :controller => 'issues', :action => 'calendar', :project_id => @project) %><br />
<% end %> <% end %>
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> <% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br /> <%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br />
+1 -1
View File
@@ -2,7 +2,7 @@
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul> <ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
<% form_tag(:action => 'bulk_update') do %> <% form_tag() do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular"> <div class="box tabular">
<fieldset class="attributes"> <fieldset class="attributes">
@@ -4,22 +4,19 @@
<% if !@issue.nil? -%> <% if !@issue.nil? -%>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, <li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue},
:class => 'icon-edit', :disabled => !@can[:edit] %></li> :class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% else %>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %>
<% if @allowed_statuses.present? %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a> <a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul> <ul>
<% @statuses.each do |s| -%> <% @statuses.each do |s| -%>
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {:status_id => s}, :back_url => @back}, :method => :post, <li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}, :back_url => @back}, :method => :post,
:selected => (@issue && s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li> :selected => (s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %> <% else %>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %>
<% unless @trackers.nil? %> <% unless @trackers.nil? %>
<li class="folder"> <li class="folder">
@@ -32,19 +29,15 @@
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% if @projects.size == 1 %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a> <a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul> <ul>
<% @priorities.each do |p| -%> <% @priorities.each do |p| -%>
<li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post, <li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.priority), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li> :selected => (@issue && p == @issue.priority), :disabled => !@can[:edit] %></li>
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %>
<% unless @project.nil? || @project.shared_versions.open.empty? -%> <% unless @project.nil? || @project.shared_versions.open.empty? -%>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a> <a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
@@ -58,7 +51,7 @@
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% if @assignables.present? -%> <% unless @assignables.nil? || @assignables.empty? -%>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_assigned_to) %></a> <a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
<ul> <ul>
@@ -84,19 +77,17 @@
</ul> </ul>
</li> </li>
<% end -%> <% end -%>
<% if Issue.use_field_for_done_ratio? %>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a> <a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul> <ul>
<% (0..10).map{|x|x*10}.each do |p| -%> <% (0..10).map{|x|x*10}.each do |p| -%>
<li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post, <li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.done_ratio), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li> :selected => (@issue && p == @issue.done_ratio), :disabled => !@can[:edit] %></li>
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% if !@issue.nil? %> <% if !@issue.nil? %>
<% if @can[:log_time] -%> <% if @can[:log_time] -%>
<li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, <li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
@@ -111,9 +102,9 @@
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue}, <li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li> :class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
<% end %> <% end %>
<li><%= context_menu_link l(:button_copy), new_issue_move_path(:ids => @issues.collect(&:id), :copy_options => {:copy => 't'}), <li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id), :copy_options => {:copy => 't'}},
:class => 'icon-copy', :disabled => !@can[:move] %></li> :class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)), <li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id)},
:class => 'icon-move', :disabled => !@can[:move] %></li> :class => 'icon-move', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)}, <li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li> :method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>
+2 -3
View File
@@ -39,7 +39,6 @@
{ :url => { :set_filter => 1 }, { :url => { :set_filter => 1 },
:before => 'selectAllOptions("selected_columns");', :before => 'selectAllOptions("selected_columns");',
:update => "content", :update => "content",
:complete => "apply_filters_observer()",
:with => "Form.serialize('query_form')" :with => "Form.serialize('query_form')"
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
@@ -79,7 +78,7 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %> <%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
<%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %> <%= auto_discovery_link_tag(:atom, {:action => 'changes', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
<% end %> <% end %>
<%= context_menu issues_context_menu_path %> <%= context_menu :controller => 'issues', :action => 'context_menu' %>
@@ -6,14 +6,14 @@
<% end -%> <% end -%>
</ul> </ul>
<% form_tag({:action => 'create'}, :id => 'move_form') do %> <% form_tag({}, :id => 'move_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular"> <div class="box tabular">
<p><label for="new_project_id"><%=l(:field_project)%>:</label> <p><label for="new_project_id"><%=l(:field_project)%>:</label>
<%= select_tag "new_project_id", <%= select_tag "new_project_id",
project_tree_options_for_select(@allowed_projects, :selected => @target_project), project_tree_options_for_select(@allowed_projects, :selected => @target_project),
:onchange => remote_function(:url => { :action => 'new' }, :onchange => remote_function(:url => { :action => 'move' },
:method => :get, :method => :get,
:update => 'content', :update => 'content',
:with => "Form.serialize('move_form')") %></p> :with => "Form.serialize('move_form')") %></p>
@@ -33,11 +33,6 @@
<%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %> <%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
</p> </p>
<p>
<label><%= l(:field_priority) %></label>
<%= select_tag('priority_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.all, :id, :name)) %>
</p>
<p> <p>
<label><%= l(:field_start_date) %></label> <label><%= l(:field_start_date) %></label>
<%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %> <%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %>
@@ -48,11 +43,6 @@
<%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %> <%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %>
</p> </p>
<fieldset><legend><%= l(:field_notes) %></legend>
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'notes' %>
</fieldset>
<%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %> <%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %>
</div> </div>
+2 -2
View File
@@ -1,7 +1,7 @@
<h2><%=l(:label_issue_new)%></h2> <h2><%=l(:label_issue_new)%></h2>
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project}, <% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
:html => {:multipart => true, :id => 'issue-form', :class => 'tabular new-issue-form'} do |f| %> :html => {:multipart => true, :id => 'issue-form'} do |f| %>
<%= error_messages_for 'issue' %> <%= error_messages_for 'issue' %>
<div class="box"> <div class="box">
<%= render :partial => 'issues/form', :locals => {:f => f} %> <%= render :partial => 'issues/form', :locals => {:f => f} %>
@@ -9,7 +9,7 @@
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %> <%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_issue_path(:project_id => @project), { :url => { :controller => 'issues', :action => 'preview', :project_id => @project },
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('issue-form')", :with => "Form.serialize('issue-form')",
+1 -2
View File
@@ -128,7 +128,6 @@
<%= stylesheet_link_tag 'scm' %> <%= stylesheet_link_tag 'scm' %>
<%= javascript_include_tag 'context_menu' %> <%= javascript_include_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu' %> <%= stylesheet_link_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu_rtl' if l(:direction) == 'rtl' %>
<% end %> <% end %>
<div id="context-menu" style="display: none;"></div> <div id="context-menu" style="display: none;"></div>
<%= javascript_tag "new ContextMenu('#{issues_context_menu_path}')" %> <%= javascript_tag "new ContextMenu('#{url_for(:controller => 'issues', :action => 'context_menu')}')" %>
+1 -3
View File
@@ -5,9 +5,7 @@
<title><%=h html_title %></title> <title><%=h html_title %></title>
<meta name="description" content="<%= Redmine::Info.app_name %>" /> <meta name="description" content="<%= Redmine::Info.app_name %>" />
<meta name="keywords" content="issue,bug,tracker" /> <meta name="keywords" content="issue,bug,tracker" />
<%= favicon %>
<%= stylesheet_link_tag 'application', :media => 'all' %> <%= stylesheet_link_tag 'application', :media => 'all' %>
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
<%= javascript_include_tag :defaults %> <%= javascript_include_tag :defaults %>
<%= heads_for_wiki_formatter %> <%= heads_for_wiki_formatter %>
<!--[if IE]> <!--[if IE]>
@@ -20,7 +18,7 @@
<!-- page specific tags --> <!-- page specific tags -->
<%= yield :header_tags -%> <%= yield :header_tags -%>
</head> </head>
<body class="<%= body_css_classes %>"> <body>
<div id="wrapper"> <div id="wrapper">
<div id="wrapper2"> <div id="wrapper2">
<div id="top-menu"> <div id="top-menu">
+1 -1
View File
@@ -30,7 +30,7 @@
</div> </div>
<h4> <h4>
<%= avatar(message.author, :size => "24") %> <%= avatar(message.author, :size => "24") %>
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :r => message, :anchor => "message-#{message.id}" } %> <%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :anchor => "message-#{message.id}" } %>
- -
<%= authoring message.created_on, message.author %> <%= authoring message.created_on, message.author %>
</h4> </h4>
+1 -1
View File
@@ -1,4 +1,4 @@
<p><%= link_to_project(news.project) + ': ' unless @project %> <p><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
<br /> <br />
-4
View File
@@ -12,7 +12,3 @@
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
<% end %> <% end %>
<div id="preview" class="wiki"></div> <div id="preview" class="wiki"></div>
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
+1 -2
View File
@@ -28,7 +28,7 @@
<p class="nodata"><%= l(:label_no_data) %></p> <p class="nodata"><%= l(:label_no_data) %></p>
<% else %> <% else %>
<% @newss.each do |news| %> <% @newss.each do |news| %>
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %> <h3><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
<p class="author"><%= authoring news.created_on, news.author %></p> <p class="author"><%= authoring news.created_on, news.author %></p>
@@ -45,7 +45,6 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %> <%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
<%= stylesheet_link_tag 'scm' %>
<% end %> <% end %>
<% html_title(l(:label_news_plural)) -%> <% html_title(l(:label_news_plural)) -%>
+1 -1
View File
@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :project, @project, :url => { :action => "update", :id => @project } do |f| %> <% labelled_tabular_form_for :project, @project, :url => { :action => "edit", :id => @project } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+2 -2
View File
@@ -2,14 +2,14 @@
<div class="box"> <div class="box">
<!--[form:project]--> <!--[form:project]-->
<p><%= f.text_field :name, :required => true, :maxlength => 30 %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p> <p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<% unless @project.allowed_parents.compact.empty? %> <% unless @project.allowed_parents.compact.empty? %>
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p> <p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
<% end %> <% end %>
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p> <p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen?, :maxlength => 20 %> <p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
<% unless @project.identifier_frozen? %> <% unless @project.identifier_frozen? %>
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em> <br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
<% end %></p> <% end %></p>
-8
View File
@@ -1,8 +0,0 @@
<% if @users_by_role.any? %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>
@@ -1,6 +1,6 @@
<h2><%=l(:label_project_new)%></h2> <h2><%=l(:label_project_new)%></h2>
<% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %> <% labelled_tabular_form_for :project, @project, :url => { :action => "add" } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend> <fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %> <%= error_messages_for 'attachment' %>
<div class="box"> <div class="box">
<% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %> <% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %>
<% if @versions.any? %> <% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label> <p><label for="version_id"><%=l(:field_version)%></label>
+2 -2
View File
@@ -3,10 +3,10 @@
<% end %> <% end %>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %> <%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
<%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %> <%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
<%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %> <%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
<%= link_to l(:label_overall_activity), { :controller => 'activities', :action => 'index' }%> <%= link_to l(:label_overall_activity), { :controller => 'projects', :action => 'activity' }%>
</div> </div>
<h2><%=l(:label_project_plural)%></h2> <h2><%=l(:label_project_plural)%></h2>
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'files', :action => 'new', :id => @project}, :class => 'icon icon-add' %> <%= link_to_if_authorized l(:label_attachment_new), {:controller => 'projects', :action => 'add_file', :id => @project}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_attachment_plural)%></h2> <h2><%=l(:label_attachment_plural)%></h2>
@@ -51,4 +51,4 @@
<% html_title(l(:label_roadmap)) %> <% html_title(l(:label_roadmap)) %>
<%= context_menu issues_context_menu_path %> <%= context_menu :controller => 'issues', :action => 'context_menu' %>
@@ -1,4 +1,4 @@
<% form_tag({:controller => 'project_enumerations', :action => 'save', :id => @project}, :class => "tabular") do %> <% form_tag({:controller => 'projects', :action => 'save_activities', :id => @project}, :class => "tabular") do %>
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
@@ -32,7 +32,7 @@
</table> </table>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project}, <%= link_to(l(:button_reset), {:controller => 'projects', :action => 'reset_activities', :id => @project},
:method => :delete, :method => :delete,
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:class => 'icon icon-del') %> :class => 'icon icon-del') %>
+1 -1
View File
@@ -58,7 +58,7 @@
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %> <% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_member_new)%></legend> <fieldset><legend><%=l(:label_member_new)%></legend>
<p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p> <p><%= text_field_tag 'principal_search', nil %></p>
<%= observe_field(:principal_search, <%= observe_field(:principal_search,
:frequency => 0.5, :frequency => 0.5,
:update => :principals, :update => :principals,
+2 -2
View File
@@ -6,7 +6,7 @@
<th><%= l(:field_description) %></th> <th><%= l(:field_description) %></th>
<th><%= l(:field_status) %></th> <th><%= l(:field_status) %></th>
<th><%= l(:field_sharing) %></th> <th><%= l(:field_sharing) %></th>
<th><%= l(:label_wiki_page) %></th> <th><%= l(:label_wiki_page) unless @project.wiki.nil? %></th>
<th style="width:15%"></th> <th style="width:15%"></th>
</tr></thead> </tr></thead>
<tbody> <tbody>
@@ -17,7 +17,7 @@
<td class="description"><%=h version.description %></td> <td class="description"><%=h version.description %></td>
<td class="status"><%= l("version_status_#{version.status}") %></td> <td class="status"><%= l("version_status_#{version.status}") %></td>
<td class="sharing"><%=h format_version_sharing(version.sharing) %></td> <td class="sharing"><%=h format_version_sharing(version.sharing) %></td>
<td><%= link_to_if_authorized(h(version.wiki_page_title), {:controller => 'wiki', :action => 'index', :id => version.project, :page => Wiki.titleize(version.wiki_page_title)}) || h(version.wiki_page_title) unless version.wiki_page_title.blank? || version.project.wiki.nil? %></td> <td><%= link_to(h(version.wiki_page_title), :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td>
<td class="buttons"> <td class="buttons">
<% if version.project == @project %> <% if version.project == @project %>
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
+10 -3
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<% if User.current.allowed_to?(:add_subprojects, @project) %> <% if User.current.allowed_to?(:add_subprojects, @project) %>
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'new', :parent_id => @project}, :class => 'icon icon-add' %> <%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'add', :parent_id => @project}, :class => 'icon icon-add' %>
<% end %> <% end %>
</div> </div>
@@ -51,7 +51,14 @@
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<%= render :partial => 'members_box' %> <% if @users_by_role.any? %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>
<% if @news.any? && authorize_for('news', 'index') %> <% if @news.any? && authorize_for('news', 'index') %>
<div class="news box"> <div class="news box">
@@ -74,7 +81,7 @@
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :key => User.current.rss_key}) %> <%= auto_discovery_link_tag(:atom, {:action => 'activity', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
<% end %> <% end %>
<% html_title(l(:label_overview)) -%> <% html_title(l(:label_overview)) -%>
-12
View File
@@ -53,18 +53,6 @@ function toggle_multi_select(field) {
select.multiple = true; select.multiple = true;
} }
} }
function apply_filters_observer() {
$$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
if(e.keyCode == Event.KEY_RETURN) {
<%= remote_function(:url => { :set_filter => 1},
:update => "content",
:with => "Form.serialize('query_form')",
:complete => "e.stop(); apply_filters_observer()") %>
}
});
}
Event.observe(document,"dom:loaded", apply_filters_observer);
//]]> //]]>
</script> </script>
+1 -1
View File
@@ -1,7 +1,7 @@
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2> <h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2>
<!-- Choose view type --> <!-- Choose view type -->
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %> <% form_tag({}, :method => 'get') do %>
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %> <%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %> <%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
<p><label><%= l(:label_view_diff) %></label> <p><label><%= l(:label_view_diff) %></label>
+2 -2
View File
@@ -3,7 +3,7 @@
<div class="box tabular settings"> <div class="box tabular settings">
<p><%= setting_check_box :login_required %></p> <p><%= setting_check_box :login_required %></p>
<p><%= setting_select :autologin, [[l(:label_disabled), 0]] + [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]} %></p> <p><%= setting_select :autologin, [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]}, :blank => :label_disabled %></p>
<p><%= setting_select :self_registration, [[l(:label_disabled), "0"], <p><%= setting_select :self_registration, [[l(:label_disabled), "0"],
[l(:label_registration_activation_by_email), "1"], [l(:label_registration_activation_by_email), "1"],
@@ -20,7 +20,7 @@
</div> </div>
<div style="float:right;"> <div style="float:right;">
<%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'icon icon-server-authentication' %> <%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %>
</div> </div>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
+1 -1
View File
@@ -1,7 +1,7 @@
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %> <% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<% if @user.active? -%> <% if @user.active? -%>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p> <p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label>
<% end -%> <% end -%>
<p><%= submit_tag l(:button_save) %></p> <p><%= submit_tag l(:button_save) %></p>
<% end %> <% end %>
+1 -3
View File
@@ -14,9 +14,7 @@
<% @user.memberships.each do |membership| %> <% @user.memberships.each do |membership| %>
<% next if membership.new_record? %> <% next if membership.new_record? %>
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class"> <tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
<td class="project"> <td class="project"><%=h membership.project %></td>
<%= link_to_project membership.project %>
</td>
<td class="roles"> <td class="roles">
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span> <span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership }, <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },
+4 -4
View File
@@ -24,7 +24,7 @@
<h3><%=l(:label_project_plural)%></h3> <h3><%=l(:label_project_plural)%></h3>
<ul> <ul>
<% for membership in @memberships %> <% for membership in @memberships %>
<li><%= link_to_project(membership.project) %> <li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li> (<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
<% end %> <% end %>
</ul> </ul>
@@ -35,7 +35,7 @@
<div class="splitcontentright"> <div class="splitcontentright">
<% unless @events_by_day.empty? %> <% unless @events_by_day.empty? %>
<h3><%= link_to l(:label_activity), :controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3> <h3><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
<p> <p>
<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %> <%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
@@ -57,11 +57,11 @@
</div> </div>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :user_id => @user, :format => :atom, :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
<% end %> <% end %>
<% end %> <% end %>
<%= call_hook :view_account_right_bottom, :user => @user %> <%= call_hook :view_account_right_bottom, :user => @user %>
+1 -1
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version)%></h2> <h2><%=l(:label_version)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'update', :id => @version } do |f| %> <% labelled_tabular_form_for :version, @version, :url => { :action => 'edit' } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+2 -2
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version_new)%></h2> <h2><%=l(:label_version_new)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'create', :project_id => @project } do |f| %> <% labelled_tabular_form_for :version, @version, :url => { :action => 'new' } do |f| %>
<%= render :partial => 'versions/form', :locals => { :f => f } %> <%= render :partial => 'versions/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<% end %> <% end %>
+5 -3
View File
@@ -1,6 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
<%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :id => @version.project, :page => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %>
<%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %> <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
</div> </div>
@@ -33,10 +32,13 @@
<%= render :partial => 'versions/overview', :locals => {:version => @version} %> <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %> <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
<% if @issues.present? %> <% issues = @version.fixed_issues.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
<% if issues.size > 0 %>
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend> <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
<ul> <ul>
<% @issues.each do |issue| -%> <% issues.each do |issue| -%>
<li><%= link_to_issue(issue) %></li> <li><%= link_to_issue(issue) %></li>
<% end -%> <% end -%>
</ul> </ul>
+2 -2
View File
@@ -20,7 +20,7 @@
<% for project in @projects %> <% for project in @projects %>
<% @project = project %> <% @project = project %>
<li> <li>
<%= link_to_project project %> (<%= format_time(project.created_on) %>) <%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
<%= textilizable project.short_description, :project => project %> <%= textilizable project.short_description, :project => project %>
</li> </li>
<% end %> <% end %>
@@ -34,6 +34,6 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'}, <%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_news_latest)}") %> :title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :key => User.current.rss_key, :format => 'atom'}, <%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_activity)}") %> :title => "#{Setting.app_title}: #{l(:label_activity)}") %>
<% end %> <% end %>
+2 -2
View File
@@ -23,11 +23,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %> <% end %>
+2 -2
View File
@@ -16,11 +16,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %> <% end %>
+1 -9
View File
@@ -4,17 +4,9 @@
# Code is not reloaded between requests # Code is not reloaded between requests
config.cache_classes = true config.cache_classes = true
#####
# Customize the default logger (http://ruby-doc.org/core/classes/Logger.html)
#
# Use a different logger for distributed setups # Use a different logger for distributed setups
# config.logger = SyslogLogger.new # config.logger = SyslogLogger.new
#
# Rotate logs bigger than 1MB, keeps no more than 7 rotated logs around.
# When setting a new Logger, make sure to set it's log level too.
#
# config.logger = Logger.new(config.log_path, 7, 1048576)
# config.logger.level = Logger::INFO
# Full error reports are disabled and caching is turned on # Full error reports are disabled and caching is turned on
config.action_controller.consider_all_requests_local = false config.action_controller.consider_all_requests_local = false
-14
View File
@@ -78,17 +78,3 @@ module AsynchronousMailer
end end
ActionMailer::Base.send :include, AsynchronousMailer ActionMailer::Base.send :include, AsynchronousMailer
# TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6.
# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
module I18n
module Backend
module Base
def warn_syntax_deprecation!
return if @skip_syntax_deprecation
warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\nDowngrade your i18n gem to 0.3.7 (everything above must be deinstalled) to remove this warning, see http://www.redmine.org/issues/5608 for more information."
@skip_syntax_deprecation = true
end
end
end
end
+273 -296
View File
@@ -1,5 +1,4 @@
bg: bg:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -9,12 +8,12 @@ bg:
short: "%b %d" short: "%b %d"
long: "%B %d, %Y" long: "%B %d, %Y"
day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота] day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб] abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
# Don't forget the nil at the beginning; there's no such thing as a 0th month # Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември] month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек] abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
# Used in date_select and datime_select. # Used in date_select and datime_select.
order: [ :year, :month, :day ] order: [ :year, :month, :day ]
@@ -31,44 +30,40 @@ bg:
distance_in_words: distance_in_words:
half_a_minute: "half a minute" half_a_minute: "half a minute"
less_than_x_seconds: less_than_x_seconds:
one: "по-малко от 1 секунда" one: "less than 1 second"
other: "по-малко от {{count}} секунди" other: "less than {{count}} seconds"
x_seconds: x_seconds:
one: "1 секунда" one: "1 second"
other: "{{count}} секунди" other: "{{count}} seconds"
less_than_x_minutes: less_than_x_minutes:
one: "по-малко от 1 минута" one: "less than a minute"
other: "по-малко от {{count}} минути" other: "less than {{count}} minutes"
x_minutes: x_minutes:
one: "1 минута" one: "1 minute"
other: "{{count}} минути" other: "{{count}} minutes"
about_x_hours: about_x_hours:
one: "около 1 час" one: "about 1 hour"
other: "около {{count}} часа" other: "about {{count}} hours"
x_days: x_days:
one: "1 ден" one: "1 day"
other: "{{count}} дена" other: "{{count}} days"
about_x_months: about_x_months:
one: "около 1 месец" one: "about 1 month"
other: "около {{count}} месеца" other: "about {{count}} months"
x_months: x_months:
one: "1 месец" one: "1 month"
other: "{{count}} месеца" other: "{{count}} months"
about_x_years: about_x_years:
one: "около 1 година" one: "about 1 year"
other: "около {{count}} години" other: "about {{count}} years"
over_x_years: over_x_years:
one: "над 1 година" one: "over 1 year"
other: "над {{count}} години" other: "over {{count}} years"
almost_x_years: almost_x_years:
one: "почти 1 година" one: "almost 1 year"
other: "почти {{count}} години" other: "almost {{count}} years"
number: number:
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
precision: 1 precision: 1
@@ -76,18 +71,18 @@ bg:
storage_units: storage_units:
format: "%n %u" format: "%n %u"
units: units:
kb: KB
tb: TB
gb: GB
byte: byte:
one: Byte one: Byte
other: Bytes other: Bytes
kb: "KB" mb: 'MB'
mb: "MB"
gb: "GB"
tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
sentence_connector: "и" sentence_connector: "and"
skip_last_comma: false skip_last_comma: false
activerecord: activerecord:
@@ -106,13 +101,13 @@ bg:
taken: "вече съществува" taken: "вече съществува"
not_a_number: "не е число" not_a_number: "не е число"
not_a_date: "е невалидна дата" not_a_date: "е невалидна дата"
greater_than: "трябва да бъде по-голям[a/о] от {{count}}" greater_than: "must be greater than {{count}}"
greater_than_or_equal_to: "трябва да бъде по-голям[a/о] от или равен[a/o] на {{count}}" greater_than_or_equal_to: "must be greater than or equal to {{count}}"
equal_to: "трябва да бъде равен[a/o] на {{count}}" equal_to: "must be equal to {{count}}"
less_than: "трябва да бъде по-малък[a/o] от {{count}}" less_than: "must be less than {{count}}"
less_than_or_equal_to: "трябва да бъде по-малък[a/o] от или равен[a/o] на {{count}}" less_than_or_equal_to: "must be less than or equal to {{count}}"
odd: "трябва да бъде нечетен[a/o]" odd: "must be odd"
even: "трябва да бъде четен[a/o]" even: "must be even"
greater_than_start_date: "трябва да е след началната дата" greater_than_start_date: "трябва да е след началната дата"
not_same_project: "не е от същия проект" not_same_project: "не е от същия проект"
circular_dependency: "Тази релация ще доведе до безкрайна зависимост" circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
@@ -170,7 +165,7 @@ bg:
field_mail: Email field_mail: Email
field_filename: Файл field_filename: Файл
field_filesize: Големина field_filesize: Големина
field_downloads: Изтеглени файлове field_downloads: Downloads
field_author: Автор field_author: Автор
field_created_on: От дата field_created_on: От дата
field_updated_on: Обновена field_updated_on: Обновена
@@ -185,10 +180,10 @@ bg:
field_title: Заглавие field_title: Заглавие
field_project: Проект field_project: Проект
field_issue: Задача field_issue: Задача
field_status: Състояние field_status: Статус
field_notes: Бележка field_notes: Бележка
field_is_closed: Затворена задача field_is_closed: Затворена задача
field_is_default: Състояние по подразбиране field_is_default: Статус по подразбиране
field_tracker: Тракер field_tracker: Тракер
field_subject: Относно field_subject: Относно
field_due_date: Крайна дата field_due_date: Крайна дата
@@ -216,11 +211,12 @@ bg:
field_port: Порт field_port: Порт
field_account: Профил field_account: Профил
field_base_dn: Base DN field_base_dn: Base DN
field_attr_login: Атрибут Login field_attr_login: Login attribute
field_attr_firstname: Атрибут Първо име (Firstname) field_attr_firstname: Firstname attribute
field_attr_lastname: Атрибут Фамилия (Lastname) field_attr_lastname: Lastname attribute
field_attr_mail: Атрибут Email field_attr_mail: Email attribute
field_onthefly: Динамично създаване на потребител field_onthefly: Динамично създаване на потребител
field_start_date: Начална дата
field_done_ratio: % Прогрес field_done_ratio: % Прогрес
field_auth_source: Начин на оторизация field_auth_source: Начин на оторизация
field_hide_mail: Скрий e-mail адреса ми field_hide_mail: Скрий e-mail адреса ми
@@ -247,12 +243,12 @@ bg:
setting_login_required: Изискване за вход в системата setting_login_required: Изискване за вход в системата
setting_self_registration: Регистрация от потребители setting_self_registration: Регистрация от потребители
setting_attachment_max_size: Максимална големина на прикачен файл setting_attachment_max_size: Максимална големина на прикачен файл
setting_issues_export_limit: Максимален брой задачи за експорт setting_issues_export_limit: Лимит за експорт на задачи
setting_mail_from: E-mail адрес за емисии setting_mail_from: E-mail адрес за емисии
setting_host_name: Хост setting_host_name: Хост
setting_text_formatting: Форматиране на текста setting_text_formatting: Форматиране на текста
setting_wiki_compression: Wiki компресиране на историята setting_wiki_compression: Wiki компресиране на историята
setting_feeds_limit: Максимален брой за емисии setting_feeds_limit: Лимит на Feeds
setting_autofetch_changesets: Автоматично обработване на ревизиите setting_autofetch_changesets: Автоматично обработване на ревизиите
setting_sys_api_enabled: Разрешаване на WS за управление setting_sys_api_enabled: Разрешаване на WS за управление
setting_commit_ref_keywords: Отбелязващи ключови думи setting_commit_ref_keywords: Отбелязващи ключови думи
@@ -268,9 +264,9 @@ bg:
label_project_new: Нов проект label_project_new: Нов проект
label_project_plural: Проекти label_project_plural: Проекти
label_x_projects: label_x_projects:
zero: 0 проекти zero: no projects
one: 1 проект one: 1 project
other: "{{count}} проекта" other: "{{count}} projects"
label_project_all: Всички проекти label_project_all: Всички проекти
label_project_latest: Последни проекти label_project_latest: Последни проекти
label_issue: Задача label_issue: Задача
@@ -291,9 +287,9 @@ bg:
label_tracker_plural: Тракери label_tracker_plural: Тракери
label_tracker_new: Нов тракер label_tracker_new: Нов тракер
label_workflow: Работен процес label_workflow: Работен процес
label_issue_status: Състояние на задача label_issue_status: Статус на задача
label_issue_status_plural: Състояния на задачи label_issue_status_plural: Статуси на задачи
label_issue_status_new: Ново състояние label_issue_status_new: Нов статус
label_issue_category: Категория задача label_issue_category: Категория задача
label_issue_category_plural: Категории задачи label_issue_category_plural: Категории задачи
label_issue_category_new: Нова категория label_issue_category_new: Нова категория
@@ -321,14 +317,14 @@ bg:
label_registered_on: Регистрация label_registered_on: Регистрация
label_activity: Дейност label_activity: Дейност
label_new: Нов label_new: Нов
label_logged_as: Влязъл като label_logged_as: Логнат като
label_environment: Среда label_environment: Среда
label_authentication: Оторизация label_authentication: Оторизация
label_auth_source: Начин на оторозация label_auth_source: Начин на оторозация
label_auth_source_new: Нов начин на оторизация label_auth_source_new: Нов начин на оторизация
label_auth_source_plural: Начини на оторизация label_auth_source_plural: Начини на оторизация
label_subproject_plural: Подпроекти label_subproject_plural: Подпроекти
label_min_max_length: Минимална - максимална дължина label_min_max_length: Мин. - Макс. дължина
label_list: Списък label_list: Списък
label_date: Дата label_date: Дата
label_integer: Целочислен label_integer: Целочислен
@@ -337,10 +333,10 @@ bg:
label_text: Дълъг текст label_text: Дълъг текст
label_attribute: Атрибут label_attribute: Атрибут
label_attribute_plural: Атрибути label_attribute_plural: Атрибути
label_download: "{{count}} изтегляне" label_download: "{{count}} Download"
label_download_plural: "{{count}} изтегляния" label_download_plural: "{{count}} Downloads"
label_no_data: Няма изходни данни label_no_data: Няма изходни данни
label_change_status: Промяна на състоянието label_change_status: Промяна на статуса
label_history: История label_history: История
label_attachment: Файл label_attachment: Файл
label_attachment_new: Нов файл label_attachment_new: Нов файл
@@ -367,21 +363,21 @@ bg:
label_closed_issues: затворена label_closed_issues: затворена
label_closed_issues_plural: затворени label_closed_issues_plural: затворени
label_x_open_issues_abbr_on_total: label_x_open_issues_abbr_on_total:
zero: 0 отворени / {{total}} zero: 0 open / {{total}}
one: 1 отворена / {{total}} one: 1 open / {{total}}
other: "{{count}} отворени / {{total}}" other: "{{count}} open / {{total}}"
label_x_open_issues_abbr: label_x_open_issues_abbr:
zero: 0 отворени zero: 0 open
one: 1 отворена one: 1 open
other: "{{count}} отворени" other: "{{count}} open"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 затворени zero: 0 closed
one: 1 затворена one: 1 closed
other: "{{count}} затворени" other: "{{count}} closed"
label_total: Общо label_total: Общо
label_permissions: Права label_permissions: Права
label_current_status: Текущо състояние label_current_status: Текущ статус
label_new_statuses_allowed: Позволени състояния label_new_statuses_allowed: Позволени статуси
label_all: всички label_all: всички
label_none: никакви label_none: никакви
label_next: Следващ label_next: Следващ
@@ -392,7 +388,7 @@ bg:
label_per_page: На страница label_per_page: На страница
label_calendar: Календар label_calendar: Календар
label_months_from: месеца от label_months_from: месеца от
label_gantt: Мрежов график label_gantt: Gantt
label_internal: Вътрешен label_internal: Вътрешен
label_last_changes: "последни {{count}} промени" label_last_changes: "последни {{count}} промени"
label_change_view_all: Виж всички промени label_change_view_all: Виж всички промени
@@ -400,9 +396,9 @@ bg:
label_comment: Коментар label_comment: Коментар
label_comment_plural: Коментари label_comment_plural: Коментари
label_x_comments: label_x_comments:
zero: 0 коментари zero: no comments
one: 1 коментар one: 1 comment
other: "{{count}} коментари" other: "{{count}} comments"
label_comment_add: Добавяне на коментар label_comment_add: Добавяне на коментар
label_comment_added: Добавен коментар label_comment_added: Добавен коментар
label_comment_delete: Изтриване на коментари label_comment_delete: Изтриване на коментари
@@ -451,13 +447,13 @@ bg:
label_wiki: Wiki label_wiki: Wiki
label_wiki_edit: Wiki редакция label_wiki_edit: Wiki редакция
label_wiki_edit_plural: Wiki редакции label_wiki_edit_plural: Wiki редакции
label_wiki_page: Wiki страница label_wiki_page: Wiki page
label_wiki_page_plural: Wiki страници label_wiki_page_plural: Wiki pages
label_index_by_title: Индекс label_index_by_title: Индекс
label_index_by_date: Индекс по дата label_index_by_date: Индекс по дата
label_current_version: Текуща версия label_current_version: Текуща версия
label_preview: Преглед label_preview: Преглед
label_feed_plural: Емисии label_feed_plural: Feeds
label_changes_details: Подробни промени label_changes_details: Подробни промени
label_issue_tracking: Тракинг label_issue_tracking: Тракинг
label_spent_time: Отделено време label_spent_time: Отделено време
@@ -476,7 +472,7 @@ bg:
label_permissions_report: Справка за права label_permissions_report: Справка за права
label_watched_issues: Наблюдавани задачи label_watched_issues: Наблюдавани задачи
label_related_issues: Свързани задачи label_related_issues: Свързани задачи
label_applied_status: Установено състояние label_applied_status: Промени статуса на
label_loading: Зареждане... label_loading: Зареждане...
label_relation_new: Нова релация label_relation_new: Нова релация
label_relation_delete: Изтриване на релация label_relation_delete: Изтриване на релация
@@ -486,10 +482,10 @@ bg:
label_blocked_by: блокирана от label_blocked_by: блокирана от
label_precedes: предшества label_precedes: предшества
label_follows: изпълнява се след label_follows: изпълнява се след
label_end_to_start: край към начало label_end_to_start: end to start
label_end_to_end: край към край label_end_to_end: end to end
label_start_to_start: начало към начало label_start_to_start: start to start
label_start_to_end: начало към край label_start_to_end: start to end
label_stay_logged_in: Запомни ме label_stay_logged_in: Запомни ме
label_disabled: забранено label_disabled: забранено
label_show_completed_versions: Показване на реализирани версии label_show_completed_versions: Показване на реализирани версии
@@ -532,7 +528,7 @@ bg:
button_clear: Изчисти button_clear: Изчисти
button_lock: Заключване button_lock: Заключване
button_unlock: Отключване button_unlock: Отключване
button_download: Изтегляне button_download: Download
button_list: Списък button_list: Списък
button_view: Преглед button_view: Преглед
button_move: Преместване button_move: Преместване
@@ -542,8 +538,8 @@ bg:
button_sort: Сортиране button_sort: Сортиране
button_log_time: Отделяне на време button_log_time: Отделяне на време
button_rollback: Върни се към тази ревизия button_rollback: Върни се към тази ревизия
button_watch: Наблюдаване button_watch: Наблюдавай
button_unwatch: Край на наблюдението button_unwatch: Спри наблюдението
button_reply: Отговор button_reply: Отговор
button_archive: Архивиране button_archive: Архивиране
button_unarchive: Разархивиране button_unarchive: Разархивиране
@@ -580,11 +576,11 @@ bg:
default_role_manager: Мениджър default_role_manager: Мениджър
default_role_developer: Разработчик default_role_developer: Разработчик
default_role_reporter: Публикуващ default_role_reporter: Публикуващ
default_tracker_bug: Грешка default_tracker_bug: Бъг
default_tracker_feature: Функционалност default_tracker_feature: Функционалност
default_tracker_support: Поддръжка default_tracker_support: Поддръжка
default_issue_status_new: Нова default_issue_status_new: Нова
default_issue_status_in_progress: Изпълнение default_issue_status_in_progress: In Progress
default_issue_status_resolved: Приключена default_issue_status_resolved: Приключена
default_issue_status_feedback: Обратна връзка default_issue_status_feedback: Обратна връзка
default_issue_status_closed: Затворена default_issue_status_closed: Затворена
@@ -646,7 +642,7 @@ bg:
label_age: Възраст label_age: Възраст
notice_default_data_loaded: Примерната информацията е успешно заредена. notice_default_data_loaded: Примерната информацията е успешно заредена.
text_load_default_configuration: Зареждане на примерна информация text_load_default_configuration: Зареждане на примерна информация
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате." text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, статуси на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}" error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}"
button_update: Обновяване button_update: Обновяване
label_change_properties: Промяна на настройки label_change_properties: Промяна на настройки
@@ -705,219 +701,200 @@ bg:
setting_default_projects_public: Новите проекти са публични по подразбиране setting_default_projects_public: Новите проекти са публични по подразбиране
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран." error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
label_planning: Планиране label_planning: Планиране
text_subprojects_destroy_warning: "Неговите подпроекти: {{value}} също ще бъдат изтрити." text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} и неговите подпроекти" label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} задачи, назначени на вас са с краен срок в следващите {{days}} дни:" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} задачи с краен срок с следващите {{days}} дни" mail_subject_reminder: "{{count}} issue(s) due in the next days"
text_user_wrote: "{{value}} написа:" text_user_wrote: "{{value}} wrote:"
label_duplicated_by: дублирана от label_duplicated_by: duplicated by
setting_enabled_scm: Разрешена SCM setting_enabled_scm: Enabled SCM
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:' text_enumeration_category_reassign_to: 'Reassign them to this value:'
text_enumeration_destroy_question: "{{count}} обекта са свързани с тази стойност." text_enumeration_destroy_question: "{{count}} objects are assigned to this value."
label_incoming_emails: Входящи e-mail-и label_incoming_emails: Incoming emails
label_generate_key: Генериране на ключ label_generate_key: Generate a key
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и setting_mail_handler_api_enabled: Enable WS for incoming emails
setting_mail_handler_api_key: API ключ setting_mail_handler_api_key: API key
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
field_parent_title: Родителска страница field_parent_title: Parent page
label_issue_watchers: Наблюдатели label_issue_watchers: Watchers
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване setting_commit_logs_encoding: Commit messages encoding
button_quote: Цитат button_quote: Quote
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори setting_sequential_project_identifiers: Generate sequential project identifiers
notice_unable_delete_version: Невъзможност за изтриване на версия notice_unable_delete_version: Unable to delete version
label_renamed: преименуван label_renamed: renamed
label_copied: копиран label_copied: copied
setting_plain_text_mail: само чист текст (без HTML) setting_plain_text_mail: plain text only (no HTML)
permission_view_files: Разглеждане на файлове permission_view_files: View files
permission_edit_issues: Редактиране на задачи permission_edit_issues: Edit issues
permission_edit_own_time_entries: Редактиране на собствените time logs permission_edit_own_time_entries: Edit own time logs
permission_manage_public_queries: Управление на публичните заявки permission_manage_public_queries: Manage public queries
permission_add_issues: Добавяне на задачи permission_add_issues: Add issues
permission_log_time: Log spent time permission_log_time: Log spent time
permission_view_changesets: Разглеждане на changesets permission_view_changesets: View changesets
permission_view_time_entries: Разглеждане на изразходваното време permission_view_time_entries: View spent time
permission_manage_versions: Управление на версиите permission_manage_versions: Manage versions
permission_manage_wiki: Управление на wiki permission_manage_wiki: Manage wiki
permission_manage_categories: Управление на категориите задачи permission_manage_categories: Manage issue categories
permission_protect_wiki_pages: Заключване на wiki страници permission_protect_wiki_pages: Protect wiki pages
permission_comment_news: Коментиране на новини permission_comment_news: Comment news
permission_delete_messages: Изтриване на съобщения permission_delete_messages: Delete messages
permission_select_project_modules: Избор на проектни модули permission_select_project_modules: Select project modules
permission_manage_documents: Управление на документи permission_manage_documents: Manage documents
permission_edit_wiki_pages: Редактиране на wiki страници permission_edit_wiki_pages: Edit wiki pages
permission_add_issue_watchers: Добавяне на наблюдатели permission_add_issue_watchers: Add watchers
permission_view_gantt: Разглеждане на мрежов график permission_view_gantt: View gantt chart
permission_move_issues: Преместване на задачи permission_move_issues: Move issues
permission_manage_issue_relations: Управление на връзките между задачите permission_manage_issue_relations: Manage issue relations
permission_delete_wiki_pages: Изтриване на wiki страници permission_delete_wiki_pages: Delete wiki pages
permission_manage_boards: Управление на boards permission_manage_boards: Manage boards
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове permission_delete_wiki_pages_attachments: Delete attachments
permission_view_wiki_edits: Разглеждане на wiki история permission_view_wiki_edits: View wiki history
permission_add_messages: Публикуване на съобщения permission_add_messages: Post messages
permission_view_messages: Разглеждане на съобщения permission_view_messages: View messages
permission_manage_files: Управление на файлове permission_manage_files: Manage files
permission_edit_issue_notes: Редактиране на бележки permission_edit_issue_notes: Edit notes
permission_manage_news: Управление на новини permission_manage_news: Manage news
permission_view_calendar: Разглеждане на календари permission_view_calendar: View calendrier
permission_manage_members: Управление на членовете (на екип) permission_manage_members: Manage members
permission_edit_messages: Редактиране на съобщения permission_edit_messages: Edit messages
permission_delete_issues: Изтриване на задачи permission_delete_issues: Delete issues
permission_view_issue_watchers: Разглеждане на списък с наблюдатели permission_view_issue_watchers: View watchers list
permission_manage_repository: Управление на хранилища permission_manage_repository: Manage repository
permission_commit_access: Поверяване permission_commit_access: Commit access
permission_browse_repository: Разглеждане на хранилища permission_browse_repository: Browse repository
permission_view_documents: Разглеждане на документи permission_view_documents: View documents
permission_edit_project: Редактиране на проект permission_edit_project: Edit project
permission_add_issue_notes: Добаване на бележки permission_add_issue_notes: Add notes
permission_save_queries: Запис на запитвания (queries) permission_save_queries: Save queries
permission_view_wiki_pages: Разглеждане на wiki permission_view_wiki_pages: View wiki
permission_rename_wiki_pages: Преименуване на wiki страници permission_rename_wiki_pages: Rename wiki pages
permission_edit_time_entries: Редактиране на time logs permission_edit_time_entries: Edit time logs
permission_edit_own_issue_notes: Редактиране на собствени бележки permission_edit_own_issue_notes: Edit own notes
setting_gravatar_enabled: Използване на портребителски икони от Gravatar setting_gravatar_enabled: Use Gravatar user icons
label_example: Пример label_example: Example
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
permission_edit_own_messages: Редактиране на собствени съобщения permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Изтриване на собствени съобщения permission_delete_own_messages: Delete own messages
label_user_activity: "Активност на {{value}}" label_user_activity: "{{value}}'s activity"
label_updated_time_by: "Обновена от {{author}} преди {{age}}" label_updated_time_by: "Updated by {{author}} {{age}} ago"
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.' text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Максимален брой показани diff редове setting_diff_max_lines_displayed: Max number of diff lines displayed
text_plugin_assets_writable: Папката на приставките е разрешена за запис text_plugin_assets_writable: Plugin assets directory writable
warning_attachments_not_saved: "{{count}} файла не бяха записани." warning_attachments_not_saved: "{{count}} file(s) could not be saved."
button_create_and_continue: Създаване и продължаване button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'Една стойност на ред' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable field_editable: Editable
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла setting_repository_log_display_limit: Maximum number of revisions displayed on file log
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline setting_file_max_size_displayed: Max size of text files displayed inline
field_watcher: Наблюдател field_watcher: Watcher
setting_openid: Рарешаване на OpenID вход и регистрация setting_openid: Allow OpenID login and registration
field_identity_url: OpenID URL field_identity_url: OpenID URL
label_login_with_open_id_option: или вход чрез OpenID label_login_with_open_id_option: or login with OpenID
field_content: Съдържание field_content: Content
label_descending: Намаляващ label_descending: Descending
label_sort: Сортиране label_sort: Sort
label_ascending: Нарастващ label_ascending: Ascending
label_date_from_to: От {{start}} до {{end}} label_date_from_to: From {{start}} to {{end}}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: Тази страница има {{descendants}} страници деца и descendant(s). Какво желаете да правите? text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница text_wiki_page_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Минимална дължина на парола setting_password_min_length: Minimum password length
field_group_by: Групиране на резултатите по field_group_by: Group results by
mail_subject_wiki_content_updated: "Wiki страницата '{{id}}' не беше обновена" mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki страница беше добавена label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "Wiki страницата '{{id}}' беше добавена" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: Wiki страницата '{{id}}' беше добавена от {{author}}. mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki страница беше обновена label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: Wiki страницата '{{id}}' беше обновена от {{author}}. mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Създаване на проект permission_add_project: Create project
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: Разглеждане на всички ревизии label_view_all_revisions: View all revisions
label_tag: Версия label_tag: Tag
label_branch: работен вариант label_branch: Branch
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта. error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи"). error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} променен от {{old}} на {{new}}" text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} установен на {{value}}" text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} изтрит ({{old}})" text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Групи label_group_plural: Groups
label_group: Група label_group: Group
label_group_new: Нова група label_group_new: New group
label_time_entry_plural: Използвано време label_time_entry_plural: Spent time
text_journal_added: "Добавено {{label}} {{value}}" text_journal_added: "{{label}} {{value}} added"
field_active: Активен field_active: Active
enumeration_system_activity: Системна активност enumeration_system_activity: System Activity
permission_delete_issue_watchers: Изтриване на наблюдатели permission_delete_issue_watchers: Delete watchers
version_status_closed: затворена version_status_closed: closed
version_status_locked: заключена version_status_locked: locked
version_status_open: отворена version_status_open: open
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Анонимен label_user_anonymous: Anonymous
button_move_and_follow: Преместване и продължаване button_move_and_follow: Move and follow
setting_default_projects_modules: Активирани модули по подразбиране за нов проект setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Подразбиращо се изображение от Gravatar setting_gravatar_default: Default Gravatar image
field_sharing: Sharing field_sharing: Sharing
label_version_sharing_hierarchy: С проектна йерархия label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: С всички проекти label_version_sharing_system: With all projects
label_version_sharing_descendants: С подпроекти label_version_sharing_descendants: With subprojects
label_version_sharing_tree: С дърво на проектите label_version_sharing_tree: With project tree
label_version_sharing_none: Не споделен label_version_sharing_none: Not shared
error_can_not_archive_project: Този проект не може да бъде архивиран error_can_not_archive_project: This project can not be archived
button_duplicate: Дублиране button_duplicate: Duplicate
button_copy_and_follow: Копиране и продължаване button_copy_and_follow: Copy and follow
label_copy_source: Източник label_copy_source: Source
setting_issue_done_ratio: Изчисление на процента на готово задачи с setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Използване на състояниетона задачите setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен. error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли). error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Използване на поле 'задача' setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Също като целта label_copy_same_as_target: Same as target
label_copy_target: Цел label_copy_target: Target
notice_issue_done_ratios_updated: Обновен процент на завършените задачи. notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Моля изберете source тракер или роля error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Обновяване на процента на завършените задачи label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Първи ден на седмицата setting_start_of_week: Start calendars on
permission_view_issues: Разглеждане на задачите permission_view_issues: View Issues
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Ревизия {{value}} label_revision_id: Revision {{value}}
label_api_access_key: API ключ за достъп label_api_access_key: API access key
label_api_access_key_created_on: API ключ за достъп е създаден преди {{value}} label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access ключ label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен. notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Разрешаване на REST web сървис setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Липсващ API ключ label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Липсващ RSS ключ за достъп label_missing_feeds_access_key: Missing a RSS access key
button_show: Показване button_show: Show
text_line_separated: Позволени са много стойности (по едно на ред). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Създаване на подпроекти permission_add_subprojects: Create subprojects
label_subproject_new: Нов подпроект label_subproject_new: New subproject
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това на да не можете да редатирате този проект. You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Сигурен ли сте, че искате да продължите? Are you sure you want to continue?
label_close_versions: Затваряне на завършените версии label_close_versions: Close completed versions
label_board_sticky: Sticky label_board_sticky: Sticky
label_board_locked: Заключена label_board_locked: Locked
permission_export_wiki_pages: Експорт на wiki страници permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Управление на дейностите на проекта permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача error_unable_delete_issue_status: Unable to delete issue status
label_profile: Профил label_profile: Profile
permission_manage_subtasks: Управление на подзадачите permission_manage_subtasks: Manage subtasks
field_parent_issue: Родителска задача field_parent_issue: Parent task
label_subtask_plural: Подзадачи label_subtask_plural: Subtasks
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Невъзможност за свързване с ({{value}}) error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита. error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит. error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal field_principal: Principal
label_my_page_block: My page block label_my_page_block: My page block
notice_failed_to_save_members: "Невъзможност за запис на член(ове): {{errors}}." notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Намаляване text_zoom_out: Zoom out
text_zoom_in: Увеличаване text_zoom_in: Zoom in
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Общо употребено време label_overall_spent_time: Overall spent time
field_time_entries: Log time
notice_not_authorized_archived_project: The project you're trying to access has been archived.
text_tip_issue_end_day: issue ending this day
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
field_member_of_group: Assignee's group
project_module_gantt: Gantt
text_are_you_sure_with_children: Delete issue and all child issues?
text_tip_issue_begin_end_day: issue beginning and ending this day
setting_default_notification_option: Default notification option
project_module_calendar: Calendar
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
text_tip_issue_begin_day: issue beginning this day
label_user_mail_option_only_assigned: Only for things I am assigned to
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
field_assigned_to_role: Assignee's role
field_start_date: Start date
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"
+5 -18
View File
@@ -1,7 +1,6 @@
#Ernad Husremovic hernad@bring.out.ba #Ernad Husremovic hernad@bring.out.ba
bs: bs:
direction: ltr
date: date:
formats: formats:
default: "%d.%m.%Y" default: "%d.%m.%Y"
@@ -130,7 +129,6 @@ bs:
greater_than_start_date: "mora biti veći nego početni datum" greater_than_start_date: "mora biti veći nego početni datum"
not_same_project: "ne pripada istom projektu" not_same_project: "ne pripada istom projektu"
circular_dependency: "Ova relacija stvar cirkularnu zavisnost" circular_dependency: "Ova relacija stvar cirkularnu zavisnost"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Molimo odaberite actionview_instancetag_blank_option: Molimo odaberite
@@ -186,7 +184,7 @@ bs:
mail_body_account_information: Informacija o vašem korisničkom računu mail_body_account_information: Informacija o vašem korisničkom računu
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa" mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:" mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima" mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima"
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:" mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
gui_validation_error: 1 greška gui_validation_error: 1 greška
@@ -252,6 +250,7 @@ bs:
field_attr_lastname: Atribut za prezime field_attr_lastname: Atribut za prezime
field_attr_mail: Atribut za email field_attr_mail: Atribut za email
field_onthefly: 'Kreiranje korisnika "On-the-fly"' field_onthefly: 'Kreiranje korisnika "On-the-fly"'
field_start_date: Početak
field_done_ratio: % Realizovano field_done_ratio: % Realizovano
field_auth_source: Mod za authentifikaciju field_auth_source: Mod za authentifikaciju
field_hide_mail: Sakrij moju email adresu field_hide_mail: Sakrij moju email adresu
@@ -749,9 +748,9 @@ bs:
text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani." text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani."
text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti
text_are_you_sure: Da li ste sigurni ? text_are_you_sure: Da li ste sigurni ?
text_tip_issue_begin_day: zadatak počinje danas text_tip_task_begin_day: zadatak počinje danas
text_tip_issue_end_day: zadatak završava danas text_tip_task_end_day: zadatak završava danas
text_tip_issue_begin_end_day: zadatak započinje i završava danas text_tip_task_begin_end_day: zadatak započinje i završava danas
text_project_identifier_info: 'Samo mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Nakon snimanja, identifikator se ne može mijenjati.' text_project_identifier_info: 'Samo mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Nakon snimanja, identifikator se ne može mijenjati.'
text_caracters_maximum: "maksimum {{count}} karaktera." text_caracters_maximum: "maksimum {{count}} karaktera."
text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova." text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova."
@@ -923,15 +922,3 @@ bs:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
field_start_date: Start date
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"
+116 -138
View File
@@ -1,9 +1,4 @@
# Redmine catalan translation:
# by Joan Duran
ca: ca:
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -69,11 +64,6 @@ ca:
other: "almost {{count}} years" other: "almost {{count}} years"
number: number:
# Default format for numbers
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
delimiter: "" delimiter: ""
@@ -88,7 +78,6 @@ ca:
mb: "MB" mb: "MB"
gb: "GB" gb: "GB"
tb: "TB" tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
@@ -122,7 +111,6 @@ ca:
greater_than_start_date: "ha de ser superior que la data inicial" greater_than_start_date: "ha de ser superior que la data inicial"
not_same_project: "no pertany al mateix projecte" not_same_project: "no pertany al mateix projecte"
circular_dependency: "Aquesta relació crearia una dependència circular" circular_dependency: "Aquesta relació crearia una dependència circular"
cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques"
actionview_instancetag_blank_option: Seleccioneu actionview_instancetag_blank_option: Seleccioneu
@@ -156,33 +144,18 @@ ca:
notice_email_sent: "S'ha enviat un correu electrònic a {{value}}" notice_email_sent: "S'ha enviat un correu electrònic a {{value}}"
notice_email_error: "S'ha produït un error en enviar el correu ({{value}})" notice_email_error: "S'ha produït un error en enviar el correu ({{value}})"
notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS." notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API."
notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}." notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}."
notice_failed_to_save_members: "No s'han pogut desar els membres: {{errors}}."
notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar." notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador." notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada." notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
notice_unable_delete_version: "No s'ha pogut suprimir la versió." notice_unable_delete_version: "No s'ha pogut suprimir la versió."
notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps."
notice_issue_done_ratios_updated: "S'ha actualitzat el tant per cent dels assumptes."
error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} " error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} "
error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit." error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}" error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}"
error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar." error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte" error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
error_no_tracker_in_project: "Aquest projecte no té seguidor associat. Comproveu els paràmetres del projecte."
error_no_default_issue_status: "No s'ha definit cap estat d'assumpte predeterminat. Comproveu la configuració (aneu a «Administració -> Estats de l'assumpte»)."
error_can_not_delete_custom_field: "No s'ha pogut suprimir el camp personalitat"
error_can_not_delete_tracker: "Aquest seguidor conté assumptes i no es pot suprimir."
error_can_not_remove_role: "Aquest rol s'està utilitzant i no es pot suprimir."
error_can_not_reopen_issue_on_closed_version: "Un assumpte assignat a una versió tancada no es pot tornar a obrir"
error_can_not_archive_project: "Aquest projecte no es pot arxivar"
error_issue_done_ratios_not_updated: "No s'ha actualitza el tant per cent dels assumptes."
error_workflow_copy_source: "Seleccioneu un seguidor o rol font"
error_workflow_copy_target: "Seleccioneu seguidors i rols objectiu"
error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte"
error_unable_to_connect: "No s'ha pogut connectar ({{value}})"
warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers." warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers."
mail_subject_lost_password: "Contrasenya de {{value}}" mail_subject_lost_password: "Contrasenya de {{value}}"
@@ -193,12 +166,8 @@ ca:
mail_body_account_information: Informació del compte mail_body_account_information: Informació del compte
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}" mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:" mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies" mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies"
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:" mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
mail_subject_wiki_content_added: "S'ha afegit la pàgina wiki «{{page}}»"
mail_body_wiki_content_added: "En {{author}} ha afegit la pàgina wiki «{{page}}»."
mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «{{page}}»"
mail_body_wiki_content_updated: "En {{author}} ha actualitzat la pàgina wiki «{{page}}»."
gui_validation_error: 1 error gui_validation_error: 1 error
gui_validation_error_plural: "{{count}} errors" gui_validation_error_plural: "{{count}} errors"
@@ -238,7 +207,6 @@ ca:
field_priority: Prioritat field_priority: Prioritat
field_fixed_version: Versió objectiu field_fixed_version: Versió objectiu
field_user: Usuari field_user: Usuari
field_principal: Principal
field_role: Rol field_role: Rol
field_homepage: Pàgina web field_homepage: Pàgina web
field_is_public: Públic field_is_public: Públic
@@ -264,6 +232,7 @@ ca:
field_attr_lastname: Atribut del cognom field_attr_lastname: Atribut del cognom
field_attr_mail: Atribut del correu electrònic field_attr_mail: Atribut del correu electrònic
field_onthefly: "Creació de l'usuari «al vol»" field_onthefly: "Creació de l'usuari «al vol»"
field_start_date: Inici
field_done_ratio: % realitzat field_done_ratio: % realitzat
field_auth_source: "Mode d'autenticació" field_auth_source: "Mode d'autenticació"
field_hide_mail: "Oculta l'adreça de correu electrònic" field_hide_mail: "Oculta l'adreça de correu electrònic"
@@ -282,7 +251,6 @@ ca:
field_redirect_existing_links: Redirigeix els enllaços existents field_redirect_existing_links: Redirigeix els enllaços existents
field_estimated_hours: Temps previst field_estimated_hours: Temps previst
field_column_names: Columnes field_column_names: Columnes
field_time_entries: "Registre de temps"
field_time_zone: Zona horària field_time_zone: Zona horària
field_searchable: Es pot cercar field_searchable: Es pot cercar
field_default_value: Valor predeterminat field_default_value: Valor predeterminat
@@ -292,9 +260,6 @@ ca:
field_watcher: Vigilància field_watcher: Vigilància
field_identity_url: URL OpenID field_identity_url: URL OpenID
field_content: Contingut field_content: Contingut
field_group_by: "Agrupa els resultats per"
field_sharing: Compartició
field_parent_issue: "Tasca pare"
setting_app_title: "Títol de l'aplicació" setting_app_title: "Títol de l'aplicació"
setting_app_subtitle: "Subtítol de l'aplicació" setting_app_subtitle: "Subtítol de l'aplicació"
@@ -330,35 +295,20 @@ ca:
setting_activity_days_default: "Dies a mostrar l'activitat del projecte" setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte" setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
setting_enabled_scm: "Habilita l'SCM" setting_enabled_scm: "Habilita l'SCM"
setting_mail_handler_body_delimiters: "Trunca els correus electrònics després d'una d'aquestes línies"
setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada" setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
setting_mail_handler_api_key: Clau API setting_mail_handler_api_key: Clau API
setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials
setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar" setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar"
setting_gravatar_default: "Imatge Gravatar predeterminada"
setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades
setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia
setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers
setting_openid: "Permet entrar i registrar-se amb l'OpenID" setting_openid: "Permet entrar i registrar-se amb l'OpenID"
setting_password_min_length: "Longitud mínima de la contrasenya"
setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes"
setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous"
setting_issue_done_ratio: "Calcula tant per cent realitzat de l'assumpte amb"
setting_issue_done_ratio_issue_status: "Utilitza l'estat de l'assumpte"
setting_issue_done_ratio_issue_field: "Utilitza el camp de l'assumpte"
setting_start_of_week: "Inicia les setmanes en"
setting_rest_api_enabled: "Habilita el servei web REST"
setting_cache_formatted_text: Cache formatted text
permission_add_project: "Crea projectes"
permission_add_subprojects: "Crea subprojectes"
permission_edit_project: Edita el projecte permission_edit_project: Edita el projecte
permission_select_project_modules: Selecciona els mòduls del projecte permission_select_project_modules: Selecciona els mòduls del projecte
permission_manage_members: Gestiona els membres permission_manage_members: Gestiona els membres
permission_manage_project_activities: "Gestiona les activitats del projecte"
permission_manage_versions: Gestiona les versions permission_manage_versions: Gestiona les versions
permission_manage_categories: Gestiona les categories dels assumptes permission_manage_categories: Gestiona les categories dels assumptes
permission_view_issues: "Visualitza els assumptes"
permission_add_issues: Afegeix assumptes permission_add_issues: Afegeix assumptes
permission_edit_issues: Edita els assumptes permission_edit_issues: Edita els assumptes
permission_manage_issue_relations: Gestiona les relacions dels assumptes permission_manage_issue_relations: Gestiona les relacions dels assumptes
@@ -373,7 +323,6 @@ ca:
permission_view_calendar: Visualitza el calendari permission_view_calendar: Visualitza el calendari
permission_view_issue_watchers: Visualitza la llista de vigilàncies permission_view_issue_watchers: Visualitza la llista de vigilàncies
permission_add_issue_watchers: Afegeix vigilàncies permission_add_issue_watchers: Afegeix vigilàncies
permission_delete_issue_watchers: Suprimeix els vigilants
permission_log_time: Registra el temps invertit permission_log_time: Registra el temps invertit
permission_view_time_entries: Visualitza el temps invertit permission_view_time_entries: Visualitza el temps invertit
permission_edit_time_entries: Edita els registres de temps permission_edit_time_entries: Edita els registres de temps
@@ -403,8 +352,6 @@ ca:
permission_edit_own_messages: Edita els missatges propis permission_edit_own_messages: Edita els missatges propis
permission_delete_messages: Suprimeix els missatges permission_delete_messages: Suprimeix els missatges
permission_delete_own_messages: Suprimeix els missatges propis permission_delete_own_messages: Suprimeix els missatges propis
permission_export_wiki_pages: "Exporta les pàgines wiki"
permission_manage_subtasks: "Gestiona subtasques"
project_module_issue_tracking: "Seguidor d'assumptes" project_module_issue_tracking: "Seguidor d'assumptes"
project_module_time_tracking: Seguidor de temps project_module_time_tracking: Seguidor de temps
@@ -414,13 +361,10 @@ ca:
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Dipòsit project_module_repository: Dipòsit
project_module_boards: Taulers project_module_boards: Taulers
project_module_calendar: Calendari
project_module_gantt: Gantt
label_user: Usuari label_user: Usuari
label_user_plural: Usuaris label_user_plural: Usuaris
label_user_new: Usuari nou label_user_new: Usuari nou
label_user_anonymous: Anònim
label_project: Projecte label_project: Projecte
label_project_new: Projecte nou label_project_new: Projecte nou
label_project_plural: Projectes label_project_plural: Projectes
@@ -467,13 +411,12 @@ ca:
label_information_plural: Informació label_information_plural: Informació
label_please_login: Entreu label_please_login: Entreu
label_register: Registre label_register: Registre
label_login_with_open_id_option: "o entra amb l'OpenID" label_login_with_open_id_option: o entra amb l'OpenID
label_password_lost: Contrasenya perduda label_password_lost: Contrasenya perduda
label_home: Inici label_home: Inici
label_my_page: La meva pàgina label_my_page: La meva pàgina
label_my_account: El meu compte label_my_account: El meu compte
label_my_projects: Els meus projectes label_my_projects: Els meus projectes
label_my_page_block: "Els meus blocs de pàgina"
label_administration: Administració label_administration: Administració
label_login: Entra label_login: Entra
label_logout: Surt label_logout: Surt
@@ -493,7 +436,6 @@ ca:
label_auth_source_new: "Mode d'autenticació nou" label_auth_source_new: "Mode d'autenticació nou"
label_auth_source_plural: "Modes d'autenticació" label_auth_source_plural: "Modes d'autenticació"
label_subproject_plural: Subprojectes label_subproject_plural: Subprojectes
label_subproject_new: "Subprojecte nou"
label_and_its_subprojects: "{{value}} i els seus subprojectes" label_and_its_subprojects: "{{value}} i els seus subprojectes"
label_min_max_length: Longitud mín - max label_min_max_length: Longitud mín - max
label_list: Llist label_list: Llist
@@ -528,9 +470,8 @@ ca:
label_version: Versió label_version: Versió
label_version_new: Versió nova label_version_new: Versió nova
label_version_plural: Versions label_version_plural: Versions
label_close_versions: "Tanca les versions completades"
label_confirmation: Confirmació label_confirmation: Confirmació
label_export_to: "També disponible a:" label_export_to: 'També disponible a:'
label_read: Llegeix... label_read: Llegeix...
label_public_projects: Projectes públics label_public_projects: Projectes públics
label_open_issues: obert label_open_issues: obert
@@ -587,8 +528,6 @@ ca:
label_not_equals: no és label_not_equals: no és
label_in_less_than: en menys de label_in_less_than: en menys de
label_in_more_than: en més de label_in_more_than: en més de
label_greater_or_equal: ">="
label_less_or_equal: <=
label_in: en label_in: en
label_today: avui label_today: avui
label_all_time: tot el temps label_all_time: tot el temps
@@ -611,21 +550,17 @@ ca:
label_browse: Navega label_browse: Navega
label_modification: "{{count}} canvi" label_modification: "{{count}} canvi"
label_modification_plural: "{{count}} canvis" label_modification_plural: "{{count}} canvis"
label_branch: Branca
label_tag: Etiqueta
label_revision: Revisió label_revision: Revisió
label_revision_plural: Revisions label_revision_plural: Revisions
label_revision_id: "Revisió {{value}}"
label_associated_revisions: Revisions associades label_associated_revisions: Revisions associades
label_added: afegit label_added: afegit
label_modified: modificat label_modified: modificat
label_copied: copiat
label_renamed: reanomenat label_renamed: reanomenat
label_copied: copiat
label_deleted: suprimit label_deleted: suprimit
label_latest_revision: Última revisió label_latest_revision: Última revisió
label_latest_revision_plural: Últimes revisions label_latest_revision_plural: Últimes revisions
label_view_revisions: Visualitza les revisions label_view_revisions: Visualitza les revisions
label_view_all_revisions: "Visualitza totes les revisions"
label_max_size: Mida màxima label_max_size: Mida màxima
label_sort_highest: Mou a la part superior label_sort_highest: Mou a la part superior
label_sort_higher: Mou cap amunt label_sort_higher: Mou cap amunt
@@ -651,7 +586,6 @@ ca:
label_changes_details: Detalls de tots els canvis label_changes_details: Detalls de tots els canvis
label_issue_tracking: "Seguiment d'assumptes" label_issue_tracking: "Seguiment d'assumptes"
label_spent_time: Temps invertit label_spent_time: Temps invertit
label_overall_spent_time: "Temps total invertit"
label_f_hour: "{{value}} hora" label_f_hour: "{{value}} hora"
label_f_hour_plural: "{{value}} hores" label_f_hour_plural: "{{value}} hores"
label_time_tracking: Temps de seguiment label_time_tracking: Temps de seguiment
@@ -689,8 +623,6 @@ ca:
label_board: Fòrum label_board: Fòrum
label_board_new: Fòrum nou label_board_new: Fòrum nou
label_board_plural: Fòrums label_board_plural: Fòrums
label_board_locked: Bloquejat
label_board_sticky: Sticky
label_topic_plural: Temes label_topic_plural: Temes
label_message_plural: Missatges label_message_plural: Missatges
label_message_last: Últim missatge label_message_last: Últim missatge
@@ -706,8 +638,6 @@ ca:
label_language_based: "Basat en l'idioma de l'usuari" label_language_based: "Basat en l'idioma de l'usuari"
label_sort_by: "Ordena per {{value}}" label_sort_by: "Ordena per {{value}}"
label_send_test_email: Envia un correu electrònic de prova label_send_test_email: Envia un correu electrònic de prova
label_feeds_access_key: "Clau d'accés del RSS"
label_missing_feeds_access_key: "Falta una clau d'accés del RSS"
label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}" label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}"
label_module_plural: Mòduls label_module_plural: Mòduls
label_added_time_by: "Afegit per {{author}} fa {{age}}" label_added_time_by: "Afegit per {{author}} fa {{age}}"
@@ -753,28 +683,6 @@ ca:
label_ascending: Ascendent label_ascending: Ascendent
label_descending: Descendent label_descending: Descendent
label_date_from_to: Des de {{start}} a {{end}} label_date_from_to: Des de {{start}} a {{end}}
label_wiki_content_added: "S'ha afegit la pàgina wiki"
label_wiki_content_updated: "S'ha actualitzat la pàgina wiki"
label_group: Grup
label_group_plural: Grups
label_group_new: Grup nou
label_time_entry_plural: Temps invertit
label_version_sharing_hierarchy: "Amb la jerarquia del projecte"
label_version_sharing_system: "Amb tots els projectes"
label_version_sharing_descendants: "Amb tots els subprojectes"
label_version_sharing_tree: "Amb l'arbre del projecte"
label_version_sharing_none: "Sense compartir"
label_update_issue_done_ratios: "Actualitza el tant per cent dels assumptes realitzats"
label_copy_source: Font
label_copy_target: Objectiu
label_copy_same_as_target: "El mateix que l'objectiu"
label_display_used_statuses_only: "Mostra només els estats que utilitza aquest seguidor"
label_api_access_key: "Clau d'accés a l'API"
label_missing_api_access_key: "Falta una clau d'accés de l'API"
label_api_access_key_created_on: "Clau d'accés de l'API creada fa {{value}}"
label_profile: Perfil
label_subtask_plural: Subtasques
label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte"
button_login: Entra button_login: Entra
button_submit: Tramet button_submit: Tramet
@@ -796,12 +704,11 @@ ca:
button_list: Llista button_list: Llista
button_view: Visualitza button_view: Visualitza
button_move: Mou button_move: Mou
button_move_and_follow: "Mou i segueix"
button_back: Enrere button_back: Enrere
button_cancel: Cancel·la button_cancel: Cancel·la
button_activate: Activa button_activate: Activa
button_sort: Ordena button_sort: Ordena
button_log_time: "Registre de temps" button_log_time: "Hora d'entrada"
button_rollback: Torna a aquesta versió button_rollback: Torna a aquesta versió
button_watch: Vigila button_watch: Vigila
button_unwatch: No vigilis button_unwatch: No vigilis
@@ -812,24 +719,15 @@ ca:
button_rename: Reanomena button_rename: Reanomena
button_change_password: Canvia la contrasenya button_change_password: Canvia la contrasenya
button_copy: Copia button_copy: Copia
button_copy_and_follow: "Copia i segueix"
button_annotate: Anota button_annotate: Anota
button_update: Actualitza button_update: Actualitza
button_configure: Configura button_configure: Configura
button_quote: Cita button_quote: Cita
button_duplicate: Duplica
button_show: Mostra
status_active: actiu status_active: actiu
status_registered: informat status_registered: informat
status_locked: bloquejat status_locked: bloquejat
version_status_open: oberta
version_status_locked: bloquejada
version_status_closed: tancada
field_active: Actiu
text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic." text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
text_regexp_info: ex. ^[A-Z0-9]+$ text_regexp_info: ex. ^[A-Z0-9]+$
text_min_max_length_info: 0 significa sense restricció text_min_max_length_info: 0 significa sense restricció
@@ -837,13 +735,9 @@ ca:
text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}." text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}."
text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
text_are_you_sure: Segur? text_are_you_sure: Segur?
text_journal_changed: "{{label}} ha canviat de {{old}} a {{new}}" text_tip_task_begin_day: "tasca que s'inicia aquest dia"
text_journal_set_to: "{{label}} s'ha establert a {{value}}" text_tip_task_end_day: tasca que finalitza aquest dia
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})" text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
text_journal_added: "S'ha afegit {{label}} {{value}}"
text_tip_issue_begin_day: "tasca que s'inicia aquest dia"
text_tip_issue_end_day: tasca que finalitza aquest dia
text_tip_issue_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar." text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar."
text_caracters_maximum: "{{count}} caràcters com a màxim." text_caracters_maximum: "{{count}} caràcters com a màxim."
text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters." text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters."
@@ -851,7 +745,6 @@ ca:
text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor" text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
text_unallowed_characters: Caràcters no permesos text_unallowed_characters: Caràcters no permesos
text_comma_separated: Es permeten valors múltiples (separats per una coma). text_comma_separated: Es permeten valors múltiples (separats per una coma).
text_line_separated: "Es permeten diversos valors (una línia per cada valor)."
text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}." text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}."
text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}." text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}."
@@ -872,21 +765,14 @@ ca:
text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?" text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?"
text_destroy_time_entries: Suprimeix les hores informades text_destroy_time_entries: Suprimeix les hores informades
text_assign_time_entries_to_project: Assigna les hores informades al projecte text_assign_time_entries_to_project: Assigna les hores informades al projecte
text_reassign_time_entries: "Torna a assignar les hores informades a aquest assumpte:" text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:'
text_user_wrote: "{{value}} va escriure:" text_user_wrote: "{{value}} va escriure:"
text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor." text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor."
text_enumeration_category_reassign_to: "Torna a assignar-los a aquest valor:" text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:'
text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo." text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo."
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament." text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament."
text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar." text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar."
text_custom_field_possible_values_info: "Una línia per a cada valor" text_custom_field_possible_values_info: 'Una línia per a cada valor'
text_wiki_page_destroy_question: "Aquesta pàgina té {{descendants}} pàgines fill i descendents. Què voleu fer?"
text_wiki_page_nullify_children: "Deixa les pàgines fill com a pàgines arrel"
text_wiki_page_destroy_children: "Suprimeix les pàgines fill i tots els seus descendents"
text_wiki_page_reassign_children: "Reasigna les pàgines fill a aquesta pàgina pare"
text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?"
text_zoom_in: Redueix
text_zoom_out: Amplia
default_role_manager: Gestor default_role_manager: Gestor
default_role_developer: Desenvolupador default_role_developer: Desenvolupador
@@ -913,13 +799,105 @@ ca:
enumeration_issue_priorities: Prioritat dels assumptes enumeration_issue_priorities: Prioritat dels assumptes
enumeration_doc_categories: Categories del document enumeration_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps) enumeration_activities: Activitats (seguidor de temps)
enumeration_system_activity: Activitat del sistema label_greater_or_equal: ">="
field_member_of_group: Member of Group label_less_or_equal: <=
field_assigned_to_role: Member of Role text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" text_wiki_page_reassign_children: Reassign child pages to this parent page
text_are_you_sure_with_children: Delete issue and all child issues? text_wiki_page_nullify_children: Keep child pages as root pages
field_text: Text field text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_start_date: Start date field_group_by: Group results by
label_principal_search: "Search for user or group:" mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_user_search: "Search for user:" label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
+169 -185
View File
@@ -1,5 +1,4 @@
cs: cs:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -24,8 +23,8 @@ cs:
time: "%H:%M" time: "%H:%M"
short: "%d %b %H:%M" short: "%d %b %H:%M"
long: "%B %d, %Y %H:%M" long: "%B %d, %Y %H:%M"
am: "dop." am: "am"
pm: "odp." pm: "pm"
datetime: datetime:
distance_in_words: distance_in_words:
@@ -61,14 +60,10 @@ cs:
one: "více než 1 rok" one: "více než 1 rok"
other: "více než {{count}} roky" other: "více než {{count}} roky"
almost_x_years: almost_x_years:
one: "témeř 1 rok" one: "almost 1 year"
other: "téměř {{count}} roky" other: "almost {{count}} years"
number: number:
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
precision: 1 precision: 1
@@ -116,7 +111,6 @@ cs:
greater_than_start_date: "musí být větší než počáteční datum" greater_than_start_date: "musí být větší než počáteční datum"
not_same_project: "nepatří stejnému projektu" not_same_project: "nepatří stejnému projektu"
circular_dependency: "Tento vztah by vytvořil cyklickou závislost" circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
# Updated by Josef Liška <jl@chl.cz> # Updated by Josef Liška <jl@chl.cz>
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
@@ -150,19 +144,19 @@ cs:
notice_successful_connection: Úspěšné připojení. notice_successful_connection: Úspěšné připojení.
notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána. notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
notice_locking_conflict: Údaje byly změněny jiným uživatelem. notice_locking_conflict: Údaje byly změněny jiným uživatelem.
notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři. notice_scm_error: Entry and/or revision doesn't exist in the repository.
notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky. notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
notice_email_sent: "Na adresu {{value}} byl odeslán email" notice_email_sent: "Na adresu {{value}} byl odeslán email"
notice_email_error: "Při odesílání emailu nastala chyba ({{value}})" notice_email_error: "Při odesílání emailu nastala chyba ({{value}})"
notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován. notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
notice_failed_to_save_issues: "Chyba při uložení {{count}} úkolu(ů) z {{total}} vybraných: {{ids}}." notice_failed_to_save_issues: "Failed to save {{count}} issue(s) on {{total}} selected: {{ids}}."
notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat" notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem." notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána. notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}" error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}"
error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři." error_scm_not_found: "Položka a/nebo revize neexistují v repository."
error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: {{value}}" error_scm_command_failed: "Při pokusu o přístup k repository došlo k chybě: {{value}}"
error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu' error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
mail_subject_lost_password: "Vaše heslo ({{value}})" mail_subject_lost_password: "Vaše heslo ({{value}})"
@@ -210,10 +204,10 @@ cs:
field_due_date: Uzavřít do field_due_date: Uzavřít do
field_assigned_to: Přiřazeno field_assigned_to: Přiřazeno
field_priority: Priorita field_priority: Priorita
field_fixed_version: Cílová verze field_fixed_version: Přiřazeno k verzi
field_user: Uživatel field_user: Uživatel
field_role: Role field_role: Role
field_homepage: Domovská stránka field_homepage: Homepage
field_is_public: Veřejný field_is_public: Veřejný
field_parent: Nadřazený projekt field_parent: Nadřazený projekt
field_is_in_roadmap: Úkoly zobrazené v plánu field_is_in_roadmap: Úkoly zobrazené v plánu
@@ -237,6 +231,7 @@ cs:
field_attr_lastname: Příjemní (atribut) field_attr_lastname: Příjemní (atribut)
field_attr_mail: Email (atribut) field_attr_mail: Email (atribut)
field_onthefly: Automatické vytváření uživatelů field_onthefly: Automatické vytváření uživatelů
field_start_date: Začátek
field_done_ratio: % Hotovo field_done_ratio: % Hotovo
field_auth_source: Autentifikační mód field_auth_source: Autentifikační mód
field_hide_mail: Nezobrazovat můj email field_hide_mail: Nezobrazovat můj email
@@ -264,18 +259,18 @@ cs:
setting_app_subtitle: Podtitulek aplikace setting_app_subtitle: Podtitulek aplikace
setting_welcome_text: Uvítací text setting_welcome_text: Uvítací text
setting_default_language: Výchozí jazyk setting_default_language: Výchozí jazyk
setting_login_required: Autentifikace vyžadována setting_login_required: Auten. vyžadována
setting_self_registration: Povolena automatická registrace setting_self_registration: Povolena automatická registrace
setting_attachment_max_size: Maximální velikost přílohy setting_attachment_max_size: Maximální velikost přílohy
setting_issues_export_limit: Limit pro export úkolů setting_issues_export_limit: Limit pro export úkolů
setting_mail_from: Odesílat emaily z adresy setting_mail_from: Odesílat emaily z adresy
setting_bcc_recipients: Příjemci skryté kopie (bcc) setting_bcc_recipients: Příjemci skryté kopie (bcc)
setting_host_name: Jméno serveru setting_host_name: Host name
setting_text_formatting: Formátování textu setting_text_formatting: Formátování textu
setting_wiki_compression: Komprese historie Wiki setting_wiki_compression: Komperese historie Wiki
setting_feeds_limit: Limit obsahu příspěvků setting_feeds_limit: Feed content limit
setting_default_projects_public: Nové projekty nastavovat jako veřejné setting_default_projects_public: Nové projekty nastavovat jako veřejné
setting_autofetch_changesets: Automaticky stahovat commity setting_autofetch_changesets: Autofetch commits
setting_sys_api_enabled: Povolit WS pro správu repozitory setting_sys_api_enabled: Povolit WS pro správu repozitory
setting_commit_ref_keywords: Klíčová slova pro odkazy setting_commit_ref_keywords: Klíčová slova pro odkazy
setting_commit_fix_keywords: Klíčová slova pro uzavření setting_commit_fix_keywords: Klíčová slova pro uzavření
@@ -289,8 +284,8 @@ cs:
setting_protocol: Protokol setting_protocol: Protokol
setting_per_page_options: Povolené počty řádků na stránce setting_per_page_options: Povolené počty řádků na stránce
setting_user_format: Formát zobrazení uživatele setting_user_format: Formát zobrazení uživatele
setting_activity_days_default: Dny zobrazené v činnosti projektu setting_activity_days_default: Days displayed on project activity
setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu setting_display_subprojects_issues: Display subprojects issues on main projects by default
project_module_issue_tracking: Sledování úkolů project_module_issue_tracking: Sledování úkolů
project_module_time_tracking: Sledování času project_module_time_tracking: Sledování času
@@ -298,7 +293,7 @@ cs:
project_module_documents: Dokumenty project_module_documents: Dokumenty
project_module_files: Soubory project_module_files: Soubory
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Repozitář project_module_repository: Repository
project_module_boards: Diskuse project_module_boards: Diskuse
label_user: Uživatel label_user: Uživatel
@@ -308,16 +303,16 @@ cs:
label_project_new: Nový projekt label_project_new: Nový projekt
label_project_plural: Projekty label_project_plural: Projekty
label_x_projects: label_x_projects:
zero: žádné projekty zero: no projects
one: 1 projekt one: 1 project
other: "{{count}} projekty(ů)" other: "{{count}} projects"
label_project_all: Všechny projekty label_project_all: Všechny projekty
label_project_latest: Poslední projekty label_project_latest: Poslední projekty
label_issue: Úkol label_issue: Úkol
label_issue_new: Nový úkol label_issue_new: Nový úkol
label_issue_plural: Úkoly label_issue_plural: Úkoly
label_issue_view_all: Všechny úkoly label_issue_view_all: Všechny úkoly
label_issues_by: "Úkoly podle {{value}}" label_issues_by: "Úkoly od uživatele {{value}}"
label_issue_added: Úkol přidán label_issue_added: Úkol přidán
label_issue_updated: Úkol aktualizován label_issue_updated: Úkol aktualizován
label_document: Dokument label_document: Dokument
@@ -334,7 +329,7 @@ cs:
label_tracker: Fronta label_tracker: Fronta
label_tracker_plural: Fronty label_tracker_plural: Fronty
label_tracker_new: Nová fronta label_tracker_new: Nová fronta
label_workflow: Průběh práce label_workflow: Workflow
label_issue_status: Stav úkolu label_issue_status: Stav úkolu
label_issue_status_plural: Stavy úkolů label_issue_status_plural: Stavy úkolů
label_issue_status_new: Nový stav label_issue_status_new: Nový stav
@@ -377,14 +372,14 @@ cs:
label_list: Seznam label_list: Seznam
label_date: Datum label_date: Datum
label_integer: Celé číslo label_integer: Celé číslo
label_float: Desetinné číslo label_float: Desetiné číslo
label_boolean: Ano/Ne label_boolean: Ano/Ne
label_string: Text label_string: Text
label_text: Dlouhý text label_text: Dlouhý text
label_attribute: Atribut label_attribute: Atribut
label_attribute_plural: Atributy label_attribute_plural: Atributy
label_download: "{{count}} stažení" label_download: "{{count}} Download"
label_download_plural: "{{count}} stažení" label_download_plural: "{{count}} Downloads"
label_no_data: Žádné položky label_no_data: Žádné položky
label_change_status: Změnit stav label_change_status: Změnit stav
label_history: Historie label_history: Historie
@@ -393,7 +388,7 @@ cs:
label_attachment_delete: Odstranit soubor label_attachment_delete: Odstranit soubor
label_attachment_plural: Soubory label_attachment_plural: Soubory
label_file_added: Soubor přidán label_file_added: Soubor přidán
label_report: Přehled label_report: Přeheled
label_report_plural: Přehledy label_report_plural: Přehledy
label_news: Novinky label_news: Novinky
label_news_new: Přidat novinku label_news_new: Přidat novinku
@@ -415,17 +410,17 @@ cs:
label_closed_issues: uzavřený label_closed_issues: uzavřený
label_closed_issues_plural: uzavřené label_closed_issues_plural: uzavřené
label_x_open_issues_abbr_on_total: label_x_open_issues_abbr_on_total:
zero: 0 otevřených / {{total}} zero: 0 open / {{total}}
one: 1 otevřený / {{total}} one: 1 open / {{total}}
other: "{{count}} otevřených / {{total}}" other: "{{count}} open / {{total}}"
label_x_open_issues_abbr: label_x_open_issues_abbr:
zero: 0 otevřených zero: 0 open
one: 1 otevřený one: 1 open
other: "{{count}} otevřených" other: "{{count}} open"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 uzavřených zero: 0 closed
one: 1 uzavřený one: 1 closed
other: "{{count}} uzavřených" other: "{{count}} closed"
label_total: Celkem label_total: Celkem
label_permissions: Práva label_permissions: Práva
label_current_status: Aktuální stav label_current_status: Aktuální stav
@@ -449,9 +444,9 @@ cs:
label_comment: Komentář label_comment: Komentář
label_comment_plural: Komentáře label_comment_plural: Komentáře
label_x_comments: label_x_comments:
zero: žádné komentáře zero: no comments
one: 1 komentář one: 1 comment
other: "{{count}} komentářů" other: "{{count}} comments"
label_comment_add: Přidat komentáře label_comment_add: Přidat komentáře
label_comment_added: Komentář přidán label_comment_added: Komentář přidán
label_comment_delete: Odstranit komentář label_comment_delete: Odstranit komentář
@@ -481,8 +476,8 @@ cs:
label_contains: obsahuje label_contains: obsahuje
label_not_contains: neobsahuje label_not_contains: neobsahuje
label_day_plural: dny label_day_plural: dny
label_repository: Repozitář label_repository: Repository
label_repository_plural: Repozitáře label_repository_plural: Repository
label_browse: Procházet label_browse: Procházet
label_modification: "{{count}} změna" label_modification: "{{count}} změna"
label_modification_plural: "{{count}} změn" label_modification_plural: "{{count}} změn"
@@ -531,7 +526,7 @@ cs:
label_diff_inline: uvnitř label_diff_inline: uvnitř
label_diff_side_by_side: vedle sebe label_diff_side_by_side: vedle sebe
label_options: Nastavení label_options: Nastavení
label_copy_workflow_from: Kopírovat průběh práce z label_copy_workflow_from: Kopírovat workflow z
label_permissions_report: Přehled práv label_permissions_report: Přehled práv
label_watched_issues: Sledované úkoly label_watched_issues: Sledované úkoly
label_related_issues: Související úkoly label_related_issues: Související úkoly
@@ -552,7 +547,7 @@ cs:
label_stay_logged_in: Zůstat přihlášený label_stay_logged_in: Zůstat přihlášený
label_disabled: zakázán label_disabled: zakázán
label_show_completed_versions: Ukázat dokončené verze label_show_completed_versions: Ukázat dokončené verze
label_me: já label_me: mě
label_board: Fórum label_board: Fórum
label_board_new: Nové fórum label_board_new: Nové fórum
label_board_plural: Fóra label_board_plural: Fóra
@@ -575,12 +570,12 @@ cs:
label_module_plural: Moduly label_module_plural: Moduly
label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}" label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}"
label_updated_time: "Aktualizováno před {{value}}" label_updated_time: "Aktualizováno před {{value}}"
label_jump_to_a_project: Vyberte projekt... label_jump_to_a_project: Zvolit projekt...
label_file_plural: Soubory label_file_plural: Soubory
label_changeset_plural: Changesety label_changeset_plural: Changesety
label_default_columns: Výchozí sloupce label_default_columns: Výchozí sloupce
label_no_change_option: (beze změny) label_no_change_option: (beze změny)
label_bulk_edit_selected_issues: Hromadná úprava vybraných úkolů label_bulk_edit_selected_issues: Bulk edit selected issues
label_theme: Téma label_theme: Téma
label_default: Výchozí label_default: Výchozí
label_search_titles_only: Vyhledávat pouze v názvech label_search_titles_only: Vyhledávat pouze v názvech
@@ -599,7 +594,7 @@ cs:
label_scm: SCM label_scm: SCM
label_plugins: Doplňky label_plugins: Doplňky
label_ldap_authentication: Autentifikace LDAP label_ldap_authentication: Autentifikace LDAP
label_downloads_abbr: Staž. label_downloads_abbr: D/L
label_optional_description: Volitelný popis label_optional_description: Volitelný popis
label_add_another_file: Přidat další soubor label_add_another_file: Přidat další soubor
label_preferences: Nastavení label_preferences: Nastavení
@@ -652,33 +647,33 @@ cs:
text_regexp_info: např. ^[A-Z0-9]+$ text_regexp_info: např. ^[A-Z0-9]+$
text_min_max_length_info: 0 znamená bez limitu text_min_max_length_info: 0 znamená bez limitu
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ? text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce text_workflow_edit: Vyberte roli a frontu k editaci workflow
text_are_you_sure: Jste si jisti? text_are_you_sure: Jste si jisti?
text_tip_issue_begin_day: úkol začíná v tento den text_tip_task_begin_day: úkol začíná v tento den
text_tip_issue_end_day: úkol končí v tento den text_tip_task_end_day: úkol končí v tento den
text_tip_issue_begin_end_day: úkol začíná a končí v tento den text_tip_task_begin_end_day: úkol začíná a končí v tento den
text_project_identifier_info: 'Jsou povolena malá písmena (a-z), čísla a pomlčky.<br />Po uložení již není možné identifikátor změnit.' text_project_identifier_info: 'Jsou povolena malá písmena (a-z), čísla a pomlčky.<br />Po uložení již není možné identifikátor změnit.'
text_caracters_maximum: "{{count}} znaků maximálně." text_caracters_maximum: "{{count}} znaků maximálně."
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé." text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
text_length_between: "Délka mezi {{min}} a {{max}} znaky." text_length_between: "Délka mezi {{min}} a {{max}} znaky."
text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce text_tracker_no_workflow: Pro tuto frontu není definován žádný workflow
text_unallowed_characters: Nepovolené znaky text_unallowed_characters: Nepovolené znaky
text_comma_separated: Povoleno více hodnot (oddělěné čárkou). text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}." text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}."
text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}." text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}."
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto Wiki a celý její obsah? text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto WIKI a celý její obsah?
text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?" text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?"
text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii
text_issue_category_reassign_to: Přiřadit úkoly do této kategorie text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))." text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))."
text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit" text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci.Po té si můžete vše upravit"
text_load_default_configuration: Nahrát výchozí konfiguraci text_load_default_configuration: Nahrát výchozí konfiguraci
text_status_changed_by_changeset: "Použito v changesetu {{value}}." text_status_changed_by_changeset: "Použito v changesetu {{value}}."
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?' text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
text_select_project_modules: 'Aktivní moduly v tomto projektu:' text_select_project_modules: 'Aktivní moduly v tomto projektu:'
text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
text_file_repository_writable: Povolen zápis do adresáře ukládání souborů text_file_repository_writable: Povolen zápis do repository
text_rmagick_available: RMagick k dispozici (volitelné) text_rmagick_available: RMagick k dispozici (volitelné)
text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?" text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?"
text_destroy_time_entries: Odstranit evidované hodiny. text_destroy_time_entries: Odstranit evidované hodiny.
@@ -692,7 +687,7 @@ cs:
default_tracker_feature: Požadavek default_tracker_feature: Požadavek
default_tracker_support: Podpora default_tracker_support: Podpora
default_issue_status_new: Nový default_issue_status_new: Nový
default_issue_status_in_progress: Ve vývoji default_issue_status_in_progress: In Progress
default_issue_status_resolved: Vyřešený default_issue_status_resolved: Vyřešený
default_issue_status_feedback: Čeká se default_issue_status_feedback: Čeká se
default_issue_status_closed: Uzavřený default_issue_status_closed: Uzavřený
@@ -704,7 +699,7 @@ cs:
default_priority_high: Vysoká default_priority_high: Vysoká
default_priority_urgent: Urgentní default_priority_urgent: Urgentní
default_priority_immediate: Okamžitá default_priority_immediate: Okamžitá
default_activity_design: Návhr default_activity_design: Design
default_activity_development: Vývoj default_activity_development: Vývoj
enumeration_issue_priorities: Priority úkolů enumeration_issue_priorities: Priority úkolů
@@ -715,10 +710,10 @@ cs:
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány." text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
label_and_its_subprojects: "{{value}} a jeho podprojekty" label_and_its_subprojects: "{{value}} a jeho podprojekty"
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):" mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})" mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní"
text_user_wrote: "{{value}} napsal:" text_user_wrote: "{{value}} napsal:"
label_duplicated_by: duplikováno od label_duplicated_by: duplicated by
setting_enabled_scm: Povolené SCM setting_enabled_scm: Povoleno SCM
text_enumeration_category_reassign_to: 'Přeřadit je do této:' text_enumeration_category_reassign_to: 'Přeřadit je do této:'
text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě." text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě."
label_incoming_emails: Příchozí e-maily label_incoming_emails: Příchozí e-maily
@@ -744,22 +739,22 @@ cs:
permission_view_changesets: Zobrazování sady změn permission_view_changesets: Zobrazování sady změn
permission_view_time_entries: Zobrazení stráveného času permission_view_time_entries: Zobrazení stráveného času
permission_manage_versions: Spravování verzí permission_manage_versions: Spravování verzí
permission_manage_wiki: Spravování Wiki permission_manage_wiki: Spravování wiki
permission_manage_categories: Spravování kategorií úkolů permission_manage_categories: Spravování kategorií úkolů
permission_protect_wiki_pages: Zabezpečení Wiki stránek permission_protect_wiki_pages: Zabezpečení wiki stránek
permission_comment_news: Komentování novinek permission_comment_news: Komentování novinek
permission_delete_messages: Mazání zpráv permission_delete_messages: Mazání zpráv
permission_select_project_modules: Výběr modulů projektu permission_select_project_modules: Výběr modulů projektu
permission_manage_documents: Správa dokumentů permission_manage_documents: Správa dokumentů
permission_edit_wiki_pages: Upravování stránek Wiki permission_edit_wiki_pages: Upravování stránek wiki
permission_add_issue_watchers: Přidání sledujících uživatelů permission_add_issue_watchers: Přidání sledujících uživatelů
permission_view_gantt: Zobrazené Ganttova diagramu permission_view_gantt: Zobrazené Ganttova diagramu
permission_move_issues: Přesouvání úkolů permission_move_issues: Přesouvání úkolů
permission_manage_issue_relations: Spravování vztahů mezi úkoly permission_manage_issue_relations: Spravování vztahů mezi úkoly
permission_delete_wiki_pages: Mazání stránek na Wiki permission_delete_wiki_pages: Mazání stránek na wiki
permission_manage_boards: Správa diskusních fór permission_manage_boards: Správa diskusních fór
permission_delete_wiki_pages_attachments: Mazání příloh permission_delete_wiki_pages_attachments: Mazání příloh
permission_view_wiki_edits: Prohlížení historie Wiki permission_view_wiki_edits: Prohlížení historie wiki
permission_add_messages: Posílání zpráv permission_add_messages: Posílání zpráv
permission_view_messages: Prohlížení zpráv permission_view_messages: Prohlížení zpráv
permission_manage_files: Spravování souborů permission_manage_files: Spravování souborů
@@ -771,26 +766,26 @@ cs:
permission_delete_issues: Mazání úkolů permission_delete_issues: Mazání úkolů
permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
permission_manage_repository: Spravování repozitáře permission_manage_repository: Spravování repozitáře
permission_commit_access: Commit přístup permission_commit_access: Commit access
permission_browse_repository: Procházení repozitáře permission_browse_repository: Procházení repozitáře
permission_view_documents: Prohlížení dokumentů permission_view_documents: Prohlížení dokumentů
permission_edit_project: Úprava projektů permission_edit_project: Úprava projektů
permission_add_issue_notes: Přidávání poznámek permission_add_issue_notes: Přidávání poznámek
permission_save_queries: Ukládání dotazů permission_save_queries: Ukládání dotazů
permission_view_wiki_pages: Prohlížení Wiki permission_view_wiki_pages: Prohlížení wiki
permission_rename_wiki_pages: Přejmenovávání Wiki stránek permission_rename_wiki_pages: Přejmenovávání wiki stránek
permission_edit_time_entries: Upravování záznamů o stráveném času permission_edit_time_entries: Upravování záznamů o stráveném času
permission_edit_own_issue_notes: Upravování vlastních poznámek permission_edit_own_issue_notes: Upravování vlastních poznámek
setting_gravatar_enabled: Použít uživatelské ikony Gravatar setting_gravatar_enabled: Použít uživatelské ikony Gravatar
label_example: Příklad label_example: Příklad
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky." text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživateslkým jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
permission_edit_own_messages: Upravit vlastní zprávy permission_edit_own_messages: Upravit vlastní zprávy
permission_delete_own_messages: Smazat vlastní zprávy permission_delete_own_messages: Smazat vlastní zprávy
label_user_activity: "Aktivita uživatele: {{value}}" label_user_activity: "Aktivita uživatele: {{value}}"
label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}" label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}"
text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.' text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets text_plugin_assets_writable: Plugin assets directory writable
warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit." warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit."
button_create_and_continue: Vytvořit a pokračovat button_create_and_continue: Vytvořit a pokračovat
text_custom_field_possible_values_info: 'Každá hodnota na novém řádku' text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
@@ -809,114 +804,103 @@ cs:
label_date_from_to: Od {{start}} do {{end}} label_date_from_to: Od {{start}} do {{end}}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: Tato stránka má {{descendants}} podstránek a potomků. Co chcete udělat? text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči text_wiki_page_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimální délka hesla setting_password_min_length: Minimum password length
field_group_by: Seskupovat výsledky podle field_group_by: Group results by
mail_subject_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována" mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki stránka přidána label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' Wiki stránka byla přidána" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: "'{{page}}' Wiki stránka byla přidána od {{author}}." mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki stránka aktualizována label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována od {{author}}." mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Vytvořit projekt permission_add_project: Create project
setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: Zobrazit všechny revize label_view_all_revisions: View all revisions
label_tag: Tag label_tag: Tag
label_branch: Branch label_branch: Branch
error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu. error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů"). error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} změněn z {{old}} na {{new}}" text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} nastaven na {{value}}" text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} smazán ({{old}})" text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Skupiny label_group_plural: Groups
label_group: Skupina label_group: Group
label_group_new: Nová skupina label_group_new: New group
label_time_entry_plural: Strávený čas label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} přidán" text_journal_added: "{{label}} {{value}} added"
field_active: Aktivní field_active: Active
enumeration_system_activity: Systémová aktivita enumeration_system_activity: System Activity
permission_delete_issue_watchers: Smazat přihlížející permission_delete_issue_watchers: Delete watchers
version_status_closed: zavřený version_status_closed: closed
version_status_locked: uzamčený version_status_locked: locked
version_status_open: otevřený version_status_open: open
error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymní label_user_anonymous: Anonymous
button_move_and_follow: Přesunout a následovat button_move_and_follow: Move and follow
setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Výchozí Gravatar setting_gravatar_default: Default Gravatar image
field_sharing: Sdílení field_sharing: Sharing
label_version_sharing_hierarchy: S hierarchií projektu label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: Se všemi projekty label_version_sharing_system: With all projects
label_version_sharing_descendants: S podprojekty label_version_sharing_descendants: With subprojects
label_version_sharing_tree: Se stromem projektu label_version_sharing_tree: With project tree
label_version_sharing_none: Nesdíleno label_version_sharing_none: Not shared
error_can_not_archive_project: Tento projekt nemůže být archivován error_can_not_archive_project: This project can not be archived
button_duplicate: Duplikát button_duplicate: Duplicate
button_copy_and_follow: Kopírovat a následovat button_copy_and_follow: Copy and follow
label_copy_source: Zdroj label_copy_source: Source
setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Použít stav úkolu setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován. error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e) error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Použít pole úkolu setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Stejný jako cíl label_copy_same_as_target: Same as target
label_copy_target: Cíl label_copy_target: Target
notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány. notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Začínat kalendáře setting_start_of_week: Start calendars on
permission_view_issues: Zobrazit úkoly permission_view_issues: View Issues
label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revize {{value}} label_revision_id: Revision {{value}}
label_api_access_key: API přístupový klíč label_api_access_key: API access key
label_api_access_key_created_on: API přístupový klíč vytvořen {{value}} label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS přístupový klíč label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Váš API přístupový klíč byl resetován. notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Zapnout službu REST setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Chybějící přístupový klíč API label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Chybějící přístupový klíč RSS label_missing_feeds_access_key: Missing a RSS access key
button_show: Zobrazit button_show: Show
text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Vytvořit podprojekty permission_add_subprojects: Create subprojects
label_subproject_new: Nový podprojekt label_subproject_new: New subproject
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt. You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Opravdu chcete pokračovat? Are you sure you want to continue?
label_close_versions: Zavřít dokončené verze label_close_versions: Close completed versions
label_board_sticky: Nálepka label_board_sticky: Sticky
label_board_locked: Uzamčeno label_board_locked: Locked
permission_export_wiki_pages: Exportovat Wiki stránky permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Spravovat aktivity projektu permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Nelze smazat stavy úkolů error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profil label_profile: Profile
permission_manage_subtasks: Spravovat podúkoly permission_manage_subtasks: Manage subtasks
field_parent_issue: Rodičovský úkol field_parent_issue: Parent task
label_subtask_plural: Podúkol label_subtask_plural: Subtasks
label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Nelze smazat volitelné pole error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Nelze se připojit ({{value}}) error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat. error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán. error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Hlavní field_principal: Principal
label_my_page_block: Bloky na mé stránce label_my_page_block: My page block
notice_failed_to_save_members: "Nepodařilo se uložit člena(y): {{errors}}." notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Oddálit text_zoom_out: Zoom out
text_zoom_in: Přiblížit text_zoom_in: Zoom in
notice_unable_delete_time_entry: Nelze smazat čas ze záznamu. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Celkově strávený čas label_overall_spent_time: Overall spent time
field_time_entries: Zaznamenaný čas
project_module_gantt: Gantt
project_module_calendar: Kalendář
field_member_of_group: Člen skupiny
field_assigned_to_role: Člen role
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole
field_start_date: Start date
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"

Some files were not shown because too many files have changed in this diff Show More