Compare commits
91
Commits
1.4.2
...
1.4-stable
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd7354ac06 | ||
|
|
5c077abb0e | ||
|
|
a1614e5e53 | ||
|
|
284ee1080b | ||
|
|
190fc8d9db | ||
|
|
cf5e29a83b | ||
|
|
2acfd0847c | ||
|
|
2f2f360311 | ||
|
|
29b64fce8e | ||
|
|
759a3321f4 | ||
|
|
b5c0a3313b | ||
|
|
ca73f99056 | ||
|
|
8312fec63f | ||
|
|
68c2588f85 | ||
|
|
31e714f2db | ||
|
|
886d6f006b | ||
|
|
628e63eefe | ||
|
|
83b356484a | ||
|
|
5210b58226 | ||
|
|
a0932173a5 | ||
|
|
e889fe9c8a | ||
|
|
16b1fcb079 | ||
|
|
3b7793561a | ||
|
|
2c3c1d2a02 | ||
|
|
49cb3aaca6 | ||
|
|
8a8df72937 | ||
|
|
ad238abd0c | ||
|
|
d69cae859f | ||
|
|
59d4d210a7 | ||
|
|
633b86236c | ||
|
|
91514dd682 | ||
|
|
917127f179 | ||
|
|
49295481de | ||
|
|
8cc56cce66 | ||
|
|
8d5fadc773 | ||
|
|
eb3e79b70d | ||
|
|
5d3bdb66cd | ||
|
|
1974123562 | ||
|
|
bcef197b41 | ||
|
|
231145160f | ||
|
|
0e1ae572c7 | ||
|
|
b3a86771ce | ||
|
|
2516d4f408 | ||
|
|
03d6c4668e | ||
|
|
a97d6baddd | ||
|
|
f3a8494cfb | ||
|
|
14dcefaa97 | ||
|
|
f4a7d6ca8c | ||
|
|
aedd5c5e35 | ||
|
|
554d6bcba2 | ||
|
|
4fcec69a40 | ||
|
|
7e6cc2f583 | ||
|
|
16383ed386 | ||
|
|
27127e1a3b | ||
|
|
a92ef237d3 | ||
|
|
a82a16378f | ||
|
|
886daba641 | ||
|
|
ab8dd5aa6e | ||
|
|
dbc02e66dc | ||
|
|
75e350f4e6 | ||
|
|
81553d396e | ||
|
|
77e03b508b | ||
|
|
1b0e717902 | ||
|
|
53b8de5e39 | ||
|
|
34df573ec2 | ||
|
|
e2f00792a8 | ||
|
|
9ed998af9b | ||
|
|
1881706df4 | ||
|
|
a3bf12ab9f | ||
|
|
668981b8cd | ||
|
|
b303dddbe3 | ||
|
|
933e96116e | ||
|
|
10711fda6d | ||
|
|
b3b829c025 | ||
|
|
8cd0baf773 | ||
|
|
033aa68427 | ||
|
|
1eb20d42bd | ||
|
|
a9dbecd5a5 | ||
|
|
a13218e9f4 | ||
|
|
57b0faf128 | ||
|
|
ba3828b49f | ||
|
|
fe1a152e02 | ||
|
|
69709a2513 | ||
|
|
7b7bca0b59 | ||
|
|
64b0cb336d | ||
|
|
79b7b32980 | ||
|
|
1e1517e6ab | ||
|
|
70b0d5722b | ||
|
|
3883d5e2db | ||
|
|
bca6c447cb | ||
|
|
b230429a61 |
@@ -18,6 +18,7 @@
|
|||||||
/public/plugin_assets
|
/public/plugin_assets
|
||||||
/tmp/*
|
/tmp/*
|
||||||
/tmp/cache/*
|
/tmp/cache/*
|
||||||
|
/tmp/pdf/*
|
||||||
/tmp/sessions/*
|
/tmp/sessions/*
|
||||||
/tmp/sockets/*
|
/tmp/sockets/*
|
||||||
/tmp/test/*
|
/tmp/test/*
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public/dispatch.*
|
|||||||
public/plugin_assets
|
public/plugin_assets
|
||||||
tmp/*
|
tmp/*
|
||||||
tmp/cache/*
|
tmp/cache/*
|
||||||
|
tmp/pdf/*
|
||||||
tmp/sessions/*
|
tmp/sessions/*
|
||||||
tmp/sockets/*
|
tmp/sockets/*
|
||||||
tmp/test/*
|
tmp/test/*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
source :rubygems
|
source :rubygems
|
||||||
|
|
||||||
gem "rails", "2.3.14"
|
gem "rails", "2.3.15"
|
||||||
gem "i18n", "~> 0.4.2"
|
gem "i18n", "~> 0.4.2"
|
||||||
gem "coderay", "~> 1.0.6"
|
gem "coderay", "~> 1.0.6"
|
||||||
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
|
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
|
||||||
@@ -39,7 +39,7 @@ end
|
|||||||
|
|
||||||
platforms :mri_18, :mingw_18 do
|
platforms :mri_18, :mingw_18 do
|
||||||
group :mysql do
|
group :mysql do
|
||||||
gem "mysql"
|
gem "mysql", "~> 2.8.1"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -71,8 +71,10 @@ end
|
|||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem "shoulda", "~> 2.10.3"
|
gem "shoulda", "~> 2.10.3"
|
||||||
|
# Shoulda does not work nice on Ruby 1.9.3 and seems to need test-unit explicitely.
|
||||||
|
gem "test-unit", :platforms => [:mri_19]
|
||||||
gem "edavis10-object_daddy", :require => "object_daddy"
|
gem "edavis10-object_daddy", :require => "object_daddy"
|
||||||
gem "mocha"
|
gem "mocha", "0.12.3"
|
||||||
end
|
end
|
||||||
|
|
||||||
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
|
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
before_filter :user_setup, :check_if_login_required, :set_localization
|
before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization
|
||||||
filter_parameter_logging :password
|
filter_parameter_logging :password
|
||||||
|
|
||||||
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
|
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
|
||||||
@@ -70,6 +70,38 @@ class ApplicationController < ActionController::Base
|
|||||||
require_dependency "repository/#{scm.underscore}"
|
require_dependency "repository/#{scm.underscore}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def session_expiration
|
||||||
|
if session[:user_id]
|
||||||
|
if session_expired? && !try_to_autologin
|
||||||
|
reset_session
|
||||||
|
flash[:error] = l(:error_session_expired)
|
||||||
|
redirect_to signin_url
|
||||||
|
else
|
||||||
|
session[:atime] = Time.now.utc.to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def session_expired?
|
||||||
|
if Setting.session_lifetime?
|
||||||
|
unless session[:ctime] && (Time.now.utc.to_i - session[:ctime].to_i <= Setting.session_lifetime.to_i * 60)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if Setting.session_timeout?
|
||||||
|
unless session[:atime] && (Time.now.utc.to_i - session[:atime].to_i <= Setting.session_timeout.to_i * 60)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def start_user_session(user)
|
||||||
|
session[:user_id] = user.id
|
||||||
|
session[:ctime] = Time.now.utc.to_i
|
||||||
|
session[:atime] = Time.now.utc.to_i
|
||||||
|
end
|
||||||
|
|
||||||
def user_setup
|
def user_setup
|
||||||
# Check the settings cache for each request
|
# Check the settings cache for each request
|
||||||
Setting.check_cache
|
Setting.check_cache
|
||||||
@@ -83,10 +115,7 @@ class ApplicationController < ActionController::Base
|
|||||||
if session[:user_id]
|
if session[:user_id]
|
||||||
# existing session
|
# existing session
|
||||||
(User.active.find(session[:user_id]) rescue nil)
|
(User.active.find(session[:user_id]) rescue nil)
|
||||||
elsif cookies[:autologin] && Setting.autologin?
|
elsif user = try_to_autologin
|
||||||
# auto-login feature starts a new session
|
|
||||||
user = User.try_to_autologin(cookies[:autologin])
|
|
||||||
session[:user_id] = user.id if user
|
|
||||||
user
|
user
|
||||||
elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth?
|
elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth?
|
||||||
# RSS key authentication does not start a session
|
# RSS key authentication does not start a session
|
||||||
@@ -104,12 +133,24 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def try_to_autologin
|
||||||
|
if cookies[:autologin] && Setting.autologin?
|
||||||
|
# auto-login feature starts a new session
|
||||||
|
user = User.try_to_autologin(cookies[:autologin])
|
||||||
|
if user
|
||||||
|
reset_session
|
||||||
|
start_user_session(user)
|
||||||
|
end
|
||||||
|
user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Sets the logged in user
|
# Sets the logged in user
|
||||||
def logged_user=(user)
|
def logged_user=(user)
|
||||||
reset_session
|
reset_session
|
||||||
if user && user.is_a?(User)
|
if user && user.is_a?(User)
|
||||||
User.current = user
|
User.current = user
|
||||||
session[:user_id] = user.id
|
start_user_session(user)
|
||||||
else
|
else
|
||||||
User.current = User.anonymous
|
User.current = User.anonymous
|
||||||
end
|
end
|
||||||
@@ -458,9 +499,9 @@ class ApplicationController < ActionController::Base
|
|||||||
# Returns the API key present in the request
|
# Returns the API key present in the request
|
||||||
def api_key_from_request
|
def api_key_from_request
|
||||||
if params[:key].present?
|
if params[:key].present?
|
||||||
params[:key]
|
params[:key].to_s
|
||||||
elsif request.headers["X-Redmine-API-Key"].present?
|
elsif request.headers["X-Redmine-API-Key"].present?
|
||||||
request.headers["X-Redmine-API-Key"]
|
request.headers["X-Redmine-API-Key"].to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -18,12 +18,13 @@
|
|||||||
class TimelogController < ApplicationController
|
class TimelogController < ApplicationController
|
||||||
menu_item :issues
|
menu_item :issues
|
||||||
|
|
||||||
before_filter :find_project, :only => [:create]
|
before_filter :find_project_for_new_time_entry, :only => [:create]
|
||||||
before_filter :find_time_entry, :only => [:show, :edit, :update]
|
before_filter :find_time_entry, :only => [:show, :edit, :update]
|
||||||
before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy]
|
before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy]
|
||||||
before_filter :authorize, :except => [:new, :index, :report]
|
before_filter :authorize, :except => [:new, :index, :report]
|
||||||
|
|
||||||
before_filter :find_optional_project, :only => [:new, :index, :report]
|
before_filter :find_optional_project, :only => [:index, :report]
|
||||||
|
before_filter :find_optional_project_for_new_time_entry, :only => [:new]
|
||||||
before_filter :authorize_global, :only => [:new, :index, :report]
|
before_filter :authorize_global, :only => [:new, :index, :report]
|
||||||
|
|
||||||
accept_rss_auth :index
|
accept_rss_auth :index
|
||||||
@@ -38,7 +39,7 @@ class TimelogController < ApplicationController
|
|||||||
|
|
||||||
def index
|
def index
|
||||||
sort_init 'spent_on', 'desc'
|
sort_init 'spent_on', 'desc'
|
||||||
sort_update 'spent_on' => 'spent_on',
|
sort_update 'spent_on' => ['spent_on', "#{TimeEntry.table_name}.created_on"],
|
||||||
'user' => 'user_id',
|
'user' => 'user_id',
|
||||||
'activity' => 'activity_id',
|
'activity' => 'activity_id',
|
||||||
'project' => "#{Project.table_name}.name",
|
'project' => "#{Project.table_name}.name",
|
||||||
@@ -133,9 +134,13 @@ class TimelogController < ApplicationController
|
|||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
if params[:continue]
|
if params[:continue]
|
||||||
if params[:project_id]
|
if params[:project_id]
|
||||||
redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue, :back_url => params[:back_url]
|
redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue,
|
||||||
|
:time_entry => {:issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
|
||||||
|
:back_url => params[:back_url]
|
||||||
else
|
else
|
||||||
redirect_to :action => 'new', :back_url => params[:back_url]
|
redirect_to :action => 'new',
|
||||||
|
:time_entry => {:project_id => @time_entry.project_id, :issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
|
||||||
|
:back_url => params[:back_url]
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
|
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
|
||||||
@@ -258,7 +263,7 @@ private
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_project
|
def find_optional_project_for_new_time_entry
|
||||||
if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
|
if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
|
||||||
@project = Project.find(project_id)
|
@project = Project.find(project_id)
|
||||||
end
|
end
|
||||||
@@ -266,14 +271,17 @@ private
|
|||||||
@issue = Issue.find(issue_id)
|
@issue = Issue.find(issue_id)
|
||||||
@project ||= @issue.project
|
@project ||= @issue.project
|
||||||
end
|
end
|
||||||
if @project.nil?
|
|
||||||
render_404
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_project_for_new_time_entry
|
||||||
|
find_optional_project_for_new_time_entry
|
||||||
|
if @project.nil?
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def find_optional_project
|
def find_optional_project
|
||||||
if !params[:issue_id].blank?
|
if !params[:issue_id].blank?
|
||||||
@issue = Issue.find(params[:issue_id])
|
@issue = Issue.find(params[:issue_id])
|
||||||
|
|||||||
@@ -799,7 +799,7 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
HEADING_RE = /(<h(1|2|3|4)( [^>]+)?>(.+?)<\/h(1|2|3|4)>)/i unless const_defined?(:HEADING_RE)
|
HEADING_RE = /(<h(\d)( [^>]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE)
|
||||||
|
|
||||||
def parse_sections(text, project, obj, attr, only_path, options)
|
def parse_sections(text, project, obj, attr, only_path, options)
|
||||||
return unless options[:edit_section_links]
|
return unless options[:edit_section_links]
|
||||||
@@ -870,6 +870,8 @@ module ApplicationHelper
|
|||||||
# Renders the TOC with given headings
|
# Renders the TOC with given headings
|
||||||
def replace_toc(text, headings)
|
def replace_toc(text, headings)
|
||||||
text.gsub!(TOC_RE) do
|
text.gsub!(TOC_RE) do
|
||||||
|
# Keep only the 4 first levels
|
||||||
|
headings = headings.select{|level, anchor, item| level <= 4}
|
||||||
if headings.empty?
|
if headings.empty?
|
||||||
''
|
''
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class Attachment < ActiveRecord::Base
|
|||||||
validates_presence_of :filename, :author
|
validates_presence_of :filename, :author
|
||||||
validates_length_of :filename, :maximum => 255
|
validates_length_of :filename, :maximum => 255
|
||||||
validates_length_of :disk_filename, :maximum => 255
|
validates_length_of :disk_filename, :maximum => 255
|
||||||
|
validates_length_of :description, :maximum => 255, :allow_blank => true
|
||||||
validate :validate_max_file_size
|
validate :validate_max_file_size
|
||||||
|
|
||||||
acts_as_event :title => :filename,
|
acts_as_event :title => :filename,
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ class Document < ActiveRecord::Base
|
|||||||
def initialize(attributes=nil, *args)
|
def initialize(attributes=nil, *args)
|
||||||
super
|
super
|
||||||
if new_record?
|
if new_record?
|
||||||
self.category ||= DocumentCategory.default
|
# Rails3 use this instead
|
||||||
|
# self.category ||= DocumentCategory.default
|
||||||
|
self.category_id = DocumentCategory.default.id if self.category_id == 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -31,4 +31,12 @@ class DocumentCategory < Enumeration
|
|||||||
def transfer_relations(to)
|
def transfer_relations(to)
|
||||||
documents.update_all("category_id = #{to.id}")
|
documents.update_all("category_id = #{to.id}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.default
|
||||||
|
d = super
|
||||||
|
if d.nil?
|
||||||
|
d = find(:first)
|
||||||
|
end
|
||||||
|
d
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -123,6 +123,28 @@ class Issue < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# AR#Base#destroy would raise and StaleObjectError exception
|
||||||
|
# if the issue was already deleted or updated (non matching lock_version).
|
||||||
|
# This is a problem when bulk deleting issues or deleting a project
|
||||||
|
# (because an issue may already be deleted if its parent was deleted
|
||||||
|
# first).
|
||||||
|
# The issue is reloaded by the nested_set before being deleted so
|
||||||
|
# the lock_version condition should not be an issue but we handle it.
|
||||||
|
def destroy
|
||||||
|
super
|
||||||
|
rescue ActiveRecord::StaleObjectError
|
||||||
|
# Stale or already deleted
|
||||||
|
begin
|
||||||
|
reload
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
# The issue was actually already deleted
|
||||||
|
@destroyed = true
|
||||||
|
return freeze
|
||||||
|
end
|
||||||
|
# The issue was stale, retry to destroy
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
|
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
|
||||||
def available_custom_fields
|
def available_custom_fields
|
||||||
(project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : []
|
(project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : []
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ class MailHandler < ActionMailer::Base
|
|||||||
|
|
||||||
cattr_accessor :ignored_emails_headers
|
cattr_accessor :ignored_emails_headers
|
||||||
@@ignored_emails_headers = {
|
@@ignored_emails_headers = {
|
||||||
'X-Auto-Response-Suppress' => 'OOF',
|
'X-Auto-Response-Suppress' => 'oof',
|
||||||
'Auto-Submitted' => 'auto-replied'
|
'Auto-Submitted' => /^auto-/
|
||||||
}
|
}
|
||||||
|
|
||||||
# Processes incoming emails
|
# Processes incoming emails
|
||||||
@@ -63,11 +63,14 @@ class MailHandler < ActionMailer::Base
|
|||||||
# Ignore auto generated emails
|
# Ignore auto generated emails
|
||||||
self.class.ignored_emails_headers.each do |key, ignored_value|
|
self.class.ignored_emails_headers.each do |key, ignored_value|
|
||||||
value = email.header_string(key)
|
value = email.header_string(key)
|
||||||
if value && value.to_s.downcase == ignored_value.downcase
|
if value
|
||||||
if logger && logger.info
|
value = value.to_s.downcase
|
||||||
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
|
if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value
|
||||||
|
if logger && logger.info
|
||||||
|
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
|
||||||
|
end
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@user = User.find_by_mail(sender_email) if sender_email.present?
|
@user = User.find_by_mail(sender_email) if sender_email.present?
|
||||||
|
|||||||
+2
-2
@@ -174,9 +174,9 @@ class Query < ActiveRecord::Base
|
|||||||
if values_for(field)
|
if values_for(field)
|
||||||
case type_for(field)
|
case type_for(field)
|
||||||
when :integer
|
when :integer
|
||||||
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) }
|
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) }
|
||||||
when :float
|
when :float
|
||||||
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d*)?$/) }
|
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+(\.\d*)?$/) }
|
||||||
when :date, :date_past
|
when :date, :date_past
|
||||||
case operator_for(field)
|
case operator_for(field)
|
||||||
when "=", ">=", "<=", "><"
|
when "=", ">=", "<=", "><"
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ class Repository < ActiveRecord::Base
|
|||||||
validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
|
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_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(show entry raw changes annotate diff show stats graph)
|
||||||
# donwcase letters, digits, dashes but not digits only
|
# donwcase letters, digits, dashes, underscores but not digits only
|
||||||
validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-]*$/, :allow_blank => true
|
validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-_]*$/, :allow_blank => true
|
||||||
# Checks if the SCM is enabled when creating a repository
|
# Checks if the SCM is enabled when creating a repository
|
||||||
validate :repo_create_validation, :on => :create
|
validate :repo_create_validation, :on => :create
|
||||||
|
|
||||||
@@ -415,5 +415,9 @@ class Repository < ActiveRecord::Base
|
|||||||
connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
|
connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
|
||||||
connection.delete("DELETE FROM #{cp} WHERE #{cp}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
|
connection.delete("DELETE FROM #{cp} WHERE #{cp}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
|
||||||
connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}")
|
connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}")
|
||||||
|
clear_extra_info_of_changesets
|
||||||
|
end
|
||||||
|
|
||||||
|
def clear_extra_info_of_changesets
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -255,4 +255,15 @@ class Repository::Git < Repository
|
|||||||
:order => 'committed_on DESC'
|
:order => 'committed_on DESC'
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clear_extra_info_of_changesets
|
||||||
|
return if extra_info.nil?
|
||||||
|
v = extra_info["extra_report_last_commit"]
|
||||||
|
write_attribute(:extra_info, nil)
|
||||||
|
h = {}
|
||||||
|
h["extra_report_last_commit"] = v
|
||||||
|
merge_extra_info(h)
|
||||||
|
self.save
|
||||||
|
end
|
||||||
|
private :clear_extra_info_of_changesets
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values'
|
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields'
|
||||||
|
|
||||||
def initialize(attributes=nil, *args)
|
def initialize(attributes=nil, *args)
|
||||||
super
|
super
|
||||||
|
|||||||
+7
-4
@@ -130,8 +130,11 @@ class User < Principal
|
|||||||
|
|
||||||
# Returns the user that matches provided login and password, or nil
|
# Returns the user that matches provided login and password, or nil
|
||||||
def self.try_to_login(login, password)
|
def self.try_to_login(login, password)
|
||||||
|
login = login.to_s
|
||||||
|
password = password.to_s
|
||||||
|
|
||||||
# Make sure no one can sign in with an empty password
|
# Make sure no one can sign in with an empty password
|
||||||
return nil if password.to_s.empty?
|
return nil if password.empty?
|
||||||
user = find_by_login(login)
|
user = find_by_login(login)
|
||||||
if user
|
if user
|
||||||
# user is already in local database
|
# user is already in local database
|
||||||
@@ -164,7 +167,7 @@ class User < Principal
|
|||||||
|
|
||||||
# Returns the user who matches the given autologin +key+ or nil
|
# Returns the user who matches the given autologin +key+ or nil
|
||||||
def self.try_to_autologin(key)
|
def self.try_to_autologin(key)
|
||||||
tokens = Token.find_all_by_action_and_value('autologin', key)
|
tokens = Token.find_all_by_action_and_value('autologin', key.to_s)
|
||||||
# Make sure there's only 1 token that matches the key
|
# Make sure there's only 1 token that matches the key
|
||||||
if tokens.size == 1
|
if tokens.size == 1
|
||||||
token = tokens.first
|
token = tokens.first
|
||||||
@@ -338,12 +341,12 @@ class User < Principal
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.find_by_rss_key(key)
|
def self.find_by_rss_key(key)
|
||||||
token = Token.find_by_value(key)
|
token = Token.find_by_action_and_value('feeds', key.to_s)
|
||||||
token && token.user.active? ? token.user : nil
|
token && token.user.active? ? token.user : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.find_by_api_key(key)
|
def self.find_by_api_key(key)
|
||||||
token = Token.find_by_action_and_value('api', key)
|
token = Token.find_by_action_and_value('api', key.to_s)
|
||||||
token && token.user.active? ? token.user : nil
|
token && token.user.active? ? token.user : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<span>
|
<span>
|
||||||
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file',
|
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file',
|
||||||
:onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%>
|
:onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%>
|
||||||
<%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :placeholder => l(:label_optional_description) %>
|
<%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :maxlength => 255, :placeholder => l(:label_optional_description) %>
|
||||||
<%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %>
|
<%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<h2><%= l(:label_revision) %> <%= @diff_format_revisions %> <%=h @path %></h2>
|
<h2><%= l(:label_revision) %> <%= @diff_format_revisions %> <%=h @path %></h2>
|
||||||
|
|
||||||
<!-- Choose view type -->
|
<!-- Choose view type -->
|
||||||
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
|
<% form_tag({:action => 'diff', :id => @project,
|
||||||
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
|
:repository_id => @repository.identifier_param,
|
||||||
|
:path => to_path_param(@path), :rev => @rev}, :method => 'get') do %>
|
||||||
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
|
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
|
||||||
<p>
|
<p>
|
||||||
<label><%= l(:label_view_diff) %></label>
|
<label><%= l(:label_view_diff) %></label>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<% form_tag(
|
<% form_tag(
|
||||||
{:action => 'revision', :id => @project,
|
{:action => 'revision', :id => @project,
|
||||||
:repository_id => @repository.identifier_param}
|
:repository_id => @repository.identifier_param},
|
||||||
|
:method => :get
|
||||||
) do %>
|
) do %>
|
||||||
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
|
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
|
||||||
<%= submit_tag 'OK' %>
|
<%= submit_tag 'OK' %>
|
||||||
|
|||||||
@@ -21,5 +21,16 @@
|
|||||||
<p><%= setting_check_box :rest_api_enabled %></p>
|
<p><%= setting_check_box :rest_api_enabled %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<fieldset class="box">
|
||||||
|
<legend><%= l(:label_session_expiration) %></legend>
|
||||||
|
|
||||||
|
<div class="tabular settings">
|
||||||
|
<p><%= setting_select :session_lifetime, [[l(:label_disabled), 0]] + [1, 7, 30, 60, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), (days * 60 * 24).to_s]} %></p>
|
||||||
|
<p><%= setting_select :session_timeout, [[l(:label_disabled), 0]] + [1, 2, 4, 8, 12, 24, 48].collect{|hours| [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s]} %></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p><em class="info"><%= l(:text_session_expiration_settings) %></em></p>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<%= submit_tag l(:button_save) %>
|
<%= submit_tag l(:button_save) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<h2><%= l(:label_spent_time) %></h2>
|
<h2><%= l(:label_spent_time) %></h2>
|
||||||
|
|
||||||
<% labelled_form_for @time_entry, :url => time_entries_path do |f| %>
|
<% labelled_form_for @time_entry, :url => time_entries_path do |f| %>
|
||||||
|
<%= hidden_field_tag 'project_id', params[:project_id] if params[:project_id] %>
|
||||||
<%= render :partial => 'form', :locals => {:f => f} %>
|
<%= render :partial => 'form', :locals => {:f => f} %>
|
||||||
<%= submit_tag l(:button_create) %>
|
<%= submit_tag l(:button_create) %>
|
||||||
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
|
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ api.array :versions, api_meta(:total_count => @versions.size) do
|
|||||||
api.description version.description
|
api.description version.description
|
||||||
api.status version.status
|
api.status version.status
|
||||||
api.due_date version.effective_date
|
api.due_date version.effective_date
|
||||||
|
api.sharing version.sharing
|
||||||
|
|
||||||
render_api_custom_values version.custom_field_values, api
|
render_api_custom_values version.custom_field_values, api
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ api.version do
|
|||||||
api.description @version.description
|
api.description @version.description
|
||||||
api.status @version.status
|
api.status @version.status
|
||||||
api.due_date @version.effective_date
|
api.due_date @version.effective_date
|
||||||
|
api.sharing @version.sharing
|
||||||
|
|
||||||
render_api_custom_values @version.custom_field_values, api
|
render_api_custom_values @version.custom_field_values, api
|
||||||
|
|
||||||
|
|||||||
@@ -85,4 +85,75 @@ module ActionController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# CVE-2012-2660
|
||||||
|
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/f1203e3376acec0f
|
||||||
|
# CVE-2012-2694
|
||||||
|
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/8c82d9df8b401c5e
|
||||||
|
class Request
|
||||||
|
protected
|
||||||
|
|
||||||
|
# Remove nils from the params hash
|
||||||
|
def deep_munge(hash)
|
||||||
|
keys = hash.keys.find_all { |k| hash[k] == [nil] }
|
||||||
|
keys.each { |k| hash[k] = nil }
|
||||||
|
|
||||||
|
hash.each_value do |v|
|
||||||
|
case v
|
||||||
|
when Array
|
||||||
|
v.grep(Hash) { |x| deep_munge(x) }
|
||||||
|
v.compact!
|
||||||
|
when Hash
|
||||||
|
deep_munge(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_query(qs)
|
||||||
|
deep_munge(super)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Fix for CVE-2013-0155
|
||||||
|
# https://groups.google.com/d/msg/rubyonrails-security/c7jT-EeN9eI/L0u4e87zYGMJ
|
||||||
|
# https://groups.google.com/d/msg/rubyonrails-security/kKGNeMrnmiY/r2yM7xy-G48J
|
||||||
|
# https://github.com/rails/rails/blob/v2.3.15/activerecord/lib/active_record/base.rb#L2340
|
||||||
|
module ActiveRecord
|
||||||
|
class Base
|
||||||
|
class << self
|
||||||
|
protected
|
||||||
|
def self.sanitize_sql_hash_for_conditions(attrs, default_table_name = quoted_table_name, top_level = true)
|
||||||
|
attrs = expand_hash_conditions_for_aggregates(attrs)
|
||||||
|
|
||||||
|
return '1 = 2' if !top_level && attrs.is_a?(Hash) && attrs.empty?
|
||||||
|
|
||||||
|
conditions = attrs.map do |attr, value|
|
||||||
|
table_name = default_table_name
|
||||||
|
|
||||||
|
if not value.is_a?(Hash)
|
||||||
|
attr = attr.to_s
|
||||||
|
|
||||||
|
# Extract table name from qualified attribute names.
|
||||||
|
if attr.include?('.') and top_level
|
||||||
|
attr_table_name, attr = attr.split('.', 2)
|
||||||
|
attr_table_name = connection.quote_table_name(attr_table_name)
|
||||||
|
else
|
||||||
|
attr_table_name = table_name
|
||||||
|
end
|
||||||
|
|
||||||
|
attribute_condition("#{attr_table_name}.#{connection.quote_column_name(attr)}", value)
|
||||||
|
elsif top_level
|
||||||
|
sanitize_sql_hash_for_conditions(value, connection.quote_table_name(attr.to_s), false)
|
||||||
|
else
|
||||||
|
raise ActiveRecord::StatementInvalid
|
||||||
|
end
|
||||||
|
end.join(' AND ')
|
||||||
|
|
||||||
|
replace_bind_variables(conditions, expand_range_bind_variables(attrs.values))
|
||||||
|
end
|
||||||
|
alias_method :sanitize_sql_hash, :sanitize_sql_hash_for_conditions
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ ar:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "حوالي ساعة"
|
one: "حوالي ساعة"
|
||||||
other: "ساعات %{count}حوالي "
|
other: "ساعات %{count}حوالي "
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "يوم"
|
one: "يوم"
|
||||||
other: "%{count} أيام"
|
other: "%{count} أيام"
|
||||||
@@ -1031,3 +1034,8 @@ ar:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ bg:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "около 1 час"
|
one: "около 1 час"
|
||||||
other: "около %{count} часа"
|
other: "около %{count} часа"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 ден"
|
one: "1 ден"
|
||||||
other: "%{count} дена"
|
other: "%{count} дена"
|
||||||
@@ -195,6 +198,7 @@ bg:
|
|||||||
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
|
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
|
||||||
error_unable_to_connect: Невъзможност за свързване с (%{value})
|
error_unable_to_connect: Невъзможност за свързване с (%{value})
|
||||||
error_attachment_too_big: Този файл не може да бъде качен, понеже надхвърля максималната възможна големина (%{max_size})
|
error_attachment_too_big: Този файл не може да бъде качен, понеже надхвърля максималната възможна големина (%{max_size})
|
||||||
|
error_session_expired: Вашата сесия е изтекла. Моля влезете в Redmine отново.
|
||||||
warning_attachments_not_saved: "%{count} файла не бяха записани."
|
warning_attachments_not_saved: "%{count} файла не бяха записани."
|
||||||
|
|
||||||
mail_subject_lost_password: "Вашата парола (%{value})"
|
mail_subject_lost_password: "Вашата парола (%{value})"
|
||||||
@@ -386,6 +390,8 @@ bg:
|
|||||||
setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата
|
setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата
|
||||||
setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище
|
setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище
|
||||||
setting_unsubscribe: Потребителите могат да премахват профилите си
|
setting_unsubscribe: Потребителите могат да премахват профилите си
|
||||||
|
setting_session_lifetime: Максимален живот на сесиите
|
||||||
|
setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите
|
||||||
|
|
||||||
permission_add_project: Създаване на проект
|
permission_add_project: Създаване на проект
|
||||||
permission_add_subprojects: Създаване на подпроекти
|
permission_add_subprojects: Създаване на подпроекти
|
||||||
@@ -848,6 +854,7 @@ bg:
|
|||||||
label_item_position: "%{position}/%{count}"
|
label_item_position: "%{position}/%{count}"
|
||||||
label_completed_versions: Завършени версии
|
label_completed_versions: Завършени версии
|
||||||
label_search_for_watchers: Търсене на потребители за наблюдатели
|
label_search_for_watchers: Търсене на потребители за наблюдатели
|
||||||
|
label_session_expiration: Изтичане на сесиите
|
||||||
|
|
||||||
button_login: Вход
|
button_login: Вход
|
||||||
button_submit: Прикачване
|
button_submit: Прикачване
|
||||||
@@ -983,6 +990,7 @@ bg:
|
|||||||
text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени
|
text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени
|
||||||
text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link}
|
text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link}
|
||||||
text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване."
|
text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване."
|
||||||
|
text_session_expiration_settings: "Внимание: промяната на тези установяваноя може да прекрати всички активни сесии, включително и вашата."
|
||||||
|
|
||||||
default_role_manager: Мениджър
|
default_role_manager: Мениджър
|
||||||
default_role_developer: Разработчик
|
default_role_developer: Разработчик
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ bs:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "oko 1 sahat"
|
one: "oko 1 sahat"
|
||||||
other: "oko %{count} sahata"
|
other: "oko %{count} sahata"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dan"
|
one: "1 dan"
|
||||||
other: "%{count} dana"
|
other: "%{count} dana"
|
||||||
@@ -1045,3 +1048,8 @@ bs:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ ca:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "aproximadament 1 hora"
|
one: "aproximadament 1 hora"
|
||||||
other: "aproximadament %{count} hores"
|
other: "aproximadament %{count} hores"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dia"
|
one: "1 dia"
|
||||||
other: "%{count} dies"
|
other: "%{count} dies"
|
||||||
@@ -1033,3 +1036,8 @@ ca:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ cs:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "asi 1 hodina"
|
one: "asi 1 hodina"
|
||||||
other: "asi %{count} hodin"
|
other: "asi %{count} hodin"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 den"
|
one: "1 den"
|
||||||
other: "%{count} dnů"
|
other: "%{count} dnů"
|
||||||
@@ -1034,3 +1037,8 @@ cs:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ da:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "cirka en time"
|
one: "cirka en time"
|
||||||
other: "cirka %{count} timer"
|
other: "cirka %{count} timer"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "en dag"
|
one: "en dag"
|
||||||
other: "%{count} dage"
|
other: "%{count} dage"
|
||||||
@@ -1048,3 +1051,8 @@ da:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
+11
-3
@@ -52,6 +52,9 @@ de:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'etwa 1 Stunde'
|
one: 'etwa 1 Stunde'
|
||||||
other: 'etwa %{count} Stunden'
|
other: 'etwa %{count} Stunden'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: '1 Tag'
|
one: '1 Tag'
|
||||||
other: '%{count} Tagen'
|
other: '%{count} Tagen'
|
||||||
@@ -1016,8 +1019,8 @@ de:
|
|||||||
description_date_from: Startdatum eintragen
|
description_date_from: Startdatum eintragen
|
||||||
description_date_to: Enddatum eintragen
|
description_date_to: Enddatum eintragen
|
||||||
|
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Vorgänger
|
||||||
label_child_revision: Child
|
label_child_revision: Nachfolger
|
||||||
error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet.
|
error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet.
|
||||||
setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden
|
setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden
|
||||||
button_edit_section: Diesen Bereich bearbeiten
|
button_edit_section: Diesen Bereich bearbeiten
|
||||||
@@ -1036,7 +1039,7 @@ de:
|
|||||||
label_copy_attachments: Anhänge Kopieren
|
label_copy_attachments: Anhänge Kopieren
|
||||||
label_item_position: "%{position}/%{count}"
|
label_item_position: "%{position}/%{count}"
|
||||||
label_completed_versions: Abgeschlossene Versionen
|
label_completed_versions: Abgeschlossene Versionen
|
||||||
field_multiple: Mehrer Werte
|
field_multiple: Mehrere Werte
|
||||||
setting_commit_cross_project_ref: Erlauben auf Tickets aller anderen Projekte zu referenzieren
|
setting_commit_cross_project_ref: Erlauben auf Tickets aller anderen Projekte zu referenzieren
|
||||||
text_issue_conflict_resolution_add_notes: Meine Änderungen übernehmen und alle anderen Änderungen verwerfen
|
text_issue_conflict_resolution_add_notes: Meine Änderungen übernehmen und alle anderen Änderungen verwerfen
|
||||||
text_issue_conflict_resolution_overwrite: Meine Änderungen trotzdem übernehmen (vorherige Notizen bleiben erhalten aber manche können überschrieben werden)
|
text_issue_conflict_resolution_overwrite: Meine Änderungen trotzdem übernehmen (vorherige Notizen bleiben erhalten aber manche können überschrieben werden)
|
||||||
@@ -1049,3 +1052,8 @@ de:
|
|||||||
setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen
|
setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen
|
||||||
button_delete_my_account: Mein Benutzerkonto löschen
|
button_delete_my_account: Mein Benutzerkonto löschen
|
||||||
text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden.
|
text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden.
|
||||||
|
error_session_expired: Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.
|
||||||
|
text_session_expiration_settings: "Achtung: Änderungen können aktuelle Sitzungen beenden, Ihre eingeschlossen!"
|
||||||
|
setting_session_lifetime: Längste Dauer einer Sitzung
|
||||||
|
setting_session_timeout: Zeitüberschreitung bei Inaktivität
|
||||||
|
label_session_expiration: Ende einer Sitzung
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ el:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "περίπου 1 ώρα"
|
one: "περίπου 1 ώρα"
|
||||||
other: "περίπου %{count} ώρες"
|
other: "περίπου %{count} ώρες"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 ημέρα"
|
one: "1 ημέρα"
|
||||||
other: "%{count} ημέρες"
|
other: "%{count} ημέρες"
|
||||||
@@ -1031,3 +1034,8 @@ el:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ en-GB:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "about 1 hour"
|
||||||
other: "about %{count} hours"
|
other: "about %{count} hours"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 day"
|
||||||
other: "%{count} days"
|
other: "%{count} days"
|
||||||
@@ -1033,3 +1036,8 @@ en-GB:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ en:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "about 1 hour"
|
||||||
other: "about %{count} hours"
|
other: "about %{count} hours"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 day"
|
||||||
other: "%{count} days"
|
other: "%{count} days"
|
||||||
@@ -194,6 +197,7 @@ en:
|
|||||||
error_unable_delete_issue_status: 'Unable to delete issue status'
|
error_unable_delete_issue_status: 'Unable to delete issue status'
|
||||||
error_unable_to_connect: "Unable to connect (%{value})"
|
error_unable_to_connect: "Unable to connect (%{value})"
|
||||||
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
|
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
|
||||||
|
error_session_expired: "Your session has expired. Please login again."
|
||||||
warning_attachments_not_saved: "%{count} file(s) could not be saved."
|
warning_attachments_not_saved: "%{count} file(s) could not be saved."
|
||||||
|
|
||||||
mail_subject_lost_password: "Your %{value} password"
|
mail_subject_lost_password: "Your %{value} password"
|
||||||
@@ -385,6 +389,8 @@ en:
|
|||||||
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: Use current date as start date for new issues
|
||||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||||
setting_unsubscribe: Allow users to delete their own account
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
|
||||||
permission_add_project: Create project
|
permission_add_project: Create project
|
||||||
permission_add_subprojects: Create subprojects
|
permission_add_subprojects: Create subprojects
|
||||||
@@ -847,6 +853,7 @@ en:
|
|||||||
label_item_position: "%{position} of %{count}"
|
label_item_position: "%{position} of %{count}"
|
||||||
label_completed_versions: Completed versions
|
label_completed_versions: Completed versions
|
||||||
label_search_for_watchers: Search for watchers to add
|
label_search_for_watchers: Search for watchers to add
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|
||||||
button_login: Login
|
button_login: Login
|
||||||
button_submit: Submit
|
button_submit: Submit
|
||||||
@@ -982,6 +989,7 @@ en:
|
|||||||
text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
|
text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
|
||||||
text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
|
text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
|
||||||
text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
|
text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
|
||||||
default_role_manager: Manager
|
default_role_manager: Manager
|
||||||
default_role_developer: Developer
|
default_role_developer: Developer
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ es:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "alrededor de 1 hora"
|
one: "alrededor de 1 hora"
|
||||||
other: "alrededor de %{count} horas"
|
other: "alrededor de %{count} horas"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 día"
|
one: "1 día"
|
||||||
other: "%{count} días"
|
other: "%{count} días"
|
||||||
@@ -1068,3 +1071,8 @@ es:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ et:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "umbes 1 tund"
|
one: "umbes 1 tund"
|
||||||
other: "umbes %{count} tundi"
|
other: "umbes %{count} tundi"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 päev"
|
one: "1 päev"
|
||||||
other: "%{count} päeva"
|
other: "%{count} päeva"
|
||||||
@@ -1047,3 +1050,8 @@ et:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ eu:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "ordu 1 inguru"
|
one: "ordu 1 inguru"
|
||||||
other: "%{count} ordu inguru"
|
other: "%{count} ordu inguru"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "egun 1"
|
one: "egun 1"
|
||||||
other: "%{count} egun"
|
other: "%{count} egun"
|
||||||
@@ -1034,3 +1037,8 @@ eu:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ fa:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "نزدیک 1 ساعت"
|
one: "نزدیک 1 ساعت"
|
||||||
other: "نزدیک %{count} ساعت"
|
other: "نزدیک %{count} ساعت"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 روز"
|
one: "1 روز"
|
||||||
other: "%{count} روز"
|
other: "%{count} روز"
|
||||||
@@ -1033,3 +1036,8 @@ fa:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -94,6 +94,9 @@ fi:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "noin tunti"
|
one: "noin tunti"
|
||||||
other: "noin %{count} tuntia"
|
other: "noin %{count} tuntia"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "päivä"
|
one: "päivä"
|
||||||
other: "%{count} päivää"
|
other: "%{count} päivää"
|
||||||
@@ -1052,3 +1055,8 @@ fi:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ fr:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "environ une heure"
|
one: "environ une heure"
|
||||||
other: "environ %{count} heures"
|
other: "environ %{count} heures"
|
||||||
|
x_hours:
|
||||||
|
one: "une heure"
|
||||||
|
other: "%{count} heures"
|
||||||
x_days:
|
x_days:
|
||||||
one: "un jour"
|
one: "un jour"
|
||||||
other: "%{count} jours"
|
other: "%{count} jours"
|
||||||
@@ -201,6 +204,7 @@ fr:
|
|||||||
error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles'
|
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_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
|
||||||
error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size})
|
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."
|
warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés."
|
||||||
|
|
||||||
@@ -381,6 +385,8 @@ fr:
|
|||||||
setting_default_issue_start_date_to_creation_date: Donner à la date de début d'une nouvelle demande la valeur de la date du jour
|
setting_default_issue_start_date_to_creation_date: Donner à la date de début d'une nouvelle demande la valeur de la date du jour
|
||||||
setting_commit_cross_project_ref: Permettre le référencement et la résolution des demandes de tous les autres projets
|
setting_commit_cross_project_ref: Permettre le référencement et la résolution des demandes de tous les autres projets
|
||||||
setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
|
setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
|
||||||
|
setting_session_lifetime: Durée de vie maximale des sessions
|
||||||
|
setting_session_timeout: Durée maximale d'inactivité
|
||||||
|
|
||||||
permission_add_project: Créer un projet
|
permission_add_project: Créer un projet
|
||||||
permission_add_subprojects: Créer des sous-projets
|
permission_add_subprojects: Créer des sous-projets
|
||||||
@@ -822,6 +828,7 @@ fr:
|
|||||||
label_copy_attachments: Copier les fichiers
|
label_copy_attachments: Copier les fichiers
|
||||||
label_item_position: "%{position} sur %{count}"
|
label_item_position: "%{position} sur %{count}"
|
||||||
label_completed_versions: Versions passées
|
label_completed_versions: Versions passées
|
||||||
|
label_session_expiration: Expiration des sessions
|
||||||
|
|
||||||
button_login: Connexion
|
button_login: Connexion
|
||||||
button_submit: Soumettre
|
button_submit: Soumettre
|
||||||
@@ -938,6 +945,7 @@ fr:
|
|||||||
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
|
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}"
|
text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
|
||||||
text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
|
text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
|
||||||
|
text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
|
||||||
|
|
||||||
default_role_manager: "Manager "
|
default_role_manager: "Manager "
|
||||||
default_role_developer: "Développeur "
|
default_role_developer: "Développeur "
|
||||||
|
|||||||
@@ -90,6 +90,9 @@ gl:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'aproximadamente unha hora'
|
one: 'aproximadamente unha hora'
|
||||||
other: '%{count} horas'
|
other: '%{count} horas'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: '1 día'
|
one: '1 día'
|
||||||
other: '%{count} días'
|
other: '%{count} días'
|
||||||
@@ -1042,3 +1045,8 @@ gl:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ he:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'בערך שעה אחת'
|
one: 'בערך שעה אחת'
|
||||||
other: 'בערך %{count} שעות'
|
other: 'בערך %{count} שעות'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: 'יום אחד'
|
one: 'יום אחד'
|
||||||
other: '%{count} ימים'
|
other: '%{count} ימים'
|
||||||
@@ -1036,3 +1039,8 @@ he:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ hr:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "oko sat vremena"
|
one: "oko sat vremena"
|
||||||
other: "oko %{count} sati"
|
other: "oko %{count} sati"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dan"
|
one: "1 dan"
|
||||||
other: "%{count} dana"
|
other: "%{count} dana"
|
||||||
@@ -1034,3 +1037,8 @@ hr:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -50,6 +50,9 @@
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'csaknem 1 órája'
|
one: 'csaknem 1 órája'
|
||||||
other: 'csaknem %{count} órája'
|
other: 'csaknem %{count} órája'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: '1 napja'
|
one: '1 napja'
|
||||||
other: '%{count} napja'
|
other: '%{count} napja'
|
||||||
@@ -1050,3 +1053,8 @@
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ id:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "sekitar sejam"
|
one: "sekitar sejam"
|
||||||
other: "sekitar %{count} jam"
|
other: "sekitar %{count} jam"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "sehari"
|
one: "sehari"
|
||||||
other: "%{count} hari"
|
other: "%{count} hari"
|
||||||
@@ -1037,3 +1040,8 @@ id:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ it:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "circa un'ora"
|
one: "circa un'ora"
|
||||||
other: "circa %{count} ore"
|
other: "circa %{count} ore"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 giorno"
|
one: "1 giorno"
|
||||||
other: "%{count} giorni"
|
other: "%{count} giorni"
|
||||||
@@ -1032,3 +1035,8 @@ it:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ ja:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "約1時間"
|
one: "約1時間"
|
||||||
other: "約%{count}時間"
|
other: "約%{count}時間"
|
||||||
|
x_hours:
|
||||||
|
one: "1時間"
|
||||||
|
other: "%{count}時間"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1日"
|
one: "1日"
|
||||||
other: "%{count}日"
|
other: "%{count}日"
|
||||||
@@ -758,7 +761,7 @@ ja:
|
|||||||
label_week: 週
|
label_week: 週
|
||||||
label_date_from: "日付指定: "
|
label_date_from: "日付指定: "
|
||||||
label_date_to: から
|
label_date_to: から
|
||||||
label_language_based: 既定の言語の設定に従う
|
label_language_based: ユーザの言語の設定に従う
|
||||||
label_sort_by: "並び替え %{value}"
|
label_sort_by: "並び替え %{value}"
|
||||||
label_send_test_email: テストメールを送信
|
label_send_test_email: テストメールを送信
|
||||||
label_feeds_access_key: RSSアクセスキー
|
label_feeds_access_key: RSSアクセスキー
|
||||||
@@ -1061,3 +1064,8 @@ ja:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
本当にアカウントを削除しますか?
|
本当にアカウントを削除しますか?
|
||||||
アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。
|
アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。
|
||||||
|
error_session_expired: セッションが失効しました。ログインし直してください。
|
||||||
|
text_session_expiration_settings: "警告: この設定を変更すると現在有効なセッションが失効する可能性があります。"
|
||||||
|
setting_session_lifetime: 有効期間の最大値
|
||||||
|
setting_session_timeout: 無操作タイムアウト
|
||||||
|
label_session_expiration: セッション有効期間
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ ko:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "약 한시간"
|
one: "약 한시간"
|
||||||
other: "약 %{count}시간"
|
other: "약 %{count}시간"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "하루"
|
one: "하루"
|
||||||
other: "%{count}일"
|
other: "%{count}일"
|
||||||
@@ -1081,3 +1084,8 @@ ko:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ lt:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "apie 1 valanda"
|
one: "apie 1 valanda"
|
||||||
other: "apie %{count} valandų"
|
other: "apie %{count} valandų"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 diena"
|
one: "1 diena"
|
||||||
other: "%{count} dienų"
|
other: "%{count} dienų"
|
||||||
@@ -1091,3 +1094,8 @@ lt:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ lv:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "aptuveni 1 stunda"
|
one: "aptuveni 1 stunda"
|
||||||
other: "aptuveni %{count} stundas"
|
other: "aptuveni %{count} stundas"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 diena"
|
one: "1 diena"
|
||||||
other: "%{count} dienas"
|
other: "%{count} dienas"
|
||||||
@@ -1025,3 +1028,8 @@ lv:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ mk:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "околу 1 час"
|
one: "околу 1 час"
|
||||||
other: "околу %{count} часа"
|
other: "околу %{count} часа"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 ден"
|
one: "1 ден"
|
||||||
other: "%{count} дена"
|
other: "%{count} дена"
|
||||||
@@ -1031,3 +1034,8 @@ mk:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ mn:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "1 цаг орчим"
|
one: "1 цаг орчим"
|
||||||
other: "ойролцоогоор %{count} цаг"
|
other: "ойролцоогоор %{count} цаг"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 өдөр"
|
one: "1 өдөр"
|
||||||
other: "%{count} өдөр"
|
other: "%{count} өдөр"
|
||||||
@@ -1031,3 +1034,8 @@ mn:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
+33
-22
@@ -48,6 +48,9 @@ nl:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "ongeveer 1 uur"
|
one: "ongeveer 1 uur"
|
||||||
other: "ongeveer %{count} uren"
|
other: "ongeveer %{count} uren"
|
||||||
|
x_hours:
|
||||||
|
one: "1 uur"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dag"
|
one: "1 dag"
|
||||||
other: "%{count} dagen"
|
other: "%{count} dagen"
|
||||||
@@ -987,29 +990,37 @@ nl:
|
|||||||
description_all_columns: Alle kolommen
|
description_all_columns: Alle kolommen
|
||||||
button_export: Exporteren
|
button_export: Exporteren
|
||||||
label_export_options: "%{export_format} export opties"
|
label_export_options: "%{export_format} export opties"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: Dit bestand kan niet worden geupload omdat het de maximaal toegestane grootte overschrijd (%{max_size})
|
||||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
notice_failed_to_save_time_entries: "Opslaan gefaald voor %{count} tijdsnotatie(s) van %{total} geselecteerde: %{ids}."
|
||||||
label_x_issues:
|
label_x_issues:
|
||||||
zero: 0 issue
|
zero: 0 incidenten
|
||||||
one: 1 issue
|
one: 1 incidenten
|
||||||
other: "%{count} issues"
|
other: "%{count} incidenten"
|
||||||
label_repository_new: New repository
|
label_repository_new: Nieuw repository
|
||||||
field_repository_is_default: Main repository
|
field_repository_is_default: Hoofd repository
|
||||||
label_copy_attachments: Copy attachments
|
label_copy_attachments: Copieer bijlage(n)
|
||||||
label_item_position: "%{position}/%{count}"
|
label_item_position: "%{position}/%{count}"
|
||||||
label_completed_versions: Completed versions
|
label_completed_versions: Versies compleet
|
||||||
field_multiple: Multiple values
|
field_multiple: Meerdere waardes
|
||||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
setting_commit_cross_project_ref: Sta toe om incidenten van alle projecten te refereren en oplossen
|
||||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
text_issue_conflict_resolution_add_notes: Voeg mijn notities toe en annuleer andere wijzigingen
|
||||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
text_issue_conflict_resolution_overwrite: Voeg mijn wijzigingen alsnog toe (voorgaande notities worden bewaard, maar sommige kunnen overschreden worden)
|
||||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
notice_issue_update_conflict: Dit incident is reeds geupdate door een andere gebruiker terwijl jij bezig was
|
||||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
text_issue_conflict_resolution_cancel: Annuleer mijn wijzigingen en geef pagina opnieuw weer %{link}
|
||||||
permission_manage_related_issues: Manage related issues
|
permission_manage_related_issues: Beheer gerelateerde incidenten
|
||||||
|
|
||||||
field_ldap_filter: LDAP filter
|
field_ldap_filter: LDAP filter
|
||||||
label_search_for_watchers: Search for watchers to add
|
|
||||||
notice_account_deleted: Your account has been permanently deleted.
|
label_search_for_watchers: Zoek om monitoorders toe te voegen
|
||||||
setting_unsubscribe: Allow users to delete their own account
|
notice_account_deleted: Uw account is permanent verwijderd
|
||||||
button_delete_my_account: Delete my account
|
setting_unsubscribe: Sta gebruikers toe hun eigen account te verwijderen
|
||||||
|
button_delete_my_account: Verwijder mijn account
|
||||||
|
|
||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Weet u zeker dat u door wilt gaan?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
Uw account wordt permanent verwijderd zonder mogelijkheid deze te heractiveren.
|
||||||
|
error_session_expired: Uw sessie is verlopen. U dient opnieuw in te loggen.
|
||||||
|
text_session_expiration_settings: "Waarschuwing: door deze instelling te wijzigen kan sessies laten verlopen inclusief de uwe"
|
||||||
|
setting_session_lifetime: Maximale sessieduur
|
||||||
|
setting_session_timeout: Sessie inactiviteit timeout
|
||||||
|
label_session_expiration: Sessie verlopen
|
||||||
|
|||||||
+38
-30
@@ -43,6 +43,9 @@
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "rundt 1 time"
|
one: "rundt 1 time"
|
||||||
other: "rundt %{count} timer"
|
other: "rundt %{count} timer"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dag"
|
one: "1 dag"
|
||||||
other: "%{count} dager"
|
other: "%{count} dager"
|
||||||
@@ -968,56 +971,61 @@
|
|||||||
setting_issue_group_assignment: Tillat tildeling av saker til grupper
|
setting_issue_group_assignment: Tillat tildeling av saker til grupper
|
||||||
label_diff: diff
|
label_diff: diff
|
||||||
|
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: Sorteringsretning
|
||||||
description_project_scope: Search scope
|
description_project_scope: Search scope
|
||||||
description_filter: Filter
|
description_filter: Filter
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: Mail notification settings
|
||||||
description_date_from: Enter start date
|
description_date_from: Oppgi startdato
|
||||||
description_message_content: Message content
|
description_message_content: Meldingsinnhold
|
||||||
description_available_columns: Available Columns
|
description_available_columns: Tilgjengelige kolonner
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Velg datointervall ved å spesifisere start- og sluttdato
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: Choose issue category
|
||||||
description_search: Searchfield
|
description_search: Søkefelt
|
||||||
description_notes: Notes
|
description_notes: Notes
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: Choose range from list
|
||||||
description_choose_project: Projects
|
description_choose_project: Prosjekter
|
||||||
description_date_to: Enter end date
|
description_date_to: Oppgi sluttdato
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: Sort attribute
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Velg ny overordnet side
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: Valgte kolonner
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Overordnet
|
||||||
label_child_revision: Child
|
label_child_revision: Underordnet
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
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: Bruk dagens dato som startdato for nye saker
|
||||||
button_edit_section: Edit this section
|
button_edit_section: Rediger denne seksjonen
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: Attachments and repositories encodings
|
||||||
description_all_columns: All Columns
|
description_all_columns: Alle kolonnene
|
||||||
button_export: Export
|
button_export: Eksporter
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} eksportvalg"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: Filen overstiger maksimum filstørrelse (%{max_size}) og kan derfor ikke lastes opp
|
||||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
||||||
label_x_issues:
|
label_x_issues:
|
||||||
zero: 0 sak
|
zero: 0 sak
|
||||||
one: 1 sak
|
one: 1 sak
|
||||||
other: "%{count} saker"
|
other: "%{count} saker"
|
||||||
label_repository_new: New repository
|
label_repository_new: Nytt depot
|
||||||
field_repository_is_default: Main repository
|
field_repository_is_default: Hoveddepot
|
||||||
label_copy_attachments: Copy attachments
|
label_copy_attachments: Kopier vedlegg
|
||||||
label_item_position: "%{position}/%{count}"
|
label_item_position: "%{position}/%{count}"
|
||||||
label_completed_versions: Completed versions
|
label_completed_versions: Completed versions
|
||||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
text_project_identifier_info: Kun små bokstaver (a-z), tall, bindestrek (-) og "underscore" (_) er tillatt.<br />Etter lagring er det ikke mulig å gjøre endringer.
|
||||||
field_multiple: Multiple values
|
field_multiple: Flere verdier
|
||||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
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)
|
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.
|
notice_issue_update_conflict: Saken ble oppdatert av en annen bruker mens du redigerte den.
|
||||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
text_issue_conflict_resolution_cancel: Forkast alle endringen mine og vis %{link} på nytt
|
||||||
permission_manage_related_issues: Manage related issues
|
permission_manage_related_issues: Manage related issues
|
||||||
field_ldap_filter: LDAP filter
|
field_ldap_filter: LDAP filter
|
||||||
label_search_for_watchers: Search for watchers to add
|
label_search_for_watchers: Search for watchers to add
|
||||||
notice_account_deleted: Your account has been permanently deleted.
|
notice_account_deleted: Din konto er ugjenkallelig slettet.
|
||||||
setting_unsubscribe: Allow users to delete their own account
|
setting_unsubscribe: Tillat brukere å slette sin egen konto
|
||||||
button_delete_my_account: Delete my account
|
button_delete_my_account: Slett kontoen min
|
||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Er du sikker på at du ønsker å fortsette?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
Kontoen din vil bli ugjenkallelig slettet uten mulighet for å reaktiveres igjen.
|
||||||
|
error_session_expired: Økten har gått ut på tid. Vennligst logg på igjen.
|
||||||
|
text_session_expiration_settings: "Advarsel: ved å endre disse innstillingene kan aktive økter gå ut på tid, inkludert din egen."
|
||||||
|
setting_session_lifetime: Øktenes makslengde
|
||||||
|
setting_session_timeout: Økten er avsluttet på grunn av inaktivitet
|
||||||
|
label_session_expiration: Økten er avsluttet
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ pl:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "około godziny"
|
one: "około godziny"
|
||||||
other: "około %{count} godzin"
|
other: "około %{count} godzin"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dzień"
|
one: "1 dzień"
|
||||||
other: "%{count} dni"
|
other: "%{count} dni"
|
||||||
@@ -1048,3 +1051,8 @@ pl:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ pt-BR:
|
|||||||
|
|
||||||
time:
|
time:
|
||||||
formats:
|
formats:
|
||||||
default: "%A, %d de %B de %Y, %H:%M hs"
|
default: "%A, %d de %B de %Y, %H:%M h"
|
||||||
time: "%H:%M hs"
|
time: "%H:%M h"
|
||||||
short: "%d/%m, %H:%M hs"
|
short: "%d/%m, %H:%M h"
|
||||||
long: "%A, %d de %B de %Y, %H:%M hs"
|
long: "%A, %d de %B de %Y, %H:%M h"
|
||||||
only_second: "%S"
|
only_second: "%S"
|
||||||
datetime:
|
datetime:
|
||||||
formats:
|
formats:
|
||||||
@@ -52,6 +52,9 @@ pt-BR:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'aproximadamente 1 hora'
|
one: 'aproximadamente 1 hora'
|
||||||
other: 'aproximadamente %{count} horas'
|
other: 'aproximadamente %{count} horas'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
|
|
||||||
x_days:
|
x_days:
|
||||||
one: '1 dia'
|
one: '1 dia'
|
||||||
@@ -1053,3 +1056,8 @@ pt-BR:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ pt:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "aproximadamente 1 hora"
|
one: "aproximadamente 1 hora"
|
||||||
other: "aproximadamente %{count} horas"
|
other: "aproximadamente %{count} horas"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dia"
|
one: "1 dia"
|
||||||
other: "%{count} dias"
|
other: "%{count} dias"
|
||||||
@@ -1036,3 +1039,8 @@ pt:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ ro:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "aproximativ o oră"
|
one: "aproximativ o oră"
|
||||||
other: "aproximativ %{count} ore"
|
other: "aproximativ %{count} ore"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "o zi"
|
one: "o zi"
|
||||||
other: "%{count} zile"
|
other: "%{count} zile"
|
||||||
@@ -1028,3 +1031,8 @@ ro:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
+43
-35
@@ -116,6 +116,9 @@ ru:
|
|||||||
few: "около %{count} часов"
|
few: "около %{count} часов"
|
||||||
many: "около %{count} часов"
|
many: "около %{count} часов"
|
||||||
other: "около %{count} часа"
|
other: "около %{count} часа"
|
||||||
|
x_hours:
|
||||||
|
one: "1 час"
|
||||||
|
other: "%{count} часов"
|
||||||
x_days:
|
x_days:
|
||||||
one: "%{count} день"
|
one: "%{count} день"
|
||||||
few: "%{count} дня"
|
few: "%{count} дня"
|
||||||
@@ -1089,11 +1092,11 @@ ru:
|
|||||||
notice_issue_successful_create: Задача %{id} создана.
|
notice_issue_successful_create: Задача %{id} создана.
|
||||||
label_between: между
|
label_between: между
|
||||||
setting_issue_group_assignment: Разрешить назначение задач группам пользователей
|
setting_issue_group_assignment: Разрешить назначение задач группам пользователей
|
||||||
label_diff: diff
|
label_diff: Разница(diff)
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: Порядок сортировки
|
||||||
description_project_scope: Search scope
|
description_project_scope: Search scope
|
||||||
description_filter: Filter
|
description_filter: Фильтр
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: Mail notification settings
|
||||||
description_date_from: Enter start date
|
description_date_from: Enter start date
|
||||||
description_message_content: Message content
|
description_message_content: Message content
|
||||||
@@ -1101,46 +1104,51 @@ ru:
|
|||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Choose range by selecting start and end date
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: Choose issue category
|
||||||
description_search: Searchfield
|
description_search: Searchfield
|
||||||
description_notes: Notes
|
description_notes: Примечания
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: Выберите диапазон из списка
|
||||||
description_choose_project: Projects
|
description_choose_project: Проекты
|
||||||
description_date_to: Enter end date
|
description_date_to: Введите дату выполнения
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: Критерий сортировки
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Выбрать новую родительскую страницу
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: Выбранные столбцы
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Родительский
|
||||||
label_child_revision: Child
|
label_child_revision: Дочерний
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
error_scm_annotate_big_text_file: Комментарий невозможен из-за превышения максимального размера текстового файла.
|
||||||
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: Использовать текущую дату в качестве даты начала для новых задач
|
||||||
button_edit_section: Edit this section
|
button_edit_section: Редактировать эту секцию
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: Кодировка вложений и хранилищ
|
||||||
description_all_columns: All Columns
|
description_all_columns: Все столбцы
|
||||||
button_export: Export
|
button_export: Экспорт
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} параметры экспорта"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: Этот файл нельзя загрузить из-за превышения максимального размера файла (%{max_size})
|
||||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
notice_failed_to_save_time_entries: "Невозможно сохранить %{count} затраченное время для %{total} выбранных: %{ids}."
|
||||||
label_x_issues:
|
label_x_issues:
|
||||||
zero: 0 Задач
|
zero: 0 Задач
|
||||||
one: 1 Задача
|
one: 1 Задача
|
||||||
few: "%{count} Задач"
|
few: "%{count} Задач"
|
||||||
many: "%{count} Задач"
|
many: "%{count} Задач"
|
||||||
other: "%{count} Задач"
|
other: "%{count} Задач"
|
||||||
label_repository_new: New repository
|
label_repository_new: Новое хранилище
|
||||||
field_repository_is_default: Main repository
|
field_repository_is_default: Хранилище по умолчанию
|
||||||
label_copy_attachments: Copy attachments
|
label_copy_attachments: Копировать вложения
|
||||||
label_item_position: "%{position}/%{count}"
|
label_item_position: "%{position}/%{count}"
|
||||||
label_completed_versions: Completed versions
|
label_completed_versions: Завершенные версии
|
||||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
text_project_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.<br />После сохранения идентификатор изменить нельзя.
|
||||||
field_multiple: Multiple values
|
field_multiple: Множественные значения
|
||||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
setting_commit_cross_project_ref: Разрешить ссылаться и исправлять задачи во всех остальных проектах
|
||||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
text_issue_conflict_resolution_add_notes: Добавить мои примечания и отказаться от моих изменений
|
||||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
text_issue_conflict_resolution_overwrite: Применить мои изменения (все предыдущие замечания будут сохранены, но некоторые изменения могут быть перезаписаны)
|
||||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
notice_issue_update_conflict: Кто-то изменил задачу, пока вы ее редактировали.
|
||||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
text_issue_conflict_resolution_cancel: Отменить мои изменения и показать задачу заново %{link}
|
||||||
permission_manage_related_issues: Manage related issues
|
permission_manage_related_issues: Управление связанными задачами
|
||||||
field_ldap_filter: LDAP filter
|
field_ldap_filter: Фильтр LDAP
|
||||||
label_search_for_watchers: Search for watchers to add
|
label_search_for_watchers: Найти наблюдателей
|
||||||
notice_account_deleted: "Ваша учетная запись полностью удалена"
|
notice_account_deleted: "Ваша учетная запись полностью удалена"
|
||||||
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
|
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
|
||||||
button_delete_my_account: "Удалить мою учетную запись"
|
button_delete_my_account: "Удалить мою учетную запись"
|
||||||
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
|
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
|
||||||
|
error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Максимальная продолжительность сессии
|
||||||
|
setting_session_timeout: Таймут сессии
|
||||||
|
label_session_expiration: Срок истечения сессии
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ sk:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "okolo 1 hodiny"
|
one: "okolo 1 hodiny"
|
||||||
other: "okolo %{count} hodín"
|
other: "okolo %{count} hodín"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 deň"
|
one: "1 deň"
|
||||||
other: "%{count} dní"
|
other: "%{count} dní"
|
||||||
@@ -1031,3 +1034,8 @@ sk:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ sl:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "okrog 1. ure"
|
one: "okrog 1. ure"
|
||||||
other: "okrog %{count} ur"
|
other: "okrog %{count} ur"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 dan"
|
one: "1 dan"
|
||||||
other: "%{count} dni"
|
other: "%{count} dni"
|
||||||
@@ -1031,3 +1034,8 @@ sl:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ sq:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "about 1 hour"
|
||||||
other: "about %{count} hours"
|
other: "about %{count} hours"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 day"
|
||||||
other: "%{count} days"
|
other: "%{count} days"
|
||||||
@@ -1027,3 +1030,8 @@ sq:
|
|||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Choose range by selecting start and end date
|
||||||
description_date_from: Enter start date
|
description_date_from: Enter start date
|
||||||
description_date_to: Enter end date
|
description_date_to: Enter end date
|
||||||
|
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
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ sr-YU:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "približno jedan sat"
|
one: "približno jedan sat"
|
||||||
other: "približno %{count} sati"
|
other: "približno %{count} sati"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "jedan dan"
|
one: "jedan dan"
|
||||||
other: "%{count} dana"
|
other: "%{count} dana"
|
||||||
@@ -1031,3 +1034,8 @@ sr-YU:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ sr:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "приближно један сат"
|
one: "приближно један сат"
|
||||||
other: "приближно %{count} сати"
|
other: "приближно %{count} сати"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "један дан"
|
one: "један дан"
|
||||||
other: "%{count} дана"
|
other: "%{count} дана"
|
||||||
@@ -1032,3 +1035,8 @@ sr:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ sv:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "ungefär en timme"
|
one: "ungefär en timme"
|
||||||
other: "ungefär %{count} timmar"
|
other: "ungefär %{count} timmar"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "en dag"
|
one: "en dag"
|
||||||
other: "%{count} dagar"
|
other: "%{count} dagar"
|
||||||
@@ -1069,3 +1072,8 @@ sv:
|
|||||||
description_date_range_interval: Ange intervall genom att välja start- och slutdatum
|
description_date_range_interval: Ange intervall genom att välja start- och slutdatum
|
||||||
description_date_from: Ange startdatum
|
description_date_from: Ange startdatum
|
||||||
description_date_to: Ange slutdatum
|
description_date_to: Ange slutdatum
|
||||||
|
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
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ th:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "about 1 hour"
|
||||||
other: "about %{count} hours"
|
other: "about %{count} hours"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 day"
|
||||||
other: "%{count} days"
|
other: "%{count} days"
|
||||||
@@ -1028,3 +1031,8 @@ th:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ tr:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: 'yaklaşık 1 saat'
|
one: 'yaklaşık 1 saat'
|
||||||
other: 'yaklaşık %{count} saat'
|
other: 'yaklaşık %{count} saat'
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: '1 gün'
|
one: '1 gün'
|
||||||
other: '%{count} gün'
|
other: '%{count} gün'
|
||||||
@@ -1050,3 +1053,8 @@ tr:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ uk:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "about 1 hour"
|
||||||
other: "about %{count} hours"
|
other: "about %{count} hours"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 day"
|
||||||
other: "%{count} days"
|
other: "%{count} days"
|
||||||
@@ -1026,3 +1029,8 @@ uk:
|
|||||||
setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи"
|
setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи"
|
||||||
button_delete_my_account: "Видалити мій обліковий запис"
|
button_delete_my_account: "Видалити мій обліковий запис"
|
||||||
text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?"
|
text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?"
|
||||||
|
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
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ vi:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "khoảng 1 giờ"
|
one: "khoảng 1 giờ"
|
||||||
other: "khoảng %{count} giờ"
|
other: "khoảng %{count} giờ"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 ngày"
|
one: "1 ngày"
|
||||||
other: "%{count} ngày"
|
other: "%{count} ngày"
|
||||||
@@ -1082,3 +1085,8 @@ vi:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
Are you sure you want to proceed?
|
Are you sure you want to proceed?
|
||||||
Your account will be permanently deleted, with no way to reactivate it.
|
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
|
||||||
|
|||||||
@@ -120,6 +120,9 @@
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "約 1 小時"
|
one: "約 1 小時"
|
||||||
other: "約 %{count} 小時"
|
other: "約 %{count} 小時"
|
||||||
|
x_hours:
|
||||||
|
one: "1 hour"
|
||||||
|
other: "%{count} hours"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 天"
|
one: "1 天"
|
||||||
other: "%{count} 天"
|
other: "%{count} 天"
|
||||||
@@ -276,6 +279,7 @@
|
|||||||
error_unable_delete_issue_status: '無法刪除問題狀態'
|
error_unable_delete_issue_status: '無法刪除問題狀態'
|
||||||
error_unable_to_connect: "無法連線至(%{value})"
|
error_unable_to_connect: "無法連線至(%{value})"
|
||||||
error_attachment_too_big: "這個檔案無法被上傳,因為它已經超過最大的檔案大小 (%{max_size})"
|
error_attachment_too_big: "這個檔案無法被上傳,因為它已經超過最大的檔案大小 (%{max_size})"
|
||||||
|
error_session_expired: "您的工作階段已經過期。請重新登入。"
|
||||||
warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。"
|
warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。"
|
||||||
|
|
||||||
mail_subject_lost_password: 您的 Redmine 網站密碼
|
mail_subject_lost_password: 您的 Redmine 網站密碼
|
||||||
@@ -467,6 +471,8 @@
|
|||||||
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
|
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
|
||||||
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
|
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
|
||||||
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
|
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
|
||||||
|
setting_session_lifetime: 工作階段存留時間最大值
|
||||||
|
setting_session_timeout: 工作階段無活動逾時時間
|
||||||
|
|
||||||
permission_add_project: 建立專案
|
permission_add_project: 建立專案
|
||||||
permission_add_subprojects: 建立子專案
|
permission_add_subprojects: 建立子專案
|
||||||
@@ -929,6 +935,7 @@
|
|||||||
label_item_position: "%{position} / %{count}"
|
label_item_position: "%{position} / %{count}"
|
||||||
label_completed_versions: 已完成版本
|
label_completed_versions: 已完成版本
|
||||||
label_search_for_watchers: 搜尋可供加入的監看者
|
label_search_for_watchers: 搜尋可供加入的監看者
|
||||||
|
label_session_expiration: 工作階段逾期
|
||||||
|
|
||||||
button_login: 登入
|
button_login: 登入
|
||||||
button_submit: 送出
|
button_submit: 送出
|
||||||
@@ -1066,6 +1073,7 @@
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
您確定要繼續這個動作嗎?
|
您確定要繼續這個動作嗎?
|
||||||
您的帳戶將會被永久刪除,且無法被重新啟用。
|
您的帳戶將會被永久刪除,且無法被重新啟用。
|
||||||
|
text_session_expiration_settings: "警告:變更這些設定將會導致包含您在內的所有工作階段過期。"
|
||||||
|
|
||||||
default_role_manager: 管理人員
|
default_role_manager: 管理人員
|
||||||
default_role_developer: 開發人員
|
default_role_developer: 開發人員
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ zh:
|
|||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "大约一小时"
|
one: "大约一小时"
|
||||||
other: "大约 %{count} 小时"
|
other: "大约 %{count} 小时"
|
||||||
|
x_hours:
|
||||||
|
one: "1 小时"
|
||||||
|
other: "%{count} 小时"
|
||||||
x_days:
|
x_days:
|
||||||
one: "一天"
|
one: "一天"
|
||||||
other: "%{count} 天"
|
other: "%{count} 天"
|
||||||
@@ -1033,3 +1036,8 @@ zh:
|
|||||||
text_account_destroy_confirmation: |-
|
text_account_destroy_confirmation: |-
|
||||||
确定继续处理?
|
确定继续处理?
|
||||||
您的账号一旦删除,将无法再次激活使用。
|
您的账号一旦删除,将无法再次激活使用。
|
||||||
|
error_session_expired: 您的会话已过期。请重新登陆。
|
||||||
|
text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。"
|
||||||
|
setting_session_lifetime: 会话最大有效时间
|
||||||
|
setting_session_timeout: 会话闲置超时
|
||||||
|
label_session_expiration: 会话过期
|
||||||
|
|||||||
@@ -36,6 +36,14 @@ unsubscribe:
|
|||||||
password_min_length:
|
password_min_length:
|
||||||
format: int
|
format: int
|
||||||
default: 4
|
default: 4
|
||||||
|
# Maximum lifetime of user sessions in minutes
|
||||||
|
session_lifetime:
|
||||||
|
format: int
|
||||||
|
default: 0
|
||||||
|
# User session timeout in minutes
|
||||||
|
session_timeout:
|
||||||
|
format: int
|
||||||
|
default: 0
|
||||||
attachment_max_size:
|
attachment_max_size:
|
||||||
format: int
|
format: int
|
||||||
default: 5120
|
default: 5120
|
||||||
|
|||||||
@@ -4,6 +4,60 @@ Redmine - project management software
|
|||||||
Copyright (C) 2006-2012 Jean-Philippe Lang
|
Copyright (C) 2006-2012 Jean-Philippe Lang
|
||||||
http://www.redmine.org/
|
http://www.redmine.org/
|
||||||
|
|
||||||
|
== 2013-01-20 v1.4.7
|
||||||
|
|
||||||
|
* Patch for Rails vulnerability CVE-2013-0155
|
||||||
|
|
||||||
|
== 2013-01-09 v1.4.6
|
||||||
|
|
||||||
|
* Upgrade to Rails 2.3.15
|
||||||
|
* Defect #12409: Git: changesets aren't read after clear_changesets call
|
||||||
|
* Patch #12605: Norwegian translation for 1.4-stable update
|
||||||
|
* Patch #12614: Dutch translation
|
||||||
|
* Patch #12615: Russian translation
|
||||||
|
* Patch #12630: Russian "x_hours" translation
|
||||||
|
|
||||||
|
== 2012-11-17 v1.4.5
|
||||||
|
|
||||||
|
* Defect #10818: Running rake in test environment causes exception
|
||||||
|
* Defect #11192: Make repository identifier accept underscores
|
||||||
|
* Defect #11298: Issue API may not work on Ruby 1.9 in Redmine 1.4
|
||||||
|
* Defect #11307: Can't filter for negative numeric custom fields
|
||||||
|
* Defect #11365: Attachment description length is not validated
|
||||||
|
* Defect #11541: Version sharing is missing in the REST API
|
||||||
|
* Defect #11665: New document category is not saved properly
|
||||||
|
* Defect #11789: Edit section links broken with h5/h6 headings
|
||||||
|
* Defect #11966: 404 Error when switching mode in view revision differences in non-main repo
|
||||||
|
* Defect #12189: No tmp/pdf directory
|
||||||
|
* Defect #12196: "Page not found" on OK button in SCM "View all revisions" page
|
||||||
|
* Feature #11338: Exclude emails with auto-submitted => auto-generated
|
||||||
|
* Patch #9732: German translations
|
||||||
|
* Patch #11261: Simplified Chinese translation for configurable session lifetime and timeout
|
||||||
|
* Patch #11328: Fix Japanese mistranslation for 'label_language_based'
|
||||||
|
* Patch #11406: German translation for configurable session lifetime and timeout
|
||||||
|
* Patch #11448: Russian translation for 1.4-stable and 2.0-stable
|
||||||
|
* Patch #11600: Fix plural form of the abbreviation for hours in Brazilian Portuguese
|
||||||
|
|
||||||
|
== 2012-06-18 v1.4.4
|
||||||
|
|
||||||
|
* Defect #10688: PDF export from Wiki - Problems with tables
|
||||||
|
* Defect #11061: Cannot choose commit versions to view differences in Git/Mercurial repository view
|
||||||
|
* Defect #11112: REST API - custom fields in POST/PUT ignored for time_entries
|
||||||
|
* Defect #11133: Wiki-page section edit link can point to incorrect section
|
||||||
|
* Defect #11160: SQL Error on time report if a custom field has multiple values for an entry
|
||||||
|
* Defect #11178: Spent time sorted by date-descending order lists same-date entries in physical order
|
||||||
|
* Defect #11185: Redmine fails to delete a project with parent/child task
|
||||||
|
* Feature #6597: Configurable session lifetime and timeout
|
||||||
|
* Patch #11113: Small glitch in German localization
|
||||||
|
* Fix for Rails vulnerabilities CVE-2012-2694 and CVE-2012-2695
|
||||||
|
|
||||||
|
== 2012-06-05 v1.4.3
|
||||||
|
|
||||||
|
* Defect #11038: "Create and continue" should preserve project, issue and activity when logging time
|
||||||
|
* Defect #11046: Redmine.pm does not support "bind as user" ldap authentication
|
||||||
|
* Defect #11051: reposman.rb fails in 1.4.2 because of missing require for rubygems
|
||||||
|
* Fix for Rails vulnerability CVE-2012-2660
|
||||||
|
|
||||||
== 2012-05-13 v1.4.2
|
== 2012-05-13 v1.4.2
|
||||||
|
|
||||||
* Defect #10744: rake task redmine:email:test broken
|
* Defect #10744: rake task redmine:email:test broken
|
||||||
|
|||||||
@@ -366,12 +366,19 @@ sub is_member {
|
|||||||
);
|
);
|
||||||
$sthldap->execute($auth_source_id);
|
$sthldap->execute($auth_source_id);
|
||||||
while (my @rowldap = $sthldap->fetchrow_array) {
|
while (my @rowldap = $sthldap->fetchrow_array) {
|
||||||
|
my $bind_as = $rowldap[3] ? $rowldap[3] : "";
|
||||||
|
my $bind_pw = $rowldap[4] ? $rowldap[4] : "";
|
||||||
|
if ($bind_as =~ m/\$login/) {
|
||||||
|
# replace $login with $redmine_user and use $redmine_pass
|
||||||
|
$bind_as =~ s/\$login/$redmine_user/g;
|
||||||
|
$bind_pw = $redmine_pass
|
||||||
|
}
|
||||||
my $ldap = Authen::Simple::LDAP->new(
|
my $ldap = Authen::Simple::LDAP->new(
|
||||||
host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]:$rowldap[1]" : $rowldap[0],
|
host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]:$rowldap[1]" : $rowldap[0],
|
||||||
port => $rowldap[1],
|
port => $rowldap[1],
|
||||||
basedn => $rowldap[5],
|
basedn => $rowldap[5],
|
||||||
binddn => $rowldap[3] ? $rowldap[3] : "",
|
binddn => $bind_as,
|
||||||
bindpw => $rowldap[4] ? $rowldap[4] : "",
|
bindpw => $bind_pw,
|
||||||
filter => "(".$rowldap[6]."=%s)"
|
filter => "(".$rowldap[6]."=%s)"
|
||||||
);
|
);
|
||||||
my $method = $r->method;
|
my $method = $r->method;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
require 'optparse'
|
require 'optparse'
|
||||||
require 'find'
|
require 'find'
|
||||||
require 'etc'
|
require 'etc'
|
||||||
|
require 'rubygems'
|
||||||
|
|
||||||
Version = "1.4"
|
Version = "1.4"
|
||||||
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
|
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
|
||||||
|
|||||||
@@ -138,21 +138,21 @@ module Redmine
|
|||||||
# Add list and boolean custom fields as available criteria
|
# Add list and boolean custom fields as available criteria
|
||||||
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
|
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
|
||||||
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
||||||
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id ORDER BY c.value LIMIT 1)",
|
||||||
:format => cf.field_format,
|
:format => cf.field_format,
|
||||||
:label => cf.name}
|
:label => cf.name}
|
||||||
end if @project
|
end if @project
|
||||||
|
|
||||||
# Add list and boolean time entry custom fields
|
# Add list and boolean time entry custom fields
|
||||||
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
||||||
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id ORDER BY c.value LIMIT 1)",
|
||||||
:format => cf.field_format,
|
:format => cf.field_format,
|
||||||
:label => cf.name}
|
:label => cf.name}
|
||||||
end
|
end
|
||||||
|
|
||||||
# Add list and boolean time entry activity custom fields
|
# Add list and boolean time entry activity custom fields
|
||||||
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
|
||||||
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id ORDER BY c.value LIMIT 1)",
|
||||||
:format => cf.field_format,
|
:format => cf.field_format,
|
||||||
:label => cf.name}
|
:label => cf.name}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ module Redmine
|
|||||||
module VERSION #:nodoc:
|
module VERSION #:nodoc:
|
||||||
MAJOR = 1
|
MAJOR = 1
|
||||||
MINOR = 4
|
MINOR = 4
|
||||||
TINY = 2
|
TINY = 7
|
||||||
|
|
||||||
# Branch values:
|
# Branch values:
|
||||||
# * official release: nil
|
# * official release: nil
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ module Redmine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def method_missing(sym, *args, &block)
|
def method_missing(sym, *args, &block)
|
||||||
if args.size == 1 && args.first.is_a?(Time)
|
if args.size == 1 && args.first.is_a?(::Time)
|
||||||
__send__ sym, args.first.xmlschema, &block
|
__send__ sym, args.first.xmlschema, &block
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ module Redmine
|
|||||||
l = 1
|
l = 1
|
||||||
started = false
|
started = false
|
||||||
ended = false
|
ended = false
|
||||||
text.scan(/(((?:.*?)(\A|\r?\n\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level|
|
text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level|
|
||||||
if heading.nil?
|
if heading.nil?
|
||||||
if ended
|
if ended
|
||||||
after << all
|
after << all
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ table.revision-info td {
|
|||||||
padding: 0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.revision-graph { position: absolute; }
|
div.revision-graph { position: absolute; min-width: 1px; }
|
||||||
|
|
||||||
div.changeset-changes ul { margin: 0; padding: 0; }
|
div.changeset-changes ul { margin: 0; padding: 0; }
|
||||||
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
|
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
|
||||||
|
|||||||
Vendored
+4
@@ -4,16 +4,19 @@ enumerations_001:
|
|||||||
id: 1
|
id: 1
|
||||||
type: DocumentCategory
|
type: DocumentCategory
|
||||||
active: true
|
active: true
|
||||||
|
position: 1
|
||||||
enumerations_002:
|
enumerations_002:
|
||||||
name: User documentation
|
name: User documentation
|
||||||
id: 2
|
id: 2
|
||||||
type: DocumentCategory
|
type: DocumentCategory
|
||||||
active: true
|
active: true
|
||||||
|
position: 2
|
||||||
enumerations_003:
|
enumerations_003:
|
||||||
name: Technical documentation
|
name: Technical documentation
|
||||||
id: 3
|
id: 3
|
||||||
type: DocumentCategory
|
type: DocumentCategory
|
||||||
active: true
|
active: true
|
||||||
|
position: 3
|
||||||
enumerations_004:
|
enumerations_004:
|
||||||
name: Low
|
name: Low
|
||||||
id: 4
|
id: 4
|
||||||
@@ -92,3 +95,4 @@ enumerations_016:
|
|||||||
id: 16
|
id: 16
|
||||||
type: DocumentCategory
|
type: DocumentCategory
|
||||||
active: false
|
active: false
|
||||||
|
position: 4
|
||||||
|
|||||||
@@ -96,8 +96,13 @@ class AttachmentsControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_save_diff_type
|
def test_save_diff_type
|
||||||
@request.session[:user_id] = 1 # admin
|
user1 = User.find(1)
|
||||||
|
user1.pref[:diff_type] = nil
|
||||||
|
user1.preference.save
|
||||||
user = User.find(1)
|
user = User.find(1)
|
||||||
|
assert_nil user.pref[:diff_type]
|
||||||
|
|
||||||
|
@request.session[:user_id] = 1 # admin
|
||||||
get :show, :id => 5
|
get :show, :id => 5
|
||||||
assert_response :success
|
assert_response :success
|
||||||
assert_template 'diff'
|
assert_template 'diff'
|
||||||
|
|||||||
@@ -18,7 +18,9 @@
|
|||||||
require File.expand_path('../../test_helper', __FILE__)
|
require File.expand_path('../../test_helper', __FILE__)
|
||||||
|
|
||||||
class DocumentsControllerTest < ActionController::TestCase
|
class DocumentsControllerTest < ActionController::TestCase
|
||||||
fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations
|
fixtures :projects, :users, :roles, :members, :member_roles,
|
||||||
|
:enabled_modules, :documents, :enumerations,
|
||||||
|
:groups_users, :attachments
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
User.current = nil
|
User.current = nil
|
||||||
@@ -95,16 +97,16 @@ LOREM
|
|||||||
|
|
||||||
def test_create_with_one_attachment
|
def test_create_with_one_attachment
|
||||||
ActionMailer::Base.deliveries.clear
|
ActionMailer::Base.deliveries.clear
|
||||||
Setting.notified_events << 'document_added'
|
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
set_tmp_attachments_directory
|
set_tmp_attachments_directory
|
||||||
|
|
||||||
post :create, :project_id => 'ecookbook',
|
with_settings :notified_events => %w(document_added) do
|
||||||
|
post :create, :project_id => 'ecookbook',
|
||||||
:document => { :title => 'DocumentsControllerTest#test_post_new',
|
:document => { :title => 'DocumentsControllerTest#test_post_new',
|
||||||
:description => 'This is a new document',
|
:description => 'This is a new document',
|
||||||
:category_id => 2},
|
:category_id => 2},
|
||||||
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
|
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
|
||||||
|
end
|
||||||
assert_redirected_to '/projects/ecookbook/documents'
|
assert_redirected_to '/projects/ecookbook/documents'
|
||||||
|
|
||||||
document = Document.find_by_title('DocumentsControllerTest#test_post_new')
|
document = Document.find_by_title('DocumentsControllerTest#test_post_new')
|
||||||
@@ -124,6 +126,23 @@ LOREM
|
|||||||
assert_template 'new'
|
assert_template 'new'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_create_non_default_category
|
||||||
|
@request.session[:user_id] = 2
|
||||||
|
category2 = Enumeration.find_by_name('User documentation')
|
||||||
|
category2.update_attributes(:is_default => true)
|
||||||
|
category1 = Enumeration.find_by_name('Uncategorized')
|
||||||
|
post :create,
|
||||||
|
:project_id => 'ecookbook',
|
||||||
|
:document => { :title => 'no default',
|
||||||
|
:description => 'This is a new document',
|
||||||
|
:category_id => category1.id }
|
||||||
|
assert_redirected_to '/projects/ecookbook/documents'
|
||||||
|
doc = Document.find_by_title('no default')
|
||||||
|
assert_not_nil doc
|
||||||
|
assert_equal category1.id, doc.category_id
|
||||||
|
assert_equal category1, doc.category
|
||||||
|
end
|
||||||
|
|
||||||
def test_edit
|
def test_edit
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
get :edit, :id => 1
|
get :edit, :id => 1
|
||||||
|
|||||||
@@ -58,13 +58,14 @@ class FilesControllerTest < ActionController::TestCase
|
|||||||
def test_create_file
|
def test_create_file
|
||||||
set_tmp_attachments_directory
|
set_tmp_attachments_directory
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
Setting.notified_events = ['file_added']
|
|
||||||
ActionMailer::Base.deliveries.clear
|
ActionMailer::Base.deliveries.clear
|
||||||
|
|
||||||
assert_difference 'Attachment.count' do
|
with_settings :notified_events => %w(file_added) do
|
||||||
post :create, :project_id => 1, :version_id => '',
|
assert_difference 'Attachment.count' do
|
||||||
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
|
post :create, :project_id => 1, :version_id => '',
|
||||||
assert_response :redirect
|
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
|
||||||
|
assert_response :redirect
|
||||||
|
end
|
||||||
end
|
end
|
||||||
assert_redirected_to '/projects/ecookbook/files'
|
assert_redirected_to '/projects/ecookbook/files'
|
||||||
a = Attachment.find(:first, :order => 'created_on DESC')
|
a = Attachment.find(:first, :order => 'created_on DESC')
|
||||||
@@ -80,7 +81,6 @@ class FilesControllerTest < ActionController::TestCase
|
|||||||
def test_create_version_file
|
def test_create_version_file
|
||||||
set_tmp_attachments_directory
|
set_tmp_attachments_directory
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
Setting.notified_events = ['file_added']
|
|
||||||
|
|
||||||
assert_difference 'Attachment.count' do
|
assert_difference 'Attachment.count' do
|
||||||
post :create, :project_id => 1, :version_id => '2',
|
post :create, :project_id => 1, :version_id => '2',
|
||||||
|
|||||||
@@ -1305,6 +1305,7 @@ class IssuesControllerTest < ActionController::TestCase
|
|||||||
:tag => 'input',
|
:tag => 'input',
|
||||||
:attributes => {:type => 'file', :name => 'attachments[1][file]'}
|
:attributes => {:type => 'file', :name => 'attachments[1][file]'}
|
||||||
}
|
}
|
||||||
|
assert_select 'input[name=?][maxlength=255]', 'attachments[1][description]'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_get_new_should_prefill_the_form_from_params
|
def test_get_new_should_prefill_the_form_from_params
|
||||||
|
|||||||
@@ -91,11 +91,12 @@ class MessagesControllerTest < ActionController::TestCase
|
|||||||
def test_post_new
|
def test_post_new
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
ActionMailer::Base.deliveries.clear
|
ActionMailer::Base.deliveries.clear
|
||||||
Setting.notified_events = ['message_posted']
|
|
||||||
|
|
||||||
post :new, :board_id => 1,
|
with_settings :notified_events => %w(message_posted) do
|
||||||
|
post :new, :board_id => 1,
|
||||||
:message => { :subject => 'Test created message',
|
:message => { :subject => 'Test created message',
|
||||||
:content => 'Message body'}
|
:content => 'Message body'}
|
||||||
|
end
|
||||||
message = Message.find_by_subject('Test created message')
|
message = Message.find_by_subject('Test created message')
|
||||||
assert_not_nil message
|
assert_not_nil message
|
||||||
assert_redirected_to "/boards/1/topics/#{message.to_param}"
|
assert_redirected_to "/boards/1/topics/#{message.to_param}"
|
||||||
|
|||||||
@@ -82,12 +82,13 @@ class NewsControllerTest < ActionController::TestCase
|
|||||||
|
|
||||||
def test_post_create
|
def test_post_create
|
||||||
ActionMailer::Base.deliveries.clear
|
ActionMailer::Base.deliveries.clear
|
||||||
Setting.notified_events << 'news_added'
|
|
||||||
|
|
||||||
@request.session[:user_id] = 2
|
@request.session[:user_id] = 2
|
||||||
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
|
|
||||||
|
with_settings :notified_events => %w(news_added) do
|
||||||
|
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
|
||||||
:description => 'This is the description',
|
:description => 'This is the description',
|
||||||
:summary => '' }
|
:summary => '' }
|
||||||
|
end
|
||||||
assert_redirected_to '/projects/ecookbook/news'
|
assert_redirected_to '/projects/ecookbook/news'
|
||||||
|
|
||||||
news = News.find_by_title('NewsControllerTest')
|
news = News.find_by_title('NewsControllerTest')
|
||||||
|
|||||||
@@ -53,11 +53,48 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
if @char_1.respond_to?(:force_encoding)
|
if @char_1.respond_to?(:force_encoding)
|
||||||
@char_1.force_encoding('UTF-8')
|
@char_1.force_encoding('UTF-8')
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Setting.default_language = 'en'
|
def test_create_and_update
|
||||||
|
@request.session[:user_id] = 1
|
||||||
|
assert_difference 'Repository.count' do
|
||||||
|
post :create, :project_id => 'subproject1',
|
||||||
|
:repository_scm => 'Git',
|
||||||
|
:repository => {
|
||||||
|
:url => '/test',
|
||||||
|
:is_default => '0',
|
||||||
|
:identifier => 'test-create',
|
||||||
|
:extra_report_last_commit => '1',
|
||||||
|
}
|
||||||
|
end
|
||||||
|
assert_response 302
|
||||||
|
repository = Repository.first(:order => 'id DESC')
|
||||||
|
assert_kind_of Repository::Git, repository
|
||||||
|
assert_equal '/test', repository.url
|
||||||
|
assert_equal true, repository.extra_report_last_commit
|
||||||
|
|
||||||
|
put :update, :id => repository.id,
|
||||||
|
:repository => {
|
||||||
|
:extra_report_last_commit => '0',
|
||||||
|
:identifier => 'test-update',
|
||||||
|
}
|
||||||
|
assert_response 302
|
||||||
|
repo2 = Repository.find(repository.id)
|
||||||
|
assert_equal 'test-update', repo2.identifier
|
||||||
|
assert_equal false, repo2.extra_report_last_commit
|
||||||
end
|
end
|
||||||
|
|
||||||
if File.directory?(REPOSITORY_PATH)
|
if File.directory?(REPOSITORY_PATH)
|
||||||
|
## Ruby uses ANSI api to fork a process on Windows.
|
||||||
|
## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
|
||||||
|
## and these are incompatible with ASCII.
|
||||||
|
## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
|
||||||
|
## http://code.google.com/p/msysgit/issues/detail?id=80
|
||||||
|
## So, Latin-1 path tests fail on Japanese Windows
|
||||||
|
WINDOWS_PASS = (Redmine::Platform.mswin? &&
|
||||||
|
Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
|
||||||
|
WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
|
||||||
|
|
||||||
def test_get_new
|
def test_get_new
|
||||||
@request.session[:user_id] = 1
|
@request.session[:user_id] = 1
|
||||||
@project.repository.destroy
|
@project.repository.destroy
|
||||||
@@ -185,6 +222,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
def test_entry_show_latin_1
|
def test_entry_show_latin_1
|
||||||
if @ruby19_non_utf8_pass
|
if @ruby19_non_utf8_pass
|
||||||
puts_ruby19_non_utf8_pass()
|
puts_ruby19_non_utf8_pass()
|
||||||
|
elsif WINDOWS_PASS
|
||||||
|
puts WINDOWS_SKIP_STR
|
||||||
elsif JRUBY_SKIP
|
elsif JRUBY_SKIP
|
||||||
puts JRUBY_SKIP_STR
|
puts JRUBY_SKIP_STR
|
||||||
else
|
else
|
||||||
@@ -224,6 +263,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_diff
|
def test_diff
|
||||||
|
assert_equal true, @repository.is_default
|
||||||
|
assert_nil @repository.identifier
|
||||||
assert_equal 0, @repository.changesets.count
|
assert_equal 0, @repository.changesets.count
|
||||||
@repository.fetch_changesets
|
@repository.fetch_changesets
|
||||||
@project.reload
|
@project.reload
|
||||||
@@ -246,26 +287,55 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_diff_with_rev_and_path
|
||||||
|
assert_equal 0, @repository.changesets.count
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@project.reload
|
||||||
|
assert_equal NUM_REV, @repository.changesets.count
|
||||||
|
with_settings :diff_max_lines_displayed => 1000 do
|
||||||
|
# Full diff of changeset 2f9c0091
|
||||||
|
['inline', 'sbs'].each do |dt|
|
||||||
|
get :diff,
|
||||||
|
:id => PRJ_ID,
|
||||||
|
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
|
||||||
|
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
|
||||||
|
:type => dt
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'diff'
|
||||||
|
# Line 22 removed
|
||||||
|
assert_tag :tag => 'th',
|
||||||
|
:content => '22',
|
||||||
|
:sibling => { :tag => 'td',
|
||||||
|
:attributes => { :class => /diff_out/ },
|
||||||
|
:content => /def remove/ }
|
||||||
|
assert_tag :tag => 'h2', :content => /2f9c0091/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_diff_truncated
|
def test_diff_truncated
|
||||||
assert_equal 0, @repository.changesets.count
|
assert_equal 0, @repository.changesets.count
|
||||||
@repository.fetch_changesets
|
@repository.fetch_changesets
|
||||||
@project.reload
|
@project.reload
|
||||||
assert_equal NUM_REV, @repository.changesets.count
|
assert_equal NUM_REV, @repository.changesets.count
|
||||||
Setting.diff_max_lines_displayed = 5
|
|
||||||
|
|
||||||
# Truncated diff of changeset 2f9c0091
|
with_settings :diff_max_lines_displayed => 5 do
|
||||||
with_cache do
|
# Truncated diff of changeset 2f9c0091
|
||||||
get :diff, :id => PRJ_ID, :type => 'inline',
|
with_cache do
|
||||||
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
with_settings :default_language => 'en' do
|
||||||
assert_response :success
|
get :diff, :id => PRJ_ID, :type => 'inline',
|
||||||
assert @response.body.include?("... This diff was truncated")
|
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
|
assert_response :success
|
||||||
Setting.default_language = 'fr'
|
assert @response.body.include?("... This diff was truncated")
|
||||||
get :diff, :id => PRJ_ID, :type => 'inline',
|
end
|
||||||
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
with_settings :default_language => 'fr' do
|
||||||
assert_response :success
|
get :diff, :id => PRJ_ID, :type => 'inline',
|
||||||
assert ! @response.body.include?("... This diff was truncated")
|
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
assert @response.body.include?("... Ce diff")
|
assert_response :success
|
||||||
|
assert ! @response.body.include?("... This diff was truncated")
|
||||||
|
assert @response.body.include?("... Ce diff")
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -285,9 +355,55 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
diff = assigns(:diff)
|
diff = assigns(:diff)
|
||||||
assert_not_nil diff
|
assert_not_nil diff
|
||||||
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
|
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
|
||||||
|
assert_tag :tag => "form",
|
||||||
|
:attributes => {
|
||||||
|
:action => "/projects/subproject1/repository/revisions/" +
|
||||||
|
"61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff"
|
||||||
|
}
|
||||||
|
assert_tag :tag => 'input',
|
||||||
|
:attributes => {
|
||||||
|
:id => "rev_to",
|
||||||
|
:name => "rev_to",
|
||||||
|
:type => "hidden",
|
||||||
|
:value => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_diff_path_in_subrepo
|
||||||
|
repo = Repository::Git.create(
|
||||||
|
:project => @project,
|
||||||
|
:url => REPOSITORY_PATH,
|
||||||
|
:identifier => 'test-diff-path',
|
||||||
|
:path_encoding => 'ISO-8859-1'
|
||||||
|
);
|
||||||
|
assert repo
|
||||||
|
assert_equal false, repo.is_default
|
||||||
|
assert_equal 'test-diff-path', repo.identifier
|
||||||
|
get :diff,
|
||||||
|
:id => PRJ_ID,
|
||||||
|
:repository_id => 'test-diff-path',
|
||||||
|
:rev => '61b685fbe55ab05b',
|
||||||
|
:rev_to => '2f9c0091c754a91a',
|
||||||
|
:type => 'inline'
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'diff'
|
||||||
|
diff = assigns(:diff)
|
||||||
|
assert_not_nil diff
|
||||||
|
assert_tag :tag => "form",
|
||||||
|
:attributes => {
|
||||||
|
:action => "/projects/subproject1/repository/test-diff-path/" +
|
||||||
|
"revisions/61b685fbe55ab05b/diff"
|
||||||
|
}
|
||||||
|
assert_tag :tag => 'input',
|
||||||
|
:attributes => {
|
||||||
|
:id => "rev_to",
|
||||||
|
:name => "rev_to",
|
||||||
|
:type => "hidden",
|
||||||
|
:value => '2f9c0091c754a91a'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def test_diff_latin_1
|
def test_diff_latin_1
|
||||||
if @ruby19_non_utf8_pass
|
if @ruby19_non_utf8_pass
|
||||||
puts_ruby19_non_utf8_pass()
|
puts_ruby19_non_utf8_pass()
|
||||||
@@ -319,8 +435,13 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_save_diff_type
|
def test_save_diff_type
|
||||||
@request.session[:user_id] = 1 # admin
|
user1 = User.find(1)
|
||||||
|
user1.pref[:diff_type] = nil
|
||||||
|
user1.preference.save
|
||||||
user = User.find(1)
|
user = User.find(1)
|
||||||
|
assert_nil user.pref[:diff_type]
|
||||||
|
|
||||||
|
@request.session[:user_id] = 1 # admin
|
||||||
get :diff,
|
get :diff,
|
||||||
:id => PRJ_ID,
|
:id => PRJ_ID,
|
||||||
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
@@ -406,6 +527,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
def test_annotate_latin_1
|
def test_annotate_latin_1
|
||||||
if @ruby19_non_utf8_pass
|
if @ruby19_non_utf8_pass
|
||||||
puts_ruby19_non_utf8_pass()
|
puts_ruby19_non_utf8_pass()
|
||||||
|
elsif WINDOWS_PASS
|
||||||
|
puts WINDOWS_SKIP_STR
|
||||||
elsif JRUBY_SKIP
|
elsif JRUBY_SKIP
|
||||||
puts JRUBY_SKIP_STR
|
puts JRUBY_SKIP_STR
|
||||||
else
|
else
|
||||||
@@ -424,6 +547,21 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_revisions
|
||||||
|
assert_equal 0, @repository.changesets.count
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@project.reload
|
||||||
|
assert_equal NUM_REV, @repository.changesets.count
|
||||||
|
get :revisions, :id => PRJ_ID
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'revisions'
|
||||||
|
assert_tag :tag => 'form',
|
||||||
|
:attributes => {
|
||||||
|
:method => 'get',
|
||||||
|
:action => '/projects/subproject1/repository/revision'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def test_revision
|
def test_revision
|
||||||
assert_equal 0, @repository.changesets.count
|
assert_equal 0, @repository.changesets.count
|
||||||
@repository.fetch_changesets
|
@repository.fetch_changesets
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
# Redmine - project management software
|
||||||
|
# Copyright (C) 2006-2012 Jean-Philippe Lang
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
require File.expand_path('../../test_helper', __FILE__)
|
||||||
|
|
||||||
|
class SessionStartTest < ActionController::TestCase
|
||||||
|
tests AccountController
|
||||||
|
|
||||||
|
def test_login_should_set_session_timestamps
|
||||||
|
post :login, :username => 'jsmith', :password => 'jsmith'
|
||||||
|
assert_response 302
|
||||||
|
assert_equal 2, session[:user_id]
|
||||||
|
assert_not_nil session[:ctime]
|
||||||
|
assert_not_nil session[:atime]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class SessionsTest < ActionController::TestCase
|
||||||
|
tests WelcomeController
|
||||||
|
|
||||||
|
def test_atime_from_user_session_should_be_updated
|
||||||
|
created = 2.hours.ago.utc.to_i
|
||||||
|
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
|
||||||
|
assert_response :success
|
||||||
|
assert_equal created, session[:ctime]
|
||||||
|
assert_not_equal created, session[:atime]
|
||||||
|
assert session[:atime] > created
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_should_not_be_reset_if_lifetime_and_timeout_disabled
|
||||||
|
with_settings :session_lifetime => '0', :session_timeout => '0' do
|
||||||
|
get :index, {}, {:user_id => 2}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_without_ctime_should_be_reset_if_lifetime_enabled
|
||||||
|
with_settings :session_lifetime => '720' do
|
||||||
|
get :index, {}, {:user_id => 2}
|
||||||
|
assert_redirected_to '/login'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_with_expired_ctime_should_be_reset_if_lifetime_enabled
|
||||||
|
with_settings :session_timeout => '720' do
|
||||||
|
get :index, {}, {:user_id => 2, :atime => 2.days.ago.utc.to_i}
|
||||||
|
assert_redirected_to '/login'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_with_valid_ctime_should_not_be_reset_if_lifetime_enabled
|
||||||
|
with_settings :session_timeout => '720' do
|
||||||
|
get :index, {}, {:user_id => 2, :atime => 3.hours.ago.utc.to_i}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_without_atime_should_be_reset_if_timeout_enabled
|
||||||
|
with_settings :session_timeout => '60' do
|
||||||
|
get :index, {}, {:user_id => 2}
|
||||||
|
assert_redirected_to '/login'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_with_expired_atime_should_be_reset_if_timeout_enabled
|
||||||
|
with_settings :session_timeout => '60' do
|
||||||
|
get :index, {}, {:user_id => 2, :atime => 4.hours.ago.utc.to_i}
|
||||||
|
assert_redirected_to '/login'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_user_session_with_valid_atime_should_not_be_reset_if_timeout_enabled
|
||||||
|
with_settings :session_timeout => '60' do
|
||||||
|
get :index, {}, {:user_id => 2, :atime => 10.minutes.ago.utc.to_i}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_expired_user_session_should_be_restarted_if_autologin
|
||||||
|
with_settings :session_lifetime => '720', :session_timeout => '60', :autologin => 7 do
|
||||||
|
token = Token.create!(:user_id => 2, :action => 'autologin', :created_on => 1.day.ago)
|
||||||
|
@request.cookies['autologin'] = token.value
|
||||||
|
created = 2.hours.ago.utc.to_i
|
||||||
|
|
||||||
|
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
|
||||||
|
assert_equal 2, session[:user_id]
|
||||||
|
assert_response :success
|
||||||
|
assert_not_equal created, session[:ctime]
|
||||||
|
assert session[:ctime] >= created
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_anonymous_session_should_not_be_reset
|
||||||
|
with_settings :session_lifetime => '720', :session_timeout => '60' do
|
||||||
|
get :index
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -57,6 +57,7 @@ class SettingsControllerTest < ActionController::TestCase
|
|||||||
assert !Setting.bcc_recipients?
|
assert !Setting.bcc_recipients?
|
||||||
assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
|
assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
|
||||||
assert_equal 'Test footer', Setting.emails_footer
|
assert_equal 'Test footer', Setting.emails_footer
|
||||||
|
Setting.clear_cache
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_get_plugin_settings
|
def test_get_plugin_settings
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ class SysControllerTest < ActionController::TestCase
|
|||||||
Setting.enabled_scm = %w(Subversion Git)
|
Setting.enabled_scm = %w(Subversion Git)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
Setting.clear_cache
|
||||||
|
end
|
||||||
|
|
||||||
def test_projects_with_repository_enabled
|
def test_projects_with_repository_enabled
|
||||||
get :projects
|
get :projects
|
||||||
assert_response :success
|
assert_response :success
|
||||||
|
|||||||
@@ -80,6 +80,16 @@ class TimeEntryReportsControllerTest < ActionController::TestCase
|
|||||||
assert_equal "162.90", "%.2f" % assigns(:report).total_hours
|
assert_equal "162.90", "%.2f" % assigns(:report).total_hours
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_report_custom_field_criteria_with_multiple_values
|
||||||
|
field = TimeEntryCustomField.create!(:name => 'multi', :field_format => 'list', :possible_values => ['value1', 'value2'])
|
||||||
|
entry = TimeEntry.create!(:project => Project.find(1), :hours => 1, :activity_id => 10, :user => User.find(2), :spent_on => Date.today)
|
||||||
|
CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value1')
|
||||||
|
CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value2')
|
||||||
|
|
||||||
|
get :report, :project_id => 1, :columns => 'day', :criteria => ["cf_#{field.id}"]
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
def test_report_one_day
|
def test_report_one_day
|
||||||
get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["member", "activity"]
|
get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["member", "activity"]
|
||||||
assert_response :success
|
assert_response :success
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
# Default activity selected
|
# Default activity selected
|
||||||
assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
|
assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
|
||||||
:content => 'Development'
|
:content => 'Development'
|
||||||
|
assert_select 'input[name=project_id][value=1]'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_get_new_should_only_show_active_time_entry_activities
|
def test_get_new_should_only_show_active_time_entry_activities
|
||||||
@@ -61,6 +62,18 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
assert_response :success
|
assert_response :success
|
||||||
assert_template 'new'
|
assert_template 'new'
|
||||||
assert_tag 'select', :attributes => {:name => 'time_entry[project_id]'}
|
assert_tag 'select', :attributes => {:name => 'time_entry[project_id]'}
|
||||||
|
assert_select 'input[name=project_id]', 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_new_without_project_should_prefill_the_form
|
||||||
|
@request.session[:user_id] = 3
|
||||||
|
get :new, :time_entry => {:project_id => '1'}
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'new'
|
||||||
|
assert_select 'select[name=?]', 'time_entry[project_id]' do
|
||||||
|
assert_select 'option[value=1][selected=selected]'
|
||||||
|
end
|
||||||
|
assert_select 'input[name=project_id]', 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_new_without_project_should_deny_without_permission
|
def test_new_without_project_should_deny_without_permission
|
||||||
@@ -144,7 +157,7 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
:spent_on => '2008-03-14',
|
:spent_on => '2008-03-14',
|
||||||
:hours => '7.3'},
|
:hours => '7.3'},
|
||||||
:continue => '1'
|
:continue => '1'
|
||||||
assert_redirected_to '/projects/ecookbook/time_entries/new'
|
assert_redirected_to '/projects/ecookbook/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D='
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_create_and_continue_with_issue_id
|
def test_create_and_continue_with_issue_id
|
||||||
@@ -155,7 +168,7 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
:spent_on => '2008-03-14',
|
:spent_on => '2008-03-14',
|
||||||
:hours => '7.3'},
|
:hours => '7.3'},
|
||||||
:continue => '1'
|
:continue => '1'
|
||||||
assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new'
|
assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=1'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_create_and_continue_without_project
|
def test_create_and_continue_without_project
|
||||||
@@ -167,7 +180,7 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
:hours => '7.3'},
|
:hours => '7.3'},
|
||||||
:continue => '1'
|
:continue => '1'
|
||||||
|
|
||||||
assert_redirected_to '/time_entries/new'
|
assert_redirected_to '/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=&time_entry%5Bproject_id%5D=1'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_create_without_log_time_permission_should_be_denied
|
def test_create_without_log_time_permission_should_be_denied
|
||||||
@@ -537,6 +550,20 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
:attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'}
|
:attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_index_should_sort_by_spent_on_and_created_on
|
||||||
|
t1 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:00:00', :activity_id => 10)
|
||||||
|
t2 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:05:00', :activity_id => 10)
|
||||||
|
t3 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-15', :created_on => '2012-06-16 20:10:00', :activity_id => 10)
|
||||||
|
|
||||||
|
get :index, :project_id => 1, :from => '2012-06-15', :to => '2012-06-16'
|
||||||
|
assert_response :success
|
||||||
|
assert_equal [t2, t1, t3], assigns(:entries)
|
||||||
|
|
||||||
|
get :index, :project_id => 1, :from => '2012-06-15', :to => '2012-06-16', :sort => 'spent_on'
|
||||||
|
assert_response :success
|
||||||
|
assert_equal [t3, t1, t2], assigns(:entries)
|
||||||
|
end
|
||||||
|
|
||||||
def test_index_atom_feed
|
def test_index_atom_feed
|
||||||
get :index, :project_id => 1, :format => 'atom'
|
get :index, :project_id => 1, :format => 'atom'
|
||||||
assert_response :success
|
assert_response :success
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest
|
|||||||
:member_roles,
|
:member_roles,
|
||||||
:issues,
|
:issues,
|
||||||
:issue_statuses,
|
:issue_statuses,
|
||||||
|
:issue_relations,
|
||||||
:versions,
|
:versions,
|
||||||
:trackers,
|
:trackers,
|
||||||
:projects_trackers,
|
:projects_trackers,
|
||||||
|
|||||||
@@ -79,6 +79,21 @@ class ApiTest::TimeEntriesTest < ActionController::IntegrationTest
|
|||||||
assert_equal 3.5, entry.hours
|
assert_equal 3.5, entry.hours
|
||||||
assert_equal TimeEntryActivity.find(11), entry.activity
|
assert_equal TimeEntryActivity.find(11), entry.activity
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "accept custom fields" do
|
||||||
|
field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string')
|
||||||
|
|
||||||
|
assert_difference 'TimeEntry.count' do
|
||||||
|
post '/time_entries.xml', {:time_entry => {
|
||||||
|
:issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11', :custom_fields => [{:id => field.id.to_s, :value => 'accepted'}]
|
||||||
|
}}, credentials('jsmith')
|
||||||
|
end
|
||||||
|
assert_response :created
|
||||||
|
assert_equal 'application/xml', @response.content_type
|
||||||
|
|
||||||
|
entry = TimeEntry.first(:order => 'id DESC')
|
||||||
|
assert_equal 'accepted', entry.custom_field_value(field)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with project_id" do
|
context "with project_id" do
|
||||||
|
|||||||
@@ -103,15 +103,11 @@ class ApiTest::VersionsTest < ActionController::IntegrationTest
|
|||||||
|
|
||||||
assert_response :success
|
assert_response :success
|
||||||
assert_equal 'application/xml', @response.content_type
|
assert_equal 'application/xml', @response.content_type
|
||||||
assert_tag 'version',
|
assert_select 'version' do
|
||||||
:child => {
|
assert_select 'id', :text => '2'
|
||||||
:tag => 'id',
|
assert_select 'name', :text => '1.0'
|
||||||
:content => '2',
|
assert_select 'sharing', :text => 'none'
|
||||||
:sibling => {
|
end
|
||||||
:tag => 'name',
|
|
||||||
:content => '1.0'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,12 @@ class AttachmentTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_description_length_should_be_validated
|
||||||
|
a = Attachment.new(:description => 'a' * 300)
|
||||||
|
assert !a.save
|
||||||
|
assert_not_nil a.errors[:description]
|
||||||
|
end
|
||||||
|
|
||||||
def test_destroy
|
def test_destroy
|
||||||
a = Attachment.new(:container => Issue.find(1),
|
a = Attachment.new(:container => Issue.find(1),
|
||||||
:file => uploaded_test_file("testfile.txt", "text/plain"),
|
:file => uploaded_test_file("testfile.txt", "text/plain"),
|
||||||
|
|||||||
@@ -179,7 +179,8 @@ class ChangesetTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_commit_closing_a_subproject_issue
|
def test_commit_closing_a_subproject_issue
|
||||||
with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes' do
|
with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes',
|
||||||
|
:default_language => 'en' do
|
||||||
issue = Issue.find(5)
|
issue = Issue.find(5)
|
||||||
assert !issue.closed?
|
assert !issue.closed?
|
||||||
assert_difference 'Journal.count' do
|
assert_difference 'Journal.count' do
|
||||||
|
|||||||
@@ -33,11 +33,12 @@ class CommentTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_create_should_send_notification
|
def test_create_should_send_notification
|
||||||
Setting.notified_events << 'news_comment_added'
|
|
||||||
Watcher.create!(:watchable => @news, :user => @jsmith)
|
Watcher.create!(:watchable => @news, :user => @jsmith)
|
||||||
|
|
||||||
assert_difference 'ActionMailer::Base.deliveries.size' do
|
with_settings :notified_events => %w(news_comment_added) do
|
||||||
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment")
|
assert_difference 'ActionMailer::Base.deliveries.size' do
|
||||||
|
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -32,4 +32,16 @@ class DocumentCategoryTest < ActiveSupport::TestCase
|
|||||||
def test_option_name
|
def test_option_name
|
||||||
assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name
|
assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_default
|
||||||
|
assert_nil DocumentCategory.find(:first, :conditions => { :is_default => true })
|
||||||
|
e = Enumeration.find_by_name('Technical documentation')
|
||||||
|
e.update_attributes(:is_default => true)
|
||||||
|
assert_equal 3, DocumentCategory.default.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_force_default
|
||||||
|
assert_nil DocumentCategory.find(:first, :conditions => { :is_default => true })
|
||||||
|
assert_equal 1, DocumentCategory.default.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user