Compare commits
41 Commits
1.2.0
...
0.7-stable
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76bcbce2ef | ||
|
|
7da7e853a3 | ||
|
|
6ae66f4dbf | ||
|
|
a98d4de1e3 | ||
|
|
5e4d66ad50 | ||
|
|
982d6bc748 | ||
|
|
3169291039 | ||
|
|
de86f4b965 | ||
|
|
bf45264131 | ||
|
|
1602fd0dfd | ||
|
|
12c4119abd | ||
|
|
f3a52d2e98 | ||
|
|
ba1af78dc8 | ||
|
|
59427dcfbf | ||
|
|
50755b5913 | ||
|
|
5b0051e710 | ||
|
|
8af523c694 | ||
|
|
2f84506227 | ||
|
|
6e7012c40f | ||
|
|
dfcd0f15ae | ||
|
|
8bfe71e803 | ||
|
|
1c1c9fa517 | ||
|
|
a55317f09c | ||
|
|
fcc5d2847c | ||
|
|
e5b3c31e70 | ||
|
|
2af910e8e6 | ||
|
|
9c5ec2974d | ||
|
|
6f6f1f1ba3 | ||
|
|
3f62305e91 | ||
|
|
15ecbbf928 | ||
|
|
2074f0ab41 | ||
|
|
290bd1756d | ||
|
|
729d1176ea | ||
|
|
c0db7007fa | ||
|
|
d7e3c4df26 | ||
|
|
76ec11422d | ||
|
|
8bc721c264 | ||
|
|
914d1e6645 | ||
|
|
5f346bbf2b | ||
|
|
10191813ec | ||
|
|
be071deae2 |
@@ -56,6 +56,8 @@ class AccountController < ApplicationController
|
||||
flash.now[:error] = l(:notice_account_invalid_creditentials)
|
||||
end
|
||||
end
|
||||
rescue User::OnTheFlyCreationFailure
|
||||
flash.now[:error] = 'Redmine could not retrieve the required information from the LDAP to create your account. Please, contact your Redmine administrator.'
|
||||
end
|
||||
|
||||
# Log out current user and redirect to welcome page
|
||||
|
||||
@@ -28,7 +28,7 @@ class AdminController < ApplicationController
|
||||
|
||||
def projects
|
||||
sort_init 'name', 'asc'
|
||||
sort_update
|
||||
sort_update %w(name is_public created_on)
|
||||
|
||||
@status = params[:status] ? params[:status].to_i : 0
|
||||
conditions = nil
|
||||
|
||||
@@ -61,11 +61,11 @@ class ApplicationController < ActionController::Base
|
||||
def set_localization
|
||||
User.current.language = nil unless User.current.logged?
|
||||
lang = begin
|
||||
if !User.current.language.blank? and GLoc.valid_languages.include? User.current.language.to_sym
|
||||
if !User.current.language.blank? && GLoc.valid_language?(User.current.language)
|
||||
User.current.language
|
||||
elsif request.env['HTTP_ACCEPT_LANGUAGE']
|
||||
accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
|
||||
if accept_lang and !accept_lang.empty? and GLoc.valid_languages.include? accept_lang.to_sym
|
||||
accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.downcase
|
||||
if !accept_lang.blank? && (GLoc.valid_language?(accept_lang) || GLoc.valid_language?(accept_lang = accept_lang.split('-').first))
|
||||
User.current.language = accept_lang
|
||||
end
|
||||
end
|
||||
@@ -150,6 +150,7 @@ class ApplicationController < ActionController::Base
|
||||
def render_feed(items, options={})
|
||||
@items = items || []
|
||||
@items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
|
||||
@items = @items.slice(0, Setting.feeds_limit.to_i)
|
||||
@title = options[:title] || Setting.app_title
|
||||
render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
|
||||
end
|
||||
|
||||
@@ -36,12 +36,13 @@ class BoardsController < ApplicationController
|
||||
end
|
||||
|
||||
def show
|
||||
sort_init "#{Message.table_name}.updated_on", "desc"
|
||||
sort_update
|
||||
sort_init 'updated_on', 'desc'
|
||||
sort_update 'created_on' => "#{Message.table_name}.created_on",
|
||||
'updated_on' => "#{Message.table_name}.updated_on"
|
||||
|
||||
@topic_count = @board.topics.count
|
||||
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
|
||||
@topics = @board.topics.find :all, :order => "#{Message.table_name}.sticky DESC, #{sort_clause}",
|
||||
@topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '),
|
||||
:include => [:author, {:last_reply => :author}],
|
||||
:limit => @topic_pages.items_per_page,
|
||||
:offset => @topic_pages.current.offset
|
||||
|
||||
@@ -45,9 +45,10 @@ class IssuesController < ApplicationController
|
||||
include IssuesHelper
|
||||
|
||||
def index
|
||||
sort_init "#{Issue.table_name}.id", "desc"
|
||||
sort_update
|
||||
retrieve_query
|
||||
sort_init 'id', 'desc'
|
||||
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
|
||||
|
||||
if @query.valid?
|
||||
limit = per_page_option
|
||||
respond_to do |format|
|
||||
@@ -73,12 +74,15 @@ class IssuesController < ApplicationController
|
||||
# Send html if the query is not valid
|
||||
render(:template => 'issues/index.rhtml', :layout => !request.xhr?)
|
||||
end
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
def changes
|
||||
sort_init "#{Issue.table_name}.id", "desc"
|
||||
sort_update
|
||||
retrieve_query
|
||||
sort_init 'id', 'desc'
|
||||
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
|
||||
|
||||
if @query.valid?
|
||||
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
|
||||
:conditions => @query.statement,
|
||||
@@ -87,6 +91,8 @@ class IssuesController < ApplicationController
|
||||
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
|
||||
@@ -98,6 +104,7 @@ class IssuesController < ApplicationController
|
||||
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
||||
@activities = Enumeration::get_values('ACTI')
|
||||
@priorities = Enumeration::get_values('IPRI')
|
||||
@time_entry = TimeEntry.new
|
||||
respond_to do |format|
|
||||
format.html { render :template => 'issues/show.rhtml' }
|
||||
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
|
||||
@@ -133,16 +140,18 @@ class IssuesController < ApplicationController
|
||||
@project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) } :
|
||||
@issue.custom_values
|
||||
else
|
||||
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
|
||||
requested_status = (params[:issue] && params[:issue][:status_id] ? IssueStatus.find_by_id(params[:issue][:status_id]) : default_status)
|
||||
# Check that the user is allowed to apply the requested status
|
||||
@issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
|
||||
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
|
||||
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x,
|
||||
:customized => @issue,
|
||||
:value => (params[:custom_fields] ? params[:custom_fields][x.id.to_s] : nil)) }
|
||||
@issue.custom_values = @custom_values
|
||||
if @issue.save
|
||||
attach_files(@issue, params[:attachments])
|
||||
flash[:notice] = l(:notice_successful_create)
|
||||
Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
|
||||
redirect_to :controller => 'issues', :action => 'show', :id => @issue, :project_id => @project
|
||||
redirect_to :controller => 'issues', :action => 'show', :id => @issue
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -179,13 +188,13 @@ class IssuesController < ApplicationController
|
||||
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
|
||||
@issue.custom_values = @custom_values
|
||||
end
|
||||
@time_entry = TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
|
||||
@time_entry.attributes = params[:time_entry]
|
||||
attachments = attach_files(@issue, params[:attachments])
|
||||
attachments.each {|a| journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
|
||||
if @issue.save
|
||||
# Log spend time
|
||||
if current_role.allowed_to?(:log_time)
|
||||
@time_entry = TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
|
||||
@time_entry.attributes = params[:time_entry]
|
||||
@time_entry.save
|
||||
end
|
||||
if !journal.new_record?
|
||||
@@ -338,8 +347,8 @@ class IssuesController < ApplicationController
|
||||
end
|
||||
|
||||
def preview
|
||||
issue = @project.issues.find_by_id(params[:id])
|
||||
@attachements = issue.attachments if issue
|
||||
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
|
||||
@attachements = @issue.attachments if @issue
|
||||
@text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
|
||||
render :partial => 'common/preview'
|
||||
end
|
||||
@@ -384,7 +393,10 @@ private
|
||||
# Retrieve query from session or build a new query
|
||||
def retrieve_query
|
||||
if !params[:query_id].blank?
|
||||
@query = Query.find(params[:query_id], :conditions => {:project_id => (@project ? @project.id : nil)})
|
||||
cond = "project_id IS NULL"
|
||||
cond << " OR project_id = #{@project.id}" if @project
|
||||
@query = Query.find(params[:query_id], :conditions => cond)
|
||||
@query.project = @project
|
||||
session[:query] = {:id => @query.id, :project_id => @query.project_id}
|
||||
else
|
||||
if params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
|
||||
@@ -404,6 +416,7 @@ private
|
||||
else
|
||||
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
|
||||
@query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters])
|
||||
@query.project = @project
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -66,20 +66,20 @@ class ProjectsController < ApplicationController
|
||||
:conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
|
||||
:order => 'name')
|
||||
@project = Project.new(params[:project])
|
||||
@project.enabled_module_names = Redmine::AccessControl.available_project_modules
|
||||
if request.get?
|
||||
@custom_values = ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
|
||||
@project.trackers = Tracker.all
|
||||
@project.is_public = Setting.default_projects_public?
|
||||
@project.enabled_module_names = Redmine::AccessControl.available_project_modules
|
||||
else
|
||||
@project.custom_fields = CustomField.find(params[:custom_field_ids]) if params[:custom_field_ids]
|
||||
@custom_values = ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => (params[:custom_fields] ? params["custom_fields"][x.id.to_s] : nil)) }
|
||||
@project.custom_values = @custom_values
|
||||
@project.enabled_module_names = params[:enabled_modules]
|
||||
if @project.save
|
||||
@project.enabled_module_names = params[:enabled_modules]
|
||||
flash[:notice] = l(:notice_successful_create)
|
||||
redirect_to :controller => 'admin', :action => 'projects'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -87,7 +87,7 @@ class ProjectsController < ApplicationController
|
||||
def show
|
||||
@custom_values = @project.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position")
|
||||
@members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
|
||||
@subprojects = @project.active_children
|
||||
@subprojects = @project.children.find(:all, :conditions => Project.visible_by(User.current))
|
||||
@news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
|
||||
@trackers = @project.rolled_up_trackers
|
||||
|
||||
@@ -204,7 +204,14 @@ class ProjectsController < ApplicationController
|
||||
end
|
||||
|
||||
def list_files
|
||||
@versions = @project.versions.sort.reverse
|
||||
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"
|
||||
|
||||
@versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
|
||||
render :layout => !request.xhr?
|
||||
end
|
||||
|
||||
# Show changelog for @project
|
||||
@@ -338,8 +345,9 @@ class ProjectsController < ApplicationController
|
||||
:include => [:tracker, :status, :assigned_to, :priority, :project],
|
||||
:conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{Issue.table_name}.tracker_id IN (#{@selected_tracker_ids.join(',')})", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
|
||||
) unless @selected_tracker_ids.empty?
|
||||
events += Version.find(:all, :include => :project,
|
||||
:conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
|
||||
end
|
||||
events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
|
||||
@calendar.events = events
|
||||
|
||||
render :layout => false if request.xhr?
|
||||
@@ -383,8 +391,9 @@ class ProjectsController < ApplicationController
|
||||
:include => [:tracker, :status, :assigned_to, :priority, :project],
|
||||
:conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
|
||||
) unless @selected_tracker_ids.empty?
|
||||
@events += Version.find(:all, :include => :project,
|
||||
:conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
|
||||
end
|
||||
@events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
|
||||
@events.sort! {|x,y| x.start_date <=> y.start_date }
|
||||
|
||||
if params[:format]=='pdf'
|
||||
|
||||
@@ -18,19 +18,14 @@
|
||||
class QueriesController < ApplicationController
|
||||
layout 'base'
|
||||
menu_item :issues
|
||||
before_filter :find_project, :authorize
|
||||
|
||||
def index
|
||||
@queries = @project.queries.find(:all,
|
||||
:order => "name ASC",
|
||||
:conditions => ["is_public = ? or user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
|
||||
end
|
||||
before_filter :find_query, :except => :new
|
||||
before_filter :find_optional_project, :only => :new
|
||||
|
||||
def new
|
||||
@query = Query.new(params[:query])
|
||||
@query.project = @project
|
||||
@query.project = params[:query_is_for_all] ? nil : @project
|
||||
@query.user = User.current
|
||||
@query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
|
||||
@query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
|
||||
@query.column_names = nil if params[:default_columns]
|
||||
|
||||
params[:fields].each do |field|
|
||||
@@ -52,7 +47,8 @@ class QueriesController < ApplicationController
|
||||
@query.add_filter(field, params[:operators][field], params[:values][field])
|
||||
end if params[:fields]
|
||||
@query.attributes = params[:query]
|
||||
@query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
|
||||
@query.project = nil if params[:query_is_for_all]
|
||||
@query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
|
||||
@query.column_names = nil if params[:default_columns]
|
||||
|
||||
if @query.save
|
||||
@@ -64,18 +60,21 @@ class QueriesController < ApplicationController
|
||||
|
||||
def destroy
|
||||
@query.destroy if request.post?
|
||||
redirect_to :controller => 'queries', :project_id => @project
|
||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1
|
||||
end
|
||||
|
||||
private
|
||||
def find_project
|
||||
if params[:id]
|
||||
@query = Query.find(params[:id])
|
||||
@project = @query.project
|
||||
render_403 unless @query.editable_by?(User.current)
|
||||
else
|
||||
@project = Project.find(params[:project_id])
|
||||
end
|
||||
def find_query
|
||||
@query = Query.find(params[:id])
|
||||
@project = @query.project
|
||||
render_403 unless @query.editable_by?(User.current)
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
def find_optional_project
|
||||
@project = Project.find(params[:project_id]) if params[:project_id]
|
||||
User.current.allowed_to?(:save_queries, @project, :global => true)
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
@@ -19,8 +19,8 @@ require 'SVG/Graph/Bar'
|
||||
require 'SVG/Graph/BarHorizontal'
|
||||
require 'digest/sha1'
|
||||
|
||||
class ChangesetNotFound < Exception
|
||||
end
|
||||
class ChangesetNotFound < Exception; end
|
||||
class InvalidRevisionParam < Exception; end
|
||||
|
||||
class RepositoriesController < ApplicationController
|
||||
layout 'base'
|
||||
@@ -51,8 +51,8 @@ class RepositoriesController < ApplicationController
|
||||
def show
|
||||
# check if new revisions have been committed in the repository
|
||||
@repository.fetch_changesets if Setting.autofetch_changesets?
|
||||
# get entries for the browse frame
|
||||
@entries = @repository.entries('')
|
||||
# root entries
|
||||
@entries = @repository.entries('', @rev)
|
||||
# latest changesets
|
||||
@changesets = @repository.changesets.find(:all, :limit => 10, :order => "committed_on DESC")
|
||||
show_error_not_found unless @entries || @changesets.any?
|
||||
@@ -65,7 +65,8 @@ class RepositoriesController < ApplicationController
|
||||
if request.xhr?
|
||||
@entries ? render(:partial => 'dir_list_content') : render(:nothing => true)
|
||||
else
|
||||
show_error_not_found unless @entries
|
||||
show_error_not_found and return unless @entries
|
||||
render :action => 'browse'
|
||||
end
|
||||
rescue Redmine::Scm::Adapters::CommandFailed => e
|
||||
show_error_command_failed(e.message)
|
||||
@@ -95,6 +96,12 @@ class RepositoriesController < ApplicationController
|
||||
end
|
||||
|
||||
def entry
|
||||
@entry = @repository.scm.entry(@path, @rev)
|
||||
show_error_not_found and return unless @entry
|
||||
|
||||
# If the entry is a dir, show the browser
|
||||
browse and return if @entry.is_dir?
|
||||
|
||||
@content = @repository.scm.cat(@path, @rev)
|
||||
show_error_not_found and return unless @content
|
||||
if 'raw' == params[:format] || @content.is_binary_data?
|
||||
@@ -135,7 +142,6 @@ class RepositoriesController < ApplicationController
|
||||
end
|
||||
|
||||
def diff
|
||||
@rev_to = params[:rev_to]
|
||||
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
|
||||
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
|
||||
|
||||
@@ -180,6 +186,8 @@ private
|
||||
render_404
|
||||
end
|
||||
|
||||
REV_PARAM_RE = %r{^[a-f0-9]*$}
|
||||
|
||||
def find_repository
|
||||
@project = Project.find(params[:id])
|
||||
@repository = @project.repository
|
||||
@@ -187,8 +195,12 @@ private
|
||||
@path = params[:path].join('/') unless params[:path].nil?
|
||||
@path ||= ''
|
||||
@rev = params[:rev]
|
||||
@rev_to = params[:rev_to]
|
||||
raise InvalidRevisionParam unless @rev.to_s.match(REV_PARAM_RE) && @rev.to_s.match(REV_PARAM_RE)
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
rescue InvalidRevisionParam
|
||||
show_error_not_found
|
||||
end
|
||||
|
||||
def show_error_not_found
|
||||
@@ -255,6 +267,9 @@ private
|
||||
commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
|
||||
changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10
|
||||
|
||||
# Remove email adress in usernames
|
||||
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
|
||||
|
||||
graph = SVG::Graph::BarHorizontal.new(
|
||||
:height => 300,
|
||||
:width => 500,
|
||||
|
||||
@@ -26,6 +26,8 @@ class TimelogController < ApplicationController
|
||||
include SortHelper
|
||||
helper :issues
|
||||
include TimelogHelper
|
||||
helper :custom_fields
|
||||
include CustomFieldsHelper
|
||||
|
||||
def report
|
||||
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
|
||||
@@ -45,37 +47,40 @@ class TimelogController < ApplicationController
|
||||
:label => :label_tracker},
|
||||
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
|
||||
:klass => Enumeration,
|
||||
:label => :label_activity}
|
||||
:label => :label_activity},
|
||||
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
|
||||
:klass => Issue,
|
||||
:label => :label_issue}
|
||||
}
|
||||
|
||||
# Add list and boolean custom fields as available criterias
|
||||
@project.all_custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
||||
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM custom_values c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = issues.id)",
|
||||
:format => cf.field_format,
|
||||
:label => cf.name}
|
||||
end
|
||||
|
||||
@criterias = params[:criterias] || []
|
||||
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
|
||||
@criterias.uniq!
|
||||
@criterias = @criterias[0,3]
|
||||
|
||||
@columns = (params[:period] && %w(year month week).include?(params[:period])) ? params[:period] : 'month'
|
||||
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
|
||||
|
||||
if params[:date_from]
|
||||
begin; @date_from = params[:date_from].to_date; rescue; end
|
||||
end
|
||||
if params[:date_to]
|
||||
begin; @date_to = params[:date_to].to_date; rescue; end
|
||||
end
|
||||
@date_from ||= Date.civil(Date.today.year, 1, 1)
|
||||
@date_to ||= (Date.civil(Date.today.year, Date.today.month, 1) >> 1) - 1
|
||||
retrieve_date_range
|
||||
|
||||
unless @criterias.empty?
|
||||
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
|
||||
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
|
||||
|
||||
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, SUM(hours) AS hours"
|
||||
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
|
||||
sql << " FROM #{TimeEntry.table_name}"
|
||||
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 (%s)" % @project.project_condition(Setting.display_subprojects_issues?)
|
||||
sql << " AND (%s)" % Project.allowed_to_condition(User.current, :view_time_entries)
|
||||
sql << " AND spent_on BETWEEN '%s' AND '%s'" % [ActiveRecord::Base.connection.quoted_date(@date_from.to_time), ActiveRecord::Base.connection.quoted_date(@date_to.to_time)]
|
||||
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek"
|
||||
sql << " AND spent_on BETWEEN '%s' AND '%s'" % [ActiveRecord::Base.connection.quoted_date(@from.to_time), ActiveRecord::Base.connection.quoted_date(@to.to_time)]
|
||||
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
|
||||
|
||||
@hours = ActiveRecord::Base.connection.select_all(sql)
|
||||
|
||||
@@ -87,36 +92,127 @@ class TimelogController < ApplicationController
|
||||
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
|
||||
when 'week'
|
||||
row['week'] = "#{row['tyear']}-#{row['tweek']}"
|
||||
when 'day'
|
||||
row['day'] = "#{row['spent_on']}"
|
||||
end
|
||||
end
|
||||
|
||||
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
|
||||
end
|
||||
|
||||
@periods = []
|
||||
date_from = @date_from
|
||||
# 100 columns max
|
||||
while date_from < @date_to && @periods.length < 100
|
||||
case @columns
|
||||
when 'year'
|
||||
@periods << "#{date_from.year}"
|
||||
date_from = date_from >> 12
|
||||
when 'month'
|
||||
@periods << "#{date_from.year}-#{date_from.month}"
|
||||
date_from = date_from >> 1
|
||||
when 'week'
|
||||
@periods << "#{date_from.year}-#{date_from.cweek}"
|
||||
date_from = date_from + 7
|
||||
|
||||
@periods = []
|
||||
# Date#at_beginning_of_ not supported in Rails 1.2.x
|
||||
date_from = @from.to_time
|
||||
# 100 columns max
|
||||
while date_from <= @to.to_time && @periods.length < 100
|
||||
case @columns
|
||||
when 'year'
|
||||
@periods << "#{date_from.year}"
|
||||
date_from = (date_from + 1.year).at_beginning_of_year
|
||||
when 'month'
|
||||
@periods << "#{date_from.year}-#{date_from.month}"
|
||||
date_from = (date_from + 1.month).at_beginning_of_month
|
||||
when 'week'
|
||||
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
|
||||
date_from = (date_from + 7.day).at_beginning_of_week
|
||||
when 'day'
|
||||
@periods << "#{date_from.to_date}"
|
||||
date_from = date_from + 1.day
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
render :layout => false if request.xhr?
|
||||
respond_to do |format|
|
||||
format.html { render :layout => !request.xhr? }
|
||||
format.csv { send_data(report_to_csv(@criterias, @periods, @hours).read, :type => 'text/csv; header=present', :filename => 'timelog.csv') }
|
||||
end
|
||||
end
|
||||
|
||||
def details
|
||||
sort_init 'spent_on', 'desc'
|
||||
sort_update
|
||||
sort_update 'spent_on' => 'spent_on',
|
||||
'user' => 'user_id',
|
||||
'activity' => 'activity_id',
|
||||
'project' => "#{Project.table_name}.name",
|
||||
'issue' => 'issue_id',
|
||||
'hours' => 'hours'
|
||||
|
||||
cond = ARCondition.new
|
||||
cond << (@issue.nil? ? @project.project_condition(Setting.display_subprojects_issues?) :
|
||||
["#{TimeEntry.table_name}.issue_id = ?", @issue.id])
|
||||
|
||||
retrieve_date_range
|
||||
cond << ['spent_on BETWEEN ? AND ?', @from, @to]
|
||||
|
||||
TimeEntry.visible_by(User.current) do
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
# Paginate results
|
||||
@entry_count = TimeEntry.count(:include => :project, :conditions => cond.conditions)
|
||||
@entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
|
||||
@entries = TimeEntry.find(:all,
|
||||
:include => [:project, :activity, :user, {:issue => :tracker}],
|
||||
:conditions => cond.conditions,
|
||||
:order => sort_clause,
|
||||
:limit => @entry_pages.items_per_page,
|
||||
:offset => @entry_pages.current.offset)
|
||||
@total_hours = TimeEntry.sum(:hours, :include => :project, :conditions => cond.conditions).to_f
|
||||
|
||||
render :layout => !request.xhr?
|
||||
}
|
||||
format.csv {
|
||||
# Export all entries
|
||||
@entries = TimeEntry.find(:all,
|
||||
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
|
||||
:conditions => cond.conditions,
|
||||
:order => sort_clause)
|
||||
send_data(entries_to_csv(@entries).read, :type => 'text/csv; header=present', :filename => 'timelog.csv')
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
render_403 and return if @time_entry && !@time_entry.editable_by?(User.current)
|
||||
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
|
||||
@time_entry.attributes = params[:time_entry]
|
||||
if request.post? and @time_entry.save
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
redirect_to(params[:back_url].blank? ? {:action => 'details', :project_id => @time_entry.project} : params[:back_url])
|
||||
return
|
||||
end
|
||||
@activities = Enumeration::get_values('ACTI')
|
||||
end
|
||||
|
||||
def destroy
|
||||
render_404 and return unless @time_entry
|
||||
render_403 and return unless @time_entry.editable_by?(User.current)
|
||||
@time_entry.destroy
|
||||
flash[:notice] = l(:notice_successful_delete)
|
||||
redirect_to :back
|
||||
rescue RedirectBackError
|
||||
redirect_to :action => 'details', :project_id => @time_entry.project
|
||||
end
|
||||
|
||||
private
|
||||
def find_project
|
||||
if params[:id]
|
||||
@time_entry = TimeEntry.find(params[:id])
|
||||
@project = @time_entry.project
|
||||
elsif params[:issue_id]
|
||||
@issue = Issue.find(params[:issue_id])
|
||||
@project = @issue.project
|
||||
elsif params[:project_id]
|
||||
@project = Project.find(params[:project_id])
|
||||
else
|
||||
render_404
|
||||
return false
|
||||
end
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
# Retrieves the date range based on predefined ranges or specific from/to param dates
|
||||
def retrieve_date_range
|
||||
@free_period = false
|
||||
@from, @to = nil, nil
|
||||
|
||||
@@ -157,85 +253,7 @@ class TimelogController < ApplicationController
|
||||
end
|
||||
|
||||
@from, @to = @to, @from if @from && @to && @from > @to
|
||||
|
||||
cond = ARCondition.new
|
||||
cond << (@issue.nil? ? @project.project_condition(Setting.display_subprojects_issues?) :
|
||||
["#{TimeEntry.table_name}.issue_id = ?", @issue.id])
|
||||
|
||||
if @from
|
||||
if @to
|
||||
cond << ['spent_on BETWEEN ? AND ?', @from, @to]
|
||||
else
|
||||
cond << ['spent_on >= ?', @from]
|
||||
end
|
||||
elsif @to
|
||||
cond << ['spent_on <= ?', @to]
|
||||
end
|
||||
|
||||
TimeEntry.visible_by(User.current) do
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
# Paginate results
|
||||
@entry_count = TimeEntry.count(:include => :project, :conditions => cond.conditions)
|
||||
@entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
|
||||
@entries = TimeEntry.find(:all,
|
||||
:include => [:project, :activity, :user, {:issue => :tracker}],
|
||||
:conditions => cond.conditions,
|
||||
:order => sort_clause,
|
||||
:limit => @entry_pages.items_per_page,
|
||||
:offset => @entry_pages.current.offset)
|
||||
@total_hours = TimeEntry.sum(:hours, :include => :project, :conditions => cond.conditions).to_f
|
||||
render :layout => !request.xhr?
|
||||
}
|
||||
format.csv {
|
||||
# Export all entries
|
||||
@entries = TimeEntry.find(:all,
|
||||
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
|
||||
:conditions => cond.conditions,
|
||||
:order => sort_clause)
|
||||
send_data(entries_to_csv(@entries).read, :type => 'text/csv; header=present', :filename => 'timelog.csv')
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
render_403 and return if @time_entry && !@time_entry.editable_by?(User.current)
|
||||
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
|
||||
@time_entry.attributes = params[:time_entry]
|
||||
if request.post? and @time_entry.save
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
redirect_to :action => 'details', :project_id => @time_entry.project
|
||||
return
|
||||
end
|
||||
@activities = Enumeration::get_values('ACTI')
|
||||
end
|
||||
|
||||
def destroy
|
||||
render_404 and return unless @time_entry
|
||||
render_403 and return unless @time_entry.editable_by?(User.current)
|
||||
@time_entry.destroy
|
||||
flash[:notice] = l(:notice_successful_delete)
|
||||
redirect_to :back
|
||||
rescue RedirectBackError
|
||||
redirect_to :action => 'details', :project_id => @time_entry.project
|
||||
end
|
||||
|
||||
private
|
||||
def find_project
|
||||
if params[:id]
|
||||
@time_entry = TimeEntry.find(params[:id])
|
||||
@project = @time_entry.project
|
||||
elsif params[:issue_id]
|
||||
@issue = Issue.find(params[:issue_id])
|
||||
@project = @issue.project
|
||||
elsif params[:project_id]
|
||||
@project = Project.find(params[:project_id])
|
||||
else
|
||||
render_404
|
||||
return false
|
||||
end
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
@from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => @project.project_condition(Setting.display_subprojects_issues?)) || Date.today) - 1
|
||||
@to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => @project.project_condition(Setting.display_subprojects_issues?)) || Date.today)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -31,7 +31,7 @@ class UsersController < ApplicationController
|
||||
|
||||
def list
|
||||
sort_init 'login', 'asc'
|
||||
sort_update
|
||||
sort_update %w(login firstname lastname mail admin created_on last_login_on)
|
||||
|
||||
@status = params[:status] ? params[:status].to_i : 1
|
||||
conditions = "status <> 0"
|
||||
@@ -83,7 +83,8 @@ class UsersController < ApplicationController
|
||||
end
|
||||
if @user.update_attributes(params[:user])
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
redirect_to :action => 'list'
|
||||
# Give a string to redirect_to otherwise it would use status param as the response code
|
||||
redirect_to(url_for(:action => 'list', :status => params[:status], :page => params[:page]))
|
||||
end
|
||||
end
|
||||
@auth_sources = AuthSource.find(:all)
|
||||
|
||||
@@ -90,6 +90,11 @@ module ApplicationHelper
|
||||
include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
|
||||
end
|
||||
|
||||
# Truncates and returns the string as a single line
|
||||
def truncate_single_line(string, *args)
|
||||
truncate(string, *args).gsub(%r{[\r\n]+}m, ' ')
|
||||
end
|
||||
|
||||
def html_hours(text)
|
||||
text.gsub(%r{(\d+)\.(\d+)}, '<span class="hours hours-int">\1</span><span class="hours hours-dec">.\2</span>')
|
||||
end
|
||||
@@ -207,8 +212,10 @@ module ApplicationHelper
|
||||
rf = Regexp.new(filename, Regexp::IGNORECASE)
|
||||
# search for the picture in attachments
|
||||
if found = attachments.detect { |att| att.filename =~ rf }
|
||||
image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found.id
|
||||
"!#{style}#{image_url}!"
|
||||
image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
|
||||
desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
|
||||
alt = desc.blank? ? nil : "(#{desc})"
|
||||
"!#{style}#{image_url}#{alt}!"
|
||||
else
|
||||
"!#{style}#{filename}!"
|
||||
end
|
||||
@@ -291,7 +298,7 @@ module ApplicationHelper
|
||||
# source:some/file#L120 -> Link to line 120 of the file
|
||||
# source:some/file@52#L120 -> Link to line 120 of the file's revision 52
|
||||
# export:some/file -> Force the download of the file
|
||||
text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m|
|
||||
text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m|
|
||||
leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
|
||||
link = nil
|
||||
if esc.nil?
|
||||
@@ -299,7 +306,7 @@ module ApplicationHelper
|
||||
if project && (changeset = project.changesets.find_by_revision(oid))
|
||||
link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
|
||||
:class => 'changeset',
|
||||
:title => truncate(changeset.comments, 100))
|
||||
:title => truncate_single_line(changeset.comments, 100))
|
||||
end
|
||||
elsif sep == '#'
|
||||
oid = oid.to_i
|
||||
@@ -338,7 +345,9 @@ module ApplicationHelper
|
||||
end
|
||||
when 'commit'
|
||||
if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
|
||||
link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision}, :class => 'changeset', :title => truncate(changeset.comments, 100)
|
||||
link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
|
||||
:class => 'changeset',
|
||||
:title => truncate_single_line(changeset.comments, 100)
|
||||
end
|
||||
when 'source', 'export'
|
||||
if project && project.repository
|
||||
@@ -425,6 +434,10 @@ module ApplicationHelper
|
||||
form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
|
||||
end
|
||||
|
||||
def back_url_hidden_field_tag
|
||||
hidden_field_tag 'back_url', (params[:back_url] || request.env['HTTP_REFERER'])
|
||||
end
|
||||
|
||||
def check_all_links(form_name)
|
||||
link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
|
||||
" | " +
|
||||
@@ -463,9 +476,22 @@ module ApplicationHelper
|
||||
end
|
||||
|
||||
def calendar_for(field_id)
|
||||
include_calendar_headers_tags
|
||||
image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
|
||||
javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
|
||||
end
|
||||
|
||||
def include_calendar_headers_tags
|
||||
unless @calendar_headers_tags_included
|
||||
@calendar_headers_tags_included = true
|
||||
content_for :header_tags do
|
||||
javascript_include_tag('calendar/calendar') +
|
||||
javascript_include_tag("calendar/lang/calendar-#{current_language}.js") +
|
||||
javascript_include_tag('calendar/calendar-setup') +
|
||||
stylesheet_link_tag('calendar')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def wikitoolbar_for(field_id)
|
||||
return '' unless Setting.text_formatting == 'textile'
|
||||
|
||||
@@ -32,6 +32,19 @@ module IssuesHelper
|
||||
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
|
||||
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
|
||||
end
|
||||
|
||||
def sidebar_queries
|
||||
unless @sidebar_queries
|
||||
# User can see public queries and his own queries
|
||||
visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
|
||||
# Project specific queries and global queries
|
||||
visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
|
||||
@sidebar_queries = Query.find(:all,
|
||||
:order => "name ASC",
|
||||
:conditions => visible.conditions)
|
||||
end
|
||||
@sidebar_queries
|
||||
end
|
||||
|
||||
def show_detail(detail, no_html=false)
|
||||
case detail.property
|
||||
|
||||
@@ -21,6 +21,10 @@ module ProjectsHelper
|
||||
link_to h(version.name), { :controller => 'versions', :action => 'show', :id => version }, options
|
||||
end
|
||||
|
||||
def format_activity_title(text)
|
||||
h(truncate_single_line(text, 100))
|
||||
end
|
||||
|
||||
def format_activity_day(date)
|
||||
date == Date.today ? l(:label_today).titleize : format_date(date)
|
||||
end
|
||||
|
||||
@@ -22,8 +22,8 @@ module QueriesHelper
|
||||
end
|
||||
|
||||
def column_header(column)
|
||||
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption,
|
||||
:default_order => column.default_order) :
|
||||
column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
|
||||
:default_order => column.default_order) :
|
||||
content_tag('th', column.caption)
|
||||
end
|
||||
|
||||
|
||||
@@ -58,8 +58,11 @@ module RepositoriesHelper
|
||||
end
|
||||
|
||||
def with_leading_slash(path)
|
||||
path ||= ''
|
||||
path.starts_with?('/') ? path : "/#{path}"
|
||||
path.to_s.starts_with?('/') ? path : "/#{path}"
|
||||
end
|
||||
|
||||
def without_leading_slash(path)
|
||||
path.gsub(%r{^/+}, '')
|
||||
end
|
||||
|
||||
def subversion_field_tags(form, repository)
|
||||
|
||||
@@ -67,23 +67,31 @@ module SortHelper
|
||||
|
||||
# Updates the sort state. Call this in the controller prior to calling
|
||||
# sort_clause.
|
||||
#
|
||||
def sort_update()
|
||||
if params[:sort_key]
|
||||
sort = {:key => params[:sort_key], :order => params[:sort_order]}
|
||||
# sort_keys can be either an array or a hash of allowed keys
|
||||
def sort_update(sort_keys)
|
||||
sort_key = params[:sort_key]
|
||||
sort_key = nil unless (sort_keys.is_a?(Array) ? sort_keys.include?(sort_key) : sort_keys[sort_key])
|
||||
|
||||
sort_order = (params[:sort_order] == 'desc' ? 'DESC' : 'ASC')
|
||||
|
||||
if sort_key
|
||||
sort = {:key => sort_key, :order => sort_order}
|
||||
elsif session[@sort_name]
|
||||
sort = session[@sort_name] # Previous sort.
|
||||
else
|
||||
sort = @sort_default
|
||||
end
|
||||
session[@sort_name] = sort
|
||||
|
||||
sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
|
||||
@sort_clause = (sort_column.blank? ? nil : "#{sort_column} #{sort[:order]}")
|
||||
end
|
||||
|
||||
# Returns an SQL sort clause corresponding to the current sort state.
|
||||
# Use this to sort the controller's table items collection.
|
||||
#
|
||||
def sort_clause()
|
||||
session[@sort_name][:key] + ' ' + session[@sort_name][:order]
|
||||
@sort_clause
|
||||
end
|
||||
|
||||
# Returns a link which sorts by the named column.
|
||||
|
||||
@@ -76,4 +76,60 @@ module TimelogHelper
|
||||
export.rewind
|
||||
export
|
||||
end
|
||||
|
||||
def format_criteria_value(criteria, value)
|
||||
value.blank? ? l(:label_none) : ((k = @available_criterias[criteria][:klass]) ? k.find_by_id(value.to_i) : format_value(value, @available_criterias[criteria][:format]))
|
||||
end
|
||||
|
||||
def report_to_csv(criterias, periods, hours)
|
||||
export = StringIO.new
|
||||
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
|
||||
# Column headers
|
||||
headers = criterias.collect {|criteria| l(@available_criterias[criteria][:label]) }
|
||||
headers += periods
|
||||
headers << l(:label_total)
|
||||
csv << headers.collect {|c| to_utf8(c) }
|
||||
# Content
|
||||
report_criteria_to_csv(csv, criterias, periods, hours)
|
||||
# Total row
|
||||
row = [ l(:label_total) ] + [''] * (criterias.size - 1)
|
||||
total = 0
|
||||
periods.each do |period|
|
||||
sum = sum_hours(select_hours(hours, @columns, period.to_s))
|
||||
total += sum
|
||||
row << (sum > 0 ? "%.2f" % sum : '')
|
||||
end
|
||||
row << "%.2f" %total
|
||||
csv << row
|
||||
end
|
||||
export.rewind
|
||||
export
|
||||
end
|
||||
|
||||
def report_criteria_to_csv(csv, criterias, periods, hours, level=0)
|
||||
hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value|
|
||||
hours_for_value = select_hours(hours, criterias[level], value)
|
||||
next if hours_for_value.empty?
|
||||
row = [''] * level
|
||||
row << to_utf8(format_criteria_value(criterias[level], value))
|
||||
row += [''] * (criterias.length - level - 1)
|
||||
total = 0
|
||||
periods.each do |period|
|
||||
sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s))
|
||||
total += sum
|
||||
row << (sum > 0 ? "%.2f" % sum : '')
|
||||
end
|
||||
row << "%.2f" %total
|
||||
csv << row
|
||||
|
||||
if criterias.length > level + 1
|
||||
report_criteria_to_csv(csv, criterias, periods, hours_for_value, level + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def to_utf8(s)
|
||||
@ic ||= Iconv.new(l(:general_csv_encoding), 'UTF-8')
|
||||
begin; @ic.iconv(s.to_s); rescue; s.to_s; end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -22,4 +22,16 @@ module UsersHelper
|
||||
[l(:status_registered), 2],
|
||||
[l(:status_locked), 3]], selected)
|
||||
end
|
||||
|
||||
def change_status_link(user)
|
||||
url = {:action => 'edit', :id => user, :page => params[:page], :status => params[:status]}
|
||||
|
||||
if user.locked?
|
||||
link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :post, :class => 'icon icon-unlock'
|
||||
elsif user.registered?
|
||||
link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :post, :class => 'icon icon-unlock'
|
||||
elsif user != User.current
|
||||
link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :post, :class => 'icon icon-lock'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -35,48 +35,48 @@ class Attachment < ActiveRecord::Base
|
||||
errors.add_to_base :too_long if self.filesize > Setting.attachment_max_size.to_i.kilobytes
|
||||
end
|
||||
|
||||
def file=(incomming_file)
|
||||
unless incomming_file.nil?
|
||||
@temp_file = incomming_file
|
||||
if @temp_file.size > 0
|
||||
self.filename = sanitize_filename(@temp_file.original_filename)
|
||||
self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename
|
||||
self.content_type = @temp_file.content_type.to_s.chomp
|
||||
self.filesize = @temp_file.size
|
||||
end
|
||||
end
|
||||
end
|
||||
def file=(incoming_file)
|
||||
unless incoming_file.nil?
|
||||
@temp_file = incoming_file
|
||||
if @temp_file.size > 0
|
||||
self.filename = sanitize_filename(@temp_file.original_filename)
|
||||
self.disk_filename = Attachment.disk_filename(filename)
|
||||
self.content_type = @temp_file.content_type.to_s.chomp
|
||||
self.filesize = @temp_file.size
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def file
|
||||
nil
|
||||
end
|
||||
|
||||
# Copy temp file to its final location
|
||||
def before_save
|
||||
if @temp_file && (@temp_file.size > 0)
|
||||
logger.debug("saving '#{self.diskfile}'")
|
||||
File.open(diskfile, "wb") do |f|
|
||||
f.write(@temp_file.read)
|
||||
end
|
||||
self.digest = Digest::MD5.hexdigest(File.read(diskfile))
|
||||
end
|
||||
# Don't save the content type if it's longer than the authorized length
|
||||
if self.content_type && self.content_type.length > 255
|
||||
self.content_type = nil
|
||||
end
|
||||
end
|
||||
|
||||
# Deletes file on the disk
|
||||
def after_destroy
|
||||
if self.filename?
|
||||
File.delete(diskfile) if File.exist?(diskfile)
|
||||
end
|
||||
end
|
||||
|
||||
# Returns file's location on disk
|
||||
def diskfile
|
||||
"#{@@storage_path}/#{self.disk_filename}"
|
||||
end
|
||||
def file
|
||||
nil
|
||||
end
|
||||
|
||||
# Copy temp file to its final location
|
||||
def before_save
|
||||
if @temp_file && (@temp_file.size > 0)
|
||||
logger.debug("saving '#{self.diskfile}'")
|
||||
File.open(diskfile, "wb") do |f|
|
||||
f.write(@temp_file.read)
|
||||
end
|
||||
self.digest = Digest::MD5.hexdigest(File.read(diskfile))
|
||||
end
|
||||
# Don't save the content type if it's longer than the authorized length
|
||||
if self.content_type && self.content_type.length > 255
|
||||
self.content_type = nil
|
||||
end
|
||||
end
|
||||
|
||||
# Deletes file on the disk
|
||||
def after_destroy
|
||||
if self.filename?
|
||||
File.delete(diskfile) if File.exist?(diskfile)
|
||||
end
|
||||
end
|
||||
|
||||
# Returns file's location on disk
|
||||
def diskfile
|
||||
"#{@@storage_path}/#{self.disk_filename}"
|
||||
end
|
||||
|
||||
def increment_download
|
||||
increment!(:downloads)
|
||||
@@ -87,18 +87,30 @@ class Attachment < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def image?
|
||||
self.filename =~ /\.(jpeg|jpg|gif|png)$/i
|
||||
self.filename =~ /\.(jpe?g|gif|png)$/i
|
||||
end
|
||||
|
||||
private
|
||||
def sanitize_filename(value)
|
||||
# get only the filename, not the whole path
|
||||
just_filename = value.gsub(/^.*(\\|\/)/, '')
|
||||
# NOTE: File.basename doesn't work right with Windows paths on Unix
|
||||
# INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/'))
|
||||
# get only the filename, not the whole path
|
||||
just_filename = value.gsub(/^.*(\\|\/)/, '')
|
||||
# NOTE: File.basename doesn't work right with Windows paths on Unix
|
||||
# INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/'))
|
||||
|
||||
# Finally, replace all non alphanumeric, underscore or periods with underscore
|
||||
@filename = just_filename.gsub(/[^\w\.\-]/,'_')
|
||||
# Finally, replace all non alphanumeric, hyphens or periods with underscore
|
||||
@filename = just_filename.gsub(/[^\w\.\-]/,'_')
|
||||
end
|
||||
|
||||
# Returns an ASCII or hashed filename
|
||||
def self.disk_filename(filename)
|
||||
df = DateTime.now.strftime("%y%m%d%H%M%S") + "_"
|
||||
if filename =~ %r{^[a-zA-Z0-9_\.\-]*$}
|
||||
df << filename
|
||||
else
|
||||
df << Digest::MD5.hexdigest(filename)
|
||||
# keep the extension if any
|
||||
df << $1 if filename =~ %r{(\.[a-zA-Z0-9]+)$}
|
||||
end
|
||||
df
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -19,4 +19,8 @@ class Change < ActiveRecord::Base
|
||||
belongs_to :changeset
|
||||
|
||||
validates_presence_of :changeset_id, :action, :path
|
||||
|
||||
def relative_path
|
||||
changeset.repository.relative_path(path)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -35,6 +35,10 @@ class Changeset < ActiveRecord::Base
|
||||
validates_uniqueness_of :revision, :scope => :repository_id
|
||||
validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
|
||||
|
||||
def revision=(r)
|
||||
write_attribute :revision, (r.nil? ? nil : r.to_s)
|
||||
end
|
||||
|
||||
def comments=(comment)
|
||||
write_attribute(:comments, comment.strip)
|
||||
end
|
||||
@@ -71,7 +75,7 @@ class Changeset < ActiveRecord::Base
|
||||
if ref_keywords.delete('*')
|
||||
# find any issue ID in the comments
|
||||
target_issue_ids = []
|
||||
comments.scan(%r{([\s\(,-^])#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] }
|
||||
comments.scan(%r{([\s\(,-]|^)#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] }
|
||||
referenced_issues += repository.project.issues.find_all_by_id(target_issue_ids)
|
||||
end
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ class Enumeration < ActiveRecord::Base
|
||||
validates_presence_of :opt, :name
|
||||
validates_uniqueness_of :name, :scope => [:opt]
|
||||
validates_length_of :name, :maximum => 30
|
||||
validates_format_of :name, :with => /^[\w\s\'\-]*$/i
|
||||
|
||||
OPTIONS = {
|
||||
"IPRI" => :enumeration_issue_priorities,
|
||||
|
||||
@@ -93,7 +93,11 @@ class Issue < ActiveRecord::Base
|
||||
self.priority = nil
|
||||
write_attribute(:priority_id, pid)
|
||||
end
|
||||
|
||||
|
||||
def estimated_hours=(h)
|
||||
write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h)
|
||||
end
|
||||
|
||||
def validate
|
||||
if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
|
||||
errors.add :due_date, :activerecord_error_not_a_date
|
||||
@@ -153,6 +157,8 @@ class Issue < ActiveRecord::Base
|
||||
# Close duplicates if the issue was closed
|
||||
if @issue_before_change && !@issue_before_change.closed? && self.closed?
|
||||
duplicates.each do |duplicate|
|
||||
# Reload is need in case the duplicate was updated by a previous duplicate
|
||||
duplicate.reload
|
||||
# Don't re-close it if it's already closed
|
||||
next if duplicate.closed?
|
||||
# Same user and notes
|
||||
@@ -237,4 +243,8 @@ class Issue < ActiveRecord::Base
|
||||
yield
|
||||
end
|
||||
end
|
||||
|
||||
def to_s
|
||||
"#{tracker} ##{id}: #{subject}"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,9 +30,10 @@ class Journal < ActiveRecord::Base
|
||||
:project_key => "#{Issue.table_name}.project_id",
|
||||
:date_column => "#{Issue.table_name}.created_on"
|
||||
|
||||
acts_as_event :title => Proc.new {|o| "#{o.issue.tracker.name} ##{o.issue.id}: #{o.issue.subject}" + ((s = o.new_status) ? " (#{s})" : '') },
|
||||
acts_as_event :title => Proc.new {|o| status = ((s = o.new_status) ? " (#{s})" : nil); "#{o.issue.tracker} ##{o.issue.id}#{status}: #{o.issue.subject}" },
|
||||
:description => :notes,
|
||||
:author => :user,
|
||||
:type => Proc.new {|o| (s = o.new_status) && s.is_closed? ? 'issue-closed' : 'issue-edit' },
|
||||
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}}
|
||||
|
||||
def save
|
||||
|
||||
@@ -28,6 +28,7 @@ class Message < ActiveRecord::Base
|
||||
:date_column => 'created_on'
|
||||
acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"},
|
||||
:description => :content,
|
||||
:type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
|
||||
:url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id, :id => o.id}}
|
||||
|
||||
attr_protected :locked, :sticky
|
||||
|
||||
@@ -21,6 +21,8 @@ class MessageObserver < ActiveRecord::Observer
|
||||
recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author && m.author.active?}
|
||||
# send notification to the board watchers
|
||||
recipients += message.board.watcher_recipients
|
||||
# send notification to project members who want to be notified
|
||||
recipients += message.board.project.recipients
|
||||
recipients = recipients.compact.uniq
|
||||
Mailer.deliver_message_posted(message, recipients) if !recipients.empty? && Setting.notified_events.include?('message_posted')
|
||||
end
|
||||
|
||||
@@ -33,7 +33,7 @@ class Project < ActiveRecord::Base
|
||||
has_many :documents, :dependent => :destroy
|
||||
has_many :news, :dependent => :delete_all, :include => :author
|
||||
has_many :issue_categories, :dependent => :delete_all, :order => "#{IssueCategory.table_name}.name"
|
||||
has_many :boards, :order => "position ASC"
|
||||
has_many :boards, :dependent => :destroy, :order => "position ASC"
|
||||
has_one :repository, :dependent => :destroy
|
||||
has_many :changesets, :through => :repository
|
||||
has_one :wiki, :dependent => :destroy
|
||||
@@ -73,14 +73,16 @@ class Project < ActiveRecord::Base
|
||||
|
||||
def issues_with_subprojects(include_subprojects=false)
|
||||
conditions = nil
|
||||
if include_subprojects && !active_children.empty?
|
||||
ids = [id] + active_children.collect {|c| c.id}
|
||||
conditions = ["#{Issue.table_name}.project_id IN (#{ids.join(',')})"]
|
||||
if include_subprojects
|
||||
ids = [id] + child_ids
|
||||
conditions = ["#{Project.table_name}.id IN (#{ids.join(',')}) AND #{Project.visible_by}"]
|
||||
end
|
||||
conditions ||= ["#{Issue.table_name}.project_id = ?", id]
|
||||
conditions ||= ["#{Project.table_name}.id = ?", id]
|
||||
# Quick and dirty fix for Rails 2 compatibility
|
||||
Issue.send(:with_scope, :find => { :conditions => conditions }) do
|
||||
yield
|
||||
Version.send(:with_scope, :find => { :conditions => conditions }) do
|
||||
yield
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -91,6 +93,7 @@ class Project < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def self.visible_by(user=nil)
|
||||
user ||= User.current
|
||||
if user && user.admin?
|
||||
return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
|
||||
elsif user && user.memberships.any?
|
||||
@@ -141,7 +144,8 @@ class Project < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def to_param
|
||||
identifier
|
||||
# id is used for projects with a numeric identifier (compatibility)
|
||||
@to_param ||= (identifier.to_s =~ %r{^\d*$} ? id : identifier)
|
||||
end
|
||||
|
||||
def active?
|
||||
|
||||
@@ -116,11 +116,16 @@ class Query < ActiveRecord::Base
|
||||
set_language_if_valid(User.current.language)
|
||||
end
|
||||
|
||||
def after_initialize
|
||||
# Store the fact that project is nil (used in #editable_by?)
|
||||
@is_for_all = project.nil?
|
||||
end
|
||||
|
||||
def validate
|
||||
filters.each_key do |field|
|
||||
errors.add label_for(field), :activerecord_error_blank unless
|
||||
# filter requires one or more values
|
||||
(values_for(field) and !values_for(field).first.empty?) or
|
||||
(values_for(field) and !values_for(field).first.blank?) or
|
||||
# filter doesn't require any value
|
||||
["o", "c", "!*", "*", "t", "w"].include? operator_for(field)
|
||||
end if filters
|
||||
@@ -128,8 +133,10 @@ class Query < ActiveRecord::Base
|
||||
|
||||
def editable_by?(user)
|
||||
return false unless user
|
||||
return true if !is_public && self.user_id == user.id
|
||||
is_public && user.allowed_to?(:manage_public_queries, project)
|
||||
# Admin can edit them all and regular users can edit their private queries
|
||||
return true if user.admin? || (!is_public && self.user_id == user.id)
|
||||
# Members can not edit public queries that are for all project (only admin is allowed to)
|
||||
is_public && !@is_for_all && user.allowed_to?(:manage_public_queries, project)
|
||||
end
|
||||
|
||||
def available_filters
|
||||
@@ -139,7 +146,7 @@ class Query < ActiveRecord::Base
|
||||
|
||||
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
||||
"tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
|
||||
"priority_id" => { :type => :list, :order => 3, :values => Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect{|s| [s.name, s.id.to_s] } },
|
||||
"priority_id" => { :type => :list, :order => 3, :values => Enumeration.find(:all, :conditions => ['opt=?','IPRI'], :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
||||
"subject" => { :type => :text, :order => 8 },
|
||||
"created_on" => { :type => :date_past, :order => 9 },
|
||||
"updated_on" => { :type => :date_past, :order => 10 },
|
||||
@@ -220,7 +227,7 @@ class Query < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def label_for(field)
|
||||
label = @available_filters[field][:name] if @available_filters.has_key?(field)
|
||||
label = available_filters[field][:name] if available_filters.has_key?(field)
|
||||
label ||= field.gsub(/\_id$/, "")
|
||||
end
|
||||
|
||||
@@ -258,7 +265,7 @@ class Query < ActiveRecord::Base
|
||||
|
||||
def statement
|
||||
# project/subprojects clause
|
||||
clause = ''
|
||||
project_clauses = []
|
||||
if project && !@project.active_children.empty?
|
||||
ids = [project.id]
|
||||
if has_filter?("subproject_id")
|
||||
@@ -270,17 +277,16 @@ class Query < ActiveRecord::Base
|
||||
# main project only
|
||||
else
|
||||
# all subprojects
|
||||
ids += project.active_children.collect{|p| p.id}
|
||||
ids += project.child_ids
|
||||
end
|
||||
elsif Setting.display_subprojects_issues?
|
||||
ids += project.active_children.collect{|p| p.id}
|
||||
ids += project.child_ids
|
||||
end
|
||||
clause << "#{Issue.table_name}.project_id IN (%s)" % ids.join(',')
|
||||
project_clauses << "#{Issue.table_name}.project_id IN (%s)" % ids.join(',')
|
||||
elsif project
|
||||
clause << "#{Issue.table_name}.project_id = %d" % project.id
|
||||
else
|
||||
clause << Project.visible_by(User.current)
|
||||
project_clauses << "#{Issue.table_name}.project_id = %d" % project.id
|
||||
end
|
||||
project_clauses << Project.visible_by(User.current)
|
||||
|
||||
# filters clauses
|
||||
filters_clauses = []
|
||||
@@ -289,12 +295,14 @@ class Query < ActiveRecord::Base
|
||||
v = values_for(field).clone
|
||||
next unless v and !v.empty?
|
||||
|
||||
sql = ''
|
||||
sql = ''
|
||||
is_custom_filter = false
|
||||
if field =~ /^cf_(\d+)$/
|
||||
# custom field
|
||||
db_table = CustomValue.table_name
|
||||
db_field = 'value'
|
||||
sql << "#{Issue.table_name}.id IN (SELECT #{db_table}.customized_id FROM #{db_table} where #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} AND "
|
||||
is_custom_filter = true
|
||||
sql << "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} WHERE "
|
||||
else
|
||||
# regular field
|
||||
db_table = Issue.table_name
|
||||
@@ -314,8 +322,10 @@ class Query < ActiveRecord::Base
|
||||
sql = sql + "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
|
||||
when "!*"
|
||||
sql = sql + "#{db_table}.#{db_field} IS NULL"
|
||||
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
|
||||
when "*"
|
||||
sql = sql + "#{db_table}.#{db_field} IS NOT NULL"
|
||||
sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
|
||||
when ">="
|
||||
sql = sql + "#{db_table}.#{db_field} >= #{v.first.to_i}"
|
||||
when "<="
|
||||
@@ -354,8 +364,6 @@ class Query < ActiveRecord::Base
|
||||
filters_clauses << sql
|
||||
end if filters and valid?
|
||||
|
||||
clause << ' AND ' unless clause.empty?
|
||||
clause << filters_clauses.join(' AND ') unless filters_clauses.empty?
|
||||
clause
|
||||
(project_clauses + filters_clauses).join(' AND ')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -64,6 +64,11 @@ class Repository < ActiveRecord::Base
|
||||
:order => "committed_on DESC, #{Changeset.table_name}.id DESC").collect(&:changeset)
|
||||
end
|
||||
|
||||
# Returns a path relative to the url of the repository
|
||||
def relative_path(path)
|
||||
path
|
||||
end
|
||||
|
||||
def latest_changeset
|
||||
@latest_changeset ||= changesets.find(:first)
|
||||
end
|
||||
|
||||
@@ -35,7 +35,8 @@ class Repository::Cvs < Repository
|
||||
end
|
||||
|
||||
def entries(path=nil, identifier=nil)
|
||||
entries=scm.entries(path, identifier)
|
||||
rev = identifier.nil? ? nil : changesets.find_by_revision(identifier)
|
||||
entries = scm.entries(path, rev.nil? ? nil : rev.committed_on)
|
||||
if entries
|
||||
entries.each() do |entry|
|
||||
unless entry.lastrev.nil? || entry.lastrev.identifier
|
||||
@@ -75,7 +76,8 @@ class Repository::Cvs < Repository
|
||||
unless revision_to
|
||||
revision_to=scm.get_previous_revision(revision_from)
|
||||
end
|
||||
diff=diff+scm.diff(change_from.path, revision_from, revision_to, type)
|
||||
file_diff = scm.diff(change_from.path, revision_from, revision_to)
|
||||
diff = diff + file_diff unless file_diff.nil?
|
||||
end
|
||||
end
|
||||
return diff
|
||||
@@ -137,12 +139,18 @@ class Repository::Cvs < Repository
|
||||
end
|
||||
|
||||
# Renumber new changesets in chronological order
|
||||
c = changesets.find(:first, :order => 'committed_on DESC, id DESC', :conditions => "revision NOT LIKE '_%'")
|
||||
next_rev = c.nil? ? 1 : (c.revision.to_i + 1)
|
||||
changesets.find(:all, :order => 'committed_on ASC, id ASC', :conditions => "revision LIKE '_%'").each do |changeset|
|
||||
changeset.update_attribute :revision, next_rev
|
||||
next_rev += 1
|
||||
changeset.update_attribute :revision, next_revision_number
|
||||
end
|
||||
end # transaction
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Returns the next revision number to assign to a CVS changeset
|
||||
def next_revision_number
|
||||
# Need to retrieve existing revision numbers to sort them as integers
|
||||
@current_revision_number ||= (connection.select_values("SELECT revision FROM #{Changeset.table_name} WHERE repository_id = #{id} AND revision NOT LIKE '_%'").collect(&:to_i).max || 0)
|
||||
@current_revision_number += 1
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,7 +29,8 @@ class Repository::Darcs < Repository
|
||||
end
|
||||
|
||||
def entries(path=nil, identifier=nil)
|
||||
entries=scm.entries(path, identifier)
|
||||
patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
|
||||
entries = scm.entries(path, patch.nil? ? nil : patch.scmid)
|
||||
if entries
|
||||
entries.each do |entry|
|
||||
# Search the DB for the entry's last change
|
||||
|
||||
@@ -34,6 +34,11 @@ class Repository::Mercurial < Repository
|
||||
if entries
|
||||
entries.each do |entry|
|
||||
next unless entry.is_file?
|
||||
# Set the filesize unless browsing a specific revision
|
||||
if identifier.nil?
|
||||
full_path = File.join(root_url, entry.path)
|
||||
entry.size = File.stat(full_path).size if File.file?(full_path)
|
||||
end
|
||||
# Search the DB for the entry's last change
|
||||
change = changes.find(:first, :conditions => ["path = ?", scm.with_leading_slash(entry.path)], :order => "#{Changeset.table_name}.committed_on DESC")
|
||||
if change
|
||||
@@ -53,7 +58,9 @@ class Repository::Mercurial < Repository
|
||||
# latest revision found in database
|
||||
db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
|
||||
# latest revision in the repository
|
||||
scm_revision = scm_info.lastrev.identifier.to_i
|
||||
latest_revision = scm_info.lastrev
|
||||
return if latest_revision.nil?
|
||||
scm_revision = latest_revision.identifier.to_i
|
||||
if db_revision < scm_revision
|
||||
logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug?
|
||||
identifier_from = db_revision + 1
|
||||
|
||||
@@ -35,6 +35,11 @@ class Repository::Subversion < Repository
|
||||
revisions ? changesets.find_all_by_revision(revisions.collect(&:identifier), :order => "committed_on DESC") : []
|
||||
end
|
||||
|
||||
# Returns a path relative to the url of the repository
|
||||
def relative_path(path)
|
||||
path.gsub(Regexp.new("^\/?#{Regexp.escape(relative_url)}"), '')
|
||||
end
|
||||
|
||||
def fetch_changesets
|
||||
scm_info = scm.info
|
||||
if scm_info
|
||||
@@ -71,4 +76,14 @@ class Repository::Subversion < Repository
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Returns the relative url of the repository
|
||||
# Eg: root_url = file:///var/svn/foo
|
||||
# url = file:///var/svn/foo/bar
|
||||
# => returns /bar
|
||||
def relative_url
|
||||
@relative_url ||= url.gsub(Regexp.new("^#{Regexp.escape(root_url)}"), '')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# redMine - project management software
|
||||
# Copyright (C) 2006-2007 Jean-Philippe Lang
|
||||
# Copyright (C) 2006-2008 Jean-Philippe Lang
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@@ -29,6 +29,14 @@ class TimeEntry < ActiveRecord::Base
|
||||
validates_numericality_of :hours, :allow_nil => true
|
||||
validates_length_of :comments, :maximum => 255
|
||||
|
||||
def after_initialize
|
||||
if new_record? && self.activity.nil?
|
||||
if default_activity = Enumeration.default('ACTI')
|
||||
self.activity_id = default_activity.id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def before_validation
|
||||
self.project = issue.project if issue && project.nil?
|
||||
end
|
||||
@@ -39,6 +47,10 @@ class TimeEntry < ActiveRecord::Base
|
||||
errors.add :issue_id, :activerecord_error_invalid if (issue_id && !issue) || (issue && project!=issue.project)
|
||||
end
|
||||
|
||||
def hours=(h)
|
||||
write_attribute :hours, (h.is_a?(String) ? h.to_hours : h)
|
||||
end
|
||||
|
||||
# tyear, tmonth, tweek assigned where setting spent_on attributes
|
||||
# these attributes make time aggregations easier
|
||||
def spent_on=(date)
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
require "digest/sha1"
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
|
||||
class OnTheFlyCreationFailure < Exception; end
|
||||
|
||||
# Account statuses
|
||||
STATUS_ANONYMOUS = 0
|
||||
STATUS_ACTIVE = 1
|
||||
@@ -51,7 +54,7 @@ class User < ActiveRecord::Base
|
||||
# Login must contain lettres, numbers, underscores only
|
||||
validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
|
||||
validates_length_of :login, :maximum => 30
|
||||
validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-]*$/i
|
||||
validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-\.]*$/i
|
||||
validates_length_of :firstname, :lastname, :maximum => 30
|
||||
validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :allow_nil => true
|
||||
validates_length_of :mail, :maximum => 60, :allow_nil => true
|
||||
@@ -105,15 +108,17 @@ class User < ActiveRecord::Base
|
||||
onthefly.language = Setting.default_language
|
||||
if onthefly.save
|
||||
user = find(:first, :conditions => ["login=?", login])
|
||||
logger.info("User '#{user.login}' created on the fly.") if logger
|
||||
logger.info("User '#{user.login}' created from the LDAP") if logger
|
||||
else
|
||||
logger.error("User '#{onthefly.login}' found in LDAP but could not be created (#{onthefly.errors.full_messages.join(', ')})") if logger
|
||||
raise OnTheFlyCreationFailure.new
|
||||
end
|
||||
end
|
||||
end
|
||||
user.update_attribute(:last_login_on, Time.now) if user
|
||||
user
|
||||
|
||||
rescue => text
|
||||
raise text
|
||||
rescue => text
|
||||
raise text
|
||||
end
|
||||
|
||||
# Return user's full name for display
|
||||
@@ -222,17 +227,26 @@ class User < ActiveRecord::Base
|
||||
# action can be:
|
||||
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
|
||||
# * a permission Symbol (eg. :edit_project)
|
||||
def allowed_to?(action, project)
|
||||
# No action allowed on archived projects
|
||||
return false unless project.active?
|
||||
# No action allowed on disabled modules
|
||||
return false unless project.allows_to?(action)
|
||||
# Admin users are authorized for anything else
|
||||
return true if admin?
|
||||
|
||||
role = role_for_project(project)
|
||||
return false unless role
|
||||
role.allowed_to?(action) && (project.is_public? || role.member?)
|
||||
def allowed_to?(action, project, options={})
|
||||
if project
|
||||
# No action allowed on archived projects
|
||||
return false unless project.active?
|
||||
# No action allowed on disabled modules
|
||||
return false unless project.allows_to?(action)
|
||||
# Admin users are authorized for anything else
|
||||
return true if admin?
|
||||
|
||||
role = role_for_project(project)
|
||||
return false unless role
|
||||
role.allowed_to?(action) && (project.is_public? || role.member?)
|
||||
|
||||
elsif options[:global]
|
||||
# authorize if user has at least one role that has this permission
|
||||
roles = memberships.collect {|m| m.role}.uniq
|
||||
roles.detect {|r| r.allowed_to?(action)}
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def self.current=(user)
|
||||
@@ -244,13 +258,12 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def self.anonymous
|
||||
return @anonymous_user if @anonymous_user
|
||||
anonymous_user = AnonymousUser.find(:first)
|
||||
if anonymous_user.nil?
|
||||
anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :mail => '', :login => '', :status => 0)
|
||||
raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
|
||||
end
|
||||
@anonymous_user = anonymous_user
|
||||
anonymous_user
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -32,6 +32,7 @@ class WikiContent < ActiveRecord::Base
|
||||
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
|
||||
:description => :comments,
|
||||
:datetime => :updated_on,
|
||||
:type => 'wiki-page',
|
||||
:url => Proc.new {|o| {:controller => 'wiki', :id => o.page.wiki.project_id, :page => o.page.title, :version => o.version}}
|
||||
|
||||
def text=(plain)
|
||||
|
||||
@@ -35,10 +35,3 @@
|
||||
|
||||
<%= submit_tag l(:button_submit) %>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<h2><%=h @user.name %></h2>
|
||||
|
||||
<p>
|
||||
<%= mail_to @user.mail unless @user.pref.hide_mail %>
|
||||
<%= mail_to(h(@user.mail)) unless @user.pref.hide_mail %>
|
||||
<ul>
|
||||
<li><%=l(:label_registered_on)%>: <%= format_date(@user.created_on) %></li>
|
||||
<% for custom_value in @custom_values %>
|
||||
@@ -16,8 +16,8 @@
|
||||
<h3><%=l(:label_project_plural)%></h3>
|
||||
<ul>
|
||||
<% for membership in @memberships %>
|
||||
<li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %>
|
||||
(<%= membership.role.name %>, <%= format_date(membership.created_on) %>)</li>
|
||||
<li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
|
||||
(<%=h membership.role.name %>, <%= format_date(membership.created_on) %>)</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<% end %>
|
||||
|
||||
@@ -38,3 +38,5 @@
|
||||
<% content_for :header_tags do %>
|
||||
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
|
||||
<% end %>
|
||||
|
||||
<% html_title l(:label_board_plural) %>
|
||||
|
||||
@@ -32,9 +32,9 @@
|
||||
<thead><tr>
|
||||
<th><%= l(:field_subject) %></th>
|
||||
<th><%= l(:field_author) %></th>
|
||||
<%= sort_header_tag("#{Message.table_name}.created_on", :caption => l(:field_created_on)) %>
|
||||
<%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
|
||||
<th><%= l(:label_reply_plural) %></th>
|
||||
<%= sort_header_tag("#{Message.table_name}.updated_on", :caption => l(:label_message_last)) %>
|
||||
<%= sort_header_tag('updated_on', :caption => l(:label_message_last)) %>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<% @topics.each do |topic| %>
|
||||
@@ -57,3 +57,5 @@
|
||||
<% else %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% end %>
|
||||
|
||||
<% html_title h(@board.name) %>
|
||||
|
||||
@@ -19,12 +19,15 @@ while day <= calendar.enddt %>
|
||||
elsif day == i.due_date
|
||||
image_tag('arrow_to.png')
|
||||
end %>
|
||||
<%= h("#{i.project.name} -") unless @project && @project == i.project %>
|
||||
<%= h("#{i.project} -") unless @project && @project == i.project %>
|
||||
<%= link_to_issue i %>: <%= h(truncate(i.subject, 30)) %>
|
||||
<span class="tip"><%= render_issue_tooltip i %></span>
|
||||
</div>
|
||||
<% else %>
|
||||
<%= link_to_version i, :class => "icon icon-package" %>
|
||||
<span class="icon icon-package">
|
||||
<%= h("#{i.project} -") unless @project && @project == i.project %>
|
||||
<%= link_to_version i%>
|
||||
</span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
xml.instruct!
|
||||
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
|
||||
xml.title @title
|
||||
xml.title truncate_single_line(@title, 100)
|
||||
xml.link "rel" => "self", "href" => url_for(params.merge({:format => nil, :only_path => false}))
|
||||
xml.link "rel" => "alternate", "href" => url_for(:controller => 'welcome', :only_path => false)
|
||||
xml.id url_for(:controller => 'welcome', :only_path => false)
|
||||
@@ -10,11 +10,15 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
|
||||
@items.each do |item|
|
||||
xml.entry do
|
||||
url = url_for(item.event_url(:only_path => false))
|
||||
xml.title truncate(item.event_title, 100)
|
||||
if @project
|
||||
xml.title truncate_single_line(item.event_title, 100)
|
||||
else
|
||||
xml.title truncate_single_line("#{item.project} - #{item.event_title}", 100)
|
||||
end
|
||||
xml.link "rel" => "alternate", "href" => url
|
||||
xml.id url
|
||||
xml.updated item.event_datetime.xmlschema
|
||||
author = item.event_author if item.respond_to?(:author)
|
||||
author = item.event_author if item.respond_to?(:event_author)
|
||||
xml.author do
|
||||
xml.name(author)
|
||||
xml.email(author.mail) if author.respond_to?(:mail) && !author.mail.blank?
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<table class="list">
|
||||
<% enumerations.each do |enumeration| %>
|
||||
<tr class="<%= cycle('odd', 'even') %>">
|
||||
<td><%= link_to enumeration.name, :action => 'edit', :id => enumeration %></td>
|
||||
<td><%= link_to h(enumeration), :action => 'edit', :id => enumeration %></td>
|
||||
<td style="width:15%;"><%= image_tag('true.png') if enumeration.is_default? %></td>
|
||||
<td style="width:15%;">
|
||||
<%= link_to image_tag('2uparrow.png', :alt => l(:label_sort_highest)), {:action => 'move', :id => enumeration, :position => 'highest'}, :method => :post, :title => l(:label_sort_highest) %>
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
<p><%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %></p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p><%= time_entry.text_field :comments, :size => 40 %></p>
|
||||
<p><%= time_entry.select :activity_id, (@activities.collect {|p| [p.name, p.id]}) %></p>
|
||||
</div>
|
||||
<p><%= time_entry.text_field :comments, :size => 60 %></p>
|
||||
<% end %>
|
||||
</fieldset>
|
||||
<% end %>
|
||||
|
||||
@@ -49,10 +49,3 @@
|
||||
<% end %>
|
||||
|
||||
<%= wikitoolbar_for 'issue_description' %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<% for journal in journals %>
|
||||
<div id="change-<%= journal.id %>">
|
||||
<div id="change-<%= journal.id %>" class="journal">
|
||||
<h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
|
||||
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
|
||||
<%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(this.up("form")); return false;',
|
||||
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
||||
</th>
|
||||
<%= sort_header_tag("#{Issue.table_name}.id", :caption => '#', :default_order => 'desc') %>
|
||||
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
||||
<% query.columns.each do |column| %>
|
||||
<%= column_header(column) %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<h3><%= l(:label_issue_plural) %></h3>
|
||||
<%= link_to l(:label_issue_view_all), { :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 } %><br />
|
||||
<% if @project %>
|
||||
<%= link_to l(:field_summary), :controller => 'reports', :action => 'issue_report', :id => @project %><br />
|
||||
<%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %>
|
||||
<% end %>
|
||||
|
||||
<% unless sidebar_queries.empty? -%>
|
||||
<h3><%= l(:label_query_plural) %></h3>
|
||||
|
||||
<% queries = @project.queries.find(:all,
|
||||
:order => "name ASC",
|
||||
:conditions => ["is_public = ? or user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
|
||||
queries.each do |query| %>
|
||||
<%= link_to query.name, :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %><br />
|
||||
<% end %>
|
||||
<% sidebar_queries.each do |query| -%>
|
||||
<%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
@@ -47,10 +47,3 @@
|
||||
|
||||
<p><%= submit_tag l(:button_submit) %>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
|
||||
<ul>
|
||||
<% @statuses.each do |s| -%>
|
||||
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}},
|
||||
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}, :back_to => @back}, :method => :post,
|
||||
:selected => (s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
|
||||
<% end -%>
|
||||
</ul>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
:update => "content",
|
||||
}, :class => 'icon icon-reload' %>
|
||||
|
||||
<% if current_role && current_role.allowed_to?(:save_queries) %>
|
||||
<% if User.current.allowed_to?(:save_queries, @project, :global => true) %>
|
||||
<%= link_to l(:button_save), {}, :onclick => "$('query_form').submit(); return false;", :class => 'icon icon-save' %>
|
||||
<% end %>
|
||||
</p>
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
<p class="other-formats">
|
||||
<%= l(:label_export_to) %>
|
||||
<span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
|
||||
<span><%= link_to 'Atom', {:query_id => @query, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
|
||||
<span><%= link_to 'CSV', {:format => 'csv'}, :class => 'csv' %></span>
|
||||
<span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
|
||||
</p>
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
<% content_for :sidebar do %>
|
||||
<%= render :partial => 'issues/sidebar' %>
|
||||
<% end if @project%>
|
||||
<% end %>
|
||||
|
||||
<% 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)) %>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</div>
|
||||
<%= submit_tag l(:button_create) %>
|
||||
<%= link_to_remote l(:label_preview),
|
||||
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project, :id => @issue },
|
||||
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project },
|
||||
:method => 'post',
|
||||
:update => 'preview',
|
||||
:with => "Form.serialize('issue-form')",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<h3><%=h @issue.subject %></h3>
|
||||
<p class="author">
|
||||
<%= authoring @issue.created_on, @issue.author %>.
|
||||
<%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) if @issue.created_on != @issue.updated_on %>.
|
||||
<%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
|
||||
</p>
|
||||
|
||||
<table width="100%">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
|
||||
<%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit',
|
||||
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
|
||||
<%= text_area_tag :notes, h(@journal.notes), :class => 'wiki-edit',
|
||||
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
|
||||
<p><%= submit_tag l(:button_save) %>
|
||||
<%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
|
||||
"Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<%= render :partial => 'layouts/project_selector' if User.current.memberships.any? %>
|
||||
</div>
|
||||
|
||||
<h1><%= h(@project ? @project.name : Setting.app_title) %></h1>
|
||||
<h1><%= h(@project && !@project.new_record? ? @project.name : Setting.app_title) %></h1>
|
||||
|
||||
<div id="main-menu">
|
||||
<%= render_main_menu(@project) %>
|
||||
|
||||
@@ -1,12 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body { font-family: Verdana, sans-serif; font-size: 0.8em; color:#484848; }
|
||||
body h1 { font-family: "Trebuchet MS", Verdana, sans-serif; font-size: 1.2em; margin: 0;}
|
||||
a, a:link, a:visited{ color: #2A5685; }
|
||||
a:hover, a:active{ color: #c61a1a; }
|
||||
hr { width: 100%; height: 1px; background: #ccc; border: 0; }
|
||||
.footer { font-size: 0.8em; font-style: italic; }
|
||||
body {
|
||||
font-family: Verdana, sans-serif;
|
||||
font-size: 0.8em;
|
||||
color:#484848;
|
||||
}
|
||||
h1 {
|
||||
font-family: "Trebuchet MS", Verdana, sans-serif;
|
||||
font-size: 1.2em;
|
||||
margin: 0px;
|
||||
}
|
||||
a, a:link, a:visited {
|
||||
color: #2A5685;
|
||||
}
|
||||
a:hover, a:active {
|
||||
color: #c61a1a;
|
||||
}
|
||||
hr {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: #ccc;
|
||||
border: 0;
|
||||
}
|
||||
.footer {
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
</div>
|
||||
<br />
|
||||
|
||||
<% unless @replies.empty? %>
|
||||
<h3 class="icon22 icon22-comment"><%= l(:label_reply_plural) %></h3>
|
||||
<% @replies.each do |message| %>
|
||||
<a name="<%= "message-#{message.id}" %>"></a>
|
||||
@@ -26,10 +27,11 @@
|
||||
</div>
|
||||
<div class="message reply">
|
||||
<h4><%=h message.subject %> - <%= authoring message.created_on, message.author %></h4>
|
||||
<div class="wiki"><%= textilizable message.content %></div>
|
||||
<div class="wiki"><%= textilizable message, :content, :attachments => message.attachments %></div>
|
||||
<%= link_to_attachments message.attachments, :no_author => true %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if !@topic.locked? && authorize_for('messages', 'reply') %>
|
||||
<p><%= toggle_link l(:button_reply), "reply", :focus => 'message_content' %></p>
|
||||
@@ -48,3 +50,5 @@
|
||||
<div id="preview" class="wiki"></div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% html_title h(@topic.subject) %>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<div id="preview" class="wiki"></div>
|
||||
</div>
|
||||
|
||||
<p><em><% unless @news.summary.empty? %><%=h @news.summary %><br /><% end %>
|
||||
<p><em><% unless @news.summary.blank? %><%=h @news.summary %><br /><% end %>
|
||||
<span class="author"><%= authoring @news.created_on, @news.author %></span></em></p>
|
||||
<div class="wiki">
|
||||
<%= textilizable(@news.description) %>
|
||||
|
||||
@@ -46,11 +46,3 @@
|
||||
</fieldset>
|
||||
<% end %>
|
||||
<!--[eoform:project]-->
|
||||
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
<h3><%= format_activity_day(day) %></h3>
|
||||
<dl>
|
||||
<% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
|
||||
<dt class="<%= e.class.name.downcase %>"><span class="time"><%= format_time(e.event_datetime, false) %></span>
|
||||
<%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %> <%= link_to h(truncate(e.event_title, 100)), e.event_url %></dt>
|
||||
<dt class="<%= e.event_type %>"><span class="time"><%= format_time(e.event_datetime, false) %></span>
|
||||
<%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %>
|
||||
<%= link_to format_activity_title(e.event_title), e.event_url %></dt>
|
||||
<dd><% unless e.event_description.blank? -%>
|
||||
<span class="description"><%= format_activity_description(e.event_description) %></span><br />
|
||||
<% end %>
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<h2><%=l(:label_confirmation)%></h2>
|
||||
<div class="box">
|
||||
<center>
|
||||
<p><strong><%=h @project_to_destroy.name %></strong><br />
|
||||
<%=l(:text_project_destroy_confirmation)%></p>
|
||||
<div class="warning">
|
||||
<p><strong><%=h @project_to_destroy %></strong><br />
|
||||
<%=l(:text_project_destroy_confirmation)%>
|
||||
|
||||
<% if @project_to_destroy.children.any? %>
|
||||
<br /><%= l(:text_subprojects_destroy_warning, content_tag('strong', h(@project_to_destroy.children.sort.collect{|p| p.to_s}.join(', ')))) %>
|
||||
<% end %>
|
||||
</p>
|
||||
<p>
|
||||
<% form_tag({:controller => 'projects', :action => 'destroy', :id => @project_to_destroy}) do %>
|
||||
<%= hidden_field_tag "confirm", 1 %>
|
||||
<label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label>
|
||||
<%= submit_tag l(:button_delete) %>
|
||||
<% end %>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -70,10 +70,13 @@ top = headers_height + 8
|
||||
@events.each do |i| %>
|
||||
<div style="position: absolute;line-height:1.2em;height:16px;top:<%= top %>px;left:4px;overflow:hidden;"><small>
|
||||
<% if i.is_a? Issue %>
|
||||
<%= h("#{i.project.name} -") unless @project && @project == i.project %>
|
||||
<%= h("#{i.project} -") unless @project && @project == i.project %>
|
||||
<%= link_to_issue i %>: <%=h i.subject %>
|
||||
<% else %>
|
||||
<%= link_to_version i, :class => "icon icon-package" %>
|
||||
<span class="icon icon-package">
|
||||
<%= h("#{i.project} -") unless @project && @project == i.project %>
|
||||
<%= link_to_version i %>
|
||||
</span>
|
||||
<% end %>
|
||||
</small></div>
|
||||
<% top = top + 20
|
||||
@@ -197,7 +200,8 @@ top = headers_height + 10
|
||||
%>
|
||||
<div style="top:<%= top %>px;left:<%= i_left %>px;width:15px;" class="task milestone"> </div>
|
||||
<div style="top:<%= top %>px;left:<%= i_left + 12 %>px;background:#fff;" class="task">
|
||||
<strong><%= i.name %></strong>
|
||||
<%= h("#{i.project} -") unless @project && @project == i.project %>
|
||||
<strong><%=h i %></strong>
|
||||
</div>
|
||||
<% end %>
|
||||
<% top = top + 20
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
<table class="list">
|
||||
<thead><tr>
|
||||
<th><%=l(:field_version)%></th>
|
||||
<th><%=l(:field_filename)%></th>
|
||||
<th><%=l(:label_date)%></th>
|
||||
<th><%=l(:field_filesize)%></th>
|
||||
<th><%=l(:label_downloads_abbr)%></th>
|
||||
<%= sort_header_tag('filename', :caption => l(:field_filename)) %>
|
||||
<%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %>
|
||||
<%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %>
|
||||
<%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
|
||||
<th>MD5</th>
|
||||
<% if delete_allowed %><th></th><% end %>
|
||||
</tr></thead>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
<h3><%= l(:label_version_plural) %></h3>
|
||||
<% @versions.each do |version| %>
|
||||
<%= link_to version.name, :anchor => version.name %><br />
|
||||
<%= link_to version.name, "##{version.name}" %><br />
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="splitcontentleft">
|
||||
<%= textilizable @project.description %>
|
||||
<ul>
|
||||
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link @project.homepage %></li><% end %>
|
||||
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %></li><% end %>
|
||||
<% if @subprojects.any? %>
|
||||
<li><%=l(:label_subproject_plural)%>: <%= @subprojects.collect{|p| link_to(h(p.name), :action => 'show', :id => p)}.join(", ") %></li>
|
||||
<% end %>
|
||||
|
||||
@@ -59,19 +59,19 @@ function toggle_multi_select(field) {
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td>
|
||||
<table style="padding:0;">
|
||||
<table>
|
||||
<% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %>
|
||||
<% field = filter[0]
|
||||
options = filter[1] %>
|
||||
<tr <%= 'style="display:none;"' unless query.has_filter?(field) %> id="tr_<%= field %>">
|
||||
<td valign="top" style="width:200px;">
|
||||
<tr <%= 'style="display:none;"' unless query.has_filter?(field) %> id="tr_<%= field %>" class="filter">
|
||||
<td style="width:200px;">
|
||||
<%= check_box_tag 'fields[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %>
|
||||
<label for="cb_<%= field %>"><%= filter[1][:name] || l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) %></label>
|
||||
</td>
|
||||
<td valign="top" style="width:150px;">
|
||||
<td style="width:150px;">
|
||||
<%= select_tag "operators[#{field}]", options_for_select(operators_for_select(options[:type]), query.operator_for(field)), :id => "operators_#{field}", :onchange => "toggle_operator('#{field}');", :class => "select-small", :style => "vertical-align: top;" %>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<td>
|
||||
<div id="div_values_<%= field %>" style="display:none;">
|
||||
<% case options[:type]
|
||||
when :list, :list_optional, :list_status, :list_subprojects %>
|
||||
@@ -93,7 +93,7 @@ function toggle_multi_select(field) {
|
||||
<% end %>
|
||||
</table>
|
||||
</td>
|
||||
<td align="right" valign="top">
|
||||
<td class="add-filter">
|
||||
<%= l(:label_filter_add) %>:
|
||||
<%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/\_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact), :onchange => "add_filter();", :class => "select-small" %>
|
||||
</td>
|
||||
|
||||
@@ -6,11 +6,16 @@
|
||||
<p><label for="query_name"><%=l(:field_name)%></label>
|
||||
<%= text_field 'query', 'name', :size => 80 %></p>
|
||||
|
||||
<% if current_role.allowed_to?(:manage_public_queries) %>
|
||||
<p><label for="query_is_public"><%=l(:field_is_public)%></label>
|
||||
<%= check_box 'query', 'is_public' %></p>
|
||||
<% if User.current.admin? || (@project && current_role.allowed_to?(:manage_public_queries)) %>
|
||||
<p><label for="query_is_public"><%=l(:field_is_public)%></label>
|
||||
<%= check_box 'query', 'is_public',
|
||||
:onchange => (User.current.admin? ? nil : 'if (this.checked) {$("query_is_for_all").checked = false; $("query_is_for_all").disabled = true;} else {$("query_is_for_all").disabled = false;}') %></p>
|
||||
<% end %>
|
||||
|
||||
<p><label for="query_is_for_all"><%=l(:field_is_for_all)%></label>
|
||||
<%= check_box_tag 'query_is_for_all', 1, @query.project.nil?,
|
||||
:disabled => (!@query.new_record? && (@query.project.nil? || (@query.is_public? && !User.current.admin?))) %></p>
|
||||
|
||||
<p><label for="query_default_columns"><%=l(:label_default_columns)%></label>
|
||||
<%= check_box_tag 'default_columns', 1, @query.has_default_columns?, :id => 'query_default_columns',
|
||||
:onclick => 'if (this.checked) {Element.hide("columns")} else {Element.show("columns")}' %></p>
|
||||
|
||||
@@ -1,32 +1,24 @@
|
||||
<% @entries.each do |entry| %>
|
||||
<% tr_id = Digest::MD5.hexdigest(entry.path)
|
||||
depth = params[:depth].to_i %>
|
||||
<tr id="<%= tr_id %>" class="<%= params[:parent_id] %> entry">
|
||||
<td class="filename">
|
||||
<%= if entry.is_dir?
|
||||
link_to_remote h(entry.name),
|
||||
{:url => {:action => 'browse', :id => @project, :path => entry.path, :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
|
||||
<tr id="<%= tr_id %>" class="<%= params[:parent_id] %> entry <%= entry.kind %>">
|
||||
<td style="padding-left: <%=18 * depth%>px;" class="filename">
|
||||
<% if entry.is_dir? %>
|
||||
<span class="expander" onclick="<%= remote_function :url => {:action => 'browse', :id => @project, :path => entry.path, :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
|
||||
:update => { :success => tr_id },
|
||||
:position => :after,
|
||||
:success => "scmEntryLoaded('#{tr_id}')",
|
||||
:condition => "scmEntryClick('#{tr_id}')"
|
||||
},
|
||||
{:href => url_for({:action => 'browse', :id => @project, :path => entry.path, :rev => @rev}),
|
||||
:class => ('icon icon-folder'),
|
||||
:style => "margin-left: #{18 * depth}px;"
|
||||
}
|
||||
else
|
||||
link_to h(entry.name),
|
||||
:condition => "scmEntryClick('#{tr_id}')"%>"> </span>
|
||||
<% end %>
|
||||
<%= link_to h(entry.name),
|
||||
{:action => (entry.is_dir? ? 'browse' : 'changes'), :id => @project, :path => entry.path, :rev => @rev},
|
||||
:class => 'icon icon-file',
|
||||
:style => "margin-left: #{18 * depth}px;"
|
||||
end %>
|
||||
:class => (entry.is_dir? ? 'icon icon-folder' : 'icon icon-file')%>
|
||||
</td>
|
||||
<td class="size"><%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %></td>
|
||||
<td class="revision"><%= link_to(format_revision(entry.lastrev.name), :action => 'revision', :id => @project, :rev => entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %></td>
|
||||
<td class="age"><%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %></td>
|
||||
<td class="author"><%=h(entry.lastrev.author.to_s.split('<').first) if entry.lastrev %></td>
|
||||
<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev %>
|
||||
<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
|
||||
<td class="comments"><%=h truncate(changeset.comments, 50) unless changeset.nil? %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
<%= "(#{number_to_human_size(@entry.size)})" if @entry.size %>
|
||||
</p>
|
||||
|
||||
<%= render :partial => 'revisions', :locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => @entry }%>
|
||||
<%= render(:partial => 'revisions',
|
||||
:locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => @entry }) unless @changesets.empty? %>
|
||||
|
||||
<% html_title(l(:label_change_plural)) -%>
|
||||
|
||||
@@ -11,82 +11,78 @@
|
||||
<%= select_tag 'type', options_for_select([[l(:label_diff_inline), "inline"], [l(:label_diff_side_by_side), "sbs"]], @diff_type), :onchange => "if (this.value != '') {this.form.submit()}" %></p>
|
||||
<% end %>
|
||||
|
||||
<% cache(@cache_key) do %>
|
||||
<% @diff.each do |table_file| %>
|
||||
<% cache(@cache_key) do -%>
|
||||
<% @diff.each do |table_file| -%>
|
||||
<div class="autoscroll">
|
||||
<% if @diff_type == 'sbs' %>
|
||||
<table class="filecontent CodeRay">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4" class="filename">
|
||||
<%= table_file.file_name %>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">@<%= format_revision @rev %></th>
|
||||
<th colspan="2">@<%= format_revision @rev_to %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% table_file.keys.sort.each do |key| %>
|
||||
<tr>
|
||||
<th class="line-num">
|
||||
<%= table_file[key].nb_line_left %>
|
||||
</th>
|
||||
<td class="line-code <%= table_file[key].type_diff_left %>">
|
||||
<pre><%=to_utf8 table_file[key].line_left %></pre>
|
||||
</td>
|
||||
<th class="line-num">
|
||||
<%= table_file[key].nb_line_right %>
|
||||
</th>
|
||||
<td class="line-code <%= table_file[key].type_diff_right %>">
|
||||
<pre><%=to_utf8 table_file[key].line_right %></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% if @diff_type == 'sbs' -%>
|
||||
<table class="filecontent CodeRay">
|
||||
<thead>
|
||||
<tr><th colspan="4" class="filename"><%= table_file.file_name %></th></tr>
|
||||
<tr>
|
||||
<th colspan="2">@<%= format_revision @rev %></th>
|
||||
<th colspan="2">@<%= format_revision @rev_to %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% prev_line_left, prev_line_right = nil, nil -%>
|
||||
<% table_file.keys.sort.each do |key| -%>
|
||||
<% if prev_line_left && prev_line_right && (table_file[key].nb_line_left != prev_line_left+1) && (table_file[key].nb_line_right != prev_line_right+1) -%>
|
||||
<tr class="spacing"><td colspan="4"></td></tr>
|
||||
<% end -%>
|
||||
<tr>
|
||||
<th class="line-num"><%= table_file[key].nb_line_left %></th>
|
||||
<td class="line-code <%= table_file[key].type_diff_left %>">
|
||||
<pre><%=to_utf8 table_file[key].line_left %></pre>
|
||||
</td>
|
||||
<th class="line-num"><%= table_file[key].nb_line_right %></th>
|
||||
<td class="line-code <%= table_file[key].type_diff_right %>">
|
||||
<pre><%=to_utf8 table_file[key].line_right %></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<% prev_line_left, prev_line_right = table_file[key].nb_line_left.to_i, table_file[key].nb_line_right.to_i -%>
|
||||
<% end -%>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<% else -%>
|
||||
<table class="filecontent CodeRay">
|
||||
<thead>
|
||||
<tr><th colspan="3" class="filename"><%= table_file.file_name %></th></tr>
|
||||
<tr>
|
||||
<th>@<%= format_revision @rev %></th>
|
||||
<th>@<%= format_revision @rev_to %></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% prev_line_left, prev_line_right = nil, nil -%>
|
||||
<% table_file.keys.sort.each do |key, line| %>
|
||||
<% if prev_line_left && prev_line_right && (table_file[key].nb_line_left != prev_line_left+1) && (table_file[key].nb_line_right != prev_line_right+1) -%>
|
||||
<tr class="spacing"><td colspan="3"></td></tr>
|
||||
<% end -%>
|
||||
<tr>
|
||||
<th class="line-num"><%= table_file[key].nb_line_left %></th>
|
||||
<th class="line-num"><%= table_file[key].nb_line_right %></th>
|
||||
<% if table_file[key].line_left.empty? -%>
|
||||
<td class="line-code <%= table_file[key].type_diff_right %>">
|
||||
<pre><%=to_utf8 table_file[key].line_right %></pre>
|
||||
</td>
|
||||
<% else -%>
|
||||
<td class="line-code <%= table_file[key].type_diff_left %>">
|
||||
<pre><%=to_utf8 table_file[key].line_left %></pre>
|
||||
</td>
|
||||
<% end -%>
|
||||
</tr>
|
||||
<% prev_line_left = table_file[key].nb_line_left.to_i if table_file[key].nb_line_left.to_i > 0 -%>
|
||||
<% prev_line_right = table_file[key].nb_line_right.to_i if table_file[key].nb_line_right.to_i > 0 -%>
|
||||
<% end -%>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end -%>
|
||||
|
||||
<% else %>
|
||||
<table class="filecontent CodeRay">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="3" class="filename">
|
||||
<%= table_file.file_name %>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>@<%= format_revision @rev %></th>
|
||||
<th>@<%= format_revision @rev_to %></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% table_file.keys.sort.each do |key, line| %>
|
||||
<tr>
|
||||
<th class="line-num">
|
||||
<%= table_file[key].nb_line_left %>
|
||||
</th>
|
||||
<th class="line-num">
|
||||
<%= table_file[key].nb_line_right %>
|
||||
</th>
|
||||
<% if table_file[key].line_left.empty? %>
|
||||
<td class="line-code <%= table_file[key].type_diff_right %>">
|
||||
<pre><%=to_utf8 table_file[key].line_right %></pre>
|
||||
</td>
|
||||
<% else %>
|
||||
<td class="line-code <%= table_file[key].type_diff_left %>">
|
||||
<pre><%=to_utf8 table_file[key].line_left %></pre>
|
||||
</td>
|
||||
<% end %>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
<% html_title(with_leading_slash(@path), 'Diff') -%>
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<td><div class="square action_<%= change.action %>"></div> <%= change.path %> <%= "(#{change.revision})" unless change.revision.blank? %></td>
|
||||
<td align="right">
|
||||
<% if change.action == "M" %>
|
||||
<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => change.path, :rev => @changeset.revision %>
|
||||
<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => without_leading_slash(change.relative_path), :rev => @changeset.revision %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<% end %>
|
||||
|
||||
<h3><%= l(:label_permissions) %></h3>
|
||||
<div class="box">
|
||||
<div class="box" id="permissions">
|
||||
<% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %>
|
||||
<% perms_by_module.keys.sort.each do |mod| %>
|
||||
<fieldset><legend><%= mod.blank? ? l(:label_project) : mod.humanize %></legend>
|
||||
@@ -24,6 +24,6 @@
|
||||
<% end %>
|
||||
</fieldset>
|
||||
<% end %>
|
||||
<br /><%= check_all_links 'role_form' %>
|
||||
<br /><%= check_all_links 'permissions' %>
|
||||
<%= hidden_field_tag 'role[permissions][]', '' %>
|
||||
</div>
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
<%= hidden_field_tag 'settings[bcc_recipients]', 0 %></p>
|
||||
</div>
|
||||
|
||||
<fieldset class="box"><legend><%=l(:text_select_mail_notifications)%></legend>
|
||||
<fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
|
||||
<% @notifiables.each do |notifiable| %>
|
||||
<label><%= check_box_tag 'settings[notified_events][]', notifiable, Setting.notified_events.include?(notifiable) %>
|
||||
<%= l_or_humanize(notifiable) %></label><br />
|
||||
<% end %>
|
||||
<%= hidden_field_tag 'settings[notified_events][]', '' %>
|
||||
<p><%= check_all_links('mail-options-form') %></p>
|
||||
<p><%= check_all_links('notified_events') %></p>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
|
||||
|
||||
28
app/views/timelog/_date_range.rhtml
Normal file
28
app/views/timelog/_date_range.rhtml
Normal file
@@ -0,0 +1,28 @@
|
||||
<fieldset id="filters"><legend><%= l(:label_date_range) %></legend>
|
||||
<p>
|
||||
<%= radio_button_tag 'period_type', '1', !@free_period %>
|
||||
<%= select_tag 'period', options_for_period_select(params[:period]),
|
||||
:onchange => 'this.form.onsubmit();',
|
||||
:onfocus => '$("period_type_1").checked = true;' %>
|
||||
</p>
|
||||
<p>
|
||||
<%= radio_button_tag 'period_type', '2', @free_period %>
|
||||
<span onclick="$('period_type_2').checked = true;">
|
||||
<%= l(:label_date_from) %>
|
||||
<%= text_field_tag 'from', @from, :size => 10 %> <%= calendar_for('from') %>
|
||||
<%= l(:label_date_to) %>
|
||||
<%= text_field_tag 'to', @to, :size => 10 %> <%= calendar_for('to') %>
|
||||
</span>
|
||||
<%= submit_tag l(:button_apply), :name => nil %>
|
||||
</p>
|
||||
</fieldset>
|
||||
|
||||
<div class="tabs">
|
||||
<% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %>
|
||||
<ul>
|
||||
<li><%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'details', :project_id => @project }),
|
||||
:class => (@controller.action_name == 'details' ? 'selected' : nil)) %></li>
|
||||
<li><%= link_to(l(:label_report), url_params.merge({:controller => 'timelog', :action => 'report', :project_id => @project}),
|
||||
:class => (@controller.action_name == 'report' ? 'selected' : nil)) %></li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -1,13 +1,15 @@
|
||||
<table class="list time-entries">
|
||||
<thead>
|
||||
<tr>
|
||||
<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
|
||||
<%= sort_header_tag('user_id', :caption => l(:label_member)) %>
|
||||
<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %>
|
||||
<%= sort_header_tag("#{Project.table_name}.name", :caption => l(:label_project)) %>
|
||||
<%= sort_header_tag('issue_id', :caption => l(:label_issue), :default_order => 'desc') %>
|
||||
<%= sort_header_tag('user', :caption => l(:label_member)) %>
|
||||
<%= sort_header_tag('activity', :caption => l(:label_activity)) %>
|
||||
<%= sort_header_tag('project', :caption => l(:label_project)) %>
|
||||
<%= sort_header_tag('issue', :caption => l(:label_issue), :default_order => 'desc') %>
|
||||
<th><%= l(:field_comments) %></th>
|
||||
<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% entries.each do |entry| -%>
|
||||
@@ -35,5 +37,5 @@
|
||||
</td>
|
||||
</tr>
|
||||
<% end -%>
|
||||
</tbdoy>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<% @hours.collect {|h| h[criterias[level]]}.uniq.each do |value| %>
|
||||
<% @hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value| %>
|
||||
<% hours_for_value = select_hours(hours, criterias[level], value) -%>
|
||||
<% next if hours_for_value.empty? -%>
|
||||
<tr class="<%= cycle('odd', 'even') %> <%= 'last-level' unless criterias.length > level+1 %>">
|
||||
<%= '<td></td>' * level %>
|
||||
<td><%= value.nil? ? l(:label_none) : @available_criterias[criterias[level]][:klass].find_by_id(value) %></td>
|
||||
<td><%= h(format_criteria_value(criterias[level], value)) %></td>
|
||||
<%= '<td></td>' * (criterias.length - level - 1) -%>
|
||||
<% total = 0 -%>
|
||||
<% @periods.each do |period| -%>
|
||||
<% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)) %>
|
||||
<% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)); total += sum -%>
|
||||
<td class="hours"><%= html_hours("%.2f" % sum) if sum > 0 %></td>
|
||||
<% end -%>
|
||||
<td class="hours"><%= html_hours("%.2f" % total) if total > 0 %></td>
|
||||
</tr>
|
||||
<% if criterias.length > level+1 -%>
|
||||
<%= render(:partial => 'report_criteria', :locals => {:criterias => criterias, :hours => hours_for_value, :level => (level + 1)}) %>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<div class="contextual">
|
||||
<%= link_to(l(:label_report), {:controller => 'timelog', :action => 'report', :project_id => @project}, :class => 'icon icon-report') %>
|
||||
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time' %>
|
||||
</div>
|
||||
|
||||
@@ -12,23 +11,7 @@
|
||||
<% form_remote_tag( :url => {}, :method => :get, :update => 'content' ) do %>
|
||||
<%= hidden_field_tag 'project_id', params[:project_id] %>
|
||||
<%= hidden_field_tag 'issue_id', params[:issue_id] if @issue %>
|
||||
|
||||
<fieldset><legend><%= l(:label_date_range) %></legend>
|
||||
<p>
|
||||
<%= radio_button_tag 'period_type', '1', !@free_period %>
|
||||
<%= select_tag 'period', options_for_period_select(params[:period]),
|
||||
:onchange => 'this.form.onsubmit();',
|
||||
:onfocus => '$("period_type_1").checked = true;' %>
|
||||
</p>
|
||||
<p>
|
||||
<%= radio_button_tag 'period_type', '2', @free_period %>
|
||||
<%= l(:label_date_from) %>
|
||||
<%= text_field_tag 'from', @from, :size => 10, :onfocus => '$("period_type_2").checked = true;' %> <%= calendar_for('from') %>
|
||||
<%= l(:label_date_to) %>
|
||||
<%= text_field_tag 'to', @to, :size => 10, :onfocus => '$("period_type_2").checked = true;' %> <%= calendar_for('to') %>
|
||||
<%= submit_tag l(:button_apply), :name => nil, :onclick => '$("period_type_2").checked = true;' %>
|
||||
</p>
|
||||
</fieldset>
|
||||
<%= render :partial => 'date_range' %>
|
||||
<% end %>
|
||||
|
||||
<div class="total-hours">
|
||||
@@ -45,9 +28,4 @@
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
<% html_title l(:label_spent_time), l(:label_details) %>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
<% labelled_tabular_form_for :time_entry, @time_entry, :url => {:action => 'edit', :project_id => @time_entry.project} do |f| %>
|
||||
<%= error_messages_for 'time_entry' %>
|
||||
<%= back_url_hidden_field_tag %>
|
||||
|
||||
<div class="box">
|
||||
<p><%= f.text_field :issue_id, :size => 6 %> <em><%= h("#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}") if @time_entry.issue %></em></p>
|
||||
@@ -14,10 +15,3 @@
|
||||
<%= submit_tag l(:button_save) %>
|
||||
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
@@ -1,36 +1,32 @@
|
||||
<div class="contextual">
|
||||
<%= link_to(l(:label_details), {:controller => 'timelog', :action => 'details', :project_id => @project}, :class => 'icon icon-details') %>
|
||||
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time' %>
|
||||
</div>
|
||||
|
||||
<h2><%= l(:label_spent_time) %></h2>
|
||||
|
||||
<% form_remote_tag(:url => {:project_id => @project}, :update => 'content') do %>
|
||||
<% form_remote_tag(:url => {}, :update => 'content') do %>
|
||||
<% @criterias.each do |criteria| %>
|
||||
<%= hidden_field_tag 'criterias[]', criteria %>
|
||||
<%= hidden_field_tag 'criterias[]', criteria, :id => nil %>
|
||||
<% end %>
|
||||
<fieldset><legend><%= l(:label_date_range) %></legend>
|
||||
<p>
|
||||
<%= l(:label_date_from) %>
|
||||
<%= text_field_tag 'date_from', @date_from, :size => 10 %><%= calendar_for('date_from') %>
|
||||
<%= l(:label_date_to) %>
|
||||
<%= text_field_tag 'date_to', @date_to, :size => 10 %><%= calendar_for('date_to') %>
|
||||
<%= l(:label_details) %>
|
||||
<%= select_tag 'period', options_for_select([[l(:label_year), 'year'],
|
||||
[l(:label_month), 'month'],
|
||||
[l(:label_week), 'week']], @columns) %>
|
||||
|
||||
<%= submit_tag l(:button_apply) %>
|
||||
</p>
|
||||
</fieldset>
|
||||
<%= hidden_field_tag 'project_id', params[:project_id] %>
|
||||
<%= render :partial => 'date_range' %>
|
||||
|
||||
<p><%= l(:button_add) %>: <%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}),
|
||||
<p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
|
||||
[l(:label_month), 'month'],
|
||||
[l(:label_week), 'week'],
|
||||
[l(:label_day_plural).titleize, 'day']], @columns),
|
||||
:onchange => "this.form.onsubmit();" %>
|
||||
|
||||
<%= l(:button_add) %>: <%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}),
|
||||
:onchange => "this.form.onsubmit();",
|
||||
:style => 'width: 200px',
|
||||
:id => nil,
|
||||
:disabled => (@criterias.length >= 3)) %>
|
||||
<%= link_to_remote l(:button_clear), {:url => {:project_id => @project, :date_from => @date_from, :date_to => @date_to, :period => @columns}, :update => 'content'},
|
||||
:class => 'icon icon-reload' %></p>
|
||||
|
||||
<%= link_to_remote l(:button_clear), {:url => {:project_id => @project, :period_type => params[:period_type], :period => params[:period], :from => @from, :to => @to, :columns => @columns},
|
||||
:update => 'content'
|
||||
}, :class => 'icon icon-reload' %></p>
|
||||
<% end %>
|
||||
|
||||
<% unless @criterias.empty? %>
|
||||
<div class="total-hours">
|
||||
<p><%= l(:label_total) %>: <%= html_hours(lwr(:label_f_hour, @total_hours)) %></p>
|
||||
@@ -41,11 +37,13 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<% @criterias.each do |criteria| %>
|
||||
<th width="15%"><%= l(@available_criterias[criteria][:label]) %></th>
|
||||
<th><%= l(@available_criterias[criteria][:label]) %></th>
|
||||
<% end %>
|
||||
<% columns_width = (40 / (@periods.length+1)).to_i %>
|
||||
<% @periods.each do |period| %>
|
||||
<th width="<%= ((100 - @criterias.length * 15 - 15 ) / @periods.length).to_i %>%"><%= period %></th>
|
||||
<th class="period" width="<%= columns_width %>%"><%= period %></th>
|
||||
<% end %>
|
||||
<th class="total" width="<%= columns_width %>%"><%= l(:label_total) %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -53,20 +51,22 @@
|
||||
<tr class="total">
|
||||
<td><%= l(:label_total) %></td>
|
||||
<%= '<td></td>' * (@criterias.size - 1) %>
|
||||
<% total = 0 -%>
|
||||
<% @periods.each do |period| -%>
|
||||
<% sum = sum_hours(select_hours(@hours, @columns, period.to_s)) %>
|
||||
<% sum = sum_hours(select_hours(@hours, @columns, period.to_s)); total += sum -%>
|
||||
<td class="hours"><%= html_hours("%.2f" % sum) if sum > 0 %></td>
|
||||
<% end -%>
|
||||
<td class="hours"><%= html_hours("%.2f" % total) if total > 0 %></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
|
||||
<p class="other-formats">
|
||||
<%= l(:label_export_to) %>
|
||||
<span><%= link_to 'CSV', params.merge({:format => 'csv'}), :class => 'csv' %></span>
|
||||
</p>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
<% html_title l(:label_spent_time), l(:label_report) %>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<p><%= custom_field_tag_with_label @custom_value %></p>
|
||||
<% end if @custom_values%>
|
||||
|
||||
<p><%= f.check_box :admin %></p>
|
||||
<p><%= f.check_box :admin, :disabled => (@user == User.current) %></p>
|
||||
</div>
|
||||
|
||||
<div class="box">
|
||||
@@ -30,10 +30,3 @@
|
||||
</div>
|
||||
</div>
|
||||
<!--[eoform:user]-->
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
@@ -26,24 +26,14 @@
|
||||
<tbody>
|
||||
<% for user in @users -%>
|
||||
<tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
|
||||
<td class="username"><%= link_to user.login, :action => 'edit', :id => user %></td>
|
||||
<td class="firstname"><%= user.firstname %></td>
|
||||
<td class="lastname"><%= user.lastname %></td>
|
||||
<td class="email"><%= user.mail %></td>
|
||||
<td class="username"><%= link_to h(user.login), :action => 'edit', :id => user %></td>
|
||||
<td class="firstname"><%= h(user.firstname) %></td>
|
||||
<td class="lastname"><%= h(user.lastname) %></td>
|
||||
<td class="email"><%= h(user.mail) %></td>
|
||||
<td align="center"><%= image_tag('true.png') if user.admin? %></td>
|
||||
<td class="created_on" align="center"><%= format_time(user.created_on) %></td>
|
||||
<td class="last_login_on" align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
|
||||
<td>
|
||||
<small>
|
||||
<% if user.locked? -%>
|
||||
<%= link_to l(:button_unlock), {:action => 'edit', :id => user, :user => {:status => User::STATUS_ACTIVE}}, :method => :post, :class => 'icon icon-unlock' %>
|
||||
<% elsif user.registered? -%>
|
||||
<%= link_to l(:button_activate), {:action => 'edit', :id => user, :user => {:status => User::STATUS_ACTIVE}}, :method => :post, :class => 'icon icon-unlock' %>
|
||||
<% else -%>
|
||||
<%= link_to l(:button_lock), {:action => 'edit', :id => user, :user => {:status => User::STATUS_LOCKED}}, :method => :post, :class => 'icon icon-lock' %>
|
||||
<% end -%>
|
||||
</small>
|
||||
</td>
|
||||
<td><small><%= change_status_link(user) %></small></td>
|
||||
</tr>
|
||||
<% end -%>
|
||||
</tbody>
|
||||
|
||||
@@ -6,10 +6,3 @@
|
||||
<p><%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %></p>
|
||||
<p><%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p>
|
||||
</div>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'calendar/calendar' %>
|
||||
<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
|
||||
<%= javascript_include_tag 'calendar/calendar-setup' %>
|
||||
<%= stylesheet_link_tag 'calendar' %>
|
||||
<% end %>
|
||||
|
||||
@@ -12,17 +12,19 @@
|
||||
</div>
|
||||
|
||||
<div class="splitcontentright">
|
||||
<% if @projects.any? %>
|
||||
<div class="box">
|
||||
<h3 class="icon22 icon22-projects"><%=l(:label_project_latest)%></h3>
|
||||
<ul>
|
||||
<% for project in @projects %>
|
||||
<li>
|
||||
<%= link_to project.name, :controller => 'projects', :action => 'show', :id => 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 %>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<th class="line-num"><%= line_num %></th>
|
||||
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
|
||||
<td class="author"><%= h(line[1]) %></td>
|
||||
<td class="line-code"><pre><%= line[2] %></pre></td>
|
||||
<td class="line-code"><pre><%=h line[2] %></pre></td>
|
||||
</tr>
|
||||
<% line_num += 1 %>
|
||||
<% end -%>
|
||||
|
||||
@@ -12,6 +12,7 @@ production:
|
||||
host: localhost
|
||||
username: root
|
||||
password:
|
||||
encoding: utf8
|
||||
|
||||
development:
|
||||
adapter: mysql
|
||||
@@ -19,6 +20,7 @@ development:
|
||||
host: localhost
|
||||
username: root
|
||||
password:
|
||||
encoding: utf8
|
||||
|
||||
test:
|
||||
adapter: mysql
|
||||
@@ -26,6 +28,7 @@ test:
|
||||
host: localhost
|
||||
username: root
|
||||
password:
|
||||
encoding: utf8
|
||||
|
||||
test_pgsql:
|
||||
adapter: postgresql
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
# you don't control web/app server and can't set it the proper way
|
||||
# ENV['RAILS_ENV'] ||= 'production'
|
||||
|
||||
# Specifies gem version of Rails to use when vendor/rails is not present
|
||||
RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION
|
||||
|
||||
# Bootstrap the Rails environment, frameworks, and default configuration
|
||||
require File.join(File.dirname(__FILE__), 'boot')
|
||||
|
||||
|
||||
117
doc/CHANGELOG
117
doc/CHANGELOG
@@ -4,6 +4,123 @@ Redmine - project management software
|
||||
Copyright (C) 2006-2008 Jean-Philippe Lang
|
||||
http://www.redmine.org/
|
||||
|
||||
== 2008-12-30 v0.7.4
|
||||
|
||||
* Fixed several XSS vulnerabilities
|
||||
* Fixed a SQL injection vulnerability
|
||||
|
||||
|
||||
== 2008-07-06 v0.7.3
|
||||
|
||||
* Allow dot in firstnames and lastnames
|
||||
* Add project name to cross-project Atom feeds
|
||||
* Encoding set to utf8 in example database.yml
|
||||
* HTML titles on forums related views
|
||||
* Fixed: various XSS vulnerabilities
|
||||
* Fixed: Entourage (and some old client) fails to correctly render notification styles
|
||||
* Fixed: Fixed: timelog redirects inappropriately when :back_url is blank
|
||||
* Fixed: wrong relative paths to images in wiki_syntax.html
|
||||
|
||||
|
||||
== 2008-06-15 v0.7.2
|
||||
|
||||
* "New Project" link on Projects page
|
||||
* Links to repository directories on the repo browser
|
||||
* Move status to front in Activity View
|
||||
* Remove edit step from Status context menu
|
||||
* Fixed: No way to do textile horizontal rule
|
||||
* Fixed: Repository: View differences doesn't work
|
||||
* Fixed: attachement's name maybe invalid.
|
||||
* Fixed: Error when creating a new issue
|
||||
* Fixed: NoMethodError on @available_filters.has_key?
|
||||
* Fixed: Check All / Uncheck All in Email Settings
|
||||
* Fixed: "View differences" of one file at /repositories/revision/ fails
|
||||
* Fixed: Column width in "my page"
|
||||
* Fixed: private subprojects are listed on Issues view
|
||||
* Fixed: Textile: bold, italics, underline, etc... not working after parentheses
|
||||
* Fixed: Update issue form: comment field from log time end out of screen
|
||||
* Fixed: Editing role: "issue can be assigned to this role" out of box
|
||||
* Fixed: Unable use angular braces after include word
|
||||
* Fixed: Using '*' as keyword for repository referencing keywords doesn't work
|
||||
* Fixed: Subversion repository "View differences" on each file rise ERROR
|
||||
* Fixed: View differences for individual file of a changeset fails if the repository URL doesn't point to the repository root
|
||||
* Fixed: It is possible to lock out the last admin account
|
||||
* Fixed: Wikis are viewable for anonymous users on public projects, despite not granting access
|
||||
* Fixed: Issue number display clipped on 'my issues'
|
||||
* Fixed: Roadmap version list links not carrying state
|
||||
* Fixed: Log Time fieldset in IssueController#edit doesn't set default Activity as default
|
||||
* Fixed: git's "get_rev" API should use repo's current branch instead of hardwiring "master"
|
||||
* Fixed: browser's language subcodes ignored
|
||||
* Fixed: Error on project selection with numeric (only) identifier.
|
||||
* Fixed: Link to PDF doesn't work after creating new issue
|
||||
* Fixed: "Replies" should not be shown on forum threads that are locked
|
||||
* Fixed: SVN errors lead to svn username/password being displayed to end users (security issue)
|
||||
* Fixed: http links containing hashes don't display correct
|
||||
* Fixed: Allow ampersands in Enumeration names
|
||||
* Fixed: Atom link on saved query does not include query_id
|
||||
* Fixed: Logtime info lost when there's an error updating an issue
|
||||
* Fixed: TOC does not parse colorization markups
|
||||
* Fixed: CVS: add support for modules names with spaces
|
||||
* Fixed: Bad rendering on projects/add
|
||||
* Fixed: exception when viewing differences on cvs
|
||||
* Fixed: export issue to pdf will messup when use Chinese language
|
||||
* Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant
|
||||
* Fixed: Adding non-ASCII new issue type in the New Issue page have encoding error using IE
|
||||
* Fixed: Importing from trac : some wiki links are messed
|
||||
* Fixed: Incorrect weekend definition in Hebrew calendar locale
|
||||
* Fixed: Atom feeds don't provide author section for repository revisions
|
||||
* Fixed: In Activity views, changesets titles can be multiline while they should not
|
||||
* Fixed: Ignore unreadable subversion directories (read disabled using authz)
|
||||
* Fixed: lib/SVG/Graph/Graph.rb can't externalize stylesheets
|
||||
* Fixed: Close statement handler in Redmine.pm
|
||||
|
||||
|
||||
== 2008-05-04 v0.7.1
|
||||
|
||||
* Thai translation added (Gampol Thitinilnithi)
|
||||
* Translations updates
|
||||
* Escape HTML comment tags
|
||||
* Prevent "can't convert nil into String" error when :sort_order param is not present
|
||||
* Fixed: Updating tickets add a time log with zero hours
|
||||
* Fixed: private subprojects names are revealed on the project overview
|
||||
* Fixed: Search for target version of "none" fails with postgres 8.3
|
||||
* Fixed: Home, Logout, Login links shouldn't be absolute links
|
||||
* Fixed: 'Latest projects' box on the welcome screen should be hidden if there are no projects
|
||||
* Fixed: error when using upcase language name in coderay
|
||||
* Fixed: error on Trac import when :due attribute is nil
|
||||
|
||||
|
||||
== 2008-04-28 v0.7.0
|
||||
|
||||
* Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
|
||||
* Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
|
||||
* Add predefined date ranges to the time report
|
||||
* Time report can be done at issue level
|
||||
* Various timelog report enhancements
|
||||
* Accept the following formats for "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
|
||||
* Display the context menu above and/or to the left of the click if needed
|
||||
* Make the admin project files list sortable
|
||||
* Mercurial: display working directory files sizes unless browsing a specific revision
|
||||
* Preserve status filter and page number when using lock/unlock/activate links on the users list
|
||||
* Redmine.pm support for LDAP authentication
|
||||
* Better error message and AR errors in log for failed LDAP on-the-fly user creation
|
||||
* Redirected user to where he is coming from after logging hours
|
||||
* Warn user that subprojects are also deleted when deleting a project
|
||||
* Include subprojects versions on calendar and gantt
|
||||
* Notify project members when a message is posted if they want to receive notifications
|
||||
* Fixed: Feed content limit setting has no effect
|
||||
* Fixed: Priorities not ordered when displayed as a filter in issue list
|
||||
* Fixed: can not display attached images inline in message replies
|
||||
* Fixed: Boards are not deleted when project is deleted
|
||||
* Fixed: trying to preview a new issue raises an exception with postgresql
|
||||
* Fixed: single file 'View difference' links do not work because of duplicate slashes in url
|
||||
* Fixed: inline image not displayed when including a wiki page
|
||||
* Fixed: CVS duplicate key violation
|
||||
* Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
|
||||
* Fixed: custom field filters behaviour
|
||||
* Fixed: Postgresql 8.3 compatibility
|
||||
* Fixed: Links to repository directories don't work
|
||||
|
||||
|
||||
== 2008-03-29 v0.7.0-rc1
|
||||
|
||||
|
||||
19
doc/INSTALL
19
doc/INSTALL
@@ -1,13 +1,13 @@
|
||||
== Redmine installation
|
||||
|
||||
Redmine - project management software
|
||||
Copyright (C) 2006-2007 Jean-Philippe Lang
|
||||
Copyright (C) 2006-2008 Jean-Philippe Lang
|
||||
http://www.redmine.org/
|
||||
|
||||
|
||||
== Requirements
|
||||
|
||||
* Ruby on Rails 2.0.2
|
||||
* Ruby on Rails 2.0.2 (not Rails 2.1)
|
||||
* A database (see compatibility below)
|
||||
|
||||
Optional:
|
||||
@@ -33,17 +33,26 @@ Supported databases:
|
||||
rake db:migrate RAILS_ENV="production"
|
||||
It will create tables and an administrator account.
|
||||
|
||||
5. Test the installation by running WEBrick web server:
|
||||
5. Setting up permissions
|
||||
The user who runs Redmine must have write permission on the following
|
||||
subdirectories: files, log, tmp (create the last one if not present).
|
||||
|
||||
Assuming you run Redmine with a user named redmine:
|
||||
mkdir tmp
|
||||
sudo chown -R redmine:redmine files log tmp
|
||||
sudo chmod -R 755 files log tmp
|
||||
|
||||
6. Test the installation by running WEBrick web server:
|
||||
ruby script/server -e production
|
||||
|
||||
Once WEBrick has started, point your browser to http://localhost:3000/
|
||||
You should now see the application welcome page
|
||||
|
||||
6. Use default administrator account to log in:
|
||||
7. Use default administrator account to log in:
|
||||
login: admin
|
||||
password: admin
|
||||
|
||||
7. Go to "Administration" to load the default configuration data (roles,
|
||||
Go to "Administration" to load the default configuration data (roles,
|
||||
trackers, statuses, workflow) and adjust application settings
|
||||
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ against redmine database
|
||||
=head1 SYNOPSIS
|
||||
|
||||
This module allow anonymous users to browse public project and
|
||||
registred users to browse and commit their project. authentication is
|
||||
done on the redmine database.
|
||||
registred users to browse and commit their project. Authentication is
|
||||
done against the redmine database or the LDAP configured in redmine.
|
||||
|
||||
This method is far simpler than the one with pam_* and works with all
|
||||
database without an hassle but you need to have apache/mod_perl on the
|
||||
@@ -29,6 +29,11 @@ On debian/ubuntu you must do :
|
||||
|
||||
aptitude install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl
|
||||
|
||||
If your Redmine users use LDAP authentication, you will also need
|
||||
Authen::Simple::LDAP (and IO::Socket::SSL if LDAPS is used):
|
||||
|
||||
aptitude install libauthen-simple-ldap-perl libio-socket-ssl-perl
|
||||
|
||||
=head1 CONFIGURATION
|
||||
|
||||
## if the module isn't in your perl path
|
||||
@@ -90,6 +95,8 @@ use strict;
|
||||
|
||||
use DBI;
|
||||
use Digest::SHA1;
|
||||
# optional module for LDAP authentication
|
||||
my $CanUseLDAPAuth = eval("use Authen::Simple::LDAP; 1");
|
||||
|
||||
use Apache2::Module;
|
||||
use Apache2::Access;
|
||||
@@ -140,7 +147,7 @@ sub is_public_project {
|
||||
|
||||
my $dbh = connect_database($r);
|
||||
my $sth = $dbh->prepare(
|
||||
"SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;"
|
||||
"SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;"
|
||||
);
|
||||
|
||||
$sth->execute($project_id);
|
||||
@@ -176,17 +183,37 @@ sub is_member {
|
||||
my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
|
||||
|
||||
my $sth = $dbh->prepare(
|
||||
"SELECT hashed_password FROM members, projects, users WHERE projects.id=members.project_id AND users.id=members.user_id AND users.status=1 AND login=? AND identifier=?;"
|
||||
"SELECT hashed_password, auth_source_id FROM members, projects, users WHERE projects.id=members.project_id AND users.id=members.user_id AND users.status=1 AND login=? AND identifier=?;"
|
||||
);
|
||||
$sth->execute($redmine_user, $project_id);
|
||||
|
||||
my $ret;
|
||||
while (my @row = $sth->fetchrow_array) {
|
||||
if ($row[0] eq $pass_digest) {
|
||||
$ret = 1;
|
||||
last;
|
||||
unless ($row[1]) {
|
||||
if ($row[0] eq $pass_digest) {
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
} elsif ($CanUseLDAPAuth) {
|
||||
my $sthldap = $dbh->prepare(
|
||||
"SELECT host,port,tls,account,account_password,base_dn,attr_login from auth_sources WHERE id = ?;"
|
||||
);
|
||||
$sthldap->execute($row[1]);
|
||||
while (my @rowldap = $sthldap->fetchrow_array) {
|
||||
my $ldap = Authen::Simple::LDAP->new(
|
||||
host => ($rowldap[2] == 1 || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]" : $rowldap[0],
|
||||
port => $rowldap[1],
|
||||
basedn => $rowldap[5],
|
||||
binddn => $rowldap[3] ? $rowldap[3] : "",
|
||||
bindpw => $rowldap[4] ? $rowldap[4] : "",
|
||||
filter => "(".$rowldap[6]."=%s)"
|
||||
);
|
||||
$ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass));
|
||||
}
|
||||
$sthldap->finish();
|
||||
}
|
||||
}
|
||||
$sth->finish();
|
||||
$dbh->disconnect();
|
||||
|
||||
$ret;
|
||||
|
||||
165
lang/bg.yml
165
lang/bg.yml
@@ -48,8 +48,8 @@ general_text_no: 'не'
|
||||
general_text_yes: 'да'
|
||||
general_lang_name: 'Bulgarian'
|
||||
general_csv_separator: ','
|
||||
general_csv_encoding: cp1251
|
||||
general_pdf_encoding: cp1251
|
||||
general_csv_encoding: UTF-8
|
||||
general_pdf_encoding: UTF-8
|
||||
general_day_names: Понеделник,Вторник,Сряда,Четвъртък,Петък,Събота,Неделя
|
||||
general_first_day_of_week: '1'
|
||||
|
||||
@@ -57,11 +57,11 @@ notice_account_updated: Профилът е обновен успешно.
|
||||
notice_account_invalid_creditentials: Невалиден потребител или парола.
|
||||
notice_account_password_updated: Паролата е успешно променена.
|
||||
notice_account_wrong_password: Грешна парола
|
||||
notice_account_register_done: Акаунтът е създаден успешно.
|
||||
notice_account_unknown_email: Непознат потребител.
|
||||
notice_can_t_change_password: Този акаунт е с външен метод за оторизация. Невъзможна смяна на паролата.
|
||||
notice_account_register_done: Профилът е създаден успешно.
|
||||
notice_account_unknown_email: Непознат e-mail.
|
||||
notice_can_t_change_password: Този профил е с външен метод за оторизация. Невъзможна смяна на паролата.
|
||||
notice_account_lost_email_sent: Изпратен ви е e-mail с инструкции за избор на нова парола.
|
||||
notice_account_activated: Акаунтът ви е активиран. Вече може да влезете.
|
||||
notice_account_activated: Профилът ви е активиран. Вече може да влезете в системата.
|
||||
notice_successful_create: Успешно създаване.
|
||||
notice_successful_update: Успешно обновяване.
|
||||
notice_successful_delete: Успешно изтриване.
|
||||
@@ -78,8 +78,8 @@ error_scm_command_failed: "Грешка при опит за комуникац
|
||||
|
||||
mail_subject_lost_password: Вашата парола (%s)
|
||||
mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:'
|
||||
mail_subject_register: Активация на акаунт (%s)
|
||||
mail_body_register: 'За да активирате акаунта си използвайте следния линк:'
|
||||
mail_subject_register: Активация на профил (%s)
|
||||
mail_body_register: 'За да активирате профила си използвайте следния линк:'
|
||||
|
||||
gui_validation_error: 1 грешка
|
||||
gui_validation_error_plural: %d грешки
|
||||
@@ -113,11 +113,11 @@ field_notes: Бележка
|
||||
field_is_closed: Затворена задача
|
||||
field_is_default: Статус по подразбиране
|
||||
field_tracker: Тракер
|
||||
field_subject: Тема
|
||||
field_subject: Относно
|
||||
field_due_date: Крайна дата
|
||||
field_assigned_to: Възложена на
|
||||
field_priority: Приоритет
|
||||
field_fixed_version: Target version
|
||||
field_fixed_version: Планувана версия
|
||||
field_user: Потребител
|
||||
field_role: Роля
|
||||
field_homepage: Начална страница
|
||||
@@ -138,7 +138,7 @@ field_version: Версия
|
||||
field_type: Тип
|
||||
field_host: Хост
|
||||
field_port: Порт
|
||||
field_account: Акаунт
|
||||
field_account: Профил
|
||||
field_base_dn: Base DN
|
||||
field_attr_login: Login attribute
|
||||
field_attr_firstname: Firstname attribute
|
||||
@@ -163,7 +163,7 @@ field_delay: Отместване
|
||||
field_assignable: Възможно е възлагане на задачи за тази роля
|
||||
field_redirect_existing_links: Пренасочване на съществуващи линкове
|
||||
field_estimated_hours: Изчислено време
|
||||
field_default_value: Статус по подразбиране
|
||||
field_default_value: Стойност по подразбиране
|
||||
|
||||
setting_app_title: Заглавие
|
||||
setting_app_subtitle: Описание
|
||||
@@ -171,15 +171,15 @@ setting_welcome_text: Допълнителен текст
|
||||
setting_default_language: Език по подразбиране
|
||||
setting_login_required: Изискване за вход в системата
|
||||
setting_self_registration: Регистрация от потребители
|
||||
setting_attachment_max_size: Максимално голям приложен файл
|
||||
setting_attachment_max_size: Максимална големина на прикачен файл
|
||||
setting_issues_export_limit: Лимит за експорт на задачи
|
||||
setting_mail_from: E-mail адрес за емисии
|
||||
setting_host_name: Хост
|
||||
setting_text_formatting: Форматиране на текста
|
||||
setting_wiki_compression: Wiki компресиране на историята
|
||||
setting_feeds_limit: Лимит на Feeds
|
||||
setting_autofetch_changesets: Автоматично обработване на commits в хранилището
|
||||
setting_sys_api_enabled: Разрешаване на WS за управление на хранилището
|
||||
setting_autofetch_changesets: Автоматично обработване на ревизиите
|
||||
setting_sys_api_enabled: Разрешаване на WS за управление
|
||||
setting_commit_ref_keywords: Отбелязващи ключови думи
|
||||
setting_commit_fix_keywords: Приключващи ключови думи
|
||||
setting_autologin: Автоматичен вход
|
||||
@@ -231,7 +231,7 @@ label_password_lost: Забравена парола
|
||||
label_home: Начало
|
||||
label_my_page: Лична страница
|
||||
label_my_account: Профил
|
||||
label_my_projects: Моите проекти
|
||||
label_my_projects: Проекти, в които участвам
|
||||
label_administration: Администрация
|
||||
label_login: Вход
|
||||
label_logout: Изход
|
||||
@@ -375,8 +375,8 @@ label_f_hour_plural: %.2f часа
|
||||
label_time_tracking: Отделяне на време
|
||||
label_change_plural: Промени
|
||||
label_statistics: Статистики
|
||||
label_commits_per_month: Commits за месец
|
||||
label_commits_per_author: Commits за автор
|
||||
label_commits_per_month: Ревизии по месеци
|
||||
label_commits_per_author: Ревизии по автор
|
||||
label_view_diff: Виж разликите
|
||||
label_diff_inline: хоризонтално
|
||||
label_diff_side_by_side: вертикално
|
||||
@@ -389,7 +389,7 @@ label_applied_status: Промени статуса на
|
||||
label_loading: Зареждане...
|
||||
label_relation_new: Нова релация
|
||||
label_relation_delete: Изтриване на релация
|
||||
label_relates_to: Свързана със
|
||||
label_relates_to: свързана със
|
||||
label_duplicates: дублира
|
||||
label_blocks: блокира
|
||||
label_blocked_by: блокирана от
|
||||
@@ -427,10 +427,10 @@ label_updated_time: Обновена преди %s
|
||||
label_jump_to_a_project: Проект...
|
||||
|
||||
button_login: Вход
|
||||
button_submit: Приложи
|
||||
button_submit: Прикачване
|
||||
button_save: Запис
|
||||
button_check_all: Маркирай всички
|
||||
button_uncheck_all: Изчисти всички
|
||||
button_check_all: Избор на всички
|
||||
button_uncheck_all: Изчистване на всички
|
||||
button_delete: Изтриване
|
||||
button_create: Създаване
|
||||
button_test: Тест
|
||||
@@ -481,9 +481,9 @@ text_length_between: От %d до %d символа.
|
||||
text_tracker_no_workflow: Няма дефиниран работен процес за този тракер
|
||||
text_unallowed_characters: Непозволени символи
|
||||
text_comma_separated: Позволено е изброяване (с разделител запетая).
|
||||
text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от commit съобщения
|
||||
text_issue_added: Публикувана е нова задача с номер %s (by %s).
|
||||
text_issue_updated: Задача %s е обновена (by %s).
|
||||
text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии
|
||||
text_issue_added: Публикувана е нова задача с номер %s (от %s).
|
||||
text_issue_updated: Задача %s е обновена (от %s).
|
||||
text_wiki_destroy_confirmation: Сигурни ли сте, че искате да изтриете това Wiki и цялото му съдържание?
|
||||
text_issue_category_destroy_question: Има задачи (%d) обвързани с тази категория. Какво ще изберете?
|
||||
text_issue_category_destroy_assignments: Премахване на връзките с категорията
|
||||
@@ -515,11 +515,11 @@ enumeration_issue_priorities: Приоритети на задачи
|
||||
enumeration_doc_categories: Категории документи
|
||||
enumeration_activities: Дейности (time tracking)
|
||||
label_file_plural: Файлове
|
||||
label_changeset_plural: Changesets
|
||||
label_changeset_plural: Ревизии
|
||||
field_column_names: Колони
|
||||
label_default_columns: По подразбиране
|
||||
setting_issue_list_default_columns: Показвани колони по подразбиране
|
||||
setting_repositories_encodings: Кодови таблици на хранилищата
|
||||
setting_repositories_encodings: Кодови таблици
|
||||
notice_no_issue_selected: "Няма избрани задачи."
|
||||
label_bulk_edit_selected_issues: Редактиране на задачи
|
||||
label_no_change_option: (Без промяна)
|
||||
@@ -536,20 +536,20 @@ label_user_mail_option_none: "Само за наблюдавани или в к
|
||||
setting_emails_footer: Подтекст за e-mail
|
||||
label_float: Дробно
|
||||
button_copy: Копиране
|
||||
mail_body_account_information_external: Можете да използвате вашия "%s" акаунт за вход.
|
||||
mail_body_account_information: Информацията за акаунта
|
||||
mail_body_account_information_external: Можете да използвате вашия "%s" профил за вход.
|
||||
mail_body_account_information: Информацията за профила ви
|
||||
setting_protocol: Протокол
|
||||
label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени"
|
||||
setting_time_format: Формат на часа
|
||||
label_registration_activation_by_email: активиране на акаунта по email
|
||||
mail_subject_account_activation_request: Заявка за активиране на акаунт в %s
|
||||
label_registration_activation_by_email: активиране на профила по email
|
||||
mail_subject_account_activation_request: Заявка за активиране на профил в %s
|
||||
mail_body_account_activation_request: 'Има новорегистриран потребител (%s), очакващ вашето одобрение:'
|
||||
label_registration_automatic_activation: автоматично активиране
|
||||
label_registration_manual_activation: ръчно активиране
|
||||
notice_account_pending: "Акаунтът Ви е създаден и очаква одобрение от администратор."
|
||||
notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор."
|
||||
field_time_zone: Часова зона
|
||||
text_caracters_minimum: Минимум %d символа.
|
||||
setting_bcc_recipients: Blind carbon copy (bcc) получатели
|
||||
setting_bcc_recipients: Получатели на скрито копие (bcc)
|
||||
button_annotate: Анотация
|
||||
label_issues_by: Задачи по %s
|
||||
field_searchable: С възможност за търсене
|
||||
@@ -566,54 +566,55 @@ label_general: Основни
|
||||
label_repository_plural: Хранилища
|
||||
label_associated_revisions: Асоциирани ревизии
|
||||
setting_user_format: Потребителски формат
|
||||
text_status_changed_by_changeset: Applied in changeset %s.
|
||||
label_more: More
|
||||
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
||||
label_scm: SCM
|
||||
text_select_project_modules: 'Select modules to enable for this project:'
|
||||
label_issue_added: Issue added
|
||||
label_issue_updated: Issue updated
|
||||
label_document_added: Document added
|
||||
label_message_posted: Message added
|
||||
label_file_added: File added
|
||||
label_news_added: News added
|
||||
project_module_boards: Boards
|
||||
project_module_issue_tracking: Issue tracking
|
||||
text_status_changed_by_changeset: Приложено с ревизия %s.
|
||||
label_more: Още
|
||||
text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?'
|
||||
label_scm: SCM (Система за контрол на кода)
|
||||
text_select_project_modules: 'Изберете активните модули за този проект:'
|
||||
label_issue_added: Добавена задача
|
||||
label_issue_updated: Обновена задача
|
||||
label_document_added: Добавен документ
|
||||
label_message_posted: Добавено съобщение
|
||||
label_file_added: Добавен файл
|
||||
label_news_added: Добавена новина
|
||||
project_module_boards: Форуми
|
||||
project_module_issue_tracking: Тракинг
|
||||
project_module_wiki: Wiki
|
||||
project_module_files: Files
|
||||
project_module_documents: Documents
|
||||
project_module_repository: Repository
|
||||
project_module_news: News
|
||||
project_module_time_tracking: Time tracking
|
||||
text_file_repository_writable: File repository writable
|
||||
text_default_administrator_account_changed: Default administrator account changed
|
||||
text_rmagick_available: RMagick available (optional)
|
||||
button_configure: Configure
|
||||
label_plugins: Plugins
|
||||
label_ldap_authentication: LDAP authentication
|
||||
project_module_files: Файлове
|
||||
project_module_documents: Документи
|
||||
project_module_repository: Хранилище
|
||||
project_module_news: Новини
|
||||
project_module_time_tracking: Отделяне на време
|
||||
text_file_repository_writable: Възможност за писане в хранилището с файлове
|
||||
text_default_administrator_account_changed: Сменен фабричния администраторски профил
|
||||
text_rmagick_available: Наличен RMagick (по избор)
|
||||
button_configure: Конфигуриране
|
||||
label_plugins: Плъгини
|
||||
label_ldap_authentication: LDAP оторизация
|
||||
label_downloads_abbr: D/L
|
||||
label_this_month: this month
|
||||
label_last_n_days: last %d days
|
||||
label_all_time: all time
|
||||
label_this_year: this year
|
||||
label_date_range: Date range
|
||||
label_last_week: last week
|
||||
label_yesterday: yesterday
|
||||
label_last_month: last month
|
||||
label_add_another_file: Add another file
|
||||
label_optional_description: Optional description
|
||||
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
||||
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
||||
text_assign_time_entries_to_project: Assign reported hours to the project
|
||||
text_destroy_time_entries: Delete reported hours
|
||||
text_reassign_time_entries: 'Reassign reported hours to this issue:'
|
||||
setting_activity_days_default: Days displayed on project activity
|
||||
label_chronological_order: In chronological order
|
||||
field_comments_sorting: Display comments
|
||||
label_reverse_chronological_order: In reverse chronological order
|
||||
label_preferences: Preferences
|
||||
setting_display_subprojects_issues: Display subprojects issues on main projects by default
|
||||
label_overall_activity: Overall activity
|
||||
setting_default_projects_public: New projects are public by default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
label_this_month: текущия месец
|
||||
label_last_n_days: последните %d дни
|
||||
label_all_time: всички
|
||||
label_this_year: текущата година
|
||||
label_date_range: Период
|
||||
label_last_week: последната седмица
|
||||
label_yesterday: вчера
|
||||
label_last_month: последния месец
|
||||
label_add_another_file: Добавяне на друг файл
|
||||
label_optional_description: Незадължително описание
|
||||
text_destroy_time_entries_question: %.02f часа са отделени на задачите, които искате да изтриете. Какво избирате?
|
||||
error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
|
||||
text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект
|
||||
text_destroy_time_entries: Изтриване на отделеното време
|
||||
text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:'
|
||||
setting_activity_days_default: Брой дни показвани на таб Дейност
|
||||
label_chronological_order: Хронологичен ред
|
||||
field_comments_sorting: Сортиране на коментарите
|
||||
label_reverse_chronological_order: Обратен хронологичен ред
|
||||
label_preferences: Предпочитания
|
||||
setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
|
||||
label_overall_activity: Цялостна дейност
|
||||
setting_default_projects_public: Новите проекти са публични по подразбиране
|
||||
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
|
||||
label_planning: Планиране
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
35
lang/cs.yml
35
lang/cs.yml
@@ -10,16 +10,16 @@ actionview_datehelper_select_month_prefix:
|
||||
actionview_datehelper_select_year_prefix:
|
||||
actionview_datehelper_time_in_words_day: 1 den
|
||||
actionview_datehelper_time_in_words_day_plural: %d dny
|
||||
actionview_datehelper_time_in_words_hour_about: asi hodinu
|
||||
actionview_datehelper_time_in_words_hour_about_plural: asi %d hodin
|
||||
actionview_datehelper_time_in_words_hour_about_single: asi hodinu
|
||||
actionview_datehelper_time_in_words_minute: 1 minuta
|
||||
actionview_datehelper_time_in_words_minute_half: půl minuty
|
||||
actionview_datehelper_time_in_words_minute_less_than: méně než minutu
|
||||
actionview_datehelper_time_in_words_minute_plural: %d minut
|
||||
actionview_datehelper_time_in_words_minute_single: 1 minuta
|
||||
actionview_datehelper_time_in_words_second_less_than: méně než sekunda
|
||||
actionview_datehelper_time_in_words_second_less_than_plural: méně než %d sekund
|
||||
actionview_datehelper_time_in_words_hour_about: asi hodinou
|
||||
actionview_datehelper_time_in_words_hour_about_plural: asi %d hodinami
|
||||
actionview_datehelper_time_in_words_hour_about_single: asi hodinou
|
||||
actionview_datehelper_time_in_words_minute: 1 minutou
|
||||
actionview_datehelper_time_in_words_minute_half: půl minutou
|
||||
actionview_datehelper_time_in_words_minute_less_than: méně než minutou
|
||||
actionview_datehelper_time_in_words_minute_plural: %d minutami
|
||||
actionview_datehelper_time_in_words_minute_single: 1 minutou
|
||||
actionview_datehelper_time_in_words_second_less_than: méně než sekundou
|
||||
actionview_datehelper_time_in_words_second_less_than_plural: méně než %d sekundami
|
||||
actionview_instancetag_blank_option: Prosím vyberte
|
||||
|
||||
activerecord_error_inclusion: není zahrnuto v seznamu
|
||||
@@ -98,7 +98,7 @@ mail_body_account_activation_request: Byl zaregistrován nový uživatel "%s". A
|
||||
gui_validation_error: 1 chyba
|
||||
gui_validation_error_plural: %d chyb(y)
|
||||
|
||||
field_name: Jméno
|
||||
field_name: Název
|
||||
field_description: Popis
|
||||
field_summary: Přehled
|
||||
field_is_required: Povinné pole
|
||||
@@ -306,7 +306,7 @@ label_attribute: Atribut
|
||||
label_attribute_plural: Atributy
|
||||
label_download: %d Download
|
||||
label_download_plural: %d Downloads
|
||||
label_no_data: Žádná data k zobrazení
|
||||
label_no_data: Žádné položky
|
||||
label_change_status: Změnit stav
|
||||
label_history: Historie
|
||||
label_attachment: Soubor
|
||||
@@ -480,8 +480,8 @@ label_sort_by: Seřadit podle %s
|
||||
label_send_test_email: Poslat testovací email
|
||||
label_feeds_access_key_created_on: Přístupový klíč pro RSS byl vytvořen před %s
|
||||
label_module_plural: Moduly
|
||||
label_added_time_by: 'Přidáno před: %s %s'
|
||||
label_updated_time: 'Aktualizováno před: %s'
|
||||
label_added_time_by: 'Přidáno uživatelem %s před %s'
|
||||
label_updated_time: 'Aktualizováno před %s'
|
||||
label_jump_to_a_project: Zvolit projekt...
|
||||
label_file_plural: Soubory
|
||||
label_changeset_plural: Changesety
|
||||
@@ -586,7 +586,7 @@ text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zat
|
||||
text_load_default_configuration: Nahrát výchozí konfiguraci
|
||||
text_status_changed_by_changeset: Použito v changesetu %s.
|
||||
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
|
||||
text_select_project_modules: 'Zvolte moduly aktivní 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_file_repository_writable: Povolen zápis do repository
|
||||
text_rmagick_available: RMagick k dispozici (volitelné)
|
||||
@@ -620,5 +620,6 @@ default_activity_development: Vývoj
|
||||
enumeration_issue_priorities: Priority úkolů
|
||||
enumeration_doc_categories: Kategorie dokumentů
|
||||
enumeration_activities: Aktivity (sledování času)
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
|
||||
label_planning: Plánování
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
@@ -619,3 +619,4 @@ label_overall_activity: Overordnet aktivitet
|
||||
setting_default_projects_public: Nye projekter er offentlige som default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planlægning
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
45
lang/de.yml
45
lang/de.yml
@@ -71,7 +71,7 @@ notice_locking_conflict: Datum wurde von einem anderen Benutzer geändert.
|
||||
notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen.
|
||||
notice_email_sent: Eine E-Mail wurde an %s gesendet.
|
||||
notice_email_error: Beim Senden einer E-Mail ist ein Fehler aufgetreten (%s).
|
||||
notice_feeds_access_key_reseted: Ihr RSS-Zugriffsschlüssel wurde zurückgesetzt.
|
||||
notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
|
||||
notice_failed_to_save_issues: "%d von %d ausgewählten Tickets konnte(n) nicht gespeichert werden: %s."
|
||||
notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
|
||||
notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
|
||||
@@ -80,6 +80,7 @@ notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen
|
||||
error_can_t_load_default_data: "Die Standard-Konfiguration konnte nicht geladen werden: %s"
|
||||
error_scm_not_found: Eintrag und/oder Revision besteht nicht im Projektarchiv.
|
||||
error_scm_command_failed: "Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: %s"
|
||||
error_scm_annotate: "Der Eintrag existiert nicht oder kann nicht annotiert werden."
|
||||
error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
|
||||
|
||||
mail_subject_lost_password: Ihr %s Kennwort
|
||||
@@ -120,8 +121,8 @@ field_project: Projekt
|
||||
field_issue: Ticket
|
||||
field_status: Status
|
||||
field_notes: Kommentare
|
||||
field_is_closed: Problem erledigt
|
||||
field_is_default: Default
|
||||
field_is_closed: Ticket geschlossen
|
||||
field_is_default: Standardeinstellung
|
||||
field_tracker: Tracker
|
||||
field_subject: Thema
|
||||
field_due_date: Abgabedatum
|
||||
@@ -133,8 +134,8 @@ field_role: Rolle
|
||||
field_homepage: Projekt-Homepage
|
||||
field_is_public: Öffentlich
|
||||
field_parent: Unterprojekt von
|
||||
field_is_in_chlog: Ansicht im Change-Log
|
||||
field_is_in_roadmap: Ansicht in der Roadmap
|
||||
field_is_in_chlog: Im Change-Log anzeigen
|
||||
field_is_in_roadmap: In der Roadmap anzeigen
|
||||
field_login: Mitgliedsname
|
||||
field_mail_notification: Mailbenachrichtigung
|
||||
field_admin: Administrator
|
||||
@@ -177,6 +178,7 @@ field_column_names: Spalten
|
||||
field_time_zone: Zeitzone
|
||||
field_searchable: Durchsuchbar
|
||||
field_default_value: Standardwert
|
||||
field_comments_sorting: Kommentare anzeigen
|
||||
|
||||
setting_app_title: Applikations-Titel
|
||||
setting_app_subtitle: Applikations-Untertitel
|
||||
@@ -191,7 +193,8 @@ setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden
|
||||
setting_host_name: Hostname
|
||||
setting_text_formatting: Textformatierung
|
||||
setting_wiki_compression: Wiki-Historie komprimieren
|
||||
setting_feeds_limit: Feed-Inhalt begrenzen
|
||||
setting_feeds_limit: Max. Anzahl Einträge pro Atom-Feed
|
||||
setting_default_projects_public: Neue Projekte sind standardmäßig öffentlich
|
||||
setting_autofetch_changesets: Changesets automatisch abrufen
|
||||
setting_sys_api_enabled: Webservice zur Verwaltung der Projektarchive benutzen
|
||||
setting_commit_ref_keywords: Schlüsselwörter (Beziehungen)
|
||||
@@ -206,6 +209,8 @@ setting_emails_footer: E-Mail-Fußzeile
|
||||
setting_protocol: Protokoll
|
||||
setting_per_page_options: Objekte pro Seite
|
||||
setting_user_format: Benutzer-Anzeigeformat
|
||||
setting_activity_days_default: Anzahl Tage pro Seite der Projekt-Aktivität
|
||||
setting_display_subprojects_issues: Tickets von Unterprojekten im Hauptprojekt anzeigen
|
||||
|
||||
project_module_issue_tracking: Ticket-Verfolgung
|
||||
project_module_time_tracking: Zeiterfassung
|
||||
@@ -227,7 +232,7 @@ label_project_latest: Neueste Projekte
|
||||
label_issue: Ticket
|
||||
label_issue_new: Neues Ticket
|
||||
label_issue_plural: Tickets
|
||||
label_issue_view_all: Alle Tickets ansehen
|
||||
label_issue_view_all: Alle Tickets anzeigen
|
||||
label_issues_by: Tickets von %s
|
||||
label_issue_added: Ticket hinzugefügt
|
||||
label_issue_updated: Ticket aktualisiert
|
||||
@@ -277,6 +282,7 @@ label_last_updates: zuletzt aktualisiert
|
||||
label_last_updates_plural: %d zuletzt aktualisierten
|
||||
label_registered_on: Angemeldet am
|
||||
label_activity: Aktivität
|
||||
label_overall_activity: Aktivität aller Projekte anzeigen
|
||||
label_new: Neu
|
||||
label_logged_as: Angemeldet als
|
||||
label_environment: Environment
|
||||
@@ -320,7 +326,7 @@ label_version: Version
|
||||
label_version_new: Neue Version
|
||||
label_version_plural: Versionen
|
||||
label_confirmation: Bestätigung
|
||||
label_export_to: Export zu
|
||||
label_export_to: "Auch abrufbar als:"
|
||||
label_read: Lesen...
|
||||
label_public_projects: Öffentliche Projekte
|
||||
label_open_issues: offen
|
||||
@@ -345,7 +351,7 @@ label_months_from: Monate ab
|
||||
label_gantt: Gantt
|
||||
label_internal: Intern
|
||||
label_last_changes: %d letzte Änderungen
|
||||
label_change_view_all: Alle Änderungen ansehen
|
||||
label_change_view_all: Alle Änderungen anzeigen
|
||||
label_personalize_page: Diese Seite anpassen
|
||||
label_comment: Kommentar
|
||||
label_comment_plural: Kommentare
|
||||
@@ -469,7 +475,7 @@ label_date_to: Bis
|
||||
label_language_based: Sprachabhängig
|
||||
label_sort_by: Sortiert nach %s
|
||||
label_send_test_email: Test-E-Mail senden
|
||||
label_feeds_access_key_created_on: RSS-Zugriffsschlüssel vor %s erstellt
|
||||
label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
|
||||
label_module_plural: Module
|
||||
label_added_time_by: Von %s vor %s hinzugefügt
|
||||
label_updated_time: Vor %s aktualisiert
|
||||
@@ -500,6 +506,10 @@ label_ldap_authentication: LDAP-Authentifizierung
|
||||
label_downloads_abbr: D/L
|
||||
label_optional_description: Beschreibung (optional)
|
||||
label_add_another_file: Eine weitere Datei hinzufügen
|
||||
label_preferences: Präferenzen
|
||||
label_chronological_order: in zeitlicher Reihenfolge
|
||||
label_reverse_chronological_order: in umgekehrter zeitlicher Reihenfolge
|
||||
label_planning: Terminplanung
|
||||
|
||||
button_login: Anmelden
|
||||
button_submit: OK
|
||||
@@ -518,7 +528,7 @@ button_lock: Sperren
|
||||
button_unlock: Entsperren
|
||||
button_download: Download
|
||||
button_list: Liste
|
||||
button_view: Ansehen
|
||||
button_view: Anzeigen
|
||||
button_move: Verschieben
|
||||
button_back: Zurück
|
||||
button_cancel: Abbrechen
|
||||
@@ -535,7 +545,7 @@ button_reset: Zurücksetzen
|
||||
button_rename: Umbenennen
|
||||
button_change_password: Kennwort ändern
|
||||
button_copy: Kopieren
|
||||
button_annotate: Mit Anmerkungen versehen
|
||||
button_annotate: Annotieren
|
||||
button_update: Aktualisieren
|
||||
button_configure: Konfigurieren
|
||||
|
||||
@@ -608,13 +618,4 @@ default_activity_development: Entwicklung
|
||||
enumeration_issue_priorities: Ticket-Prioritäten
|
||||
enumeration_doc_categories: Dokumentenkategorien
|
||||
enumeration_activities: Aktivitäten (Zeiterfassung)
|
||||
setting_activity_days_default: Days displayed on project activity
|
||||
label_chronological_order: In chronological order
|
||||
field_comments_sorting: Display comments
|
||||
label_reverse_chronological_order: In reverse chronological order
|
||||
label_preferences: Preferences
|
||||
setting_display_subprojects_issues: Display subprojects issues on main projects by default
|
||||
label_overall_activity: Overall activity
|
||||
setting_default_projects_public: New projects are public by default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
@@ -557,6 +557,7 @@ text_select_mail_notifications: Select actions for which email notifications sho
|
||||
text_regexp_info: eg. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 means no restriction
|
||||
text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
text_workflow_edit: Select a role and a tracker to edit the workflow
|
||||
text_are_you_sure: Are you sure ?
|
||||
text_journal_changed: changed from %s to %s
|
||||
|
||||
125
lang/es.yml
125
lang/es.yml
@@ -333,8 +333,8 @@ label_revision_plural: Revisiones
|
||||
label_added: añadido
|
||||
label_modified: modificado
|
||||
label_deleted: suprimido
|
||||
label_latest_revision: La revisión más actual
|
||||
label_latest_revision_plural: Las revisiones más actuales
|
||||
label_latest_revision: Última revisión
|
||||
label_latest_revision_plural: Últimas revisiones
|
||||
label_view_revisions: Ver las revisiones
|
||||
label_max_size: Tamaño máximo
|
||||
label_on: de
|
||||
@@ -372,7 +372,7 @@ label_view_diff: Ver diferencias
|
||||
label_diff_inline: en línea
|
||||
label_diff_side_by_side: cara a cara
|
||||
label_options: Opciones
|
||||
label_copy_workflow_from: Copiar workflow desde
|
||||
label_copy_workflow_from: Copiar flujo de trabajo desde
|
||||
label_permissions_report: Informe de permisos
|
||||
label_watched_issues: Peticiones monitorizadas
|
||||
label_related_issues: Peticiones relacionadas
|
||||
@@ -432,7 +432,7 @@ button_move: Mover
|
||||
button_back: Atrás
|
||||
button_cancel: Cancelar
|
||||
button_activate: Activar
|
||||
button_sort: Clasificar
|
||||
button_sort: Ordenar
|
||||
button_log_time: Tiempo dedicado
|
||||
button_rollback: Volver a esta versión
|
||||
button_watch: Monitorizar
|
||||
@@ -448,7 +448,7 @@ status_locked: bloqueado
|
||||
text_select_mail_notifications: Seleccionar los eventos a notificar
|
||||
text_regexp_info: eg. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 para ninguna restricción
|
||||
text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
|
||||
text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto?
|
||||
text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
|
||||
text_are_you_sure: ¿ Estás seguro ?
|
||||
text_journal_changed: cambiado de %s a %s
|
||||
@@ -460,7 +460,7 @@ text_tip_task_begin_end_day: tarea que comienza y termina este día
|
||||
text_project_identifier_info: 'Letras minúsculas (a-z), números y signos de puntuación permitidos.<br />Una vez guardado, el identificador no puede modificarse.'
|
||||
text_caracters_maximum: %d carácteres como máximo.
|
||||
text_length_between: Longitud entre %d y %d carácteres.
|
||||
text_tracker_no_workflow: No hay ningún workflow definido para este tracker
|
||||
text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tracker
|
||||
text_unallowed_characters: Carácteres no permitidos
|
||||
text_comma_separated: Múltiples valores permitidos (separados por coma).
|
||||
text_issues_ref_in_commit_messages: Referencia y petición de corrección en los mensajes
|
||||
@@ -559,64 +559,65 @@ field_searchable: Incluir en las búsquedas
|
||||
label_display_per_page: 'Por página: %s'
|
||||
setting_per_page_options: Objetos por página
|
||||
label_age: Edad
|
||||
notice_default_data_loaded: Default configuration successfully loaded.
|
||||
text_load_default_configuration: Load the default configuration
|
||||
text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
|
||||
error_can_t_load_default_data: "Default configuration could not be loaded: %s"
|
||||
button_update: Update
|
||||
label_change_properties: Change properties
|
||||
notice_default_data_loaded: Configuración por defecto cargada correctamente.
|
||||
text_load_default_configuration: Cargar la configuración por defecto
|
||||
text_no_configuration_data: "Todavía no se han configurado roles, ni trackers, ni estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
|
||||
error_can_t_load_default_data: "No se ha podido cargar la configuración por defecto: %s"
|
||||
button_update: Actualizar
|
||||
label_change_properties: Cambiar propiedades
|
||||
label_general: General
|
||||
label_repository_plural: Repositories
|
||||
label_associated_revisions: Associated revisions
|
||||
setting_user_format: Users display format
|
||||
text_status_changed_by_changeset: Applied in changeset %s.
|
||||
label_more: More
|
||||
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
||||
label_repository_plural: Repositorios
|
||||
label_associated_revisions: Revisiones asociadas
|
||||
setting_user_format: Formato de nombre de usuario
|
||||
text_status_changed_by_changeset: Aplicado en los cambios %s
|
||||
label_more: Más
|
||||
text_issues_destroy_confirmation: '¿Seguro que quiere borrar las peticiones seleccionadas?'
|
||||
label_scm: SCM
|
||||
text_select_project_modules: 'Select modules to enable for this project:'
|
||||
label_issue_added: Issue added
|
||||
label_issue_updated: Issue updated
|
||||
label_document_added: Document added
|
||||
label_message_posted: Message added
|
||||
label_file_added: File added
|
||||
label_news_added: News added
|
||||
project_module_boards: Boards
|
||||
project_module_issue_tracking: Issue tracking
|
||||
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
|
||||
label_issue_added: Petición añadida
|
||||
label_issue_updated: Petición actualizada
|
||||
label_document_added: Documento añadido
|
||||
label_message_posted: Mensaje añadido
|
||||
label_file_added: Fichero añadido
|
||||
label_news_added: Noticia añadida
|
||||
project_module_boards: Foros
|
||||
project_module_issue_tracking: Peticiones
|
||||
project_module_wiki: Wiki
|
||||
project_module_files: Files
|
||||
project_module_documents: Documents
|
||||
project_module_repository: Repository
|
||||
project_module_news: News
|
||||
project_module_time_tracking: Time tracking
|
||||
text_file_repository_writable: File repository writable
|
||||
text_default_administrator_account_changed: Default administrator account changed
|
||||
text_rmagick_available: RMagick available (optional)
|
||||
button_configure: Configure
|
||||
project_module_files: Ficheros
|
||||
project_module_documents: Documentos
|
||||
project_module_repository: Repositorio
|
||||
project_module_news: Noticias
|
||||
project_module_time_tracking: Control de tiempo
|
||||
text_file_repository_writable: Se puede escribir en el repositorio
|
||||
text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
|
||||
text_rmagick_available: RMagick disponible (opcional)
|
||||
button_configure: Configurar
|
||||
label_plugins: Plugins
|
||||
label_ldap_authentication: LDAP authentication
|
||||
label_ldap_authentication: Autenticación LDAP
|
||||
label_downloads_abbr: D/L
|
||||
label_this_month: this month
|
||||
label_last_n_days: last %d days
|
||||
label_all_time: all time
|
||||
label_this_year: this year
|
||||
label_date_range: Date range
|
||||
label_last_week: last week
|
||||
label_yesterday: yesterday
|
||||
label_last_month: last month
|
||||
label_add_another_file: Add another file
|
||||
label_optional_description: Optional description
|
||||
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
||||
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
||||
text_assign_time_entries_to_project: Assign reported hours to the project
|
||||
text_destroy_time_entries: Delete reported hours
|
||||
text_reassign_time_entries: 'Reassign reported hours to this issue:'
|
||||
setting_activity_days_default: Days displayed on project activity
|
||||
label_chronological_order: In chronological order
|
||||
field_comments_sorting: Display comments
|
||||
label_reverse_chronological_order: In reverse chronological order
|
||||
label_preferences: Preferences
|
||||
setting_display_subprojects_issues: Display subprojects issues on main projects by default
|
||||
label_overall_activity: Overall activity
|
||||
setting_default_projects_public: New projects are public by default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
label_this_month: este mes
|
||||
label_last_n_days: últimos %d días
|
||||
label_all_time: todo el tiempo
|
||||
label_this_year: este año
|
||||
label_date_range: Rango de fechas
|
||||
label_last_week: última semana
|
||||
label_yesterday: ayer
|
||||
label_last_month: último mes
|
||||
label_add_another_file: Añadir otro fichero
|
||||
label_optional_description: Descripción opcional
|
||||
text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
|
||||
error_issue_not_found_in_project: 'La petición no se encuentra o no está asociada a este proyecto'
|
||||
text_assign_time_entries_to_project: Asignar las horas al proyecto
|
||||
text_destroy_time_entries: Borrar las horas
|
||||
text_reassign_time_entries: 'Reasignar las horas a esta petición:'
|
||||
setting_activity_days_default: Días a mostrar en la actividad de proyecto
|
||||
label_chronological_order: En orden cronológico
|
||||
field_comments_sorting: Mostrar comentarios
|
||||
label_reverse_chronological_order: En orden cronológico inverso
|
||||
label_preferences: Preferencias
|
||||
setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto
|
||||
label_overall_activity: Actividad global
|
||||
setting_default_projects_public: Los proyectos nuevos son públicos por defecto
|
||||
error_scm_annotate: "No existe la entrada o no ha podido ser anotada"
|
||||
label_planning: Planificación
|
||||
text_subprojects_destroy_warning: 'Sus subprojectos: %s también se eliminarán'
|
||||
|
||||
11
lang/fi.yml
11
lang/fi.yml
@@ -307,8 +307,8 @@ label_confirmation: Vahvistus
|
||||
label_export_to: Vie
|
||||
label_read: Lukee...
|
||||
label_public_projects: Julkiset projektit
|
||||
label_open_issues: avoin
|
||||
label_open_issues_plural: avointa
|
||||
label_open_issues: avoin, yhteensä
|
||||
label_open_issues_plural: avointa, yhteensä
|
||||
label_closed_issues: suljettu
|
||||
label_closed_issues_plural: suljettua
|
||||
label_total: Yhteensä
|
||||
@@ -614,6 +614,7 @@ field_comments_sorting: Näytä kommentit
|
||||
label_reverse_chronological_order: Käänteisessä aikajärjestyksessä
|
||||
label_preferences: Asetukset
|
||||
setting_default_projects_public: Uudet projektit ovat oletuksena julkisia
|
||||
label_overall_activity: Kokonaisaktiviteetti
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
label_overall_activity: Kokonaishistoria
|
||||
error_scm_annotate: "Merkintää ei ole tai siihen ei voi lisätä selityksiä."
|
||||
label_planning: Suunnittelu
|
||||
text_subprojects_destroy_warning: 'Tämän alaprojekti(t): %s tullaan myös poistamaan.'
|
||||
|
||||
@@ -556,7 +556,8 @@ status_locked: vérouillé
|
||||
text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée
|
||||
text_regexp_info: ex. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 pour aucune restriction
|
||||
text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
|
||||
text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et toutes ses données ?
|
||||
text_subprojects_destroy_warning: 'Ses sous-projets: %s seront également supprimés.'
|
||||
text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
|
||||
text_are_you_sure: Etes-vous sûr ?
|
||||
text_journal_changed: changé de %s à %s
|
||||
|
||||
201
lang/he.yml
201
lang/he.yml
@@ -76,7 +76,7 @@ notice_failed_to_save_issues: "נכשרת בשמירת %d נושא\ים ב %d נ
|
||||
notice_no_issue_selected: "לא נבחר אף נושא! בחר בבקשה את הנושאים שברצונך לערוך."
|
||||
|
||||
error_scm_not_found: כניסה ו\או גירסא אינם קיימים במאגר.
|
||||
error_scm_command_failed: "An error occurred when trying to access the repository: %s"
|
||||
error_scm_command_failed: "ארעה שגיאה בעת ניסון גישה למאגר: %s"
|
||||
|
||||
mail_subject_lost_password: סיסמת ה-%s שלך
|
||||
mail_body_lost_password: 'לשינו סיסמת ה-Redmine שלך,לחץ על הקישור הבא:'
|
||||
@@ -98,7 +98,7 @@ field_filesize: גודל
|
||||
field_downloads: הורדות
|
||||
field_author: כותב
|
||||
field_created_on: נוצר
|
||||
field_updated_on: עודגן
|
||||
field_updated_on: עודכן
|
||||
field_field_format: פורמט
|
||||
field_is_for_all: לכל הפרויקטים
|
||||
field_possible_values: ערכים אפשריים
|
||||
@@ -119,7 +119,7 @@ field_subject: שם נושא
|
||||
field_due_date: תאריך סיום
|
||||
field_assigned_to: מוצב ל
|
||||
field_priority: עדיפות
|
||||
field_fixed_version: Target version
|
||||
field_fixed_version: גירסאת יעד
|
||||
field_user: מתשמש
|
||||
field_role: תפקיד
|
||||
field_homepage: דף הבית
|
||||
@@ -140,7 +140,7 @@ field_version: גירסא
|
||||
field_type: סוג
|
||||
field_host: שרת
|
||||
field_port: פורט
|
||||
field_account: חשבום
|
||||
field_account: חשבון
|
||||
field_base_dn: בסיס DN
|
||||
field_attr_login: תכונת התחברות
|
||||
field_attr_firstname: תכונת שם פרטים
|
||||
@@ -182,7 +182,7 @@ setting_text_formatting: עיצוב טקסט
|
||||
setting_wiki_compression: כיווץ היסטורית WIKI
|
||||
setting_feeds_limit: גבול תוכן הזנות
|
||||
setting_autofetch_changesets: משיכה אוטומתי של עידכונים
|
||||
setting_sys_api_enabled: Enable WS for repository management
|
||||
setting_sys_api_enabled: אפשר WS לניהול המאגר
|
||||
setting_commit_ref_keywords: מילות מפתח מקשרות
|
||||
setting_commit_fix_keywords: מילות מפתח מתקנות
|
||||
setting_autologin: חיבור אוטומטי
|
||||
@@ -233,7 +233,7 @@ label_information_plural: מידע
|
||||
label_please_login: התחבר בבקשה
|
||||
label_register: הרשמה
|
||||
label_password_lost: אבדה הסיסמה?
|
||||
label_home: דך הבית
|
||||
label_home: דף הבית
|
||||
label_my_page: הדף שלי
|
||||
label_my_account: השבון שלי
|
||||
label_my_projects: הפרויקטים שלי
|
||||
@@ -259,7 +259,7 @@ label_subproject_plural: תת-פרויקטים
|
||||
label_min_max_length: אורך מינימאלי - מקסימאלי
|
||||
label_list: רשימה
|
||||
label_date: תאריך
|
||||
label_integer: מספר שלים
|
||||
label_integer: מספר שלם
|
||||
label_boolean: ערך בוליאני
|
||||
label_string: טקסט
|
||||
label_text: טקסט ארוך
|
||||
@@ -269,7 +269,7 @@ label_download: הורדה %d
|
||||
label_download_plural: %d הורדות
|
||||
label_no_data: אין מידע להציג
|
||||
label_change_status: שנה מצב
|
||||
label_history: הידטוריה
|
||||
label_history: היסטוריה
|
||||
label_attachment: קובץ
|
||||
label_attachment_new: קובץ חדש
|
||||
label_attachment_delete: מחק קובץ
|
||||
@@ -279,7 +279,7 @@ label_report_plural: דו"חות
|
||||
label_news: חדשות
|
||||
label_news_new: הוסף חדשות
|
||||
label_news_plural: חדשות
|
||||
label_news_latest: חדשות חדשות
|
||||
label_news_latest: חדשות אחרונות
|
||||
label_news_view_all: צפה בכל החדשות
|
||||
label_change_log: דו"ח שינויים
|
||||
label_settings: הגדרות
|
||||
@@ -419,7 +419,7 @@ label_reply_plural: השבות
|
||||
label_send_information: שלח מידע על חשבון למשתמש
|
||||
label_year: שנה
|
||||
label_month: חודש
|
||||
label_week: שבו
|
||||
label_week: שבוע
|
||||
label_date_from: מאת
|
||||
label_date_to: אל
|
||||
label_language_based: מבוסס שפה
|
||||
@@ -444,7 +444,7 @@ button_save: שמור
|
||||
button_check_all: בחר הכל
|
||||
button_uncheck_all: בחר כלום
|
||||
button_delete: מחק
|
||||
button_create: צוק
|
||||
button_create: צור
|
||||
button_test: בדוק
|
||||
button_edit: ערוך
|
||||
button_add: הוסף
|
||||
@@ -454,13 +454,13 @@ button_clear: נקה
|
||||
button_lock: נעל
|
||||
button_unlock: בטל נעילה
|
||||
button_download: הורד
|
||||
button_list: קשימה
|
||||
button_list: רשימה
|
||||
button_view: צפה
|
||||
button_move: הזז
|
||||
button_back: הקודם
|
||||
button_cancel: בטח
|
||||
button_activate: הפעל
|
||||
button_sort: מין
|
||||
button_sort: מיין
|
||||
button_log_time: זמן לוג
|
||||
button_rollback: חזור לגירסא זו
|
||||
button_watch: צפה
|
||||
@@ -526,94 +526,95 @@ default_activity_development: פיתוח
|
||||
enumeration_issue_priorities: עדיפות נושאים
|
||||
enumeration_doc_categories: קטגוריות מסמכים
|
||||
enumeration_activities: פעילויות (מעקב אחר זמנים)
|
||||
label_search_titles_only: Search titles only
|
||||
label_nobody: nobody
|
||||
button_change_password: Change password
|
||||
text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
|
||||
label_user_mail_option_selected: "For any event on the selected projects only..."
|
||||
label_user_mail_option_all: "For any event on all my projects"
|
||||
label_user_mail_option_none: "Only for things I watch or I'm involved in"
|
||||
setting_emails_footer: Emails footer
|
||||
label_float: Float
|
||||
button_copy: Copy
|
||||
mail_body_account_information_external: You can use your "%s" account to log in.
|
||||
mail_body_account_information: Your account information
|
||||
setting_protocol: Protocol
|
||||
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
|
||||
setting_time_format: Time format
|
||||
label_registration_activation_by_email: account activation by email
|
||||
mail_subject_account_activation_request: %s account activation request
|
||||
mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
|
||||
label_registration_automatic_activation: automatic account activation
|
||||
label_registration_manual_activation: manual account activation
|
||||
notice_account_pending: "Your account was created and is now pending administrator approval."
|
||||
field_time_zone: Time zone
|
||||
text_caracters_minimum: Must be at least %d characters long.
|
||||
setting_bcc_recipients: Blind carbon copy recipients (bcc)
|
||||
button_annotate: Annotate
|
||||
label_issues_by: Issues by %s
|
||||
field_searchable: Searchable
|
||||
label_display_per_page: 'Per page: %s'
|
||||
setting_per_page_options: Objects per page options
|
||||
label_age: Age
|
||||
notice_default_data_loaded: Default configuration successfully loaded.
|
||||
text_load_default_configuration: Load the default configuration
|
||||
text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
|
||||
error_can_t_load_default_data: "Default configuration could not be loaded: %s"
|
||||
button_update: Update
|
||||
label_change_properties: Change properties
|
||||
label_general: General
|
||||
label_repository_plural: Repositories
|
||||
label_associated_revisions: Associated revisions
|
||||
setting_user_format: Users display format
|
||||
text_status_changed_by_changeset: Applied in changeset %s.
|
||||
label_more: More
|
||||
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
||||
label_search_titles_only: חפש בכותרות בלבד
|
||||
label_nobody: אף אחד
|
||||
button_change_password: שנה סיסמא
|
||||
text_user_mail_option: "בפרויקטים שלא בחרת, אתה רק תקבל התרעות על שאתה צופה או קשור אליהם (לדוגמא:נושאים שאתה היוצר שלהם או מוצבים אליך)."
|
||||
label_user_mail_option_selected: "לכל אירוע בפרויקטים שבחרתי בלבד..."
|
||||
label_user_mail_option_all: "לכל אירוע בכל הפרויקטים שלי"
|
||||
label_user_mail_option_none: "רק לנושאים שאני צופה או קשור אליהם"
|
||||
setting_emails_footer: תחתית דוא"ל
|
||||
label_float: צף
|
||||
button_copy: העתק
|
||||
mail_body_account_information_external: אתה יכול להשתמש בחשבון "%s" כדי להתחבר
|
||||
mail_body_account_information: פרטי החשבון שלך
|
||||
setting_protocol: פרוטוקול
|
||||
label_user_mail_no_self_notified: "אני לא רוצה שיודיעו לי על שינויים שאני מבצע"
|
||||
setting_time_format: פורמט זמן
|
||||
label_registration_activation_by_email: הפעל חשבון באמצעות דוא"ל
|
||||
mail_subject_account_activation_request: בקשת הפעלה לחשבון %s
|
||||
mail_body_account_activation_request: 'משתמש חדש (%s) נרשם. החשבון שלו מחכה לאישור שלך:'
|
||||
label_registration_automatic_activation: הפעלת חשבון אוטומטית
|
||||
label_registration_manual_activation: הפעלת חשבון ידנית
|
||||
notice_account_pending: "החשבון שלך נוצר ועתה מחכה לאישור מנהל המערכת."
|
||||
field_time_zone: איזור זמן
|
||||
text_caracters_minimum: חייב להיות לפחות באורך של %d תווים.
|
||||
setting_bcc_recipients: מוסתר (bcc)
|
||||
button_annotate: הוסף תיאור מסגרת
|
||||
label_issues_by: נושאים של %s
|
||||
field_searchable: ניתן לחיפוש
|
||||
label_display_per_page: 'לכל דף: %s'
|
||||
setting_per_page_options: אפשרויות אוביקטים לפי דף
|
||||
label_age: גיל
|
||||
notice_default_data_loaded: אפשרויות ברירת מחדל מופעלות.
|
||||
text_load_default_configuration: טען את אפשרויות ברירת המחדל
|
||||
text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. יהיה באפשרותך לשנותו לאחר שיטען."
|
||||
error_can_t_load_default_data: "אפשרויות ברירת המחדל לא הצליחו להיטען: %s"
|
||||
button_update: עדכן
|
||||
label_change_properties: שנה מאפיינים
|
||||
label_general: כללי
|
||||
label_repository_plural: מאגרים
|
||||
label_associated_revisions: שינויים קשורים
|
||||
setting_user_format: פורמט הצגת משתמשים
|
||||
text_status_changed_by_changeset: הוחל בסדרת השינויים %s.
|
||||
label_more: עוד
|
||||
text_issues_destroy_confirmation: 'האם את\ה בטוח שברצונך למחוק את הנושא\ים ?'
|
||||
label_scm: SCM
|
||||
text_select_project_modules: 'Select modules to enable for this project:'
|
||||
label_issue_added: Issue added
|
||||
label_issue_updated: Issue updated
|
||||
label_document_added: Document added
|
||||
label_message_posted: Message added
|
||||
label_file_added: File added
|
||||
label_news_added: News added
|
||||
project_module_boards: Boards
|
||||
project_module_issue_tracking: Issue tracking
|
||||
text_select_project_modules: 'בחר מודולים להחיל על פקרויקט זה:'
|
||||
label_issue_added: נושא הוסף
|
||||
label_issue_updated: נושא עודכן
|
||||
label_document_added: מוסמך הוסף
|
||||
label_message_posted: הודעה הוספה
|
||||
label_file_added: קובץ הוסף
|
||||
label_news_added: חדשות הוספו
|
||||
project_module_boards: לוחות
|
||||
project_module_issue_tracking: מעקב נושאים
|
||||
project_module_wiki: Wiki
|
||||
project_module_files: Files
|
||||
project_module_documents: Documents
|
||||
project_module_repository: Repository
|
||||
project_module_news: News
|
||||
project_module_time_tracking: Time tracking
|
||||
text_file_repository_writable: File repository writable
|
||||
text_default_administrator_account_changed: Default administrator account changed
|
||||
project_module_files: קבצים
|
||||
project_module_documents: מסמכים
|
||||
project_module_repository: מאגר
|
||||
project_module_news: חדשות
|
||||
project_module_time_tracking: מעקב אחר זמנים
|
||||
text_file_repository_writable: מאגר הקבצים ניתן לכתיבה
|
||||
text_default_administrator_account_changed: מנהל המערכת ברירת המחדל שונה
|
||||
text_rmagick_available: RMagick available (optional)
|
||||
button_configure: Configure
|
||||
label_plugins: Plugins
|
||||
label_ldap_authentication: LDAP authentication
|
||||
button_configure: אפשרויות
|
||||
label_plugins: פלאגינים
|
||||
label_ldap_authentication: אימות LDAP
|
||||
label_downloads_abbr: D/L
|
||||
label_this_month: this month
|
||||
label_last_n_days: last %d days
|
||||
label_all_time: all time
|
||||
label_this_year: this year
|
||||
label_date_range: Date range
|
||||
label_last_week: last week
|
||||
label_yesterday: yesterday
|
||||
label_last_month: last month
|
||||
label_add_another_file: Add another file
|
||||
label_optional_description: Optional description
|
||||
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
||||
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
||||
text_assign_time_entries_to_project: Assign reported hours to the project
|
||||
text_destroy_time_entries: Delete reported hours
|
||||
text_reassign_time_entries: 'Reassign reported hours to this issue:'
|
||||
setting_activity_days_default: Days displayed on project activity
|
||||
label_chronological_order: In chronological order
|
||||
field_comments_sorting: Display comments
|
||||
label_reverse_chronological_order: In reverse chronological order
|
||||
label_preferences: Preferences
|
||||
setting_display_subprojects_issues: Display subprojects issues on main projects by default
|
||||
label_overall_activity: Overall activity
|
||||
setting_default_projects_public: New projects are public by default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
label_this_month: החודש
|
||||
label_last_n_days: ב-%d ימים אחרונים
|
||||
label_all_time: תמיד
|
||||
label_this_year: השנה
|
||||
label_date_range: טווח תאריכים
|
||||
label_last_week: שבוע שעבר
|
||||
label_yesterday: אתמול
|
||||
label_last_month: חודש שעבר
|
||||
label_add_another_file: הוסף עוד קובץ
|
||||
label_optional_description: תיאור רשות
|
||||
text_destroy_time_entries_question: %.02f שעות דווחו על הנושים שאת\ה עומד\ת למחוק. מה ברצונך לעשות ?
|
||||
error_issue_not_found_in_project: 'הנושאים לא נמצאו או אינם שיכים לפרויקט'
|
||||
text_assign_time_entries_to_project: הצב שעות שדווחו לפרויקט הזה
|
||||
text_destroy_time_entries: מחק שעות שדווחו
|
||||
text_reassign_time_entries: 'הצב מחדש שעות שדווחו לפרויקט הזה:'
|
||||
setting_activity_days_default: ימים המוצגים על פעילות הפרויקט
|
||||
label_chronological_order: בסדר כרונולוגי
|
||||
field_comments_sorting: הצג הערות
|
||||
label_reverse_chronological_order: בסדר כרונולוגי הפוך
|
||||
label_preferences: העדפות
|
||||
setting_display_subprojects_issues: הצג נושאים של תת פרויקטים כברירת מחדל
|
||||
label_overall_activity: פעילות כוללת
|
||||
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
|
||||
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
|
||||
label_planning: תכנון
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
626
lang/hu.yml
Normal file
626
lang/hu.yml
Normal file
@@ -0,0 +1,626 @@
|
||||
_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
|
||||
|
||||
actionview_datehelper_select_day_prefix:
|
||||
actionview_datehelper_select_month_names: Január,Február,Március,Április,Május,Június,Július,Augusztus,Szeptember,Október,November,December
|
||||
actionview_datehelper_select_month_names_abbr: Jan,Feb,Már,Ápr,Máj,Jún,Júl,Aug,Szept,Okt,Nov,Dec
|
||||
actionview_datehelper_select_month_prefix:
|
||||
actionview_datehelper_select_year_prefix:
|
||||
actionview_datehelper_time_in_words_day: 1 nap
|
||||
actionview_datehelper_time_in_words_day_plural: %d nap
|
||||
actionview_datehelper_time_in_words_hour_about: kb. 1 óra
|
||||
actionview_datehelper_time_in_words_hour_about_plural: kb. %d óra
|
||||
actionview_datehelper_time_in_words_hour_about_single: kb. 1 óra
|
||||
actionview_datehelper_time_in_words_minute: 1 perc
|
||||
actionview_datehelper_time_in_words_minute_half: fél perc
|
||||
actionview_datehelper_time_in_words_minute_less_than: kevesebb, mint 1 perc
|
||||
actionview_datehelper_time_in_words_minute_plural: %d perc
|
||||
actionview_datehelper_time_in_words_minute_single: 1 perc
|
||||
actionview_datehelper_time_in_words_second_less_than: kevesebb, mint 1 másodperc
|
||||
actionview_datehelper_time_in_words_second_less_than_plural: kevesebb, mint %d másodperc
|
||||
actionview_instancetag_blank_option: Kérem válasszon
|
||||
|
||||
activerecord_error_inclusion: nem található a listában
|
||||
activerecord_error_exclusion: foglalt
|
||||
activerecord_error_invalid: érvénytelen
|
||||
activerecord_error_confirmation: jóváhagyás szükséges
|
||||
activerecord_error_accepted: ell kell fogadni
|
||||
activerecord_error_empty: nem lehet üres
|
||||
activerecord_error_blank: nem lehet üres
|
||||
activerecord_error_too_long: túl hosszú
|
||||
activerecord_error_too_short: túl rövid
|
||||
activerecord_error_wrong_length: hibás a hossza
|
||||
activerecord_error_taken: már foglalt
|
||||
activerecord_error_not_a_number: nem egy szám
|
||||
activerecord_error_not_a_date: nem érvényes dátum
|
||||
activerecord_error_greater_than_start_date: nagyobbnak kell lennie, mint az indítás dátuma
|
||||
activerecord_error_not_same_project: nem azonos projekthez tartozik
|
||||
activerecord_error_circular_dependency: Ez a kapcsolat egy körkörös függőséget eredményez
|
||||
|
||||
general_fmt_age: %d év
|
||||
general_fmt_age_plural: %d év
|
||||
general_fmt_date: %%Y.%%m.%%d
|
||||
general_fmt_datetime: %%Y.%%m.%%d %%H:%%M:%%S
|
||||
general_fmt_datetime_short: %%b %%d, %%H:%%M:%%S
|
||||
general_fmt_time: %%H:%%M:%%S
|
||||
general_text_No: 'Nem'
|
||||
general_text_Yes: 'Igen'
|
||||
general_text_no: 'nem'
|
||||
general_text_yes: 'igen'
|
||||
general_lang_name: 'Magyar'
|
||||
general_csv_separator: ','
|
||||
general_csv_encoding: ISO-8859-2
|
||||
general_pdf_encoding: ISO-8859-2
|
||||
general_day_names: Hétfő,Kedd,Szerda,Csütörtök,Péntek,Szombat,Vasárnap
|
||||
general_first_day_of_week: '1'
|
||||
|
||||
notice_account_updated: A fiók adatai sikeresen frissítve.
|
||||
notice_account_invalid_creditentials: Hibás felhasználói név, vagy jelszó
|
||||
notice_account_password_updated: A jelszó módosítása megtörtént.
|
||||
notice_account_wrong_password: Hibás jelszó
|
||||
notice_account_register_done: A fiók sikeresen létrehozva. Aktiválásához kattints az e-mailben kapott linkre
|
||||
notice_account_unknown_email: Ismeretlen felhasználó.
|
||||
notice_can_t_change_password: A fiók külső azonosítási forrást használ. A jelszó megváltoztatása nem lehetséges.
|
||||
notice_account_lost_email_sent: Egy e-mail üzenetben postáztunk Önnek egy leírást az új jelszó beállításáról.
|
||||
notice_account_activated: Fiókját aktiváltuk. Most már be tud jelentkezni a rendszerbe.
|
||||
notice_successful_create: Sikeres létrehozás.
|
||||
notice_successful_update: Sikeres módosítás.
|
||||
notice_successful_delete: Sikeres törlés.
|
||||
notice_successful_connection: Sikeres bejelentkezés.
|
||||
notice_file_not_found: Az oldal, amit meg szeretne nézni nem található, vagy átkerült egy másik helyre.
|
||||
notice_locking_conflict: Az adatot egy másik felhasználó idő közben módosította.
|
||||
notice_not_authorized: Nincs hozzáférési engedélye ehhez az oldalhoz.
|
||||
notice_email_sent: Egy e-mail üzenetet küldtünk a következő címre %s
|
||||
notice_email_error: Hiba történt a levél küldése közben (%s)
|
||||
notice_feeds_access_key_reseted: Az RSS hozzáférési kulcsát újra generáltuk.
|
||||
notice_failed_to_save_issues: "Nem sikerült a %d feladat(ok) mentése a %d -ban kiválasztva: %s."
|
||||
notice_no_issue_selected: "Nincs feladat kiválasztva! Kérem jelölje meg melyik feladatot szeretné szerkeszteni!"
|
||||
notice_account_pending: "A fiókja létrejött, és adminisztrátori jóváhagyásra vár."
|
||||
notice_default_data_loaded: Az alapértelmezett konfiguráció betöltése sikeresen megtörtént.
|
||||
|
||||
error_can_t_load_default_data: "Az alapértelmezett konfiguráció betöltése nem lehetséges: %s"
|
||||
error_scm_not_found: "A bejegyzés, vagy revízió nem található a tárolóban."
|
||||
error_scm_command_failed: "A tároló elérése közben hiba lépett fel: %s"
|
||||
error_scm_annotate: "A bejegyzés nem létezik, vagy nics jegyzetekkel ellátva."
|
||||
error_issue_not_found_in_project: 'A feladat nem található, vagy nem ehhez a projekthez tartozik'
|
||||
|
||||
mail_subject_lost_password: Az Ön Redmine jelszava
|
||||
mail_body_lost_password: 'A Redmine jelszó megváltoztatásához, kattintson a következő linkre:'
|
||||
mail_subject_register: Redmine azonosító aktiválása
|
||||
mail_body_register: 'A Redmine azonosítója aktiválásához, kattintson a következő linkre:'
|
||||
mail_body_account_information_external: A "%s" azonosító használatával bejelentkezhet a Redmineba.
|
||||
mail_body_account_information: Az Ön Redmine azonosítójának információi
|
||||
mail_subject_account_activation_request: Redmine azonosító aktiválási kérelem
|
||||
mail_body_account_activation_request: 'Egy új felhasználó (%s) regisztrált, azonosítója jóváhasgyásra várakozik:'
|
||||
|
||||
gui_validation_error: 1 hiba
|
||||
gui_validation_error_plural: %d hiba
|
||||
|
||||
field_name: Név
|
||||
field_description: Leírás
|
||||
field_summary: Összegzés
|
||||
field_is_required: Kötelező
|
||||
field_firstname: Keresztnév
|
||||
field_lastname: Vezetéknév
|
||||
field_mail: E-mail
|
||||
field_filename: Fájl
|
||||
field_filesize: Méret
|
||||
field_downloads: Letöltések
|
||||
field_author: Szerző
|
||||
field_created_on: Létrehozva
|
||||
field_updated_on: Módosítva
|
||||
field_field_format: Formátum
|
||||
field_is_for_all: Minden projekthez
|
||||
field_possible_values: Lehetséges értékek
|
||||
field_regexp: Reguláris kifejezés
|
||||
field_min_length: Minimum hossz
|
||||
field_max_length: Maximum hossz
|
||||
field_value: Érték
|
||||
field_category: Kategória
|
||||
field_title: Cím
|
||||
field_project: Projekt
|
||||
field_issue: Feladat
|
||||
field_status: Státusz
|
||||
field_notes: Feljegyzések
|
||||
field_is_closed: Feladat lezárva
|
||||
field_is_default: Alapértelmezett érték
|
||||
field_tracker: Típus
|
||||
field_subject: Tárgy
|
||||
field_due_date: Befejezés dátuma
|
||||
field_assigned_to: Felelős
|
||||
field_priority: Prioritás
|
||||
field_fixed_version: Cél verzió
|
||||
field_user: Felhasználó
|
||||
field_role: Szerepkör
|
||||
field_homepage: Weboldal
|
||||
field_is_public: Nyilvános
|
||||
field_parent: Szülő projekt
|
||||
field_is_in_chlog: Feladatok látszanak a változás naplóban
|
||||
field_is_in_roadmap: Feladatok látszanak az életútban
|
||||
field_login: Azonosító
|
||||
field_mail_notification: E-mail értesítések
|
||||
field_admin: Adminisztrátor
|
||||
field_last_login_on: Utolsó bejelentkezés
|
||||
field_language: Nyelv
|
||||
field_effective_date: Dátum
|
||||
field_password: Jelszó
|
||||
field_new_password: Új jelszó
|
||||
field_password_confirmation: Megerősítés
|
||||
field_version: Verzió
|
||||
field_type: Típus
|
||||
field_host: Kiszolgáló
|
||||
field_port: Port
|
||||
field_account: Felhasználói fiók
|
||||
field_base_dn: Base DN
|
||||
field_attr_login: Bejelentkezési tulajdonság
|
||||
field_attr_firstname: Családnév
|
||||
field_attr_lastname: Utónév
|
||||
field_attr_mail: E-mail
|
||||
field_onthefly: On-the-fly felhasználó létrehozás
|
||||
field_start_date: Kezdés dátuma
|
||||
field_done_ratio: Elkészült (%%)
|
||||
field_auth_source: Azonosítási mód
|
||||
field_hide_mail: Rejtse el az e-mail címem
|
||||
field_comments: Megjegyzés
|
||||
field_url: URL
|
||||
field_start_page: Kezdőlap
|
||||
field_subproject: Alprojekt
|
||||
field_hours: Óra
|
||||
field_activity: Aktivitás
|
||||
field_spent_on: Dátum
|
||||
field_identifier: Azonosító
|
||||
field_is_filter: Szűrőként használható
|
||||
field_issue_to_id: Kapcsolódó feladat
|
||||
field_delay: Késés
|
||||
field_assignable: Feladat rendelhető ehhez a szerepkörhöz
|
||||
field_redirect_existing_links: Létező linkek átirányítása
|
||||
field_estimated_hours: Becsült idő
|
||||
field_column_names: Oszlopok
|
||||
field_time_zone: Időzóna
|
||||
field_searchable: Kereshető
|
||||
field_default_value: Alapértelmezett érték
|
||||
field_comments_sorting: Feljegyzések megjelenítése
|
||||
|
||||
setting_app_title: Alkalmazás címe
|
||||
setting_app_subtitle: Alkalmazás alcíme
|
||||
setting_welcome_text: Üdvözlő üzenet
|
||||
setting_default_language: Alapértelmezett nyelv
|
||||
setting_login_required: Azonosítás szükséges
|
||||
setting_self_registration: Regisztráció
|
||||
setting_attachment_max_size: Melléklet max. mérete
|
||||
setting_issues_export_limit: Feladatok exportálásának korlátja
|
||||
setting_mail_from: Kibocsátó e-mail címe
|
||||
setting_bcc_recipients: Titkos másolat címzet (bcc)
|
||||
setting_host_name: Kiszolgáló neve
|
||||
setting_text_formatting: Szöveg formázás
|
||||
setting_wiki_compression: Wiki történet tömörítés
|
||||
setting_feeds_limit: RSS tartalom korlát
|
||||
setting_default_projects_public: Az új projektek alapértelmezés szerint nyilvánosak
|
||||
setting_autofetch_changesets: Commitok automatikus lehúzása
|
||||
setting_sys_api_enabled: WS engedélyezése a tárolók kezeléséhez
|
||||
setting_commit_ref_keywords: Hivatkozó kulcsszavak
|
||||
setting_commit_fix_keywords: Javítások kulcsszavai
|
||||
setting_autologin: Automatikus bejelentkezés
|
||||
setting_date_format: Dátum formátum
|
||||
setting_time_format: Idő formátum
|
||||
setting_cross_project_issue_relations: Kereszt-projekt feladat hivatkozások engedélyezése
|
||||
setting_issue_list_default_columns: Az alapértelmezésként megjelenített oszlopok a feladat listában
|
||||
setting_repositories_encodings: Tárolók kódolása
|
||||
setting_emails_footer: E-mail lábléc
|
||||
setting_protocol: Protokol
|
||||
setting_per_page_options: Objektum / oldal opciók
|
||||
setting_user_format: Felhasználók megjelenítésének formája
|
||||
setting_activity_days_default: Napok megjelenítése a project aktivitásnál
|
||||
setting_display_subprojects_issues: Alapértelmezettként mutassa az alprojektek feladatait is a projekteken
|
||||
|
||||
project_module_issue_tracking: Feladat követés
|
||||
project_module_time_tracking: Idő rögzítés
|
||||
project_module_news: Hírek
|
||||
project_module_documents: Dokumentumok
|
||||
project_module_files: Fájlok
|
||||
project_module_wiki: Wiki
|
||||
project_module_repository: Tároló
|
||||
project_module_boards: Fórumok
|
||||
|
||||
label_user: Felhasználó
|
||||
label_user_plural: Felhasználók
|
||||
label_user_new: Új felhasználó
|
||||
label_project: Projekt
|
||||
label_project_new: Új projekt
|
||||
label_project_plural: Projektek
|
||||
label_project_all: Az összes projekt
|
||||
label_project_latest: Legutóbbi projektek
|
||||
label_issue: Feladat
|
||||
label_issue_new: Új feladat
|
||||
label_issue_plural: Feladatok
|
||||
label_issue_view_all: Minden feladat megtekintése
|
||||
label_issues_by: %s feladatai
|
||||
label_issue_added: Feladat hozzáadva
|
||||
label_issue_updated: Feladat frissítve
|
||||
label_document: Dokumentum
|
||||
label_document_new: Új dokumentum
|
||||
label_document_plural: Dokumentumok
|
||||
label_document_added: Dokumentum hozzáadva
|
||||
label_role: Szerepkör
|
||||
label_role_plural: Szerepkörök
|
||||
label_role_new: Új szerepkör
|
||||
label_role_and_permissions: Szerepkörök, és jogosultságok
|
||||
label_member: Résztvevő
|
||||
label_member_new: Új résztvevő
|
||||
label_member_plural: Résztvevők
|
||||
label_tracker: Feladat típus
|
||||
label_tracker_plural: Feladat típusok
|
||||
label_tracker_new: Új feladat típus
|
||||
label_workflow: Workflow
|
||||
label_issue_status: Feladat státusz
|
||||
label_issue_status_plural: Feladat státuszok
|
||||
label_issue_status_new: Új státusz
|
||||
label_issue_category: Feladat kategória
|
||||
label_issue_category_plural: Feladat kategóriák
|
||||
label_issue_category_new: Új kategória
|
||||
label_custom_field: Egyéni mező
|
||||
label_custom_field_plural: Egyéni mezők
|
||||
label_custom_field_new: Új egyéni mező
|
||||
label_enumerations: Felsorolások
|
||||
label_enumeration_new: Új érték
|
||||
label_information: Információ
|
||||
label_information_plural: Információk
|
||||
label_please_login: Jelentkezzen be
|
||||
label_register: Regisztráljon
|
||||
label_password_lost: Elfelejtett jelszó
|
||||
label_home: Kezdőlap
|
||||
label_my_page: Saját kezdőlapom
|
||||
label_my_account: Fiókom adatai
|
||||
label_my_projects: Saját projektem
|
||||
label_administration: Adminisztráció
|
||||
label_login: Bejelentkezés
|
||||
label_logout: Kijelentkezés
|
||||
label_help: Súgó
|
||||
label_reported_issues: Bejelentett feladatok
|
||||
label_assigned_to_me_issues: A nekem kiosztott feladatok
|
||||
label_last_login: Utolsó bejelentkezés
|
||||
label_last_updates: Utoljára frissítve
|
||||
label_last_updates_plural: Utoljára módosítva %d
|
||||
label_registered_on: Regisztrált
|
||||
label_activity: Tevékenységek
|
||||
label_overall_activity: Teljes aktivitás
|
||||
label_new: Új
|
||||
label_logged_as: Bejelentkezve, mint
|
||||
label_environment: Környezet
|
||||
label_authentication: Azonosítás
|
||||
label_auth_source: Azonosítás módja
|
||||
label_auth_source_new: Új azonosítási mód
|
||||
label_auth_source_plural: Azonosítási módok
|
||||
label_subproject_plural: Alprojektek
|
||||
label_and_its_subprojects: %s és alprojektjei
|
||||
label_min_max_length: Min - Max hossz
|
||||
label_list: Lista
|
||||
label_date: Dátum
|
||||
label_integer: Egész
|
||||
label_float: Lebegőpontos
|
||||
label_boolean: Logikai
|
||||
label_string: Szöveg
|
||||
label_text: Hosszú szöveg
|
||||
label_attribute: Tulajdonság
|
||||
label_attribute_plural: Tulajdonságok
|
||||
label_download: %d Letöltés
|
||||
label_download_plural: %d Letöltések
|
||||
label_no_data: Nincs megjeleníthető adat
|
||||
label_change_status: Státusz módosítása
|
||||
label_history: Történet
|
||||
label_attachment: Fájl
|
||||
label_attachment_new: Új fájl
|
||||
label_attachment_delete: Fájl törlése
|
||||
label_attachment_plural: Fájlok
|
||||
label_file_added: Fájl hozzáadva
|
||||
label_report: Jelentés
|
||||
label_report_plural: Jelentések
|
||||
label_news: Hírek
|
||||
label_news_new: Hír hozzáadása
|
||||
label_news_plural: Hírek
|
||||
label_news_latest: Legutóbbi hírek
|
||||
label_news_view_all: Minden hír megtekintése
|
||||
label_news_added: Hír hozzáadva
|
||||
label_change_log: Változás napló
|
||||
label_settings: Beállítások
|
||||
label_overview: Áttekintés
|
||||
label_version: Verzió
|
||||
label_version_new: Új verzió
|
||||
label_version_plural: Verziók
|
||||
label_confirmation: Jóváhagyás
|
||||
label_export_to: Exportálás
|
||||
label_read: Olvas...
|
||||
label_public_projects: Nyilvános projektek
|
||||
label_open_issues: nyitott
|
||||
label_open_issues_plural: nyitott
|
||||
label_closed_issues: lezárt
|
||||
label_closed_issues_plural: lezárt
|
||||
label_total: Összesen
|
||||
label_permissions: Jogosultságok
|
||||
label_current_status: Jelenlegi státusz
|
||||
label_new_statuses_allowed: Státusz változtatások engedélyei
|
||||
label_all: mind
|
||||
label_none: nincs
|
||||
label_nobody: senki
|
||||
label_next: Következő
|
||||
label_previous: Előző
|
||||
label_used_by: Használja
|
||||
label_details: Részletek
|
||||
label_add_note: Jegyzet hozzáadása
|
||||
label_per_page: Oldalanként
|
||||
label_calendar: Naptár
|
||||
label_months_from: hónap, kezdve
|
||||
label_gantt: Gantt
|
||||
label_internal: Belső
|
||||
label_last_changes: utolsó %d változás
|
||||
label_change_view_all: Minden változás megtekintése
|
||||
label_personalize_page: Az oldal testreszabása
|
||||
label_comment: Megjegyzés
|
||||
label_comment_plural: Megjegyzések
|
||||
label_comment_add: Megjegyzés hozzáadása
|
||||
label_comment_added: Megjegyzés hozzáadva
|
||||
label_comment_delete: Megjegyzések törlése
|
||||
label_query: Egyéni lekérdezés
|
||||
label_query_plural: Egyéni lekérdezések
|
||||
label_query_new: Új lekérdezés
|
||||
label_filter_add: Szűrő hozzáadása
|
||||
label_filter_plural: Szűrők
|
||||
label_equals: egyenlő
|
||||
label_not_equals: nem egyenlő
|
||||
label_in_less_than: kevesebb, mint
|
||||
label_in_more_than: több, mint
|
||||
label_in: in
|
||||
label_today: ma
|
||||
label_all_time: mindenkor
|
||||
label_yesterday: tegnap
|
||||
label_this_week: aktuális hét
|
||||
label_last_week: múlt hét
|
||||
label_last_n_days: az elmúlt %d nap
|
||||
label_this_month: aktuális hónap
|
||||
label_last_month: múlt hónap
|
||||
label_this_year: aktuális év
|
||||
label_date_range: Dátum intervallum
|
||||
label_less_than_ago: kevesebb, mint nappal ezelőtt
|
||||
label_more_than_ago: több, mint nappal ezelőtt
|
||||
label_ago: nappal ezelőtt
|
||||
label_contains: tartalmazza
|
||||
label_not_contains: nem tartalmazza
|
||||
label_day_plural: nap
|
||||
label_repository: Tároló
|
||||
label_repository_plural: Tárolók
|
||||
label_browse: Tallóz
|
||||
label_modification: %d változás
|
||||
label_modification_plural: %d változások
|
||||
label_revision: Revízió
|
||||
label_revision_plural: Revíziók
|
||||
label_associated_revisions: Kapcsolt revíziók
|
||||
label_added: hozzáadva
|
||||
label_modified: módosítva
|
||||
label_deleted: törölve
|
||||
label_latest_revision: Legutolsó revízió
|
||||
label_latest_revision_plural: Legutolsó revíziók
|
||||
label_view_revisions: Revíziók megtekintése
|
||||
label_max_size: Maximális méret
|
||||
label_on: 'összesen'
|
||||
label_sort_highest: Az elejére
|
||||
label_sort_higher: Eggyel feljebb
|
||||
label_sort_lower: Eggyel lejjebb
|
||||
label_sort_lowest: Az aljára
|
||||
label_roadmap: Életút
|
||||
label_roadmap_due_in: Elkészültéig várhatóan még
|
||||
label_roadmap_overdue: %s késésben
|
||||
label_roadmap_no_issues: Nincsenek feladatok ehhez a verzióhoz
|
||||
label_search: Keresés
|
||||
label_result_plural: Találatok
|
||||
label_all_words: Minden szó
|
||||
label_wiki: Wiki
|
||||
label_wiki_edit: Wiki szerkesztés
|
||||
label_wiki_edit_plural: Wiki szerkesztések
|
||||
label_wiki_page: Wiki oldal
|
||||
label_wiki_page_plural: Wiki oldalak
|
||||
label_index_by_title: Cím szerint indexelve
|
||||
label_index_by_date: Dátum szerint indexelve
|
||||
label_current_version: Jelenlegi verzió
|
||||
label_preview: Előnézet
|
||||
label_feed_plural: Visszajelzések
|
||||
label_changes_details: Változások részletei
|
||||
label_issue_tracking: Feladat követés
|
||||
label_spent_time: Ráfordított idő
|
||||
label_f_hour: %.2f óra
|
||||
label_f_hour_plural: %.2f óra
|
||||
label_time_tracking: Idő követés
|
||||
label_change_plural: Változások
|
||||
label_statistics: Statisztikák
|
||||
label_commits_per_month: Commits havonta
|
||||
label_commits_per_author: Commits szerzőnként
|
||||
label_view_diff: Különbségek megtekintése
|
||||
label_diff_inline: inline
|
||||
label_diff_side_by_side: side by side
|
||||
label_options: Opciók
|
||||
label_copy_workflow_from: Workflow másolása innen
|
||||
label_permissions_report: Jogosultsági riport
|
||||
label_watched_issues: Megfigyelt feladatok
|
||||
label_related_issues: Kapcsolódó feladatok
|
||||
label_applied_status: Alkalmazandó státusz
|
||||
label_loading: Betöltés...
|
||||
label_relation_new: Új kapcsolat
|
||||
label_relation_delete: Kapcsolat törlése
|
||||
label_relates_to: kapcsolódik
|
||||
label_duplicates: duplikálja
|
||||
label_blocks: zárolja
|
||||
label_blocked_by: zárolta
|
||||
label_precedes: megelőzi
|
||||
label_follows: követi
|
||||
label_end_to_start: végétől indulásig
|
||||
label_end_to_end: végétől végéig
|
||||
label_start_to_start: indulástól indulásig
|
||||
label_start_to_end: indulástól végéig
|
||||
label_stay_logged_in: Emlékezzen rám
|
||||
label_disabled: kikapcsolva
|
||||
label_show_completed_versions: A kész verziók mutatása
|
||||
label_me: én
|
||||
label_board: Fórum
|
||||
label_board_new: Új fórum
|
||||
label_board_plural: Fórumok
|
||||
label_topic_plural: Témák
|
||||
label_message_plural: Üzenetek
|
||||
label_message_last: Utolsó üzenet
|
||||
label_message_new: Új üzenet
|
||||
label_message_posted: Üzenet hozzáadva
|
||||
label_reply_plural: Válaszok
|
||||
label_send_information: Fiók infomációk küldése a felhasználónak
|
||||
label_year: Év
|
||||
label_month: Hónap
|
||||
label_week: Hét
|
||||
label_date_from: 'Kezdet:'
|
||||
label_date_to: 'Vége:'
|
||||
label_language_based: A felhasználó nyelve alapján
|
||||
label_sort_by: %s szerint rendezve
|
||||
label_send_test_email: Teszt e-mail küldése
|
||||
label_feeds_access_key_created_on: 'RSS hozzáférési kulcs létrehozva ennyivel ezelőtt: %s'
|
||||
label_module_plural: Modulok
|
||||
label_added_time_by: '%s adta hozzá ennyivel ezelőtt: %s'
|
||||
label_updated_time: 'Utolsó módosítás ennyivel ezelőtt: %s'
|
||||
label_jump_to_a_project: Ugrás projekthez...
|
||||
label_file_plural: Fájlok
|
||||
label_changeset_plural: Changesets
|
||||
label_default_columns: Alapértelmezett oszlopok
|
||||
label_no_change_option: (Nincs változás)
|
||||
label_bulk_edit_selected_issues: A kiválasztott feladatok kötegelt szerkesztése
|
||||
label_theme: Téma
|
||||
label_default: Alapértelmezett
|
||||
label_search_titles_only: Keresés csak a címekben
|
||||
label_user_mail_option_all: "Minden eseményről minden saját projektemben"
|
||||
label_user_mail_option_selected: "Minden eseményről a kiválasztott projektekben..."
|
||||
label_user_mail_option_none: "Csak a megfigyelt dolgokról, vagy, amiben részt veszek"
|
||||
label_user_mail_no_self_notified: "Nem kérek értesítést az általam végzett módosításokról"
|
||||
label_registration_activation_by_email: Fiók aktiválása e-mailben
|
||||
label_registration_manual_activation: Manuális fiók aktiválás
|
||||
label_registration_automatic_activation: Automatikus fiók aktiválás
|
||||
label_display_per_page: 'Oldalanként: %s'
|
||||
label_age: Kor
|
||||
label_change_properties: Tulajdonságok változtatása
|
||||
label_general: Általános
|
||||
label_more: továbbiak
|
||||
label_scm: SCM
|
||||
label_plugins: Pluginek
|
||||
label_ldap_authentication: LDAP azonosítás
|
||||
label_downloads_abbr: D/L
|
||||
label_optional_description: Opcionális leírás
|
||||
label_add_another_file: Újabb fájl hozzáadása
|
||||
label_preferences: Tulajdonságok
|
||||
label_chronological_order: Időrendben
|
||||
label_reverse_chronological_order: Fordított időrendben
|
||||
label_planning: Tervezés
|
||||
|
||||
button_login: Bejelentkezés
|
||||
button_submit: Elfogad
|
||||
button_save: Mentés
|
||||
button_check_all: Mindent kijelöl
|
||||
button_uncheck_all: Kijelölés törlése
|
||||
button_delete: Töröl
|
||||
button_create: Létrehoz
|
||||
button_test: Teszt
|
||||
button_edit: Szerkeszt
|
||||
button_add: Hozzáad
|
||||
button_change: Változtat
|
||||
button_apply: Alkalmaz
|
||||
button_clear: Töröl
|
||||
button_lock: Zárol
|
||||
button_unlock: Felold
|
||||
button_download: Letöltés
|
||||
button_list: Lista
|
||||
button_view: Megnéz
|
||||
button_move: Mozgat
|
||||
button_back: Vissza
|
||||
button_cancel: Mégse
|
||||
button_activate: Aktivál
|
||||
button_sort: Rendezés
|
||||
button_log_time: Idő rögzítés
|
||||
button_rollback: Visszaáll erre a verzióra
|
||||
button_watch: Megfigyel
|
||||
button_unwatch: Megfigyelés törlése
|
||||
button_reply: Válasz
|
||||
button_archive: Archivál
|
||||
button_unarchive: Dearchivál
|
||||
button_reset: Reset
|
||||
button_rename: Átnevez
|
||||
button_change_password: Jelszó megváltoztatása
|
||||
button_copy: Másol
|
||||
button_annotate: Jegyzetel
|
||||
button_update: Módosít
|
||||
button_configure: Konfigurál
|
||||
|
||||
status_active: aktív
|
||||
status_registered: regisztrált
|
||||
status_locked: zárolt
|
||||
|
||||
text_select_mail_notifications: Válasszon eseményeket, amelyekről e-mail értesítést kell küldeni.
|
||||
text_regexp_info: eg. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 = nincs korlátozás
|
||||
text_project_destroy_confirmation: Biztosan törölni szeretné a projektet és vele együtt minden kapcsolódó adatot ?
|
||||
text_subprojects_destroy_warning: 'Az alprojekt(ek): %s szintén törlésre kerülnek.'
|
||||
text_workflow_edit: Válasszon egy szerepkört, és egy trackert a workflow szerkesztéséhez
|
||||
text_are_you_sure: Biztos benne ?
|
||||
text_journal_changed: "változás: %s volt, %s lett"
|
||||
text_journal_set_to: "beállítva: %s"
|
||||
text_journal_deleted: törölve
|
||||
text_tip_task_begin_day: a feladat ezen a napon kezdődik
|
||||
text_tip_task_end_day: a feladat ezen a napon ér véget
|
||||
text_tip_task_begin_end_day: a feladat ezen a napon kezdődik és ér véget
|
||||
text_project_identifier_info: 'Kis betűk (a-z), számok és kötőjel megengedett.<br />Mentés után az azonosítót megváltoztatni nem lehet.'
|
||||
text_caracters_maximum: maximum %d karakter.
|
||||
text_caracters_minimum: Legkevesebb %d karakter hosszúnek kell lennie.
|
||||
text_length_between: Legalább %d és legfeljebb %d hosszú karakter.
|
||||
text_tracker_no_workflow: Nincs workflow definiálva ehhez a tracker-hez
|
||||
text_unallowed_characters: Tiltott karakterek
|
||||
text_comma_separated: Több érték megengedett (vesszővel elválasztva)
|
||||
text_issues_ref_in_commit_messages: Hivatkozás feladatokra, feladatok javítása a commit üzenetekben
|
||||
text_issue_added: %s feladat bejelentve.
|
||||
text_issue_updated: %s feladat frissítve.
|
||||
text_wiki_destroy_confirmation: Biztosan törölni szeretné ezt a wiki-t minden tartalmával együtt ?
|
||||
text_issue_category_destroy_question: Néhány feladat (%d) hozzá van rendelve ehhez a kategóriához. Mit szeretne tenni ?
|
||||
text_issue_category_destroy_assignments: Kategória hozzárendelés megszűntetése
|
||||
text_issue_category_reassign_to: Feladatok újra hozzárendelése a kategóriához
|
||||
text_user_mail_option: "A nem kiválasztott projektekről csak akkor kap értesítést, ha figyelést kér rá, vagy részt vesz benne (pl. Ön a létrehozó, vagy a hozzárendelő)"
|
||||
text_no_configuration_data: "Szerepkörök, trackerek, feladat státuszok, és workflow adatok még nincsenek konfigurálva.\nErősen ajánlott, az alapértelmezett konfiguráció betöltése, és utána módosíthatja azt."
|
||||
text_load_default_configuration: Alapértelmezett konfiguráció betöltése
|
||||
text_status_changed_by_changeset: Applied in changeset %s.
|
||||
text_issues_destroy_confirmation: 'Biztos benne, hogy törölni szeretné a kijelölt feladato(ka)t ?'
|
||||
text_select_project_modules: 'Válassza ki az engedélyezett modulokat ehhez a projekthez:'
|
||||
text_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva
|
||||
text_file_repository_writable: Fájl tároló írható
|
||||
text_rmagick_available: RMagick elérhető (opcionális)
|
||||
text_destroy_time_entries_question: %.02f órányi munka van rögzítve a feladatokon, amiket törölni szeretne. Mit szeretne tenni ?
|
||||
text_destroy_time_entries: A rögzített órák törlése
|
||||
text_assign_time_entries_to_project: A rögzített órák hozzárendelése a projekthez
|
||||
text_reassign_time_entries: 'A rögzített órák újra hozzárendelése ehhez a feladathoz:'
|
||||
|
||||
default_role_manager: Vezető
|
||||
default_role_developper: Fejlesztő
|
||||
default_role_reporter: Bejelentő
|
||||
default_tracker_bug: Hiba
|
||||
default_tracker_feature: Fejlesztés
|
||||
default_tracker_support: Support
|
||||
default_issue_status_new: Új
|
||||
default_issue_status_assigned: Kiosztva
|
||||
default_issue_status_resolved: Megoldva
|
||||
default_issue_status_feedback: Visszajelzés
|
||||
default_issue_status_closed: Lezárt
|
||||
default_issue_status_rejected: Elutasított
|
||||
default_doc_category_user: Felhasználói dokumentáció
|
||||
default_doc_category_tech: Technikai dokumentáció
|
||||
default_priority_low: Alacsony
|
||||
default_priority_normal: Normál
|
||||
default_priority_high: Magas
|
||||
default_priority_urgent: Sürgős
|
||||
default_priority_immediate: Azonnal
|
||||
default_activity_design: Tervezés
|
||||
default_activity_development: Fejlesztés
|
||||
|
||||
enumeration_issue_priorities: Feladat prioritások
|
||||
enumeration_doc_categories: Dokumentum kategóriák
|
||||
enumeration_activities: Tevékenységek (idő rögzítés)
|
||||
mail_body_reminder: "%d neked kiosztott feladat határidős az elkövetkező %d napban:"
|
||||
mail_subject_reminder: "%d feladat határidős az elkövetkező napokban"
|
||||
text_user_wrote: '%s írta:'
|
||||
label_duplicated_by: duplikálta
|
||||
@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
|
||||
setting_default_projects_public: New projects are public by default
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
label_planning: Planning
|
||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user