Compare commits

...

18 Commits
2.0.0 ... 0.8.0

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

View File

@@ -27,7 +27,7 @@ class AdminController < ApplicationController
def projects
sort_init 'name', 'asc'
sort_update
sort_update %w(name is_public created_on)
@status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])

View File

@@ -126,10 +126,14 @@ class ApplicationController < ActionController::Base
def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank?
uri = URI.parse(back_url)
# do not redirect user to another host or to the login or register page
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
redirect_to(back_url) and return
begin
uri = URI.parse(back_url)
# do not redirect user to another host or to the login or register page
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
redirect_to default

View File

@@ -35,12 +35,14 @@ class BoardsController < ApplicationController
end
def show
sort_init "#{Message.table_name}.updated_on", "desc"
sort_update
sort_init 'updated_on', 'desc'
sort_update 'created_on' => "#{Message.table_name}.created_on",
'replies' => "#{Message.table_name}.replies_count",
'updated_on' => "#{Message.table_name}.updated_on"
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
@topics = @board.topics.find :all, :order => "#{Message.table_name}.sticky DESC, #{sort_clause}",
@topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '),
:include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset

View File

@@ -35,6 +35,7 @@ class DocumentsController < ApplicationController
else
@grouped = documents.group_by(&:category)
end
@document = @project.documents.build
render :layout => false if request.xhr?
end

View File

@@ -45,9 +45,10 @@ class IssuesController < ApplicationController
helper :timelog
def index
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query
sort_init 'id', 'desc'
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
if @query.valid?
limit = per_page_option
respond_to do |format|
@@ -78,9 +79,10 @@ class IssuesController < ApplicationController
end
def changes
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query
sort_init 'id', 'desc'
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
if @query.valid?
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
:conditions => @query.statement,

View File

@@ -22,6 +22,7 @@ class JournalsController < ApplicationController
if request.post?
@journal.update_attributes(:notes => params[:notes]) if params[:notes]
@journal.destroy if @journal.details.empty? && @journal.notes.blank?
call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
format.js { render :action => 'update' }

View File

@@ -197,8 +197,12 @@ class ProjectsController < ApplicationController
end
def list_files
sort_init "#{Attachment.table_name}.filename", "asc"
sort_update
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end

View File

@@ -51,8 +51,9 @@ class RepositoriesController < ApplicationController
@users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty?
@users.compact!
@users.sort!
if request.post?
@repository.committer_ids = params[:committers]
if request.post? && params[:committers].is_a?(Hash)
# 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)
redirect_to :action => 'committers', :id => @project
end

View File

@@ -138,7 +138,12 @@ class TimelogController < ApplicationController
def details
sort_init 'spent_on', 'desc'
sort_update
sort_update 'spent_on' => 'spent_on',
'user' => 'user_id',
'activity' => 'activity_id',
'project' => "#{Project.table_name}.name",
'issue' => 'issue_id',
'hours' => 'hours'
cond = ARCondition.new
if @project.nil?

View File

@@ -30,7 +30,7 @@ class UsersController < ApplicationController
def list
sort_init 'login', 'asc'
sort_update
sort_update %w(login firstname lastname mail admin created_on last_login_on)
@status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])

View File

@@ -19,6 +19,7 @@ require 'diff'
class WikiController < ApplicationController
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 }
@@ -91,8 +92,7 @@ class WikiController < ApplicationController
# rename a page
def rename
@page = @wiki.find_page(params[:page])
return render_403 unless editable?
return render_403 unless editable?
@page.redirect_existing_links = true
# used to display the *original* title if some AR validation errors occur
@original_title = @page.pretty_title
@@ -103,15 +103,12 @@ class WikiController < ApplicationController
end
def protect
page = @wiki.find_page(params[:page])
page.update_attribute :protected, params[:protected]
redirect_to :action => 'index', :id => @project, :page => page.title
@page.update_attribute :protected, params[:protected]
redirect_to :action => 'index', :id => @project, :page => @page.title
end
# show page history
def history
@page = @wiki.find_page(params[:page])
@version_count = @page.content.versions.count
@version_pages = Paginator.new self, @version_count, per_page_option, params['p']
# don't load text
@@ -125,21 +122,19 @@ class WikiController < ApplicationController
end
def diff
@page = @wiki.find_page(params[:page])
@diff = @page.diff(params[:version], params[:version_from])
render_404 unless @diff
end
def annotate
@page = @wiki.find_page(params[:page])
@annotate = @page.annotate(params[:version])
render_404 unless @annotate
end
# remove a wiki page and its history
def destroy
@page = @wiki.find_page(params[:page])
return render_403 unless editable?
@page.destroy if @page
return render_403 unless editable?
@page.destroy
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
end
@@ -181,7 +176,6 @@ class WikiController < ApplicationController
end
def add_attachment
@page = @wiki.find_page(params[:page])
return render_403 unless editable?
attach_files(@page, params[:attachments])
redirect_to :action => 'index', :page => @page.title
@@ -204,6 +198,12 @@ private
render_404
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
def editable?(page = @page)
page.editable_by?(User.current)

View File

@@ -18,6 +18,7 @@
require 'coderay'
require 'coderay/helpers/file_type'
require 'forwardable'
require 'cgi'
module ApplicationHelper
include Redmine::WikiFormatting::Macros::Definitions
@@ -47,8 +48,8 @@ module ApplicationHelper
end
# Display a link to user's account page
def link_to_user(user)
(user && !user.anonymous?) ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
def link_to_user(user, options={})
(user && !user.anonymous?) ? link_to(user.name(options[:format]), :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
end
def link_to_issue(issue, options={})
@@ -525,7 +526,7 @@ module ApplicationHelper
def back_url_hidden_field_tag
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
def check_all_links(form_name)

View File

@@ -33,6 +33,13 @@ module IssuesHelper
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
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
unless @sidebar_queries
# User can see public queries and his own queries

View File

@@ -22,8 +22,8 @@ module QueriesHelper
end
def column_header(column)
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption,
:default_order => column.default_order) :
column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
:default_order => column.default_order) :
content_tag('th', column.caption)
end

View File

@@ -67,23 +67,31 @@ module SortHelper
# Updates the sort state. Call this in the controller prior to calling
# sort_clause.
#
def sort_update()
if params[:sort_key]
sort = {:key => params[:sort_key], :order => params[:sort_order]}
# sort_keys can be either an array or a hash of allowed keys
def sort_update(sort_keys)
sort_key = params[:sort_key]
sort_key = nil unless (sort_keys.is_a?(Array) ? sort_keys.include?(sort_key) : sort_keys[sort_key])
sort_order = (params[:sort_order] == 'desc' ? 'DESC' : 'ASC')
if sort_key
sort = {:key => sort_key, :order => sort_order}
elsif session[@sort_name]
sort = session[@sort_name] # Previous sort.
else
sort = @sort_default
end
session[@sort_name] = sort
sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
@sort_clause = (sort_column.blank? ? nil : "#{sort_column} #{sort[:order]}")
end
# Returns an SQL sort clause corresponding to the current sort state.
# Use this to sort the controller's table items collection.
#
def sort_clause()
session[@sort_name][:key] + ' ' + (session[@sort_name][:order] || 'ASC')
@sort_clause
end
# Returns a link which sorts by the named column.

View File

@@ -28,4 +28,10 @@ class Document < ActiveRecord::Base
validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60
def after_initialize
if new_record?
self.category ||= Enumeration.default('DCAT')
end
end
end

View File

@@ -44,7 +44,9 @@ class Enumeration < ActiveRecord::Base
end
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
def objects_count

View File

