Compare commits

...
15 Commits
Author SHA1 Message Date
Jean-Philippe Lang e5ac5000e5 tagged version 0.8.0
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/0.8.0@2207 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 11:28:55 +00:00
Jean-Philippe Lang 56318aab53 Merged r2202 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2205 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 10:01:34 +00:00
Jean-Philippe Lang babb14dd94 Doc updates for 0.8.0 final release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2204 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 09:52:49 +00:00
Jean-Philippe Lang 3b90141543 Translation updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2200 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 15:50:08 +00:00
Jean-Philippe Lang bce764d9bc Merged r2191 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2198 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 15:27:29 +00:00
Jean-Philippe Lang b65d546245 Merged r2195 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2197 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 15:26:17 +00:00
Jean-Philippe Lang 9f12151ac0 Merged r2192 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2193 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-28 13:41:03 +00:00
Jean-Philippe Lang 78cac6f02b Merged r2183 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2184 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 14:07:00 +00:00
Jean-Philippe Lang 16b85bda32 Merged r2178 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2179 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 13:32:59 +00:00
Jean-Philippe Lang 733987fbb6 Merged r2168 to r2171 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 11:23:17 +00:00
Jean-Philippe Lang 7389b4bed0 Merged r2109, r2118, r2130, r2131, r2134, r2135, r2136 and r2139 to r2145 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2146 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-19 11:45:33 +00:00
Jean-Philippe Lang 4570fcb7a2 Merged r2137 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2138 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-15 20:20:56 +00:00
Jean-Philippe Lang 0a709660d2 Merged r2119 to r2127 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2133 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-14 15:32:11 +00:00
Jean-Philippe Lang 633e026e44 Merged r2110 to r2112 (diff limit) from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2132 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 19:49:22 +00:00
Jean-Philippe Lang 618ab6004e Merged r2114 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-08 18:30:00 +00:00
97 changed files with 1781 additions and 1314 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ class AdminController < ApplicationController
def projects def projects
sort_init 'name', 'asc' sort_init 'name', 'asc'
sort_update sort_update %w(name is_public created_on)
@status = params[:status] ? params[:status].to_i : 1 @status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
+8 -4
View File
@@ -126,10 +126,14 @@ class ApplicationController < ActionController::Base
def redirect_back_or_default(default) def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s) back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank? if !back_url.blank?
uri = URI.parse(back_url) begin
# do not redirect user to another host or to the login or register page uri = URI.parse(back_url)
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)}) # do not redirect user to another host or to the login or register page
redirect_to(back_url) and return if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
redirect_to(back_url) and return
end
rescue URI::InvalidURIError
# redirect to default
end end
end end
redirect_to default redirect_to default
+5 -3
View File
@@ -35,12 +35,14 @@ class BoardsController < ApplicationController
end end
def show def show
sort_init "#{Message.table_name}.updated_on", "desc" sort_init 'updated_on', 'desc'
sort_update sort_update 'created_on' => "#{Message.table_name}.created_on",
'replies' => "#{Message.table_name}.replies_count",
'updated_on' => "#{Message.table_name}.updated_on"
@topic_count = @board.topics.count @topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page'] @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}], :include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page, :limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset :offset => @topic_pages.current.offset
+1
View File
@@ -35,6 +35,7 @@ class DocumentsController < ApplicationController
else else
@grouped = documents.group_by(&:category) @grouped = documents.group_by(&:category)
end end
@document = @project.documents.build
render :layout => false if request.xhr? render :layout => false if request.xhr?
end end
+6 -4
View File
@@ -45,9 +45,10 @@ class IssuesController < ApplicationController
helper :timelog helper :timelog
def index def index
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query 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? if @query.valid?
limit = per_page_option limit = per_page_option
respond_to do |format| respond_to do |format|
@@ -78,9 +79,10 @@ class IssuesController < ApplicationController
end end
def changes def changes
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query 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? if @query.valid?
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ], @journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
:conditions => @query.statement, :conditions => @query.statement,
+1
View File
@@ -22,6 +22,7 @@ class JournalsController < ApplicationController
if request.post? if request.post?
@journal.update_attributes(:notes => params[:notes]) if params[:notes] @journal.update_attributes(:notes => params[:notes]) if params[:notes]
@journal.destroy if @journal.details.empty? && @journal.notes.blank? @journal.destroy if @journal.details.empty? && @journal.notes.blank?
call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
respond_to do |format| respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id } format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
format.js { render :action => 'update' } format.js { render :action => 'update' }
+6 -2
View File
@@ -197,8 +197,12 @@ class ProjectsController < ApplicationController
end end
def list_files def list_files
sort_init "#{Attachment.table_name}.filename", "asc" sort_init 'filename', 'asc'
sort_update 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 @versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr? render :layout => !request.xhr?
end end
+3 -2
View File
@@ -51,8 +51,9 @@ class RepositoriesController < ApplicationController
@users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty? @users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty?
@users.compact! @users.compact!
@users.sort! @users.sort!
if request.post? if request.post? && params[:committers].is_a?(Hash)
@repository.committer_ids = params[:committers] # Build a hash with repository usernames as keys and corresponding user ids as values
@repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h}
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'committers', :id => @project redirect_to :action => 'committers', :id => @project
end end
+6 -1
View File
@@ -138,7 +138,12 @@ class TimelogController < ApplicationController
def details def details
sort_init 'spent_on', 'desc' 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 = ARCondition.new
if @project.nil? if @project.nil?
+1 -1
View File
@@ -30,7 +30,7 @@ class UsersController < ApplicationController
def list def list
sort_init 'login', 'asc' 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 @status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
+13 -13
View File
@@ -19,6 +19,7 @@ require 'diff'
class WikiController < ApplicationController class WikiController < ApplicationController
before_filter :find_wiki, :authorize before_filter :find_wiki, :authorize
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
verify :method => :post, :only => [:destroy, :destroy_attachment, :protect], :redirect_to => { :action => :index } verify :method => :post, :only => [:destroy, :destroy_attachment, :protect], :redirect_to => { :action => :index }
@@ -91,8 +92,7 @@ class WikiController < ApplicationController
# rename a page # rename a page
def rename def rename
@page = @wiki.find_page(params[:page]) return render_403 unless editable?
return render_403 unless editable?
@page.redirect_existing_links = true @page.redirect_existing_links = true
# used to display the *original* title if some AR validation errors occur # used to display the *original* title if some AR validation errors occur
@original_title = @page.pretty_title @original_title = @page.pretty_title
@@ -103,15 +103,12 @@ class WikiController < ApplicationController
end end
def protect def protect
page = @wiki.find_page(params[:page]) @page.update_attribute :protected, params[:protected]
page.update_attribute :protected, params[:protected] redirect_to :action => 'index', :id => @project, :page => @page.title
redirect_to :action => 'index', :id => @project, :page => page.title
end end
# show page history # show page history
def history def history
@page = @wiki.find_page(params[:page])
@version_count = @page.content.versions.count @version_count = @page.content.versions.count
@version_pages = Paginator.new self, @version_count, per_page_option, params['p'] @version_pages = Paginator.new self, @version_count, per_page_option, params['p']
# don't load text # don't load text
@@ -125,21 +122,19 @@ class WikiController < ApplicationController
end end
def diff def diff
@page = @wiki.find_page(params[:page])
@diff = @page.diff(params[:version], params[:version_from]) @diff = @page.diff(params[:version], params[:version_from])
render_404 unless @diff render_404 unless @diff
end end
def annotate def annotate
@page = @wiki.find_page(params[:page])
@annotate = @page.annotate(params[:version]) @annotate = @page.annotate(params[:version])
render_404 unless @annotate
end end
# remove a wiki page and its history # remove a wiki page and its history
def destroy def destroy
@page = @wiki.find_page(params[:page]) return render_403 unless editable?
return render_403 unless editable? @page.destroy
@page.destroy if @page
redirect_to :action => 'special', :id => @project, :page => 'Page_index' redirect_to :action => 'special', :id => @project, :page => 'Page_index'
end end
@@ -181,7 +176,6 @@ class WikiController < ApplicationController
end end
def add_attachment def add_attachment
@page = @wiki.find_page(params[:page])
return render_403 unless editable? return render_403 unless editable?
attach_files(@page, params[:attachments]) attach_files(@page, params[:attachments])
redirect_to :action => 'index', :page => @page.title redirect_to :action => 'index', :page => @page.title
@@ -204,6 +198,12 @@ private
render_404 render_404
end end
# Finds the requested page and returns a 404 error if it doesn't exist
def find_existing_page
@page = @wiki.find_page(params[:page])
render_404 if @page.nil?
end
# Returns true if the current user is allowed to edit the page, otherwise false # Returns true if the current user is allowed to edit the page, otherwise false
def editable?(page = @page) def editable?(page = @page)
page.editable_by?(User.current) page.editable_by?(User.current)
+4 -3
View File
@@ -18,6 +18,7 @@
require 'coderay' require 'coderay'
require 'coderay/helpers/file_type' require 'coderay/helpers/file_type'
require 'forwardable' require 'forwardable'
require 'cgi'
module ApplicationHelper module ApplicationHelper
include Redmine::WikiFormatting::Macros::Definitions include Redmine::WikiFormatting::Macros::Definitions
@@ -47,8 +48,8 @@ module ApplicationHelper
end end
# Display a link to user's account page # Display a link to user's account page
def link_to_user(user) def link_to_user(user, options={})
(user && !user.anonymous?) ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous' (user && !user.anonymous?) ? link_to(user.name(options[:format]), :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
end end
def link_to_issue(issue, options={}) def link_to_issue(issue, options={})
@@ -525,7 +526,7 @@ module ApplicationHelper
def back_url_hidden_field_tag def back_url_hidden_field_tag
back_url = params[:back_url] || request.env['HTTP_REFERER'] back_url = params[:back_url] || request.env['HTTP_REFERER']
hidden_field_tag('back_url', back_url) unless back_url.blank? hidden_field_tag('back_url', CGI.escape(back_url)) unless back_url.blank?
end end
def check_all_links(form_name) def check_all_links(form_name)
+7
View File
@@ -33,6 +33,13 @@ module IssuesHelper
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}" "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
end end
# Returns a string of css classes that apply to the given issue
def css_issue_classes(issue)
s = "issue status-#{issue.status.position} priority-#{issue.priority.position}"
s << ' overdue' if issue.overdue?
s
end
def sidebar_queries def sidebar_queries
unless @sidebar_queries unless @sidebar_queries
# User can see public queries and his own queries # User can see public queries and his own queries
+2 -2
View File
@@ -22,8 +22,8 @@ module QueriesHelper
end end
def column_header(column) def column_header(column)
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption, column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
:default_order => column.default_order) : :default_order => column.default_order) :
content_tag('th', column.caption) content_tag('th', column.caption)
end end
+13 -5
View File
@@ -67,23 +67,31 @@ module SortHelper
# Updates the sort state. Call this in the controller prior to calling # Updates the sort state. Call this in the controller prior to calling
# sort_clause. # sort_clause.
# # sort_keys can be either an array or a hash of allowed keys
def sort_update() def sort_update(sort_keys)
if params[:sort_key] sort_key = params[:sort_key]
sort = {:key => params[:sort_key], :order => params[:sort_order]} 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] elsif session[@sort_name]
sort = session[@sort_name] # Previous sort. sort = session[@sort_name] # Previous sort.
else else
sort = @sort_default sort = @sort_default
end end
session[@sort_name] = sort 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 end
# Returns an SQL sort clause corresponding to the current sort state. # Returns an SQL sort clause corresponding to the current sort state.
# Use this to sort the controller's table items collection. # Use this to sort the controller's table items collection.
# #
def sort_clause() def sort_clause()
session[@sort_name][:key] + ' ' + (session[@sort_name][:order] || 'ASC') @sort_clause
end end
# Returns a link which sorts by the named column. # Returns a link which sorts by the named column.
+6
View File
@@ -28,4 +28,10 @@ class Document < ActiveRecord::Base
validates_presence_of :project, :title, :category validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60 validates_length_of :title, :maximum => 60
def after_initialize
if new_record?
self.category ||= Enumeration.default('DCAT')
end
end
end end
+3 -1
View File
@@ -44,7 +44,9 @@ class Enumeration < ActiveRecord::Base
end end
def before_save def before_save
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt}) if is_default? if is_default? && is_default_changed?
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt})
end
end end
def objects_count def objects_count
+5
View File
@@ -195,6 +195,11 @@ class Issue < ActiveRecord::Base
self.status.is_closed? self.status.is_closed?
end end
# Returns true if the issue is overdue
def overdue?
!due_date.nil? && (due_date < Date.today)
end
# Users the issue can be assigned to # Users the issue can be assigned to
def assignable_users def assignable_users
project.assignable_users project.assignable_users
+23 -14
View File
@@ -16,6 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MailHandler < ActionMailer::Base class MailHandler < ActionMailer::Base
include ActionView::Helpers::SanitizeHelper
class UnauthorizedAction < StandardError; end class UnauthorizedAction < StandardError; end
class MissingInformation < StandardError; end class MissingInformation < StandardError; end
@@ -88,15 +89,14 @@ class MailHandler < ActionMailer::Base
issue.status = status issue.status = status
end end
issue.subject = email.subject.chomp.toutf8 issue.subject = email.subject.chomp.toutf8
issue.description = email.plain_text_body.chomp issue.description = plain_text_body
issue.save! issue.save!
add_attachments(issue) add_attachments(issue)
logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info
# send notification before adding watchers since they were cc'ed
Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
# add To and Cc as watchers # add To and Cc as watchers
add_watchers(issue) add_watchers(issue)
# send notification after adding watchers so that they can reply to Redmine
Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
issue issue
end end
@@ -120,7 +120,7 @@ class MailHandler < ActionMailer::Base
raise UnauthorizedAction unless status.nil? || user.allowed_to?(:edit_issues, issue.project) raise UnauthorizedAction unless status.nil? || user.allowed_to?(:edit_issues, issue.project)
# add the note # add the note
journal = issue.init_journal(user, email.plain_text_body.chomp) journal = issue.init_journal(user, plain_text_body)
add_attachments(issue) add_attachments(issue)
# check workflow # check workflow
if status && issue.new_statuses_allowed_to(user).include?(status) if status && issue.new_statuses_allowed_to(user).include?(status)
@@ -156,21 +156,30 @@ class MailHandler < ActionMailer::Base
end end
def get_keyword(attr) def get_keyword(attr)
if @@handler_options[:allow_override].include?(attr.to_s) && email.plain_text_body =~ /^#{attr}:[ \t]*(.+)$/i if @@handler_options[:allow_override].include?(attr.to_s) && plain_text_body =~ /^#{attr}:[ \t]*(.+)$/i
$1.strip $1.strip
elsif !@@handler_options[:issue][attr].blank? elsif !@@handler_options[:issue][attr].blank?
@@handler_options[:issue][attr] @@handler_options[:issue][attr]
end end
end end
end
# Returns the text/plain part of the email
class TMail::Mail # If not found (eg. HTML-only email), returns the body with tags removed
# Returns body of the first plain text part found if any
def plain_text_body def plain_text_body
return @plain_text_body unless @plain_text_body.nil? return @plain_text_body unless @plain_text_body.nil?
p = self.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten parts = @email.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten
plain = p.detect {|c| c.content_type == 'text/plain'} if parts.empty?
@plain_text_body = plain.nil? ? self.body : plain.body parts << @email
end
plain_text_part = parts.detect {|p| p.content_type == 'text/plain'}
if plain_text_part.nil?
# no text/plain part found, assuming html-only email
# strip html tags and remove doctype directive
@plain_text_body = strip_tags(@email.body.to_s)
@plain_text_body.gsub! %r{^<!DOCTYPE .*$}, ''
else
@plain_text_body = plain_text_part.body.to_s
end
@plain_text_body.strip!
end end
end end
+1 -1
View File
@@ -57,7 +57,7 @@ class Mailer < ActionMailer::Base
subject l(:mail_subject_reminder, issues.size) subject l(:mail_subject_reminder, issues.size)
body :issues => issues, body :issues => issues,
:days => days, :days => days,
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'issues.due_date', :sort_order => 'asc') :issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')
end end
def document_added(document) def document_added(document)
+6 -1
View File
@@ -144,7 +144,7 @@ class User < ActiveRecord::Base
end end
def time_zone def time_zone
@time_zone ||= (self.pref.time_zone.blank? ? nil : TimeZone[self.pref.time_zone]) @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
end end
def wants_comments_in_reverse_order? def wants_comments_in_reverse_order?
@@ -178,6 +178,11 @@ class User < ActiveRecord::Base
token = Token.find_by_action_and_value('autologin', key) token = Token.find_by_action_and_value('autologin', key)
token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
end end
# Makes find_by_mail case-insensitive
def self.find_by_mail(mail)
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
end
# Sort users by their display names # Sort users by their display names
def <=>(user) def <=>(user)
+3 -3
View File
@@ -33,9 +33,9 @@
<thead><tr> <thead><tr>
<th><%= l(:field_subject) %></th> <th><%= l(:field_subject) %></th>
<th><%= l(:field_author) %></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)) %>
<%= sort_header_tag("#{Message.table_name}.replies_count", :caption => l(:label_reply_plural)) %> <%= sort_header_tag('replies', :caption => l(:label_reply_plural)) %>
<%= 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> </tr></thead>
<tbody> <tbody>
<% @topics.each do |topic| %> <% @topics.each do |topic| %>
+4 -1
View File
@@ -1,4 +1,5 @@
<% Redmine::UnifiedDiff.new(diff, diff_type).each do |table_file| -%> <% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
<% diff.each do |table_file| -%>
<div class="autoscroll"> <div class="autoscroll">
<% if diff_type == 'sbs' -%> <% if diff_type == 'sbs' -%>
<table class="filecontent CodeRay"> <table class="filecontent CodeRay">
@@ -62,3 +63,5 @@
</div> </div>
<% end -%> <% end -%>
<%= l(:text_diff_truncated) if diff.truncated? %>
+2 -2
View File
@@ -4,14 +4,14 @@
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;', <th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %> :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th> </th>
<%= sort_header_tag("#{Issue.table_name}.id", :caption => '#', :default_order => 'desc') %> <%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
<% query.columns.each do |column| %> <% query.columns.each do |column| %>
<%= column_header(column) %> <%= column_header(column) %>
<% end %> <% end %>
</tr></thead> </tr></thead>
<tbody> <tbody>
<% issues.each do |issue| -%> <% issues.each do |issue| -%>
<tr id="issue-<%= issue.id %>" class="issue hascontextmenu <%= cycle('odd', 'even') %> <%= "status-#{issue.status.position} priority-#{issue.priority.position}" %>"> <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %>">
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> <td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
+1 -1
View File
@@ -8,7 +8,7 @@
</tr></thead> </tr></thead>
<tbody> <tbody>
<% for issue in issues %> <% for issue in issues %>
<tr id="issue-<%= issue.id %>" class="issue hascontextmenu <%= cycle('odd', 'even') %> <%= "status-#{issue.status.position} priority-#{issue.priority.position}" %>"> <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %>">
<td class="id"> <td class="id">
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %> <%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
+1 -1
View File
@@ -20,7 +20,7 @@
<h3><%= l(:label_query_plural) %></h3> <h3><%= l(:label_query_plural) %></h3>
<% sidebar_queries.each do |query| -%> <% sidebar_queries.each do |query| -%>
<%= link_to query.name, :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %><br /> <%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
<% end -%> <% end -%>
<%= call_hook(:view_issues_sidebar_queries_bottom) %> <%= call_hook(:view_issues_sidebar_queries_bottom) %>
<% end -%> <% end -%>
+1 -1
View File
@@ -9,7 +9,7 @@
<h2><%= @issue.tracker.name %> #<%= @issue.id %></h2> <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
<div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>"> <div class="<%= css_issue_classes(@issue) %>">
<%= avatar(@issue.author, :size => "64") %> <%= avatar(@issue.author, :size => "64") %>
<h3><%=h @issue.subject %></h3> <h3><%=h @issue.subject %></h3>
<p class="author"> <p class="author">
+3 -2
View File
@@ -1,6 +1,7 @@
<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %> <% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
<%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit', <%= text_area_tag :notes, h(@journal.notes), :class => 'wiki-edit',
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %> :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
<%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>
<p><%= submit_tag l(:button_save) %> <p><%= submit_tag l(:button_save) %>
<%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " + <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
"Element.show('journal-#{@journal.id}-notes'); return false;" %></p> "Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
+2
View File
@@ -6,3 +6,5 @@ else
page.show "journal-#{@journal.id}-notes" page.show "journal-#{@journal.id}-notes"
page.remove "journal-#{@journal.id}-form" page.remove "journal-#{@journal.id}-form"
end end
call_hook(:view_journals_update_rjs_bottom, { :page => page, :journal => @journal })
+1 -1
View File
@@ -24,7 +24,7 @@
<div id="account"> <div id="account">
<%= render_menu :account_menu -%> <%= render_menu :account_menu -%>
</div> </div>
<%= content_tag('div', "#{l(:label_logged_as)} #{User.current.login}", :id => 'loggedas') if User.current.logged? %> <%= content_tag('div', "#{l(:label_logged_as)} #{link_to_user(User.current, :format => :username)}", :id => 'loggedas') if User.current.logged? %>
<%= render_menu :top_menu -%> <%= render_menu :top_menu -%>
</div> </div>
+1 -1
View File
@@ -38,7 +38,7 @@
<div class="box tabular"> <div class="box tabular">
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %> <% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
<p><%= pref_fields.check_box :hide_mail %></p> <p><%= pref_fields.check_box :hide_mail %></p>
<p><%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p> <p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p> <p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
<% end %> <% end %>
</div> </div>
+4 -4
View File
@@ -9,10 +9,10 @@
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
<th><%=l(:field_version)%></th> <th><%=l(:field_version)%></th>
<%= sort_header_tag("#{Attachment.table_name}.filename", :caption => l(:field_filename)) %> <%= sort_header_tag('filename', :caption => l(:field_filename)) %>
<%= sort_header_tag("#{Attachment.table_name}.created_on", :caption => l(:label_date), :default_order => 'desc') %> <%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %>
<%= sort_header_tag("#{Attachment.table_name}.filesize", :caption => l(:field_filesize), :default_order => 'desc') %> <%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %>
<%= sort_header_tag("#{Attachment.table_name}.downloads", :caption => l(:label_downloads_abbr), :default_order => 'desc') %> <%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
<th>MD5</th> <th>MD5</th>
<% if delete_allowed %><th></th><% end %> <% if delete_allowed %><th></th><% end %>
</tr></thead> </tr></thead>
+6 -1
View File
@@ -15,11 +15,16 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% i = 0 -%>
<% @committers.each do |committer, user_id| -%> <% @committers.each do |committer, user_id| -%>
<tr class="<%= cycle 'odd', 'even' %>"> <tr class="<%= cycle 'odd', 'even' %>">
<td><%=h committer %></td> <td><%=h committer %></td>
<td><%= select_tag "committers[#{committer}]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %></td> <td>
<%= hidden_field_tag "committers[#{i}][]", committer %>
<%= select_tag "committers[#{i}][]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %>
</td>
</tr> </tr>
<% i += 1 -%>
<% end -%> <% end -%>
</tbody> </tbody>
</table> </table>
+3
View File
@@ -48,6 +48,9 @@
<p><label><%= l(:setting_feeds_limit) %></label> <p><label><%= l(:setting_feeds_limit) %></label>
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p> <%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
<p><label><%= l(:setting_gravatar_enabled) %></label> <p><label><%= l(:setting_gravatar_enabled) %></label>
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p> <%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
</div> </div>
+4 -4
View File
@@ -2,10 +2,10 @@
<thead> <thead>
<tr> <tr>
<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %> <%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
<%= sort_header_tag('user_id', :caption => l(:label_member)) %> <%= sort_header_tag('user', :caption => l(:label_member)) %>
<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %> <%= sort_header_tag('activity', :caption => l(:label_activity)) %>
<%= sort_header_tag("#{Project.table_name}.name", :caption => l(:label_project)) %> <%= sort_header_tag('project', :caption => l(:label_project)) %>
<%= sort_header_tag('issue_id', :caption => l(:label_issue), :default_order => 'desc') %> <%= sort_header_tag('issue', :caption => l(:label_issue), :default_order => 'desc') %>
<th><%= l(:field_comments) %></th> <th><%= l(:field_comments) %></th>
<%= sort_header_tag('hours', :caption => l(:field_hours)) %> <%= sort_header_tag('hours', :caption => l(:field_hours)) %>
<th></th> <th></th>
+1 -1
View File
@@ -20,7 +20,7 @@
<th class="line-num"><%= line_num %></th> <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="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="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> </tr>
<% line_num += 1 %> <% line_num += 1 %>
<% end -%> <% end -%>
+3
View File
@@ -61,6 +61,9 @@ protocol:
feeds_limit: feeds_limit:
format: int format: int
default: 15 default: 15
diff_max_lines_displayed:
format: int
default: 1500
enabled_scm: enabled_scm:
serialized: true serialized: true
default: default:
+22
View File
@@ -5,6 +5,28 @@ Copyright (C) 2006-2008 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2008-12-30 v0.8.0
* Setting added in order to limit the number of diff lines that should be displayed
* Makes logged-in username in topbar linking to
* Mail handler: strip tags when receiving a html-only email
* Mail handler: add watchers before sending notification
* Adds a css class (overdue) to overdue issues on issue lists and detail views
* Fixed: project activity truncated after viewing user's activity
* Fixed: email address entered for password recovery shouldn't be case-sensitive
* Fixed: default flag removed when editing a default enumeration
* Fixed: default category ignored when adding a document
* Fixed: error on repository user mapping when a repository username is blank
* Fixed: Firefox cuts off large diffs
* Fixed: CVS browser should not show dead revisions (deleted files)
* Fixed: escape double-quotes in image titles
* Fixed: escape textarea content when editing a issue note
* Fixed: JS error on context menu with IE
* Fixed: bold syntax around single character in series doesn't work
* Fixed several XSS vulnerabilities
* Fixed a SQL injection vulnerability
== 2008-12-07 v0.8.0-rc1 == 2008-12-07 v0.8.0-rc1
* Wiki page protection * Wiki page protection
+1 -1
View File
@@ -7,7 +7,7 @@ http://www.redmine.org/
== Requirements == Requirements
* Ruby on Rails 2.1 * Ruby on Rails 2.1.2
* A database: * A database:
* MySQL (tested with MySQL 5) * MySQL (tested with MySQL 5)
* PostgreSQL (tested with PostgreSQL 8.1) * PostgreSQL (tested with PostgreSQL 8.1)
+2
View File
@@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -699,3 +699,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+4 -2
View File
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: Abruf eingehender E-Mails aktivieren
setting_mail_handler_api_key: API-Schlüssel setting_mail_handler_api_key: API-Schlüssel
setting_sequential_project_identifiers: Fortlaufende Projektkennungen generieren setting_sequential_project_identifiers: Fortlaufende Projektkennungen generieren
setting_gravatar_enabled: Gravatar Benutzerbilder benutzen setting_gravatar_enabled: Gravatar Benutzerbilder benutzen
setting_diff_max_lines_displayed: Maximale Anzahl anzuzeigender Diff-Zeilen
permission_edit_project: Projekt bearbeiten permission_edit_project: Projekt bearbeiten
permission_select_project_modules: Projektmodule auswählen permission_select_project_modules: Projektmodule auswählen
@@ -344,6 +345,7 @@ label_last_updates_plural: %d zuletzt aktualisierten
label_registered_on: Angemeldet am label_registered_on: Angemeldet am
label_activity: Aktivität label_activity: Aktivität
label_overall_activity: Aktivität aller Projekte anzeigen label_overall_activity: Aktivität aller Projekte anzeigen
label_user_activity: "Aktivität von %s"
label_new: Neu label_new: Neu
label_logged_as: Angemeldet als label_logged_as: Angemeldet als
label_environment: Environment label_environment: Environment
@@ -543,6 +545,7 @@ label_send_test_email: Test-E-Mail senden
label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
label_module_plural: Module label_module_plural: Module
label_added_time_by: Von %s vor %s hinzugefügt label_added_time_by: Von %s vor %s hinzugefügt
label_updated_time_by: Von %s vor %s aktualisiert
label_updated_time: Vor %s aktualisiert label_updated_time: Vor %s aktualisiert
label_jump_to_a_project: Zu einem Projekt springen... label_jump_to_a_project: Zu einem Projekt springen...
label_file_plural: Dateien label_file_plural: Dateien
@@ -668,6 +671,7 @@ text_enumeration_destroy_question: '%d Objekte sind diesem Wert zugeordnet.'
text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:' text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:'
text_email_delivery_not_configured: "Der SMTP-Server ist nicht konfiguriert und Mailbenachrichtigungen sind ausgeschaltet.\nNehmen Sie die Einstellungen für Ihren SMTP-Server in config/email.yml vor und starten Sie die Applikation neu." text_email_delivery_not_configured: "Der SMTP-Server ist nicht konfiguriert und Mailbenachrichtigungen sind ausgeschaltet.\nNehmen Sie die Einstellungen für Ihren SMTP-Server in config/email.yml vor und starten Sie die Applikation neu."
text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der Redmine-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen Redmine- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet." text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der Redmine-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen Redmine- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet."
text_diff_truncated: '... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.'
default_role_manager: Manager default_role_manager: Manager
default_role_developper: Entwickler default_role_developper: Entwickler
@@ -694,5 +698,3 @@ default_activity_development: Entwicklung
enumeration_issue_priorities: Ticket-Prioritäten enumeration_issue_priorities: Ticket-Prioritäten
enumeration_doc_categories: Dokumentenkategorien enumeration_doc_categories: Dokumentenkategorien
enumeration_activities: Aktivitäten (Zeiterfassung) enumeration_activities: Aktivitäten (Zeiterfassung)
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+2
View File
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: Enable WS for incoming emails
setting_mail_handler_api_key: API key setting_mail_handler_api_key: API key
setting_sequential_project_identifiers: Generate sequential project identifiers setting_sequential_project_identifiers: Generate sequential project identifiers
setting_gravatar_enabled: Use Gravatar user icons setting_gravatar_enabled: Use Gravatar user icons
setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_edit_project: Edit project permission_edit_project: Edit project
permission_select_project_modules: Select project modules permission_select_project_modules: Select project modules
@@ -670,6 +671,7 @@ text_enumeration_destroy_question: '%d objects are assigned to this value.'
text_enumeration_category_reassign_to: 'Reassign them to this value:' text_enumeration_category_reassign_to: 'Reassign them to this value:'
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
default_role_manager: Manager default_role_manager: Manager
default_role_developper: Developer default_role_developper: Developer
+42 -40
View File
@@ -19,11 +19,11 @@ actionview_datehelper_time_in_words_second_less_than_plural: menos de %d segundo
actionview_instancetag_blank_option: Por favor seleccione actionview_instancetag_blank_option: Por favor seleccione
activerecord_error_accepted: debe ser aceptado activerecord_error_accepted: debe ser aceptado
activerecord_error_blank: no puede estar en blanco activerecord_error_blank: no puede estar en blanco
activerecord_error_circular_dependency: Esta relación podría crear una dependencia anidada activerecord_error_circular_dependency: Esta relación podría crear una dependencia circular
activerecord_error_confirmation: la confirmación no coincide activerecord_error_confirmation: la confirmación no coincide
activerecord_error_empty: no puede estar vacío activerecord_error_empty: no puede estar vacío
activerecord_error_exclusion: está reservado activerecord_error_exclusion: está reservado
activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo activerecord_error_greater_than_start_date: debe ser posterior a la fecha de comienzo
activerecord_error_inclusion: no está incluído en la lista activerecord_error_inclusion: no está incluído en la lista
activerecord_error_invalid: no es válido activerecord_error_invalid: no es válido
activerecord_error_not_a_date: no es una fecha válida activerecord_error_not_a_date: no es una fecha válida
@@ -140,11 +140,11 @@ field_is_default: Estado por defecto
field_is_filter: Usado como filtro field_is_filter: Usado como filtro
field_is_for_all: Para todos los proyectos field_is_for_all: Para todos los proyectos
field_is_in_chlog: Consultar las peticiones en el histórico field_is_in_chlog: Consultar las peticiones en el histórico
field_is_in_roadmap: Consultar las peticiones en el roadmap field_is_in_roadmap: Consultar las peticiones en la planificación
field_is_public: Público field_is_public: Público
field_is_required: Obligatorio field_is_required: Obligatorio
field_issue: Petición field_issue: Petición
field_issue_to_id: Petición Relacionada field_issue_to_id: Petición relacionada
field_language: Idioma field_language: Idioma
field_last_login_on: Última conexión field_last_login_on: Última conexión
field_lastname: Apellido field_lastname: Apellido
@@ -178,7 +178,7 @@ field_subproject: Proyecto secundario
field_summary: Resumen field_summary: Resumen
field_time_zone: Zona horaria field_time_zone: Zona horaria
field_title: Título field_title: Título
field_tracker: Tracker field_tracker: Tipo
field_type: Tipo field_type: Tipo
field_updated_on: Actualizado field_updated_on: Actualizado
field_url: URL field_url: URL
@@ -215,7 +215,7 @@ label_ago: hace
label_all: todos label_all: todos
label_all_time: todo el tiempo label_all_time: todo el tiempo
label_all_words: Todas las palabras label_all_words: Todas las palabras
label_and_its_subprojects: %s y sus subproyectos label_and_its_subprojects: %s y proyectos secundarios
label_applied_status: Aplicar estado label_applied_status: Aplicar estado
label_assigned_to_me_issues: Peticiones que me están asignadas label_assigned_to_me_issues: Peticiones que me están asignadas
label_associated_revisions: Revisiones asociadas label_associated_revisions: Revisiones asociadas
@@ -234,7 +234,7 @@ label_blocks: bloquea a
label_board: Foro label_board: Foro
label_board_new: Nuevo foro label_board_new: Nuevo foro
label_board_plural: Foros label_board_plural: Foros
label_boolean: Boleano label_boolean: Booleano
label_browse: Hojear label_browse: Hojear
label_bulk_edit_selected_issues: Editar las peticiones seleccionadas label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
label_calendar: Calendario label_calendar: Calendario
@@ -293,7 +293,7 @@ label_enumerations: Listas de valores
label_environment: Entorno label_environment: Entorno
label_equals: igual label_equals: igual
label_example: Ejemplo label_example: Ejemplo
label_export_to: Exportar a label_export_to: 'Exportar a:'
label_f_hour: %.2f hora label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas label_f_hour_plural: %.2f horas
label_feed_plural: Feeds label_feed_plural: Feeds
@@ -327,7 +327,7 @@ label_issue_category_new: Nueva categoría
label_issue_category_plural: Categorías de las peticiones label_issue_category_plural: Categorías de las peticiones
label_issue_new: Nueva petición label_issue_new: Nueva petición
label_issue_plural: Peticiones label_issue_plural: Peticiones
label_issue_status: Estado de petición label_issue_status: Estado de la petición
label_issue_status_new: Nuevo estado label_issue_status_new: Nuevo estado
label_issue_status_plural: Estados de las peticiones label_issue_status_plural: Estados de las peticiones
label_issue_tracking: Peticiones label_issue_tracking: Peticiones
@@ -337,7 +337,7 @@ label_issue_watchers: Seguidores
label_issues_by: Peticiones por %s label_issues_by: Peticiones por %s
label_jump_to_a_project: Ir al proyecto... label_jump_to_a_project: Ir al proyecto...
label_language_based: Basado en el idioma label_language_based: Basado en el idioma
label_last_changes: %d cambios del último label_last_changes: últimos %d cambios
label_last_login: Última conexión label_last_login: Última conexión
label_last_month: último mes label_last_month: último mes
label_last_n_days: últimos %d días label_last_n_days: últimos %d días
@@ -384,7 +384,7 @@ label_news_plural: Noticias
label_news_view_all: Ver todas las noticias label_news_view_all: Ver todas las noticias
label_next: Siguiente label_next: Siguiente
label_no_change_option: (Sin cambios) label_no_change_option: (Sin cambios)
label_no_data: Ningun dato a mostrar label_no_data: Ningún dato a mostrar
label_nobody: nadie label_nobody: nadie
label_none: ninguno label_none: ninguno
label_not_contains: no contiene label_not_contains: no contiene
@@ -397,7 +397,7 @@ label_options: Opciones
label_overall_activity: Actividad global label_overall_activity: Actividad global
label_overview: Vistazo label_overview: Vistazo
label_password_lost: ¿Olvidaste la contraseña? label_password_lost: ¿Olvidaste la contraseña?
label_per_page: Por la página label_per_page: Por página
label_permissions: Permisos label_permissions: Permisos
label_permissions_report: Informe de permisos label_permissions_report: Informe de permisos
label_personalize_page: Personalizar esta página label_personalize_page: Personalizar esta página
@@ -438,7 +438,7 @@ label_result_plural: Resultados
label_reverse_chronological_order: En orden cronológico inverso label_reverse_chronological_order: En orden cronológico inverso
label_revision: Revisión label_revision: Revisión
label_revision_plural: Revisiones label_revision_plural: Revisiones
label_roadmap: Roadmap label_roadmap: Planificación
label_roadmap_due_in: Finaliza en %s label_roadmap_due_in: Finaliza en %s
label_roadmap_no_issues: No hay peticiones para esta versión label_roadmap_no_issues: No hay peticiones para esta versión
label_roadmap_overdue: %s tarde label_roadmap_overdue: %s tarde
@@ -452,7 +452,7 @@ label_search_titles_only: Buscar sólo en títulos
label_send_information: Enviar información de la cuenta al usuario label_send_information: Enviar información de la cuenta al usuario
label_send_test_email: Enviar un correo de prueba label_send_test_email: Enviar un correo de prueba
label_settings: Configuración label_settings: Configuración
label_show_completed_versions: Muestra las versiones completas label_show_completed_versions: Muestra las versiones terminadas
label_sort_by: Ordenar por %s label_sort_by: Ordenar por %s
label_sort_higher: Subir label_sort_higher: Subir
label_sort_highest: Primero label_sort_highest: Primero
@@ -474,16 +474,18 @@ label_time_tracking: Control de tiempo
label_today: hoy label_today: hoy
label_topic_plural: Temas label_topic_plural: Temas
label_total: Total label_total: Total
label_tracker: Tracker label_tracker: Tipo
label_tracker_new: Nuevo tracker label_tracker_new: Nuevo tipo
label_tracker_plural: Trackers label_tracker_plural: Tipos de peticiones
label_updated_time: Actualizado hace %s label_updated_time: Actualizado hace %s
label_updated_time_by: Actualizado por %s hace %s
label_used_by: Utilizado por label_used_by: Utilizado por
label_user: Usuario label_user: Usuario
label_user_activity: "Actividad de %s"
label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí" label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí"
label_user_mail_option_all: "Para cualquier evento en todos mis proyectos" label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo" label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
label_user_mail_option_selected: "Para cualquier evento del proyecto seleccionado..." label_user_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..."
label_user_new: Nuevo usuario label_user_new: Nuevo usuario
label_user_plural: Usuarios label_user_plural: Usuarios
label_version: Versión label_version: Versión
@@ -501,22 +503,22 @@ label_wiki_page_plural: Wiki páginas
label_workflow: Flujo de trabajo label_workflow: Flujo de trabajo
label_year: Año label_year: Año
label_yesterday: ayer label_yesterday: ayer
mail_body_account_activation_request: "Un nuevo usuario (%s) ha sido registrado. Esta cuenta está pendiende de aprobación" mail_body_account_activation_request: 'Se ha inscrito un nuevo usuario (%s). La cuenta está pendiende de aprobación:'
mail_body_account_information: Información sobre su cuenta mail_body_account_information: Información sobre su cuenta
mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse. mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse.
mail_body_lost_password: 'Para cambiar su contraseña, haga click en el siguiente enlace:' mail_body_lost_password: 'Para cambiar su contraseña, haga clic en el siguiente enlace:'
mail_body_register: 'Para activar su cuenta, haga click en el siguiente enlace:' mail_body_register: 'Para activar su cuenta, haga clic en el siguiente enlace:'
mail_body_reminder: "%d peticion(es) asignadas a tí finalizan en los próximos %d días:" mail_body_reminder: "%d peticion(es) asignadas a tí finalizan en los próximos %d días:"
mail_subject_account_activation_request: Petición de activación de cuenta %s mail_subject_account_activation_request: Petición de activación de cuenta %s
mail_subject_lost_password: Tu contraseña del %s mail_subject_lost_password: Tu contraseña del %s
mail_subject_register: Activación de la cuenta del %s mail_subject_register: Activación de la cuenta del %s
mail_subject_reminder: "%d peticion(es) finalizan en los próximos días" mail_subject_reminder: "%d peticion(es) finalizan en los próximos días"
notice_account_activated: Su cuenta ha sido activada. Ahora se encuentra conectado. notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse.
notice_account_invalid_creditentials: Usuario o contraseña inválido. notice_account_invalid_creditentials: Usuario o contraseña inválido.
notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña. notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.
notice_account_password_updated: Contraseña modificada correctamente. notice_account_password_updated: Contraseña modificada correctamente.
notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte de administrador" notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte del administrador."
notice_account_register_done: Cuenta creada correctamente. notice_account_register_done: Cuenta creada correctamente. Para activarla, haga clic sobre el enlace que le ha sido enviado por correo.
notice_account_unknown_email: Usuario desconocido. notice_account_unknown_email: Usuario desconocido.
notice_account_updated: Cuenta actualizada correctamente. notice_account_updated: Cuenta actualizada correctamente.
notice_account_wrong_password: Contraseña incorrecta. notice_account_wrong_password: Contraseña incorrecta.
@@ -524,9 +526,9 @@ notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación e
notice_default_data_loaded: Configuración por defecto cargada correctamente. notice_default_data_loaded: Configuración por defecto cargada correctamente.
notice_email_error: Ha ocurrido un error mientras enviando el correo (%s) notice_email_error: Ha ocurrido un error mientras enviando el correo (%s)
notice_email_sent: Se ha enviado un correo a %s notice_email_sent: Se ha enviado un correo a %s
notice_failed_to_save_issues: "Imposible salvar %s peticion(es) en %d seleccionado: %s." notice_failed_to_save_issues: "Imposible grabar %s peticion(es) en %d seleccionado: %s."
notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada.
notice_file_not_found: La página a la que intentas acceder no existe. notice_file_not_found: La página a la que intenta acceder no existe.
notice_locking_conflict: Los datos han sido modificados por otro usuario. notice_locking_conflict: Los datos han sido modificados por otro usuario.
notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar" notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar"
notice_not_authorized: No tiene autorización para acceder a esta página. notice_not_authorized: No tiene autorización para acceder a esta página.
@@ -544,9 +546,9 @@ permission_comment_news: Comentar noticias
permission_commit_access: Acceso de escritura permission_commit_access: Acceso de escritura
permission_delete_issues: Borrar peticiones permission_delete_issues: Borrar peticiones
permission_delete_messages: Borrar mensajes permission_delete_messages: Borrar mensajes
permission_delete_own_messages: Borrar mensajes propios
permission_delete_wiki_pages: Borrar páginas wiki permission_delete_wiki_pages: Borrar páginas wiki
permission_delete_wiki_pages_attachments: Borrar ficheros permission_delete_wiki_pages_attachments: Borrar ficheros
permission_delete_own_messages: Borrar mensajes propios
permission_edit_issue_notes: Modificar notas permission_edit_issue_notes: Modificar notas
permission_edit_issues: Modificar peticiones permission_edit_issues: Modificar peticiones
permission_edit_messages: Modificar mensajes permission_edit_messages: Modificar mensajes
@@ -602,15 +604,16 @@ setting_commit_fix_keywords: Palabras clave para la corrección
setting_commit_logs_encoding: Codificación de los mensajes de commit setting_commit_logs_encoding: Codificación de los mensajes de commit
setting_commit_ref_keywords: Palabras clave para la referencia setting_commit_ref_keywords: Palabras clave para la referencia
setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos
setting_date_format: Formato de la fecha setting_date_format: Formato de fecha
setting_default_language: Idioma por defecto setting_default_language: Idioma por defecto
setting_default_projects_public: Los proyectos nuevos son públicos por defecto setting_default_projects_public: Los proyectos nuevos son públicos por defecto
setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto setting_diff_max_lines_displayed: Número máximo de diferencias mostradas
setting_display_subprojects_issues: Mostrar por defecto peticiones de proy. secundarios en el principal
setting_emails_footer: Pie de mensajes setting_emails_footer: Pie de mensajes
setting_enabled_scm: Activar SCM setting_enabled_scm: Activar SCM
setting_feeds_limit: Límite de contenido para sindicación setting_feeds_limit: Límite de contenido para sindicación
setting_gravatar_enabled: Usar iconos de usuario (Gravatar) setting_gravatar_enabled: Usar iconos de usuario (Gravatar)
setting_host_name: Nombre de host setting_host_name: Nombre y ruta del servidor
setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones
setting_issues_export_limit: Límite de exportación de peticiones setting_issues_export_limit: Límite de exportación de peticiones
setting_login_required: Se requiere identificación setting_login_required: Se requiere identificación
@@ -632,7 +635,7 @@ setting_wiki_compression: Compresión del historial del Wiki
status_active: activo status_active: activo
status_locked: bloqueado status_locked: bloqueado
status_registered: registrado status_registered: registrado
text_are_you_sure: ¿ Estás seguro ? text_are_you_sure: ¿Está seguro?
text_assign_time_entries_to_project: Asignar las horas al proyecto text_assign_time_entries_to_project: Asignar las horas al proyecto
text_caracters_maximum: %d caracteres como máximo. text_caracters_maximum: %d caracteres como máximo.
text_caracters_minimum: %d caracteres como mínimo text_caracters_minimum: %d caracteres como mínimo
@@ -640,11 +643,12 @@ text_comma_separated: Múltiples valores permitidos (separados por coma).
text_default_administrator_account_changed: Cuenta de administrador por defecto modificada text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
text_destroy_time_entries: Borrar las horas text_destroy_time_entries: Borrar las horas
text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ? text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
text_diff_truncated: '... Diferencia truncada por exceder el máximo tamaño visualizable.'
text_email_delivery_not_configured: "El envío de correos no está configurado, y las notificaciones se han desactivado. \n Configure el servidor de SMTP en config/email.yml y reinicie la aplicación para activar los cambios." text_email_delivery_not_configured: "El envío de correos no está configurado, y las notificaciones se han desactivado. \n Configure el servidor de SMTP en config/email.yml y reinicie la aplicación para activar los cambios."
text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:' text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:'
text_enumeration_destroy_question: '%d objetos con este valor asignado.' text_enumeration_destroy_question: '%d objetos con este valor asignado.'
text_file_repository_writable: Se puede escribir en el repositorio text_file_repository_writable: Se puede escribir en el repositorio
text_issue_added: Petición añadida por %s. text_issue_added: Petición %s añadida por %s.
text_issue_category_destroy_assignments: Dejar las peticiones sin categoría text_issue_category_destroy_assignments: Dejar las peticiones sin categoría
text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categoría. ¿Qué desea hacer? text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categoría. ¿Qué desea hacer?
text_issue_category_reassign_to: Reasignar las peticiones a la categoría text_issue_category_reassign_to: Reasignar las peticiones a la categoría
@@ -657,25 +661,23 @@ text_journal_set_to: fijado a %s
text_length_between: Longitud entre %d y %d caracteres. text_length_between: Longitud entre %d y %d caracteres.
text_load_default_configuration: Cargar la configuración por defecto text_load_default_configuration: Cargar la configuración por defecto
text_min_max_length_info: 0 para ninguna restricción text_min_max_length_info: 0 para ninguna restricción
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." text_no_configuration_data: "Todavía no se han configurado perfiles, ni tipos, estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
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_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_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_reassign_time_entries: 'Reasignar las horas a esta petición:' text_reassign_time_entries: 'Reasignar las horas a esta petición:'
text_regexp_info: ej. ^[A-Z0-9]+$ text_regexp_info: ej. ^[A-Z0-9]+$
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Establezca la correspondencia entre los usuarios de Redmine y los presentes en el log del repositorio.\nLos usuarios con el mismo nombre o correo en Redmine y en el repositorio serán asociados automáticamente."
text_rmagick_available: RMagick disponible (opcional) text_rmagick_available: RMagick disponible (opcional)
text_select_mail_notifications: Seleccionar los eventos a notificar text_select_mail_notifications: Seleccionar los eventos a notificar
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:' text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
text_status_changed_by_changeset: Aplicado en los cambios %s text_status_changed_by_changeset: Aplicado en los cambios %s
text_subprojects_destroy_warning: 'Los subproyectos: %s también se eliminarán' text_subprojects_destroy_warning: 'Los proyectos secundarios: %s también se eliminarán'
text_tip_task_begin_day: tarea que comienza este día text_tip_task_begin_day: tarea que comienza este día
text_tip_task_begin_end_day: tarea que comienza y termina este día text_tip_task_begin_end_day: tarea que comienza y termina este día
text_tip_task_end_day: tarea que termina este día text_tip_task_end_day: tarea que termina este día
text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tracker text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de petición
text_unallowed_characters: Caracteres no permitidos text_unallowed_characters: Caracteres no permitidos
text_user_mail_option: "En los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)." text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
text_user_wrote: '%s escribió:' text_user_wrote: '%s escribió:'
text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido? text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
text_workflow_edit: Seleccionar un flujo de trabajo para actualizar text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+2
View File
@@ -694,3 +694,5 @@ permission_edit_own_messages: Muokkaa omia viestejä
permission_delete_own_messages: Poista omia viestejä permission_delete_own_messages: Poista omia viestejä
label_user_activity: "Käyttäjän %s historia" label_user_activity: "Käyttäjän %s historia"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails"
setting_mail_handler_api_key: Clé de protection de l'API setting_mail_handler_api_key: Clé de protection de l'API
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
permission_edit_project: Modifier le projet permission_edit_project: Modifier le projet
permission_select_project_modules: Choisir les modules permission_select_project_modules: Choisir les modules
@@ -670,6 +671,7 @@ text_enumeration_destroy_question: 'Cette valeur est affectée à %d objets.'
text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:' text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:'
text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer." text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer."
text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés." text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés."
text_diff_truncated: '... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.'
default_role_manager: Manager default_role_manager: Manager
default_role_developper: Développeur default_role_developper: Développeur
+74 -74
View File
@@ -236,7 +236,7 @@ label_register: הרשמה
label_password_lost: אבדה הסיסמה? label_password_lost: אבדה הסיסמה?
label_home: דף הבית label_home: דף הבית
label_my_page: הדף שלי label_my_page: הדף שלי
label_my_account: השבון שלי label_my_account: החשבון שלי
label_my_projects: הפרויקטים שלי label_my_projects: הפרויקטים שלי
label_administration: אדמיניסטרציה label_administration: אדמיניסטרציה
label_login: התחבר label_login: התחבר
@@ -292,7 +292,7 @@ label_confirmation: אישור
label_export_to: יצא ל label_export_to: יצא ל
label_read: קרא... label_read: קרא...
label_public_projects: פרויקטים פומביים label_public_projects: פרויקטים פומביים
label_open_issues: פותח label_open_issues: פתוח
label_open_issues_plural: פתוחים label_open_issues_plural: פתוחים
label_closed_issues: סגור label_closed_issues: סגור
label_closed_issues_plural: סגורים label_closed_issues_plural: סגורים
@@ -308,7 +308,7 @@ label_used_by: בשימוש ע"י
label_details: פרטים label_details: פרטים
label_add_note: הוסף הערה label_add_note: הוסף הערה
label_per_page: לכל דף label_per_page: לכל דף
label_calendar: לו"ח שנה label_calendar: לוח שנה
label_months_from: חודשים מ label_months_from: חודשים מ
label_gantt: גאנט label_gantt: גאנט
label_internal: פנימי label_internal: פנימי
@@ -357,7 +357,7 @@ label_sort_higher: הזז למעלה
label_sort_lower: הזז למטה label_sort_lower: הזז למטה
label_sort_lowest: הזז לתחתית label_sort_lowest: הזז לתחתית
label_roadmap: מפת הדרכים label_roadmap: מפת הדרכים
label_roadmap_due_in: %s נגמר בעוד label_roadmap_due_in: נגמר בעוד %s
label_roadmap_overdue: %s מאחר label_roadmap_overdue: %s מאחר
label_roadmap_no_issues: אין נושאים לגירסא זו label_roadmap_no_issues: אין נושאים לגירסא זו
label_search: חפש label_search: חפש
@@ -421,8 +421,8 @@ label_send_information: שלח מידע על חשבון למשתמש
label_year: שנה label_year: שנה
label_month: חודש label_month: חודש
label_week: שבוע label_week: שבוע
label_date_from: מאת label_date_from: מתאריך
label_date_to: אל label_date_to: עד
label_language_based: מבוסס שפה label_language_based: מבוסס שפה
label_sort_by: מין לפי %s label_sort_by: מין לפי %s
label_send_test_email: שלח דו"ל בדיקה label_send_test_email: שלח דו"ל בדיקה
@@ -487,7 +487,7 @@ text_journal_set_to: שונה ל %s
text_journal_deleted: נמחק text_journal_deleted: נמחק
text_tip_task_begin_day: מטלה המתחילה היום text_tip_task_begin_day: מטלה המתחילה היום
text_tip_task_end_day: מטלה המסתיימת היום text_tip_task_end_day: מטלה המסתיימת היום
text_tip_task_begin_end_day: מתלה המתחילה ומסתיימת היום text_tip_task_begin_end_day: מטלה המתחילה ומסתיימת היום
text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.' text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.'
text_caracters_maximum: מקסימום %d תווים. text_caracters_maximum: מקסימום %d תווים.
text_length_between: אורך בין %d ל %d תווים. text_length_between: אורך בין %d ל %d תווים.
@@ -618,79 +618,79 @@ label_overall_activity: פעילות כוללת
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה." error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
label_planning: תכנון label_planning: תכנון
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.' text_subprojects_destroy_warning: 'תת הפרויקט\ים: %s ימחקו גם כן.'
label_and_its_subprojects: %s and its subprojects label_and_its_subprojects: %s וכל תת הפרויקטים שלו
mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:" mail_body_reminder: "%d נושאים שמיועדים אליך מיועדים להגשה בתוך %d ימים:"
mail_subject_reminder: "%d issue(s) due in the next days" mail_subject_reminder: "%d נושאים מיעדים להגשה בימים הקרובים"
text_user_wrote: '%s wrote:' text_user_wrote: '%s כתב:'
label_duplicated_by: duplicated by label_duplicated_by: שוכפל ע"י
setting_enabled_scm: Enabled SCM setting_enabled_scm: אפשר SCM
text_enumeration_category_reassign_to: 'Reassign them to this value:' text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:'
text_enumeration_destroy_question: '%d objects are assigned to this value.' text_enumeration_destroy_question: '%d אוביקטים מוצבים לערך זה.'
label_incoming_emails: Incoming emails label_incoming_emails: דוא"ל נכנס
label_generate_key: Generate a key label_generate_key: יצר מפתח
setting_mail_handler_api_enabled: Enable WS for incoming emails setting_mail_handler_api_enabled: Enable WS for incoming emails
setting_mail_handler_api_key: API key setting_mail_handler_api_key: מפתח API
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them." text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
field_parent_title: Parent page field_parent_title: דף אב
label_issue_watchers: Watchers label_issue_watchers: צופים
setting_commit_logs_encoding: Commit messages encoding setting_commit_logs_encoding: Commit messages encoding
button_quote: Quote button_quote: צטט
setting_sequential_project_identifiers: Generate sequential project identifiers setting_sequential_project_identifiers: Generate sequential project identifiers
notice_unable_delete_version: Unable to delete version notice_unable_delete_version: לא ניתן למחוק גירסא
label_renamed: renamed label_renamed: השם שונה
label_copied: copied label_copied: הועתק
setting_plain_text_mail: plain text only (no HTML) setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML)
permission_view_files: View files permission_view_files: צפה בקבצים
permission_edit_issues: Edit issues permission_edit_issues: ערוך נושאים
permission_edit_own_time_entries: Edit own time logs permission_edit_own_time_entries: ערוך את לוג הזמן של עצמך
permission_manage_public_queries: Manage public queries permission_manage_public_queries: נהל שאילתות פומביות
permission_add_issues: Add issues permission_add_issues: הוסף נושא
permission_log_time: Log spent time permission_log_time: תעד זמן שבוזבז
permission_view_changesets: View changesets permission_view_changesets: צפה בקבוצות שינויים
permission_view_time_entries: View spent time permission_view_time_entries: צפה בזמן שבוזבז
permission_manage_versions: Manage versions permission_manage_versions: נהל גירסאות
permission_manage_wiki: Manage wiki permission_manage_wiki: נהל wiki
permission_manage_categories: Manage issue categories permission_manage_categories: נהל קטגוריות נושאים
permission_protect_wiki_pages: Protect wiki pages permission_protect_wiki_pages: הגן כל דפי wiki
permission_comment_news: Comment news permission_comment_news: הגב על החדשות
permission_delete_messages: Delete messages permission_delete_messages: מחק הודעות
permission_select_project_modules: Select project modules permission_select_project_modules: בחר מודולי פרויקט
permission_manage_documents: Manage documents permission_manage_documents: נהל מסמכים
permission_edit_wiki_pages: Edit wiki pages permission_edit_wiki_pages: ערוך דפי wiki
permission_add_issue_watchers: Add watchers permission_add_issue_watchers: הוסף צופים
permission_view_gantt: View gantt chart permission_view_gantt: צפה בגאנט
permission_move_issues: Move issues permission_move_issues: הזז נושאים
permission_manage_issue_relations: Manage issue relations permission_manage_issue_relations: נהל יחס בין נושאים
permission_delete_wiki_pages: Delete wiki pages permission_delete_wiki_pages: מחק דפי wiki
permission_manage_boards: Manage boards permission_manage_boards: נהל לוחות
permission_delete_wiki_pages_attachments: Delete attachments permission_delete_wiki_pages_attachments: מחק דבוקות
permission_view_wiki_edits: View wiki history permission_view_wiki_edits: צפה בהיסטורית wiki
permission_add_messages: Post messages permission_add_messages: הצב הודעות
permission_view_messages: View messages permission_view_messages: צפה בהודעות
permission_manage_files: Manage files permission_manage_files: נהל קבצים
permission_edit_issue_notes: Edit notes permission_edit_issue_notes: ערוך רשימות
permission_manage_news: Manage news permission_manage_news: נהל חדשות
permission_view_calendar: View calendrier permission_view_calendar: צפה בלוח השנה
permission_manage_members: Manage members permission_manage_members: נהל חברים
permission_edit_messages: Edit messages permission_edit_messages: ערוך הודעות
permission_delete_issues: Delete issues permission_delete_issues: מחק נושאים
permission_view_issue_watchers: View watchers list permission_view_issue_watchers: צפה ברשימה צופים
permission_manage_repository: Manage repository permission_manage_repository: נהל מאגר
permission_commit_access: Commit access permission_commit_access: Commit access
permission_browse_repository: Browse repository permission_browse_repository: סייר במאגר
permission_view_documents: View documents permission_view_documents: צפה במסמכים
permission_edit_project: Edit project permission_edit_project: ערוך פרויקט
permission_add_issue_notes: Add notes permission_add_issue_notes: Add notes
permission_save_queries: Save queries permission_save_queries: שמור שאילתות
permission_view_wiki_pages: View wiki permission_view_wiki_pages: צפה ב-wiki
permission_rename_wiki_pages: Rename wiki pages permission_rename_wiki_pages: שנה שם של דפי wiki
permission_edit_time_entries: Edit time logs permission_edit_time_entries: ערוך רישום זמנים
permission_edit_own_issue_notes: Edit own notes permission_edit_own_issue_notes: Edit own notes
setting_gravatar_enabled: Use Gravatar user icons setting_gravatar_enabled: Use Gravatar user icons
label_example: Example label_example: דוגמא
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
permission_edit_own_messages: Edit own messages permission_edit_own_messages: ערוך הודעות של עצמך
permission_delete_own_messages: Delete own messages permission_delete_own_messages: מחק הודעות של עצמך
label_user_activity: "%s's activity" label_user_activity: "הפעילות של %s"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: עודכן ע"י %s לפני %s
+3 -1
View File
@@ -694,4 +694,6 @@ text_repository_usernames_mapping: "Állítsd be a felhasználó összerendelés
permission_edit_own_messages: Saját üzenetek szerkesztése permission_edit_own_messages: Saját üzenetek szerkesztése
permission_delete_own_messages: Saját üzenetek törlése permission_delete_own_messages: Saját üzenetek törlése
label_user_activity: "%s tevékenységei" label_user_activity: "%s tevékenységei"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: "Módosította %s ennyivel ezelőtt: %s"
text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.'
setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál
+2
View File
@@ -694,3 +694,5 @@ permission_edit_own_messages: Modifica propri messaggi
permission_delete_own_messages: Elimina propri messaggi permission_delete_own_messages: Elimina propri messaggi
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+36 -34
View File
@@ -97,7 +97,7 @@ field_mail: 메일
field_filename: 파일 field_filename: 파일
field_filesize: 크기 field_filesize: 크기
field_downloads: 다운로드 field_downloads: 다운로드
field_author: 보고자 field_author: 저자
field_created_on: 보고시간 field_created_on: 보고시간
field_updated_on: 변경시간 field_updated_on: 변경시간
field_field_format: 포맷 field_field_format: 포맷
@@ -120,18 +120,18 @@ field_subject: 제목
field_due_date: 완료 기한 field_due_date: 완료 기한
field_assigned_to: 담당자 field_assigned_to: 담당자
field_priority: 우선순위 field_priority: 우선순위
field_fixed_version: 목표 버전 field_fixed_version: 목표버전
field_user: 사용자 field_user: 사용자
field_role: 역할 field_role: 역할
field_homepage: 홈페이지 field_homepage: 홈페이지
field_is_public: 공개 field_is_public: 공개
field_parent: 상위 프로젝트 field_parent: 상위 프로젝트
field_is_in_chlog: 변경이력(changelog)에서 보여지는 일감들 field_is_in_chlog: 변경이력(changelog)에서 표시할 일감들
field_is_in_roadmap: 로드맵에서 보여지는 일감들 field_is_in_roadmap: 로드맵에서표시할 일감들
field_login: 로그인 field_login: 로그인
field_mail_notification: 메일 알림 field_mail_notification: 메일 알림
field_admin: 관리자 field_admin: 관리자
field_last_login_on: 최종 접속 field_last_login_on: 마지막 로그인
field_language: 언어 field_language: 언어
field_effective_date: 일자 field_effective_date: 일자
field_password: 비밀번호 field_password: 비밀번호
@@ -188,7 +188,7 @@ setting_commit_ref_keywords: 일감 참조에 사용할 키워드들
setting_commit_fix_keywords: 일감 해결에 사용할 키워드들 setting_commit_fix_keywords: 일감 해결에 사용할 키워드들
setting_autologin: 자동 로그인 setting_autologin: 자동 로그인
setting_date_format: 날짜 형식 setting_date_format: 날짜 형식
setting_cross_project_issue_relations: 프로젝트간 일감에 관련을 맺는 것을 허용 setting_cross_project_issue_relations: 프로젝트간 일감에 관계을 맺는 것을 허용
setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들 setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들
setting_repositories_encodings: 저장소 인코딩 setting_repositories_encodings: 저장소 인코딩
setting_emails_footer: 메일 꼬리 setting_emails_footer: 메일 꼬리
@@ -201,9 +201,9 @@ label_project_new: 새 프로젝트
label_project_plural: 프로젝트 label_project_plural: 프로젝트
label_project_all: 모든 프로젝트 label_project_all: 모든 프로젝트
label_project_latest: 최근 프로젝트 label_project_latest: 최근 프로젝트
label_issue: 일감 보기 label_issue: 일감
label_issue_new: 새 일감만들기 label_issue_new: 새 일감만들기
label_issue_plural: 일감 보기 label_issue_plural: 일감
label_issue_view_all: 모든 일감 보기 label_issue_view_all: 모든 일감 보기
label_document: 문서 label_document: 문서
label_document_new: 새 문서 label_document_new: 새 문서
@@ -243,15 +243,15 @@ label_administration: 관리자
label_login: 로그인 label_login: 로그인
label_logout: 로그아웃 label_logout: 로그아웃
label_help: 도움말 label_help: 도움말
label_reported_issues: 보고된 일감 label_reported_issues: 보고한 일감
label_assigned_to_me_issues: 나에게 할당된 일감 label_assigned_to_me_issues: 나에게 할당된 일감
label_last_login: 최종 접속 label_last_login: 최종 접속
label_last_updates: 최종 변경 내역 label_last_updates: 최종 변경 내역
label_last_updates_plural: 최종변경 %d label_last_updates_plural: 최종변경 %d
label_registered_on: 등록시각 label_registered_on: 등록시각
label_activity: 진행중인 작업 label_activity: 작업내역
label_new: 신규 label_new: 새로 만들기
label_logged_as: ▶ label_logged_as: '로그인계정:'
label_environment: 환경 label_environment: 환경
label_authentication: 인증설정 label_authentication: 인증설정
label_auth_source: 인증 모드 label_auth_source: 인증 모드
@@ -280,7 +280,7 @@ label_attachment_plural: 관련파일
label_report: 보고서 label_report: 보고서
label_report_plural: 보고서 label_report_plural: 보고서
label_news: 뉴스 label_news: 뉴스
label_news_new: 뉴스추가 label_news_new: 새 뉴스
label_news_plural: 뉴스 label_news_plural: 뉴스
label_news_latest: 최근 뉴스 label_news_latest: 최근 뉴스
label_news_view_all: 모든 뉴스 label_news_view_all: 모든 뉴스
@@ -298,7 +298,7 @@ label_open_issues: 진행중
label_open_issues_plural: 진행중 label_open_issues_plural: 진행중
label_closed_issues: 완료됨 label_closed_issues: 완료됨
label_closed_issues_plural: 완료됨 label_closed_issues_plural: 완료됨
label_total: Total label_total: 합계
label_permissions: 허가권한 label_permissions: 허가권한
label_current_status: 일감 상태 label_current_status: 일감 상태
label_new_statuses_allowed: 허용되는 일감 상태 label_new_statuses_allowed: 허용되는 일감 상태
@@ -307,7 +307,7 @@ label_none: 없음
label_next: 다음 label_next: 다음
label_previous: 이전 label_previous: 이전
label_used_by: 사용됨 label_used_by: 사용됨
label_details: 상세 label_details: 자세히
label_add_note: 일감덧글 추가 label_add_note: 일감덧글 추가
label_per_page: 페이지별 label_per_page: 페이지별
label_calendar: 달력 label_calendar: 달력
@@ -316,7 +316,7 @@ label_gantt: Gantt 챠트
label_internal: 내부 label_internal: 내부
label_last_changes: 지난 변경사항 %d 건 label_last_changes: 지난 변경사항 %d 건
label_change_view_all: 모든 변경 내역 보기 label_change_view_all: 모든 변경 내역 보기
label_personalize_page: 입맛대로 구성하기(Drag & Drop) label_personalize_page: 입맛대로 구성하기
label_comment: 댓글 label_comment: 댓글
label_comment_plural: 댓글 label_comment_plural: 댓글
label_comment_add: 댓글 추가 label_comment_add: 댓글 추가
@@ -353,7 +353,7 @@ label_latest_revision: 최근 개정판
label_latest_revision_plural: 최근 개정판 label_latest_revision_plural: 최근 개정판
label_view_revisions: 개정판 보기 label_view_revisions: 개정판 보기
label_max_size: 최대 크기 label_max_size: 최대 크기
label_on: 'on' label_on: '전체: '
label_sort_highest: 최상단으로 label_sort_highest: 최상단으로
label_sort_higher: 위로 label_sort_higher: 위로
label_sort_lower: 아래로 label_sort_lower: 아래로
@@ -361,7 +361,7 @@ label_sort_lowest: 최하단으로
label_roadmap: 로드맵 label_roadmap: 로드맵
label_roadmap_due_in: 기한 %s label_roadmap_due_in: 기한 %s
label_roadmap_overdue: %s 지연 label_roadmap_overdue: %s 지연
label_roadmap_no_issues: 이버전에 해당하는 일감 없음 label_roadmap_no_issues: 이 버전에 해당하는 일감 없음
label_search: 검색 label_search: 검색
label_result_plural: 결과 label_result_plural: 결과
label_all_words: 모든 단어 label_all_words: 모든 단어
@@ -412,19 +412,19 @@ label_disabled: 비활성화
label_show_completed_versions: 완료된 버전 보기 label_show_completed_versions: 완료된 버전 보기
label_me: 나 label_me: 나
label_board: 게시판 label_board: 게시판
label_board_new: 신규 게시판 label_board_new: 새 게시판
label_board_plural: 게시판 label_board_plural: 게시판
label_topic_plural: 주제 label_topic_plural: 주제
label_message_plural: 관련글 label_message_plural: 관련글
label_message_last: 최종 글 label_message_last: 마지막 글
label_message_new: 새글쓰기 label_message_new: 새글쓰기
label_reply_plural: 답글 label_reply_plural: 답글
label_send_information: 사용자에게 계정정보를 보냄 label_send_information: 사용자에게 계정정보를 보냄
label_year: 년 label_year: 년
label_month: 월 label_month: 월
label_week: 주 label_week: 주
label_date_from: 에서 label_date_from: '기간:'
label_date_to: (으)로 label_date_to: ' ~ '
label_language_based: 언어설정에 따름 label_language_based: 언어설정에 따름
label_sort_by: 정렬방법(%s) label_sort_by: 정렬방법(%s)
label_send_test_email: 테스트 메일 보내기 label_send_test_email: 테스트 메일 보내기
@@ -533,7 +533,7 @@ default_activity_development: 개발
enumeration_issue_priorities: 일감 우선순위 enumeration_issue_priorities: 일감 우선순위
enumeration_doc_categories: 문서 카테고리 enumeration_doc_categories: 문서 카테고리
enumeration_activities: 진행활동(시간 추적) enumeration_activities: 작업분류(시간추적)
button_copy: 복사 button_copy: 복사
mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다. mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다.
button_change_password: 비밀번호 변경 button_change_password: 비밀번호 변경
@@ -555,7 +555,7 @@ button_annotate: 주석달기(annotate)
label_issues_by: 일감분류 방식 %s label_issues_by: 일감분류 방식 %s
field_searchable: 검색가능 field_searchable: 검색가능
label_display_per_page: '페이지당: %s' label_display_per_page: '페이지당: %s'
setting_per_page_options: 페이지당 표시할 객채 수 setting_per_page_options: 페이지당 표시할 객체 수
label_age: 마지막 수정일 label_age: 마지막 수정일
notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다. notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다.
text_load_default_configuration: 기본 설정을 로딩하기 text_load_default_configuration: 기본 설정을 로딩하기
@@ -585,20 +585,20 @@ project_module_files: 관련파일
project_module_documents: 문서 project_module_documents: 문서
project_module_repository: 저장소 project_module_repository: 저장소
project_module_news: 뉴스 project_module_news: 뉴스
project_module_time_tracking: 진행중인 작업 project_module_time_tracking: 시간추적
text_file_repository_writable: 파일 저장소 쓰기 가능 text_file_repository_writable: 파일 저장소 쓰기 가능
text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다. text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다.
text_rmagick_available: RMagick available (optional) text_rmagick_available: RMagick 사용가능(옵션)
button_configure: 설정 button_configure: 설정
label_plugins: 플러그인 label_plugins: 플러그인
label_ldap_authentication: LDAP 인증 label_ldap_authentication: LDAP 인증
label_downloads_abbr: D/L label_downloads_abbr: D/L
label_add_another_file: 다른 파일 추가 label_add_another_file: 다른 파일 추가
label_this_month: 이번 달 label_this_month: 이번 달
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ? text_destroy_time_entries_question: 삭제하려는 일감에 %.02f 시간이 보고되어 있습니다. 어떻게 하시겠습니까?
label_last_n_days: 지난 %d 일 label_last_n_days: 지난 %d 일
label_all_time: 모든 시간 label_all_time: 모든 시간
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' error_issue_not_found_in_project: '일감이 없거나 이 프로젝트의 것이 아닙니다.'
label_this_year: 올해 label_this_year: 올해
text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기 text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기
label_date_range: 날짜 범위 label_date_range: 날짜 범위
@@ -608,15 +608,15 @@ label_optional_description: 부가적인 설명
label_last_month: 지난 달 label_last_month: 지난 달
text_destroy_time_entries: 보고된 시간을 삭제하기 text_destroy_time_entries: 보고된 시간을 삭제하기
text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:' text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:'
setting_activity_days_default: 프로젝트 활동에 보여질 날수 setting_activity_days_default: 프로젝트 작업내역에 보여줄 날수
label_chronological_order: 시간 순으로 정렬 label_chronological_order: 시간 순으로 정렬
field_comments_sorting: 히스토리 정렬 설정 field_comments_sorting: 히스토리 정렬 설정
label_reverse_chronological_order: 시간 역순으로 정렬 label_reverse_chronological_order: 시간 역순으로 정렬
label_preferences: Preferences label_preferences: 설정
setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시 setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시
label_overall_activity: 전체 진행 상황 label_overall_activity: 전체 작업내역
setting_default_projects_public: 새 프로젝트를 공개로 설정 setting_default_projects_public: 새 프로젝트를 공개로 설정
error_scm_annotate: "The entry does not exist or can not be annotated." error_scm_annotate: "항목이 없거나 주석을 달 수 없습니다."
label_planning: 프로젝트계획(Planning) label_planning: 프로젝트계획(Planning)
text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.' text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.'
label_and_its_subprojects: %s와 서브프로젝트들 label_and_its_subprojects: %s와 서브프로젝트들
@@ -692,5 +692,7 @@ label_example: 예
text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다." text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다."
permission_edit_own_messages: 자기 메시지 편집 permission_edit_own_messages: 자기 메시지 편집
permission_delete_own_messages: 자기 메시지 삭제 permission_delete_own_messages: 자기 메시지 삭제
label_user_activity: "%s의 활동" label_user_activity: "%s의 작업내역"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: %s가 %s 전에 변경
text_diff_truncated: '... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.'
setting_diff_max_lines_displayed: 차이점보기에 표시할 최대 줄수
+569 -567
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+4 -2
View File
@@ -632,7 +632,7 @@ setting_autofetch_changesets: Automatyczne pobieranie zmian
setting_autologin: Auto logowanie setting_autologin: Auto logowanie
setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc) setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc)
setting_commit_fix_keywords: Słowa zmieniające status setting_commit_fix_keywords: Słowa zmieniające status
setting_commit_logs_encoding: Zatwierdź kodowanie wiadomości setting_commit_logs_encoding: Kodowanie komentarzy zatwierdzeń
setting_commit_ref_keywords: Słowa tworzące powiązania setting_commit_ref_keywords: Słowa tworzące powiązania
setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami
setting_date_format: Format daty setting_date_format: Format daty
@@ -712,4 +712,6 @@ text_wiki_destroy_confirmation: Jesteś pewien, że chcesz usunąć to wiki i ca
text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu
label_user_activity: "Aktywność: %s" label_user_activity: "Aktywność: %s"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Uaktualnione przez %s %s temu
text_diff_truncated: '... Ten plik różnic został przycięty ponieważ jest zbyt długi.'
setting_diff_max_lines_displayed: Maksymalna liczba linii różnicy do pokazania
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Editar próprias mensagens
permission_delete_own_messages: Excluir próprias mensagens permission_delete_own_messages: Excluir próprias mensagens
label_user_activity: "Atividade de %s" label_user_activity: "Atividade de %s"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+64 -62
View File
@@ -104,8 +104,8 @@ field_name: Nome
field_description: Descrição field_description: Descrição
field_summary: Sumário field_summary: Sumário
field_is_required: Obrigatório field_is_required: Obrigatório
field_firstname: Nome próprio field_firstname: Nome
field_lastname: Último nome field_lastname: Apelido
field_mail: E-mail field_mail: E-mail
field_filename: Ficheiro field_filename: Ficheiro
field_filesize: Tamanho field_filesize: Tamanho
@@ -141,7 +141,7 @@ field_is_public: Público
field_parent: Sub-projecto de field_parent: Sub-projecto de
field_is_in_chlog: Tarefas mostradas no changelog field_is_in_chlog: Tarefas mostradas no changelog
field_is_in_roadmap: Tarefas mostradas no roadmap field_is_in_roadmap: Tarefas mostradas no roadmap
field_login: Login field_login: Nome de utilizador
field_mail_notification: Notificações por e-mail field_mail_notification: Notificações por e-mail
field_admin: Administrador field_admin: Administrador
field_last_login_on: Última visita field_last_login_on: Última visita
@@ -224,7 +224,7 @@ setting_mail_handler_api_key: Chave da API
setting_sequential_project_identifiers: Gerar identificadores de projecto sequênciais setting_sequential_project_identifiers: Gerar identificadores de projecto sequênciais
project_module_issue_tracking: Tarefas project_module_issue_tracking: Tarefas
project_module_time_tracking: Contagem de tempo project_module_time_tracking: Registo de tempo
project_module_news: Notícias project_module_news: Notícias
project_module_documents: Documentos project_module_documents: Documentos
project_module_files: Ficheiros project_module_files: Ficheiros
@@ -440,7 +440,7 @@ label_issue_tracking: Tarefas
label_spent_time: Tempo gasto label_spent_time: Tempo gasto
label_f_hour: %.2f hora label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas label_f_hour_plural: %.2f horas
label_time_tracking: Contagem de tempo label_time_tracking: Registo de tempo
label_change_plural: Mudanças label_change_plural: Mudanças
label_statistics: Estatísticas label_statistics: Estatísticas
label_commits_per_month: Commits por mês label_commits_per_month: Commits por mês
@@ -551,7 +551,7 @@ button_move: Mover
button_back: Voltar button_back: Voltar
button_cancel: Cancelar button_cancel: Cancelar
button_activate: Activar button_activate: Activar
button_sort: Ordernar button_sort: Ordenar
button_log_time: Tempo de trabalho button_log_time: Tempo de trabalho
button_rollback: Voltar para esta versão button_rollback: Voltar para esta versão
button_watch: Observar button_watch: Observar
@@ -588,7 +588,7 @@ text_tip_task_begin_end_day: tarefa a começar e acabar neste dia
text_project_identifier_info: 'Apenas são permitidos letras minúsculas (a-z), números e hífens.<br />Uma vez guardado, o identificador não poderá ser alterado.' text_project_identifier_info: 'Apenas são permitidos letras minúsculas (a-z), números e hífens.<br />Uma vez guardado, o identificador não poderá ser alterado.'
text_caracters_maximum: máximo %d caracteres. text_caracters_maximum: máximo %d caracteres.
text_caracters_minimum: Deve ter pelo menos %d caracteres. text_caracters_minimum: Deve ter pelo menos %d caracteres.
text_length_between: Deve ter entre %d and %d caracteres. text_length_between: Deve ter entre %d e %d caracteres.
text_tracker_no_workflow: Sem workflow definido para este tipo de tarefa. text_tracker_no_workflow: Sem workflow definido para este tipo de tarefa.
text_unallowed_characters: Caracteres não permitidos text_unallowed_characters: Caracteres não permitidos
text_comma_separated: Permitidos múltiplos valores (separados por vírgula). text_comma_separated: Permitidos múltiplos valores (separados por vírgula).
@@ -641,58 +641,60 @@ default_activity_development: Desenvolvimento
enumeration_issue_priorities: Prioridade de tarefas enumeration_issue_priorities: Prioridade de tarefas
enumeration_doc_categories: Categorias de documentos enumeration_doc_categories: Categorias de documentos
enumeration_activities: Actividades (Contagem de tempo) enumeration_activities: Actividades (Registo de tempo)
setting_plain_text_mail: plain text only (no HTML) setting_plain_text_mail: Apenas texto simples (sem HTML)
permission_view_files: View files permission_view_files: Ver ficheiros
permission_edit_issues: Edit issues permission_edit_issues: Editar tarefas
permission_edit_own_time_entries: Edit own time logs permission_edit_own_time_entries: Editar horas pessoais
permission_manage_public_queries: Manage public queries permission_manage_public_queries: Gerir queries públicas
permission_add_issues: Add issues permission_add_issues: Adicionar tarefas
permission_log_time: Log spent time permission_log_time: Registar tempo gasto
permission_view_changesets: View changesets permission_view_changesets: Ver changesets
permission_view_time_entries: View spent time permission_view_time_entries: Ver tempo gasto
permission_manage_versions: Manage versions permission_manage_versions: Gerir versões
permission_manage_wiki: Manage wiki permission_manage_wiki: Gerir wiki
permission_manage_categories: Manage issue categories permission_manage_categories: Gerir categorias de tarefas
permission_protect_wiki_pages: Protect wiki pages permission_protect_wiki_pages: Proteger páginas de wiki
permission_comment_news: Comment news permission_comment_news: Comentar notícias
permission_delete_messages: Delete messages permission_delete_messages: Apagar mensagens
permission_select_project_modules: Select project modules permission_select_project_modules: Seleccionar módulos do projecto
permission_manage_documents: Manage documents permission_manage_documents: Gerir documentos
permission_edit_wiki_pages: Edit wiki pages permission_edit_wiki_pages: Editar páginas de wiki
permission_add_issue_watchers: Add watchers permission_add_issue_watchers: Adicionar observadores
permission_view_gantt: View gantt chart permission_view_gantt: ver diagrama de Gantt
permission_move_issues: Move issues permission_move_issues: Mover tarefas
permission_manage_issue_relations: Manage issue relations permission_manage_issue_relations: Gerir relações de tarefas
permission_delete_wiki_pages: Delete wiki pages permission_delete_wiki_pages: Apagar páginas de wiki
permission_manage_boards: Manage boards permission_manage_boards: Gerir forums
permission_delete_wiki_pages_attachments: Delete attachments permission_delete_wiki_pages_attachments: Apagar anexos
permission_view_wiki_edits: View wiki history permission_view_wiki_edits: Ver histórico da wiki
permission_add_messages: Post messages permission_add_messages: Submeter mensagens
permission_view_messages: View messages permission_view_messages: Ver mensagens
permission_manage_files: Manage files permission_manage_files: Gerir ficheiros
permission_edit_issue_notes: Edit notes permission_edit_issue_notes: Editar notas de tarefas
permission_manage_news: Manage news permission_manage_news: Gerir notícias
permission_view_calendar: View calendrier permission_view_calendar: Ver calendário
permission_manage_members: Manage members permission_manage_members: Gerir membros
permission_edit_messages: Edit messages permission_edit_messages: Editar mensagens
permission_delete_issues: Delete issues permission_delete_issues: Apagar tarefas
permission_view_issue_watchers: View watchers list permission_view_issue_watchers: Ver lista de observadores
permission_manage_repository: Manage repository permission_manage_repository: Gerir repositório
permission_commit_access: Commit access permission_commit_access: Acesso a submissão
permission_browse_repository: Browse repository permission_browse_repository: Navegar em repositório
permission_view_documents: View documents permission_view_documents: Ver documentos
permission_edit_project: Edit project permission_edit_project: Editar projecto
permission_add_issue_notes: Add notes permission_add_issue_notes: Adicionar notas a tarefas
permission_save_queries: Save queries permission_save_queries: Guardar queries
permission_view_wiki_pages: View wiki permission_view_wiki_pages: Ver wiki
permission_rename_wiki_pages: Rename wiki pages permission_rename_wiki_pages: Renomear páginas de wiki
permission_edit_time_entries: Edit time logs permission_edit_time_entries: Editar entradas de tempo
permission_edit_own_issue_notes: Edit own notes permission_edit_own_issue_notes: Editar as prórpias notas
setting_gravatar_enabled: Use Gravatar user icons setting_gravatar_enabled: Utilizar icons Gravatar
label_example: Example label_example: Exemplo
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Seleccionar ou actualizar o utilizador de Redmine mapeado a cada nome de utilizador encontrado no repositório.\nUtilizadores com o mesmo nome de utilizador ou email no Redmine e no repositório são mapeados automaticamente."
permission_edit_own_messages: Edit own messages permission_edit_own_messages: Editar as próprias mensagens
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Apagar as próprias mensagens
label_user_activity: "%s's activity" label_user_activity: "Actividade de %s"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Actualizado por %s há %s
text_diff_truncated: '... Este diff foi truncado porque excede o tamanho máximo que pode ser mostrado.'
setting_diff_max_lines_displayed: Número máximo de linhas de diff mostradas
+2
View File
@@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+4 -2
View File
@@ -518,7 +518,8 @@ label_total: Всего
label_tracker_new: Новый трекер label_tracker_new: Новый трекер
label_tracker_plural: Трекеры label_tracker_plural: Трекеры
label_tracker: Трекер label_tracker: Трекер
label_updated_time: Обновлен %s назад label_updated_time: Обновлено %s назад
label_updated_time_by: Обновлено %s %s назад
label_used_by: Используется label_used_by: Используется
label_user_activity: "Активность пользователя %s" label_user_activity: "Активность пользователя %s"
label_user_mail_no_self_notified: "Не извещать об изменениях, которые я сделал сам" label_user_mail_no_self_notified: "Не извещать об изменениях, которые я сделал сам"
@@ -652,6 +653,7 @@ setting_cross_project_issue_relations: Разрешить пересечение
setting_date_format: Формат даты setting_date_format: Формат даты
setting_default_language: Язык по умолчанию setting_default_language: Язык по умолчанию
setting_default_projects_public: Новые проекты являются общедоступными setting_default_projects_public: Новые проекты являются общедоступными
setting_diff_max_lines_displayed: Максимальное число строк для diff
setting_display_subprojects_issues: Отображение подпроектов по умолчанию setting_display_subprojects_issues: Отображение подпроектов по умолчанию
setting_emails_footer: Подстрочные примечания Email setting_emails_footer: Подстрочные примечания Email
setting_enabled_scm: Разрешенные SCM setting_enabled_scm: Разрешенные SCM
@@ -689,6 +691,7 @@ text_comma_separated: Допустимы несколько значений (ч
text_default_administrator_account_changed: Учетная запись администратора по умолчанию изменена text_default_administrator_account_changed: Учетная запись администратора по умолчанию изменена
text_destroy_time_entries_question: Вы собираетесь удалить %.02f часа(ов) прикрепленных за этой задачей. text_destroy_time_entries_question: Вы собираетесь удалить %.02f часа(ов) прикрепленных за этой задачей.
text_destroy_time_entries: Удалить зарегистрированное время text_destroy_time_entries: Удалить зарегистрированное время
text_diff_truncated: '... Этот diff ограничен, так как превышает максимальный отображаемый размер.'
text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/email.yml. Для применения изменений перезапустите приложение." text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/email.yml. Для применения изменений перезапустите приложение."
text_enumeration_category_reassign_to: 'Назначить им следующее значение:' text_enumeration_category_reassign_to: 'Назначить им следующее значение:'
text_enumeration_destroy_question: '%d объект(а,ов) связаны с этим значением.' text_enumeration_destroy_question: '%d объект(а,ов) связаны с этим значением.'
@@ -727,4 +730,3 @@ text_user_wrote: '%s написал(а):'
text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое? text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое?
text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
label_updated_time_by: Updated by %s %s ago
+2
View File
@@ -700,3 +700,5 @@ permission_delete_own_messages: Delete own messages
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_delete_own_messages: Delete own messages
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+389 -387
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -697,3 +697,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+2
View File
@@ -697,3 +697,5 @@ text_repository_usernames_mapping: "Chọn hoặc cập nhật ánh xạ ngườ
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity" label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago label_updated_time_by: Updated by %s %s ago
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
+3 -1
View File
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 啟用處理傳入電子郵件的服務
setting_mail_handler_api_key: API 金鑰 setting_mail_handler_api_key: API 金鑰
setting_sequential_project_identifiers: 循序產生專案識別碼 setting_sequential_project_identifiers: 循序產生專案識別碼
setting_gravatar_enabled: 啟用 Gravatar 全球認證大頭像 setting_gravatar_enabled: 啟用 Gravatar 全球認證大頭像
setting_diff_max_lines_displayed: 差異顯示行數之最大值
permission_edit_project: 編輯專案 permission_edit_project: 編輯專案
permission_select_project_modules: 選擇專案模組 permission_select_project_modules: 選擇專案模組
@@ -556,7 +557,7 @@ label_theme: 畫面主題
label_default: 預設 label_default: 預設
label_search_titles_only: 僅搜尋標題 label_search_titles_only: 僅搜尋標題
label_user_mail_option_all: "提醒與我的專案有關的所有事件" label_user_mail_option_all: "提醒與我的專案有關的所有事件"
label_user_mail_option_selected: "只停醒我所選擇專案中的事件..." label_user_mail_option_selected: "只提醒我所選擇專案中的事件..."
label_user_mail_option_none: "只提醒我觀察中或參與中的事件" label_user_mail_option_none: "只提醒我觀察中或參與中的事件"
label_user_mail_no_self_notified: "不提醒我自己所做的變更" label_user_mail_no_self_notified: "不提醒我自己所做的變更"
label_registration_activation_by_email: 透過電子郵件啟用帳戶 label_registration_activation_by_email: 透過電子郵件啟用帳戶
@@ -670,6 +671,7 @@ text_enumeration_destroy_question: '目前有 %d 個物件使用此列舉值。'
text_enumeration_category_reassign_to: '重新設定其列舉值為:' text_enumeration_category_reassign_to: '重新設定其列舉值為:'
text_email_delivery_not_configured: "您尚未設定電子郵件傳送方式,因此提醒選項已被停用。\n請在 config/email.yml 中設定 SMTP 之後,重新啟動 Redmine,以啟用電子郵件提醒選項。" text_email_delivery_not_configured: "您尚未設定電子郵件傳送方式,因此提醒選項已被停用。\n請在 config/email.yml 中設定 SMTP 之後,重新啟動 Redmine,以啟用電子郵件提醒選項。"
text_repository_usernames_mapping: "選擇或更新 Redmine 使用者與版本庫使用者之對應關係。\n版本庫中之使用者帳號或電子郵件信箱,與 Redmine 設定相同者,將自動產生對應關係。" text_repository_usernames_mapping: "選擇或更新 Redmine 使用者與版本庫使用者之對應關係。\n版本庫中之使用者帳號或電子郵件信箱,與 Redmine 設定相同者,將自動產生對應關係。"
text_diff_truncated: '... 這份差異已被截短以符合顯示行數之最大值'
default_role_manager: 管理人員 default_role_manager: 管理人員
default_role_developper: 開發人員 default_role_developper: 開發人員
+4 -2
View File
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 启用用于接收邮件的服务
setting_mail_handler_api_key: API key setting_mail_handler_api_key: API key
setting_sequential_project_identifiers: 顺序产生项目标识 setting_sequential_project_identifiers: 顺序产生项目标识
setting_gravatar_enabled: 使用Gravatar用户头像 setting_gravatar_enabled: 使用Gravatar用户头像
setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数
permission_edit_project: 编辑项目 permission_edit_project: 编辑项目
permission_select_project_modules: 选择项目模块 permission_select_project_modules: 选择项目模块
@@ -544,7 +545,8 @@ label_send_test_email: 发送测试邮件
label_feeds_access_key_created_on: RSS 存取键是在 %s 之前建立的 label_feeds_access_key_created_on: RSS 存取键是在 %s 之前建立的
label_module_plural: 模块 label_module_plural: 模块
label_added_time_by: 由 %s 在 %s 之前添加 label_added_time_by: 由 %s 在 %s 之前添加
label_updated_time: 更新于 %s 前 label_updated_time: 更新于 %s 之前
label_updated_time_by: 由 %s 更新于 %s 之前
label_jump_to_a_project: 选择一个项目... label_jump_to_a_project: 选择一个项目...
label_file_plural: 文件 label_file_plural: 文件
label_changeset_plural: 变更 label_changeset_plural: 变更
@@ -669,6 +671,7 @@ text_enumeration_category_reassign_to: '将它们关联到新的枚举值:'
text_enumeration_destroy_question: '%d 个对象被关联到了这个枚举值。' text_enumeration_destroy_question: '%d 个对象被关联到了这个枚举值。'
text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/email.yml中配置您的SMTP服务器信息并重新启动以使其生效。" text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/email.yml中配置您的SMTP服务器信息并重新启动以使其生效。"
text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Redmine用户。\n版本库中与Redmine中的同名用户将被自动对应。" text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Redmine用户。\n版本库中与Redmine中的同名用户将被自动对应。"
text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断'
default_role_manager: 管理人员 default_role_manager: 管理人员
default_role_developper: 开发人员 default_role_developper: 开发人员
@@ -695,4 +698,3 @@ default_activity_development: 开发
enumeration_issue_priorities: 问题优先级 enumeration_issue_priorities: 问题优先级
enumeration_doc_categories: 文档类别 enumeration_doc_categories: 文档类别
enumeration_activities: 活动(时间跟踪) enumeration_activities: 活动(时间跟踪)
label_updated_time_by: Updated by %s %s ago
+16 -10
View File
@@ -382,14 +382,14 @@ class RedCloth3 < String
(#{rcq}) (#{rcq})
(#{C}) (#{C})
(?::(\S+?))? (?::(\S+?))?
([^\s\-].*?[^\s\-]|\w) (\w|[^\s\-].*?[^\s\-])
#{rcq} #{rcq}
(?=[[:punct:]]|\s|\)|$)/x (?=[[:punct:]]|\s|\)|$)/x
else else
/(#{rcq}) /(#{rcq})
(#{C}) (#{C})
(?::(\S+))? (?::(\S+))?
([^\s\-].*?[^\s\-]|\w) (\w|[^\s\-].*?[^\s\-])
#{rcq}/xm #{rcq}/xm
end end
[rc, ht, re, rtype] [rc, ht, re, rtype]
@@ -408,7 +408,7 @@ class RedCloth3 < String
# [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '&#8221;' ], # double closing # [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '&#8221;' ], # double closing
# [ /"/, '&#8220;' ], # double opening # [ /"/, '&#8220;' ], # double opening
# [ /\b( )?\.{3}/, '\1&#8230;' ], # ellipsis # [ /\b( )?\.{3}/, '\1&#8230;' ], # ellipsis
[ /\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/, '<acronym title="\2">\1</acronym>' ], # 3+ uppercase acronym # [ /\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/, '<acronym title="\2">\1</acronym>' ], # 3+ uppercase acronym
# [ /(^|[^"][>\s])([A-Z][A-Z0-9 ]+[A-Z0-9])([^<A-Za-z0-9]|$)/, '\1<span class="caps">\2</span>\3', :no_span_caps ], # 3+ uppercase caps # [ /(^|[^"][>\s])([A-Z][A-Z0-9 ]+[A-Z0-9])([^<A-Za-z0-9]|$)/, '\1<span class="caps">\2</span>\3', :no_span_caps ], # 3+ uppercase caps
# [ /(\.\s)?\s?--\s?/, '\1&#8212;' ], # em dash # [ /(\.\s)?\s?--\s?/, '\1&#8212;' ], # em dash
# [ /\s->\s/, ' &rarr; ' ], # right arrow # [ /\s->\s/, ' &rarr; ' ], # right arrow
@@ -435,19 +435,25 @@ class RedCloth3 < String
# #
# Flexible HTML escaping # Flexible HTML escaping
# #
def htmlesc( str, mode ) def htmlesc( str, mode=:Quotes )
if str
str.gsub!( '&', '&amp;' ) str.gsub!( '&', '&amp;' )
str.gsub!( '"', '&quot;' ) if mode != :NoQuotes str.gsub!( '"', '&quot;' ) if mode != :NoQuotes
str.gsub!( "'", '&#039;' ) if mode == :Quotes str.gsub!( "'", '&#039;' ) if mode == :Quotes
str.gsub!( '<', '&lt;') str.gsub!( '<', '&lt;')
str.gsub!( '>', '&gt;') str.gsub!( '>', '&gt;')
end
str
end end
# Search and replace for Textile glyphs (quotes, dashes, other symbols) # Search and replace for Textile glyphs (quotes, dashes, other symbols)
def pgl( text ) def pgl( text )
GLYPHS.each do |re, resub, tog| #GLYPHS.each do |re, resub, tog|
next if tog and method( tog ).call # next if tog and method( tog ).call
text.gsub! re, resub # text.gsub! re, resub
#end
text.gsub!(/\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/) do |m|
"<acronym title=\"#{htmlesc $2}\">#{$1}</acronym>"
end end
end end
@@ -464,8 +470,7 @@ class RedCloth3 < String
style << "vertical-align:#{ v_align( $& ) };" if text =~ A_VLGN style << "vertical-align:#{ v_align( $& ) };" if text =~ A_VLGN
end end
style << "#{ $1 };" if not filter_styles and style << "#{ htmlesc $1 };" if text.sub!( /\{([^}]*)\}/, '' ) && !filter_styles
text.sub!( /\{([^}]*)\}/, '' )
lang = $1 if lang = $1 if
text.sub!( /\[([^)]+?)\]/, '' ) text.sub!( /\[([^)]+?)\]/, '' )
@@ -807,7 +812,7 @@ class RedCloth3 < String
end end
atts = pba( atts ) atts = pba( atts )
atts = " href=\"#{ url }#{ slash }\"#{ atts }" atts = " href=\"#{ url }#{ slash }\"#{ atts }"
atts << " title=\"#{ title }\"" if title atts << " title=\"#{ htmlesc title }\"" if title
atts = shelve( atts ) if atts atts = shelve( atts ) if atts
external = (url =~ /^https?:\/\//) ? ' class="external"' : '' external = (url =~ /^https?:\/\//) ? ' class="external"' : ''
@@ -914,6 +919,7 @@ class RedCloth3 < String
def inline_textile_image( text ) def inline_textile_image( text )
text.gsub!( IMAGE_RE ) do |m| text.gsub!( IMAGE_RE ) do |m|
stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8] stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8]
htmlesc title
atts = pba( atts ) atts = pba( atts )
atts = " src=\"#{ url }\"#{ atts }" atts = " src=\"#{ url }\"#{ atts }"
atts << " title=\"#{ title }\"" if title atts << " title=\"#{ title }\"" if title
+1 -1
View File
@@ -63,7 +63,7 @@ module Redmine
logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'" logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'"
path_with_project="#{url}#{with_leading_slash(path)}" path_with_project="#{url}#{with_leading_slash(path)}"
entries = Entries.new entries = Entries.new
cmd = "#{CVS_BIN} -d #{root_url} rls -ed" cmd = "#{CVS_BIN} -d #{root_url} rls -e"
cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
cmd << " #{shell_quote path_with_project}" cmd << " #{shell_quote path_with_project}"
shellout(cmd) do |io| shellout(cmd) do |io|
+16 -4
View File
@@ -18,18 +18,30 @@
module Redmine module Redmine
# Class used to parse unified diffs # Class used to parse unified diffs
class UnifiedDiff < Array class UnifiedDiff < Array
def initialize(diff, type="inline") def initialize(diff, options={})
diff_table = DiffTable.new type options.assert_valid_keys(:type, :max_lines)
diff_type = options[:type] || 'inline'
lines = 0
@truncated = false
diff_table = DiffTable.new(diff_type)
diff.each do |line| diff.each do |line|
if line =~ /^(---|\+\+\+) (.*)$/ if line =~ /^(---|\+\+\+) (.*)$/
self << diff_table if diff_table.length > 1 self << diff_table if diff_table.length > 1
diff_table = DiffTable.new type diff_table = DiffTable.new(diff_type)
end
diff_table.add_line line
lines += 1
if options[:max_lines] && lines > options[:max_lines]
@truncated = true
break
end end
a = diff_table.add_line line
end end
self << diff_table unless diff_table.empty? self << diff_table unless diff_table.empty?
self self
end end
def truncated?; @truncated; end
end end
# Class that represents a file diff # Class that represents a file diff
@@ -30,6 +30,7 @@ module Redmine
super super
self.hard_breaks=true self.hard_breaks=true
self.no_span_caps=true self.no_span_caps=true
self.filter_styles=true
end end
def to_html(*rules, &block) def to_html(*rules, &block)
+14 -14
View File
@@ -79,23 +79,23 @@ Calendar._SMN = new Array
// tooltips // tooltips
Calendar._TT = {}; Calendar._TT = {};
Calendar._TT["INFO"] = "About the calendar"; Calendar._TT["INFO"] = "이 달력은 ... & 도움말";
Calendar._TT["ABOUT"] = Calendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" + "DHTML 날짜/시간 선택기\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + "최신 버전을 구하려면 여기로: http://www.dynarch.com/projects/calendar/\n" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + "배포라이센스:GNU LGPL. 참조:http://gnu.org/licenses/lgpl.html for details." +
"\n\n" + "\n\n" +
"Date selection:\n" + "날짜 선택:\n" +
"- Use the \xab, \xbb buttons to select year\n" + "- 해를 선택하려면 \xab, \xbb 버튼을 사용하세요.\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + "- 달을 선택하려면 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 버튼을 사용하세요.\n" +
"- Hold mouse button on any of the above buttons for faster selection."; "- 좀 더 빠르게 선택하려면 위의 버튼을 꾹 눌러주세요.";
Calendar._TT["ABOUT_TIME"] = "\n\n" + Calendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" + "시간 선택:\n" +
"- Click on any of the time parts to increase it\n" + "- 시, 분을 더하려면 클릭하세요.\n" +
"- or Shift-click to decrease it\n" + "- 시, 분을 빼려면 쉬프트 누르고 클릭하세요.\n" +
"- or click and drag for faster selection."; "- 좀 더 빠르게 선택하려면 클릭하고 드래그하세요.";
Calendar._TT["PREV_YEAR"] = "이전 해"; Calendar._TT["PREV_YEAR"] = "이전 해";
Calendar._TT["PREV_MONTH"] = "이전 달"; Calendar._TT["PREV_MONTH"] = "이전 달";
@@ -117,11 +117,11 @@ Calendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "닫기"; Calendar._TT["CLOSE"] = "닫기";
Calendar._TT["TODAY"] = "오늘"; Calendar._TT["TODAY"] = "오늘";
Calendar._TT["TIME_PART"] = "(Shift-)클릭 or drag to change value"; Calendar._TT["TIME_PART"] = "클릭(+),쉬프트+클릭(-),드래그";
// date formats // date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
Calendar._TT["WK"] = "주"; Calendar._TT["WK"] = "주";
Calendar._TT["TIME"] = "Time:"; Calendar._TT["TIME"] = "시간:";
+1 -1
View File
@@ -48,7 +48,7 @@ ContextMenu.prototype = {
if (window.opera && e.altKey) { return; } if (window.opera && e.altKey) { return; }
if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) { if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {
var tr = Event.findElement(e, 'tr'); var tr = Event.findElement(e, 'tr');
if (tr!=document && tr.hasClassName('hascontextmenu')) { if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) {
// a row was clicked, check if the click was on checkbox // a row was clicked, check if the click was on checkbox
var box = Event.findElement(e, 'input'); var box = Event.findElement(e, 'input');
if (box!=document && box!=undefined) { if (box!=document && box!=undefined) {
@@ -1,16 +1,16 @@
jsToolBar.strings = {}; jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong'; jsToolBar.strings['Strong'] = '굵게';
jsToolBar.strings['Italic'] = 'Italic'; jsToolBar.strings['Italic'] = '기울임';
jsToolBar.strings['Underline'] = 'Underline'; jsToolBar.strings['Underline'] = '밑줄';
jsToolBar.strings['Deleted'] = 'Deleted'; jsToolBar.strings['Deleted'] = '취소선';
jsToolBar.strings['Code'] = 'Inline Code'; jsToolBar.strings['Code'] = '코드';
jsToolBar.strings['Heading 1'] = 'Heading 1'; jsToolBar.strings['Heading 1'] = '제목 1';
jsToolBar.strings['Heading 2'] = 'Heading 2'; jsToolBar.strings['Heading 2'] = '제목 2';
jsToolBar.strings['Heading 3'] = 'Heading 3'; jsToolBar.strings['Heading 3'] = '제목 3';
jsToolBar.strings['Unordered list'] = 'Unordered list'; jsToolBar.strings['Unordered list'] = '글머리 기호';
jsToolBar.strings['Ordered list'] = 'Ordered list'; jsToolBar.strings['Ordered list'] = '번호 매기기';
jsToolBar.strings['Quote'] = 'Quote'; jsToolBar.strings['Quote'] = '인용';
jsToolBar.strings['Unquote'] = 'Remove Quote'; jsToolBar.strings['Unquote'] = '인용 취소';
jsToolBar.strings['Preformatted text'] = 'Preformatted text'; jsToolBar.strings['Preformatted text'] = '있는 그대로 표현 (Preformatted text)';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page'; jsToolBar.strings['Wiki link'] = 'Wiki 페이지에 연결';
jsToolBar.strings['Image'] = 'Image'; jsToolBar.strings['Image'] = '그림';
+3 -2
View File
@@ -55,9 +55,10 @@ h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; bord
#sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; } #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
* html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; } * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
#content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;} #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
* html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;} * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
html>body #content { height: auto; min-height: 600px; overflow: auto; } html>body #content { min-height: 600px; }
* html body #content { height: 600px; } /* IE */
#main.nosidebar #sidebar{ display: none; } #main.nosidebar #sidebar{ display: none; }
#main.nosidebar #content{ width: auto; border-right: 0; } #main.nosidebar #content{ width: auto; border-right: 0; }
+79
View File
@@ -0,0 +1,79 @@
Index: app/views/settings/_general.rhtml
===================================================================
--- app/views/settings/_general.rhtml (revision 2094)
+++ app/views/settings/_general.rhtml (working copy)
@@ -48,6 +48,9 @@
<p><label><%= l(:setting_feeds_limit) %></label>
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
+<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
+<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
+
<p><label><%= l(:setting_gravatar_enabled) %></label>
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
</div>
Index: app/views/common/_diff.rhtml
===================================================================
--- app/views/common/_diff.rhtml (revision 2111)
+++ app/views/common/_diff.rhtml (working copy)
@@ -1,4 +1,5 @@
-<% Redmine::UnifiedDiff.new(diff, :type => diff_type).each do |table_file| -%>
+<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
+<% diff.each do |table_file| -%>
<div class="autoscroll">
<% if diff_type == 'sbs' -%>
<table class="filecontent CodeRay">
@@ -62,3 +63,5 @@
</div>
<% end -%>
+
+<%= l(:text_diff_truncated) if diff.truncated? %>
Index: lang/lt.yml
===================================================================
--- config/settings.yml (revision 2094)
+++ config/settings.yml (working copy)
@@ -61,6 +61,9 @@
feeds_limit:
format: int
default: 15
+diff_max_lines_displayed:
+ format: int
+ default: 1500
enabled_scm:
serialized: true
default:
Index: lib/redmine/unified_diff.rb
===================================================================
--- lib/redmine/unified_diff.rb (revision 2110)
+++ lib/redmine/unified_diff.rb (working copy)
@@ -19,8 +19,11 @@
# Class used to parse unified diffs
class UnifiedDiff < Array
def initialize(diff, options={})
+ options.assert_valid_keys(:type, :max_lines)
diff_type = options[:type] || 'inline'
+ lines = 0
+ @truncated = false
diff_table = DiffTable.new(diff_type)
diff.each do |line|
if line =~ /^(---|\+\+\+) (.*)$/
@@ -28,10 +31,17 @@
diff_table = DiffTable.new(diff_type)
end
diff_table.add_line line
+ lines += 1
+ if options[:max_lines] && lines > options[:max_lines]
+ @truncated = true
+ break
+ end
end
self << diff_table unless diff_table.empty?
self
end
+
+ def truncated?; @truncated; end
end
# Class that represents a file diff
+22
View File
@@ -0,0 +1,22 @@
x-sender: <jsmith@somenet.foo>
x-receiver: <redmine@somenet.foo>
Received: from [127.0.0.1] ([127.0.0.1]) by somenet.foo with Quick 'n Easy Mail Server SMTP (1.0.0.0);
Sun, 14 Dec 2008 16:18:06 GMT
Message-ID: <494531B9.1070709@somenet.foo>
Date: Sun, 14 Dec 2008 17:18:01 +0100
From: "John Smith" <jsmith@somenet.foo>
User-Agent: Thunderbird 2.0.0.18 (Windows/20081105)
MIME-Version: 1.0
To: redmine@somenet.foo
Subject: HTML email
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
This is a <b>html-only</b> email.<br>
</body>
</html>
@@ -32,10 +32,19 @@ class DocumentsControllerTest < Test::Unit::TestCase
end end
def test_index def test_index
# Sets a default category
e = Enumeration.find_by_name('Technical documentation')
e.update_attributes(:is_default => true)
get :index, :project_id => 'ecookbook' get :index, :project_id => 'ecookbook'
assert_response :success assert_response :success
assert_template 'index' assert_template 'index'
assert_not_nil assigns(:grouped) assert_not_nil assigns(:grouped)
# Default category selected in the new document form
assert_tag :select, :attributes => {:name => 'document[category_id]'},
:child => {:tag => 'option', :attributes => {:selected => 'selected'},
:content => 'Technical documentation'}
end end
def test_new_with_one_attachment def test_new_with_one_attachment
+10
View File
@@ -137,6 +137,16 @@ class IssuesControllerTest < Test::Unit::TestCase
assert_not_nil assigns(:issues) assert_not_nil assigns(:issues)
assert_equal 'application/pdf', @response.content_type assert_equal 'application/pdf', @response.content_type
end end
def test_index_sort
get :index, :sort_key => 'tracker'
assert_response :success
sort_params = @request.session['issuesindex_sort']
assert sort_params.is_a?(Hash)
assert_equal 'tracker', sort_params[:key]
assert_equal 'ASC', sort_params[:order]
end
def test_gantt def test_gantt
get :gantt, :project_id => 1 get :gantt, :project_id => 1
@@ -73,12 +73,12 @@ class RepositoriesControllerTest < Test::Unit::TestCase
assert_tag :td, :content => 'dlopper', assert_tag :td, :content => 'dlopper',
:sibling => { :tag => 'td', :sibling => { :tag => 'td',
:child => { :tag => 'select', :attributes => { :name => 'committers[dlopper]' }, :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} },
:child => { :tag => 'option', :content => 'Dave Lopper', :child => { :tag => 'option', :content => 'Dave Lopper',
:attributes => { :value => '3', :selected => 'selected' }}}} :attributes => { :value => '3', :selected => 'selected' }}}}
assert_tag :td, :content => 'foo', assert_tag :td, :content => 'foo',
:sibling => { :tag => 'td', :sibling => { :tag => 'td',
:child => { :tag => 'select', :attributes => { :name => 'committers[foo]' }}} :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }}}
assert_no_tag :td, :content => 'foo', assert_no_tag :td, :content => 'foo',
:sibling => { :tag => 'td', :sibling => { :tag => 'td',
:descendant => { :tag => 'option', :attributes => { :selected => 'selected' }}} :descendant => { :tag => 'option', :attributes => { :selected => 'selected' }}}
@@ -90,7 +90,7 @@ class RepositoriesControllerTest < Test::Unit::TestCase
c = Changeset.create!(:repository => Project.find(1).repository, :committer => 'foo', :committed_on => Time.now, :revision => 100, :comments => 'Committed by foo.') c = Changeset.create!(:repository => Project.find(1).repository, :committer => 'foo', :committed_on => Time.now, :revision => 100, :comments => 'Committed by foo.')
assert_no_difference "Changeset.count(:conditions => 'user_id = 3')" do assert_no_difference "Changeset.count(:conditions => 'user_id = 3')" do
post :committers, :id => 1, :committers => { 'foo' => '2', 'dlopper' => '3'} post :committers, :id => 1, :committers => { '0' => ['foo', '2'], '1' => ['dlopper', '3']}
assert_redirected_to '/repositories/committers/ecookbook' assert_redirected_to '/repositories/committers/ecookbook'
assert_equal User.find(2), c.reload.user assert_equal User.find(2), c.reload.user
end end
+5
View File
@@ -258,4 +258,9 @@ class WikiControllerTest < Test::Unit::TestCase
post :destroy_attachment, :id => 1, :page => 'Page_with_an_inline_image', :attachment_id => 3 post :destroy_attachment, :id => 1, :page => 'Page_with_an_inline_image', :attachment_id => 3
end end
end end
def test_history_of_non_existing_page_should_return_404
get :history, :id => 1, :page => 'Unknown_page'
assert_response 404
end
end end
+1 -1
View File
@@ -44,7 +44,7 @@ class AccountTest < ActionController::IntegrationTest
assert_response :success assert_response :success
assert_template "account/lost_password" assert_template "account/lost_password"
post "account/lost_password", :mail => 'jsmith@somenet.foo' post "account/lost_password", :mail => 'jSmith@somenet.foo'
assert_redirected_to "account/login" assert_redirected_to "account/login"
token = Token.find(:first) token = Token.find(:first)
+37
View File
@@ -0,0 +1,37 @@
# Redmine - project management software
# 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.dirname(__FILE__) + '/../test_helper'
class DocumentTest < Test::Unit::TestCase
fixtures :projects, :enumerations, :documents
def test_create
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
assert doc.save
end
def test_create_with_default_category
# Sets a default category
e = Enumeration.find_by_name('Technical documentation')
e.update_attributes(:is_default => true)
doc = Document.new(:project => Project.find(1), :title => 'New document')
assert_equal e, doc.category
assert doc.save
end
end
+37
View File
@@ -37,6 +37,43 @@ class EnumerationTest < Test::Unit::TestCase
assert !Enumeration.find(7).in_use? assert !Enumeration.find(7).in_use?
end end
def test_default
e = Enumeration.default('IPRI')
assert e.is_a?(Enumeration)
assert e.is_default?
assert_equal 'Normal', e.name
end
def test_create
e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => false)
assert e.save
assert_equal 'Normal', Enumeration.default('IPRI').name
end
def test_create_as_default
e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => true)
assert e.save
assert_equal e, Enumeration.default('IPRI')
end
def test_update_default
e = Enumeration.default('IPRI')
e.update_attributes(:name => 'Changed', :is_default => true)
assert_equal e, Enumeration.default('IPRI')
end
def test_update_default_to_non_default
e = Enumeration.default('IPRI')
e.update_attributes(:name => 'Changed', :is_default => false)
assert_nil Enumeration.default('IPRI')
end
def test_change_default
e = Enumeration.find_by_name('Urgent')
e.update_attributes(:name => 'Urgent', :is_default => true)
assert_equal e, Enumeration.default('IPRI')
end
def test_destroy_with_reassign def test_destroy_with_reassign
Enumeration.find(4).destroy(Enumeration.find(6)) Enumeration.find(4).destroy(Enumeration.find(6))
assert_nil Issue.find(:first, :conditions => {:priority_id => 4}) assert_nil Issue.find(:first, :conditions => {:priority_id => 4})
+18 -2
View File
@@ -69,11 +69,23 @@ class ApplicationHelperTest < HelperTestCase
'!http://foo.bar/image.jpg!' => '<img src="http://foo.bar/image.jpg" alt="" />', '!http://foo.bar/image.jpg!' => '<img src="http://foo.bar/image.jpg" alt="" />',
'floating !>http://foo.bar/image.jpg!' => 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>', 'floating !>http://foo.bar/image.jpg!' => 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>',
'with class !(some-class)http://foo.bar/image.jpg!' => 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />', 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />',
'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style <img src="http://foo.bar/image.jpg" style="width:100px;height100px;" alt="" />', # inline styles should be stripped
'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style <img src="http://foo.bar/image.jpg" alt="" />',
'with title !http://foo.bar/image.jpg(This is a title)!' => 'with title <img src="http://foo.bar/image.jpg" title="This is a title" alt="This is a title" />',
'with title !http://foo.bar/image.jpg(This is a double-quoted "title")!' => 'with title <img src="http://foo.bar/image.jpg" title="This is a double-quoted &quot;title&quot;" alt="This is a double-quoted &quot;title&quot;" />',
} }
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) } to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
end end
def test_acronyms
to_test = {
'this is an acronym: GPL(General Public License)' => 'this is an acronym: <acronym title="General Public License">GPL</acronym>',
'GPL(This is a double-quoted "title")' => '<acronym title="This is a double-quoted &quot;title&quot;">GPL</acronym>',
}
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
end
def test_attached_images def test_attached_images
to_test = { to_test = {
'Inline image: !logo.gif!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />', 'Inline image: !logo.gif!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />',
@@ -88,6 +100,7 @@ class ApplicationHelperTest < HelperTestCase
'This is a "link":http://foo.bar' => 'This is a <a href="http://foo.bar" class="external">link</a>', 'This is a "link":http://foo.bar' => 'This is a <a href="http://foo.bar" class="external">link</a>',
'This is an intern "link":/foo/bar' => 'This is an intern <a href="/foo/bar">link</a>', 'This is an intern "link":/foo/bar' => 'This is an intern <a href="/foo/bar">link</a>',
'"link (Link title)":http://foo.bar' => '<a href="http://foo.bar" title="Link title" class="external">link</a>', '"link (Link title)":http://foo.bar' => '<a href="http://foo.bar" title="Link title" class="external">link</a>',
'"link (Link title with "double-quotes")":http://foo.bar' => '<a href="http://foo.bar" title="Link title with &quot;double-quotes&quot;" class="external">link</a>',
"This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":</p>\n\n\n\t<p>Another paragraph", "This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":</p>\n\n\n\t<p>Another paragraph",
# no multiline link text # no multiline link text
"This is a double quote \"on the first line\nand another on a second line\":test" => "This is a double quote \"on the first line<br />\nand another on a second line\":test" "This is a double quote \"on the first line\nand another on a second line\":test" => "This is a double quote \"on the first line<br />\nand another on a second line\":test"
@@ -239,7 +252,10 @@ EXPECTED
def test_text_formatting def test_text_formatting
to_test = {'*_+bold, italic and underline+_*' => '<strong><em><ins>bold, italic and underline</ins></em></strong>', to_test = {'*_+bold, italic and underline+_*' => '<strong><em><ins>bold, italic and underline</ins></em></strong>',
'(_text within parentheses_)' => '(<em>text within parentheses</em>)' '(_text within parentheses_)' => '(<em>text within parentheses</em>)',
'a *Humane Web* Text Generator' => 'a <strong>Humane Web</strong> Text Generator',
'a H *umane* W *eb* T *ext* G *enerator*' => 'a H <strong>umane</strong> W <strong>eb</strong> T <strong>ext</strong> G <strong>enerator</strong>',
'a *H* umane *W* eb *T* ext *G* enerator' => 'a <strong>H</strong> umane <strong>W</strong> eb <strong>T</strong> ext <strong>G</strong> enerator',
} }
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) } to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
end end
+7
View File
@@ -190,4 +190,11 @@ class IssueTest < Test::Unit::TestCase
assert_nil Issue.find_by_id(1) assert_nil Issue.find_by_id(1)
assert_nil TimeEntry.find_by_issue_id(1) assert_nil TimeEntry.find_by_issue_id(1)
end end
def test_overdue
assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
assert !Issue.new(:due_date => Date.today).overdue?
assert !Issue.new(:due_date => 1.day.from_now.to_date).overdue?
assert !Issue.new(:due_date => nil).overdue?
end
end end
@@ -0,0 +1,42 @@
# Redmine - project management software
# 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.dirname(__FILE__) + '/../../../test_helper'
class Redmine::UnifiedDiffTest < Test::Unit::TestCase
def setup
end
def test_subversion_diff
diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'))
# number of files
assert_equal 4, diff.size
assert diff.detect {|file| file.file_name =~ %r{^config/settings.yml}}
end
def test_truncate_diff
diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'), :max_lines => 20)
assert_equal 2, diff.size
end
private
def read_diff_fixture(filename)
File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
end
end
+9
View File
@@ -129,6 +129,15 @@ class MailHandlerTest < Test::Unit::TestCase
assert_match /This is reply/, journal.notes assert_match /This is reply/, journal.notes
assert_equal IssueStatus.find_by_name("Resolved"), issue.status assert_equal IssueStatus.find_by_name("Resolved"), issue.status
end end
def test_should_strip_tags_of_html_only_emails
issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'})
assert issue.is_a?(Issue)
assert !issue.new_record?
issue.reload
assert_equal 'HTML email', issue.subject
assert_equal 'This is a html-only email.', issue.description
end
private private
+6
View File
@@ -53,6 +53,12 @@ class RepositoryCvsTest < Test::Unit::TestCase
@repository.fetch_changesets @repository.fetch_changesets
assert_equal 5, @repository.changesets.count assert_equal 5, @repository.changesets.count
end end
def test_deleted_files_should_not_be_listed
entries = @repository.entries('sources')
assert entries.detect {|e| e.name == 'watchers_controller.rb'}
assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'}
end
else else
puts "CVS test repository NOT FOUND. Skipping unit tests !!!" puts "CVS test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end def test_fake; assert true end
+6
View File
@@ -158,4 +158,10 @@ class UserTest < Test::Unit::TestCase
@jsmith.pref.comments_sorting = 'desc' @jsmith.pref.comments_sorting = 'desc'
assert @jsmith.wants_comments_in_reverse_order? assert @jsmith.wants_comments_in_reverse_order?
end end
def test_find_by_mail_should_be_case_insensitive
u = User.find_by_mail('JSmith@somenet.foo')
assert_not_nil u
assert_equal 'jsmith@somenet.foo', u.mail
end
end end
+1 -1
View File
@@ -1,7 +1,7 @@
require 'action_web_service' require 'action_web_service'
# These need to be in the load path for action_web_service to work # These need to be in the load path for action_web_service to work
Dependencies.load_paths += ["#{RAILS_ROOT}/app/apis"] ActiveSupport::Dependencies.load_paths += ["#{RAILS_ROOT}/app/apis"]
# AWS Test helpers # AWS Test helpers
require 'action_web_service/test_invoke' if ENV['RAILS_ENV'] && ENV['RAILS_ENV'] =~ /^test/ require 'action_web_service/test_invoke' if ENV['RAILS_ENV'] && ENV['RAILS_ENV'] =~ /^test/
@@ -73,7 +73,7 @@ module Redmine
end end
with_scope(:find => scope_options) do with_scope(:find => scope_options) do
find(:all, provider_options[:find_options]) find(:all, provider_options[:find_options].dup)
end end
end end
end end
+2 -2
View File
@@ -97,8 +97,8 @@ module ActionController
"Unknown options: #{unknown_option_keys.join(', ')}" unless "Unknown options: #{unknown_option_keys.join(', ')}" unless
unknown_option_keys.empty? unknown_option_keys.empty?
options[:singular_name] ||= Inflector.singularize(collection_id.to_s) options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s)
options[:class_name] ||= Inflector.camelize(options[:singular_name]) options[:class_name] ||= ActiveSupport::Inflector.camelize(options[:singular_name])
end end
# Returns a paginator and a collection of Active Record model instances # Returns a paginator and a collection of Active Record model instances
@@ -140,4 +140,4 @@ module Engines::RailsExtensions::Dependencies
end end
end end
Dependencies.send :include, Engines::RailsExtensions::Dependencies ActiveSupport::Dependencies.send :include, Engines::RailsExtensions::Dependencies