Compare commits
18 Commits
2.1-stable
...
0.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5ac5000e5 | ||
|
|
56318aab53 | ||
|
|
babb14dd94 | ||
|
|
3b90141543 | ||
|
|
bce764d9bc | ||
|
|
b65d546245 | ||
|
|
9f12151ac0 | ||
|
|
78cac6f02b | ||
|
|
16b85bda32 | ||
|
|
733987fbb6 | ||
|
|
7389b4bed0 | ||
|
|
4570fcb7a2 | ||
|
|
0a709660d2 | ||
|
|
633e026e44 | ||
|
|
618ab6004e | ||
|
|
644f03b834 | ||
|
|
1154141ee7 | ||
|
|
bf42d9b706 |
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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' }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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| %>
|
||||
|
||||
@@ -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? %>
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -%>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 })
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -%>
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -61,6 +61,9 @@ protocol:
|
||||
feeds_limit:
|
||||
format: int
|
||||
default: 15
|
||||
diff_max_lines_displayed:
|
||||
format: int
|
||||
default: 1500
|
||||
enabled_scm:
|
||||
serialized: true
|
||||
default:
|
||||
|
||||
190
doc/CHANGELOG
190
doc/CHANGELOG
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
82
lang/es.yml
82
lang/es.yml
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
148
lang/he.yml
148
lang/he.yml
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
70
lang/ko.yml
70
lang/ko.yml
@@ -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: 차이점보기에 표시할 최대 줄수
|
||||
|
||||
1136
lang/lt.yml
1136
lang/lt.yml
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
126
lang/pt.yml
126
lang/pt.yml
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
776
lang/sv.yml
776
lang/sv.yml
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: 開發人員
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}])/, '”' ], # double closing
|
||||
# [ /"/, '“' ], # double opening
|
||||
# [ /\b( )?\.{3}/, '\1…' ], # 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—' ], # em dash
|
||||
# [ /\s->\s/, ' → ' ], # 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!( '&', '&' )
|
||||
str.gsub!( '"', '"' ) if mode != :NoQuotes
|
||||
str.gsub!( "'", ''' ) if mode == :Quotes
|
||||
str.gsub!( '<', '<')
|
||||
str.gsub!( '>', '>')
|
||||
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
|
||||
|
||||
@@ -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|
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"] = "시간:";
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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'] = '그림';
|
||||
|
||||
@@ -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
79
test/fixtures/diffs/subversion.diff
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
Index: app/views/settings/_general.rhtml
|
||||
===================================================================
|
||||
--- app/views/settings/_general.rhtml (revision 2094)
|
||||
+++ app/views/settings/_general.rhtml (working copy)
|
||||
@@ -48,6 +48,9 @@
|
||||
<p><label><%= l(:setting_feeds_limit) %></label>
|
||||
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
|
||||
|
||||
+<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
|
||||
+<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
|
||||
+
|
||||
<p><label><%= l(:setting_gravatar_enabled) %></label>
|
||||
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
|
||||
</div>
|
||||
Index: app/views/common/_diff.rhtml
|
||||
===================================================================
|
||||
--- app/views/common/_diff.rhtml (revision 2111)
|
||||
+++ app/views/common/_diff.rhtml (working copy)
|
||||
@@ -1,4 +1,5 @@
|
||||
-<% Redmine::UnifiedDiff.new(diff, :type => diff_type).each do |table_file| -%>
|
||||
+<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
|
||||
+<% diff.each do |table_file| -%>
|
||||
<div class="autoscroll">
|
||||
<% if diff_type == 'sbs' -%>
|
||||
<table class="filecontent CodeRay">
|
||||
@@ -62,3 +63,5 @@
|
||||
|
||||
</div>
|
||||
<% end -%>
|
||||
+
|
||||
+<%= l(:text_diff_truncated) if diff.truncated? %>
|
||||
Index: lang/lt.yml
|
||||
===================================================================
|
||||
--- config/settings.yml (revision 2094)
|
||||
+++ config/settings.yml (working copy)
|
||||
@@ -61,6 +61,9 @@
|
||||
feeds_limit:
|
||||
format: int
|
||||
default: 15
|
||||
+diff_max_lines_displayed:
|
||||
+ format: int
|
||||
+ default: 1500
|
||||
enabled_scm:
|
||||
serialized: true
|
||||
default:
|
||||
Index: lib/redmine/unified_diff.rb
|
||||
===================================================================
|
||||
--- lib/redmine/unified_diff.rb (revision 2110)
|
||||
+++ lib/redmine/unified_diff.rb (working copy)
|
||||
@@ -19,8 +19,11 @@
|
||||
# Class used to parse unified diffs
|
||||
class UnifiedDiff < Array
|
||||
def initialize(diff, options={})
|
||||
+ options.assert_valid_keys(:type, :max_lines)
|
||||
diff_type = options[:type] || 'inline'
|
||||
|
||||
+ lines = 0
|
||||
+ @truncated = false
|
||||
diff_table = DiffTable.new(diff_type)
|
||||
diff.each do |line|
|
||||
if line =~ /^(---|\+\+\+) (.*)$/
|
||||
@@ -28,10 +31,17 @@
|
||||
diff_table = DiffTable.new(diff_type)
|
||||
end
|
||||
diff_table.add_line line
|
||||
+ lines += 1
|
||||
+ if options[:max_lines] && lines > options[:max_lines]
|
||||
+ @truncated = true
|
||||
+ break
|
||||
+ end
|
||||
end
|
||||
self << diff_table unless diff_table.empty?
|
||||
self
|
||||
end
|
||||
+
|
||||
+ def truncated?; @truncated; end
|
||||
end
|
||||
|
||||
# Class that represents a file diff
|
||||
22
test/fixtures/mail_handler/ticket_html_only.eml
vendored
Normal file
22
test/fixtures/mail_handler/ticket_html_only.eml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
x-sender: <jsmith@somenet.foo>
|
||||
x-receiver: <redmine@somenet.foo>
|
||||
Received: from [127.0.0.1] ([127.0.0.1]) by somenet.foo with Quick 'n Easy Mail Server SMTP (1.0.0.0);
|
||||
Sun, 14 Dec 2008 16:18:06 GMT
|
||||
Message-ID: <494531B9.1070709@somenet.foo>
|
||||
Date: Sun, 14 Dec 2008 17:18:01 +0100
|
||||
From: "John Smith" <jsmith@somenet.foo>
|
||||
User-Agent: Thunderbird 2.0.0.18 (Windows/20081105)
|
||||
MIME-Version: 1.0
|
||||
To: redmine@somenet.foo
|
||||
Subject: HTML email
|
||||
Content-Type: text/html; charset=ISO-8859-1
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
</head>
|
||||
<body bgcolor="#ffffff" text="#000000">
|
||||
This is a <b>html-only</b> email.<br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -32,10 +32,19 @@ class DocumentsControllerTest < Test::Unit::TestCase
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
37
test/unit/document_test.rb
Normal file
37
test/unit/document_test.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
# Redmine - project management software
|
||||
# Copyright (C) 2006-2008 Jean-Philippe Lang
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
require File.dirname(__FILE__) + '/../test_helper'
|
||||
|
||||
class DocumentTest < Test::Unit::TestCase
|
||||
fixtures :projects, :enumerations, :documents
|
||||
|
||||
def test_create
|
||||
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
|
||||
assert doc.save
|
||||
end
|
||||
|
||||
def test_create_with_default_category
|
||||
# Sets a default category
|
||||
e = Enumeration.find_by_name('Technical documentation')
|
||||
e.update_attributes(:is_default => true)
|
||||
|
||||
doc = Document.new(:project => Project.find(1), :title => 'New document')
|
||||
assert_equal e, doc.category
|
||||
assert doc.save
|
||||
end
|
||||
end
|
||||
@@ -37,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})
|
||||
|
||||
@@ -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 "title"" alt="This is a double-quoted "title"" />',
|
||||
}
|
||||
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 "title"">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 "double-quotes"" 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
|
||||
|
||||
@@ -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
|
||||
|
||||
42
test/unit/lib/redmine/unified_diff_test.rb
Normal file
42
test/unit/lib/redmine/unified_diff_test.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
2
vendor/plugins/actionwebservice/init.rb
vendored
2
vendor/plugins/actionwebservice/init.rb
vendored
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user