@@ -195,6 +195,11 @@ class Issue < ActiveRecord::Base
self.status.is_closed?
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
def assignable_users
project.assignable_users

View File

@@ -16,6 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MailHandler < ActionMailer::Base
include ActionView::Helpers::SanitizeHelper
class UnauthorizedAction < StandardError; end
class MissingInformation < StandardError; end
@@ -88,15 +89,14 @@ class MailHandler < ActionMailer::Base
issue.status = status
end
issue.subject = email.subject.chomp.toutf8
issue.description = email.plain_text_body.chomp
issue.description = plain_text_body
issue.save!
add_attachments(issue)
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_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
end
@@ -120,7 +120,7 @@ class MailHandler < ActionMailer::Base
raise UnauthorizedAction unless status.nil? || user.allowed_to?(:edit_issues, issue.project)
# add the note
journal = issue.init_journal(user, email.plain_text_body.chomp)
journal = issue.init_journal(user, plain_text_body)
add_attachments(issue)
# check workflow
if status && issue.new_statuses_allowed_to(user).include?(status)
@@ -156,21 +156,30 @@ class MailHandler < ActionMailer::Base
end
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
elsif !@@handler_options[:issue][attr].blank?
@@handler_options[:issue][attr]
end
end
end
class TMail::Mail
# Returns body of the first plain text part found if any
# Returns the text/plain part of the email
# If not found (eg. HTML-only email), returns the body with tags removed
def plain_text_body
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
plain = p.detect {|c| c.content_type == 'text/plain'}
@plain_text_body = plain.nil? ? self.body : plain.body
parts = @email.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten
if parts.empty?
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

View File

@@ -57,7 +57,7 @@ class Mailer < ActionMailer::Base
subject l(:mail_subject_reminder, issues.size)
body :issues => issues,
: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
def document_added(document)

View File

@@ -144,7 +144,7 @@ class User < ActiveRecord::Base
end
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
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.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
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
def <=>(user)

View File

@@ -33,9 +33,9 @@
<thead><tr>
<th><%= l(:field_subject) %></th>
<th><%= l(:field_author) %></th>
<%= sort_header_tag("#{Message.table_name}.created_on", :caption => l(:field_created_on)) %>
<%= sort_header_tag("#{Message.table_name}.replies_count", :caption => l(:label_reply_plural)) %>
<%= sort_header_tag("#{Message.table_name}.updated_on", :caption => l(:label_message_last)) %>
<%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
<%= sort_header_tag('replies', :caption => l(:label_reply_plural)) %>
<%= sort_header_tag('updated_on', :caption => l(:label_message_last)) %>
</tr></thead>
<tbody>
<% @topics.each do |topic| %>

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">
<% if diff_type == 'sbs' -%>
<table class="filecontent CodeRay">
@@ -62,3 +63,5 @@
</div>
<% end -%>
<%= l(:text_diff_truncated) if diff.truncated? %>

View File

@@ -4,14 +4,14 @@
<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)}" %>
</th>
<%= sort_header_tag("#{Issue.table_name}.id", :caption => '#', :default_order => 'desc') %>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
<% query.columns.each do |column| %>
<%= column_header(column) %>
<% end %>
</tr></thead>
<tbody>
<% 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><%= 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 %>

View File

@@ -8,7 +8,7 @@
</tr></thead>
<tbody>
<% 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">
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>

View File

@@ -10,7 +10,8 @@
<table style="width:100%">
<% @issue.relations.each do |relation| %>
<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><%= relation.other_issue(@issue).status.name %></td>
<td><%= format_date(relation.other_issue(@issue).start_date) %></td>

View File

@@ -20,7 +20,7 @@
<h3><%= l(:label_query_plural) %></h3>
<% 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 -%>
<%= call_hook(:view_issues_sidebar_queries_bottom) %>
<% end -%>

View File

@@ -9,7 +9,7 @@
<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") %>
<h3><%=h @issue.subject %></h3>
<p class="author">

View File

@@ -1,6 +1,7 @@
<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
<%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit',
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
<%= text_area_tag :notes, h(@journal.notes), :class => 'wiki-edit',
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
<%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>
<p><%= submit_tag l(:button_save) %>
<%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
"Element.show('journal-#{@journal.id}-notes'); return false;" %></p>

View File

@@ -6,3 +6,5 @@ else
page.show "journal-#{@journal.id}-notes"
page.remove "journal-#{@journal.id}-form"
end
call_hook(:view_journals_update_rjs_bottom, { :page => page, :journal => @journal })

View File

@@ -24,7 +24,7 @@
<div id="account">
<%= render_menu :account_menu -%>
</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 -%>
</div>

View File

@@ -38,7 +38,7 @@
<div class="box tabular">
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
<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>
<% end %>
</div>

View File

@@ -9,10 +9,10 @@
<table class="list">
<thead><tr>
<th><%=l(:field_version)%></th>
<%= sort_header_tag("#{Attachment.table_name}.filename", :caption => l(:field_filename)) %>
<%= sort_header_tag("#{Attachment.table_name}.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("#{Attachment.table_name}.downloads", :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
<%= sort_header_tag('filename', :caption => l(:field_filename)) %>
<%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %>
<%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %>
<%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
<th>MD5</th>
<% if delete_allowed %><th></th><% end %>
</tr></thead>

View File

@@ -15,11 +15,16 @@
</tr>
</thead>
<tbody>
<% i = 0 -%>
<% @committers.each do |committer, user_id| -%>
<tr class="<%= cycle 'odd', 'even' %>">
<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>
<% i += 1 -%>
<% end -%>
</tbody>
</table>

View File

@@ -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>

View File

@@ -2,10 +2,10 @@
<thead>
<tr>
<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
<%= sort_header_tag('user_id', :caption => l(:label_member)) %>
<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %>
<%= sort_header_tag("#{Project.table_name}.name", :caption => l(:label_project)) %>
<%= sort_header_tag('issue_id', :caption => l(:label_issue), :default_order => 'desc') %>
<%= sort_header_tag('user', :caption => l(:label_member)) %>
<%= sort_header_tag('activity', :caption => l(:label_activity)) %>
<%= sort_header_tag('project', :caption => l(:label_project)) %>
<%= sort_header_tag('issue', :caption => l(:label_issue), :default_order => 'desc') %>
<th><%= l(:field_comments) %></th>
<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
<th></th>

View File

@@ -20,7 +20,7 @@
<th class="line-num"><%= line_num %></th>
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
<td class="author"><%= h(line[1]) %></td>
<td class="line-code"><pre><%= line[2] %></pre></td>
<td class="line-code"><pre><%=h line[2] %></pre></td>
</tr>
<% line_num += 1 %>
<% end -%>

View File

@@ -5,7 +5,7 @@
# ENV['RAILS_ENV'] ||= 'production'
# 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
require File.join(File.dirname(__FILE__), 'boot')

View File

@@ -61,6 +61,9 @@ protocol:
feeds_limit:
format: int
default: 15
diff_max_lines_displayed:
format: int
default: 1500
enabled_scm:
serialized: true
default:

View File

@@ -5,6 +5,196 @@ Copyright (C) 2006-2008 Jean-Philippe Lang
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
* Allow dot in firstnames and lastnames

View File

@@ -7,7 +7,7 @@ http://www.redmine.org/
== Requirements
* Ruby on Rails 2.1
* Ruby on Rails 2.1.2
* A database:
* MySQL (tested with MySQL 5)
* PostgreSQL (tested with PostgreSQL 8.1)

View File

@@ -22,7 +22,7 @@ http://www.redmine.org/
== 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
the application cache (RAILS_ROOT/tmp/cache) before restarting.

View File

@@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -699,3 +699,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

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_sequential_project_identifiers: Fortlaufende Projektkennungen generieren
setting_gravatar_enabled: Gravatar Benutzerbilder benutzen
setting_diff_max_lines_displayed: Maximale Anzahl anzuzeigender Diff-Zeilen
permission_edit_project: Projekt bearbeiten
permission_select_project_modules: Projektmodule auswählen
@@ -344,6 +345,7 @@ label_last_updates_plural: %d zuletzt aktualisierten
label_registered_on: Angemeldet am
label_activity: Aktivität
label_overall_activity: Aktivität aller Projekte anzeigen
label_user_activity: "Aktivität von %s"
label_new: Neu
label_logged_as: Angemeldet als
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_module_plural: Module
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_jump_to_a_project: Zu einem Projekt springen...
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_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_diff_truncated: '... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.'
default_role_manager: Manager
default_role_developper: Entwickler
@@ -694,5 +698,3 @@ default_activity_development: Entwicklung
enumeration_issue_priorities: Ticket-Prioritäten
enumeration_doc_categories: Dokumentenkategorien
enumeration_activities: Aktivitäten (Zeiterfassung)
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago

View File

@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: Enable WS for incoming emails
setting_mail_handler_api_key: API key
setting_sequential_project_identifiers: Generate sequential project identifiers
setting_gravatar_enabled: Use Gravatar user icons
setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_edit_project: Edit project
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_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_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
default_role_manager: Manager
default_role_developper: Developer

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
activerecord_error_accepted: debe ser aceptado
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_empty: no puede estar vacío
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_invalid: no es válido
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_for_all: Para todos los proyectos
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_required: Obligatorio
field_issue: Petición
field_issue_to_id: Petición Relacionada
field_issue_to_id: Petición relacionada
field_language: Idioma
field_last_login_on: Última conexión
field_lastname: Apellido
@@ -178,7 +178,7 @@ field_subproject: Proyecto secundario
field_summary: Resumen
field_time_zone: Zona horaria
field_title: Título
field_tracker: Tracker
field_tracker: Tipo
field_type: Tipo
field_updated_on: Actualizado
field_url: URL
@@ -215,7 +215,7 @@ label_ago: hace
label_all: todos
label_all_time: todo el tiempo
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_assigned_to_me_issues: Peticiones que me están asignadas
label_associated_revisions: Revisiones asociadas
@@ -234,7 +234,7 @@ label_blocks: bloquea a
label_board: Foro
label_board_new: Nuevo foro
label_board_plural: Foros
label_boolean: Boleano
label_boolean: Booleano
label_browse: Hojear
label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
label_calendar: Calendario
@@ -293,7 +293,7 @@ label_enumerations: Listas de valores
label_environment: Entorno
label_equals: igual
label_example: Ejemplo
label_export_to: Exportar a
label_export_to: 'Exportar a:'
label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas
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_new: Nueva petición
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_plural: Estados de las peticiones
label_issue_tracking: Peticiones
@@ -337,7 +337,7 @@ label_issue_watchers: Seguidores
label_issues_by: Peticiones por %s
label_jump_to_a_project: Ir al proyecto...
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_month: último mes
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_next: Siguiente
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_none: ninguno
label_not_contains: no contiene
@@ -397,7 +397,7 @@ label_options: Opciones
label_overall_activity: Actividad global
label_overview: Vistazo
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_report: Informe de permisos
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_revision: Revisión
label_revision_plural: Revisiones
label_roadmap: Roadmap
label_roadmap: Planificación
label_roadmap_due_in: Finaliza en %s
label_roadmap_no_issues: No hay peticiones para esta versión
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_test_email: Enviar un correo de prueba
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_higher: Subir
label_sort_highest: Primero
@@ -474,16 +474,18 @@ label_time_tracking: Control de tiempo
label_today: hoy
label_topic_plural: Temas
label_total: Total
label_tracker: Tracker
label_tracker_new: Nuevo tracker
label_tracker_plural: Trackers
label_tracker: Tipo
label_tracker_new: Nuevo tipo
label_tracker_plural: Tipos de peticiones
label_updated_time: Actualizado hace %s
label_updated_time_by: Actualizado por %s hace %s
label_used_by: Utilizado por
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_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_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_plural: Usuarios
label_version: Versión
@@ -501,22 +503,22 @@ label_wiki_page_plural: Wiki páginas
label_workflow: Flujo de trabajo
label_year: Año
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_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_register: 'Para activar su cuenta, 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 clic en el siguiente enlace:'
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_lost_password: Tu contraseña 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"
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_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_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte de administrador"
notice_account_register_done: Cuenta creada correctamente.
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. Para activarla, haga clic sobre el enlace que le ha sido enviado por correo.
notice_account_unknown_email: Usuario desconocido.
notice_account_updated: Cuenta actualizada correctamente.
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_email_error: Ha ocurrido un error mientras enviando el correo (%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_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_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_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_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.
@@ -544,9 +546,9 @@ permission_comment_news: Comentar noticias
permission_commit_access: Acceso de escritura
permission_delete_issues: Borrar peticiones
permission_delete_messages: Borrar mensajes
permission_delete_own_messages: Borrar mensajes propios
permission_delete_wiki_pages: Borrar páginas wiki
permission_delete_wiki_pages_attachments: Borrar ficheros
permission_delete_own_messages: Borrar mensajes propios
permission_edit_issue_notes: Modificar notas
permission_edit_issues: Modificar peticiones
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_ref_keywords: Palabras clave para la referencia
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_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_enabled_scm: Activar SCM
setting_feeds_limit: Límite de contenido para sindicación
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_issues_export_limit: Límite de exportación de peticiones
setting_login_required: Se requiere identificación
@@ -632,7 +635,7 @@ setting_wiki_compression: Compresión del historial del Wiki
status_active: activo
status_locked: bloqueado
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_caracters_maximum: %d caracteres como máximo.
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_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_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_enumeration_category_reassign_to: 'Reasignar al siguiente valor:'
text_enumeration_destroy_question: '%d objetos con este valor asignado.'
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_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
@@ -657,25 +661,23 @@ text_journal_set_to: fijado a %s
text_length_between: Longitud entre %d y %d caracteres.
text_load_default_configuration: Cargar la configuración por defecto
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_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_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_select_mail_notifications: Seleccionar los eventos a notificar
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
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_end_day: tarea que comienza y 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_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_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
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

View File

@@ -694,3 +694,5 @@ permission_edit_own_messages: Muokkaa omia viestejä
permission_delete_own_messages: Poista omia viestejä
label_user_activity: "Käyttäjän %s historia"
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

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_sequential_project_identifiers: Générer des identifiants de projet séquentiels
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_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_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_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_developper: Développeur

View File

@@ -236,7 +236,7 @@ label_register: הרשמה
label_password_lost: אבדה הסיסמה?
label_home: דף הבית
label_my_page: הדף שלי
label_my_account: השבון שלי
label_my_account: החשבון שלי
label_my_projects: הפרויקטים שלי
label_administration: אדמיניסטרציה
label_login: התחבר
@@ -292,7 +292,7 @@ label_confirmation: אישור
label_export_to: יצא ל
label_read: קרא...
label_public_projects: פרויקטים פומביים
label_open_issues: פותח
label_open_issues: פתוח
label_open_issues_plural: פתוחים
label_closed_issues: סגור
label_closed_issues_plural: סגורים
@@ -308,7 +308,7 @@ label_used_by: בשימוש ע"י
label_details: פרטים
label_add_note: הוסף הערה
label_per_page: לכל דף
label_calendar: לו"ח שנה
label_calendar: לוח שנה
label_months_from: חודשים מ
label_gantt: גאנט
label_internal: פנימי
@@ -357,7 +357,7 @@ label_sort_higher: הזז למעלה
label_sort_lower: הזז למטה
label_sort_lowest: הזז לתחתית
label_roadmap: מפת הדרכים
label_roadmap_due_in: %s נגמר בעוד
label_roadmap_due_in: נגמר בעוד %s
label_roadmap_overdue: %s מאחר
label_roadmap_no_issues: אין נושאים לגירסא זו
label_search: חפש
@@ -421,8 +421,8 @@ label_send_information: שלח מידע על חשבון למשתמש
label_year: שנה
label_month: חודש
label_week: שבוע
label_date_from: מאת
label_date_to: אל
label_date_from: מתאריך
label_date_to: עד
label_language_based: מבוסס שפה
label_sort_by: מין לפי %s
label_send_test_email: שלח דו"ל בדיקה
@@ -487,7 +487,7 @@ text_journal_set_to: שונה ל %s
text_journal_deleted: נמחק
text_tip_task_begin_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_caracters_maximum: מקסימום %d תווים.
text_length_between: אורך בין %d ל %d תווים.
@@ -618,79 +618,79 @@ label_overall_activity: פעילות כוללת
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
label_planning: תכנון
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
label_and_its_subprojects: %s and its subprojects
mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
mail_subject_reminder: "%d issue(s) due in the next days"
text_user_wrote: '%s wrote:'
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM
text_enumeration_category_reassign_to: 'Reassign them to this value:'
text_enumeration_destroy_question: '%d objects are assigned to this value.'
label_incoming_emails: Incoming emails
label_generate_key: Generate a key
text_subprojects_destroy_warning: 'תת הפרויקט\ים: %s ימחקו גם כן.'
label_and_its_subprojects: %s וכל תת הפרויקטים שלו
mail_body_reminder: "%d נושאים שמיועדים אליך מיועדים להגשה בתוך %d ימים:"
mail_subject_reminder: "%d נושאים מיעדים להגשה בימים הקרובים"
text_user_wrote: '%s כתב:'
label_duplicated_by: שוכפל ע"י
setting_enabled_scm: אפשר SCM
text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:'
text_enumeration_destroy_question: '%d אוביקטים מוצבים לערך זה.'
label_incoming_emails: דוא"ל נכנס
label_generate_key: יצר מפתח
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."
field_parent_title: Parent page
label_issue_watchers: Watchers
field_parent_title: דף אב
label_issue_watchers: צופים
setting_commit_logs_encoding: Commit messages encoding
button_quote: Quote
button_quote: צטט
setting_sequential_project_identifiers: Generate sequential project identifiers
notice_unable_delete_version: Unable to delete version
label_renamed: renamed
label_copied: copied
setting_plain_text_mail: plain text only (no HTML)
permission_view_files: View files
permission_edit_issues: Edit issues
permission_edit_own_time_entries: Edit own time logs
permission_manage_public_queries: Manage public queries
permission_add_issues: Add issues
permission_log_time: Log spent time
permission_view_changesets: View changesets
permission_view_time_entries: View spent time
permission_manage_versions: Manage versions
permission_manage_wiki: Manage wiki
permission_manage_categories: Manage issue categories
permission_protect_wiki_pages: Protect wiki pages
permission_comment_news: Comment news
permission_delete_messages: Delete messages
permission_select_project_modules: Select project modules
permission_manage_documents: Manage documents
permission_edit_wiki_pages: Edit wiki pages
permission_add_issue_watchers: Add watchers
permission_view_gantt: View gantt chart
permission_move_issues: Move issues
permission_manage_issue_relations: Manage issue relations
permission_delete_wiki_pages: Delete wiki pages
permission_manage_boards: Manage boards
permission_delete_wiki_pages_attachments: Delete attachments
permission_view_wiki_edits: View wiki history
permission_add_messages: Post messages
permission_view_messages: View messages
permission_manage_files: Manage files
permission_edit_issue_notes: Edit notes
permission_manage_news: Manage news
permission_view_calendar: View calendrier
permission_manage_members: Manage members
permission_edit_messages: Edit messages
permission_delete_issues: Delete issues
permission_view_issue_watchers: View watchers list
permission_manage_repository: Manage repository
notice_unable_delete_version: לא ניתן למחוק גירסא
label_renamed: השם שונה
label_copied: הועתק
setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML)
permission_view_files: צפה בקבצים
permission_edit_issues: ערוך נושאים
permission_edit_own_time_entries: ערוך את לוג הזמן של עצמך
permission_manage_public_queries: נהל שאילתות פומביות
permission_add_issues: הוסף נושא
permission_log_time: תעד זמן שבוזבז
permission_view_changesets: צפה בקבוצות שינויים
permission_view_time_entries: צפה בזמן שבוזבז
permission_manage_versions: נהל גירסאות
permission_manage_wiki: נהל wiki
permission_manage_categories: נהל קטגוריות נושאים
permission_protect_wiki_pages: הגן כל דפי wiki
permission_comment_news: הגב על החדשות
permission_delete_messages: מחק הודעות
permission_select_project_modules: בחר מודולי פרויקט
permission_manage_documents: נהל מסמכים
permission_edit_wiki_pages: ערוך דפי wiki
permission_add_issue_watchers: הוסף צופים
permission_view_gantt: צפה בגאנט
permission_move_issues: הזז נושאים
permission_manage_issue_relations: נהל יחס בין נושאים
permission_delete_wiki_pages: מחק דפי wiki
permission_manage_boards: נהל לוחות
permission_delete_wiki_pages_attachments: מחק דבוקות
permission_view_wiki_edits: צפה בהיסטורית wiki
permission_add_messages: הצב הודעות
permission_view_messages: צפה בהודעות
permission_manage_files: נהל קבצים
permission_edit_issue_notes: ערוך רשימות
permission_manage_news: נהל חדשות
permission_view_calendar: צפה בלוח השנה
permission_manage_members: נהל חברים
permission_edit_messages: ערוך הודעות
permission_delete_issues: מחק נושאים
permission_view_issue_watchers: צפה ברשימה צופים
permission_manage_repository: נהל מאגר
permission_commit_access: Commit access
permission_browse_repository: Browse repository
permission_view_documents: View documents
permission_edit_project: Edit project
permission_browse_repository: סייר במאגר
permission_view_documents: צפה במסמכים
permission_edit_project: ערוך פרויקט
permission_add_issue_notes: Add notes
permission_save_queries: Save queries
permission_view_wiki_pages: View wiki
permission_rename_wiki_pages: Rename wiki pages
permission_edit_time_entries: Edit time logs
permission_save_queries: שמור שאילתות
permission_view_wiki_pages: צפה ב-wiki
permission_rename_wiki_pages: שנה שם של דפי wiki
permission_edit_time_entries: ערוך רישום זמנים
permission_edit_own_issue_notes: Edit own notes
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."
permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
permission_edit_own_messages: ערוך הודעות של עצמך
permission_delete_own_messages: מחק הודעות של עצמך
label_user_activity: "הפעילות של %s"
label_updated_time_by: עודכן ע"י %s לפני %s

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_delete_own_messages: Saját üzenetek törlése
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

View File

@@ -694,3 +694,5 @@ permission_edit_own_messages: Modifica propri messaggi
permission_delete_own_messages: Elimina propri messaggi
label_user_activity: "%s's activity"
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -97,7 +97,7 @@ field_mail: 메일
field_filename: 파일
field_filesize: 크기
field_downloads: 다운로드
field_author: 보고
field_author:
field_created_on: 보고시간
field_updated_on: 변경시간
field_field_format: 포맷
@@ -120,18 +120,18 @@ field_subject: 제목
field_due_date: 완료 기한
field_assigned_to: 담당자
field_priority: 우선순위
field_fixed_version: 목표 버전
field_fixed_version: 목표버전
field_user: 사용자
field_role: 역할
field_homepage: 홈페이지
field_is_public: 공개
field_parent: 상위 프로젝트
field_is_in_chlog: 변경이력(changelog)에서 보여지는 일감들
field_is_in_roadmap: 로드맵에서 보여지는 일감들
field_is_in_chlog: 변경이력(changelog)에서 표시할 일감들
field_is_in_roadmap: 로드맵에서표시할 일감들
field_login: 로그인
field_mail_notification: 메일 알림
field_admin: 관리자
field_last_login_on: 최종 접속
field_last_login_on: 마지막 로그인
field_language: 언어
field_effective_date: 일자
field_password: 비밀번호
@@ -188,7 +188,7 @@ setting_commit_ref_keywords: 일감 참조에 사용할 키워드들
setting_commit_fix_keywords: 일감 해결에 사용할 키워드들
setting_autologin: 자동 로그인
setting_date_format: 날짜 형식
setting_cross_project_issue_relations: 프로젝트간 일감에 관을 맺는 것을 허용
setting_cross_project_issue_relations: 프로젝트간 일감에 관을 맺는 것을 허용
setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들
setting_repositories_encodings: 저장소 인코딩
setting_emails_footer: 메일 꼬리
@@ -201,9 +201,9 @@ label_project_new: 새 프로젝트
label_project_plural: 프로젝트
label_project_all: 모든 프로젝트
label_project_latest: 최근 프로젝트
label_issue: 일감 보기
label_issue: 일감
label_issue_new: 새 일감만들기
label_issue_plural: 일감 보기
label_issue_plural: 일감
label_issue_view_all: 모든 일감 보기
label_document: 문서
label_document_new: 새 문서
@@ -243,15 +243,15 @@ label_administration: 관리자
label_login: 로그인
label_logout: 로그아웃
label_help: 도움말
label_reported_issues: 보고 일감
label_reported_issues: 보고 일감
label_assigned_to_me_issues: 나에게 할당된 일감
label_last_login: 최종 접속
label_last_updates: 최종 변경 내역
label_last_updates_plural: 최종변경 %d
label_registered_on: 등록시각
label_activity: 진행중인 작업
label_new: 신규
label_logged_as:
label_activity: 작업내역
label_new: 새로 만들기
label_logged_as: '로그인계정:'
label_environment: 환경
label_authentication: 인증설정
label_auth_source: 인증 모드
@@ -280,7 +280,7 @@ label_attachment_plural: 관련파일
label_report: 보고서
label_report_plural: 보고서
label_news: 뉴스
label_news_new: 뉴스추가
label_news_new: 뉴스
label_news_plural: 뉴스
label_news_latest: 최근 뉴스
label_news_view_all: 모든 뉴스
@@ -298,7 +298,7 @@ label_open_issues: 진행중
label_open_issues_plural: 진행중
label_closed_issues: 완료됨
label_closed_issues_plural: 완료됨
label_total: Total
label_total: 합계
label_permissions: 허가권한
label_current_status: 일감 상태
label_new_statuses_allowed: 허용되는 일감 상태
@@ -307,7 +307,7 @@ label_none: 없음
label_next: 다음
label_previous: 이전
label_used_by: 사용됨
label_details: 상세
label_details: 자세히
label_add_note: 일감덧글 추가
label_per_page: 페이지별
label_calendar: 달력
@@ -316,7 +316,7 @@ label_gantt: Gantt 챠트
label_internal: 내부
label_last_changes: 지난 변경사항 %d 건
label_change_view_all: 모든 변경 내역 보기
label_personalize_page: 입맛대로 구성하기(Drag & Drop)
label_personalize_page: 입맛대로 구성하기
label_comment: 댓글
label_comment_plural: 댓글
label_comment_add: 댓글 추가
@@ -353,7 +353,7 @@ label_latest_revision: 최근 개정판
label_latest_revision_plural: 최근 개정판
label_view_revisions: 개정판 보기
label_max_size: 최대 크기
label_on: 'on'
label_on: '전체: '
label_sort_highest: 최상단으로
label_sort_higher: 위로
label_sort_lower: 아래로
@@ -361,7 +361,7 @@ label_sort_lowest: 최하단으로
label_roadmap: 로드맵
label_roadmap_due_in: 기한 %s
label_roadmap_overdue: %s 지연
label_roadmap_no_issues: 버전에 해당하는 일감 없음
label_roadmap_no_issues: 이 버전에 해당하는 일감 없음
label_search: 검색
label_result_plural: 결과
label_all_words: 모든 단어
@@ -412,19 +412,19 @@ label_disabled: 비활성화
label_show_completed_versions: 완료된 버전 보기
label_me: 나
label_board: 게시판
label_board_new: 신규 게시판
label_board_new: 새 게시판
label_board_plural: 게시판
label_topic_plural: 주제
label_message_plural: 관련글
label_message_last: 최종 글
label_message_last: 마지막 글
label_message_new: 새글쓰기
label_reply_plural: 답글
label_send_information: 사용자에게 계정정보를 보냄
label_year: 년
label_month: 월
label_week: 주
label_date_from: 에서
label_date_to: (으)로
label_date_from: '기간:'
label_date_to: ' ~ '
label_language_based: 언어설정에 따름
label_sort_by: 정렬방법(%s)
label_send_test_email: 테스트 메일 보내기
@@ -533,7 +533,7 @@ default_activity_development: 개발
enumeration_issue_priorities: 일감 우선순위
enumeration_doc_categories: 문서 카테고리
enumeration_activities: 진행활동(시간 추적)
enumeration_activities: 작업분류(시간추적)
button_copy: 복사
mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다.
button_change_password: 비밀번호 변경
@@ -555,7 +555,7 @@ button_annotate: 주석달기(annotate)
label_issues_by: 일감분류 방식 %s
field_searchable: 검색가능
label_display_per_page: '페이지당: %s'
setting_per_page_options: 페이지당 표시할 객
setting_per_page_options: 페이지당 표시할 객
label_age: 마지막 수정일
notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다.
text_load_default_configuration: 기본 설정을 로딩하기
@@ -585,20 +585,20 @@ project_module_files: 관련파일
project_module_documents: 문서
project_module_repository: 저장소
project_module_news: 뉴스
project_module_time_tracking: 진행중인 작업
project_module_time_tracking: 시간추적
text_file_repository_writable: 파일 저장소 쓰기 가능
text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다.
text_rmagick_available: RMagick available (optional)
text_rmagick_available: RMagick 사용가능(옵션)
button_configure: 설정
label_plugins: 플러그인
label_ldap_authentication: LDAP 인증
label_downloads_abbr: D/L
label_add_another_file: 다른 파일 추가
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_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: 올해
text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기
label_date_range: 날짜 범위
@@ -608,15 +608,15 @@ label_optional_description: 부가적인 설명
label_last_month: 지난 달
text_destroy_time_entries: 보고된 시간을 삭제하기
text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:'
setting_activity_days_default: 프로젝트 활동에 보여 날수
setting_activity_days_default: 프로젝트 작업내역에 보여 날수
label_chronological_order: 시간 순으로 정렬
field_comments_sorting: 히스토리 정렬 설정
label_reverse_chronological_order: 시간 역순으로 정렬
label_preferences: Preferences
label_preferences: 설정
setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시
label_overall_activity: 전체 진행 상황
label_overall_activity: 전체 작업내역
setting_default_projects_public: 새 프로젝트를 공개로 설정
error_scm_annotate: "The entry does not exist or can not be annotated."
error_scm_annotate: "항목이 없거나 주석을 달 수 없습니다."
label_planning: 프로젝트계획(Planning)
text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.'
label_and_its_subprojects: %s와 서브프로젝트들
@@ -692,5 +692,7 @@ label_example: 예
text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다."
permission_edit_own_messages: 자기 메시지 편집
permission_delete_own_messages: 자기 메시지 삭제
label_user_activity: "%s의 활동"
label_updated_time_by: Updated by %s %s ago
label_user_activity: "%s의 작업내역"
label_updated_time_by: %s %s 전에 변경
text_diff_truncated: '... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.'
setting_diff_max_lines_displayed: 차이점보기에 표시할 최대 줄수

File diff suppressed because it is too large Load Diff

View File

@@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -632,7 +632,7 @@ setting_autofetch_changesets: Automatyczne pobieranie zmian
setting_autologin: Auto logowanie
setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc)
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_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami
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
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Editar próprias mensagens
permission_delete_own_messages: Excluir próprias mensagens
label_user_activity: "Atividade de %s"
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

