Compare commits
165 Commits
Author | SHA1 | Date |
---|---|---|
Toshi MARUYAMA | 868e15ff2d | |
Toshi MARUYAMA | 1944473eee | |
Toshi MARUYAMA | e06de47234 | |
Toshi MARUYAMA | a87cc86b99 | |
Toshi MARUYAMA | 6eaba1137a | |
Jean-Philippe Lang | ef4cacdb66 | |
Jean-Philippe Lang | 53deb6ca88 | |
Jean-Philippe Lang | 61776a8b7e | |
Jean-Philippe Lang | 382ca5055a | |
Jean-Philippe Lang | 2d3f3cd9aa | |
Jean-Philippe Lang | bcc5ac38f3 | |
Toshi MARUYAMA | 9875ed9954 | |
Toshi MARUYAMA | 6b33956394 | |
Toshi MARUYAMA | 82fa2cf79a | |
Toshi MARUYAMA | 4276fc306c | |
Toshi MARUYAMA | a599442d05 | |
Jean-Philippe Lang | 9fdd0862f7 | |
Jean-Philippe Lang | ddd6ac8cd4 | |
Jean-Philippe Lang | 613757a83d | |
Jean-Philippe Lang | a4fa0364d4 | |
Jean-Philippe Lang | d197203d79 | |
Jean-Philippe Lang | 43c9d69bf2 | |
Toshi MARUYAMA | 709211cb9c | |
Toshi MARUYAMA | 9eb7f25918 | |
Toshi MARUYAMA | 771dc9b2d6 | |
Toshi MARUYAMA | ee8cf0f12b | |
Toshi MARUYAMA | c6fb9c5f51 | |
Toshi MARUYAMA | 20df9c4dbd | |
Toshi MARUYAMA | 770a296f43 | |
Toshi MARUYAMA | 8c5d88160f | |
Toshi MARUYAMA | a581f35dff | |
Toshi MARUYAMA | 4b1f75e611 | |
Toshi MARUYAMA | 44614b5834 | |
Toshi MARUYAMA | 38fc2e4391 | |
Toshi MARUYAMA | bec603eb9b | |
Toshi MARUYAMA | 3270a3af40 | |
Toshi MARUYAMA | 8c52689d91 | |
Toshi MARUYAMA | c777f75edd | |
Toshi MARUYAMA | ce2b12957f | |
Toshi MARUYAMA | 05d24e64f7 | |
Toshi MARUYAMA | 3c6d46beec | |
Toshi MARUYAMA | 20496b516f | |
Toshi MARUYAMA | 2a1a02f976 | |
Toshi MARUYAMA | e26f35860c | |
Toshi MARUYAMA | a3f57f1cbf | |
Toshi MARUYAMA | cebcd67704 | |
Toshi MARUYAMA | e9399e16d2 | |
Toshi MARUYAMA | 3aeb85bfd5 | |
Toshi MARUYAMA | 66f0a5c2ef | |
Toshi MARUYAMA | 071d2d7f47 | |
Toshi MARUYAMA | 9250994088 | |
Toshi MARUYAMA | 6067bfcd09 | |
Toshi MARUYAMA | 242b440073 | |
Toshi MARUYAMA | bf776b3304 | |
Toshi MARUYAMA | e806f8cc43 | |
Toshi MARUYAMA | 7dca09a135 | |
Toshi MARUYAMA | e475798769 | |
Toshi MARUYAMA | f773219426 | |
Toshi MARUYAMA | e8e9c046af | |
Toshi MARUYAMA | 5d56f0f26f | |
Toshi MARUYAMA | 82de347dfd | |
Toshi MARUYAMA | 3e89c2ff3e | |
Toshi MARUYAMA | 597d042ec2 | |
Toshi MARUYAMA | 5e0d93b689 | |
Jean-Philippe Lang | 01ac064935 | |
Jean-Philippe Lang | 22b2a1f699 | |
Jean-Philippe Lang | 5b8a96472f | |
Toshi MARUYAMA | 1c208fcc86 | |
Jean-Philippe Lang | 25ddc672a1 | |
Jean-Philippe Lang | 64c65463a4 | |
Jean-Philippe Lang | 43d7036051 | |
Jean-Philippe Lang | 4920bb9d4d | |
Jean-Philippe Lang | 380b0515d1 | |
Toshi MARUYAMA | e739628c81 | |
Jean-Philippe Lang | bf37fd9695 | |
Jean-Philippe Lang | 08b96d8b47 | |
Jean-Philippe Lang | 6d5569a46d | |
Jean-Philippe Lang | 7567c3d8b2 | |
Toshi MARUYAMA | cecbb225a2 | |
Toshi MARUYAMA | 279c3a2e9b | |
Toshi MARUYAMA | 2545720afa | |
Toshi MARUYAMA | 971dbfecc0 | |
Toshi MARUYAMA | 92cac9011e | |
Toshi MARUYAMA | 2ec3b3694f | |
Toshi MARUYAMA | 755108566c | |
Toshi MARUYAMA | 3c83d1c646 | |
Toshi MARUYAMA | e4cf210fa2 | |
Toshi MARUYAMA | d1057bc4ad | |
Toshi MARUYAMA | 560bfa6d87 | |
Toshi MARUYAMA | 291de3d03f | |
Toshi MARUYAMA | 4a9d04a767 | |
Toshi MARUYAMA | 5fb5bd0b11 | |
Jean-Philippe Lang | aa9b8ea187 | |
Jean-Philippe Lang | 83ce5c1687 | |
Jean-Philippe Lang | d50ec43dff | |
Jean-Philippe Lang | ddcad64aa2 | |
Toshi MARUYAMA | 429210f03f | |
Toshi MARUYAMA | 74373c1597 | |
Jean-Philippe Lang | 2b0dfe948a | |
Jean-Philippe Lang | 54830abd6b | |
Jean-Philippe Lang | dd70327ce4 | |
Jean-Philippe Lang | 273aa42900 | |
Jean-Philippe Lang | abf24a7d92 | |
Jean-Philippe Lang | 913c8cd2e6 | |
Jean-Philippe Lang | f4e5025aed | |
Jean-Philippe Lang | b29c48717d | |
Toshi MARUYAMA | b109fff281 | |
Toshi MARUYAMA | d352d55f27 | |
Toshi MARUYAMA | d541020982 | |
Jean-Philippe Lang | 509d0fbb5e | |
Jean-Philippe Lang | 716da4622e | |
Jean-Philippe Lang | 0b5e7d2a3c | |
Jean-Philippe Lang | 4bf18a697c | |
Jean-Philippe Lang | b695878193 | |
Jean-Philippe Lang | 4e5bb0e231 | |
Toshi MARUYAMA | b4fd6b47b1 | |
Jean-Philippe Lang | c075626462 | |
Jean-Philippe Lang | 218e5f40a1 | |
Jean-Philippe Lang | 995ae083cd | |
Jean-Philippe Lang | d7729d6d4f | |
Jean-Philippe Lang | 1547119627 | |
Toshi MARUYAMA | 484b13cc94 | |
Toshi MARUYAMA | 23fd067124 | |
Toshi MARUYAMA | f3311cd1ff | |
Toshi MARUYAMA | 9130222480 | |
Toshi MARUYAMA | b772319977 | |
Toshi MARUYAMA | c67043e01c | |
Toshi MARUYAMA | 8a5baf9961 | |
Jean-Philippe Lang | 1d71564d6f | |
Jean-Philippe Lang | 8a2413f3b7 | |
Jean-Philippe Lang | 2641f8ba91 | |
Jean-Philippe Lang | b0ec39fc45 | |
Jean-Philippe Lang | 4c7a76785d | |
Toshi MARUYAMA | 0cf7a27b50 | |
Toshi MARUYAMA | 7b295f379b | |
Toshi MARUYAMA | e266ddb309 | |
Jean-Philippe Lang | 74e434b2f3 | |
Toshi MARUYAMA | 4162d8ec6b | |
Jean-Philippe Lang | b6c794d16b | |
Toshi MARUYAMA | c6f71f727b | |
Toshi MARUYAMA | ad8c02ca82 | |
Jean-Philippe Lang | 8405d57516 | |
Jean-Philippe Lang | 58ff842d34 | |
Jean-Philippe Lang | 98e299857b | |
Jean-Philippe Lang | 9733194cce | |
Jean-Philippe Lang | 411ddaf701 | |
Jean-Philippe Lang | 9b6f53219f | |
Jean-Philippe Lang | 15c85ededd | |
Toshi MARUYAMA | 95e44a2e57 | |
Toshi MARUYAMA | 4dc7bc75b4 | |
Toshi MARUYAMA | 78f9d6d2ce | |
Toshi MARUYAMA | 63a53e17fd | |
Toshi MARUYAMA | b5d80456ac | |
Toshi MARUYAMA | cce92213b0 | |
Toshi MARUYAMA | 14c02f50cc | |
Toshi MARUYAMA | 50ab5ec1b6 | |
Jean-Philippe Lang | e8057d41bb | |
Jean-Philippe Lang | 4a2114c73b | |
Jean-Philippe Lang | 1114bf5e99 | |
Jean-Philippe Lang | 88568da451 | |
Jean-Philippe Lang | ceb7e346a7 | |
Jean-Philippe Lang | b5e19e2d17 | |
Jean-Philippe Lang | 7204f64254 | |
Jean-Philippe Lang | a339deeacd | |
Jean-Philippe Lang | 0b97099f8c |
|
@ -5,8 +5,8 @@ language: ruby
|
|||
rvm:
|
||||
- 1.8.7
|
||||
- 1.9.3
|
||||
- 2.0.0
|
||||
- 2.1.0
|
||||
- 2.0
|
||||
- 2.1
|
||||
- jruby
|
||||
matrix:
|
||||
allow_failures:
|
||||
|
|
7
Gemfile
7
Gemfile
|
@ -1,12 +1,13 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem "rails", "3.2.17"
|
||||
gem "rails", "3.2.18"
|
||||
gem "rake", "~> 10.1.1"
|
||||
gem "jquery-rails", "~> 2.0.2"
|
||||
gem "coderay", "~> 1.1.0"
|
||||
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
|
||||
gem "builder", "3.0.0"
|
||||
gem "request_store"
|
||||
gem "mime-types"
|
||||
gem "awesome_nested_set", "2.1.6"
|
||||
|
||||
# Optional gem for LDAP authentication
|
||||
group :ldap do
|
||||
|
@ -85,7 +86,7 @@ end
|
|||
|
||||
group :test do
|
||||
gem "shoulda", "~> 3.3.2"
|
||||
gem "mocha", ">= 0.14", :require => 'mocha/api'
|
||||
gem "mocha", "~> 1.0.0", :require => 'mocha/api'
|
||||
if RUBY_VERSION >= '1.9.3'
|
||||
gem "capybara", "~> 2.1.0"
|
||||
gem "selenium-webdriver"
|
||||
|
|
|
@ -44,6 +44,7 @@ class ApplicationController < ActionController::Base
|
|||
unless api_request?
|
||||
super
|
||||
cookies.delete(autologin_cookie_name)
|
||||
self.logged_user = nil
|
||||
render_error :status => 422, :message => "Invalid form authenticity token."
|
||||
end
|
||||
end
|
||||
|
@ -379,7 +380,7 @@ class ApplicationController < ActionController::Base
|
|||
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)})
|
||||
if ((uri.relative? && back_url.match(%r{\A/(\w.*)?\z})) || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
|
||||
redirect_to(back_url)
|
||||
return
|
||||
end
|
||||
|
@ -557,7 +558,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
# Returns a string that can be used as filename value in Content-Disposition header
|
||||
def filename_for_content_disposition(name)
|
||||
request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
|
||||
request.env['HTTP_USER_AGENT'] =~ %r{(MSIE|Trident)} ? ERB::Util.url_encode(name) : name
|
||||
end
|
||||
|
||||
def api_request?
|
||||
|
|
|
@ -55,7 +55,7 @@ class ContextMenusController < ApplicationController
|
|||
|
||||
@options_by_custom_field = {}
|
||||
if @can[:edit]
|
||||
custom_fields = @issues.map(&:available_custom_fields).reduce(:&).reject(&:multiple?)
|
||||
custom_fields = @issues.map(&:editable_custom_fields).reduce(:&).reject(&:multiple?)
|
||||
custom_fields.each do |field|
|
||||
values = field.possible_values_options(@projects)
|
||||
if values.present?
|
||||
|
|
|
@ -66,7 +66,7 @@ class JournalsController < ApplicationController
|
|||
text = @issue.description
|
||||
end
|
||||
# Replaces pre blocks with [...]
|
||||
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
|
||||
text = text.to_s.strip.gsub(%r{<pre>(.*?)</pre>}m, '[...]')
|
||||
@content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
|
||||
@content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
|
|
|
@ -113,7 +113,7 @@ class MessagesController < ApplicationController
|
|||
@subject = "RE: #{@subject}" unless @subject.starts_with?('RE:')
|
||||
|
||||
@content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> "
|
||||
@content << @message.content.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
||||
@content << @message.content.to_s.strip.gsub(%r{<pre>(.*?)</pre>}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
||||
end
|
||||
|
||||
def preview
|
||||
|
|
|
@ -411,7 +411,7 @@ class RepositoriesController < ApplicationController
|
|||
commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
|
||||
changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10
|
||||
|
||||
# Remove email adress in usernames
|
||||
# Remove email address in usernames
|
||||
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
|
||||
|
||||
graph = SVG::Graph::BarHorizontal.new(
|
||||
|
|
|
@ -55,6 +55,9 @@ class WatchersController < ApplicationController
|
|||
user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]]
|
||||
@users = User.active.where(:id => user_ids).all
|
||||
end
|
||||
if @users.blank?
|
||||
render :nothing => true
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
|
|
@ -18,40 +18,30 @@
|
|||
class WorkflowsController < ApplicationController
|
||||
layout 'admin'
|
||||
|
||||
before_filter :require_admin, :find_roles, :find_trackers
|
||||
before_filter :require_admin
|
||||
|
||||
def index
|
||||
@workflow_counts = WorkflowTransition.count_by_tracker_and_role
|
||||
end
|
||||
|
||||
def edit
|
||||
@role = Role.find_by_id(params[:role_id]) if params[:role_id]
|
||||
@tracker = Tracker.find_by_id(params[:tracker_id]) if params[:tracker_id]
|
||||
find_trackers_roles_and_statuses_for_edit
|
||||
|
||||
if request.post?
|
||||
WorkflowTransition.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id])
|
||||
(params[:issue_status] || []).each { |status_id, transitions|
|
||||
transitions.each { |new_status_id, options|
|
||||
author = options.is_a?(Array) && options.include?('author') && !options.include?('always')
|
||||
assignee = options.is_a?(Array) && options.include?('assignee') && !options.include?('always')
|
||||
WorkflowTransition.create(:role_id => @role.id, :tracker_id => @tracker.id, :old_status_id => status_id, :new_status_id => new_status_id, :author => author, :assignee => assignee)
|
||||
}
|
||||
}
|
||||
if @role.save
|
||||
if request.post? && @roles && @trackers && params[:transitions]
|
||||
transitions = params[:transitions].deep_dup
|
||||
transitions.each do |old_status_id, transitions_by_new_status|
|
||||
transitions_by_new_status.each do |new_status_id, transition_by_rule|
|
||||
transition_by_rule.reject! {|rule, transition| transition == 'no_change'}
|
||||
end
|
||||
end
|
||||
WorkflowTransition.replace_transitions(@trackers, @roles, transitions)
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
redirect_to workflows_edit_path(:role_id => @role, :tracker_id => @tracker, :used_statuses_only => params[:used_statuses_only])
|
||||
redirect_to_referer_or workflows_edit_path
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
|
||||
if @tracker && @used_statuses_only && @tracker.issue_statuses.any?
|
||||
@statuses = @tracker.issue_statuses
|
||||
end
|
||||
@statuses ||= IssueStatus.sorted.all
|
||||
|
||||
if @tracker && @role && @statuses.any?
|
||||
workflows = WorkflowTransition.where(:role_id => @role.id, :tracker_id => @tracker.id).all
|
||||
if @trackers && @roles && @statuses.any?
|
||||
workflows = WorkflowTransition.where(:role_id => @roles.map(&:id), :tracker_id => @trackers.map(&:id))
|
||||
@workflows = {}
|
||||
@workflows['always'] = workflows.select {|w| !w.author && !w.assignee}
|
||||
@workflows['author'] = workflows.select {|w| w.author}
|
||||
|
@ -60,36 +50,31 @@ class WorkflowsController < ApplicationController
|
|||
end
|
||||
|
||||
def permissions
|
||||
@role = Role.find_by_id(params[:role_id]) if params[:role_id]
|
||||
@tracker = Tracker.find_by_id(params[:tracker_id]) if params[:tracker_id]
|
||||
find_trackers_roles_and_statuses_for_edit
|
||||
|
||||
if request.post? && @role && @tracker
|
||||
WorkflowPermission.replace_permissions(@tracker, @role, params[:permissions] || {})
|
||||
if request.post? && @roles && @trackers && params[:permissions]
|
||||
permissions = params[:permissions].deep_dup
|
||||
permissions.each { |field, rule_by_status_id|
|
||||
rule_by_status_id.reject! {|status_id, rule| rule == 'no_change'}
|
||||
}
|
||||
WorkflowPermission.replace_permissions(@trackers, @roles, permissions)
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
redirect_to workflows_permissions_path(:role_id => @role, :tracker_id => @tracker, :used_statuses_only => params[:used_statuses_only])
|
||||
redirect_to_referer_or workflows_permissions_path
|
||||
return
|
||||
end
|
||||
|
||||
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
|
||||
if @tracker && @used_statuses_only && @tracker.issue_statuses.any?
|
||||
@statuses = @tracker.issue_statuses
|
||||
end
|
||||
@statuses ||= IssueStatus.sorted.all
|
||||
|
||||
if @role && @tracker
|
||||
@fields = (Tracker::CORE_FIELDS_ALL - @tracker.disabled_core_fields).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]}
|
||||
@custom_fields = @tracker.custom_fields
|
||||
@permissions = WorkflowPermission.
|
||||
where(:tracker_id => @tracker.id, :role_id => @role.id).inject({}) do |h, w|
|
||||
h[w.old_status_id] ||= {}
|
||||
h[w.old_status_id][w.field_name] = w.rule
|
||||
h
|
||||
end
|
||||
if @roles && @trackers
|
||||
@fields = (Tracker::CORE_FIELDS_ALL - @trackers.map(&:disabled_core_fields).reduce(:&)).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]}
|
||||
@custom_fields = @trackers.map(&:custom_fields).flatten.uniq.sort
|
||||
@permissions = WorkflowPermission.rules_by_status_id(@trackers, @roles)
|
||||
@statuses.each {|status| @permissions[status.id] ||= {}}
|
||||
end
|
||||
end
|
||||
|
||||
def copy
|
||||
@roles = Role.sorted
|
||||
@trackers = Tracker.sorted
|
||||
|
||||
if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any'
|
||||
@source_tracker = nil
|
||||
else
|
||||
|
@ -119,11 +104,37 @@ class WorkflowsController < ApplicationController
|
|||
|
||||
private
|
||||
|
||||
def find_trackers_roles_and_statuses_for_edit
|
||||
find_roles
|
||||
find_trackers
|
||||
find_statuses
|
||||
end
|
||||
|
||||
def find_roles
|
||||
ids = Array.wrap(params[:role_id])
|
||||
if ids == ['all']
|
||||
@roles = Role.sorted.all
|
||||
elsif ids.present?
|
||||
@roles = Role.where(:id => ids).all
|
||||
end
|
||||
@roles = nil if @roles.blank?
|
||||
end
|
||||
|
||||
def find_trackers
|
||||
ids = Array.wrap(params[:tracker_id])
|
||||
if ids == ['all']
|
||||
@trackers = Tracker.sorted.all
|
||||
elsif ids.present?
|
||||
@trackers = Tracker.where(:id => ids).all
|
||||
end
|
||||
@trackers = nil if @trackers.blank?
|
||||
end
|
||||
|
||||
def find_statuses
|
||||
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
|
||||
if @trackers && @used_statuses_only
|
||||
@statuses = @trackers.map(&:issue_statuses).flatten.uniq.sort.presence
|
||||
end
|
||||
@statuses ||= IssueStatus.sorted.all
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,4 +24,12 @@ module AdminHelper
|
|||
[l(:project_status_closed), '5'],
|
||||
[l(:project_status_archived), '9']], selected.to_s)
|
||||
end
|
||||
|
||||
def plugin_data_for_updates(plugins)
|
||||
data = {"v" => Redmine::VERSION.to_s, "p" => {}}
|
||||
plugins.each do |plugin|
|
||||
data["p"].merge! plugin.id => {"v" => plugin.version, "n" => plugin.name, "a" => plugin.author}
|
||||
end
|
||||
data
|
||||
end
|
||||
end
|
||||
|
|
|
@ -158,7 +158,10 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
# Helper that formats object for html or text rendering
|
||||
def format_object(object, html=true)
|
||||
def format_object(object, html=true, &block)
|
||||
if block_given?
|
||||
object = yield object
|
||||
end
|
||||
case object.class.name
|
||||
when 'Array'
|
||||
object.map {|o| format_object(o, html)}.join(', ').html_safe
|
||||
|
@ -188,7 +191,7 @@ module ApplicationHelper
|
|||
if f.nil? || f.is_a?(String)
|
||||
f
|
||||
else
|
||||
format_object(f, html)
|
||||
format_object(f, html, &block)
|
||||
end
|
||||
else
|
||||
object.value.to_s
|
||||
|
@ -819,6 +822,7 @@ module ApplicationHelper
|
|||
elsif sep == ':'
|
||||
# removes the double quotes if any
|
||||
name = identifier.gsub(%r{^"(.*)"$}, "\\1")
|
||||
name = CGI.unescapeHTML(name)
|
||||
case prefix
|
||||
when 'document'
|
||||
if project && document = project.documents.visible.find_by_title(name)
|
||||
|
@ -978,19 +982,20 @@ module ApplicationHelper
|
|||
end
|
||||
end
|
||||
|
||||
TOC_RE = /<p>\{\{([<>]?)toc\}\}<\/p>/i unless const_defined?(:TOC_RE)
|
||||
TOC_RE = /<p>\{\{((<|<)|(>|>))?toc\}\}<\/p>/i unless const_defined?(:TOC_RE)
|
||||
|
||||
# Renders the TOC with given headings
|
||||
def replace_toc(text, headings)
|
||||
text.gsub!(TOC_RE) do
|
||||
left_align, right_align = $2, $3
|
||||
# Keep only the 4 first levels
|
||||
headings = headings.select{|level, anchor, item| level <= 4}
|
||||
if headings.empty?
|
||||
''
|
||||
else
|
||||
div_class = 'toc'
|
||||
div_class << ' right' if $1 == '>'
|
||||
div_class << ' left' if $1 == '<'
|
||||
div_class << ' right' if right_align
|
||||
div_class << ' left' if left_align
|
||||
out = "<ul class=\"#{div_class}\"><li>"
|
||||
root = headings.map(&:first).min
|
||||
current = root
|
||||
|
@ -1327,7 +1332,7 @@ module ApplicationHelper
|
|||
def api_meta(options)
|
||||
if params[:nometa].present? || request.headers['X-Redmine-Nometa']
|
||||
# compatibility mode for activeresource clients that raise
|
||||
# an error when unserializing an array with attributes
|
||||
# an error when deserializing an array with attributes
|
||||
nil
|
||||
else
|
||||
options
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
module ProjectsHelper
|
||||
def link_to_version(version, options = {})
|
||||
return '' unless version && version.is_a?(Version)
|
||||
link_to_if version.visible?, format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, options
|
||||
link_to_if version.visible?, format_version_name(version), version_path(version), options
|
||||
end
|
||||
|
||||
def project_settings_tabs
|
||||
|
@ -51,6 +51,21 @@ module ProjectsHelper
|
|||
content_tag('select', options.html_safe, :name => 'project[parent_id]', :id => 'project_parent_id')
|
||||
end
|
||||
|
||||
def render_project_action_links
|
||||
links = []
|
||||
if User.current.allowed_to?(:add_project, nil, :global => true)
|
||||
links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add')
|
||||
end
|
||||
if User.current.allowed_to?(:view_issues, nil, :global => true)
|
||||
links << link_to(l(:label_issue_view_all), issues_path)
|
||||
end
|
||||
if User.current.allowed_to?(:view_time_entries, nil, :global => true)
|
||||
links << link_to(l(:label_overall_spent_time), time_entries_path)
|
||||
end
|
||||
links << link_to(l(:label_overall_activity), activity_path)
|
||||
links.join(" | ").html_safe
|
||||
end
|
||||
|
||||
# Renders the projects index
|
||||
def render_project_hierarchy(projects)
|
||||
render_project_nested_lists(projects) do |project|
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
module QueriesHelper
|
||||
include ApplicationHelper
|
||||
|
||||
def filters_options_for_select(query)
|
||||
options_for_select(filters_options(query))
|
||||
end
|
||||
|
@ -81,7 +83,7 @@ module QueriesHelper
|
|||
end
|
||||
|
||||
def column_content(column, issue)
|
||||
value = column.value(issue)
|
||||
value = column.value_object(issue)
|
||||
if value.is_a?(Array)
|
||||
value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe
|
||||
else
|
||||
|
@ -110,7 +112,7 @@ module QueriesHelper
|
|||
end
|
||||
|
||||
def csv_content(column, issue)
|
||||
value = column.value(issue)
|
||||
value = column.value_object(issue)
|
||||
if value.is_a?(Array)
|
||||
value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
|
||||
else
|
||||
|
@ -119,22 +121,16 @@ module QueriesHelper
|
|||
end
|
||||
|
||||
def csv_value(column, issue, value)
|
||||
format_object(value, false) do |value|
|
||||
case value.class.name
|
||||
when 'Time'
|
||||
format_time(value)
|
||||
when 'Date'
|
||||
format_date(value)
|
||||
when 'Float'
|
||||
sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
|
||||
when 'IssueRelation'
|
||||
other = value.other_issue(issue)
|
||||
l(value.label_for(issue)) + " ##{other.id}"
|
||||
when 'TrueClass'
|
||||
l(:general_text_Yes)
|
||||
when 'FalseClass'
|
||||
l(:general_text_No)
|
||||
else
|
||||
value.to_s
|
||||
value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -84,12 +84,24 @@ module SettingsHelper
|
|||
|
||||
# Renders a notification field for a Redmine::Notifiable option
|
||||
def notification_field(notifiable)
|
||||
return content_tag(:label,
|
||||
check_box_tag('settings[notified_events][]',
|
||||
tag_data = notifiable.parent.present? ?
|
||||
{:parent_notifiable => notifiable.parent} :
|
||||
{:disables => "input[data-parent-notifiable=#{notifiable.name}]"}
|
||||
|
||||
tag = check_box_tag('settings[notified_events][]',
|
||||
notifiable.name,
|
||||
Setting.notified_events.include?(notifiable.name), :id => nil).html_safe +
|
||||
l_or_humanize(notifiable.name, :prefix => 'label_').html_safe,
|
||||
:class => notifiable.parent.present? ? "parent" : '').html_safe
|
||||
Setting.notified_events.include?(notifiable.name),
|
||||
:id => nil,
|
||||
:data => tag_data)
|
||||
|
||||
text = l_or_humanize(notifiable.name, :prefix => 'label_')
|
||||
|
||||
options = {}
|
||||
if notifiable.parent.present?
|
||||
options[:class] = "parent"
|
||||
end
|
||||
|
||||
content_tag(:label, tag + text, options)
|
||||
end
|
||||
|
||||
def cross_project_subtasks_options
|
||||
|
|
|
@ -18,24 +18,78 @@
|
|||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
module WorkflowsHelper
|
||||
def options_for_workflow_select(name, objects, selected, options={})
|
||||
option_tags = ''.html_safe
|
||||
multiple = false
|
||||
if selected
|
||||
if selected.size == objects.size
|
||||
selected = 'all'
|
||||
else
|
||||
selected = selected.map(&:id)
|
||||
if selected.size > 1
|
||||
multiple = true
|
||||
end
|
||||
end
|
||||
else
|
||||
selected = objects.first.try(:id)
|
||||
end
|
||||
all_tag_options = {:value => 'all', :selected => (selected == 'all')}
|
||||
if multiple
|
||||
all_tag_options.merge!(:style => "display:none;")
|
||||
end
|
||||
option_tags << content_tag('option', l(:label_all), all_tag_options)
|
||||
option_tags << options_from_collection_for_select(objects, "id", "name", selected)
|
||||
select_tag name, option_tags, {:multiple => multiple}.merge(options)
|
||||
end
|
||||
|
||||
def field_required?(field)
|
||||
field.is_a?(CustomField) ? field.is_required? : %w(project_id tracker_id subject priority_id is_private).include?(field)
|
||||
end
|
||||
|
||||
def field_permission_tag(permissions, status, field, role)
|
||||
def field_permission_tag(permissions, status, field, roles)
|
||||
name = field.is_a?(CustomField) ? field.id.to_s : field
|
||||
options = [["", ""], [l(:label_readonly), "readonly"]]
|
||||
options << [l(:label_required), "required"] unless field_required?(field)
|
||||
html_options = {}
|
||||
selected = permissions[status.id][name]
|
||||
|
||||
hidden = field.is_a?(CustomField) && !field.visible? && !role.custom_fields.to_a.include?(field)
|
||||
if perm = permissions[status.id][name]
|
||||
if perm.uniq.size > 1 || perm.size < @roles.size * @trackers.size
|
||||
options << [l(:label_no_change_option), "no_change"]
|
||||
selected = 'no_change'
|
||||
else
|
||||
selected = perm.first
|
||||
end
|
||||
end
|
||||
|
||||
hidden = field.is_a?(CustomField) &&
|
||||
!field.visible? &&
|
||||
!roles.detect {|role| role.custom_fields.to_a.include?(field)}
|
||||
|
||||
if hidden
|
||||
options[0][0] = l(:label_hidden)
|
||||
selected = ''
|
||||
html_options[:disabled] = true
|
||||
end
|
||||
|
||||
select_tag("permissions[#{name}][#{status.id}]", options_for_select(options, selected), html_options)
|
||||
select_tag("permissions[#{status.id}][#{name}]", options_for_select(options, selected), html_options)
|
||||
end
|
||||
|
||||
def transition_tag(workflows, old_status, new_status, name)
|
||||
w = workflows.select {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id}.size
|
||||
|
||||
tag_name = "transitions[#{ old_status.id }][#{new_status.id}][#{name}]"
|
||||
if w == 0 || w == @roles.size * @trackers.size
|
||||
|
||||
hidden_field_tag(tag_name, "0") +
|
||||
check_box_tag(tag_name, "1", w != 0,
|
||||
:class => "old-status-#{old_status.id} new-status-#{new_status.id}")
|
||||
else
|
||||
select_tag tag_name,
|
||||
options_for_select([
|
||||
[l(:general_text_Yes), "1"],
|
||||
[l(:general_text_No), "0"],
|
||||
[l(:label_no_change_option), "no_change"]
|
||||
], "no_change")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -114,7 +114,7 @@ class CustomField < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def possible_values
|
||||
values = super()
|
||||
values = read_attribute(:possible_values)
|
||||
if values.is_a?(Array)
|
||||
values.each do |value|
|
||||
value.force_encoding('UTF-8') if value.respond_to?(:force_encoding)
|
||||
|
@ -128,7 +128,8 @@ class CustomField < ActiveRecord::Base
|
|||
# Makes possible_values accept a multiline string
|
||||
def possible_values=(arg)
|
||||
if arg.is_a?(Array)
|
||||
super(arg.compact.collect(&:strip).select {|v| !v.blank?})
|
||||
values = arg.compact.collect(&:strip).select {|v| !v.blank?}
|
||||
write_attribute(:possible_values, values)
|
||||
else
|
||||
self.possible_values = arg.to_s.split(/[\n\r]+/)
|
||||
end
|
||||
|
|
|
@ -73,7 +73,7 @@ class Enumeration < ActiveRecord::Base
|
|||
self.objects_count != 0
|
||||
end
|
||||
|
||||
# Is this enumeration overiding a system level enumeration?
|
||||
# Is this enumeration overriding a system level enumeration?
|
||||
def is_override?
|
||||
!self.parent.nil?
|
||||
end
|
||||
|
@ -103,8 +103,14 @@ class Enumeration < ActiveRecord::Base
|
|||
subclasses
|
||||
end
|
||||
|
||||
# Does the +new+ Hash override the previous Enumeration?
|
||||
# TODO: remove in Redmine 3.0
|
||||
def self.overridding_change?(new, previous)
|
||||
ActiveSupport::Deprecation.warn "Enumeration#overridding_change? is deprecated and will be removed in Redmine 3.0. Please use #overriding_change?."
|
||||
overriding_change?(new, previous)
|
||||
end
|
||||
|
||||
# Does the +new+ Hash override the previous Enumeration?
|
||||
def self.overriding_change?(new, previous)
|
||||
if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous)
|
||||
return false
|
||||
else
|
||||
|
|
|
@ -483,6 +483,11 @@ class Issue < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
# Returns the custom fields that can be edited by the given user
|
||||
def editable_custom_fields(user=nil)
|
||||
editable_custom_field_values(user).map(&:custom_field).uniq
|
||||
end
|
||||
|
||||
# Returns the names of attributes that are read-only for user or the current user
|
||||
# For users with multiple roles, the read-only fields are the intersection of
|
||||
# read-only fields of each role
|
||||
|
@ -524,7 +529,7 @@ class Issue < ActiveRecord::Base
|
|||
return {} if roles.empty?
|
||||
|
||||
result = {}
|
||||
workflow_permissions = WorkflowPermission.where(:tracker_id => tracker_id, :old_status_id => status_id, :role_id => roles.map(&:id)).all
|
||||
workflow_permissions = WorkflowPermission.where(:tracker_id => tracker_id, :old_status_id => status_id, :role_id => roles.map(&:id))
|
||||
if workflow_permissions.any?
|
||||
workflow_rules = workflow_permissions.inject({}) do |h, wp|
|
||||
h[wp.field_name] ||= []
|
||||
|
@ -1107,7 +1112,10 @@ class Issue < ActiveRecord::Base
|
|||
def self.update_versions_from_hierarchy_change(project)
|
||||
moved_project_ids = project.self_and_descendants.reload.collect(&:id)
|
||||
# Update issues of the moved projects and issues assigned to a version of a moved project
|
||||
Issue.update_versions(["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)", moved_project_ids, moved_project_ids])
|
||||
Issue.update_versions(
|
||||
["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)",
|
||||
moved_project_ids, moved_project_ids]
|
||||
)
|
||||
end
|
||||
|
||||
def parent_issue_id=(arg)
|
||||
|
@ -1287,9 +1295,7 @@ class Issue < ActiveRecord::Base
|
|||
if root_id.nil?
|
||||
# issue was just created
|
||||
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id)
|
||||
set_default_left_and_right
|
||||
Issue.where(["id = ?", id]).
|
||||
update_all(["root_id = ?, lft = ?, rgt = ?", root_id, lft, rgt])
|
||||
Issue.where(["id = ?", id]).update_all(["root_id = ?", root_id])
|
||||
if @parent_issue
|
||||
move_to_child_of(@parent_issue)
|
||||
end
|
||||
|
@ -1312,13 +1318,18 @@ class Issue < ActiveRecord::Base
|
|||
move_to_right_of(root)
|
||||
end
|
||||
old_root_id = root_id
|
||||
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id )
|
||||
target_maxright = nested_set_scope.maximum(right_column_name) || 0
|
||||
offset = target_maxright + 1 - lft
|
||||
Issue.where(["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]).
|
||||
in_tenacious_transaction do
|
||||
@parent_issue.reload_nested_set if @parent_issue
|
||||
self.reload_nested_set
|
||||
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id)
|
||||
cond = ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]
|
||||
self.class.base_class.select('id').lock(true).where(cond)
|
||||
offset = right_most_bound + 1 - lft
|
||||
Issue.where(cond).
|
||||
update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset])
|
||||
self[left_column_name] = lft + offset
|
||||
self[right_column_name] = rgt + offset
|
||||
end
|
||||
if @parent_issue
|
||||
move_to_child_of(@parent_issue)
|
||||
end
|
||||
|
@ -1430,7 +1441,7 @@ class Issue < ActiveRecord::Base
|
|||
def close_duplicates
|
||||
if closing?
|
||||
duplicates.each do |duplicate|
|
||||
# Reload is need in case the duplicate was updated by a previous duplicate
|
||||
# Reload is needed in case the duplicate was updated by a previous duplicate
|
||||
duplicate.reload
|
||||
# Don't re-close it if it's already closed
|
||||
next if duplicate.closed?
|
||||
|
|
|
@ -80,15 +80,20 @@ class Journal < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
# Returns the JournalDetail for the given attribute, or nil if the attribute
|
||||
# was not updated
|
||||
def detail_for_attribute(attribute)
|
||||
details.detect {|detail| detail.prop_key == attribute}
|
||||
end
|
||||
|
||||
# Returns the new status if the journal contains a status change, otherwise nil
|
||||
def new_status
|
||||
c = details.detect {|detail| detail.prop_key == 'status_id'}
|
||||
(c && c.value) ? IssueStatus.find_by_id(c.value.to_i) : nil
|
||||
s = new_value_for('status_id')
|
||||
s ? IssueStatus.find_by_id(s.to_i) : nil
|
||||
end
|
||||
|
||||
def new_value_for(prop)
|
||||
c = details.detect {|detail| detail.prop_key == prop}
|
||||
c ? c.value : nil
|
||||
detail_for_attribute(prop).try(:value)
|
||||
end
|
||||
|
||||
def editable_by?(usr)
|
||||
|
@ -185,6 +190,7 @@ class Journal < ActiveRecord::Base
|
|||
if notify? && (Setting.notified_events.include?('issue_updated') ||
|
||||
(Setting.notified_events.include?('issue_note_added') && notes.present?) ||
|
||||
(Setting.notified_events.include?('issue_status_updated') && new_status.present?) ||
|
||||
(Setting.notified_events.include?('issue_assigned_to_updated') && detail_for_attribute('assigned_to_id').present?) ||
|
||||
(Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?)
|
||||
)
|
||||
Mailer.deliver_issue_edit(self)
|
||||
|
|
|
@ -46,6 +46,14 @@ class MailHandler < ActionMailer::Base
|
|||
super(email)
|
||||
end
|
||||
|
||||
# Receives an email and rescues any exception
|
||||
def self.safe_receive(*args)
|
||||
receive(*args)
|
||||
rescue => e
|
||||
logger.error "An unexpected error occurred when receiving email: #{e.message}" if logger
|
||||
return false
|
||||
end
|
||||
|
||||
# Extracts MailHandler options from environment variables
|
||||
# Use when receiving emails with rake tasks
|
||||
def self.extract_options_from_env(env)
|
||||
|
@ -190,6 +198,7 @@ class MailHandler < ActionMailer::Base
|
|||
issue.subject = '(no subject)'
|
||||
end
|
||||
issue.description = cleaned_up_text_body
|
||||
issue.start_date ||= Date.today if Setting.default_issue_start_date_to_creation_date?
|
||||
|
||||
# add To and Cc as watchers before saving so the watchers can reply to Redmine
|
||||
add_watchers(issue)
|
||||
|
|
|
@ -80,7 +80,7 @@ class Mailer < ActionMailer::Base
|
|||
def self.deliver_issue_edit(journal)
|
||||
issue = journal.journalized.reload
|
||||
to = journal.notified_users
|
||||
cc = journal.notified_watchers
|
||||
cc = journal.notified_watchers - to
|
||||
journal.each_notification(to + cc) do |users|
|
||||
issue.each_notification(users) do |users2|
|
||||
Mailer.issue_edit(journal, to & users2, cc & users2).deliver
|
||||
|
@ -464,7 +464,7 @@ class Mailer < ActionMailer::Base
|
|||
if rand
|
||||
hash << Redmine::Utils.random_hex(8)
|
||||
end
|
||||
host = Setting.mail_from.to_s.gsub(%r{^.*@}, '')
|
||||
host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '')
|
||||
host = "#{::Socket.gethostname}.redmine" if host.empty?
|
||||
"#{hash.join('.')}@#{host}"
|
||||
end
|
||||
|
|
|
@ -89,7 +89,7 @@ class Member < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
# Find or initilize a Member with an id, attributes, and for a Principal
|
||||
# Find or initialize a Member with an id, attributes, and for a Principal
|
||||
def self.edit_membership(id, new_attributes, principal=nil)
|
||||
@membership = id.present? ? Member.find(id) : Member.new(:principal => principal)
|
||||
@membership.attributes = new_attributes
|
||||
|
|
|
@ -26,7 +26,7 @@ class Project < ActiveRecord::Base
|
|||
# Maximum length for project identifiers
|
||||
IDENTIFIER_MAX_LENGTH = 100
|
||||
|
||||
# Specific overidden Activities
|
||||
# Specific overridden Activities
|
||||
has_many :time_entry_activities
|
||||
has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}"
|
||||
has_many :memberships, :class_name => 'Member'
|
||||
|
@ -74,7 +74,7 @@ class Project < ActiveRecord::Base
|
|||
validates_length_of :name, :maximum => 255
|
||||
validates_length_of :homepage, :maximum => 255
|
||||
validates_length_of :identifier, :in => 1..IDENTIFIER_MAX_LENGTH
|
||||
# donwcase letters, digits, dashes but not digits only
|
||||
# downcase letters, digits, dashes but not digits only
|
||||
validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? }
|
||||
# reserved words
|
||||
validates_exclusion_of :identifier, :in => %w( new )
|
||||
|
@ -252,10 +252,10 @@ class Project < ActiveRecord::Base
|
|||
parent_activity = TimeEntryActivity.find(activity['parent_id'])
|
||||
activity['name'] = parent_activity.name
|
||||
activity['position'] = parent_activity.position
|
||||
if Enumeration.overridding_change?(activity, parent_activity)
|
||||
if Enumeration.overriding_change?(activity, parent_activity)
|
||||
project_activity = self.time_entry_activities.create(activity)
|
||||
if project_activity.new_record?
|
||||
raise ActiveRecord::Rollback, "Overridding TimeEntryActivity was not successfully saved"
|
||||
raise ActiveRecord::Rollback, "Overriding TimeEntryActivity was not successfully saved"
|
||||
else
|
||||
self.time_entries.
|
||||
where(["activity_id = ?", parent_activity.id]).
|
||||
|
@ -502,7 +502,7 @@ class Project < ActiveRecord::Base
|
|||
assignable.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal}.sort
|
||||
end
|
||||
|
||||
# Returns the mail adresses of users that should be always notified on project events
|
||||
# Returns the mail addresses of users that should be always notified on project events
|
||||
def recipients
|
||||
notified_users.collect {|user| user.mail}
|
||||
end
|
||||
|
@ -514,7 +514,7 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
# Returns a scope of all custom fields enabled for project issues
|
||||
# (explictly associated custom fields and custom fields enabled for all projects)
|
||||
# (explicitly associated custom fields and custom fields enabled for all projects)
|
||||
def all_issue_custom_fields
|
||||
@all_issue_custom_fields ||= IssueCustomField.
|
||||
sorted.
|
||||
|
@ -847,7 +847,7 @@ class Project < ActiveRecord::Base
|
|||
# Copies issues from +project+
|
||||
def copy_issues(project)
|
||||
# Stores the source issue id as a key and the copied issues as the
|
||||
# value. Used to map the two togeather for issue relations.
|
||||
# value. Used to map the two together for issue relations.
|
||||
issues_map = {}
|
||||
|
||||
# Store status and reopen locked/closed versions
|
||||
|
|
|
@ -57,6 +57,10 @@ class QueryColumn
|
|||
object.send name
|
||||
end
|
||||
|
||||
def value_object(object)
|
||||
object.send name
|
||||
end
|
||||
|
||||
def css_classes
|
||||
name
|
||||
end
|
||||
|
@ -80,10 +84,21 @@ class QueryCustomFieldColumn < QueryColumn
|
|||
@cf
|
||||
end
|
||||
|
||||
def value(object)
|
||||
def value_object(object)
|
||||
if custom_field.visible_by?(object.project, User.current)
|
||||
cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)}
|
||||
cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first
|
||||
cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}
|
||||
cv.size > 1 ? cv.sort {|a,b| a.value.to_s <=> b.value.to_s} : cv.first
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def value(object)
|
||||
raw = value_object(object)
|
||||
if raw.is_a?(Array)
|
||||
raw.map {|r| @cf.cast_value(r.value)}
|
||||
elsif raw
|
||||
@cf.cast_value(raw.value)
|
||||
else
|
||||
nil
|
||||
end
|
||||
|
@ -105,7 +120,7 @@ class QueryAssociationCustomFieldColumn < QueryCustomFieldColumn
|
|||
@association = association
|
||||
end
|
||||
|
||||
def value(object)
|
||||
def value_object(object)
|
||||
if assoc = object.send(@association)
|
||||
super(assoc)
|
||||
end
|
||||
|
@ -541,7 +556,7 @@ class Query < ActiveRecord::Base
|
|||
next unless v and !v.empty?
|
||||
operator = operator_for(field)
|
||||
|
||||
# "me" value subsitution
|
||||
# "me" value substitution
|
||||
if %w(assigned_to_id author_id user_id watcher_id).include?(field)
|
||||
if v.delete("me")
|
||||
if User.current.logged?
|
||||
|
|
|
@ -40,7 +40,7 @@ class Repository < ActiveRecord::Base
|
|||
validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true
|
||||
validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
|
||||
validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true
|
||||
validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph)
|
||||
validates_exclusion_of :identifier, :in => %w(browse show entry raw changes annotate diff statistics graph revisions revision)
|
||||
# donwcase letters, digits, dashes, underscores but not digits only
|
||||
validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :allow_blank => true
|
||||
# Checks if the SCM is enabled when creating a repository
|
||||
|
|
|
@ -150,7 +150,7 @@ class Repository::Cvs < Repository
|
|||
).first
|
||||
# create a new changeset....
|
||||
unless cs
|
||||
# we use a temporaray revision number here (just for inserting)
|
||||
# we use a temporary revision number here (just for inserting)
|
||||
# later on, we calculate a continous positive number
|
||||
tmp_time2 = tmp_time.clone.gmtime
|
||||
branch = revision.paths[0][:branch]
|
||||
|
|
|
@ -155,7 +155,7 @@ class Repository::Mercurial < Repository
|
|||
# Revisions in root directory and sub directory are not equal.
|
||||
# So, in order to get correct limit, we need to get all revisions.
|
||||
# But, it is very heavy.
|
||||
# Mercurial does not treat direcotry.
|
||||
# Mercurial does not treat directory.
|
||||
# So, "hg log DIR" is very heavy.
|
||||
branch_limit = path.blank? ? limit : ( limit * 5 )
|
||||
args << nodes_in_branch(rev, branch_limit)
|
||||
|
|
|
@ -77,6 +77,16 @@ class TimeEntry < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def safe_attributes=(attrs, user=User.current)
|
||||
attrs = super
|
||||
if !new_record? && issue && issue.project_id != project_id
|
||||
if user.allowed_to?(:log_time, issue.project)
|
||||
self.project_id = issue.project_id
|
||||
end
|
||||
end
|
||||
attrs
|
||||
end
|
||||
|
||||
def set_project_if_nil
|
||||
self.project = issue.project if issue && project.nil?
|
||||
end
|
||||
|
|
|
@ -626,11 +626,11 @@ class User < Principal
|
|||
end
|
||||
|
||||
def self.current=(user)
|
||||
Thread.current[:current_user] = user
|
||||
RequestStore.store[:current_user] = user
|
||||
end
|
||||
|
||||
def self.current
|
||||
Thread.current[:current_user] ||= User.anonymous
|
||||
RequestStore.store[:current_user] ||= User.anonymous
|
||||
end
|
||||
|
||||
# Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only
|
||||
|
|
|
@ -256,7 +256,7 @@ class Version < ActiveRecord::Base
|
|||
|
||||
# Returns the average estimated time of assigned issues
|
||||
# or 1 if no issue has an estimated time
|
||||
# Used to weigth unestimated issues in progress calculation
|
||||
# Used to weight unestimated issues in progress calculation
|
||||
def estimated_average
|
||||
if @estimated_average.nil?
|
||||
average = fixed_issues.average(:estimated_hours).to_f
|
||||
|
|
|
@ -40,7 +40,7 @@ class WikiContent < ActiveRecord::Base
|
|||
page.nil? ? [] : page.attachments
|
||||
end
|
||||
|
||||
# Returns the mail adresses of users that should be notified
|
||||
# Returns the mail addresses of users that should be notified
|
||||
def recipients
|
||||
notified = project.notified_users
|
||||
notified.reject! {|user| !visible?(user)}
|
||||
|
|
|
@ -104,10 +104,12 @@ class WikiPage < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def content_for_version(version=nil)
|
||||
if content
|
||||
result = content.versions.find_by_version(version.to_i) if version
|
||||
result ||= content
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
def diff(version_to=nil, version_from=nil)
|
||||
version_to = version_to ? version_to.to_i : self.content.version
|
||||
|
|
|
@ -19,21 +19,44 @@ class WorkflowPermission < WorkflowRule
|
|||
validates_inclusion_of :rule, :in => %w(readonly required)
|
||||
validate :validate_field_name
|
||||
|
||||
# Replaces the workflow permissions for the given tracker and role
|
||||
# Returns the workflow permissions for the given trackers and roles
|
||||
# grouped by status_id
|
||||
#
|
||||
# Example:
|
||||
# WorkflowPermission.replace_permissions role, tracker, {'due_date' => {'1' => 'readonly', '2' => 'required'}}
|
||||
def self.replace_permissions(tracker, role, permissions)
|
||||
destroy_all(:tracker_id => tracker.id, :role_id => role.id)
|
||||
# WorkflowPermission.rules_by_status_id trackers, roles
|
||||
# # => {1 => {'start_date' => 'required', 'due_date' => 'readonly'}}
|
||||
def self.rules_by_status_id(trackers, roles)
|
||||
WorkflowPermission.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).inject({}) do |h, w|
|
||||
h[w.old_status_id] ||= {}
|
||||
h[w.old_status_id][w.field_name] ||= []
|
||||
h[w.old_status_id][w.field_name] << w.rule
|
||||
h
|
||||
end
|
||||
end
|
||||
|
||||
permissions.each { |field, rule_by_status_id|
|
||||
rule_by_status_id.each { |status_id, rule|
|
||||
# Replaces the workflow permissions for the given trackers and roles
|
||||
#
|
||||
# Example:
|
||||
# WorkflowPermission.replace_permissions trackers, roles, {'1' => {'start_date' => 'required', 'due_date' => 'readonly'}}
|
||||
def self.replace_permissions(trackers, roles, permissions)
|
||||
trackers = Array.wrap trackers
|
||||
roles = Array.wrap roles
|
||||
|
||||
transaction do
|
||||
permissions.each { |status_id, rule_by_field|
|
||||
rule_by_field.each { |field, rule|
|
||||
destroy_all(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id), :old_status_id => status_id, :field_name => field)
|
||||
if rule.present?
|
||||
trackers.each do |tracker|
|
||||
roles.each do |role|
|
||||
WorkflowPermission.create(:role_id => role.id, :tracker_id => tracker.id, :old_status_id => status_id, :field_name => field, :rule => rule)
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
|
|
|
@ -21,9 +21,8 @@ class WorkflowTransition < WorkflowRule
|
|||
# Returns workflow transitions count by tracker and role
|
||||
def self.count_by_tracker_and_role
|
||||
counts = connection.select_all("SELECT role_id, tracker_id, count(id) AS c FROM #{table_name} WHERE type = 'WorkflowTransition' GROUP BY role_id, tracker_id")
|
||||
roles = Role.sorted.all
|
||||
trackers = Tracker.sorted.all
|
||||
|
||||
roles = Role.sorted
|
||||
trackers = Tracker.sorted
|
||||
result = []
|
||||
trackers.each do |tracker|
|
||||
t = []
|
||||
|
@ -33,7 +32,71 @@ class WorkflowTransition < WorkflowRule
|
|||
end
|
||||
result << [tracker, t]
|
||||
end
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
def self.replace_transitions(trackers, roles, transitions)
|
||||
trackers = Array.wrap trackers
|
||||
roles = Array.wrap roles
|
||||
|
||||
transaction do
|
||||
records = WorkflowTransition.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).all
|
||||
|
||||
transitions.each do |old_status_id, transitions_by_new_status|
|
||||
transitions_by_new_status.each do |new_status_id, transition_by_rule|
|
||||
transition_by_rule.each do |rule, transition|
|
||||
trackers.each do |tracker|
|
||||
roles.each do |role|
|
||||
w = records.select {|r|
|
||||
r.old_status_id == old_status_id.to_i &&
|
||||
r.new_status_id == new_status_id.to_i &&
|
||||
r.tracker_id == tracker.id &&
|
||||
r.role_id == role.id &&
|
||||
!r.destroyed?
|
||||
}
|
||||
|
||||
if rule == 'always'
|
||||
w = w.select {|r| !r.author && !r.assignee}
|
||||
else
|
||||
w = w.select {|r| r.author || r.assignee}
|
||||
end
|
||||
if w.size > 1
|
||||
w[1..-1].each(&:destroy)
|
||||
end
|
||||
w = w.first
|
||||
|
||||
if transition == "1" || transition == true
|
||||
unless w
|
||||
w = WorkflowTransition.new(:old_status_id => old_status_id, :new_status_id => new_status_id, :tracker_id => tracker.id, :role_id => role.id)
|
||||
records << w
|
||||
end
|
||||
w.author = true if rule == "author"
|
||||
w.assignee = true if rule == "assignee"
|
||||
w.save if w.changed?
|
||||
elsif w
|
||||
if rule == 'always'
|
||||
w.destroy
|
||||
elsif rule == 'author'
|
||||
if w.assignee
|
||||
w.author = false
|
||||
w.save if w.changed?
|
||||
else
|
||||
w.destroy
|
||||
end
|
||||
elsif rule == 'assignee'
|
||||
if w.author
|
||||
w.assignee = false
|
||||
w.save if w.changed?
|
||||
else
|
||||
w.destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,11 +9,55 @@
|
|||
<%= content_tag('span', link_to(h(plugin.url), plugin.url), :class => 'url') unless plugin.url.blank? %>
|
||||
</td>
|
||||
<td class="author"><%= plugin.author_url.blank? ? h(plugin.author) : link_to(h(plugin.author), plugin.author_url) %></td>
|
||||
<td class="version"><%=h plugin.version %></td>
|
||||
<td class="version"><span class="icon"><%= plugin.version %></span></td>
|
||||
<td class="configure"><%= link_to(l(:button_configure), plugin_settings_path(plugin)) if plugin.configurable? %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
<p><a href="#" id="check-for-updates"><%= l(:label_check_for_updates) %></a></p>
|
||||
<% else %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% end %>
|
||||
|
||||
<%= javascript_tag do %>
|
||||
$(document).ready(function(){
|
||||
$("#check-for-updates").click(function(e){
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
dataType: "jsonp",
|
||||
url: "http://www.redmine.org/plugins/check_updates",
|
||||
data: <%= raw_json plugin_data_for_updates(@plugins) %>,
|
||||
timeout: 3000,
|
||||
beforeSend: function(){
|
||||
$('#ajax-indicator').show();
|
||||
},
|
||||
success: function(data){
|
||||
$('#ajax-indicator').hide();
|
||||
$("table.plugins td.version span").addClass("unknown");
|
||||
$.each(data, function(plugin_id, plugin_data){
|
||||
var s = $("tr#plugin-"+plugin_id+" td.version span");
|
||||
s.removeClass("icon-checked icon-warning unknown");
|
||||
if (plugin_data.url) {
|
||||
if (s.parent("a").length>0) {
|
||||
s.unwrap();
|
||||
}
|
||||
s.addClass("found");
|
||||
s.wrap($("<a></a>").attr("href", plugin_data.url).attr("target", "_blank"));
|
||||
}
|
||||
if (plugin_data.c == s.text()) {
|
||||
s.addClass("icon-checked");
|
||||
} else if (plugin_data.c) {
|
||||
s.addClass("icon-warning");
|
||||
s.attr("title", "<%= escape_javascript l(:label_latest_compatible_version) %>: "+plugin_data.c);
|
||||
}
|
||||
});
|
||||
$("table.plugins td.version span.unknown").addClass("icon-help").attr("title", "<%= escape_javascript l(:label_unknown_plugin) %>");
|
||||
},
|
||||
error: function(){
|
||||
$('#ajax-indicator').hide();
|
||||
alert("Unable to retrieve plugin informations from www.redmine.org");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
<% end if @plugins.any? %>
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<% end -%>
|
||||
</ul>
|
||||
<div class="tabs-buttons" style="display:none;">
|
||||
<button class="tab-left" onclick="moveTabLeft(this);"></button>
|
||||
<button class="tab-right" onclick="moveTabRight(this);"></button>
|
||||
<button class="tab-left" onclick="moveTabLeft(this); return false;"></button>
|
||||
<button class="tab-right" onclick="moveTabRight(this); return false;"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -27,12 +27,12 @@ api.array :custom_fields do
|
|||
end
|
||||
|
||||
if field.is_a?(IssueCustomField)
|
||||
api.trackers do
|
||||
api.array :trackers do
|
||||
field.trackers.each do |tracker|
|
||||
api.tracker :id => tracker.id, :name => tracker.name
|
||||
end
|
||||
end
|
||||
api.roles do
|
||||
api.array :roles do
|
||||
field.roles.each do |role|
|
||||
api.role :id => role.id, :name => role.name
|
||||
end
|
||||
|
|
|
@ -45,3 +45,11 @@
|
|||
<% end %>
|
||||
|
||||
<% heads_for_wiki_formatter %>
|
||||
|
||||
<%= javascript_tag do %>
|
||||
$(document).ready(function(){
|
||||
$("#issue_tracker_id, #issue_status_id").each(function(){
|
||||
$(this).val($(this).find("option[selected=selected]").val());
|
||||
});
|
||||
});
|
||||
<% end %>
|
||||
|
|
|
@ -3,12 +3,7 @@
|
|||
<% end %>
|
||||
|
||||
<div class="contextual">
|
||||
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
|
||||
<%= link_to(l(:label_issue_view_all), issues_path) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
|
||||
<%= link_to(l(:label_overall_spent_time), time_entries_path) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
|
||||
<%= link_to l(:label_overall_activity),
|
||||
{ :controller => 'activities', :action => 'index',
|
||||
:id => nil } %>
|
||||
<%= render_project_action_links %>
|
||||
</div>
|
||||
|
||||
<h2><%= l(:label_project_plural) %></h2>
|
||||
|
|
|
@ -23,8 +23,10 @@
|
|||
:ondblclick => "moveOptions(this.form.selected_columns, this.form.available_columns);" %>
|
||||
</td>
|
||||
<td class="buttons">
|
||||
<input type="button" value="⇈" onclick="moveOptionTop(this.form.selected_columns);" /><br />
|
||||
<input type="button" value="↑" onclick="moveOptionUp(this.form.selected_columns);" /><br />
|
||||
<input type="button" value="↓" onclick="moveOptionDown(this.form.selected_columns);" />
|
||||
<input type="button" value="↓" onclick="moveOptionDown(this.form.selected_columns);" /><br />
|
||||
<input type="button" value="⇊" onclick="moveOptionBottom(this.form.selected_columns);" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<table class="list transitions transitions-<%= name %>">
|
||||
<table class="list workflows transitions transitions-<%= name %>">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
|
@ -31,8 +31,7 @@
|
|||
<% for new_status in @statuses -%>
|
||||
<% checked = workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id} %>
|
||||
<td class="<%= checked ? 'enabled' : '' %>">
|
||||
<%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, checked,
|
||||
:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>
|
||||
<%= transition_tag workflows, old_status, new_status, name %>
|
||||
</td>
|
||||
<% end -%>
|
||||
</tr>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
<div class="tabs">
|
||||
<ul>
|
||||
<li><%= link_to l(:label_status_transitions), {:action => 'edit', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li>
|
||||
<li><%= link_to l(:label_fields_permissions), {:action => 'permissions', :role_id => @role, :tracker_id => @tracker} %></li>
|
||||
<li><%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %></li>
|
||||
<li><%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers) %></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@ -14,10 +14,14 @@
|
|||
<%= form_tag({}, :method => 'get') do %>
|
||||
<p>
|
||||
<label><%=l(:label_role)%>:
|
||||
<%= select_tag 'role_id', options_from_collection_for_select(@roles, "id", "name", @role && @role.id) %></label>
|
||||
<%= options_for_workflow_select 'role_id[]', Role.sorted, @roles, :id => 'role_id', :class => 'expandable' %>
|
||||
</label>
|
||||
<a href="#" data-expands="#role_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
|
||||
|
||||
<label><%=l(:label_tracker)%>:
|
||||
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label>
|
||||
<%= options_for_workflow_select 'tracker_id[]', Tracker.sorted, @trackers, :id => 'tracker_id', :class => 'expandable' %>
|
||||
</label>
|
||||
<a href="#" data-expands="#tracker_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
|
||||
|
||||
<%= submit_tag l(:button_edit), :name => nil %>
|
||||
|
||||
|
@ -27,10 +31,10 @@
|
|||
</p>
|
||||
<% end %>
|
||||
|
||||
<% if @tracker && @role && @statuses.any? %>
|
||||
<% if @trackers && @roles && @statuses.any? %>
|
||||
<%= form_tag({}, :id => 'workflow_form' ) do %>
|
||||
<%= hidden_field_tag 'tracker_id', @tracker.id %>
|
||||
<%= hidden_field_tag 'role_id', @role.id %>
|
||||
<%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id}.join.html_safe %>
|
||||
<%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id}.join.html_safe %>
|
||||
<%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %>
|
||||
<div class="autoscroll">
|
||||
<%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %>
|
||||
|
@ -54,3 +58,18 @@
|
|||
<%= submit_tag l(:button_save) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<%= javascript_tag do %>
|
||||
$("a[data-expands]").click(function(e){
|
||||
e.preventDefault();
|
||||
var target = $($(this).attr("data-expands"));
|
||||
if (target.attr("multiple")) {
|
||||
target.attr("multiple", false);
|
||||
target.find("option[value=all]").show();
|
||||
} else {
|
||||
target.attr("multiple", true);
|
||||
target.find("option[value=all]").attr("selected", false).hide();
|
||||
}
|
||||
});
|
||||
|
||||
<% end %>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
<div class="tabs">
|
||||
<ul>
|
||||
<li><%= link_to l(:label_status_transitions), {:action => 'edit', :role_id => @role, :tracker_id => @tracker} %></li>
|
||||
<li><%= link_to l(:label_fields_permissions), {:action => 'permissions', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li>
|
||||
<li><%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers) %></li>
|
||||
<li><%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@ -14,10 +14,14 @@
|
|||
<%= form_tag({}, :method => 'get') do %>
|
||||
<p>
|
||||
<label><%=l(:label_role)%>:
|
||||
<%= select_tag 'role_id', options_from_collection_for_select(@roles, "id", "name", @role && @role.id) %></label>
|
||||
<%= options_for_workflow_select 'role_id[]', Role.sorted, @roles, :id => 'role_id', :class => 'expandable' %>
|
||||
</label>
|
||||
<a href="#" data-expands="#role_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
|
||||
|
||||
<label><%=l(:label_tracker)%>:
|
||||
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label>
|
||||
<%= options_for_workflow_select 'tracker_id[]', Tracker.sorted, @trackers, :id => 'tracker_id', :class => 'expandable' %>
|
||||
</label>
|
||||
<a href="#" data-expands="#tracker_id"><%= image_tag 'bullet_toggle_plus.png' %></a>
|
||||
|
||||
<%= submit_tag l(:button_edit), :name => nil %>
|
||||
|
||||
|
@ -26,13 +30,13 @@
|
|||
</p>
|
||||
<% end %>
|
||||
|
||||
<% if @tracker && @role && @statuses.any? %>
|
||||
<% if @trackers && @roles && @statuses.any? %>
|
||||
<%= form_tag({}, :id => 'workflow_form' ) do %>
|
||||
<%= hidden_field_tag 'tracker_id', @tracker.id %>
|
||||
<%= hidden_field_tag 'role_id', @role.id %>
|
||||
<%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id}.join.html_safe %>
|
||||
<%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id}.join.html_safe %>
|
||||
<%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only] %>
|
||||
<div class="autoscroll">
|
||||
<table class="list fields_permissions">
|
||||
<table class="list workflows fields_permissions">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
|
@ -62,7 +66,7 @@
|
|||
</td>
|
||||
<% for status in @statuses -%>
|
||||
<td class="<%= @permissions[status.id][field] %>">
|
||||
<%= field_permission_tag(@permissions, status, field, @role) %>
|
||||
<%= field_permission_tag(@permissions, status, field, @roles) %>
|
||||
<% unless status == @statuses.last %><a href="#" class="repeat-value">»</a><% end %>
|
||||
</td>
|
||||
<% end -%>
|
||||
|
@ -82,7 +86,7 @@
|
|||
</td>
|
||||
<% for status in @statuses -%>
|
||||
<td class="<%= @permissions[status.id][field.id.to_s] %>">
|
||||
<%= field_permission_tag(@permissions, status, field, @role) %>
|
||||
<%= field_permission_tag(@permissions, status, field, @roles) %>
|
||||
<% unless status == @statuses.last %><a href="#" class="repeat-value">»</a><% end %>
|
||||
</td>
|
||||
<% end -%>
|
||||
|
@ -103,4 +107,17 @@ $("a.repeat-value").click(function(e){
|
|||
var selected = td.find("select").find(":selected").val();
|
||||
td.nextAll('td').find("select").val(selected);
|
||||
});
|
||||
|
||||
$("a[data-expands]").click(function(e){
|
||||
e.preventDefault();
|
||||
var target = $($(this).attr("data-expands"));
|
||||
if (target.attr("multiple")) {
|
||||
target.attr("multiple", false);
|
||||
target.find("option[value=all]").show();
|
||||
} else {
|
||||
target.attr("multiple", true);
|
||||
target.find("option[value=all]").attr("selected", false).hide();
|
||||
}
|
||||
});
|
||||
|
||||
<% end %>
|
||||
|
|
|
@ -72,10 +72,9 @@
|
|||
#
|
||||
# === More configuration options
|
||||
#
|
||||
# See the "Configuration options" at the following website for a list of the
|
||||
# full options allowed:
|
||||
# See following page:
|
||||
#
|
||||
# http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer
|
||||
# http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
|
||||
|
||||
|
||||
# default configuration options for all environments
|
||||
|
|
|
@ -203,6 +203,30 @@ module ActionController
|
|||
end
|
||||
end
|
||||
|
||||
if Rails::VERSION::MAJOR < 4 && RUBY_VERSION >= "2.1"
|
||||
module ActiveSupport
|
||||
class HashWithIndifferentAccess
|
||||
def select(*args, &block)
|
||||
dup.tap { |hash| hash.select!(*args, &block) }
|
||||
end
|
||||
|
||||
def reject(*args, &block)
|
||||
dup.tap { |hash| hash.reject!(*args, &block) }
|
||||
end
|
||||
end
|
||||
|
||||
class OrderedHash
|
||||
def select(*args, &block)
|
||||
dup.tap { |hash| hash.select!(*args, &block) }
|
||||
end
|
||||
|
||||
def reject(*args, &block)
|
||||
dup.tap { |hash| hash.reject!(*args, &block) }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
require 'awesome_nested_set/version'
|
||||
|
||||
module CollectiveIdea
|
||||
|
|
|
@ -1112,3 +1112,7 @@ ar:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1209,3 +1209,7 @@ az:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -511,6 +511,7 @@ bg:
|
|||
label_issue_updated: Обновена задача
|
||||
label_issue_note_added: Добавена бележка
|
||||
label_issue_status_updated: Обновено състояние
|
||||
label_issue_assigned_to_updated: Задачата е с назначен нов изпълнител
|
||||
label_issue_priority_updated: Обновен приоритет
|
||||
label_document: Документ
|
||||
label_document_new: Нов документ
|
||||
|
@ -914,6 +915,9 @@ bg:
|
|||
label_checkboxes: чек-бокс
|
||||
label_link_values_to: URL (опция)
|
||||
label_custom_field_select_type: "Изберете тип на обект, към който потребителското поле да бъде асоциирано"
|
||||
label_check_for_updates: Проверка за нови версии
|
||||
label_latest_compatible_version: Последна съвместима версия
|
||||
label_unknown_plugin: Непознат плъгин
|
||||
|
||||
button_login: Вход
|
||||
button_submit: Изпращане
|
||||
|
|
|
@ -1125,3 +1125,7 @@ bs:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1114,3 +1114,7 @@ ca:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Update to 2.2, 2.4 by Karel Picman <karel.picman@kontron.com>
|
||||
# Update to 2.2, 2.4, 2.5 by Karel Picman <karel.picman@kontron.com>
|
||||
# Update to 1.1 by Michal Gebauer <mishak@mishak.net>
|
||||
# Updated by Josef Liška <jl@chl.cz>
|
||||
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
|
||||
|
@ -1104,14 +1104,17 @@ cs:
|
|||
notice_new_password_must_be_different: Nové heslo se musí lišit od stávajícího
|
||||
setting_mail_handler_excluded_filenames: Vyřadit přílohy podle jména
|
||||
text_convert_available: ImageMagick convert k dispozici (volitelné)
|
||||
label_link: Link
|
||||
label_only: only
|
||||
label_drop_down_list: drop-down list
|
||||
label_checkboxes: checkboxes
|
||||
label_link_values_to: Link values to URL
|
||||
setting_force_default_language_for_anonymous: Force default language for anonymous
|
||||
label_link: Odkaz
|
||||
label_only: jenom
|
||||
label_drop_down_list: rozbalovací seznam
|
||||
label_checkboxes: zaškrtávátka
|
||||
label_link_values_to: Propojit hodnoty s URL
|
||||
setting_force_default_language_for_anonymous: Vynutit výchozí jazyk pro anonymní uživatele
|
||||
users
|
||||
setting_force_default_language_for_loggedin: Force default language for logged-in
|
||||
setting_force_default_language_for_loggedin: Vynutit výchozí jazyk pro přihlášené uživatele
|
||||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_custom_field_select_type: Vybrat typ objektu, ke kterému bude přiřazeno uživatelské pole
|
||||
label_issue_assigned_to_updated: Přiřazený uživatel aktualizován
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1129,3 +1129,7 @@ da:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -460,6 +460,7 @@ de:
|
|||
label_changes_details: Details aller Änderungen
|
||||
label_changeset_plural: Changesets
|
||||
label_checkboxes: Checkboxen
|
||||
label_check_for_updates: Auf Updates prüfen
|
||||
label_child_revision: Nachfolger
|
||||
label_chronological_order: in zeitlicher Reihenfolge
|
||||
label_close_versions: Vollständige Versionen schließen
|
||||
|
@ -568,6 +569,7 @@ de:
|
|||
label_internal: Intern
|
||||
label_issue: Ticket
|
||||
label_issue_added: Ticket hinzugefügt
|
||||
label_issue_assigned_to_updated: Bearbeiter aktualisiert
|
||||
label_issue_category: Ticket-Kategorie
|
||||
label_issue_category_new: Neue Kategorie
|
||||
label_issue_category_plural: Ticket-Kategorien
|
||||
|
@ -596,11 +598,13 @@ de:
|
|||
label_last_n_days: "die letzten %{count} Tage"
|
||||
label_last_n_weeks: letzte %{count} Wochen
|
||||
label_last_week: vorige Woche
|
||||
label_latest_compatible_version: Letzte kompatible Version
|
||||
label_latest_revision: Aktuellste Revision
|
||||
label_latest_revision_plural: Aktuellste Revisionen
|
||||
label_ldap_authentication: LDAP-Authentifizierung
|
||||
label_less_or_equal: "<="
|
||||
label_less_than_ago: vor weniger als
|
||||
label_link: Link
|
||||
label_link_values_to: Werte mit URL verknüpfen
|
||||
label_list: Liste
|
||||
label_loading: Lade...
|
||||
|
@ -757,6 +761,7 @@ de:
|
|||
label_tracker: Tracker
|
||||
label_tracker_new: Neuer Tracker
|
||||
label_tracker_plural: Tracker
|
||||
label_unknown_plugin: Unbekanntes Plugin
|
||||
label_update_issue_done_ratios: Ticket-Fortschritt aktualisieren
|
||||
label_updated_time: "Vor %{value} aktualisiert"
|
||||
label_updated_time_by: "Von %{author} vor %{age} aktualisiert"
|
||||
|
@ -1120,4 +1125,3 @@ de:
|
|||
version_status_open: offen
|
||||
|
||||
warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden."
|
||||
label_link: Link
|
||||
|
|
|
@ -1112,3 +1112,7 @@ el:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1114,3 +1114,7 @@ en-GB:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -508,6 +508,7 @@ en:
|
|||
label_issue_updated: Issue updated
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_document: Document
|
||||
label_document_new: New document
|
||||
|
@ -911,6 +912,9 @@ en:
|
|||
label_checkboxes: checkboxes
|
||||
label_link_values_to: Link values to URL
|
||||
label_custom_field_select_type: Select the type of object to which the custom field is to be attached
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
||||
button_login: Login
|
||||
button_submit: Submit
|
||||
|
|
|
@ -1144,5 +1144,8 @@ es:
|
|||
label_link_values_to: Enlazar valores a la URL
|
||||
setting_force_default_language_for_anonymous: Forzar lenguaje por defecto a usuarios anónimos
|
||||
setting_force_default_language_for_loggedin: Forzar lenguaje por defecto para usuarios identificados
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_custom_field_select_type: Seleccione el tipo de objeto al que unir el campo personalizado
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1125,3 +1125,7 @@ et:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1113,3 +1113,7 @@ eu:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1133,3 +1133,7 @@ fi:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -15,8 +15,11 @@ fr:
|
|||
|
||||
day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
|
||||
abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
|
||||
|
||||
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||
month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
|
||||
abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.]
|
||||
# Used in date_select and datime_select.
|
||||
order:
|
||||
- :day
|
||||
- :month
|
||||
|
@ -183,14 +186,16 @@ fr:
|
|||
notice_email_sent: "Un email a été envoyé à %{value}"
|
||||
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
|
||||
notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée."
|
||||
notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
|
||||
notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}."
|
||||
notice_failed_to_save_time_entries: "%{count} temps passé(s) sur les %{total} sélectionnés n'ont pas pu être mis à jour: %{ids}."
|
||||
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
|
||||
notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour."
|
||||
notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur."
|
||||
notice_default_data_loaded: Paramétrage par défaut chargé avec succès.
|
||||
notice_unable_delete_version: Impossible de supprimer cette version.
|
||||
notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
|
||||
notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour.
|
||||
notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée.
|
||||
notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})"
|
||||
notice_issue_successful_create: "Demande %{id} créée."
|
||||
notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez."
|
||||
|
@ -202,15 +207,22 @@ fr:
|
|||
error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
|
||||
error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}"
|
||||
error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée."
|
||||
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale.
|
||||
error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet"
|
||||
error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
|
||||
error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
|
||||
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
|
||||
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
|
||||
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
|
||||
error_can_not_reopen_issue_on_closed_version: 'Une demande assignée à une version fermée ne peut pas être réouverte'
|
||||
error_can_not_archive_project: "Ce projet ne peut pas être archivé"
|
||||
error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
|
||||
error_workflow_copy_source: 'Veuillez sélectionner un tracker et/ou un rôle source'
|
||||
error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles'
|
||||
error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
|
||||
error_unable_delete_issue_status: Impossible de supprimer le statut de demande
|
||||
error_unable_to_connect: Connexion impossible (%{value})
|
||||
error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size})
|
||||
error_session_expired: "Votre session a expiré. Veuillez vous reconnecter."
|
||||
|
||||
warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés."
|
||||
|
||||
mail_subject_lost_password: "Votre mot de passe %{value}"
|
||||
|
@ -228,7 +240,6 @@ fr:
|
|||
mail_subject_wiki_content_updated: "Page wiki '%{id}' mise à jour"
|
||||
mail_body_wiki_content_updated: "La page wiki '%{id}' a été mise à jour par %{author}."
|
||||
|
||||
|
||||
field_name: Nom
|
||||
field_description: Description
|
||||
field_summary: Résumé
|
||||
|
@ -265,6 +276,7 @@ fr:
|
|||
field_priority: Priorité
|
||||
field_fixed_version: Version cible
|
||||
field_user: Utilisateur
|
||||
field_principal: Principal
|
||||
field_role: Rôle
|
||||
field_homepage: Site web
|
||||
field_is_public: Public
|
||||
|
@ -309,6 +321,7 @@ fr:
|
|||
field_redirect_existing_links: Rediriger les liens existants
|
||||
field_estimated_hours: Temps estimé
|
||||
field_column_names: Colonnes
|
||||
field_time_entries: Temps passé
|
||||
field_time_zone: Fuseau horaire
|
||||
field_searchable: Utilisé pour les recherches
|
||||
field_default_value: Valeur par défaut
|
||||
|
@ -320,13 +333,20 @@ fr:
|
|||
field_content: Contenu
|
||||
field_group_by: Grouper par
|
||||
field_sharing: Partage
|
||||
field_active: Actif
|
||||
field_parent_issue: Tâche parente
|
||||
field_member_of_group: Groupe de l'assigné
|
||||
field_assigned_to_role: Rôle de l'assigné
|
||||
field_text: Champ texte
|
||||
field_visible: Visible
|
||||
field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé"
|
||||
field_issues_visibility: Visibilité des demandes
|
||||
field_is_private: Privée
|
||||
field_commit_logs_encoding: Encodage des messages de commit
|
||||
field_scm_path_encoding: Encodage des chemins
|
||||
field_path_to_repository: Chemin du dépôt
|
||||
field_root_directory: Répertoire racine
|
||||
field_cvsroot: CVSROOT
|
||||
field_cvs_module: Module
|
||||
field_repository_is_default: Dépôt principal
|
||||
field_multiple: Valeurs multiples
|
||||
field_auth_source_ldap_filter: Filtre LDAP
|
||||
|
@ -364,6 +384,8 @@ fr:
|
|||
setting_cross_project_issue_relations: Autoriser les relations entre demandes de différents projets
|
||||
setting_cross_project_subtasks: Autoriser les sous-tâches dans des projets différents
|
||||
setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
|
||||
setting_repositories_encodings: Encodages des fichiers et des dépôts
|
||||
setting_emails_header: En-tête des emails
|
||||
setting_emails_footer: Pied-de-page des emails
|
||||
setting_protocol: Protocole
|
||||
setting_per_page_options: Options d'objets affichés par page
|
||||
|
@ -376,6 +398,7 @@ fr:
|
|||
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_gravatar_default: Image Gravatar par défaut
|
||||
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
|
||||
setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne
|
||||
setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier"
|
||||
|
@ -384,12 +407,12 @@ fr:
|
|||
setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet
|
||||
setting_default_projects_modules: Modules activés par défaut pour les nouveaux projets
|
||||
setting_issue_done_ratio: Calcul de l'avancement des demandes
|
||||
setting_issue_done_ratio_issue_status: Utiliser le statut
|
||||
setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectué'
|
||||
setting_rest_api_enabled: Activer l'API REST
|
||||
setting_gravatar_default: Image Gravatar par défaut
|
||||
setting_issue_done_ratio_issue_status: Utiliser le statut
|
||||
setting_start_of_week: Jour de début des calendriers
|
||||
setting_rest_api_enabled: Activer l'API REST
|
||||
setting_cache_formatted_text: Mettre en cache le texte formaté
|
||||
setting_default_notification_option: Option de notification par défaut
|
||||
setting_commit_logtime_enabled: Permettre la saisie de temps
|
||||
setting_commit_logtime_activity_id: Activité pour le temps saisi
|
||||
setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt
|
||||
|
@ -414,6 +437,7 @@ fr:
|
|||
permission_close_project: Fermer / réouvrir le projet
|
||||
permission_select_project_modules: Choisir les modules
|
||||
permission_manage_members: Gérer les membres
|
||||
permission_manage_project_activities: Gérer les activités
|
||||
permission_manage_versions: Gérer les versions
|
||||
permission_manage_categories: Gérer les catégories de demandes
|
||||
permission_view_issues: Voir les demandes
|
||||
|
@ -468,7 +492,6 @@ fr:
|
|||
permission_delete_messages: Supprimer les messages
|
||||
permission_delete_own_messages: Supprimer ses propres messages
|
||||
permission_export_wiki_pages: Exporter les pages
|
||||
permission_manage_project_activities: Gérer les activités
|
||||
permission_manage_subtasks: Gérer les sous-tâches
|
||||
permission_manage_related_issues: Gérer les demandes associées
|
||||
|
||||
|
@ -480,6 +503,8 @@ fr:
|
|||
project_module_wiki: Wiki
|
||||
project_module_repository: Dépôt de sources
|
||||
project_module_boards: Forums de discussion
|
||||
project_module_calendar: Calendrier
|
||||
project_module_gantt: Gantt
|
||||
|
||||
label_user: Utilisateur
|
||||
label_user_plural: Utilisateurs
|
||||
|
@ -498,12 +523,13 @@ fr:
|
|||
label_issue_new: Nouvelle demande
|
||||
label_issue_plural: Demandes
|
||||
label_issue_view_all: Voir toutes les demandes
|
||||
label_issues_by: "Demandes par %{value}"
|
||||
label_issue_added: Demande ajoutée
|
||||
label_issue_updated: Demande mise à jour
|
||||
label_issue_note_added: Note ajoutée
|
||||
label_issue_status_updated: Statut changé
|
||||
label_issue_assigned_to_updated: Assigné changé
|
||||
label_issue_priority_updated: Priorité changée
|
||||
label_issues_by: "Demandes par %{value}"
|
||||
label_document: Document
|
||||
label_document_new: Nouveau document
|
||||
label_document_plural: Documents
|
||||
|
@ -596,6 +622,7 @@ fr:
|
|||
label_version: Version
|
||||
label_version_new: Nouvelle version
|
||||
label_version_plural: Versions
|
||||
label_close_versions: Fermer les versions terminées
|
||||
label_confirmation: Confirmation
|
||||
label_export_to: 'Formats disponibles :'
|
||||
label_read: Lire...
|
||||
|
@ -663,6 +690,9 @@ fr:
|
|||
label_in_more_than: dans plus de
|
||||
label_in_the_next_days: dans les prochains jours
|
||||
label_in_the_past_days: dans les derniers jours
|
||||
label_greater_or_equal: '>='
|
||||
label_less_or_equal: '<='
|
||||
label_between: entre
|
||||
label_in: dans
|
||||
label_today: aujourd'hui
|
||||
label_all_time: toute la période
|
||||
|
@ -688,8 +718,11 @@ fr:
|
|||
label_repository_new: Nouveau dépôt
|
||||
label_repository_plural: Dépôts
|
||||
label_browse: Parcourir
|
||||
label_branch: Branche
|
||||
label_tag: Tag
|
||||
label_revision: Révision
|
||||
label_revision_plural: Révisions
|
||||
label_revision_id: "Révision %{value}"
|
||||
label_associated_revisions: Révisions associées
|
||||
label_added: ajouté
|
||||
label_modified: modifié
|
||||
|
@ -699,6 +732,7 @@ fr:
|
|||
label_latest_revision: Dernière révision
|
||||
label_latest_revision_plural: Dernières révisions
|
||||
label_view_revisions: Voir les révisions
|
||||
label_view_all_revisions: Voir toutes les révisions
|
||||
label_max_size: Taille maximale
|
||||
label_sort_highest: Remonter en premier
|
||||
label_sort_higher: Remonter
|
||||
|
@ -724,6 +758,7 @@ fr:
|
|||
label_changes_details: Détails de tous les changements
|
||||
label_issue_tracking: Suivi des demandes
|
||||
label_spent_time: Temps passé
|
||||
label_overall_spent_time: Temps passé global
|
||||
label_f_hour: "%{value} heure"
|
||||
label_f_hour_plural: "%{value} heures"
|
||||
label_time_tracking: Suivi du temps
|
||||
|
@ -731,6 +766,7 @@ fr:
|
|||
label_statistics: Statistiques
|
||||
label_commits_per_month: Commits par mois
|
||||
label_commits_per_author: Commits par auteur
|
||||
label_diff: diff
|
||||
label_view_diff: Voir les différences
|
||||
label_diff_inline: en ligne
|
||||
label_diff_side_by_side: côte à côte
|
||||
|
@ -763,6 +799,8 @@ fr:
|
|||
label_board: Forum
|
||||
label_board_new: Nouveau forum
|
||||
label_board_plural: Forums
|
||||
label_board_locked: Verrouillé
|
||||
label_board_sticky: Sticky
|
||||
label_topic_plural: Discussions
|
||||
label_message_plural: Messages
|
||||
label_message_last: Dernier message
|
||||
|
@ -778,6 +816,8 @@ fr:
|
|||
label_language_based: Basé sur la langue de l'utilisateur
|
||||
label_sort_by: "Trier par %{value}"
|
||||
label_send_test_email: Envoyer un email de test
|
||||
label_feeds_access_key: Clé d'accès Atom
|
||||
label_missing_feeds_access_key: Clé d'accès Atom manquante
|
||||
label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}"
|
||||
label_module_plural: Modules
|
||||
label_added_time_by: "Ajouté par %{author} il y a %{age}"
|
||||
|
@ -789,11 +829,16 @@ fr:
|
|||
label_default_columns: Colonnes par défaut
|
||||
label_no_change_option: (Pas de changement)
|
||||
label_bulk_edit_selected_issues: Modifier les demandes sélectionnées
|
||||
label_bulk_edit_selected_time_entries: Modifier les temps passés sélectionnés
|
||||
label_theme: Thème
|
||||
label_default: Défaut
|
||||
label_search_titles_only: Uniquement dans les titres
|
||||
label_user_mail_option_all: "Pour tous les événements de tous mes projets"
|
||||
label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..."
|
||||
label_user_mail_option_none: Aucune notification
|
||||
label_user_mail_option_only_my_events: Seulement pour ce que je surveille
|
||||
label_user_mail_option_only_assigned: Seulement pour ce qui m'est assigné
|
||||
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
|
||||
label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue"
|
||||
label_registration_activation_by_email: activation du compte par email
|
||||
label_registration_manual_activation: activation manuelle du compte
|
||||
|
@ -824,8 +869,8 @@ fr:
|
|||
label_date_from_to: Du %{start} au %{end}
|
||||
label_wiki_content_added: Page wiki ajoutée
|
||||
label_wiki_content_updated: Page wiki mise à jour
|
||||
label_group_plural: Groupes
|
||||
label_group: Groupe
|
||||
label_group_plural: Groupes
|
||||
label_group_new: Nouveau groupe
|
||||
label_time_entry_plural: Temps passé
|
||||
label_version_sharing_none: Non partagé
|
||||
|
@ -833,18 +878,14 @@ fr:
|
|||
label_version_sharing_hierarchy: Avec toute la hiérarchie
|
||||
label_version_sharing_tree: Avec tout l'arbre
|
||||
label_version_sharing_system: Avec tous les projets
|
||||
label_update_issue_done_ratios: Mettre à jour l'avancement des demandes
|
||||
label_copy_source: Source
|
||||
label_copy_target: Cible
|
||||
label_copy_same_as_target: Comme la cible
|
||||
label_update_issue_done_ratios: Mettre à jour l'avancement des demandes
|
||||
label_display_used_statuses_only: N'afficher que les statuts utilisés dans ce tracker
|
||||
label_api_access_key: Clé d'accès API
|
||||
label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
|
||||
label_feeds_access_key: Clé d'accès Atom
|
||||
label_missing_api_access_key: Clé d'accès API manquante
|
||||
label_missing_feeds_access_key: Clé d'accès Atom manquante
|
||||
label_close_versions: Fermer les versions terminées
|
||||
label_revision_id: Révision %{value}
|
||||
label_api_access_key_created_on: Clé d'accès API créée il y a %{value}
|
||||
label_profile: Profil
|
||||
label_subtask_plural: Sous-tâches
|
||||
label_project_copy_notifications: Envoyer les notifications durant la copie du projet
|
||||
|
@ -855,11 +896,15 @@ fr:
|
|||
label_issues_visibility_all: Toutes les demandes
|
||||
label_issues_visibility_public: Toutes les demandes non privées
|
||||
label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur
|
||||
label_git_report_last_commit: Afficher le dernier commit des fichiers et répertoires
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Enfant
|
||||
label_export_options: Options d'exportation %{export_format}
|
||||
label_copy_attachments: Copier les fichiers
|
||||
label_copy_subtasks: Copier les sous-tâches
|
||||
label_item_position: "%{position} sur %{count}"
|
||||
label_completed_versions: Versions passées
|
||||
label_search_for_watchers: Rechercher des observateurs
|
||||
label_session_expiration: Expiration des sessions
|
||||
label_show_closed_projects: Voir les projets fermés
|
||||
label_status_transitions: Changements de statut
|
||||
|
@ -887,6 +932,9 @@ fr:
|
|||
label_checkboxes: cases à cocher
|
||||
label_link_values_to: Lier les valeurs vers l'URL
|
||||
label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisé
|
||||
label_check_for_updates: Vérifier les mises à jour
|
||||
label_latest_compatible_version: Dernière version compatible
|
||||
label_unknown_plugin: Plugin inconnu
|
||||
|
||||
button_login: Connexion
|
||||
button_submit: Soumettre
|
||||
|
@ -900,6 +948,7 @@ fr:
|
|||
button_create_and_continue: Créer et continuer
|
||||
button_test: Tester
|
||||
button_edit: Modifier
|
||||
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}"
|
||||
button_add: Ajouter
|
||||
button_change: Changer
|
||||
button_apply: Appliquer
|
||||
|
@ -952,6 +1001,8 @@ fr:
|
|||
version_status_locked: verrouillé
|
||||
version_status_closed: fermé
|
||||
|
||||
field_active: Actif
|
||||
|
||||
text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée
|
||||
text_regexp_info: ex. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 pour aucune restriction
|
||||
|
@ -959,6 +1010,11 @@ fr:
|
|||
text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront également supprimés."
|
||||
text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
|
||||
text_are_you_sure: Êtes-vous sûr ?
|
||||
text_journal_changed: "%{label} changé de %{old} à %{new}"
|
||||
text_journal_changed_no_detail: "%{label} mis à jour"
|
||||
text_journal_set_to: "%{label} mis à %{value}"
|
||||
text_journal_deleted: "%{label} %{old} supprimé"
|
||||
text_journal_added: "%{label} %{value} ajouté"
|
||||
text_tip_issue_begin_day: tâche commençant ce jour
|
||||
text_tip_issue_end_day: tâche finissant ce jour
|
||||
text_tip_issue_begin_end_day: tâche commençant et finissant ce jour
|
||||
|
@ -984,11 +1040,13 @@ fr:
|
|||
text_time_logged_by_changeset: "Appliqué par commit %{value}"
|
||||
text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?'
|
||||
text_issues_destroy_descendants_confirmation: "Cela entrainera également la suppression de %{count} sous-tâche(s)."
|
||||
text_time_entries_destroy_confirmation: "Etes-vous sûr de vouloir supprimer les temps passés sélectionnés ?"
|
||||
text_select_project_modules: 'Sélectionner les modules à activer pour ce projet :'
|
||||
text_default_administrator_account_changed: Compte administrateur par défaut changé
|
||||
text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture
|
||||
text_plugin_assets_writable: Répertoire public des plugins accessible en écriture
|
||||
text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
|
||||
text_convert_available: Binaire convert de ImageMagick présent (optionel)
|
||||
text_destroy_time_entries_question: "%{hours} heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?"
|
||||
text_destroy_time_entries: Supprimer les heures
|
||||
text_assign_time_entries_to_project: Reporter les heures sur le projet
|
||||
|
@ -1005,7 +1063,16 @@ fr:
|
|||
text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
|
||||
text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page"
|
||||
text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?"
|
||||
text_zoom_in: Zoom avant
|
||||
text_zoom_out: Zoom arrière
|
||||
text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page."
|
||||
text_scm_path_encoding_note: "Défaut : UTF-8"
|
||||
text_git_repository_note: "Le dépôt est vide et local (exemples : /gitrepo, c:\\gitrepo)"
|
||||
text_mercurial_repository_note: "Dépôt local (exemples : /hgrepo, c:\\hgrepo)"
|
||||
text_scm_command: Commande
|
||||
text_scm_command_version: Version
|
||||
text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
|
||||
text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
|
||||
text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)"
|
||||
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
|
||||
text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
|
||||
|
@ -1039,84 +1106,23 @@ fr:
|
|||
enumeration_issue_priorities: Priorités des demandes
|
||||
enumeration_doc_categories: Catégories des documents
|
||||
enumeration_activities: Activités (suivi du temps)
|
||||
label_greater_or_equal: ">="
|
||||
label_less_or_equal: "<="
|
||||
label_between: entre
|
||||
label_view_all_revisions: Voir toutes les révisions
|
||||
label_tag: Tag
|
||||
label_branch: Branche
|
||||
error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
|
||||
error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
|
||||
text_journal_changed: "%{label} changé de %{old} à %{new}"
|
||||
text_journal_changed_no_detail: "%{label} mis à jour"
|
||||
text_journal_set_to: "%{label} mis à %{value}"
|
||||
text_journal_deleted: "%{label} %{old} supprimé"
|
||||
text_journal_added: "%{label} %{value} ajouté"
|
||||
enumeration_system_activity: Activité système
|
||||
label_board_sticky: Sticky
|
||||
label_board_locked: Verrouillé
|
||||
error_unable_delete_issue_status: Impossible de supprimer le statut de demande
|
||||
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
|
||||
error_unable_to_connect: Connexion impossible (%{value})
|
||||
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
|
||||
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
|
||||
field_principal: Principal
|
||||
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
|
||||
text_zoom_out: Zoom arrière
|
||||
text_zoom_in: Zoom avant
|
||||
notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
|
||||
label_overall_spent_time: Temps passé global
|
||||
field_time_entries: Temps passé
|
||||
project_module_gantt: Gantt
|
||||
project_module_calendar: Calendrier
|
||||
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}"
|
||||
field_text: Champ texte
|
||||
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
|
||||
setting_default_notification_option: Option de notification par défaut
|
||||
label_user_mail_option_only_my_events: Seulement pour ce que je surveille
|
||||
label_user_mail_option_only_assigned: Seulement pour ce qui m'est assigné
|
||||
label_user_mail_option_none: Aucune notification
|
||||
field_member_of_group: Groupe de l'assigné
|
||||
field_assigned_to_role: Rôle de l'assigné
|
||||
setting_emails_header: En-tête des emails
|
||||
label_bulk_edit_selected_time_entries: Modifier les temps passés sélectionnés
|
||||
text_time_entries_destroy_confirmation: "Etes-vous sûr de vouloir supprimer les temps passés sélectionnés ?"
|
||||
field_scm_path_encoding: Encodage des chemins
|
||||
text_scm_path_encoding_note: "Défaut : UTF-8"
|
||||
field_path_to_repository: Chemin du dépôt
|
||||
field_root_directory: Répertoire racine
|
||||
field_cvs_module: Module
|
||||
field_cvsroot: CVSROOT
|
||||
text_mercurial_repository_note: "Dépôt local (exemples : /hgrepo, c:\\hgrepo)"
|
||||
text_scm_command: Commande
|
||||
text_scm_command_version: Version
|
||||
label_git_report_last_commit: Afficher le dernier commit des fichiers et répertoires
|
||||
text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification.
|
||||
text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration.
|
||||
label_diff: diff
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Ordre de tri
|
||||
description_project_scope: Périmètre de recherche
|
||||
description_filter: Filtre
|
||||
description_user_mail_notification: Option de notification
|
||||
description_date_from: Date de début
|
||||
description_message_content: Contenu du message
|
||||
description_available_columns: Colonnes disponibles
|
||||
description_all_columns: Toutes les colonnes
|
||||
description_date_range_interval: Choisir une période
|
||||
description_issue_category_reassign: Choisir une catégorie
|
||||
description_search: Champ de recherche
|
||||
description_notes: Notes
|
||||
description_date_range_list: Choisir une période prédéfinie
|
||||
description_choose_project: Projets
|
||||
description_date_to: Date de fin
|
||||
description_project_scope: Périmètre de recherche
|
||||
description_notes: Notes
|
||||
description_message_content: Contenu du message
|
||||
description_query_sort_criteria_attribute: Critère de tri
|
||||
description_wiki_subpages_reassign: Choisir une nouvelle page parent
|
||||
description_query_sort_criteria_direction: Ordre de tri
|
||||
description_user_mail_notification: Option de notification
|
||||
description_available_columns: Colonnes disponibles
|
||||
description_selected_columns: Colonnes sélectionnées
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Enfant
|
||||
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale.
|
||||
setting_repositories_encodings: Encodages des fichiers et des dépôts
|
||||
label_search_for_watchers: Rechercher des observateurs
|
||||
description_all_columns: Toutes les colonnes
|
||||
description_issue_category_reassign: Choisir une catégorie
|
||||
description_wiki_subpages_reassign: Choisir une nouvelle page parent
|
||||
description_date_range_list: Choisir une période prédéfinie
|
||||
description_date_range_interval: Choisir une période
|
||||
description_date_from: Date de début
|
||||
description_date_to: Date de fin
|
||||
text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.<br />Un fois sauvegardé, l''identifiant ne pourra plus être modifié.'
|
||||
text_convert_available: Binaire convert de ImageMagick présent (optionel)
|
||||
|
|
|
@ -1123,3 +1123,7 @@ gl:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1117,3 +1117,7 @@ he:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1113,3 +1113,7 @@ hr:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1131,3 +1131,7 @@
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1116,3 +1116,7 @@ id:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1111,3 +1111,7 @@ it:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -354,8 +354,8 @@ ja:
|
|||
setting_attachment_max_size: 添付ファイルサイズの上限
|
||||
setting_issues_export_limit: エクスポートするチケット数の上限
|
||||
setting_mail_from: 送信元メールアドレス
|
||||
setting_bcc_recipients: ブラインドカーボンコピーで受信(bcc)
|
||||
setting_plain_text_mail: プレインテキストのみ(HTMLなし)
|
||||
setting_bcc_recipients: 宛先を非表示(bcc)
|
||||
setting_plain_text_mail: プレインテキスト形式(HTMLなし)
|
||||
setting_host_name: ホスト名
|
||||
setting_text_formatting: テキストの書式
|
||||
setting_cache_formatted_text: 書式化されたテキストをキャッシュする
|
||||
|
@ -489,12 +489,12 @@ ja:
|
|||
label_issue_plural: チケット
|
||||
label_issue_view_all: すべてのチケットを見る
|
||||
label_issues_by: "%{value} 別のチケット"
|
||||
label_issue_added: チケットが追加されました
|
||||
label_issue_updated: チケットが更新されました
|
||||
label_issue_added: チケットの追加
|
||||
label_issue_updated: チケットの更新
|
||||
label_document: 文書
|
||||
label_document_new: 新しい文書
|
||||
label_document_plural: 文書
|
||||
label_document_added: 文書が追加されました
|
||||
label_document_added: 文書の追加
|
||||
label_role: ロール
|
||||
label_role_plural: ロール
|
||||
label_role_new: 新しいロール
|
||||
|
@ -566,7 +566,7 @@ ja:
|
|||
label_attachment_new: 新しいファイル
|
||||
label_attachment_delete: ファイルを削除
|
||||
label_attachment_plural: ファイル
|
||||
label_file_added: ファイルが追加されました
|
||||
label_file_added: ファイルの追加
|
||||
label_report: レポート
|
||||
label_report_plural: レポート
|
||||
label_news: ニュース
|
||||
|
@ -574,8 +574,8 @@ ja:
|
|||
label_news_plural: ニュース
|
||||
label_news_latest: 最新ニュース
|
||||
label_news_view_all: すべてのニュースを見る
|
||||
label_news_added: ニュースが追加されました
|
||||
label_news_comment_added: ニュースにコメントが追加されました
|
||||
label_news_added: ニュースの追加
|
||||
label_news_comment_added: ニュースへのコメント追加
|
||||
label_settings: 設定
|
||||
label_overview: 概要
|
||||
label_version: バージョン
|
||||
|
@ -748,7 +748,7 @@ ja:
|
|||
label_message_plural: メッセージ
|
||||
label_message_last: 最新のメッセージ
|
||||
label_message_new: 新しいメッセージ
|
||||
label_message_posted: メッセージが追加されました
|
||||
label_message_posted: メッセージの追加
|
||||
label_reply_plural: 返答
|
||||
label_send_information: アカウント情報をユーザーに送信
|
||||
label_year: 年
|
||||
|
@ -809,8 +809,8 @@ ja:
|
|||
label_ascending: 昇順
|
||||
label_descending: 降順
|
||||
label_date_from_to: "%{start}から%{end}まで"
|
||||
label_wiki_content_added: Wikiページが追加されました
|
||||
label_wiki_content_updated: Wikiページが更新されました
|
||||
label_wiki_content_added: Wikiページの追加
|
||||
label_wiki_content_updated: Wikiページの更新
|
||||
label_group: グループ
|
||||
label_group_plural: グループ
|
||||
label_group_new: 新しいグループ
|
||||
|
@ -894,7 +894,7 @@ ja:
|
|||
|
||||
field_active: 有効
|
||||
|
||||
text_select_mail_notifications: どのメール通知を送信するか、アクションを選択してください。
|
||||
text_select_mail_notifications: メール通知の送信対象とする操作を選択してください。
|
||||
text_regexp_info: 例) ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0だと無制限になります
|
||||
text_project_destroy_confirmation: 本当にこのプロジェクトと関連データを削除しますか?
|
||||
|
@ -995,9 +995,9 @@ ja:
|
|||
label_role_anonymous: 匿名ユーザー
|
||||
label_role_non_member: 非メンバー
|
||||
|
||||
label_issue_note_added: 注記が追加されました
|
||||
label_issue_status_updated: ステータスが更新されました
|
||||
label_issue_priority_updated: 優先度が更新されました
|
||||
label_issue_note_added: 注記の追加
|
||||
label_issue_status_updated: ステータスの更新
|
||||
label_issue_priority_updated: 優先度の更新
|
||||
label_issues_visibility_own: 作成者か担当者であるチケット
|
||||
field_issues_visibility: 表示できるチケット
|
||||
label_issues_visibility_all: すべてのチケット
|
||||
|
@ -1135,5 +1135,8 @@ ja:
|
|||
label_link_values_to: 値に設定するリンクURL
|
||||
setting_force_default_language_for_anonymous: 匿名ユーザーに既定の言語を強制
|
||||
setting_force_default_language_for_loggedin: ログインユーザーに既定の言語を強制
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_custom_field_select_type: カスタムフィールドを追加するオブジェクトを選択してください
|
||||
label_issue_assigned_to_updated: 担当者の更新
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1131,33 +1131,32 @@ ko:
|
|||
permission_add_documents: 문서 추가
|
||||
permission_edit_documents: 문서 편집
|
||||
permission_delete_documents: 문서 삭제
|
||||
label_gantt_progress_line: Progress line
|
||||
label_gantt_progress_line: 진행 선
|
||||
setting_jsonp_enabled: JSONP 허용
|
||||
field_inherit_members: 상위 프로젝트로부터 구성원을 상속
|
||||
field_closed_on: 완료일
|
||||
field_generate_password: Generate password
|
||||
field_generate_password: 비밀번호 생성
|
||||
setting_default_projects_tracker_ids: 새 프로젝트에 기본적으로 추가할 일감 유형
|
||||
label_total_time: 합계
|
||||
notice_account_not_activated_yet: You haven't activated your account yet. If you want
|
||||
to receive a new activation email, please <a href="%{url}">click this link</a>.
|
||||
notice_account_locked: Your account is locked.
|
||||
label_hidden: Hidden
|
||||
label_visibility_private: to me only
|
||||
label_visibility_roles: to these roles only
|
||||
label_visibility_public: to any users
|
||||
field_must_change_passwd: Must change password at next logon
|
||||
notice_new_password_must_be_different: The new password must be different from the
|
||||
current password
|
||||
setting_mail_handler_excluded_filenames: Exclude attachments by name
|
||||
text_convert_available: ImageMagick convert available (optional)
|
||||
label_link: Link
|
||||
label_only: only
|
||||
label_drop_down_list: drop-down list
|
||||
label_checkboxes: checkboxes
|
||||
label_link_values_to: Link values to URL
|
||||
setting_force_default_language_for_anonymous: Force default language for anonymous
|
||||
users
|
||||
setting_force_default_language_for_loggedin: Force default language for logged-in
|
||||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
notice_account_not_activated_yet: 계정이 활성화되지 않았습니다. 계정을 활성화하기 위해 메일을 다시 수신하려면 <a href="%{url}">여기를 클릭해 주세요</a>.
|
||||
notice_account_locked: 계정이 잠겨 있습니다.
|
||||
label_hidden: 숨김
|
||||
label_visibility_private: 자신 만
|
||||
label_visibility_roles: 다음 역할 만
|
||||
label_visibility_public: 모든 사용자
|
||||
field_must_change_passwd: 다음 로그온 시 반드시 암호를 변경해야 함
|
||||
notice_new_password_must_be_different: 새 암호는 현재 암호와 달라야 합니다.
|
||||
setting_mail_handler_excluded_filenames: 제외할 첨부 파일명
|
||||
text_convert_available: ImageMagick 변환 사용 가능 (옵션)
|
||||
label_link: 링크
|
||||
label_only: 다음의 것만
|
||||
label_drop_down_list: 드롭다운 목록
|
||||
label_checkboxes: 체크박스
|
||||
label_link_values_to: URL 링크 값
|
||||
setting_force_default_language_for_anonymous: 익명 사용자의 기본 언어 강제
|
||||
setting_force_default_language_for_loggedin: 로그인 사용자의 기본 언어 강제
|
||||
label_custom_field_select_type: 사용자 정의 필드에 추가할 대상을 선택해주세요.
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1171,3 +1171,7 @@ lt:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1106,3 +1106,7 @@ lv:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1112,3 +1112,7 @@ mk:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1113,3 +1113,7 @@ mn:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1091,3 +1091,7 @@ nl:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1102,3 +1102,7 @@
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -150,7 +150,7 @@ pl:
|
|||
# Wiktor Wandachowicz <siryes@gmail.com>, 2010
|
||||
|
||||
actionview_instancetag_blank_option: Proszę wybrać
|
||||
actionview_instancetag_blank_option: Proszę wybierz
|
||||
actionview_instancetag_blank_option: wybierz
|
||||
|
||||
button_activate: Aktywuj
|
||||
button_add: Dodaj
|
||||
|
@ -228,18 +228,18 @@ pl:
|
|||
field_attr_lastname: Nazwisko atrybut
|
||||
field_attr_login: Login atrybut
|
||||
field_attr_mail: E-mail atrybut
|
||||
field_auth_source: Tryb identyfikacji
|
||||
field_auth_source: Tryb uwierzytelniania
|
||||
field_author: Autor
|
||||
field_base_dn: Base DN
|
||||
field_category: Kategoria
|
||||
field_column_names: Nazwy kolumn
|
||||
field_comments: Komentarz
|
||||
field_comments_sorting: Pokazuj komentarze
|
||||
field_created_on: Stworzone
|
||||
field_created_on: Data utworzenia
|
||||
field_default_value: Domyślny
|
||||
field_delay: Opóźnienie
|
||||
field_description: Opis
|
||||
field_done_ratio: "% Wykonane"
|
||||
field_done_ratio: "% Wykonania"
|
||||
field_downloads: Pobrań
|
||||
field_due_date: Data oddania
|
||||
field_effective_date: Data
|
||||
|
@ -298,7 +298,7 @@ pl:
|
|||
field_title: Tytuł
|
||||
field_tracker: Typ zagadnienia
|
||||
field_type: Typ
|
||||
field_updated_on: Zmienione
|
||||
field_updated_on: Data modyfikacji
|
||||
field_url: URL
|
||||
field_user: Użytkownik
|
||||
field_value: Wartość
|
||||
|
@ -337,10 +337,10 @@ pl:
|
|||
label_attachment_plural: Pliki
|
||||
label_attribute: Atrybut
|
||||
label_attribute_plural: Atrybuty
|
||||
label_auth_source: Tryb identyfikacji
|
||||
label_auth_source_new: Nowy tryb identyfikacji
|
||||
label_auth_source_plural: Tryby identyfikacji
|
||||
label_authentication: Identyfikacja
|
||||
label_auth_source: Tryb uwierzytelniania
|
||||
label_auth_source_new: Nowy tryb uwierzytelniania
|
||||
label_auth_source_plural: Tryby uwierzytelniania
|
||||
label_authentication: Uwierzytelnianie
|
||||
label_blocked_by: blokowane przez
|
||||
label_blocks: blokuje
|
||||
label_board: Forum
|
||||
|
@ -411,7 +411,7 @@ pl:
|
|||
label_diff_inline: w linii
|
||||
label_diff_side_by_side: obok siebie
|
||||
label_disabled: zablokowany
|
||||
label_display_per_page: "Na stronę: %{value}"
|
||||
label_display_per_page: "Na stronie: %{value}"
|
||||
label_document: Dokument
|
||||
label_document_added: Dodano dokument
|
||||
label_document_new: Nowy dokument
|
||||
|
@ -477,8 +477,8 @@ pl:
|
|||
label_last_week: ostatni tydzień
|
||||
label_latest_revision: Najnowsza rewizja
|
||||
label_latest_revision_plural: Najnowsze rewizje
|
||||
label_ldap_authentication: Autoryzacja LDAP
|
||||
label_less_than_ago: dni mniej
|
||||
label_ldap_authentication: Uwierzytelnianie LDAP
|
||||
label_less_than_ago: dni temu
|
||||
label_list: Lista
|
||||
label_loading: Ładowanie...
|
||||
label_logged_as: Zalogowany jako
|
||||
|
@ -499,7 +499,7 @@ pl:
|
|||
label_month: Miesiąc
|
||||
label_months_from: miesiące od
|
||||
label_more: Więcej
|
||||
label_more_than_ago: dni więcej
|
||||
label_more_than_ago: dni od teraz
|
||||
label_my_account: Moje konto
|
||||
label_my_page: Moja strona
|
||||
label_my_projects: Moje projekty
|
||||
|
@ -603,7 +603,7 @@ pl:
|
|||
label_string: Tekst
|
||||
label_subproject_plural: Podprojekty
|
||||
label_text: Długi tekst
|
||||
label_theme: Temat
|
||||
label_theme: Motyw
|
||||
label_this_month: ten miesiąc
|
||||
label_this_week: ten tydzień
|
||||
label_this_year: ten rok
|
||||
|
@ -655,7 +655,7 @@ pl:
|
|||
notice_account_unknown_email: Nieznany użytkownik.
|
||||
notice_account_updated: Konto prawidłowo zaktualizowane.
|
||||
notice_account_wrong_password: Złe hasło
|
||||
notice_can_t_change_password: To konto ma zewnętrzne źródło identyfikacji. Nie możesz zmienić hasła.
|
||||
notice_can_t_change_password: To konto ma zewnętrzne źródło uwierzytelniania. Nie możesz zmienić hasła.
|
||||
notice_default_data_loaded: Domyślna konfiguracja została pomyślnie załadowana.
|
||||
notice_email_error: "Wystąpił błąd w trakcie wysyłania e-maila (%{value})"
|
||||
notice_email_sent: "E-mail został wysłany do %{value}"
|
||||
|
@ -666,9 +666,9 @@ pl:
|
|||
notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować."
|
||||
notice_not_authorized: Nie posiadasz autoryzacji do oglądania tej strony.
|
||||
notice_successful_connection: Udane nawiązanie połączenia.
|
||||
notice_successful_create: Utworzenie zakończone sukcesem.
|
||||
notice_successful_delete: Usunięcie zakończone sukcesem.
|
||||
notice_successful_update: Uaktualnienie zakończone sukcesem.
|
||||
notice_successful_create: Utworzenie zakończone pomyślnie.
|
||||
notice_successful_delete: Usunięcie zakończone pomyślnie.
|
||||
notice_successful_update: Uaktualnienie zakończone pomyślnie.
|
||||
notice_unable_delete_version: Nie można usunąć wersji
|
||||
permission_add_issue_notes: Dodawanie notatek
|
||||
permission_add_issue_watchers: Dodawanie obserwatorów
|
||||
|
@ -732,7 +732,7 @@ pl:
|
|||
setting_autofetch_changesets: Automatyczne pobieranie zmian
|
||||
setting_autologin: Automatyczne logowanie
|
||||
setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc)
|
||||
setting_commit_fix_keywords: Słowa zmieniające status
|
||||
setting_commit_fix_keywords: Słowo zmieniające status
|
||||
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
|
||||
|
@ -758,7 +758,7 @@ pl:
|
|||
setting_sys_api_enabled: Włączenie WS do zarządzania repozytorium
|
||||
setting_text_formatting: Formatowanie tekstu
|
||||
setting_time_format: Format czasu
|
||||
setting_user_format: Własny format wyświetlania
|
||||
setting_user_format: Format wyświetlania użytkownika
|
||||
setting_welcome_text: Tekst powitalny
|
||||
setting_wiki_compression: Kompresja historii Wiki
|
||||
status_active: aktywny
|
||||
|
@ -782,7 +782,7 @@ pl:
|
|||
text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii
|
||||
text_issue_updated: "Zagadnienie %{id} zostało zaktualizowane (przez %{author})."
|
||||
text_issues_destroy_confirmation: 'Czy jesteś pewien, że chcesz usunąć wskazane zagadnienia?'
|
||||
text_issues_ref_in_commit_messages: Odwołania do zagadnień w komentarzach zatwierdzeń
|
||||
text_issues_ref_in_commit_messages: Odwołania do zagadnień Redmine w komentarzach w repozytorium
|
||||
text_length_between: "Długość pomiędzy %{min} i %{max} znaków."
|
||||
text_load_default_configuration: Załaduj domyślną konfigurację
|
||||
text_min_max_length_info: 0 oznacza brak restrykcji
|
||||
|
@ -888,7 +888,7 @@ pl:
|
|||
label_version_sharing_system: Ze wszystkimi projektami
|
||||
label_version_sharing_tree: Z drzewem projektów
|
||||
notice_api_access_key_reseted: Twój klucz dostępu do API został zresetowany.
|
||||
notice_issue_done_ratios_updated: Uaktualnienie % wykonania zakończone sukcesem.
|
||||
notice_issue_done_ratios_updated: Uaktualnienie % wykonania zakończone pomyślnie.
|
||||
permission_add_subprojects: Tworzenie podprojektów
|
||||
permission_delete_issue_watchers: Usuń obserwatorów
|
||||
permission_view_issues: Przeglądanie zagadnień
|
||||
|
@ -935,45 +935,45 @@ pl:
|
|||
project_module_calendar: Kalendarz
|
||||
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
|
||||
field_text: Text field
|
||||
label_user_mail_option_only_owner: Only for things I am the owner of
|
||||
setting_default_notification_option: Default notification option
|
||||
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
|
||||
label_user_mail_option_only_assigned: Only for things I am assigned to
|
||||
label_user_mail_option_none: "Tylko to, co obserwuję lub w czym biorę udział"
|
||||
field_member_of_group: Assignee's group
|
||||
field_assigned_to_role: Assignee's role
|
||||
label_user_mail_option_only_owner: Tylko to, czego jestem właścicielem (autorem)
|
||||
setting_default_notification_option: Domyślna opcja powiadomień
|
||||
label_user_mail_option_only_my_events: "Tylko to, co obserwuję lub w czym biorę udział"
|
||||
label_user_mail_option_only_assigned: "Tylko to, do czego jestem przypisany"
|
||||
label_user_mail_option_none: "Brak powiadomień"
|
||||
field_member_of_group: Grupa osoby przypisanej
|
||||
field_assigned_to_role: Rola osoby przypisanej
|
||||
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||
label_principal_search: "Szukaj użytkownika lub grupy:"
|
||||
label_user_search: "Szukaj użytkownika:"
|
||||
field_visible: Visible
|
||||
setting_commit_logtime_activity_id: Activity for logged time
|
||||
field_visible: Widoczne
|
||||
setting_commit_logtime_activity_id: Aktywność dla śledzonego czasu
|
||||
text_time_logged_by_changeset: Applied in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Enable time logging
|
||||
setting_commit_logtime_enabled: Włącz śledzenie czasu
|
||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
setting_gantt_items_limit: Maksymalna liczba elementów wyświetlanych na diagramie Gantta
|
||||
field_warn_on_leaving_unsaved: Ostrzegaj mnie, gdy opuszczam stronę z niezapisanym tekstem
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
label_my_queries: My custom queries
|
||||
label_my_queries: Moje kwerendy
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
label_news_comment_added: Comment added to a news
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_news_comment_added: Dodano komentarz do komunikatu
|
||||
button_expand_all: Rozwiń wszystkie
|
||||
button_collapse_all: Zwiń wszystkie
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
||||
label_role_anonymous: Anonymous
|
||||
label_role_non_member: Non member
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_issues_visibility_own: Issues created by or assigned to the user
|
||||
field_issues_visibility: Issues visibility
|
||||
label_issues_visibility_all: All issues
|
||||
permission_set_own_issues_private: Set own issues public or private
|
||||
field_is_private: Private
|
||||
permission_set_issues_private: Set issues public or private
|
||||
label_issues_visibility_public: All non private issues
|
||||
label_role_anonymous: Anonimowy
|
||||
label_role_non_member: Bez roli
|
||||
label_issue_note_added: Dodano notatkę
|
||||
label_issue_status_updated: Uaktualniono status
|
||||
label_issue_priority_updated: Uaktualniono priorytet
|
||||
label_issues_visibility_own: Utworzone lub przypisane do użytkownika
|
||||
field_issues_visibility: Widoczne zagadnienia
|
||||
label_issues_visibility_all: Wszystkie
|
||||
permission_set_own_issues_private: Ustawianie własnych zagadnień jako prywatne/publiczne
|
||||
field_is_private: Prywatne
|
||||
permission_set_issues_private: Ustawianie zagadnień jako prywatne/publiczne
|
||||
label_issues_visibility_public: Wszystkie nie prywatne
|
||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
||||
field_commit_logs_encoding: Kodowanie komentarzy zatwierdzeń
|
||||
field_scm_path_encoding: Path encoding
|
||||
|
@ -983,12 +983,12 @@ pl:
|
|||
field_cvs_module: Module
|
||||
field_cvsroot: CVSROOT
|
||||
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Command
|
||||
text_scm_command_version: Version
|
||||
text_scm_command: Polecenie
|
||||
text_scm_command_version: Wersja
|
||||
label_git_report_last_commit: Report last commit for files and directories
|
||||
notice_issue_successful_create: Issue %{id} created.
|
||||
label_between: between
|
||||
setting_issue_group_assignment: Allow issue assignment to groups
|
||||
label_between: pomiędzy
|
||||
setting_issue_group_assignment: Zezwól przypisywać zagadnienia do grup
|
||||
label_diff: diff
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
|
@ -997,7 +997,7 @@ pl:
|
|||
description_user_mail_notification: Mail notification settings
|
||||
description_date_from: Enter start date
|
||||
description_message_content: Message content
|
||||
description_available_columns: Available Columns
|
||||
description_available_columns: Dostępne kolumny
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_search: Searchfield
|
||||
|
@ -1007,13 +1007,13 @@ pl:
|
|||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_selected_columns: Selected Columns
|
||||
description_selected_columns: Wybrane kolumny
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Child
|
||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||
setting_default_issue_start_date_to_creation_date: Użyj bieżącej daty jako daty rozpoczęcia nowych zagadnień
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
setting_repositories_encodings: Kodowanie znaków załączników i repozytoriów
|
||||
description_all_columns: All Columns
|
||||
button_export: Export
|
||||
label_export_options: "%{export_format} export options"
|
||||
|
@ -1030,107 +1030,109 @@ pl:
|
|||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: 'Dozwolone małe litery (a-z), liczby i myślniki.<br />Raz zapisany, identyfikator nie może być zmieniony.'
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
setting_commit_cross_project_ref: Zezwól na odwołania do innych projektów i zamykanie zagadnień innych projektów
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
permission_manage_related_issues: Zarządzanie powiązanymi zagadnieniami
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
label_search_for_watchers: Wyszukaj obserwatorów do dodania
|
||||
notice_account_deleted: Twoje konto zostało trwale usunięte.
|
||||
setting_unsubscribe: Zezwól użytkownikom usuwać swoje konta
|
||||
button_delete_my_account: Usuń moje konto
|
||||
text_account_destroy_confirmation: |-
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
Czy jesteś pewien?
|
||||
Twoje konto zostanie trwale usunięte, bez możliwości przywrócenia go.
|
||||
error_session_expired: Twoja sesja wygasła. Zaloguj się ponownie.
|
||||
text_session_expiration_settings: "Uwaga: zmiana tych ustawień może spowodować przeterminowanie sesji obecnie zalogowanych użytkowników, w tym twojej."
|
||||
setting_session_lifetime: Maksymalny czas życia sesji
|
||||
setting_session_timeout: Maksymalny czas życia nieaktywnej sesji
|
||||
label_session_expiration: Przeterminowywanie sesji
|
||||
permission_close_project: Zamykanie / otwieranie projektów
|
||||
label_show_closed_projects: Przeglądanie zamkniętych projektów
|
||||
button_close: Zamknij projekt
|
||||
button_reopen: Otwórz projekt
|
||||
project_status_active: aktywny
|
||||
project_status_closed: zamknięty
|
||||
project_status_archived: zarchiwizowany
|
||||
text_project_closed: Ten projekt jest zamknięty i dostępny tylko do odczytu.
|
||||
notice_user_successful_create: Utworzono użytkownika %{id}.
|
||||
field_core_fields: Pola standardowe
|
||||
field_timeout: Limit czasu (w sekundach)
|
||||
setting_thumbnails_enabled: Wyświetlaj miniatury załączników
|
||||
setting_thumbnails_size: Rozmiar minuatury (w pikselach)
|
||||
label_status_transitions: Przejścia między statusami
|
||||
label_fields_permissions: Uprawnienia do pól
|
||||
label_readonly: Tylko do odczytu
|
||||
label_required: Wymagane
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_copy_subtasks: Kopiuj podzagadnienia
|
||||
label_copied_to: skopiowane do
|
||||
label_copied_from: skopiowane z
|
||||
label_any_issues_in_project: dowolne zagadnienie w projekcie
|
||||
label_any_issues_not_in_project: dowolne zagadnienie w innym projekcie
|
||||
field_private_notes: Prywatne notatki
|
||||
permission_view_private_notes: Podgląd prywatnych notatek
|
||||
permission_set_notes_private: Ustawianie notatek jako prywatnych
|
||||
label_no_issues_in_project: brak zagadnień w projekcie
|
||||
label_any: wszystko
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_last_n_weeks: ostatnie %{count} tygodnie
|
||||
setting_cross_project_subtasks: Powiązania zagadnień między projektami
|
||||
label_cross_project_descendants: Z podprojektami
|
||||
label_cross_project_tree: Z drzewem projektów
|
||||
label_cross_project_hierarchy: Z hierarchią projektów
|
||||
label_cross_project_system: Ze wszystkimi projektami
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
button_hide: Ukryj
|
||||
setting_non_working_week_days: Dni nie-robocze
|
||||
label_in_the_next_days: w ciągu następnych dni
|
||||
label_in_the_past_days: w ciągu poprzednich dni
|
||||
label_attribute_of_user: User's %{name}
|
||||
text_turning_multiple_off: If you disable multiple values, multiple values will be
|
||||
removed in order to preserve only one value per item.
|
||||
label_attribute_of_issue: Issue's %{name}
|
||||
permission_add_documents: Add documents
|
||||
permission_edit_documents: Edit documents
|
||||
permission_delete_documents: Delete documents
|
||||
label_gantt_progress_line: Progress line
|
||||
setting_jsonp_enabled: Enable JSONP support
|
||||
field_inherit_members: Inherit members
|
||||
field_closed_on: Closed
|
||||
field_generate_password: Generate password
|
||||
setting_default_projects_tracker_ids: Default trackers for new projects
|
||||
permission_add_documents: Dodawanie dokumentów
|
||||
permission_edit_documents: Edycja dokumentów
|
||||
permission_delete_documents: Usuwanie dokumentów
|
||||
label_gantt_progress_line: Linia postępu
|
||||
setting_jsonp_enabled: Uaktywnij wsparcie dla JSONP
|
||||
field_inherit_members: Dziedziczenie członków
|
||||
field_closed_on: Data zamknięcia
|
||||
field_generate_password: Wygeneruj hasło
|
||||
setting_default_projects_tracker_ids: Domyślne typy zagadnień dla nowych projektów
|
||||
label_total_time: Ogółem
|
||||
text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it.
|
||||
text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel.
|
||||
setting_emails_header: Email header
|
||||
notice_account_not_activated_yet: You haven't activated your account yet. If you want
|
||||
to receive a new activation email, please <a href="%{url}">click this link</a>.
|
||||
notice_account_locked: Your account is locked.
|
||||
notice_account_register_done: Account was successfully created. An email containing
|
||||
the instructions to activate your account was sent to %{email}.
|
||||
text_scm_config: Możesz skonfigurować polecenia SCM w pliku config/configuration.yml. Zrestartuj aplikację po wykonaniu zmian.
|
||||
text_scm_command_not_available: Polecenie SCM nie jest dostępne. Proszę sprawdzić ustawienia w panelu administracyjnym.
|
||||
setting_emails_header: Nagłówek e-maili
|
||||
notice_account_not_activated_yet: Jeszcze nie aktywowałeś swojego konta. Jeśli chcesz
|
||||
otrzymać nowy e-mail aktywanyjny, <a href="%{url}">kliknij tutaj</a>.
|
||||
notice_account_locked: Twoje konto jest zablokowane.
|
||||
notice_account_register_done: Konto zostało pomyślnie utworzone. E-mail zawierający
|
||||
instrukcję aktywacji konta został wysłany na adres %{email}.
|
||||
label_hidden: Hidden
|
||||
label_visibility_private: to me only
|
||||
label_visibility_roles: to these roles only
|
||||
label_visibility_public: to any users
|
||||
field_must_change_passwd: Must change password at next logon
|
||||
label_visibility_private: tylko dla mnie
|
||||
label_visibility_roles: tylko dla ról
|
||||
label_visibility_public: dla wszystkich
|
||||
field_must_change_passwd: Musi zmienić hasło przy następnym logowaniu
|
||||
notice_new_password_must_be_different: The new password must be different from the
|
||||
current password
|
||||
setting_mail_handler_excluded_filenames: Exclude attachments by name
|
||||
text_convert_available: ImageMagick convert available (optional)
|
||||
setting_mail_handler_excluded_filenames: Wyklucz załączniki wg nazwy
|
||||
text_convert_available: Konwersja przez ImageMagick dostępna (optional)
|
||||
label_link: Link
|
||||
label_only: only
|
||||
label_drop_down_list: drop-down list
|
||||
label_checkboxes: checkboxes
|
||||
label_link_values_to: Link values to URL
|
||||
setting_force_default_language_for_anonymous: Force default language for anonymous
|
||||
users
|
||||
setting_force_default_language_for_loggedin: Force default language for logged-in
|
||||
users
|
||||
setting_force_default_language_for_anonymous: Wymuś domyślny język dla anonimowych użytkowników
|
||||
setting_force_default_language_for_loggedin: Wymuś domyślny język dla zalogowanych użytkowników
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Uaktualniono osobę przypisaną
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1131,3 +1131,7 @@ pt-BR:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1118,3 +1118,7 @@ pt:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1107,3 +1107,7 @@ ro:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1217,5 +1217,8 @@ ru:
|
|||
label_link_values_to: Значения ссылки для URL
|
||||
setting_force_default_language_for_anonymous: Не определять язык для анонимных пользователей
|
||||
setting_force_default_language_for_loggedin: Не определять язык для зарегистрированных пользователей
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_custom_field_select_type: Выберите тип объекта для которого будет создано настраиваемое поле
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1102,3 +1102,7 @@ sk:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1112,3 +1112,7 @@ sl:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1108,3 +1108,7 @@ sq:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1114,3 +1114,7 @@ sr-YU:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1113,3 +1113,7 @@ sr:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1150,3 +1150,7 @@ sv:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1109,3 +1109,7 @@ th:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -357,7 +357,7 @@ tr:
|
|||
label_tracker_new: Yeni iş tipi
|
||||
label_workflow: İş akışı
|
||||
label_issue_status: İş durumu
|
||||
label_issue_status_plural: İş durumuları
|
||||
label_issue_status_plural: İş durumları
|
||||
label_issue_status_new: Yeni durum
|
||||
label_issue_category: İş kategorisi
|
||||
label_issue_category_plural: İş kategorileri
|
||||
|
@ -1121,3 +1121,7 @@ tr:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1107,3 +1107,7 @@ uk:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -1165,3 +1165,7 @@ vi:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -278,7 +278,7 @@
|
|||
error_can_not_delete_custom_field: 無法刪除自訂欄位
|
||||
error_can_not_delete_tracker: "此追蹤標籤已包含問題,無法被刪除。"
|
||||
error_can_not_remove_role: "此角色已被使用,無法將其刪除。"
|
||||
error_can_not_reopen_issue_on_closed_version: '指派給「已結束」版本的問題,無法再將其狀態變更為「進行中」'
|
||||
error_can_not_reopen_issue_on_closed_version: '分派給「已結束」版本的問題,無法再將其狀態變更為「進行中」'
|
||||
error_can_not_archive_project: 此專案無法被封存
|
||||
error_issue_done_ratios_not_updated: "問題完成百分比未更新。"
|
||||
error_workflow_copy_source: '請選擇一個來源問題追蹤標籤或角色'
|
||||
|
@ -298,7 +298,7 @@
|
|||
mail_subject_account_activation_request: Redmine 帳號啟用需求通知
|
||||
mail_body_account_activation_request: "有位新用戶 (%{value}) 已經完成註冊,正等候您的審核:"
|
||||
mail_subject_reminder: "您有 %{count} 個問題即將到期 (%{days})"
|
||||
mail_body_reminder: "%{count} 個指派給您的問題,將於 %{days} 天之內到期:"
|
||||
mail_body_reminder: "%{count} 個分派給您的問題,將於 %{days} 天之內到期:"
|
||||
mail_subject_wiki_content_added: "'%{id}' wiki 頁面已被新增"
|
||||
mail_body_wiki_content_added: "此 '%{id}' wiki 頁面已被 %{author} 新增。"
|
||||
mail_subject_wiki_content_updated: "'%{id}' wiki 頁面已被更新"
|
||||
|
@ -337,7 +337,7 @@
|
|||
field_tracker: 追蹤標籤
|
||||
field_subject: 主旨
|
||||
field_due_date: 完成日期
|
||||
field_assigned_to: 分派給
|
||||
field_assigned_to: 被分派者
|
||||
field_priority: 優先權
|
||||
field_fixed_version: 版本
|
||||
field_user: 用戶
|
||||
|
@ -399,8 +399,8 @@
|
|||
field_group_by: 結果分組方式
|
||||
field_sharing: 共用
|
||||
field_parent_issue: 父問題
|
||||
field_member_of_group: "被指派者的群組"
|
||||
field_assigned_to_role: "被指派者的角色"
|
||||
field_member_of_group: "被分派者的群組"
|
||||
field_assigned_to_role: "被分派者的角色"
|
||||
field_text: 內容文字
|
||||
field_visible: 可被看見
|
||||
field_warn_on_leaving_unsaved: "提醒我將要離開的頁面中尚有未儲存的資料"
|
||||
|
@ -469,7 +469,7 @@
|
|||
setting_repository_log_display_limit: 修訂版顯示數目之最大值
|
||||
setting_openid: 允許使用 OpenID 登入與註冊
|
||||
setting_password_min_length: 密碼最小長度
|
||||
setting_new_project_user_role_id: 管理者以外之用戶建立新專案時,將被指派的角色
|
||||
setting_new_project_user_role_id: 管理者以外之用戶建立新專案時,將被分派的角色
|
||||
setting_default_projects_modules: 新專案預設啟用的模組
|
||||
setting_issue_done_ratio: 計算問題完成百分比之方式
|
||||
setting_issue_done_ratio_issue_field: 依據問題完成百分比欄位
|
||||
|
@ -481,7 +481,7 @@
|
|||
setting_commit_logtime_enabled: 啟用認可中的時間記錄
|
||||
setting_commit_logtime_activity_id: 時間記錄對應的活動
|
||||
setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值
|
||||
setting_issue_group_assignment: 允許問題被指派至群組
|
||||
setting_issue_group_assignment: 允許問題被分派至群組
|
||||
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
|
||||
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
|
||||
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
|
||||
|
@ -593,6 +593,7 @@
|
|||
label_issue_updated: 問題已更新
|
||||
label_issue_note_added: 筆記已新增
|
||||
label_issue_status_updated: 狀態已更新
|
||||
label_issue_assigned_to_updated: 被分派者已更新
|
||||
label_issue_priority_updated: 優先權已更新
|
||||
label_document: 文件
|
||||
label_document_new: 建立新文件
|
||||
|
@ -901,7 +902,7 @@
|
|||
label_user_mail_option_selected: "只提醒我所選擇專案中的事件..."
|
||||
label_user_mail_option_none: "取消提醒"
|
||||
label_user_mail_option_only_my_events: "只提醒我觀察中或參與中的事物"
|
||||
label_user_mail_option_only_assigned: "只提醒我被指派的事物"
|
||||
label_user_mail_option_only_assigned: "只提醒我被分派的事物"
|
||||
label_user_mail_option_only_owner: "只提醒我作為擁有者的事物"
|
||||
label_user_mail_no_self_notified: "不提醒我自己所做的變更"
|
||||
label_registration_activation_by_email: 透過電子郵件啟用帳戶
|
||||
|
@ -913,7 +914,7 @@
|
|||
label_general: 一般
|
||||
label_more: 更多 »
|
||||
label_scm: 版本控管
|
||||
label_plugins: 附加元件
|
||||
label_plugins: 外掛程式
|
||||
label_ldap_authentication: LDAP 認證
|
||||
label_downloads_abbr: 下載
|
||||
label_optional_description: 額外的說明
|
||||
|
@ -956,10 +957,10 @@
|
|||
label_principal_search: "搜尋用戶或群組:"
|
||||
label_user_search: "搜尋用戶:"
|
||||
label_additional_workflow_transitions_for_author: 用戶為作者時額外允許的流程轉換
|
||||
label_additional_workflow_transitions_for_assignee: 用戶為被指定者時額外允許的流程轉換
|
||||
label_additional_workflow_transitions_for_assignee: 用戶為被分派者時額外允許的流程轉換
|
||||
label_issues_visibility_all: 所有問題
|
||||
label_issues_visibility_public: 所有非私人問題
|
||||
label_issues_visibility_own: 使用者所建立的或被指派的問題
|
||||
label_issues_visibility_own: 使用者所建立的或被分派的問題
|
||||
label_git_report_last_commit: 報告最後認可的文件和目錄
|
||||
label_parent_revision: 父項
|
||||
label_child_revision: 子項
|
||||
|
@ -979,7 +980,7 @@
|
|||
label_attribute_of_project: "專案是 %{name}"
|
||||
label_attribute_of_issue: "問題是 %{name}"
|
||||
label_attribute_of_author: "作者是 %{name}"
|
||||
label_attribute_of_assigned_to: "被指派者是 %{name}"
|
||||
label_attribute_of_assigned_to: "被分派者是 %{name}"
|
||||
label_attribute_of_user: "用戶是 %{name}"
|
||||
label_attribute_of_fixed_version: "版本是 %{name}"
|
||||
label_cross_project_descendants: 與子專案共用
|
||||
|
@ -996,6 +997,9 @@
|
|||
label_checkboxes: 核取方塊
|
||||
label_link_values_to: 連結欄位值至此網址
|
||||
label_custom_field_select_type: 請選擇連結此自訂欄位的物件類型
|
||||
label_check_for_updates: 檢查更新
|
||||
label_latest_compatible_version: 最新的相容版本
|
||||
label_unknown_plugin: 無法辨識的外掛程式
|
||||
|
||||
button_login: 登入
|
||||
button_submit: 送出
|
||||
|
@ -1091,10 +1095,10 @@
|
|||
text_issue_added: "問題 %{id} 已被 %{author} 通報。"
|
||||
text_issue_updated: "問題 %{id} 已被 %{author} 更新。"
|
||||
text_wiki_destroy_confirmation: 您確定要刪除這個 wiki 和其中的所有內容?
|
||||
text_issue_category_destroy_question: "有 (%{count}) 個問題被指派到此分類. 請選擇您想要的動作?"
|
||||
text_issue_category_destroy_question: "有 (%{count}) 個問題被分派到此分類. 請選擇您想要的動作?"
|
||||
text_issue_category_destroy_assignments: 移除這些問題的分類
|
||||
text_issue_category_reassign_to: 重新指派這些問題至其它分類
|
||||
text_user_mail_option: "對於那些未被選擇的專案,將只會接收到您正在觀察中,或是參與中的問題通知。(「參與中的問題」包含您建立的或是指派給您的問題)"
|
||||
text_issue_category_reassign_to: 重新分派這些問題至其它分類
|
||||
text_user_mail_option: "對於那些未被選擇的專案,將只會接收到您正在觀察中,或是參與中的問題通知。(「參與中的問題」包含您建立的或是分派給您的問題)"
|
||||
text_no_configuration_data: "角色、追蹤標籤、問題狀態與流程尚未被設定完成。\n強烈建議您先載入預設的組態。將預設組態載入之後,您可再變更其中之值。"
|
||||
text_load_default_configuration: 載入預設組態
|
||||
text_status_changed_by_changeset: "已套用至變更集 %{value}."
|
||||
|
@ -1105,7 +1109,7 @@
|
|||
text_select_project_modules: '選擇此專案可使用之模組:'
|
||||
text_default_administrator_account_changed: 已變更預設管理員帳號內容
|
||||
text_file_repository_writable: 可寫入附加檔案目錄
|
||||
text_plugin_assets_writable: 可寫入附加元件目錄
|
||||
text_plugin_assets_writable: 可寫入外掛程式目錄
|
||||
text_rmagick_available: 可使用 RMagick (選配)
|
||||
text_convert_available: 可使用 ImageMagick 轉換圖片格式 (選配)
|
||||
text_destroy_time_entries_question: 您即將刪除的問題已報工 %{hours} 小時. 您的選擇是?
|
||||
|
|
|
@ -1113,3 +1113,7 @@ zh:
|
|||
users
|
||||
label_custom_field_select_type: Select the type of object to which the custom field
|
||||
is to be attached
|
||||
label_issue_assigned_to_updated: Assignee updated
|
||||
label_check_for_updates: Check for updates
|
||||
label_latest_compatible_version: Latest compatible version
|
||||
label_unknown_plugin: Unknown plugin
|
||||
|
|
|
@ -4,6 +4,27 @@ Redmine - project management software
|
|||
Copyright (C) 2006-2014 Jean-Philippe Lang
|
||||
http://www.redmine.org/
|
||||
|
||||
== 2014-03-29 v2.5.1
|
||||
|
||||
* Defect #14298: Error generated on 'search for watchers to add' after clicking add without selected users
|
||||
* Defect #16236: Right-aligned table of contents (TOC) not working with markdown
|
||||
* Defect #16255: Internal Error for specific version of non-existent wiki page
|
||||
* Defect #16259: Changing Tracker value on new issue form makes hidden fields appearing after hitting F5
|
||||
* Defect #16321: Custom Fields with "Link values to URL" set are displayed as escaped html in email
|
||||
* Defect #16338: Can't choose an issue of a different project when updating time entries
|
||||
* Defect #16353: Regexp bug in JournalsController regexp handling when quoting existing journal entries
|
||||
* Feature #16326: Custom queries, buttons to move column to top and bottom
|
||||
* Patch #16291: Japanese translation update
|
||||
* Patch #16319: Random crash when using custom fields
|
||||
* Patch #16320: Turkish typo fix
|
||||
* Patch #16334: Korean Translation
|
||||
* Patch #16336: Russian translation
|
||||
* Patch #16356: Spanish Translation: label_custom_field_select_type
|
||||
* Patch #16368: Polish translation update
|
||||
* Patch #16381: Extract code to render project context links to helper
|
||||
* Patch #16453: Czech localisation
|
||||
* Defect #16466: Fixed back url verification
|
||||
|
||||
== 2014-03-02 v2.5.0
|
||||
|
||||
* Defect #3163: Large inline images overflow
|
||||
|
@ -72,6 +93,11 @@ http://www.redmine.org/
|
|||
* Defect #16038: Issue#css_classes corrupts user.groups association cache
|
||||
* Patch #15960: pt-BR translation for 2.4-stable
|
||||
|
||||
Additional note:
|
||||
|
||||
#15781 was forgotten to merge to v2.4.3.
|
||||
It is in v2.5.0.
|
||||
|
||||
== 2013-12-23 v2.4.2
|
||||
|
||||
* Defect #15398: HTML 5 invalid <center> tag
|
||||
|
@ -1415,7 +1441,7 @@ http://www.redmine.org/
|
|||
* #819: Add a body ID and class to all pages
|
||||
* #871: Commit new CSS styles!
|
||||
* #3301: Add favicon to base layout
|
||||
* #4656: On Issue#show page, clicking on “Add related issueâ€<C3A2> should focus on the input
|
||||
* #4656: On Issue#show page, clicking on "Add related issue" should focus on the input
|
||||
* #4896: Project identifier should be a limited field
|
||||
* #5084: Filter all isssues by projects
|
||||
* #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase
|
||||
|
@ -2424,7 +2450,7 @@ http://www.redmine.org/
|
|||
* Search engines now supports pagination. Results are sorted in reverse chronological order
|
||||
* Added "Estimated hours" attribute on issues
|
||||
* A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
|
||||
* Forum notifications are now also sent to the authors of the thread, even if they don�t watch the board
|
||||
* Forum notifications are now also sent to the authors of the thread, even if they don't watch the board
|
||||
* Added an application setting to specify the application protocol (http or https) used to generate urls in emails
|
||||
* Gantt chart: now starts at the current month by default
|
||||
* Gantt chart: month count and zoom factor are automatically saved as user preferences
|
||||
|
@ -2432,7 +2458,7 @@ http://www.redmine.org/
|
|||
* Added wiki index by date
|
||||
* Added preview on add/edit issue form
|
||||
* Emails footer can now be customized from the admin interface (Admin -> Email notifications)
|
||||
* Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they�re properly displayed)
|
||||
* Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they're properly displayed)
|
||||
* Calendar: first day of week can now be set in lang files
|
||||
* Automatic closing of duplicate issues
|
||||
* Added a cross-project issue list
|
||||
|
@ -2444,7 +2470,7 @@ http://www.redmine.org/
|
|||
* Added some accesskeys
|
||||
* Added "Float" as a custom field format
|
||||
* Added basic Theme support
|
||||
* Added the ability to set the �done ratio� of issues fixed by commit (Nikolay Solakov)
|
||||
* Added the ability to set the "done ratio" of issues fixed by commit (Nikolay Solakov)
|
||||
* Added custom fields in issue related mail notifications
|
||||
* Email notifications are now sent in plain text and html
|
||||
* Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
|
||||
|
@ -2477,7 +2503,7 @@ http://www.redmine.org/
|
|||
* Added Korean translation (Choi Jong Yoon)
|
||||
* Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
|
||||
* Performance improvement on calendar and gantt
|
||||
* Fixed: wiki preview doesn�t work on long entries
|
||||
* Fixed: wiki preview doesn't work on long entries
|
||||
* Fixed: queries with multiple custom fields return no result
|
||||
* Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
|
||||
* Fixed: URL with ~ broken in wiki formatting
|
||||
|
@ -2488,7 +2514,7 @@ http://www.redmine.org/
|
|||
|
||||
* per project forums added
|
||||
* added the ability to archive projects
|
||||
* added �Watch� functionality on issues. It allows users to receive notifications about issue changes
|
||||
* added "Watch" functionality on issues. It allows users to receive notifications about issue changes
|
||||
* custom fields for issues can now be used as filters on issue list
|
||||
* added per user custom queries
|
||||
* commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
|
||||
|
@ -2529,7 +2555,7 @@ http://www.redmine.org/
|
|||
* added swedish translation (Thomas Habets)
|
||||
* italian translation update (Alessio Spadaro)
|
||||
* japanese translation update (Satoru Kurashiki)
|
||||
* fixed: error on history atom feed when there�s no notes on an issue change
|
||||
* fixed: error on history atom feed when there's no notes on an issue change
|
||||
* fixed: error in journalizing an issue with longtext custom fields (Postgresql)
|
||||
* fixed: creation of Oracle schema
|
||||
* fixed: last day of the month not included in project activity
|
||||
|
|
|
@ -87,7 +87,7 @@ module Redmine
|
|||
a = Attachment.find_by_token(token)
|
||||
next unless a
|
||||
a.filename = attachment['filename'] unless attachment['filename'].blank?
|
||||
a.content_type = attachment['content_type']
|
||||
a.content_type = attachment['content_type'] unless attachment['content_type'].blank?
|
||||
end
|
||||
next unless a
|
||||
a.description = attachment['description'].to_s.strip
|
||||
|
|
|
@ -81,7 +81,7 @@ module Redmine
|
|||
end
|
||||
end
|
||||
|
||||
# Returns the mail adresses of users that should be notified
|
||||
# Returns the mail addresses of users that should be notified
|
||||
def recipients
|
||||
notified = project.notified_users
|
||||
notified.reject! {|user| !visible?(user)}
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
Autotest.add_hook :initialize do |at|
|
||||
at.clear_mappings
|
||||
|
||||
at.add_mapping %r%^lib/(.*)\.rb$% do |_, m|
|
||||
at.files_matching %r%^test/#{m[1]}_test.rb$%
|
||||
end
|
||||
|
||||
at.add_mapping(%r%^test/.*\.rb$%) {|filename, _| filename }
|
||||
|
||||
at.add_mapping %r%^test/fixtures/(.*)s.yml% do |_, _|
|
||||
at.files_matching %r%^test/.*\.rb$%
|
||||
end
|
||||
end
|
|
@ -0,0 +1,8 @@
|
|||
awesome_nested_set.sqlite3.db
|
||||
spec/debug.log
|
||||
rdoc
|
||||
coverage
|
||||
pkg
|
||||
*.gem
|
||||
Gemfile.lock
|
||||
gemfiles/Gemfile*.lock
|
|
@ -0,0 +1,22 @@
|
|||
language: ruby
|
||||
notifications:
|
||||
email:
|
||||
- parndt@gmail.com
|
||||
script: bundle exec rspec spec
|
||||
env:
|
||||
- DB=sqlite3
|
||||
- DB=sqlite3mem
|
||||
- DB=postgresql
|
||||
- DB=mysql
|
||||
rvm:
|
||||
- 2.0.0
|
||||
- 1.9.3
|
||||
- 1.8.7
|
||||
- rbx-19mode
|
||||
- jruby-19mode
|
||||
- rbx-18mode
|
||||
- jruby-18mode
|
||||
gemfile:
|
||||
- gemfiles/Gemfile.rails-3.0.rb
|
||||
- gemfiles/Gemfile.rails-3.1.rb
|
||||
- gemfiles/Gemfile.rails-3.2.rb
|
|
@ -0,0 +1,57 @@
|
|||
2.1.6
|
||||
* Fixed rebuild! when there is a default_scope with order [Adrian Serafin]
|
||||
* Testing with stable bundler, ruby 2.0, MySQL and PostgreSQL [Philip Arndt]
|
||||
* Optimized move_to for large trees [ericsmith66]
|
||||
|
||||
2.1.5
|
||||
* Worked around issues where AR#association wasn't present on Rails 3.0.x. [Philip Arndt]
|
||||
* Adds option 'order_column' which defaults to 'left_column_name'. [gudata]
|
||||
* Added moving with order functionality. [Sytse Sijbrandij]
|
||||
* Use tablename in all select queries. [Mikhail Dieterle]
|
||||
* Made sure all descendants' depths are updated when moving parent, not just immediate child. [Phil Thompson]
|
||||
* Add documentation of the callbacks. [Tobias Maier]
|
||||
|
||||
2.1.4
|
||||
* nested_set_options accept both Class & AR Relation. [Semyon Perepelitsa]
|
||||
* Reduce the number of queries triggered by the canonical usage of `i.level` in the `nested_set` helpers. [thedarkone]
|
||||
* Specifically require active_record [Bogdan Gusiev]
|
||||
* compute_level now checks for a non nil association target. [Joel Nimety]
|
||||
|
||||
2.1.3
|
||||
* Update child depth when parent node is moved. [Amanda Wagener]
|
||||
* Added move_to_child_with_index. [Ben Zhang]
|
||||
* Optimised self_and_descendants for when there's an index on lft. [Mark Torrance]
|
||||
* Added support for an unsaved record to return the right 'root'. [Philip Arndt]
|
||||
|
||||
2.1.2
|
||||
* Fixed regressions introduced. [Philip Arndt]
|
||||
|
||||
2.1.1
|
||||
* Added 'depth' which indicates how many levels deep the node is.
|
||||
This only works when you have a column called 'depth' in your table,
|
||||
otherwise it doesn't set itself. [Philip Arndt]
|
||||
* Rails 3.2 support added. [Gabriel Sobrinho]
|
||||
* Oracle compatibility added. [Pikender Sharma]
|
||||
* Adding row locking to deletion, locking source of pivot values, and adding retry on collisions. [Markus J. Q. Roberts]
|
||||
* Added method and helper for sorting children by column. [bluegod]
|
||||
* Fixed .all_roots_valid? to work with Postgres. [Joshua Clayton]
|
||||
* Made compatible with polymorphic belongs_to. [Graham Randall]
|
||||
* Added in the association callbacks to the children :has_many association. [Michael Deering]
|
||||
* Modified helper to allow using array of objects as argument. [Rahmat Budiharso]
|
||||
* Fixed cases where we were calling attr_protected. [Jacob Swanner]
|
||||
* Fixed nil cases involving lft and rgt. [Stuart Coyle] and [Patrick Morgan]
|
||||
|
||||
2.0.2
|
||||
* Fixed deprecation warning under Rails 3.1 [Philip Arndt]
|
||||
* Converted Test::Unit matchers to RSpec. [Uģis Ozols]
|
||||
* Added inverse_of to associations to improve performance rendering trees. [Sergio Cambra]
|
||||
* Added row locking and fixed some race conditions. [Markus J. Q. Roberts]
|
||||
|
||||
2.0.1
|
||||
* Fixed a bug with move_to not using nested_set_scope [Andreas Sekine]
|
||||
|
||||
2.0.0.pre
|
||||
* Expect Rails 3
|
||||
* Changed how callbacks work. Returning false in a before_move action does not block save operations. Use a validation or exception in the callback if you need that.
|
||||
* Switched to RSpec
|
||||
* Remove use of Comparable
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue