Compare commits
159
Commits
master
...
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 | ||
|
|
a06462548c | ||
|
|
e62a40a719 | ||
|
|
5a1be1d8df | ||
|
|
81c207b193 | ||
|
|
60cdcd5522 | ||
|
|
da293fdfd8 | ||
|
|
9cfb7e1c87 | ||
|
|
78c185abde | ||
|
|
3266265cad | ||
|
|
d9304e062a | ||
|
|
40af0a2cbf | ||
|
|
eb53d600c9 | ||
|
|
fa4fdf91a4 | ||
|
|
e9ac98b249 | ||
|
|
9db20cd02c | ||
|
|
b0951bff54 | ||
|
|
0a09984954 | ||
|
|
9b7105465e | ||
|
|
45683d9c2a | ||
|
|
dcba6f0400 | ||
|
|
f11e9eb2d6 | ||
|
|
095d99cf9e | ||
|
|
163ac957ba | ||
|
|
04a8a72491 | ||
|
|
a1a6dcffca | ||
|
|
d31402734b | ||
|
|
5180ca0cdd | ||
|
|
e5802895ce | ||
|
|
da1a3449ce | ||
|
|
2b2f721ef4 | ||
|
|
62114336cf | ||
|
|
4f48d1b4dd | ||
|
|
d6d064f875 | ||
|
|
6d8649b9d3 | ||
|
|
39deb03855 | ||
|
|
70036a7ad0 | ||
|
|
68d421b978 | ||
|
|
268a9db47e | ||
|
|
a35b81b9fa | ||
|
|
fd450fd2da | ||
|
|
2c0ba78f70 | ||
|
|
f0f01d370e | ||
|
|
4c330a1241 | ||
|
|
baa4ebd05f | ||
|
|
59f14478ed | ||
|
|
8fefb7c05b | ||
|
|
1feb373c89 | ||
|
|
32fd503cbb | ||
|
|
cf31aeaf81 | ||
|
|
83ea66fd2c | ||
|
|
ef2c5cab2d | ||
|
|
dee6f6b138 | ||
|
|
a4c0c18e3d | ||
|
|
4c82fbb6f8 | ||
|
|
68ded50edc | ||
|
|
72ecb80dc7 | ||
|
|
86ee285eb4 | ||
|
|
c229ea6386 | ||
|
|
687fca170e | ||
|
|
26564b06f7 | ||
|
|
34016c38bd | ||
|
|
15ff361894 | ||
|
|
b45b5f4322 | ||
|
|
8addbc537a | ||
|
|
87eeacba80 | ||
|
|
a7250c41e2 | ||
|
|
7c45396d92 | ||
|
|
c1f98c835c |
@@ -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,8 +1,8 @@
|
|||||||
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.0"
|
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]
|
||||||
gem "tzinfo", "~> 0.3.31"
|
gem "tzinfo", "~> 0.3.31"
|
||||||
|
|
||||||
@@ -16,18 +16,20 @@ group :openid do
|
|||||||
gem "ruby-openid", "~> 2.1.4", :require => "openid"
|
gem "ruby-openid", "~> 2.1.4", :require => "openid"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Optional gem for exporting the gantt to a PNG file
|
# Optional gem for exporting the gantt to a PNG file, not supported with jruby
|
||||||
group :rmagick do
|
platforms :mri, :mingw do
|
||||||
# RMagick 2 supports ruby 1.9
|
group :rmagick do
|
||||||
# RMagick 1 would be fine for ruby 1.8 but Bundler does not support
|
# RMagick 2 supports ruby 1.9
|
||||||
# different requirements for the same gem on different platforms
|
# RMagick 1 would be fine for ruby 1.8 but Bundler does not support
|
||||||
gem "rmagick", ">= 2.0.0"
|
# different requirements for the same gem on different platforms
|
||||||
|
gem "rmagick", ">= 2.0.0"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Database gems
|
# Database gems
|
||||||
platforms :mri, :mingw do
|
platforms :mri, :mingw do
|
||||||
group :postgresql do
|
group :postgresql do
|
||||||
gem "pg", "~> 0.9.0"
|
gem "pg", ">= 0.11.0"
|
||||||
end
|
end
|
||||||
|
|
||||||
group :sqlite do
|
group :sqlite do
|
||||||
@@ -37,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
|
||||||
|
|
||||||
@@ -69,8 +71,16 @@ 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
|
||||||
|
|
||||||
|
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
|
||||||
|
if File.exists?(local_gemfile)
|
||||||
|
puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
|
||||||
|
instance_eval File.read(local_gemfile)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Load plugins' Gemfiles
|
# Load plugins' Gemfiles
|
||||||
|
|||||||
@@ -131,14 +131,6 @@ class AccountController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def logout_user
|
|
||||||
if User.current.logged?
|
|
||||||
cookies.delete :autologin
|
|
||||||
Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin'])
|
|
||||||
self.logged_user = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def authenticate_user
|
def authenticate_user
|
||||||
if Setting.openid? && using_open_id?
|
if Setting.openid? && using_open_id?
|
||||||
open_id_authenticate(params[:openid_url])
|
open_id_authenticate(params[:openid_url])
|
||||||
|
|||||||
@@ -75,9 +75,7 @@ class AdminController < ApplicationController
|
|||||||
def info
|
def info
|
||||||
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
|
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
|
||||||
@checklist = [
|
@checklist = [
|
||||||
[:text_default_administrator_account_changed,
|
[:text_default_administrator_account_changed, User.default_admin_account_changed?],
|
||||||
User.find(:first,
|
|
||||||
:conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?],
|
|
||||||
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
|
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
|
||||||
[:text_plugin_assets_writable, File.writable?(Redmine::Plugin.public_directory)],
|
[:text_plugin_assets_writable, File.writable?(Redmine::Plugin.public_directory)],
|
||||||
[:text_rmagick_available, Object.const_defined?(:Magick)]
|
[:text_rmagick_available, Object.const_defined?(:Magick)]
|
||||||
|
|||||||
@@ -31,17 +31,6 @@ class ApplicationController < ActionController::Base
|
|||||||
super
|
super
|
||||||
cookies.delete(:autologin)
|
cookies.delete(:autologin)
|
||||||
end
|
end
|
||||||
# Remove broken cookie after upgrade from 0.8.x (#4292)
|
|
||||||
# See https://rails.lighthouseapp.com/projects/8994/tickets/3360
|
|
||||||
# TODO: remove it when Rails is fixed
|
|
||||||
before_filter :delete_broken_cookies
|
|
||||||
def delete_broken_cookies
|
|
||||||
if cookies['_redmine_session'] && cookies['_redmine_session'] !~ /--/
|
|
||||||
cookies.delete '_redmine_session'
|
|
||||||
redirect_to home_path
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# FIXME: Remove this when all of Rack and Rails have learned how to
|
# FIXME: Remove this when all of Rack and Rails have learned how to
|
||||||
# properly use encodings
|
# properly use encodings
|
||||||
@@ -67,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
|
||||||
@@ -81,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
|
||||||
@@ -94,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
|
||||||
@@ -115,17 +133,38 @@ 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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Logs out current user
|
||||||
|
def logout_user
|
||||||
|
if User.current.logged?
|
||||||
|
cookies.delete :autologin
|
||||||
|
Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin'])
|
||||||
|
self.logged_user = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# check if login is globally required to access the application
|
# check if login is globally required to access the application
|
||||||
def check_if_login_required
|
def check_if_login_required
|
||||||
# no check needed if user is already logged in
|
# no check needed if user is already logged in
|
||||||
@@ -364,18 +403,6 @@ class ApplicationController < ActionController::Base
|
|||||||
:content_type => 'application/atom+xml'
|
:content_type => 'application/atom+xml'
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: remove in Redmine 1.4
|
|
||||||
def self.accept_key_auth(*actions)
|
|
||||||
ActiveSupport::Deprecation.warn "ApplicationController.accept_key_auth is deprecated and will be removed in Redmine 1.4. Use accept_rss_auth (or accept_api_auth) instead."
|
|
||||||
accept_rss_auth(*actions)
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: remove in Redmine 1.4
|
|
||||||
def accept_key_auth_actions
|
|
||||||
ActiveSupport::Deprecation.warn "ApplicationController.accept_key_auth_actions is deprecated and will be removed in Redmine 1.4. Use accept_rss_auth (or accept_api_auth) instead."
|
|
||||||
self.class.accept_rss_auth
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.accept_rss_auth(*actions)
|
def self.accept_rss_auth(*actions)
|
||||||
if actions.any?
|
if actions.any?
|
||||||
write_inheritable_attribute('accept_rss_auth_actions', actions)
|
write_inheritable_attribute('accept_rss_auth_actions', actions)
|
||||||
@@ -472,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
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class AttachmentsController < ApplicationController
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@attachment = Attachment.new(:file => request.body)
|
@attachment = Attachment.new(:file => request.raw_post)
|
||||||
@attachment.author = User.current
|
@attachment.author = User.current
|
||||||
@attachment.filename = Redmine::Utils.random_hex(16)
|
@attachment.filename = Redmine::Utils.random_hex(16)
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class BoardsController < ApplicationController
|
|||||||
:include => [:author, {:last_reply => :author}],
|
:include => [:author, {:last_reply => :author}],
|
||||||
:limit => @topic_pages.items_per_page,
|
:limit => @topic_pages.items_per_page,
|
||||||
:offset => @topic_pages.current.offset
|
:offset => @topic_pages.current.offset
|
||||||
@message = Message.new
|
@message = Message.new(:board => @board)
|
||||||
render :action => 'show', :layout => !request.xhr?
|
render :action => 'show', :layout => !request.xhr?
|
||||||
}
|
}
|
||||||
format.atom {
|
format.atom {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class IssueRelationsController < ApplicationController
|
|||||||
def create
|
def create
|
||||||
@relation = IssueRelation.new(params[:relation])
|
@relation = IssueRelation.new(params[:relation])
|
||||||
@relation.issue_from = @issue
|
@relation.issue_from = @issue
|
||||||
if params[:relation] && m = params[:relation][:issue_to_id].to_s.match(/^#?(\d+)$/)
|
if params[:relation] && m = params[:relation][:issue_to_id].to_s.strip.match(/^#?(\d+)$/)
|
||||||
@relation.issue_to = Issue.visible.find_by_id(m[1].to_i)
|
@relation.issue_to = Issue.visible.find_by_id(m[1].to_i)
|
||||||
end
|
end
|
||||||
saved = @relation.save
|
saved = @relation.save
|
||||||
|
|||||||
@@ -225,12 +225,19 @@ class IssuesController < ApplicationController
|
|||||||
end
|
end
|
||||||
target_projects ||= @projects
|
target_projects ||= @projects
|
||||||
|
|
||||||
@available_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&)
|
if @copy
|
||||||
|
@available_statuses = [IssueStatus.default]
|
||||||
|
else
|
||||||
|
@available_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&)
|
||||||
|
end
|
||||||
@custom_fields = target_projects.map{|p|p.all_issue_custom_fields}.reduce(:&)
|
@custom_fields = target_projects.map{|p|p.all_issue_custom_fields}.reduce(:&)
|
||||||
@assignables = target_projects.map(&:assignable_users).reduce(:&)
|
@assignables = target_projects.map(&:assignable_users).reduce(:&)
|
||||||
@trackers = target_projects.map(&:trackers).reduce(:&)
|
@trackers = target_projects.map(&:trackers).reduce(:&)
|
||||||
@versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&)
|
@versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&)
|
||||||
@categories = target_projects.map {|p| p.issue_categories}.reduce(:&)
|
@categories = target_projects.map {|p| p.issue_categories}.reduce(:&)
|
||||||
|
if @copy
|
||||||
|
@attachments_present = @issues.detect {|i| i.attachments.any?}.present?
|
||||||
|
end
|
||||||
|
|
||||||
@safe_attributes = @issues.map(&:safe_attribute_names).reduce(:&)
|
@safe_attributes = @issues.map(&:safe_attribute_names).reduce(:&)
|
||||||
render :layout => false if request.xhr?
|
render :layout => false if request.xhr?
|
||||||
@@ -246,7 +253,7 @@ class IssuesController < ApplicationController
|
|||||||
@issues.each do |issue|
|
@issues.each do |issue|
|
||||||
issue.reload
|
issue.reload
|
||||||
if @copy
|
if @copy
|
||||||
issue = issue.copy
|
issue = issue.copy({}, :attachments => params[:copy_attachments].present?)
|
||||||
end
|
end
|
||||||
journal = issue.init_journal(User.current, params[:notes])
|
journal = issue.init_journal(User.current, params[:notes])
|
||||||
issue.safe_attributes = attributes
|
issue.safe_attributes = attributes
|
||||||
@@ -348,8 +355,6 @@ private
|
|||||||
# from the params
|
# from the params
|
||||||
# TODO: Refactor, not everything in here is needed by #edit
|
# TODO: Refactor, not everything in here is needed by #edit
|
||||||
def update_issue_from_params
|
def update_issue_from_params
|
||||||
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
|
||||||
@priorities = IssuePriority.active
|
|
||||||
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
||||||
@time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project)
|
@time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project)
|
||||||
@time_entry.attributes = params[:time_entry]
|
@time_entry.attributes = params[:time_entry]
|
||||||
@@ -371,6 +376,8 @@ private
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
@issue.safe_attributes = issue_attributes
|
@issue.safe_attributes = issue_attributes
|
||||||
|
@priorities = IssuePriority.active
|
||||||
|
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -420,7 +427,16 @@ private
|
|||||||
def parse_params_for_bulk_issue_attributes(params)
|
def parse_params_for_bulk_issue_attributes(params)
|
||||||
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
|
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
|
||||||
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
|
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
|
||||||
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
|
if custom = attributes[:custom_field_values]
|
||||||
|
custom.reject! {|k,v| v.blank?}
|
||||||
|
custom.keys.each do |k|
|
||||||
|
if custom[k].is_a?(Array)
|
||||||
|
custom[k] << '' if custom[k].delete('__none__')
|
||||||
|
else
|
||||||
|
custom[k] = '' if custom[k] == '__none__'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
attributes
|
attributes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -65,6 +65,24 @@ class MyController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Destroys user's account
|
||||||
|
def destroy
|
||||||
|
@user = User.current
|
||||||
|
unless @user.own_account_deletable?
|
||||||
|
redirect_to :action => 'account'
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if request.post? && params[:confirm]
|
||||||
|
@user.destroy
|
||||||
|
if @user.destroyed?
|
||||||
|
logout_user
|
||||||
|
flash[:notice] = l(:notice_account_deleted)
|
||||||
|
end
|
||||||
|
redirect_to home_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Manage user's password
|
# Manage user's password
|
||||||
def password
|
def password
|
||||||
@user = User.current
|
@user = User.current
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -176,9 +176,11 @@ class UsersController < ApplicationController
|
|||||||
def destroy
|
def destroy
|
||||||
@user.destroy
|
@user.destroy
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to(users_url) }
|
format.html { redirect_to :back }
|
||||||
format.api { head :ok }
|
format.api { head :ok }
|
||||||
end
|
end
|
||||||
|
rescue ::ActionController::RedirectBackError
|
||||||
|
redirect_to(users_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit_membership
|
def edit_membership
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ module CustomFieldsHelper
|
|||||||
when "list"
|
when "list"
|
||||||
options = []
|
options = []
|
||||||
options << [l(:label_no_change_option), ''] unless custom_field.multiple?
|
options << [l(:label_no_change_option), ''] unless custom_field.multiple?
|
||||||
|
options << [l(:label_none), '__none__'] unless custom_field.is_required?
|
||||||
options += custom_field.possible_values_options(projects)
|
options += custom_field.possible_values_options(projects)
|
||||||
select_tag(field_name, options_for_select(options),
|
select_tag(field_name, options_for_select(options),
|
||||||
:id => field_id, :multiple => custom_field.multiple?)
|
:id => field_id, :multiple => custom_field.multiple?)
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ module IssuesHelper
|
|||||||
cv = issue.custom_field_values.detect {|v| v.custom_field_id == column.custom_field.id}
|
cv = issue.custom_field_values.detect {|v| v.custom_field_id == column.custom_field.id}
|
||||||
show_value(cv)
|
show_value(cv)
|
||||||
else
|
else
|
||||||
value = issue.send(column.name)
|
value = column.value(issue)
|
||||||
if value.is_a?(Date)
|
if value.is_a?(Date)
|
||||||
format_date(value)
|
format_date(value)
|
||||||
elsif value.is_a?(Time)
|
elsif value.is_a?(Time)
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -110,10 +111,15 @@ class Attachment < ActiveRecord::Base
|
|||||||
logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)")
|
logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)")
|
||||||
md5 = Digest::MD5.new
|
md5 = Digest::MD5.new
|
||||||
File.open(diskfile, "wb") do |f|
|
File.open(diskfile, "wb") do |f|
|
||||||
buffer = ""
|
if @temp_file.respond_to?(:read)
|
||||||
while (buffer = @temp_file.read(8192))
|
buffer = ""
|
||||||
f.write(buffer)
|
while (buffer = @temp_file.read(8192))
|
||||||
md5.update(buffer)
|
f.write(buffer)
|
||||||
|
md5.update(buffer)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f.write(@temp_file)
|
||||||
|
md5.update(@temp_file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.digest = md5.hexdigest
|
self.digest = md5.hexdigest
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+47
-13
@@ -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) : []
|
||||||
@@ -145,8 +167,8 @@ class Issue < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Returns an unsaved copy of the issue
|
# Returns an unsaved copy of the issue
|
||||||
def copy(attributes=nil)
|
def copy(attributes=nil, copy_options={})
|
||||||
copy = self.class.new.copy_from(self)
|
copy = self.class.new.copy_from(self, copy_options)
|
||||||
copy.attributes = attributes if attributes
|
copy.attributes = attributes if attributes
|
||||||
copy
|
copy
|
||||||
end
|
end
|
||||||
@@ -509,18 +531,30 @@ class Issue < ActiveRecord::Base
|
|||||||
!relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil?
|
!relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns an array of status that user is able to apply
|
# Returns an array of statuses that user is able to apply
|
||||||
def new_statuses_allowed_to(user=User.current, include_default=false)
|
def new_statuses_allowed_to(user=User.current, include_default=false)
|
||||||
statuses = status.find_new_statuses_allowed_to(
|
if new_record? && @copied_from
|
||||||
user.admin ? Role.all : user.roles_for_project(project),
|
[IssueStatus.default, @copied_from.status].compact.uniq.sort
|
||||||
tracker,
|
else
|
||||||
author == user,
|
initial_status = nil
|
||||||
assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
|
if new_record?
|
||||||
)
|
initial_status = IssueStatus.default
|
||||||
statuses << status unless statuses.empty?
|
elsif status_id_was
|
||||||
statuses << IssueStatus.default if include_default
|
initial_status = IssueStatus.find_by_id(status_id_was)
|
||||||
statuses = statuses.uniq.sort
|
end
|
||||||
blocked? ? statuses.reject {|s| s.is_closed?} : statuses
|
initial_status ||= status
|
||||||
|
|
||||||
|
statuses = initial_status.find_new_statuses_allowed_to(
|
||||||
|
user.admin ? Role.all : user.roles_for_project(project),
|
||||||
|
tracker,
|
||||||
|
author == user,
|
||||||
|
assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
|
||||||
|
)
|
||||||
|
statuses << initial_status unless statuses.empty?
|
||||||
|
statuses << IssueStatus.default if include_default
|
||||||
|
statuses = statuses.compact.uniq.sort
|
||||||
|
blocked? ? statuses.reject {|s| s.is_closed?} : statuses
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def assigned_to_was
|
def assigned_to_was
|
||||||
|
|||||||
@@ -42,6 +42,12 @@ class MailHandler < ActionMailer::Base
|
|||||||
super email
|
super email
|
||||||
end
|
end
|
||||||
|
|
||||||
|
cattr_accessor :ignored_emails_headers
|
||||||
|
@@ignored_emails_headers = {
|
||||||
|
'X-Auto-Response-Suppress' => 'oof',
|
||||||
|
'Auto-Submitted' => /^auto-/
|
||||||
|
}
|
||||||
|
|
||||||
# Processes incoming emails
|
# Processes incoming emails
|
||||||
# Returns the created object (eg. an issue, a message) or false
|
# Returns the created object (eg. an issue, a message) or false
|
||||||
def receive(email)
|
def receive(email)
|
||||||
@@ -54,6 +60,19 @@ class MailHandler < ActionMailer::Base
|
|||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
# Ignore auto generated emails
|
||||||
|
self.class.ignored_emails_headers.each do |key, ignored_value|
|
||||||
|
value = email.header_string(key)
|
||||||
|
if value
|
||||||
|
value = value.to_s.downcase
|
||||||
|
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
|
||||||
|
end
|
||||||
@user = User.find_by_mail(sender_email) if sender_email.present?
|
@user = User.find_by_mail(sender_email) if sender_email.present?
|
||||||
if @user && !@user.active?
|
if @user && !@user.active?
|
||||||
if logger && logger.info
|
if logger && logger.info
|
||||||
|
|||||||
+14
-2
@@ -359,7 +359,7 @@ class Mailer < ActionMailer::Base
|
|||||||
|
|
||||||
issues_by_assignee = scope.all(:include => [:status, :assigned_to, :project, :tracker]).group_by(&:assigned_to)
|
issues_by_assignee = scope.all(:include => [:status, :assigned_to, :project, :tracker]).group_by(&:assigned_to)
|
||||||
issues_by_assignee.each do |assignee, issues|
|
issues_by_assignee.each do |assignee, issues|
|
||||||
deliver_reminder(assignee, issues, days) if assignee && assignee.active?
|
deliver_reminder(assignee, issues, days) if assignee.is_a?(User) && assignee.active?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -372,6 +372,17 @@ class Mailer < ActionMailer::Base
|
|||||||
ActionMailer::Base.perform_deliveries = was_enabled
|
ActionMailer::Base.perform_deliveries = was_enabled
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Sends emails synchronously in the given block
|
||||||
|
def self.with_synched_deliveries(&block)
|
||||||
|
saved_method = ActionMailer::Base.delivery_method
|
||||||
|
if m = saved_method.to_s.match(%r{^async_(.+)$})
|
||||||
|
ActionMailer::Base.delivery_method = m[1].to_sym
|
||||||
|
end
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
ActionMailer::Base.delivery_method = saved_method
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def initialize_defaults(method_name)
|
def initialize_defaults(method_name)
|
||||||
super
|
super
|
||||||
@@ -384,7 +395,8 @@ class Mailer < ActionMailer::Base
|
|||||||
'X-Redmine-Host' => Setting.host_name,
|
'X-Redmine-Host' => Setting.host_name,
|
||||||
'X-Redmine-Site' => Setting.app_title,
|
'X-Redmine-Site' => Setting.app_title,
|
||||||
'X-Auto-Response-Suppress' => 'OOF',
|
'X-Auto-Response-Suppress' => 'OOF',
|
||||||
'Auto-Submitted' => 'auto-generated'
|
'Auto-Submitted' => 'auto-generated',
|
||||||
|
'List-Id' => "<#{Setting.mail_from.to_s.gsub('@', '.')}>"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Appends a Redmine header field (name is prepended with 'X-Redmine-')
|
# Appends a Redmine header field (name is prepended with 'X-Redmine-')
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ class Message < ActiveRecord::Base
|
|||||||
:author_key => :author_id
|
:author_key => :author_id
|
||||||
acts_as_watchable
|
acts_as_watchable
|
||||||
|
|
||||||
attr_protected :locked, :sticky
|
|
||||||
validates_presence_of :board, :subject, :content
|
validates_presence_of :board, :subject, :content
|
||||||
validates_length_of :subject, :maximum => 255
|
validates_length_of :subject, :maximum => 255
|
||||||
validate :cannot_reply_to_locked_topic, :on => :create
|
validate :cannot_reply_to_locked_topic, :on => :create
|
||||||
@@ -50,7 +49,7 @@ class Message < ActiveRecord::Base
|
|||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
||||||
|
|
||||||
safe_attributes 'subject', 'content'
|
safe_attributes 'subject', 'content'
|
||||||
safe_attributes 'locked', 'sticky',
|
safe_attributes 'locked', 'sticky', 'board_id',
|
||||||
:if => lambda {|message, user|
|
:if => lambda {|message, user|
|
||||||
user.allowed_to?(:edit_messages, message.project)
|
user.allowed_to?(:edit_messages, message.project)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -126,8 +126,8 @@ class Query < ActiveRecord::Base
|
|||||||
:list_subprojects => [ "*", "!*", "=" ],
|
:list_subprojects => [ "*", "!*", "=" ],
|
||||||
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "t+", "t", "w", ">t-", "<t-", "t-", "!*", "*" ],
|
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "t+", "t", "w", ">t-", "<t-", "t-", "!*", "*" ],
|
||||||
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w", "!*", "*" ],
|
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w", "!*", "*" ],
|
||||||
:string => [ "=", "~", "!", "!~" ],
|
:string => [ "=", "~", "!", "!~", "!*", "*" ],
|
||||||
:text => [ "~", "!~" ],
|
:text => [ "~", "!~", "!*", "*" ],
|
||||||
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
|
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
|
||||||
:float => [ "=", ">=", "<=", "><", "!*", "*" ] }
|
:float => [ "=", ">=", "<=", "><", "!*", "*" ] }
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ class Repository < ActiveRecord::Base
|
|||||||
elsif repository.is_default?
|
elsif repository.is_default?
|
||||||
1
|
1
|
||||||
else
|
else
|
||||||
identifier <=> repository.identifier
|
identifier.to_s <=> repository.identifier.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ class Token < ActiveRecord::Base
|
|||||||
|
|
||||||
# Delete all expired tokens
|
# Delete all expired tokens
|
||||||
def self.destroy_expired
|
def self.destroy_expired
|
||||||
Token.delete_all ["action <> 'feeds' AND created_on < ?", Time.now - @@validity_time]
|
Token.delete_all ["action NOT IN (?) AND created_on < ?", ['feeds', 'api'], Time.now - @@validity_time]
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
+27
-9
@@ -68,7 +68,7 @@ class User < Principal
|
|||||||
MAIL_LENGTH_LIMIT = 60
|
MAIL_LENGTH_LIMIT = 60
|
||||||
|
|
||||||
validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
|
validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
|
||||||
validates_uniqueness_of :login, :if => Proc.new { |user| !user.login.blank? }, :case_sensitive => false
|
validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, :case_sensitive => false
|
||||||
validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }, :case_sensitive => false
|
validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }, :case_sensitive => false
|
||||||
# Login must contain lettres, numbers, underscores only
|
# Login must contain lettres, numbers, underscores only
|
||||||
validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
|
validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
|
||||||
@@ -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
|
||||||
@@ -284,14 +287,18 @@ class User < Principal
|
|||||||
|
|
||||||
# Return user's RSS key (a 40 chars long string), used to access feeds
|
# Return user's RSS key (a 40 chars long string), used to access feeds
|
||||||
def rss_key
|
def rss_key
|
||||||
token = self.rss_token || Token.create(:user => self, :action => 'feeds')
|
if rss_token.nil?
|
||||||
token.value
|
create_rss_token(:action => 'feeds')
|
||||||
|
end
|
||||||
|
rss_token.value
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return user's API key (a 40 chars long string), used to access the API
|
# Return user's API key (a 40 chars long string), used to access the API
|
||||||
def api_key
|
def api_key
|
||||||
token = self.api_token || self.create_api_token(:action => 'api')
|
if api_token.nil?
|
||||||
token.value
|
create_api_token(:action => 'api')
|
||||||
|
end
|
||||||
|
api_token.value
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return an array of project ids for which the user has explicitly turned mail notifications on
|
# Return an array of project ids for which the user has explicitly turned mail notifications on
|
||||||
@@ -334,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
|
||||||
|
|
||||||
@@ -348,6 +355,11 @@ class User < Principal
|
|||||||
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
|
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns true if the default admin account can no longer be used
|
||||||
|
def self.default_admin_account_changed?
|
||||||
|
!User.active.find_by_login("admin").try(:check_password?, "admin")
|
||||||
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
@@ -477,6 +489,12 @@ class User < Principal
|
|||||||
allowed_to?(action, nil, options.reverse_merge(:global => true), &block)
|
allowed_to?(action, nil, options.reverse_merge(:global => true), &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns true if the user is allowed to delete his own account
|
||||||
|
def own_account_deletable?
|
||||||
|
Setting.unsubscribe? &&
|
||||||
|
(!admin? || User.active.first(:conditions => ["admin = ? AND id <> ?", true, id]).present?)
|
||||||
|
end
|
||||||
|
|
||||||
safe_attributes 'login',
|
safe_attributes 'login',
|
||||||
'firstname',
|
'firstname',
|
||||||
'lastname',
|
'lastname',
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -60,6 +60,13 @@
|
|||||||
<p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects) %></p>
|
<p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if @copy && @attachments_present %>
|
||||||
|
<p>
|
||||||
|
<label for='copy_attachments'><%= l(:label_copy_attachments) %></label>
|
||||||
|
<%= check_box_tag 'copy_attachments', '1', true %>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %>
|
<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<title><%=h html_title %></title>
|
<title><%=h html_title %></title>
|
||||||
<meta name="description" content="<%= Redmine::Info.app_name %>" />
|
<meta name="description" content="<%= Redmine::Info.app_name %>" />
|
||||||
<meta name="keywords" content="issue,bug,tracker" />
|
<meta name="keywords" content="issue,bug,tracker" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE" />
|
||||||
<%= csrf_meta_tag %>
|
<%= csrf_meta_tag %>
|
||||||
<%= favicon %>
|
<%= favicon %>
|
||||||
<%= stylesheet_link_tag 'application', :media => 'all' %>
|
<%= stylesheet_link_tag 'application', :media => 'all' %>
|
||||||
|
|||||||
@@ -6,13 +6,17 @@
|
|||||||
<p><label for="message_subject"><%= l(:field_subject) %></label><br />
|
<p><label for="message_subject"><%= l(:field_subject) %></label><br />
|
||||||
<%= f.text_field :subject, :size => 120, :id => "message_subject" %>
|
<%= f.text_field :subject, :size => 120, :id => "message_subject" %>
|
||||||
|
|
||||||
<% if !replying && User.current.allowed_to?(:edit_messages, @project) %>
|
<% unless replying %>
|
||||||
|
<% if @message.safe_attribute? 'sticky' %>
|
||||||
<label><%= f.check_box :sticky %><%= l(:label_board_sticky) %></label>
|
<label><%= f.check_box :sticky %><%= l(:label_board_sticky) %></label>
|
||||||
|
<% end %>
|
||||||
|
<% if @message.safe_attribute? 'locked' %>
|
||||||
<label><%= f.check_box :locked %><%= l(:label_board_locked) %></label>
|
<label><%= f.check_box :locked %><%= l(:label_board_locked) %></label>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<% if !replying && !@message.new_record? && User.current.allowed_to?(:edit_messages, @project) %>
|
<% if !replying && !@message.new_record? && @message.safe_attribute?('board_id') %>
|
||||||
<p><label><%= l(:label_board) %></label><br />
|
<p><label><%= l(:label_board) %></label><br />
|
||||||
<%= f.select :board_id, @project.boards.collect {|b| [b.name, b.id]} %></p>
|
<%= f.select :board_id, @project.boards.collect {|b| [b.name, b.id]} %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
<p><%=l(:field_login)%>: <strong><%= link_to_user(@user, :format => :username) %></strong><br />
|
<p><%=l(:field_login)%>: <strong><%= link_to_user(@user, :format => :username) %></strong><br />
|
||||||
<%=l(:field_created_on)%>: <%= format_time(@user.created_on) %></p>
|
<%=l(:field_created_on)%>: <%= format_time(@user.created_on) %></p>
|
||||||
|
|
||||||
|
<% if @user.own_account_deletable? %>
|
||||||
|
<p><%= link_to(l(:button_delete_my_account), {:action => 'destroy'}, :class => 'icon icon-del') %></p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<h4><%= l(:label_feeds_access_key) %></h4>
|
<h4><%= l(:label_feeds_access_key) %></h4>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<h2><%=l(:label_confirmation)%></h2>
|
||||||
|
<div class="warning">
|
||||||
|
<p><%= simple_format l(:text_account_destroy_confirmation)%></p>
|
||||||
|
<p>
|
||||||
|
<% form_tag({}) do %>
|
||||||
|
<label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label>
|
||||||
|
<%= submit_tag l(:button_delete_my_account) %> |
|
||||||
|
<%= link_to l(:button_cancel), :action => 'account' %>
|
||||||
|
<% end %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
@@ -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' %>
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
[l(:label_registration_manual_activation), "2"],
|
[l(:label_registration_manual_activation), "2"],
|
||||||
[l(:label_registration_automatic_activation), "3"]] %></p>
|
[l(:label_registration_automatic_activation), "3"]] %></p>
|
||||||
|
|
||||||
|
<p><%= setting_check_box :unsubscribe %></p>
|
||||||
|
|
||||||
<p><%= setting_text_field :password_min_length, :size => 6 %></p>
|
<p><%= setting_text_field :password_min_length, :size => 6 %></p>
|
||||||
|
|
||||||
<p><%= setting_check_box :lost_password, :label => :label_password_lost %></p>
|
<p><%= setting_check_box :lost_password, :label => :label_password_lost %></p>
|
||||||
@@ -19,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 %>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<p>
|
<p>
|
||||||
<%= label_tag "period_type_interval", l(:description_date_range_interval), :class => "hidden-for-sighted" %>
|
<%= label_tag "period_type_interval", l(:description_date_range_interval), :class => "hidden-for-sighted" %>
|
||||||
<%= radio_button_tag 'period_type', '2', @free_period, :onclick => 'Form.Element.enable("from");Form.Element.enable("to");Form.Element.disable("period");', :id => "period_type_interval" %>
|
<%= radio_button_tag 'period_type', '2', @free_period, :onclick => 'Form.Element.enable("from");Form.Element.enable("to");Form.Element.disable("period");', :id => "period_type_interval" %>
|
||||||
<span onclick="$('period_type_2').checked = true;">
|
<span onclick="$('period_type_interval').checked = true;Form.Element.enable('from');Form.Element.enable('to');Form.Element.disable('period');">
|
||||||
<%= l(:label_date_from_to,
|
<%= l(:label_date_from_to,
|
||||||
:start => ((label_tag "from", l(:description_date_from), :class => "hidden-for-sighted") +
|
:start => ((label_tag "from", l(:description_date_from), :class => "hidden-for-sighted") +
|
||||||
text_field_tag('from', @from, :size => 10, :disabled => !@free_period) + calendar_for('from')),
|
text_field_tag('from', @from, :size => 10, :disabled => !@free_period) + calendar_for('from')),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
# MySQL (default setup).
|
# Default setup is given for MySQL with ruby1.8. If you're running Redmine
|
||||||
|
# with MySQL and ruby1.9, replace the adapter name with `mysql2`.
|
||||||
|
# Examples for PostgreSQL and SQLite3 can be found at the end.
|
||||||
|
|
||||||
production:
|
production:
|
||||||
adapter: mysql
|
adapter: mysql
|
||||||
|
|||||||
@@ -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} أيام"
|
||||||
@@ -1025,3 +1028,14 @@ ar:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} дена"
|
||||||
@@ -174,6 +177,7 @@ bg:
|
|||||||
notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max})
|
notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max})
|
||||||
notice_issue_successful_create: Задача %{id} е създадена.
|
notice_issue_successful_create: Задача %{id} е създадена.
|
||||||
notice_issue_update_conflict: Задачата е била променена от друг потребител, докато вие сте я редактирали.
|
notice_issue_update_conflict: Задачата е била променена от друг потребител, докато вие сте я редактирали.
|
||||||
|
notice_account_deleted: Вашият профил беше премахнат без възможност за възстановяване.
|
||||||
|
|
||||||
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
|
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
|
||||||
error_scm_not_found: Несъществуващ обект в хранилището.
|
error_scm_not_found: Несъществуващ обект в хранилището.
|
||||||
@@ -194,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})"
|
||||||
@@ -384,6 +389,9 @@ bg:
|
|||||||
setting_issue_group_assignment: Разрешено назначаването на задачи на групи
|
setting_issue_group_assignment: Разрешено назначаването на задачи на групи
|
||||||
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_session_lifetime: Максимален живот на сесиите
|
||||||
|
setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите
|
||||||
|
|
||||||
permission_add_project: Създаване на проект
|
permission_add_project: Създаване на проект
|
||||||
permission_add_subprojects: Създаване на подпроекти
|
permission_add_subprojects: Създаване на подпроекти
|
||||||
@@ -846,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: Прикачване
|
||||||
@@ -895,6 +904,7 @@ bg:
|
|||||||
button_show: Показване
|
button_show: Показване
|
||||||
button_edit_section: Редактиране на тази секция
|
button_edit_section: Редактиране на тази секция
|
||||||
button_export: Експорт
|
button_export: Експорт
|
||||||
|
button_delete_my_account: Премахване на моя профил
|
||||||
|
|
||||||
status_active: активен
|
status_active: активен
|
||||||
status_registered: регистриран
|
status_registered: регистриран
|
||||||
@@ -979,6 +989,8 @@ bg:
|
|||||||
text_issue_conflict_resolution_overwrite: Прилагане на моите промени (предишните коментари ще бъдат запазени, но някои други промени може да бъдат презаписани)
|
text_issue_conflict_resolution_overwrite: Прилагане на моите промени (предишните коментари ще бъдат запазени, но някои други промени може да бъдат презаписани)
|
||||||
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_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"
|
||||||
@@ -1039,3 +1042,14 @@ bs:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1027,3 +1030,14 @@ ca:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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ů"
|
||||||
@@ -1028,3 +1031,14 @@ cs:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1042,3 +1045,14 @@ da:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+22
-10
@@ -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'
|
||||||
@@ -210,7 +213,7 @@ de:
|
|||||||
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
|
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
|
||||||
mail_subject_register: "%{value} Kontoaktivierung"
|
mail_subject_register: "%{value} Kontoaktivierung"
|
||||||
mail_body_register: 'Um Ihr Konto zu aktivieren, benutzen Sie folgenden Link:'
|
mail_body_register: 'Um Ihr Konto zu aktivieren, benutzen Sie folgenden Link:'
|
||||||
mail_body_account_information_external: "Sie können sich mit Ihrem Konto %{value} an anmelden."
|
mail_body_account_information_external: "Sie können sich mit Ihrem Konto %{value} anmelden."
|
||||||
mail_body_account_information: Ihre Konto-Informationen
|
mail_body_account_information: Ihre Konto-Informationen
|
||||||
mail_subject_account_activation_request: "Antrag auf %{value} Kontoaktivierung"
|
mail_subject_account_activation_request: "Antrag auf %{value} Kontoaktivierung"
|
||||||
mail_body_account_activation_request: "Ein neuer Benutzer (%{value}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
|
mail_body_account_activation_request: "Ein neuer Benutzer (%{value}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
|
||||||
@@ -503,7 +506,7 @@ de:
|
|||||||
label_last_login: Letzte Anmeldung
|
label_last_login: Letzte Anmeldung
|
||||||
label_registered_on: Angemeldet am
|
label_registered_on: Angemeldet am
|
||||||
label_activity: Aktivität
|
label_activity: Aktivität
|
||||||
label_overall_activity: Aktivität aller Projekte anzeigen
|
label_overall_activity: Aktivitäten aller Projekte anzeigen
|
||||||
label_user_activity: "Aktivität von %{value}"
|
label_user_activity: "Aktivität von %{value}"
|
||||||
label_new: Neu
|
label_new: Neu
|
||||||
label_logged_as: Angemeldet als
|
label_logged_as: Angemeldet als
|
||||||
@@ -717,7 +720,7 @@ de:
|
|||||||
label_message_new: Neues Thema
|
label_message_new: Neues Thema
|
||||||
label_message_posted: Forenbeitrag hinzugefügt
|
label_message_posted: Forenbeitrag hinzugefügt
|
||||||
label_reply_plural: Antworten
|
label_reply_plural: Antworten
|
||||||
label_send_information: Sende Kontoinformationen zum Benutzer
|
label_send_information: Sende Kontoinformationen an Benutzer
|
||||||
label_year: Jahr
|
label_year: Jahr
|
||||||
label_month: Monat
|
label_month: Monat
|
||||||
label_week: Woche
|
label_week: Woche
|
||||||
@@ -992,11 +995,11 @@ de:
|
|||||||
text_scm_config: Die SCM-Kommandos können in der in config/configuration.yml konfiguriert werden. Redmine muss anschließend neu gestartet werden.
|
text_scm_config: Die SCM-Kommandos können in der in config/configuration.yml konfiguriert werden. Redmine muss anschließend neu gestartet werden.
|
||||||
text_scm_command_not_available: Scm Kommando ist nicht verfügbar. Bitte prüfen Sie die Einstellungen im Administrationspanel.
|
text_scm_command_not_available: Scm Kommando ist nicht verfügbar. Bitte prüfen Sie die Einstellungen im Administrationspanel.
|
||||||
|
|
||||||
notice_issue_successful_create: Issue %{id} created.
|
notice_issue_successful_create: Ticket %{id} erstellt.
|
||||||
label_between: between
|
label_between: zwischen
|
||||||
setting_issue_group_assignment: Allow issue assignment to groups
|
setting_issue_group_assignment: Erlaubt die Ticket-Zuweisung an Gruppen
|
||||||
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 steht für sich alleine (bare) und liegt lokal (z.B. /gitrepo, c:\gitrepo)
|
||||||
|
|
||||||
description_filter: Filter
|
description_filter: Filter
|
||||||
description_search: Suchfeld
|
description_search: Suchfeld
|
||||||
@@ -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)
|
||||||
@@ -1045,3 +1048,12 @@ de:
|
|||||||
permission_manage_related_issues: Zugehörige Tickets verwalten
|
permission_manage_related_issues: Zugehörige Tickets verwalten
|
||||||
field_ldap_filter: LDAP Filter
|
field_ldap_filter: LDAP Filter
|
||||||
label_search_for_watchers: Nach hinzufügbaren Beobachtern suchen
|
label_search_for_watchers: Nach hinzufügbaren Beobachtern suchen
|
||||||
|
notice_account_deleted: Ihr Benutzerkonto wurde unwiderruflich gelöscht.
|
||||||
|
setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu 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.
|
||||||
|
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} ημέρες"
|
||||||
@@ -1025,3 +1028,14 @@ el:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1027,3 +1030,14 @@ en-GB:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -173,6 +176,7 @@ en:
|
|||||||
notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
|
notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
|
||||||
notice_issue_successful_create: "Issue %{id} created."
|
notice_issue_successful_create: "Issue %{id} created."
|
||||||
notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it."
|
notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it."
|
||||||
|
notice_account_deleted: "Your account has been permanently deleted."
|
||||||
|
|
||||||
error_can_t_load_default_data: "Default configuration could not be loaded: %{value}"
|
error_can_t_load_default_data: "Default configuration could not be loaded: %{value}"
|
||||||
error_scm_not_found: "The entry or revision was not found in the repository."
|
error_scm_not_found: "The entry or revision was not found in the repository."
|
||||||
@@ -193,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"
|
||||||
@@ -383,6 +388,9 @@ en:
|
|||||||
setting_issue_group_assignment: Allow issue assignment to groups
|
setting_issue_group_assignment: Allow issue assignment to groups
|
||||||
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_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
|
||||||
@@ -845,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
|
||||||
@@ -894,6 +903,7 @@ en:
|
|||||||
button_show: Show
|
button_show: Show
|
||||||
button_edit_section: Edit this section
|
button_edit_section: Edit this section
|
||||||
button_export: Export
|
button_export: Export
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
|
||||||
status_active: active
|
status_active: active
|
||||||
status_registered: registered
|
status_registered: registered
|
||||||
@@ -978,6 +988,8 @@ en:
|
|||||||
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)"
|
||||||
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_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"
|
||||||
@@ -1062,3 +1065,14 @@ es:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1041,3 +1044,14 @@ et:
|
|||||||
error_attachment_too_big: "Seda faili ei saa üles laadida, kuna ületab maksimumsuurust (%{max_size})"
|
error_attachment_too_big: "Seda faili ei saa üles laadida, kuna ületab maksimumsuurust (%{max_size})"
|
||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to unsubscribe
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1028,3 +1031,14 @@ eu:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} روز"
|
||||||
@@ -1027,3 +1030,14 @@ fa:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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ää"
|
||||||
@@ -1046,3 +1049,14 @@ fi:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+13
-1
@@ -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"
|
||||||
@@ -188,6 +191,7 @@ fr:
|
|||||||
notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})"
|
notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})"
|
||||||
notice_issue_successful_create: "La demande %{id} a été créée."
|
notice_issue_successful_create: "La demande %{id} a été créée."
|
||||||
notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez."
|
notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez."
|
||||||
|
notice_account_deleted: "Votre compte a été définitivement supprimé."
|
||||||
|
|
||||||
error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : %{value}"
|
error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : %{value}"
|
||||||
error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
|
error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
|
||||||
@@ -200,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."
|
||||||
|
|
||||||
@@ -379,6 +384,9 @@ fr:
|
|||||||
setting_issue_group_assignment: Permettre l'assignement des demandes aux groupes
|
setting_issue_group_assignment: Permettre l'assignement des demandes aux groupes
|
||||||
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_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
|
||||||
@@ -820,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
|
||||||
@@ -868,6 +877,7 @@ fr:
|
|||||||
button_show: Afficher
|
button_show: Afficher
|
||||||
button_edit_section: Modifier cette section
|
button_edit_section: Modifier cette section
|
||||||
button_export: Exporter
|
button_export: Exporter
|
||||||
|
button_delete_my_account: Supprimer mon compte
|
||||||
|
|
||||||
status_active: actif
|
status_active: actif
|
||||||
status_registered: enregistré
|
status_registered: enregistré
|
||||||
@@ -934,6 +944,8 @@ fr:
|
|||||||
text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)"
|
text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)"
|
||||||
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
|
text_issue_conflict_resolution_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_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 "
|
||||||
@@ -1039,4 +1051,4 @@ fr:
|
|||||||
label_child_revision: Enfant
|
label_child_revision: Enfant
|
||||||
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale.
|
error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale.
|
||||||
setting_repositories_encodings: Encodages des fichiers et des dépôts
|
setting_repositories_encodings: Encodages des fichiers et des dépôts
|
||||||
label_search_for_watchers: Search for watchers to add
|
label_search_for_watchers: Rechercher des observateurs
|
||||||
|
|||||||
@@ -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'
|
||||||
@@ -1036,3 +1039,14 @@ gl:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} ימים'
|
||||||
@@ -1030,3 +1033,14 @@ he:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+14
-3
@@ -1,6 +1,3 @@
|
|||||||
# Croatian translations for Ruby on Rails
|
|
||||||
# by Helix d.o.o. (info@helix.hr)
|
|
||||||
|
|
||||||
hr:
|
hr:
|
||||||
direction: ltr
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
@@ -51,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"
|
||||||
@@ -1031,3 +1031,14 @@ hr:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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'
|
||||||
@@ -1044,3 +1047,14 @@
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1031,3 +1034,14 @@ id:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1026,3 +1029,14 @@ it:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+16
-2
@@ -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}日"
|
||||||
@@ -348,7 +351,7 @@ ja:
|
|||||||
setting_welcome_text: ウェルカムメッセージ
|
setting_welcome_text: ウェルカムメッセージ
|
||||||
setting_default_language: 既定の言語
|
setting_default_language: 既定の言語
|
||||||
setting_login_required: 認証が必要
|
setting_login_required: 認証が必要
|
||||||
setting_self_registration: ユーザは自分で登録できる
|
setting_self_registration: ユーザによるアカウント登録
|
||||||
setting_attachment_max_size: 添付ファイルサイズの上限
|
setting_attachment_max_size: 添付ファイルサイズの上限
|
||||||
setting_issues_export_limit: エクスポートするチケット数の上限
|
setting_issues_export_limit: エクスポートするチケット数の上限
|
||||||
setting_mail_from: 送信元メールアドレス
|
setting_mail_from: 送信元メールアドレス
|
||||||
@@ -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アクセスキー
|
||||||
@@ -1055,3 +1058,14 @@ ja:
|
|||||||
permission_manage_related_issues: 関連するチケットの管理
|
permission_manage_related_issues: 関連するチケットの管理
|
||||||
field_ldap_filter: LDAPフィルタ
|
field_ldap_filter: LDAPフィルタ
|
||||||
label_search_for_watchers: ウォッチャーを検索して追加
|
label_search_for_watchers: ウォッチャーを検索して追加
|
||||||
|
notice_account_deleted: アカウントが削除されました。
|
||||||
|
setting_unsubscribe: ユーザによるアカウント削除を許可
|
||||||
|
button_delete_my_account: 自分のアカウントを削除
|
||||||
|
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}일"
|
||||||
@@ -1075,3 +1078,14 @@ ko:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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ų"
|
||||||
@@ -1085,3 +1088,14 @@ lt:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1019,3 +1022,14 @@ lv:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} дена"
|
||||||
@@ -1025,3 +1028,14 @@ mk:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} өдөр"
|
||||||
@@ -1025,3 +1028,14 @@ mn:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+34
-17
@@ -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,23 +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
|
|
||||||
|
label_search_for_watchers: Zoek om monitoorders toe te voegen
|
||||||
|
notice_account_deleted: Uw account is permanent verwijderd
|
||||||
|
setting_unsubscribe: Sta gebruikers toe hun eigen account te verwijderen
|
||||||
|
button_delete_my_account: Verwijder mijn account
|
||||||
|
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Weet u zeker dat u door wilt gaan?
|
||||||
|
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
|
||||||
|
|||||||
+39
-25
@@ -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,50 +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: Din konto er ugjenkallelig slettet.
|
||||||
|
setting_unsubscribe: Tillat brukere å slette sin egen konto
|
||||||
|
button_delete_my_account: Slett kontoen min
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Er du sikker på at du ønsker å fortsette?
|
||||||
|
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"
|
||||||
@@ -1042,3 +1045,14 @@ pl:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
pt-BR:
|
pt-BR:
|
||||||
# formatos de data e hora
|
|
||||||
direction: ltr
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
@@ -19,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:
|
||||||
@@ -53,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'
|
||||||
@@ -1048,3 +1050,14 @@ pt-BR:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1030,3 +1033,14 @@ pt:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1022,3 +1025,14 @@ ro:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+47
-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,42 +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: "Ваша учетная запись полностью удалена"
|
||||||
|
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
|
||||||
|
button_delete_my_account: "Удалить мою учетную запись"
|
||||||
|
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í"
|
||||||
@@ -1025,3 +1028,14 @@ sk:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1025,3 +1028,14 @@ sl:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||||
@@ -1025,3 +1028,14 @@ sr-YU:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} дана"
|
||||||
@@ -1026,3 +1029,14 @@ sr:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
+61
-50
@@ -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"
|
||||||
@@ -203,7 +206,8 @@ sv:
|
|||||||
notice_email_error: "Ett fel inträffade när mail skickades (%{value})"
|
notice_email_error: "Ett fel inträffade när mail skickades (%{value})"
|
||||||
notice_feeds_access_key_reseted: Din RSS-nyckel återställdes.
|
notice_feeds_access_key_reseted: Din RSS-nyckel återställdes.
|
||||||
notice_api_access_key_reseted: Din API-nyckel återställdes.
|
notice_api_access_key_reseted: Din API-nyckel återställdes.
|
||||||
notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valt: %{ids}."
|
notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valda: %{ids}."
|
||||||
|
notice_failed_to_save_time_entries: "Misslyckades med att spara %{count} tidloggning(ar) på %{total} valda: %{ids}."
|
||||||
notice_failed_to_save_members: "Misslyckades med att spara medlem(mar): %{errors}."
|
notice_failed_to_save_members: "Misslyckades med att spara medlem(mar): %{errors}."
|
||||||
notice_no_issue_selected: "Inget ärende är markerat! Var vänlig, markera de ärenden du vill ändra."
|
notice_no_issue_selected: "Inget ärende är markerat! Var vänlig, markera de ärenden du vill ändra."
|
||||||
notice_account_pending: "Ditt konto skapades och avvaktar nu administratörens godkännande."
|
notice_account_pending: "Ditt konto skapades och avvaktar nu administratörens godkännande."
|
||||||
@@ -213,11 +217,14 @@ sv:
|
|||||||
notice_issue_done_ratios_updated: "% klart uppdaterade."
|
notice_issue_done_ratios_updated: "% klart uppdaterade."
|
||||||
notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})"
|
notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})"
|
||||||
notice_issue_successful_create: Ärende %{id} skapades.
|
notice_issue_successful_create: Ärende %{id} skapades.
|
||||||
|
notice_issue_update_conflict: Detta ärende har uppdaterats av en annan användare samtidigt som du redigerade det.
|
||||||
|
notice_account_deleted: Ditt konto har avslutats permanent.
|
||||||
|
|
||||||
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
|
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
|
||||||
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
|
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
|
||||||
error_scm_command_failed: "Ett fel inträffade vid försök att nå versionsarkivet: %{value}"
|
error_scm_command_failed: "Ett fel inträffade vid försök att nå versionsarkivet: %{value}"
|
||||||
error_scm_annotate: "Inlägget existerar inte eller kan inte kommenteras."
|
error_scm_annotate: "Inlägget existerar inte eller kan inte kommenteras."
|
||||||
|
error_scm_annotate_big_text_file: Inlägget kan inte annoteras eftersom det överskrider maximal storlek för textfiler.
|
||||||
error_issue_not_found_in_project: 'Ärendet hittades inte eller så tillhör det inte detta projekt'
|
error_issue_not_found_in_project: 'Ärendet hittades inte eller så tillhör det inte detta projekt'
|
||||||
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
|
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
|
||||||
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
|
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
|
||||||
@@ -231,7 +238,7 @@ sv:
|
|||||||
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
|
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
|
||||||
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
||||||
error_unable_to_connect: "Kan inte ansluta (%{value})"
|
error_unable_to_connect: "Kan inte ansluta (%{value})"
|
||||||
|
error_attachment_too_big: Denna fil kan inte laddas upp eftersom den överstiger maximalt tillåten filstorlek (%{max_size})
|
||||||
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
||||||
|
|
||||||
mail_subject_lost_password: "Ditt %{value} lösenord"
|
mail_subject_lost_password: "Ditt %{value} lösenord"
|
||||||
@@ -358,6 +365,9 @@ sv:
|
|||||||
field_root_directory: Rotmapp
|
field_root_directory: Rotmapp
|
||||||
field_cvsroot: CVSROOT
|
field_cvsroot: CVSROOT
|
||||||
field_cvs_module: Modul
|
field_cvs_module: Modul
|
||||||
|
field_repository_is_default: Huvudarkiv
|
||||||
|
field_multiple: Flera värden
|
||||||
|
field_ldap_filter: LDAP-filter
|
||||||
|
|
||||||
setting_app_title: Applikationsrubrik
|
setting_app_title: Applikationsrubrik
|
||||||
setting_app_subtitle: Applikationsunderrubrik
|
setting_app_subtitle: Applikationsunderrubrik
|
||||||
@@ -384,6 +394,7 @@ sv:
|
|||||||
setting_time_format: Tidsformat
|
setting_time_format: Tidsformat
|
||||||
setting_cross_project_issue_relations: Tillåt ärenderelationer mellan projekt
|
setting_cross_project_issue_relations: Tillåt ärenderelationer mellan projekt
|
||||||
setting_issue_list_default_columns: Standardkolumner i ärendelistan
|
setting_issue_list_default_columns: Standardkolumner i ärendelistan
|
||||||
|
setting_repositories_encodings: Encoding för bilagor och versionsarkiv
|
||||||
setting_emails_header: Mail-header
|
setting_emails_header: Mail-header
|
||||||
setting_emails_footer: Signatur
|
setting_emails_footer: Signatur
|
||||||
setting_protocol: Protokoll
|
setting_protocol: Protokoll
|
||||||
@@ -416,6 +427,9 @@ sv:
|
|||||||
setting_commit_logtime_activity_id: Aktivitet för loggad tid
|
setting_commit_logtime_activity_id: Aktivitet för loggad tid
|
||||||
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
|
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
|
||||||
setting_issue_group_assignment: Tillåt att ärenden tilldelas till grupper
|
setting_issue_group_assignment: Tillåt att ärenden tilldelas till grupper
|
||||||
|
setting_default_issue_start_date_to_creation_date: Använd dagens datum som startdatum för nya ärenden
|
||||||
|
setting_commit_cross_project_ref: Tillåt ärende i alla de andra projekten att bli refererade och fixade
|
||||||
|
setting_unsubscribe: Tillåt användare att avsluta prenumereration
|
||||||
|
|
||||||
permission_add_project: Skapa projekt
|
permission_add_project: Skapa projekt
|
||||||
permission_add_subprojects: Skapa underprojekt
|
permission_add_subprojects: Skapa underprojekt
|
||||||
@@ -474,6 +488,7 @@ sv:
|
|||||||
permission_delete_own_messages: Ta bort egna meddelanden
|
permission_delete_own_messages: Ta bort egna meddelanden
|
||||||
permission_export_wiki_pages: Exportera wikisidor
|
permission_export_wiki_pages: Exportera wikisidor
|
||||||
permission_manage_subtasks: Hantera underaktiviteter
|
permission_manage_subtasks: Hantera underaktiviteter
|
||||||
|
permission_manage_related_issues: Hantera relaterade ärenden
|
||||||
|
|
||||||
project_module_issue_tracking: Ärendeuppföljning
|
project_module_issue_tracking: Ärendeuppföljning
|
||||||
project_module_time_tracking: Tidsuppföljning
|
project_module_time_tracking: Tidsuppföljning
|
||||||
@@ -624,6 +639,10 @@ sv:
|
|||||||
zero: 0 stängda
|
zero: 0 stängda
|
||||||
one: 1 stängd
|
one: 1 stängd
|
||||||
other: "%{count} stängda"
|
other: "%{count} stängda"
|
||||||
|
label_x_issues:
|
||||||
|
zero: 0 ärenden
|
||||||
|
one: 1 ärende
|
||||||
|
other: "%{count} ärenden"
|
||||||
label_total: Total
|
label_total: Total
|
||||||
label_permissions: Behörigheter
|
label_permissions: Behörigheter
|
||||||
label_current_status: Nuvarande status
|
label_current_status: Nuvarande status
|
||||||
@@ -684,6 +703,7 @@ sv:
|
|||||||
label_not_contains: innehåller inte
|
label_not_contains: innehåller inte
|
||||||
label_day_plural: dagar
|
label_day_plural: dagar
|
||||||
label_repository: Versionsarkiv
|
label_repository: Versionsarkiv
|
||||||
|
label_repository_new: Nytt versionsarkiv
|
||||||
label_repository_plural: Versionsarkiv
|
label_repository_plural: Versionsarkiv
|
||||||
label_browse: Bläddra
|
label_browse: Bläddra
|
||||||
label_modification: "%{count} ändring"
|
label_modification: "%{count} ändring"
|
||||||
@@ -736,6 +756,7 @@ sv:
|
|||||||
label_statistics: Statistik
|
label_statistics: Statistik
|
||||||
label_commits_per_month: Commits per månad
|
label_commits_per_month: Commits per månad
|
||||||
label_commits_per_author: Commits per författare
|
label_commits_per_author: Commits per författare
|
||||||
|
label_diff: diff
|
||||||
label_view_diff: Visa skillnader
|
label_view_diff: Visa skillnader
|
||||||
label_diff_inline: i texten
|
label_diff_inline: i texten
|
||||||
label_diff_side_by_side: sida vid sida
|
label_diff_side_by_side: sida vid sida
|
||||||
@@ -864,6 +885,13 @@ sv:
|
|||||||
label_issues_visibility_public: Alla icke-privata ärenden
|
label_issues_visibility_public: Alla icke-privata ärenden
|
||||||
label_issues_visibility_own: Ärenden skapade av eller tilldelade till användaren
|
label_issues_visibility_own: Ärenden skapade av eller tilldelade till användaren
|
||||||
label_git_report_last_commit: Rapportera senaste commit av filer och mappar
|
label_git_report_last_commit: Rapportera senaste commit av filer och mappar
|
||||||
|
label_parent_revision: Förälder
|
||||||
|
label_child_revision: Barn
|
||||||
|
label_export_options: "%{export_format} exportalternativ"
|
||||||
|
label_copy_attachments: Kopiera bilagor
|
||||||
|
label_item_position: "%{position}/%{count}"
|
||||||
|
label_completed_versions: Klara versioner
|
||||||
|
label_search_for_watchers: Sök efter bevakare att lägga till
|
||||||
|
|
||||||
button_login: Logga in
|
button_login: Logga in
|
||||||
button_submit: Skicka
|
button_submit: Skicka
|
||||||
@@ -911,6 +939,9 @@ sv:
|
|||||||
button_quote: Citera
|
button_quote: Citera
|
||||||
button_duplicate: Duplicera
|
button_duplicate: Duplicera
|
||||||
button_show: Visa
|
button_show: Visa
|
||||||
|
button_edit_section: Redigera denna sektion
|
||||||
|
button_export: Exportera
|
||||||
|
button_delete_my_account: Ta bort mitt konto
|
||||||
|
|
||||||
status_active: aktiv
|
status_active: aktiv
|
||||||
status_registered: registrerad
|
status_registered: registrerad
|
||||||
@@ -938,6 +969,7 @@ sv:
|
|||||||
text_tip_issue_begin_day: ärende som börjar denna dag
|
text_tip_issue_begin_day: ärende som börjar denna dag
|
||||||
text_tip_issue_end_day: ärende som slutar denna dag
|
text_tip_issue_end_day: ärende som slutar denna dag
|
||||||
text_tip_issue_begin_end_day: ärende som börjar och slutar denna dag
|
text_tip_issue_begin_end_day: ärende som börjar och slutar denna dag
|
||||||
|
text_project_identifier_info: Ändast gemener (a-z), siffror, streck och understreck är tillåtna.<br />När identifieraren sparats kan den inte ändras.
|
||||||
text_caracters_maximum: "max %{count} tecken."
|
text_caracters_maximum: "max %{count} tecken."
|
||||||
text_caracters_minimum: "Måste vara minst %{count} tecken lång."
|
text_caracters_minimum: "Måste vara minst %{count} tecken lång."
|
||||||
text_length_between: "Längd mellan %{min} och %{max} tecken."
|
text_length_between: "Längd mellan %{min} och %{max} tecken."
|
||||||
@@ -985,11 +1017,16 @@ sv:
|
|||||||
text_zoom_in: Zooma in
|
text_zoom_in: Zooma in
|
||||||
text_warn_on_leaving_unsaved: Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan.
|
text_warn_on_leaving_unsaved: Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan.
|
||||||
text_scm_path_encoding_note: "Standard: UTF-8"
|
text_scm_path_encoding_note: "Standard: UTF-8"
|
||||||
|
text_git_repository_note: Versionsarkiv är tomt och lokalt (t.ex. /gitrepo, c:\gitrepo)
|
||||||
text_mercurial_repository_note: Lokalt versionsarkiv (t.ex. /hgrepo, c:\hgrepo)
|
text_mercurial_repository_note: Lokalt versionsarkiv (t.ex. /hgrepo, c:\hgrepo)
|
||||||
text_scm_command: Kommando
|
text_scm_command: Kommando
|
||||||
text_scm_command_version: Version
|
text_scm_command_version: Version
|
||||||
text_scm_config: Du kan konfigurera dina scm-kommando i config/configuration.yml. Vänligen starta om applikationen när ändringar gjorts.
|
text_scm_config: Du kan konfigurera dina scm-kommando i config/configuration.yml. Vänligen starta om applikationen när ändringar gjorts.
|
||||||
text_scm_command_not_available: Scm-kommando är inte tillgängligt. Vänligen kontrollera inställningarna i administratörspanelen.
|
text_scm_command_not_available: Scm-kommando är inte tillgängligt. Vänligen kontrollera inställningarna i administratörspanelen.
|
||||||
|
text_issue_conflict_resolution_overwrite: Använd mina ändringar i alla fall (tidigare anteckningar kommer behållas men några ändringar kan bli överskrivna)
|
||||||
|
text_issue_conflict_resolution_add_notes: Lägg till mina anteckningar och kasta mina andra ändringar
|
||||||
|
text_issue_conflict_resolution_cancel: Kasta alla mina ändringar och visa igen %{link}
|
||||||
|
text_account_destroy_confirmation: "Är du säker på att du vill fortsätta?\nDitt konto kommer tas bort permanent, utan möjlighet att återaktivera det."
|
||||||
|
|
||||||
default_role_manager: Projektledare
|
default_role_manager: Projektledare
|
||||||
default_role_developer: Utvecklare
|
default_role_developer: Utvecklare
|
||||||
@@ -1017,52 +1054,26 @@ sv:
|
|||||||
enumeration_doc_categories: Dokumentkategorier
|
enumeration_doc_categories: Dokumentkategorier
|
||||||
enumeration_activities: Aktiviteter (tidsuppföljning)
|
enumeration_activities: Aktiviteter (tidsuppföljning)
|
||||||
enumeration_system_activity: Systemaktivitet
|
enumeration_system_activity: Systemaktivitet
|
||||||
label_diff: diff
|
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
|
||||||
description_query_sort_criteria_direction: Sort direction
|
|
||||||
description_project_scope: Search scope
|
|
||||||
description_filter: Filter
|
description_filter: Filter
|
||||||
description_user_mail_notification: Mail notification settings
|
description_search: Sökfält
|
||||||
description_date_from: Enter start date
|
description_choose_project: Projekt
|
||||||
description_message_content: Message content
|
description_project_scope: Sökomfång
|
||||||
description_available_columns: Available Columns
|
description_notes: Anteckningar
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_message_content: Meddelandeinnehåll
|
||||||
description_issue_category_reassign: Choose issue category
|
description_query_sort_criteria_attribute: Sorteringsattribut
|
||||||
description_search: Searchfield
|
description_query_sort_criteria_direction: Sorteringsriktning
|
||||||
description_notes: Notes
|
description_user_mail_notification: Mailnotifieringsinställningar
|
||||||
description_date_range_list: Choose range from list
|
description_available_columns: Tillgängliga Kolumner
|
||||||
description_choose_project: Projects
|
description_selected_columns: Valda Kolumner
|
||||||
description_date_to: Enter end date
|
description_all_columns: Alla kolumner
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_issue_category_reassign: Välj ärendekategori
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Välj ny föräldersida
|
||||||
description_selected_columns: Selected Columns
|
description_date_range_list: Välj intervall från listan
|
||||||
label_parent_revision: Parent
|
description_date_range_interval: Ange intervall genom att välja start- och slutdatum
|
||||||
label_child_revision: Child
|
description_date_from: Ange startdatum
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
description_date_to: Ange slutdatum
|
||||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
error_session_expired: Your session has expired. Please login again.
|
||||||
button_edit_section: Edit this section
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_session_lifetime: Session maximum lifetime
|
||||||
description_all_columns: All Columns
|
setting_session_timeout: Session inactivity timeout
|
||||||
button_export: Export
|
label_session_expiration: Session expiration
|
||||||
label_export_options: "%{export_format} export options"
|
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
|
||||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
|
||||||
label_x_issues:
|
|
||||||
zero: 0 Ärende
|
|
||||||
one: 1 Ärende
|
|
||||||
other: "%{count} Ärenden"
|
|
||||||
label_repository_new: New repository
|
|
||||||
field_repository_is_default: Main repository
|
|
||||||
label_copy_attachments: Copy attachments
|
|
||||||
label_item_position: "%{position}/%{count}"
|
|
||||||
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.
|
|
||||||
field_multiple: Multiple values
|
|
||||||
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_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
|
||||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
|
||||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
|
||||||
permission_manage_related_issues: Manage related issues
|
|
||||||
field_ldap_filter: LDAP filter
|
|
||||||
label_search_for_watchers: Search for watchers to add
|
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1022,3 +1025,14 @@ th:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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'
|
||||||
@@ -1044,3 +1047,14 @@ tr:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -1022,3 +1025,12 @@ uk:
|
|||||||
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: "Ваш обліковій запис повністю видалений"
|
||||||
|
setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи"
|
||||||
|
button_delete_my_account: "Видалити мій обліковий запис"
|
||||||
|
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"
|
||||||
@@ -1076,3 +1079,14 @@ vi:
|
|||||||
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.
|
||||||
|
setting_unsubscribe: Allow users to delete their own account
|
||||||
|
button_delete_my_account: Delete my account
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
Are you sure you want to proceed?
|
||||||
|
Your account will be permanently deleted, with no way to reactivate it.
|
||||||
|
error_session_expired: Your session has expired. Please login again.
|
||||||
|
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||||
|
setting_session_lifetime: Session maximum lifetime
|
||||||
|
setting_session_timeout: Session inactivity timeout
|
||||||
|
label_session_expiration: Session expiration
|
||||||
|
|||||||
@@ -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} 天"
|
||||||
@@ -255,6 +258,7 @@
|
|||||||
notice_gantt_chart_truncated: "由於項目數量超過可顯示數量的最大值 (%{max}),故此甘特圖尾部已被截斷"
|
notice_gantt_chart_truncated: "由於項目數量超過可顯示數量的最大值 (%{max}),故此甘特圖尾部已被截斷"
|
||||||
notice_issue_successful_create: "問題 %{id} 已建立。"
|
notice_issue_successful_create: "問題 %{id} 已建立。"
|
||||||
notice_issue_update_conflict: "當您正在編輯這個問題的時候,它已經被其他人搶先一步更新過。"
|
notice_issue_update_conflict: "當您正在編輯這個問題的時候,它已經被其他人搶先一步更新過。"
|
||||||
|
notice_account_deleted: "您的帳戶已被永久刪除。"
|
||||||
|
|
||||||
error_can_t_load_default_data: "無法載入預設組態: %{value}"
|
error_can_t_load_default_data: "無法載入預設組態: %{value}"
|
||||||
error_scm_not_found: "在儲存機制中找不到這個項目或修訂版。"
|
error_scm_not_found: "在儲存機制中找不到這個項目或修訂版。"
|
||||||
@@ -275,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 網站密碼
|
||||||
@@ -465,6 +470,9 @@
|
|||||||
setting_issue_group_assignment: 允許問題被指派至群組
|
setting_issue_group_assignment: 允許問題被指派至群組
|
||||||
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_session_lifetime: 工作階段存留時間最大值
|
||||||
|
setting_session_timeout: 工作階段無活動逾時時間
|
||||||
|
|
||||||
permission_add_project: 建立專案
|
permission_add_project: 建立專案
|
||||||
permission_add_subprojects: 建立子專案
|
permission_add_subprojects: 建立子專案
|
||||||
@@ -926,6 +934,8 @@
|
|||||||
label_copy_attachments: 複製附件
|
label_copy_attachments: 複製附件
|
||||||
label_item_position: "%{position} / %{count}"
|
label_item_position: "%{position} / %{count}"
|
||||||
label_completed_versions: 已完成版本
|
label_completed_versions: 已完成版本
|
||||||
|
label_search_for_watchers: 搜尋可供加入的監看者
|
||||||
|
label_session_expiration: 工作階段逾期
|
||||||
|
|
||||||
button_login: 登入
|
button_login: 登入
|
||||||
button_submit: 送出
|
button_submit: 送出
|
||||||
@@ -975,6 +985,7 @@
|
|||||||
button_show: 顯示
|
button_show: 顯示
|
||||||
button_edit_section: 編輯此區塊
|
button_edit_section: 編輯此區塊
|
||||||
button_export: 匯出
|
button_export: 匯出
|
||||||
|
button_delete_my_account: 刪除我的帳戶
|
||||||
|
|
||||||
status_active: 活動中
|
status_active: 活動中
|
||||||
status_registered: 註冊完成
|
status_registered: 註冊完成
|
||||||
@@ -1059,6 +1070,10 @@
|
|||||||
text_issue_conflict_resolution_overwrite: "直接套用我的變更 (先前的筆記將會被保留,但是某些變更可能會被複寫)"
|
text_issue_conflict_resolution_overwrite: "直接套用我的變更 (先前的筆記將會被保留,但是某些變更可能會被複寫)"
|
||||||
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: |-
|
||||||
|
您確定要繼續這個動作嗎?
|
||||||
|
您的帳戶將會被永久刪除,且無法被重新啟用。
|
||||||
|
text_session_expiration_settings: "警告:變更這些設定將會導致包含您在內的所有工作階段過期。"
|
||||||
|
|
||||||
default_role_manager: 管理人員
|
default_role_manager: 管理人員
|
||||||
default_role_developer: 開發人員
|
default_role_developer: 開發人員
|
||||||
@@ -1104,4 +1119,3 @@
|
|||||||
description_date_range_interval: 選擇起始與結束日期以設定範圍區間
|
description_date_range_interval: 選擇起始與結束日期以設定範圍區間
|
||||||
description_date_from: 輸入起始日期
|
description_date_from: 輸入起始日期
|
||||||
description_date_to: 輸入結束日期
|
description_date_to: 輸入結束日期
|
||||||
label_search_for_watchers: Search for watchers to add
|
|
||||||
|
|||||||
+35
-21
@@ -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} 天"
|
||||||
@@ -1001,29 +1004,40 @@ zh:
|
|||||||
label_child_revision: 子修订
|
label_child_revision: 子修订
|
||||||
error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。
|
error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。
|
||||||
setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期
|
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: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{ids}。"
|
||||||
label_x_issues:
|
label_x_issues:
|
||||||
zero: 0 问题
|
zero: 0 问题
|
||||||
one: 1 问题
|
one: 1 问题
|
||||||
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: 您的账号已被永久删除(账号已无法恢复)。
|
||||||
|
setting_unsubscribe: 允许用户退订
|
||||||
|
button_delete_my_account: 删除我的账号
|
||||||
|
text_account_destroy_confirmation: |-
|
||||||
|
确定继续处理?
|
||||||
|
您的账号一旦删除,将无法再次激活使用。
|
||||||
|
error_session_expired: 您的会话已过期。请重新登陆。
|
||||||
|
text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。"
|
||||||
|
setting_session_lifetime: 会话最大有效时间
|
||||||
|
setting_session_timeout: 会话闲置超时
|
||||||
|
label_session_expiration: 会话过期
|
||||||
|
|||||||
+7
-2
@@ -78,6 +78,8 @@ ActionController::Routing::Routes.draw do |map|
|
|||||||
|
|
||||||
map.connect 'my/account', :controller => 'my', :action => 'account',
|
map.connect 'my/account', :controller => 'my', :action => 'account',
|
||||||
:conditions => {:method => [:get, :post]}
|
:conditions => {:method => [:get, :post]}
|
||||||
|
map.connect 'my/account/destroy', :controller => 'my', :action => 'destroy',
|
||||||
|
:conditions => {:method => [:get, :post]}
|
||||||
map.connect 'my/page', :controller => 'my', :action => 'page',
|
map.connect 'my/page', :controller => 'my', :action => 'page',
|
||||||
:conditions => {:method => :get}
|
:conditions => {:method => :get}
|
||||||
# Redirects to my/page
|
# Redirects to my/page
|
||||||
@@ -257,7 +259,8 @@ ActionController::Routing::Routes.draw do |map|
|
|||||||
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/diff.:format',
|
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/diff.:format',
|
||||||
:action => 'diff'
|
:action => 'diff'
|
||||||
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/raw/*path',
|
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/raw/*path',
|
||||||
:action => 'entry', :format => 'raw'
|
:action => 'entry', :format => 'raw',
|
||||||
|
:requirements => { :rev => /[a-z0-9\.\-_]+/ }
|
||||||
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/:action/*path',
|
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/:action/*path',
|
||||||
:requirements => {
|
:requirements => {
|
||||||
:action => /(browse|show|entry|changes|annotate|diff)/,
|
:action => /(browse|show|entry|changes|annotate|diff)/,
|
||||||
@@ -288,7 +291,8 @@ ActionController::Routing::Routes.draw do |map|
|
|||||||
repository_views.connect 'projects/:id/repository/revisions/:rev/diff.:format',
|
repository_views.connect 'projects/:id/repository/revisions/:rev/diff.:format',
|
||||||
:action => 'diff'
|
:action => 'diff'
|
||||||
repository_views.connect 'projects/:id/repository/revisions/:rev/raw/*path',
|
repository_views.connect 'projects/:id/repository/revisions/:rev/raw/*path',
|
||||||
:action => 'entry', :format => 'raw'
|
:action => 'entry', :format => 'raw',
|
||||||
|
:requirements => { :rev => /[a-z0-9\.\-_]+/ }
|
||||||
repository_views.connect 'projects/:id/repository/revisions/:rev/:action/*path',
|
repository_views.connect 'projects/:id/repository/revisions/:rev/:action/*path',
|
||||||
:requirements => {
|
:requirements => {
|
||||||
:action => /(browse|show|entry|changes|annotate|diff)/,
|
:action => /(browse|show|entry|changes|annotate|diff)/,
|
||||||
@@ -339,6 +343,7 @@ ActionController::Routing::Routes.draw do |map|
|
|||||||
map.resources :roles, :except => :show, :collection => {:permissions => [:get, :post]}
|
map.resources :roles, :except => :show, :collection => {:permissions => [:get, :post]}
|
||||||
map.resources :enumerations, :except => :show
|
map.resources :enumerations, :except => :show
|
||||||
|
|
||||||
|
map.connect 'projects/:id/search', :controller => 'search', :action => 'index', :conditions => {:method => :get}
|
||||||
map.connect 'search', :controller => 'search', :action => 'index', :conditions => {:method => :get}
|
map.connect 'search', :controller => 'search', :action => 'index', :conditions => {:method => :get}
|
||||||
|
|
||||||
map.connect 'mail_handler', :controller => 'mail_handler',
|
map.connect 'mail_handler', :controller => 'mail_handler',
|
||||||
|
|||||||
@@ -31,9 +31,19 @@ self_registration:
|
|||||||
default: '2'
|
default: '2'
|
||||||
lost_password:
|
lost_password:
|
||||||
default: 1
|
default: 1
|
||||||
|
unsubscribe:
|
||||||
|
default: 1
|
||||||
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
|
||||||
|
|||||||
+105
-6
@@ -4,13 +4,100 @@ 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/
|
||||||
|
|
||||||
== TBD v1.4.0
|
== 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
|
||||||
|
|
||||||
|
* Defect #10744: rake task redmine:email:test broken
|
||||||
|
* Defect #10787: "Allow users to unsubscribe" option is confusing
|
||||||
|
* Defect #10827: Cannot access Repositories page and Settings in a Project - Error 500
|
||||||
|
* Defect #10829: db:migrate fails 0.8.2 -> 1.4.1
|
||||||
|
* Defect #10832: REST Uploads fail with fastcgi
|
||||||
|
* Defect #10837: reposman and rdm-mailhandler not working with ruby 1.9.x
|
||||||
|
* Defect #10856: can not load translations from hr.yml with ruby1.9.3-p194
|
||||||
|
* Defect #10865: Filter reset when deleting locked user
|
||||||
|
* Feature #9790: Allow filtering text custom fields on "is null" and "is not null"
|
||||||
|
* Feature #10778: svn:ignore for config/additional_environment.rb
|
||||||
|
* Feature #10875: Partial Albanian Translations
|
||||||
|
* Feature #10888: Bring back List-Id to help aid Gmail filtering
|
||||||
|
* Patch #10733: Traditional Chinese language file (to r9502)
|
||||||
|
* Patch #10745: Japanese translation update (r9519)
|
||||||
|
* Patch #10750: Swedish Translation for r9522
|
||||||
|
* Patch #10785: Bulgarian translation (jstoolbar)
|
||||||
|
* Patch #10800: Simplified Chinese translation
|
||||||
|
|
||||||
|
== 2012-04-20 v1.4.1
|
||||||
|
|
||||||
|
* Defect #8574: Time report: date range fields not enabled when using the calendar popup
|
||||||
|
* Defect #10642: Nested textile ol/ul lists generate invalid HTML
|
||||||
|
* Defect #10668: RSS key is generated twice when user is not reloaded
|
||||||
|
* Defect #10669: Token.destroy_expired should not delete API tokens
|
||||||
|
* Defect #10675: "Submit and continue" is broken
|
||||||
|
* Defect #10711: User cannot change account details with "Login has already been taken" error
|
||||||
|
* Feature #10664: Unsubscribe Own User Account
|
||||||
|
* Patch #10693: German Translation Update
|
||||||
|
|
||||||
|
== 2012-04-14 v1.4.0
|
||||||
|
|
||||||
* Defect #2719: Increase username length limit from 30 to 60
|
* Defect #2719: Increase username length limit from 30 to 60
|
||||||
* Defect #3087: Revision referring to issues across all projects
|
* Defect #3087: Revision referring to issues across all projects
|
||||||
* Defect #4824: Unable to connect (can't convert Net::LDAP::LdapError into String)
|
* Defect #4824: Unable to connect (can't convert Net::LDAP::LdapError into String)
|
||||||
|
* Defect #5058: reminder mails are not sent when delivery_method is :async_smtp
|
||||||
* Defect #6859: Moving issues to a tracker with different custom fields should let fill these fields
|
* Defect #6859: Moving issues to a tracker with different custom fields should let fill these fields
|
||||||
* Defect #7398: Error when trying to quick create a version with required custom field
|
* Defect #7398: Error when trying to quick create a version with required custom field
|
||||||
|
* Defect #7495: Python multiline comments highlighting problem in Repository browser
|
||||||
* Defect #7826: bigdecimal-segfault-fix.rb must be removed for Oracle
|
* Defect #7826: bigdecimal-segfault-fix.rb must be removed for Oracle
|
||||||
* Defect #7920: Attempted to update a stale object when copying a project
|
* Defect #7920: Attempted to update a stale object when copying a project
|
||||||
* Defect #8857: Git: Too long in fetching repositories after upgrade from 1.1 or new branch at first time
|
* Defect #8857: Git: Too long in fetching repositories after upgrade from 1.1 or new branch at first time
|
||||||
@@ -20,6 +107,7 @@ http://www.redmine.org/
|
|||||||
* Defect #9978: Japanese "permission_add_issue_watchers" is wrong
|
* Defect #9978: Japanese "permission_add_issue_watchers" is wrong
|
||||||
* Defect #10006: Email reminders are sent for closed issues
|
* Defect #10006: Email reminders are sent for closed issues
|
||||||
* Defect #10150: CSV export and spent time: rounding issue
|
* Defect #10150: CSV export and spent time: rounding issue
|
||||||
|
* Defect #10168: CSV export breaks custom columns
|
||||||
* Defect #10181: Issue context menu and bulk edit form show irrelevant statuses
|
* Defect #10181: Issue context menu and bulk edit form show irrelevant statuses
|
||||||
* Defect #10198: message_id regex in pop3.rb only recognizes Message-ID header (not Message-Id)
|
* Defect #10198: message_id regex in pop3.rb only recognizes Message-ID header (not Message-Id)
|
||||||
* Defect #10251: Description diff link in note details is relative when received by email
|
* Defect #10251: Description diff link in note details is relative when received by email
|
||||||
@@ -29,14 +117,12 @@ http://www.redmine.org/
|
|||||||
* Defect #10410: [Localization] Grammar issue of Simplified Chinese in zh.yml
|
* Defect #10410: [Localization] Grammar issue of Simplified Chinese in zh.yml
|
||||||
* Defect #10442: Ruby 1.9.3 Time Zone setting Internal error.
|
* Defect #10442: Ruby 1.9.3 Time Zone setting Internal error.
|
||||||
* Defect #10467: Confusing behavior while moving issue to a project with disabled Issues module
|
* Defect #10467: Confusing behavior while moving issue to a project with disabled Issues module
|
||||||
* Defect #10505: Error when exporting to PDF with NoMethodError (undefined method `downcase' for nil:NilClass)
|
|
||||||
* Defect #10554: Defect symbols when exporting tasks in pdf
|
|
||||||
* Defect #10575: Uploading of attachments which filename contains non-ASCII chars fails with Ruby 1.9
|
* Defect #10575: Uploading of attachments which filename contains non-ASCII chars fails with Ruby 1.9
|
||||||
* Defect #10590: WikiContent::Version#text return string with #<Encoding:ASCII-8BIT> when uncompressed
|
* Defect #10590: WikiContent::Version#text return string with #<Encoding:ASCII-8BIT> when uncompressed
|
||||||
* Defect #10591: Dutch "label_file_added" translation is wrong
|
|
||||||
* Defect #10593: Error: 'incompatible character encodings: UTF-8 and ASCII-8BIT' (old annoing issue) on ruby-1.9.3
|
* Defect #10593: Error: 'incompatible character encodings: UTF-8 and ASCII-8BIT' (old annoing issue) on ruby-1.9.3
|
||||||
* Defect #10600: Watchers search generates an Internal error
|
* Defect #10600: Watchers search generates an Internal error
|
||||||
* Defect #10602: Attachment link has get parameter :class
|
* Defect #10605: Bulk edit selected issues does not allow selection of blank values for custom fields
|
||||||
|
* Defect #10619: When changing status before tracker, it shows improper status
|
||||||
* Feature #779: Multiple SCM per project
|
* Feature #779: Multiple SCM per project
|
||||||
* Feature #971: Add "Spent time" column to query
|
* Feature #971: Add "Spent time" column to query
|
||||||
* Feature #1060: Add a LDAP-filter using external auth sources
|
* Feature #1060: Add a LDAP-filter using external auth sources
|
||||||
@@ -63,6 +149,7 @@ http://www.redmine.org/
|
|||||||
* Feature #6296: Bulk-edit custom fields through context menu
|
* Feature #6296: Bulk-edit custom fields through context menu
|
||||||
* Feature #6386: Issue mail should render the HTML version of the issue details
|
* Feature #6386: Issue mail should render the HTML version of the issue details
|
||||||
* Feature #6449: Edit a wiki page's parent on the edit page
|
* Feature #6449: Edit a wiki page's parent on the edit page
|
||||||
|
* Feature #6555: Double-click on "Submit" and "Save" buttons should not send two requests to server
|
||||||
* Feature #7361: Highlight active query in the side bar
|
* Feature #7361: Highlight active query in the side bar
|
||||||
* Feature #7420: Rest API for projects members
|
* Feature #7420: Rest API for projects members
|
||||||
* Feature #7603: Please make editing issues more obvious than "Change properties (More)"
|
* Feature #7603: Please make editing issues more obvious than "Change properties (More)"
|
||||||
@@ -74,20 +161,32 @@ http://www.redmine.org/
|
|||||||
* Feature #9995: Time entries insertion, "Create and continue" button
|
* Feature #9995: Time entries insertion, "Create and continue" button
|
||||||
* Feature #10020: Enable global time logging at /time_entries/new
|
* Feature #10020: Enable global time logging at /time_entries/new
|
||||||
* Feature #10042: Bulk change private flag
|
* Feature #10042: Bulk change private flag
|
||||||
* Feature #10046: Update installation doc on release
|
|
||||||
* Feature #10126: Add members of subprojects in the assignee and author filters
|
* Feature #10126: Add members of subprojects in the assignee and author filters
|
||||||
* Feature #10131: Include custom fiels in time entries API responses
|
* Feature #10131: Include custom fiels in time entries API responses
|
||||||
* Feature #10207: Git: use default branch from HEAD
|
* Feature #10207: Git: use default branch from HEAD
|
||||||
* Feature #10208: Estonian translation
|
* Feature #10208: Estonian translation
|
||||||
* Feature #10253: Better handling of attachments when validation fails
|
* Feature #10253: Better handling of attachments when validation fails
|
||||||
* Feature #10350: Bulk copy should allow for changing the target version
|
* Feature #10350: Bulk copy should allow for changing the target version
|
||||||
|
* Feature #10607: Ignore out-of-office incoming emails
|
||||||
|
* Feature #10635: Adding time like "123 Min" is invalid
|
||||||
* Patch #9998: Make attachement "Optional Description" less wide
|
* Patch #9998: Make attachement "Optional Description" less wide
|
||||||
* Patch #10066: i18n not working with russian gem
|
* Patch #10066: i18n not working with russian gem
|
||||||
|
* Patch #10128: Disable IE 8 compatibility mode to fix wrong div.autoscroll scroll bar behaviour
|
||||||
* Patch #10155: Russian translation changed
|
* Patch #10155: Russian translation changed
|
||||||
* Patch #10464: Enhanced PDF output for Issues list
|
* Patch #10464: Enhanced PDF output for Issues list
|
||||||
* Patch #10470: Efficiently process new git revisions in a single batch
|
* Patch #10470: Efficiently process new git revisions in a single batch
|
||||||
* Patch #10513: Dutch translation improvement
|
* Patch #10513: Dutch translation improvement
|
||||||
|
|
||||||
|
== 2012-04-14 v1.3.3
|
||||||
|
|
||||||
|
* Defect #10505: Error when exporting to PDF with NoMethodError (undefined method `downcase' for nil:NilClass)
|
||||||
|
* Defect #10554: Defect symbols when exporting tasks in pdf
|
||||||
|
* Defect #10564: Unable to change locked, sticky flags and board when editing a message
|
||||||
|
* Defect #10591: Dutch "label_file_added" translation is wrong
|
||||||
|
* Defect #10622: "Default administrator account changed" is always true
|
||||||
|
* Patch #10555: rake redmine:send_reminders aborted if issue assigned to group
|
||||||
|
* Patch #10611: Simplified Chinese translations for 1.3-stable
|
||||||
|
|
||||||
== 2012-03-11 v1.3.2
|
== 2012-03-11 v1.3.2
|
||||||
|
|
||||||
* Defect #8194: {{toc}} uses identical anchors for subsections with the same name
|
* Defect #8194: {{toc}} uses identical anchors for subsections with the same name
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ Optional:
|
|||||||
of the rmagick gem using:
|
of the rmagick gem using:
|
||||||
bundle install --without development test rmagick
|
bundle install --without development test rmagick
|
||||||
|
|
||||||
|
If you need to load some gems that are not required by Redmine core (eg. fcgi),
|
||||||
|
you can create a file named Gemfile.local at the root of your redmine directory.
|
||||||
|
It will be loaded automatically when running `bundle install`.
|
||||||
|
|
||||||
3. Create an empty utf8 encoded database: "redmine" for example
|
3. Create an empty utf8 encoded database: "redmine" for example
|
||||||
|
|
||||||
4. Configure the database parameters in config/database.yml
|
4. Configure the database parameters in config/database.yml
|
||||||
|
|||||||
@@ -1,64 +1,9 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
# == Synopsis
|
|
||||||
#
|
|
||||||
# Reads an email from standard input and forward it to a Redmine server
|
|
||||||
# through a HTTP request.
|
|
||||||
#
|
|
||||||
# == Usage
|
|
||||||
#
|
|
||||||
# rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
|
|
||||||
#
|
|
||||||
# == Arguments
|
|
||||||
#
|
|
||||||
# -u, --url URL of the Redmine server
|
|
||||||
# -k, --key Redmine API key
|
|
||||||
#
|
|
||||||
# General options:
|
|
||||||
# --unknown-user=ACTION how to handle emails from an unknown user
|
|
||||||
# ACTION can be one of the following values:
|
|
||||||
# ignore: email is ignored (default)
|
|
||||||
# accept: accept as anonymous user
|
|
||||||
# create: create a user account
|
|
||||||
# --no-permission-check disable permission checking when receiving
|
|
||||||
# the email
|
|
||||||
# --key-file=PATH path to a file that contains the Redmine
|
|
||||||
# API key (use this option instead of --key
|
|
||||||
# if you don't the key to appear in the
|
|
||||||
# command line)
|
|
||||||
# --no-check-certificate do not check server certificate
|
|
||||||
# -h, --help show this help
|
|
||||||
# -v, --verbose show extra information
|
|
||||||
# -V, --version show version information and exit
|
|
||||||
#
|
|
||||||
# Issue attributes control options:
|
|
||||||
# -p, --project=PROJECT identifier of the target project
|
|
||||||
# -s, --status=STATUS name of the target status
|
|
||||||
# -t, --tracker=TRACKER name of the target tracker
|
|
||||||
# --category=CATEGORY name of the target category
|
|
||||||
# --priority=PRIORITY name of the target priority
|
|
||||||
# -o, --allow-override=ATTRS allow email content to override attributes
|
|
||||||
# specified by previous options
|
|
||||||
# ATTRS is a comma separated list of attributes
|
|
||||||
#
|
|
||||||
# == Examples
|
|
||||||
# No project specified. Emails MUST contain the 'Project' keyword:
|
|
||||||
#
|
|
||||||
# rdm-mailhandler --url http://redmine.domain.foo --key secret
|
|
||||||
#
|
|
||||||
# Fixed project and default tracker specified, but emails can override
|
|
||||||
# both tracker and priority attributes using keywords:
|
|
||||||
#
|
|
||||||
# rdm-mailhandler --url https://domain.foo/redmine --key secret \\
|
|
||||||
# --project foo \\
|
|
||||||
# --tracker bug \\
|
|
||||||
# --allow-override tracker,priority
|
|
||||||
|
|
||||||
require 'net/http'
|
require 'net/http'
|
||||||
require 'net/https'
|
require 'net/https'
|
||||||
require 'uri'
|
require 'uri'
|
||||||
require 'getoptlong'
|
require 'optparse'
|
||||||
require 'rdoc/usage'
|
|
||||||
|
|
||||||
module Net
|
module Net
|
||||||
class HTTPS < HTTP
|
class HTTPS < HTTP
|
||||||
@@ -78,64 +23,68 @@ module Net
|
|||||||
end
|
end
|
||||||
|
|
||||||
class RedmineMailHandler
|
class RedmineMailHandler
|
||||||
VERSION = '0.1'
|
VERSION = '0.2'
|
||||||
|
|
||||||
attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
|
attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
self.issue_attributes = {}
|
self.issue_attributes = {}
|
||||||
|
|
||||||
opts = GetoptLong.new(
|
optparse = OptionParser.new do |opts|
|
||||||
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
opts.banner = "Usage: rdm-mailhandler.rb [options] --url=<Redmine URL> --key=<API key>"
|
||||||
[ '--version', '-V', GetoptLong::NO_ARGUMENT ],
|
opts.separator("")
|
||||||
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
|
opts.separator("Reads an email from standard input and forward it to a Redmine server through a HTTP request.")
|
||||||
[ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
|
opts.separator("")
|
||||||
[ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
|
opts.separator("Required arguments:")
|
||||||
[ '--key-file', GetoptLong::REQUIRED_ARGUMENT],
|
opts.on("-u", "--url URL", "URL of the Redmine server") {|v| self.url = v}
|
||||||
[ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
|
opts.on("-k", "--key KEY", "Redmine API key") {|v| self.key = v}
|
||||||
[ '--status', '-s', GetoptLong::REQUIRED_ARGUMENT ],
|
opts.separator("")
|
||||||
[ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
|
opts.separator("General options:")
|
||||||
[ '--category', GetoptLong::REQUIRED_ARGUMENT],
|
opts.on("--unknown-user ACTION", "how to handle emails from an unknown user",
|
||||||
[ '--priority', GetoptLong::REQUIRED_ARGUMENT],
|
"ACTION can be one of the following values:",
|
||||||
[ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
|
"* ignore: email is ignored (default)",
|
||||||
[ '--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
|
"* accept: accept as anonymous user",
|
||||||
[ '--no-permission-check', GetoptLong::NO_ARGUMENT],
|
"* create: create a user account") {|v| self.unknown_user = v}
|
||||||
[ '--no-check-certificate', GetoptLong::NO_ARGUMENT]
|
opts.on("--no-permission-check", "disable permission checking when receiving",
|
||||||
)
|
"the email") {self.no_permission_check = '1'}
|
||||||
|
opts.on("--key-file FILE", "path to a file that contains the Redmine",
|
||||||
|
"API key (use this option instead of --key",
|
||||||
|
"if you don't the key to appear in the",
|
||||||
|
"command line)") {|v| read_key_from_file(v)}
|
||||||
|
opts.on("--no-check-certificate", "do not check server certificate") {self.no_check_certificate = true}
|
||||||
|
opts.on("-h", "--help", "show this help") {puts opts; exit 1}
|
||||||
|
opts.on("-v", "--verbose", "show extra information") {self.verbose = true}
|
||||||
|
opts.on("-V", "--version", "show version information and exit") {puts VERSION; exit}
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Issue attributes control options:")
|
||||||
|
opts.on("-p", "--project PROJECT", "identifier of the target project") {|v| self.issue_attributes['project'] = v}
|
||||||
|
opts.on("-s", "--status STATUS", "name of the target status") {|v| self.issue_attributes['status'] = v}
|
||||||
|
opts.on("-t", "--tracker TRACKER", "name of the target tracker") {|v| self.issue_attributes['tracker'] = v}
|
||||||
|
opts.on( "--category CATEGORY", "name of the target category") {|v| self.issue_attributes['category'] = v}
|
||||||
|
opts.on( "--priority PRIORITY", "name of the target priority") {|v| self.issue_attributes['priority'] = v}
|
||||||
|
opts.on("-o", "--allow-override ATTRS", "allow email content to override attributes",
|
||||||
|
"specified by previous options",
|
||||||
|
"ATTRS is a comma separated list of attributes") {|v| self.allow_override = v}
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Examples:")
|
||||||
|
opts.separator("No project specified. Emails MUST contain the 'Project' keyword:")
|
||||||
|
opts.separator(" rdm-mailhandler.rb --url http://redmine.domain.foo --key secret")
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Fixed project and default tracker specified, but emails can override")
|
||||||
|
opts.separator("both tracker and priority attributes using keywords:")
|
||||||
|
opts.separator(" rdm-mailhandler.rb --url https://domain.foo/redmine --key secret \\")
|
||||||
|
opts.separator(" --project foo \\")
|
||||||
|
opts.separator(" --tracker bug \\")
|
||||||
|
opts.separator(" --allow-override tracker,priority")
|
||||||
|
|
||||||
opts.each do |opt, arg|
|
opts.summary_width = 27
|
||||||
case opt
|
|
||||||
when '--url'
|
|
||||||
self.url = arg.dup
|
|
||||||
when '--key'
|
|
||||||
self.key = arg.dup
|
|
||||||
when '--key-file'
|
|
||||||
begin
|
|
||||||
self.key = File.read(arg).strip
|
|
||||||
rescue Exception => e
|
|
||||||
$stderr.puts "Unable to read the key from #{arg}: #{e.message}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
when '--help'
|
|
||||||
usage
|
|
||||||
when '--verbose'
|
|
||||||
self.verbose = true
|
|
||||||
when '--version'
|
|
||||||
puts VERSION; exit
|
|
||||||
when '--project', '--status', '--tracker', '--category', '--priority'
|
|
||||||
self.issue_attributes[opt.gsub(%r{^\-\-}, '')] = arg.dup
|
|
||||||
when '--allow-override'
|
|
||||||
self.allow_override = arg.dup
|
|
||||||
when '--unknown-user'
|
|
||||||
self.unknown_user = arg.dup
|
|
||||||
when '--no-permission-check'
|
|
||||||
self.no_permission_check = '1'
|
|
||||||
when '--no-check-certificate'
|
|
||||||
self.no_check_certificate = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
optparse.parse!
|
||||||
|
|
||||||
RDoc.usage if url.nil?
|
unless url && key
|
||||||
|
puts "Some arguments are missing. Use `rdm-mailhandler.rb --help` for getting help."
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def submit(email)
|
def submit(email)
|
||||||
@@ -181,6 +130,15 @@ class RedmineMailHandler
|
|||||||
def debug(msg)
|
def debug(msg)
|
||||||
puts msg if verbose
|
puts msg if verbose
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def read_key_from_file(filename)
|
||||||
|
begin
|
||||||
|
self.key = File.read(filename).strip
|
||||||
|
rescue Exception => e
|
||||||
|
$stderr.puts "Unable to read the key from #{filename}:\n#{e.message}"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
handler = RedmineMailHandler.new
|
handler = RedmineMailHandler.new
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
+80
-114
@@ -1,96 +1,13 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
# == Synopsis
|
require 'optparse'
|
||||||
#
|
|
||||||
# reposman: manages your repositories with Redmine
|
|
||||||
#
|
|
||||||
# == Usage
|
|
||||||
#
|
|
||||||
# reposman [OPTIONS...] -s [DIR] -r [HOST]
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# reposman --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion
|
|
||||||
# reposman -s /var/git -r redmine.example.net -u http://svn.example.net --scm git
|
|
||||||
#
|
|
||||||
# == Arguments (mandatory)
|
|
||||||
#
|
|
||||||
# -s, --svn-dir=DIR use DIR as base directory for svn repositories
|
|
||||||
# -r, --redmine-host=HOST assume Redmine is hosted on HOST. Examples:
|
|
||||||
# -r redmine.example.net
|
|
||||||
# -r http://redmine.example.net
|
|
||||||
# -r https://example.net/redmine
|
|
||||||
# -k, --key=KEY use KEY as the Redmine API key (you can use the
|
|
||||||
# --key-file option as an alternative)
|
|
||||||
#
|
|
||||||
# == Options
|
|
||||||
#
|
|
||||||
# -o, --owner=OWNER owner of the repository. using the rails login
|
|
||||||
# allow user to browse the repository within
|
|
||||||
# Redmine even for private project. If you want to
|
|
||||||
# share repositories through Redmine.pm, you need
|
|
||||||
# to use the apache owner.
|
|
||||||
# -g, --group=GROUP group of the repository. (default: root)
|
|
||||||
# --scm=SCM the kind of SCM repository you want to create (and
|
|
||||||
# register) in Redmine (default: Subversion).
|
|
||||||
# reposman is able to create Git and Subversion
|
|
||||||
# repositories. For all other kind, you must specify
|
|
||||||
# a --command option
|
|
||||||
# -u, --url=URL the base url Redmine will use to access your
|
|
||||||
# repositories. This option is used to automatically
|
|
||||||
# register the repositories in Redmine. The project
|
|
||||||
# identifier will be appended to this url. Examples:
|
|
||||||
# -u https://example.net/svn
|
|
||||||
# -u file:///var/svn/
|
|
||||||
# if this option isn't set, reposman won't register
|
|
||||||
# the repositories in Redmine
|
|
||||||
# -c, --command=COMMAND use this command instead of "svnadmin create" to
|
|
||||||
# create a repository. This option can be used to
|
|
||||||
# create repositories other than subversion and git
|
|
||||||
# kind.
|
|
||||||
# This command override the default creation for git
|
|
||||||
# and subversion.
|
|
||||||
# -f, --force force repository creation even if the project
|
|
||||||
# repository is already declared in Redmine
|
|
||||||
# --key-file=PATH path to a file that contains the Redmine API key
|
|
||||||
# (use this option instead of --key if you don't
|
|
||||||
# the key to appear in the command line)
|
|
||||||
# -t, --test only show what should be done
|
|
||||||
# -h, --help show help and exit
|
|
||||||
# -v, --verbose verbose
|
|
||||||
# -V, --version print version and exit
|
|
||||||
# -q, --quiet no log
|
|
||||||
#
|
|
||||||
# == References
|
|
||||||
#
|
|
||||||
# You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos
|
|
||||||
|
|
||||||
|
|
||||||
require 'getoptlong'
|
|
||||||
require 'rdoc/usage'
|
|
||||||
require 'find'
|
require 'find'
|
||||||
require 'etc'
|
require 'etc'
|
||||||
|
require 'rubygems'
|
||||||
|
|
||||||
Version = "1.3"
|
Version = "1.4"
|
||||||
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
|
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
|
||||||
|
|
||||||
opts = GetoptLong.new(
|
|
||||||
['--svn-dir', '-s', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--redmine-host', '-r', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--key-file', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--owner', '-o', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--group', '-g', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--url', '-u', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--command' , '-c', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--scm', GetoptLong::REQUIRED_ARGUMENT],
|
|
||||||
['--test', '-t', GetoptLong::NO_ARGUMENT],
|
|
||||||
['--force', '-f', GetoptLong::NO_ARGUMENT],
|
|
||||||
['--verbose', '-v', GetoptLong::NO_ARGUMENT],
|
|
||||||
['--version', '-V', GetoptLong::NO_ARGUMENT],
|
|
||||||
['--help' , '-h', GetoptLong::NO_ARGUMENT],
|
|
||||||
['--quiet' , '-q', GetoptLong::NO_ARGUMENT]
|
|
||||||
)
|
|
||||||
|
|
||||||
$verbose = 0
|
$verbose = 0
|
||||||
$quiet = false
|
$quiet = false
|
||||||
$redmine_host = ''
|
$redmine_host = ''
|
||||||
@@ -133,36 +50,84 @@ module SCM
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
begin
|
def read_key_from_file(filename)
|
||||||
opts.each do |opt, arg|
|
begin
|
||||||
case opt
|
$api_key = File.read(filename).strip
|
||||||
when '--svn-dir'; $repos_base = arg.dup
|
rescue Exception => e
|
||||||
when '--redmine-host'; $redmine_host = arg.dup
|
$stderr.puts "Unable to read the key from #{filename}: #{e.message}"
|
||||||
when '--key'; $api_key = arg.dup
|
exit 1
|
||||||
when '--key-file'
|
|
||||||
begin
|
|
||||||
$api_key = File.read(arg).strip
|
|
||||||
rescue Exception => e
|
|
||||||
$stderr.puts "Unable to read the key from #{arg}: #{e.message}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
|
|
||||||
when '--group'; $svn_group = arg.dup; $use_groupid = false;
|
|
||||||
when '--url'; $svn_url = arg.dup
|
|
||||||
when '--scm'; $scm = arg.dup.capitalize; log("Invalid SCM: #{$scm}", :exit => true) unless SUPPORTED_SCM.include?($scm)
|
|
||||||
when '--command'; $command = arg.dup
|
|
||||||
when '--verbose'; $verbose += 1
|
|
||||||
when '--test'; $test = true
|
|
||||||
when '--force'; $force = true
|
|
||||||
when '--version'; puts Version; exit
|
|
||||||
when '--help'; RDoc::usage
|
|
||||||
when '--quiet'; $quiet = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
rescue
|
|
||||||
exit 1
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_scm(scm)
|
||||||
|
$scm = scm.capitalize
|
||||||
|
unless SUPPORTED_SCM.include?($scm)
|
||||||
|
log("Invalid SCM: #{$scm}\nValid SCM are: #{SUPPORTED_SCM.join(', ')}", :exit => true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
optparse = OptionParser.new do |opts|
|
||||||
|
opts.banner = "Usage: reposman.rb [OPTIONS...] -s [DIR] -r [HOST] -k [KEY]"
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Manages your repositories with Redmine.")
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Required arguments:")
|
||||||
|
opts.on("-s", "--svn-dir DIR", "use DIR as base directory for svn repositories") {|v| $repos_base = v}
|
||||||
|
opts.on("-r", "--redmine-host HOST","assume Redmine is hosted on HOST. Examples:",
|
||||||
|
" -r redmine.example.net",
|
||||||
|
" -r http://redmine.example.net",
|
||||||
|
" -r https://redmine.example.net") {|v| $redmine_host = v}
|
||||||
|
opts.on("-k", "--key KEY", "use KEY as the Redmine API key",
|
||||||
|
"(you can use --key-file option as an alternative)") {|v| $api_key = v}
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Options:")
|
||||||
|
opts.on("-o", "--owner OWNER", "owner of the repository. using the rails login",
|
||||||
|
"allows users to browse the repository within",
|
||||||
|
"Redmine even for private projects. If you want to",
|
||||||
|
"share repositories through Redmine.pm, you need",
|
||||||
|
"to use the apache owner.") {|v| $svn_owner = v; $use_groupid = false}
|
||||||
|
opts.on("-g", "--group GROUP", "group of the repository (default: root)") {|v| $svn_group = v; $use_groupid = false}
|
||||||
|
opts.on("-u", "--url URL", "the base url Redmine will use to access your",
|
||||||
|
"repositories. This option is used to register",
|
||||||
|
"the repositories in Redmine automatically. The",
|
||||||
|
"project identifier will be appended to this url.",
|
||||||
|
"Examples:",
|
||||||
|
" -u https://example.net/svn",
|
||||||
|
" -u file:///var/svn/",
|
||||||
|
"if this option isn't set, reposman won't register",
|
||||||
|
"the repositories in Redmine") {|v| $svn_url = v}
|
||||||
|
opts.on( "--scm SCM", "the kind of SCM repository you want to create",
|
||||||
|
"(and register) in Redmine (default: Subversion).",
|
||||||
|
"reposman is able to create Git and Subversion",
|
||||||
|
"repositories.",
|
||||||
|
"For all other kind, you must specify a --command",
|
||||||
|
"option") {|v| set_scm(v)}
|
||||||
|
opts.on("-c", "--command COMMAND", "use this command instead of `svnadmin create` to",
|
||||||
|
"create a repository. This option can be used to",
|
||||||
|
"create repositories other than subversion and git",
|
||||||
|
"kind.",
|
||||||
|
"This command override the default creation for",
|
||||||
|
"git and subversion.") {|v| $command = v}
|
||||||
|
opts.on( "--key-file FILE", "path to a file that contains the Redmine API key",
|
||||||
|
"(use this option instead of --key if you don't",
|
||||||
|
"want the key to appear in the command line)") {|v| read_key_from_file(v)}
|
||||||
|
opts.on("-t", "--test", "only show what should be done") {$test = true}
|
||||||
|
opts.on("-f", "--force", "force repository creation even if the project", "repository is already declared in Redmine") {$force = true}
|
||||||
|
opts.on("-v", "--verbose", "verbose") {$verbose += 1}
|
||||||
|
opts.on("-V", "--version", "show version and exit") {puts Version; exit}
|
||||||
|
opts.on("-h", "--help", "show help and exit") {puts opts; exit 1}
|
||||||
|
opts.on("-q", "--quiet", "no log") {$quiet = true}
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("Examples:")
|
||||||
|
opts.separator(" reposman.rb --svn-dir=/var/svn --redmine-host=redmine.host")
|
||||||
|
opts.separator(" reposman.rb -s /var/git -r redmine.host -u http://git.host --scm git")
|
||||||
|
opts.separator("")
|
||||||
|
opts.separator("You can find more information on the redmine's wiki:\nhttp://www.redmine.org/projects/redmine/wiki/HowTos")
|
||||||
|
|
||||||
|
opts.summary_width = 25
|
||||||
|
end
|
||||||
|
optparse.parse!
|
||||||
|
|
||||||
if $test
|
if $test
|
||||||
log("running in test mode")
|
log("running in test mode")
|
||||||
end
|
end
|
||||||
@@ -179,7 +144,8 @@ end
|
|||||||
$svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
|
$svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
|
||||||
|
|
||||||
if ($redmine_host.empty? or $repos_base.empty?)
|
if ($redmine_host.empty? or $repos_base.empty?)
|
||||||
RDoc::usage
|
puts "Some arguments are missing. Use reposman.rb --help for getting help."
|
||||||
|
exit 1
|
||||||
end
|
end
|
||||||
|
|
||||||
unless File.directory?($repos_base)
|
unless File.directory?($repos_base)
|
||||||
|
|||||||
+1
-1
@@ -585,7 +585,7 @@ class RedCloth3 < String
|
|||||||
last_line = line_id
|
last_line = line_id
|
||||||
end
|
end
|
||||||
if line_id - last_line > 1 or line_id == lines.length - 1
|
if line_id - last_line > 1 or line_id == lines.length - 1
|
||||||
depth.delete_if do |v|
|
while v = depth.pop
|
||||||
lines[last_line] << "</li>\n\t</#{ lT( v ) }l>"
|
lines[last_line] << "</li>\n\t</#{ lT( v ) }l>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ module Redmine #:nodoc:
|
|||||||
# 2:30 => 2.5
|
# 2:30 => 2.5
|
||||||
s.gsub!(%r{^(\d+):(\d+)$}) { $1.to_i + $2.to_i / 60.0 }
|
s.gsub!(%r{^(\d+):(\d+)$}) { $1.to_i + $2.to_i / 60.0 }
|
||||||
# 2h30, 2h, 30m => 2.5, 2, 0.5
|
# 2h30, 2h, 30m => 2.5, 2, 0.5
|
||||||
s.gsub!(%r{^((\d+)\s*(h|hours?))?\s*((\d+)\s*(m|min)?)?$}) { |m| ($1 || $4) ? ($2.to_i + $5.to_i / 60.0) : m[0] }
|
s.gsub!(%r{^((\d+)\s*(h|hours?))?\s*((\d+)\s*(m|min)?)?$}i) { |m| ($1 || $4) ? ($2.to_i + $5.to_i / 60.0) : m[0] }
|
||||||
end
|
end
|
||||||
# 2,5 => 2.5
|
# 2,5 => 2.5
|
||||||
s.gsub!(',', '.')
|
s.gsub!(',', '.')
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user