View File

@@ -104,8 +104,8 @@ field_name: Nome
field_description: Descrição
field_summary: Sumário
field_is_required: Obrigatório
field_firstname: Nome próprio
field_lastname: Último nome
field_firstname: Nome
field_lastname: Apelido
field_mail: E-mail
field_filename: Ficheiro
field_filesize: Tamanho
@@ -141,7 +141,7 @@ field_is_public: Público
field_parent: Sub-projecto de
field_is_in_chlog: Tarefas mostradas no changelog
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_admin: Administrador
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
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_documents: Documentos
project_module_files: Ficheiros
@@ -440,7 +440,7 @@ label_issue_tracking: Tarefas
label_spent_time: Tempo gasto
label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas
label_time_tracking: Contagem de tempo
label_time_tracking: Registo de tempo
label_change_plural: Mudanças
label_statistics: Estatísticas
label_commits_per_month: Commits por mês
@@ -551,7 +551,7 @@ button_move: Mover
button_back: Voltar
button_cancel: Cancelar
button_activate: Activar
button_sort: Ordernar
button_sort: Ordenar
button_log_time: Tempo de trabalho
button_rollback: Voltar para esta versão
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_caracters_maximum: máximo %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_unallowed_characters: Caracteres não permitidos
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_doc_categories: Categorias de documentos
enumeration_activities: Actividades (Contagem de tempo)
setting_plain_text_mail: plain text only (no HTML)
permission_view_files: View files
permission_edit_issues: Edit issues
permission_edit_own_time_entries: Edit own time logs
permission_manage_public_queries: Manage public queries
permission_add_issues: Add issues
permission_log_time: Log spent time
permission_view_changesets: View changesets
permission_view_time_entries: View spent time
permission_manage_versions: Manage versions
permission_manage_wiki: Manage wiki
permission_manage_categories: Manage issue categories
permission_protect_wiki_pages: Protect wiki pages
permission_comment_news: Comment news
permission_delete_messages: Delete messages
permission_select_project_modules: Select project modules
permission_manage_documents: Manage documents
permission_edit_wiki_pages: Edit wiki pages
permission_add_issue_watchers: Add watchers
permission_view_gantt: View gantt chart
permission_move_issues: Move issues
permission_manage_issue_relations: Manage issue relations
permission_delete_wiki_pages: Delete wiki pages
permission_manage_boards: Manage boards
permission_delete_wiki_pages_attachments: Delete attachments
permission_view_wiki_edits: View wiki history
permission_add_messages: Post messages
permission_view_messages: View messages
permission_manage_files: Manage files
permission_edit_issue_notes: Edit notes
permission_manage_news: Manage news
permission_view_calendar: View calendrier
permission_manage_members: Manage members
permission_edit_messages: Edit messages
permission_delete_issues: Delete issues
permission_view_issue_watchers: View watchers list
permission_manage_repository: Manage repository
permission_commit_access: Commit access
permission_browse_repository: Browse repository
permission_view_documents: View documents
permission_edit_project: Edit project
permission_add_issue_notes: Add notes
permission_save_queries: Save queries
permission_view_wiki_pages: View wiki
permission_rename_wiki_pages: Rename wiki pages
permission_edit_time_entries: Edit time logs
permission_edit_own_issue_notes: Edit own notes
setting_gravatar_enabled: Use Gravatar user icons
label_example: Example
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
enumeration_activities: Actividades (Registo de tempo)
setting_plain_text_mail: Apenas texto simples (sem HTML)
permission_view_files: Ver ficheiros
permission_edit_issues: Editar tarefas
permission_edit_own_time_entries: Editar horas pessoais
permission_manage_public_queries: Gerir queries públicas
permission_add_issues: Adicionar tarefas
permission_log_time: Registar tempo gasto
permission_view_changesets: Ver changesets
permission_view_time_entries: Ver tempo gasto
permission_manage_versions: Gerir versões
permission_manage_wiki: Gerir wiki
permission_manage_categories: Gerir categorias de tarefas
permission_protect_wiki_pages: Proteger páginas de wiki
permission_comment_news: Comentar notícias
permission_delete_messages: Apagar mensagens
permission_select_project_modules: Seleccionar módulos do projecto
permission_manage_documents: Gerir documentos
permission_edit_wiki_pages: Editar páginas de wiki
permission_add_issue_watchers: Adicionar observadores
permission_view_gantt: ver diagrama de Gantt
permission_move_issues: Mover tarefas
permission_manage_issue_relations: Gerir relações de tarefas
permission_delete_wiki_pages: Apagar páginas de wiki
permission_manage_boards: Gerir forums
permission_delete_wiki_pages_attachments: Apagar anexos
permission_view_wiki_edits: Ver histórico da wiki
permission_add_messages: Submeter mensagens
permission_view_messages: Ver mensagens
permission_manage_files: Gerir ficheiros
permission_edit_issue_notes: Editar notas de tarefas
permission_manage_news: Gerir notícias
permission_view_calendar: Ver calendário
permission_manage_members: Gerir membros
permission_edit_messages: Editar mensagens
permission_delete_issues: Apagar tarefas
permission_view_issue_watchers: Ver lista de observadores
permission_manage_repository: Gerir repositório
permission_commit_access: Acesso a submissão
permission_browse_repository: Navegar em repositório
permission_view_documents: Ver documentos
permission_edit_project: Editar projecto
permission_add_issue_notes: Adicionar notas a tarefas
permission_save_queries: Guardar queries
permission_view_wiki_pages: Ver wiki
permission_rename_wiki_pages: Renomear páginas de wiki
permission_edit_time_entries: Editar entradas de tempo
permission_edit_own_issue_notes: Editar as prórpias notas
setting_gravatar_enabled: Utilizar icons Gravatar
label_example: Exemplo
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: Editar as próprias mensagens
permission_delete_own_messages: Apagar as próprias mensagens
label_user_activity: "Actividade de %s"
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

