Compare commits

...
18 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
Jean-Philippe Lang 644f03b834 Set version to stable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 10:01:10 +00:00
Jean-Philippe Lang 1154141ee7 Merge from trunk up to r2105.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2106 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 10:00:40 +00:00
Jean-Philippe Lang bf42d9b706 0.8 branch added
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2099 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 22:41:47 +00:00
101 changed files with 1956 additions and 1320 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 %>
+2 -1
View File
@@ -10,7 +10,8 @@
<table style="width:100%"> <table style="width:100%">
<% @issue.relations.each do |relation| %> <% @issue.relations.each do |relation| %>
<tr> <tr>
<td><%= l(relation.label_for(@issue)) %> <%= "(#{lwr(:actionview_datehelper_time_in_words_day, relation.delay)})" if relation.delay && relation.delay != 0 %> <%= link_to_issue relation.other_issue(@issue) %></td> <td><%= l(relation.label_for(@issue)) %> <%= "(#{lwr(:actionview_datehelper_time_in_words_day, relation.delay)})" if relation.delay && relation.delay != 0 %>
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %> <%= link_to_issue relation.other_issue(@issue) %></td>
<td><%=h relation.other_issue(@issue).subject %></td> <td><%=h relation.other_issue(@issue).subject %></td>
<td><%= relation.other_issue(@issue).status.name %></td> <td><%= relation.other_issue(@issue).status.name %></td>
<td><%= format_date(relation.other_issue(@issue).start_date) %></td> <td><%= format_date(relation.other_issue(@issue).start_date) %></td>
+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 -%>
+1 -1
View File
@@ -5,7 +5,7 @@
# ENV['RAILS_ENV'] ||= 'production' # ENV['RAILS_ENV'] ||= 'production'
# Specifies gem version of Rails to use when vendor/rails is not present # Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION RAILS_GEM_VERSION = '2.1.2' unless defined? RAILS_GEM_VERSION
# Bootstrap the Rails environment, frameworks, and default configuration # Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot') require File.join(File.dirname(__FILE__), 'boot')
+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:
+190
View File
@@ -5,6 +5,196 @@ 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
* Wiki page protection
* Wiki page hierarchy. Parent page can be assigned on the Rename screen
* Adds support for issue creation via email
* Adds support for free ticket filtering and custom queries on Gantt chart and calendar
* Cross-project search
* Ability to search a project and its subprojects
* Ability to search the projects the user belongs to
* Adds custom fields on time entries
* Adds boolean and list custom fields for time entries as criteria on time report
* Cross-project time reports
* Display latest user's activity on account/show view
* Show last connexion time on user's page
* Obfuscates email address on user's account page using javascript
* wiki TOC rendered as an unordered list
* Adds the ability to search for a user on the administration users list
* Adds the ability to search for a project name or identifier on the administration projects list
* Redirect user to the previous page after logging in
* Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users
* Adds permissions for viewing the watcher list and adding new watchers on the issue detail view
* Adds permissions to let users edit and/or delete their messages
* Link to activity view when displaying dates
* Hide Redmine version in atom feeds and pdf properties
* Maps repository users to Redmine users. Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
* Sort users by their display names so that user dropdown lists are sorted alphabetically
* Adds estimated hours to issue filters
* Switch order of current and previous revisions in side-by-side diff
* Render the commit changes list as a tree
* Adds watch/unwatch functionality at forum topic level
* When moving an issue to another project, reassign it to the category with same name if any
* Adds child_pages macro for wiki pages
* Use GET instead of POST on roadmap (#718), gantt and calendar forms
* Search engine: display total results count and count by result type
* Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file)
* Adds icons on search results
* Adds 'Edit' link on account/show for admin users
* Adds Lock/Unlock/Activate link on user edit screen
* Adds user count in status drop down on admin user list
* Adds multi-levels blockquotes support by using > at the beginning of lines
* Adds a Reply link to each issue note
* Adds plain text only option for mail notifications
* Gravatar support for issue detail, user grid, and activity stream (disabled by default)
* Adds 'Delete wiki pages attachments' permission
* Show the most recent file when displaying an inline image
* Makes permission screens localized
* AuthSource list: display associated users count and disable 'Delete' buton if any
* Make the 'duplicates of' relation asymmetric
* Adds username to the password reminder email
* Adds links to forum messages using message#id syntax
* Allow same name for custom fields on different object types
* One-click bulk edition using the issue list context menu within the same project
* Adds support for commit logs reencoding to UTF-8 before insertion in the database. Source encoding of commit logs can be selected in Application settings -> Repositories.
* Adds checkboxes toggle links on permissions report
* Adds Trac-Like anchors on wiki headings
* Adds support for wiki links with anchor
* Adds category to the issue context menu
* Adds a workflow overview screen
* Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename
* Dots allowed in custom field name
* Adds posts quoting functionality
* Adds an option to generate sequential project identifiers
* Adds mailto link on the user administration list
* Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value
* Gantt chart: display issues that don't have a due date if they are assigned to a version with a date
* Change projects homepage limit to 255 chars
* Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes
* Adds "please select" to activity select box if no activity is set as default
* Do not silently ignore timelog validation failure on issue edit
* Adds a rake task to send reminder emails
* Allow empty cells in wiki tables
* Makes wiki text formatter pluggable
* Adds back textile acronyms support
* Remove pre tag attributes
* Plugin hooks
* Pluggable admin menu
* Plugins can provide activity content
* Moves plugin list to its own administration menu item
* Adds url and author_url plugin attributes
* Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version
* Adds atom feed on time entries details
* Adds project name to issues feed title
* Adds a css class on menu items in order to apply item specific styles (eg. icons)
* Adds a Redmine plugin generators
* Adds timelog link to the issue context menu
* Adds links to the user page on various views
* Turkish translation by Ismail Sezen
* Catalan translation
* Vietnamese translation
* Slovak translation
* Better naming of activity feed if only one kind of event is displayed
* Enable syntax highlight on issues, messages and news
* Add target version to the issue list context menu
* Hide 'Target version' filter if no version is defined
* Add filters on cross-project issue list for custom fields marked as 'For all projects'
* Turn ftp urls into links
* Hiding the View Differences button when a wiki page's history only has one version
* Messages on a Board can now be sorted by the number of replies
* Adds a class ('me') to events of the activity view created by current user
* Strip pre/code tags content from activity view events
* Display issue notes in the activity view
* Adds links to changesets atom feed on repository browser
* Track project and tracker changes in issue history
* Adds anchor to atom feed messages links
* Adds a key in lang files to set the decimal separator (point or comma) in csv exports
* Makes importer work with Trac 0.8.x
* Upgraded to Prototype 1.6.0.1
* File viewer for attached text files
* Menu mapper: add support for :before, :after and :last options to #push method and add #delete method
* Removed inconsistent revision numbers on diff view
* CVS: add support for modules names with spaces
* Log the user in after registration if account activation is not needed
* Mercurial adapter improvements
* Trac importer: read session_attribute table to find user's email and real name
* Ability to disable unused SCM adapters in application settings
* Adds Filesystem adapter
* Clear changesets and changes with raw sql when deleting a repository for performance
* Redmine.pm now uses the 'commit access' permission defined in Redmine
* Reposman can create any type of scm (--scm option)
* Reposman creates a repository if the 'repository' module is enabled at project level only
* Display svn properties in the browser, svn >= 1.5.0 only
* Reduces memory usage when importing large git repositories
* Wider SVG graphs in repository stats
* SubversionAdapter#entries performance improvement
* SCM browser: ability to download raw unified diffs
* More detailed error message in log when scm command fails
* Adds support for file viewing with Darcs 2.0+
* Check that git changeset is not in the database before creating it
* Unified diff viewer for attached files with .patch or .diff extension
* File size display with Bazaar repositories
* Git adapter: use commit time instead of author time
* Prettier url for changesets
* Makes changes link to entries on the revision view
* Adds a field on the repository view to browse at specific revision
* Adds new projects atom feed
* Added rake tasks to generate rcov code coverage reports
* Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki
* Show the project hierarchy in the drop down list for new membership on user administration screen
* Split user edit screen into tabs
* Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead
* Fixed: Roadmap crashes when a version has a due date > 2037
* Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen
* Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory
* Fixed: logtime entry duplicated when edited from parent project
* Fixed: wrong digest for text files under Windows
* Fixed: associated revisions are displayed in wrong order on issue view
* Fixed: Git Adapter date parsing ignores timezone
* Fixed: Printing long roadmap doesn't split across pages
* Fixes custom fields display order at several places
* Fixed: urls containing @ are parsed as email adress by the wiki formatter
* Fixed date filters accuracy with SQLite
* Fixed: tokens not escaped in highlight_tokens regexp
* Fixed Bazaar shared repository browsing
* Fixes platform determination under JRuby
* Fixed: Estimated time in issue's journal should be rounded to two decimals
* Fixed: 'search titles only' box ignored after one search is done on titles only
* Fixed: non-ASCII subversion path can't be displayed
* Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format
* Fixed: document listing shows on "my page" when viewing documents is disabled for the role
* Fixed: Latest news appear on the homepage for projects with the News module disabled
* Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled
* Fixed: the default status is lost when reordering issue statuses
* Fixes error with Postgresql and non-UTF8 commit logs
* Fixed: textile footnotes no longer work
* Fixed: http links containing parentheses fail to reder correctly
* Fixed: GitAdapter#get_rev should use current branch instead of hardwiring master
== 2008-07-06 v0.7.3 == 2008-07-06 v0.7.3
* Allow dot in firstnames and lastnames * Allow dot in firstnames and lastnames
+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)
+1 -1
View File
@@ -22,7 +22,7 @@ http://www.redmine.org/
== Notes == Notes
1. Rails 2.0.2 is required for version 0.7 and later. 1. Rails 2.1.2 is required for version 0.8.
2. When upgrading your code with svn update, don't forget to clear 2. When upgrading your code with svn update, don't forget to clear
the application cache (RAILS_ROOT/tmp/cache) before restarting. the application cache (RAILS_ROOT/tmp/cache) before restarting.
+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
+3 -3
View File
@@ -3,14 +3,14 @@ require 'rexml/document'
module Redmine module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 0 MAJOR = 0
MINOR = 7 MINOR = 8
TINY = 3 TINY = 0
# Branch values: # Branch values:
# * official release: nil # * official release: nil
# * stable branch: stable # * stable branch: stable
# * trunk: devel # * trunk: devel
BRANCH = 'devel' BRANCH = 'stable'
def self.revision def self.revision
revision = nil revision = nil
@@ -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

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