View File

@@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -518,7 +518,8 @@ label_total: Всего
label_tracker_new: Новый трекер
label_tracker_plural: Трекеры
label_tracker: Трекер
label_updated_time: Обновлен %s назад
label_updated_time: Обновлено %s назад
label_updated_time_by: Обновлено %s %s назад
label_used_by: Используется
label_user_activity: "Активность пользователя %s"
label_user_mail_no_self_notified: "Не извещать об изменениях, которые я сделал сам"
@@ -652,6 +653,7 @@ setting_cross_project_issue_relations: Разрешить пересечение
setting_date_format: Формат даты
setting_default_language: Язык по умолчанию
setting_default_projects_public: Новые проекты являются общедоступными
setting_diff_max_lines_displayed: Максимальное число строк для diff
setting_display_subprojects_issues: Отображение подпроектов по умолчанию
setting_emails_footer: Подстрочные примечания Email
setting_enabled_scm: Разрешенные SCM
@@ -689,6 +691,7 @@ text_comma_separated: Допустимы несколько значений (ч
text_default_administrator_account_changed: Учетная запись администратора по умолчанию изменена
text_destroy_time_entries_question: Вы собираетесь удалить %.02f часа(ов) прикрепленных за этой задачей.
text_destroy_time_entries: Удалить зарегистрированное время
text_diff_truncated: '... Этот diff ограничен, так как превышает максимальный отображаемый размер.'
text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/email.yml. Для применения изменений перезапустите приложение."
text_enumeration_category_reassign_to: 'Назначить им следующее значение:'
text_enumeration_destroy_question: '%d объект(а,ов) связаны с этим значением.'
@@ -727,4 +730,3 @@ text_user_wrote: '%s написал(а):'
text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое?
text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
label_updated_time_by: Updated by %s %s ago

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."
label_user_activity: "%s's activity"
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

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."
label_user_activity: "%s's activity"
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

File diff suppressed because it is too large Load Diff

View File

@@ -697,3 +697,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

View File

@@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
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

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
label_user_activity: "%s's activity"
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

View File

@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 啟用處理傳入電子郵件的服務
setting_mail_handler_api_key: API 金鑰
setting_sequential_project_identifiers: 循序產生專案識別碼
setting_gravatar_enabled: 啟用 Gravatar 全球認證大頭像
setting_diff_max_lines_displayed: 差異顯示行數之最大值
permission_edit_project: 編輯專案
permission_select_project_modules: 選擇專案模組
@@ -556,7 +557,7 @@ label_theme: 畫面主題
label_default: 預設
label_search_titles_only: 僅搜尋標題
label_user_mail_option_all: "提醒與我的專案有關的所有事件"
label_user_mail_option_selected: "只醒我所選擇專案中的事件..."
label_user_mail_option_selected: "只醒我所選擇專案中的事件..."
label_user_mail_option_none: "只提醒我觀察中或參與中的事件"
label_user_mail_no_self_notified: "不提醒我自己所做的變更"
label_registration_activation_by_email: 透過電子郵件啟用帳戶
@@ -670,6 +671,7 @@ text_enumeration_destroy_question: '目前有 %d 個物件使用此列舉值。'
text_enumeration_category_reassign_to: '重新設定其列舉值為:'
text_email_delivery_not_configured: "您尚未設定電子郵件傳送方式,因此提醒選項已被停用。\n請在 config/email.yml 中設定 SMTP 之後,重新啟動 Redmine以啟用電子郵件提醒選項。"
text_repository_usernames_mapping: "選擇或更新 Redmine 使用者與版本庫使用者之對應關係。\n版本庫中之使用者帳號或電子郵件信箱與 Redmine 設定相同者,將自動產生對應關係。"
text_diff_truncated: '... 這份差異已被截短以符合顯示行數之最大值'
default_role_manager: 管理人員
default_role_developper: 開發人員

View File

@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 启用用于接收邮件的服务
setting_mail_handler_api_key: API key
setting_sequential_project_identifiers: 顺序产生项目标识
setting_gravatar_enabled: 使用Gravatar用户头像
setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数
permission_edit_project: 编辑项目
permission_select_project_modules: 选择项目模块
@@ -544,7 +545,8 @@ label_send_test_email: 发送测试邮件
label_feeds_access_key_created_on: RSS 存取键是在 %s 之前建立的
label_module_plural: 模块
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_file_plural: 文件
label_changeset_plural: 变更
@@ -669,6 +671,7 @@ text_enumeration_category_reassign_to: '将它们关联到新的枚举值:'
text_enumeration_destroy_question: '%d 个对象被关联到了这个枚举值。'
text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/email.yml中配置您的SMTP服务器信息并重新启动以使其生效。"
text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Redmine用户。\n版本库中与Redmine中的同名用户将被自动对应。"
text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断'
default_role_manager: 管理人员
default_role_developper: 开发人员
@@ -695,4 +698,3 @@ default_activity_development: 开发
enumeration_issue_priorities: 问题优先级
enumeration_doc_categories: 文档类别
enumeration_activities: 活动(时间跟踪)
label_updated_time_by: Updated by %s %s ago

View File

@@ -382,14 +382,14 @@ class RedCloth3 < String
(#{rcq})
(#{C})
(?::(\S+?))?
([^\s\-].*?[^\s\-]|\w)
(\w|[^\s\-].*?[^\s\-])
#{rcq}
(?=[[:punct:]]|\s|\)|$)/x
else
/(#{rcq})
(#{C})
(?::(\S+))?
([^\s\-].*?[^\s\-]|\w)
(\w|[^\s\-].*?[^\s\-])
#{rcq}/xm
end
[rc, ht, re, rtype]
@@ -408,7 +408,7 @@ class RedCloth3 < String
# [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '&#8221;' ], # double closing
# [ /"/, '&#8220;' ], # double opening
# [ /\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)?\s?--\s?/, '\1&#8212;' ], # em dash
# [ /\s->\s/, ' &rarr; ' ], # right arrow
@@ -435,19 +435,25 @@ class RedCloth3 < String
#
# Flexible HTML escaping
#
def htmlesc( str, mode )
def htmlesc( str, mode=:Quotes )
if str
str.gsub!( '&', '&amp;' )
str.gsub!( '"', '&quot;' ) if mode != :NoQuotes
str.gsub!( "'", '&#039;' ) if mode == :Quotes
str.gsub!( '<', '&lt;')
str.gsub!( '>', '&gt;')
end
str
end
# Search and replace for Textile glyphs (quotes, dashes, other symbols)
def pgl( text )
GLYPHS.each do |re, resub, tog|
next if tog and method( tog ).call
text.gsub! re, resub
#GLYPHS.each do |re, resub, tog|
# next if tog and method( tog ).call
# 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
@@ -464,8 +470,7 @@ class RedCloth3 < String
style << "vertical-align:#{ v_align( $& ) };" if text =~ A_VLGN
end
style << "#{ $1 };" if not filter_styles and
text.sub!( /\{([^}]*)\}/, '' )
style << "#{ htmlesc $1 };" if text.sub!( /\{([^}]*)\}/, '' ) && !filter_styles
lang = $1 if
text.sub!( /\[([^)]+?)\]/, '' )
@@ -807,7 +812,7 @@ class RedCloth3 < String
end
atts = pba( atts )
atts = " href=\"#{ url }#{ slash }\"#{ atts }"
atts << " title=\"#{ title }\"" if title
atts << " title=\"#{ htmlesc title }\"" if title
atts = shelve( atts ) if atts
external = (url =~ /^https?:\/\//) ? ' class="external"' : ''
@@ -914,6 +919,7 @@ class RedCloth3 < String
def inline_textile_image( text )
text.gsub!( IMAGE_RE ) do |m|
stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8]
htmlesc title
atts = pba( atts )
atts = " src=\"#{ url }\"#{ atts }"
atts << " title=\"#{ title }\"" if title

View File

@@ -63,7 +63,7 @@ module Redmine
logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'"
path_with_project="#{url}#{with_leading_slash(path)}"
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 << " #{shell_quote path_with_project}"
shellout(cmd) do |io|

View File

@@ -18,18 +18,30 @@
module Redmine
# Class used to parse unified diffs
class UnifiedDiff < Array
def initialize(diff, type="inline")
diff_table = DiffTable.new type
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 =~ /^(---|\+\+\+) (.*)$/
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
a = diff_table.add_line line
end
self << diff_table unless diff_table.empty?
self
end
def truncated?; @truncated; end
end
# Class that represents a file diff

View File

@@ -3,14 +3,14 @@ require 'rexml/document'
module Redmine
module VERSION #:nodoc:
MAJOR = 0
MINOR = 7
TINY = 3
MINOR = 8
TINY = 0
# Branch values:
# * official release: nil
# * stable branch: stable
# * trunk: devel
BRANCH = 'devel'
BRANCH = 'stable'
def self.revision
revision = nil

View File

@@ -30,6 +30,7 @@ module Redmine
super
self.hard_breaks=true
self.no_span_caps=true
self.filter_styles=true
end
def to_html(*rules, &block)

View File

@@ -79,23 +79,23 @@ Calendar._SMN = new Array
// tooltips
Calendar._TT = {};
Calendar._TT["INFO"] = "About the calendar";
Calendar._TT["INFO"] = "이 달력은 ... & 도움말";
Calendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"DHTML 날짜/시간 선택기\n" +
"(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" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
"최신 버전을 구하려면 여기로: http://www.dynarch.com/projects/calendar/\n" +
"배포라이센스:GNU LGPL. 참조:http://gnu.org/licenses/lgpl.html for details." +
"\n\n" +
"Date selection:\n" +
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
"날짜 선택:\n" +
"- 해를 선택하려면 \xab, \xbb 버튼을 사용하세요.\n" +
"- 달을 선택하려면 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 버튼을 사용하세요.\n" +
"- 좀 더 빠르게 선택하려면 위의 버튼을 꾹 눌러주세요.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
"시간 선택:\n" +
"- 시, 분을 더하려면 클릭하세요.\n" +
"- 시, 분을 빼려면 쉬프트 누르고 클릭하세요.\n" +
"- 좀 더 빠르게 선택하려면 클릭하고 드래그하세요.";
Calendar._TT["PREV_YEAR"] = "이전 해";
Calendar._TT["PREV_MONTH"] = "이전 달";
@@ -117,11 +117,11 @@ Calendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "닫기";
Calendar._TT["TODAY"] = "오늘";
Calendar._TT["TIME_PART"] = "(Shift-)클릭 or drag to change value";
Calendar._TT["TIME_PART"] = "클릭(+),쉬프트+클릭(-),드래그";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
Calendar._TT["WK"] = "주";
Calendar._TT["TIME"] = "Time:";
Calendar._TT["TIME"] = "시간:";

View File

@@ -48,7 +48,7 @@ ContextMenu.prototype = {
if (window.opera && e.altKey) { return; }
if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {
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
var box = Event.findElement(e, 'input');
if (box!=document && box!=undefined) {

View File

@@ -1,16 +1,16 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';
jsToolBar.strings['Strong'] = '굵게';
jsToolBar.strings['Italic'] = '기울임';
jsToolBar.strings['Underline'] = '밑줄';
jsToolBar.strings['Deleted'] = '취소선';
jsToolBar.strings['Code'] = '코드';
jsToolBar.strings['Heading 1'] = '제목 1';
jsToolBar.strings['Heading 2'] = '제목 2';
jsToolBar.strings['Heading 3'] = '제목 3';
jsToolBar.strings['Unordered list'] = '글머리 기호';
jsToolBar.strings['Ordered list'] = '번호 매기기';
jsToolBar.strings['Quote'] = '인용';
jsToolBar.strings['Unquote'] = '인용 취소';
jsToolBar.strings['Preformatted text'] = '있는 그대로 표현 (Preformatted text)';
jsToolBar.strings['Wiki link'] = 'Wiki 페이지에 연결';
jsToolBar.strings['Image'] = '그림';

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; }
* 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>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 #content{ width: auto; border-right: 0; }

79
test/fixtures/diffs/subversion.diff vendored Normal file
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

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>

View File

@@ -32,10 +32,19 @@ class DocumentsControllerTest < Test::Unit::TestCase
end
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'
assert_response :success
assert_template 'index'
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
def test_new_with_one_attachment

View File

@@ -137,6 +137,16 @@ class IssuesControllerTest < Test::Unit::TestCase
assert_not_nil assigns(:issues)
assert_equal 'application/pdf', @response.content_type
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
get :gantt, :project_id => 1

View File

@@ -73,12 +73,12 @@ class RepositoriesControllerTest < Test::Unit::TestCase
assert_tag :td, :content => 'dlopper',
:sibling => { :tag => 'td',
:child => { :tag => 'select', :attributes => { :name => 'committers[dlopper]' },
:child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} },
:child => { :tag => 'option', :content => 'Dave Lopper',
:attributes => { :value => '3', :selected => 'selected' }}}}
assert_tag :td, :content => 'foo',
:sibling => { :tag => 'td',
:child => { :tag => 'select', :attributes => { :name => 'committers[foo]' }}}
:child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }}}
assert_no_tag :td, :content => 'foo',
:sibling => { :tag => 'td',
: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.')
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_equal User.find(2), c.reload.user
end

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
end
end
def test_history_of_non_existing_page_should_return_404
get :history, :id => 1, :page => 'Unknown_page'
assert_response 404
end
end

View File

@@ -44,7 +44,7 @@ class AccountTest < ActionController::IntegrationTest
assert_response :success
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"
token = Token.find(:first)

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

View File

@@ -37,6 +37,43 @@ class EnumerationTest < Test::Unit::TestCase
assert !Enumeration.find(7).in_use?
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
Enumeration.find(4).destroy(Enumeration.find(6))
assert_nil Issue.find(:first, :conditions => {:priority_id => 4})

View File

@@ -69,11 +69,23 @@ class ApplicationHelperTest < HelperTestCase
'!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>',
'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) }
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
to_test = {
'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 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 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",
# 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"
@@ -239,7 +252,10 @@ EXPECTED
def test_text_formatting
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) }
end

View File

@@ -190,4 +190,11 @@ class IssueTest < Test::Unit::TestCase
assert_nil Issue.find_by_id(1)
assert_nil TimeEntry.find_by_issue_id(1)
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

View File

@@ -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

View File

@@ -129,6 +129,15 @@ class MailHandlerTest < Test::Unit::TestCase
assert_match /This is reply/, journal.notes
assert_equal IssueStatus.find_by_name("Resolved"), issue.status
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

View File

@@ -53,6 +53,12 @@ class RepositoryCvsTest < Test::Unit::TestCase
@repository.fetch_changesets
assert_equal 5, @repository.changesets.count
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
puts "CVS test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end

View File

@@ -158,4 +158,10 @@ class UserTest < Test::Unit::TestCase
@jsmith.pref.comments_sorting = 'desc'
assert @jsmith.wants_comments_in_reverse_order?
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

View File

@@ -1,7 +1,7 @@
require 'action_web_service'
# 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
require 'action_web_service/test_invoke' if ENV['RAILS_ENV'] && ENV['RAILS_ENV'] =~ /^test/

View File

@@ -73,7 +73,7 @@ module Redmine
end
with_scope(:find => scope_options) do
find(:all, provider_options[:find_options])
find(:all, provider_options[:find_options].dup)
end
end
end

View File

@@ -97,8 +97,8 @@ module ActionController
"Unknown options: #{unknown_option_keys.join(', ')}" unless
unknown_option_keys.empty?
options[:singular_name] ||= Inflector.singularize(collection_id.to_s)
options[:class_name] ||= Inflector.camelize(options[:singular_name])
options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s)
options[:class_name] ||= ActiveSupport::Inflector.camelize(options[:singular_name])
end
# 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