Compare commits

..
1 Commits
Author SHA1 Message Date
Jean-Philippe Lang 797f777900 tagged version 1.4.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.4.1@9461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-04-20 10:00:58 +00:00
132 changed files with 606 additions and 2923 deletions
-1
View File
@@ -18,7 +18,6 @@
/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
View File
@@ -20,7 +20,6 @@ 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 -3
View File
@@ -71,10 +71,8 @@ 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", "0.12.3" gem "mocha"
end end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
+19 -49
View File
@@ -31,6 +31,17 @@ 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
@@ -56,7 +67,7 @@ class ApplicationController < ActionController::Base
end end
end end
before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization before_filter :user_setup, :check_if_login_required, :set_localization
filter_parameter_logging :password filter_parameter_logging :password
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
@@ -70,38 +81,6 @@ 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
@@ -115,7 +94,10 @@ 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 user = try_to_autologin elsif cookies[:autologin] && Setting.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
@@ -133,24 +115,12 @@ 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
start_user_session(user) session[:user_id] = user.id
else else
User.current = User.anonymous User.current = User.anonymous
end end
@@ -499,9 +469,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].to_s params[:key]
elsif request.headers["X-Redmine-API-Key"].present? elsif request.headers["X-Redmine-API-Key"].present?
request.headers["X-Redmine-API-Key"].to_s request.headers["X-Redmine-API-Key"]
end end
end end
+1 -1
View File
@@ -67,7 +67,7 @@ class AttachmentsController < ApplicationController
return return
end end
@attachment = Attachment.new(:file => request.raw_post) @attachment = Attachment.new(:file => request.body)
@attachment.author = User.current @attachment.author = User.current
@attachment.filename = Redmine::Utils.random_hex(16) @attachment.filename = Redmine::Utils.random_hex(16)
+9 -17
View File
@@ -18,13 +18,12 @@
class TimelogController < ApplicationController class TimelogController < ApplicationController
menu_item :issues menu_item :issues
before_filter :find_project_for_new_time_entry, :only => [:create] before_filter :find_project, :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 => [:index, :report] before_filter :find_optional_project, :only => [:new, :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
@@ -39,7 +38,7 @@ class TimelogController < ApplicationController
def index def index
sort_init 'spent_on', 'desc' sort_init 'spent_on', 'desc'
sort_update 'spent_on' => ['spent_on', "#{TimeEntry.table_name}.created_on"], sort_update 'spent_on' => 'spent_on',
'user' => 'user_id', 'user' => 'user_id',
'activity' => 'activity_id', 'activity' => 'activity_id',
'project' => "#{Project.table_name}.name", 'project' => "#{Project.table_name}.name",
@@ -134,13 +133,9 @@ 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, redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue, :back_url => params[:back_url]
: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', redirect_to :action => 'new', :back_url => params[:back_url]
: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
@@ -263,7 +258,7 @@ private
end end
end end
def find_optional_project_for_new_time_entry def find_project
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
@@ -271,15 +266,12 @@ private
@issue = Issue.find(issue_id) @issue = Issue.find(issue_id)
@project ||= @issue.project @project ||= @issue.project
end end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project_for_new_time_entry
find_optional_project_for_new_time_entry
if @project.nil? if @project.nil?
render_404 render_404
return false
end end
rescue ActiveRecord::RecordNotFound
render_404
end end
def find_optional_project def find_optional_project
+1 -3
View File
@@ -176,11 +176,9 @@ class UsersController < ApplicationController
def destroy def destroy
@user.destroy @user.destroy
respond_to do |format| respond_to do |format|
format.html { redirect_to :back } format.html { redirect_to(users_url) }
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
+1 -3
View File
@@ -799,7 +799,7 @@ module ApplicationHelper
end end
end end
HEADING_RE = /(<h(\d)( [^>]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE) HEADING_RE = /(<h(1|2|3|4)( [^>]+)?>(.+?)<\/h(1|2|3|4)>)/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,8 +870,6 @@ 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
+4 -10
View File
@@ -24,7 +24,6 @@ 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,
@@ -111,15 +110,10 @@ 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|
if @temp_file.respond_to?(:read) buffer = ""
buffer = "" while (buffer = @temp_file.read(8192))
while (buffer = @temp_file.read(8192)) f.write(buffer)
f.write(buffer) md5.update(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
+1 -3
View File
@@ -42,9 +42,7 @@ class Document < ActiveRecord::Base
def initialize(attributes=nil, *args) def initialize(attributes=nil, *args)
super super
if new_record? if new_record?
# Rails3 use this instead self.category ||= DocumentCategory.default
# self.category ||= DocumentCategory.default
self.category_id = DocumentCategory.default.id if self.category_id == 0
end end
end end
-8
View File
@@ -31,12 +31,4 @@ 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
-22
View File
@@ -123,28 +123,6 @@ 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) : []
+6 -9
View File
@@ -44,8 +44,8 @@ class MailHandler < ActionMailer::Base
cattr_accessor :ignored_emails_headers cattr_accessor :ignored_emails_headers
@@ignored_emails_headers = { @@ignored_emails_headers = {
'X-Auto-Response-Suppress' => 'oof', 'X-Auto-Response-Suppress' => 'OOF',
'Auto-Submitted' => /^auto-/ 'Auto-Submitted' => 'auto-replied'
} }
# Processes incoming emails # Processes incoming emails
@@ -63,14 +63,11 @@ class MailHandler < ActionMailer::Base
# Ignore auto generated emails # Ignore auto generated emails
self.class.ignored_emails_headers.each do |key, ignored_value| self.class.ignored_emails_headers.each do |key, ignored_value|
value = email.header_string(key) value = email.header_string(key)
if value if value && value.to_s.downcase == ignored_value.downcase
value = value.to_s.downcase if logger && logger.info
if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value logger.info "MailHandler: ignoring email with #{key}:#{value} header"
if logger && logger.info
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
end
return false
end end
return false
end end
end end
@user = User.find_by_mail(sender_email) if sender_email.present? @user = User.find_by_mail(sender_email) if sender_email.present?
+1 -2
View File
@@ -395,8 +395,7 @@ 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-')
+4 -4
View File
@@ -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 "=", ">=", "<=", "><"
+3 -3
View File
@@ -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, underscores but not digits only # donwcase letters, digits, dashes 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.to_s <=> repository.identifier.to_s identifier <=> repository.identifier
end end
end end
+1 -1
View File
@@ -66,7 +66,7 @@ class TimeEntry < ActiveRecord::Base
end end
} }
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields' safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values'
def initialize(attributes=nil, *args) def initialize(attributes=nil, *args)
super super
+4 -7
View File
@@ -130,11 +130,8 @@ 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.empty? return nil if password.to_s.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
@@ -167,7 +164,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.to_s) tokens = Token.find_all_by_action_and_value('autologin', key)
# 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
@@ -341,12 +338,12 @@ class User < Principal
end end
def self.find_by_rss_key(key) def self.find_by_rss_key(key)
token = Token.find_by_action_and_value('feeds', key.to_s) token = Token.find_by_value(key)
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.to_s) token = Token.find_by_action_and_value('api', key)
token && token.user.active? ? token.user : nil token && token.user.active? ? token.user : nil
end end
+1 -1
View File
@@ -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', :maxlength => 255, :placeholder => l(:label_optional_description) %> <%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :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>
+2 -3
View File
@@ -1,9 +1,8 @@
<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({:action => 'diff', :id => @project, <% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
:repository_id => @repository.identifier_param, <%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
: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 -2
View File
@@ -1,8 +1,7 @@
<div class="contextual"> <div class="contextual">
<% form_tag( <% form_tag(
{:action => 'revision', :id => @project, {:action => 'revision', :id => @project,
:repository_id => @repository.identifier_param}, :repository_id => @repository.identifier_param}
:method => :get
) do %> ) do %>
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %> <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
<%= submit_tag 'OK' %> <%= submit_tag 'OK' %>
@@ -21,16 +21,5 @@
<p><%= setting_check_box :rest_api_enabled %></p> <p><%= setting_check_box :rest_api_enabled %></p>
</div> </div>
<fieldset class="box">
<legend><%= l(:label_session_expiration) %></legend>
<div class="tabular settings">
<p><%= setting_select :session_lifetime, [[l(:label_disabled), 0]] + [1, 7, 30, 60, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), (days * 60 * 24).to_s]} %></p>
<p><%= setting_select :session_timeout, [[l(:label_disabled), 0]] + [1, 2, 4, 8, 12, 24, 48].collect{|hours| [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s]} %></p>
</div>
<p><em class="info"><%= l(:text_session_expiration_settings) %></em></p>
</fieldset>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
-1
View File
@@ -1,7 +1,6 @@
<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' %>
-1
View File
@@ -8,7 +8,6 @@ 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
-1
View File
@@ -6,7 +6,6 @@ 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
-66
View File
@@ -85,70 +85,4 @@ 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
# CVE-2012-2695
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/9782f44c4540cf59
module ActiveRecord
class Base
class << self
def sanitize_sql_hash_for_conditions(attrs, default_table_name = quoted_table_name, top_level = true)
attrs = expand_hash_conditions_for_aggregates(attrs)
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
+1 -9
View File
@@ -49,9 +49,6 @@ 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} أيام"
@@ -1029,13 +1026,8 @@ ar:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
-8
View File
@@ -50,9 +50,6 @@ 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} дена"
@@ -198,7 +195,6 @@ 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})"
@@ -390,8 +386,6 @@ bg:
setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата
setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище
setting_unsubscribe: Потребителите могат да премахват профилите си setting_unsubscribe: Потребителите могат да премахват профилите си
setting_session_lifetime: Максимален живот на сесиите
setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите
permission_add_project: Създаване на проект permission_add_project: Създаване на проект
permission_add_subprojects: Създаване на подпроекти permission_add_subprojects: Създаване на подпроекти
@@ -854,7 +848,6 @@ 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: Прикачване
@@ -990,7 +983,6 @@ bg:
text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени
text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link} text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link}
text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване." text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване."
text_session_expiration_settings: "Внимание: промяната на тези установяваноя може да прекрати всички активни сесии, включително и вашата."
default_role_manager: Мениджър default_role_manager: Мениджър
default_role_developer: Разработчик default_role_developer: Разработчик
+1 -9
View File
@@ -48,9 +48,6 @@ 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"
@@ -1043,13 +1040,8 @@ bs:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -52,9 +52,6 @@ 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"
@@ -1031,13 +1028,8 @@ ca:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -53,9 +53,6 @@ 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ů"
@@ -1032,13 +1029,8 @@ cs:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -51,9 +51,6 @@ 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"
@@ -1046,13 +1043,8 @@ da:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+3 -11
View File
@@ -52,9 +52,6 @@ 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'
@@ -1019,8 +1016,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: Vorgänger label_parent_revision: Parent
label_child_revision: Nachfolger label_child_revision: Child
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
@@ -1039,7 +1036,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: Mehrere Werte field_multiple: Mehrer 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)
@@ -1052,8 +1049,3 @@ de:
setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen
button_delete_my_account: Mein Benutzerkonto löschen button_delete_my_account: Mein Benutzerkonto löschen
text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden. text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden.
error_session_expired: Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.
text_session_expiration_settings: "Achtung: Änderungen können aktuelle Sitzungen beenden, Ihre eingeschlossen!"
setting_session_lifetime: Längste Dauer einer Sitzung
setting_session_timeout: Zeitüberschreitung bei Inaktivität
label_session_expiration: Ende einer Sitzung
+1 -9
View File
@@ -51,9 +51,6 @@ 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} ημέρες"
@@ -1029,13 +1026,8 @@ el:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -48,9 +48,6 @@ 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"
@@ -1031,13 +1028,8 @@ en-GB:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -49,9 +49,6 @@ 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"
@@ -197,7 +194,6 @@ 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"
@@ -388,9 +384,7 @@ 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_unsubscribe: Allow users to unsubscribe
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
@@ -853,7 +847,6 @@ 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
@@ -989,7 +982,6 @@ en:
text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes" text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}" text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it." text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
default_role_manager: Manager default_role_manager: Manager
default_role_developer: Developer default_role_developer: Developer
+1 -9
View File
@@ -79,9 +79,6 @@ 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"
@@ -1066,13 +1063,8 @@ es:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
-8
View File
@@ -67,9 +67,6 @@ 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"
@@ -1050,8 +1047,3 @@ et:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -52,9 +52,6 @@ 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"
@@ -1032,13 +1029,8 @@ eu:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -49,9 +49,6 @@ 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} روز"
@@ -1031,13 +1028,8 @@ fa:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -94,9 +94,6 @@ 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ää"
@@ -1050,13 +1047,8 @@ fi:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -53,9 +53,6 @@ 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"
@@ -204,7 +201,6 @@ 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."
@@ -384,9 +380,7 @@ 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_unsubscribe: Permettre aux utilisateurs de se désinscrire
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
@@ -828,7 +822,6 @@ 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
@@ -945,7 +938,6 @@ fr:
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements" text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}" text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver." text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
default_role_manager: "Manager " default_role_manager: "Manager "
default_role_developer: "Développeur " default_role_developer: "Développeur "
+1 -9
View File
@@ -90,9 +90,6 @@ 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'
@@ -1040,13 +1037,8 @@ gl:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -55,9 +55,6 @@ 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} ימים'
@@ -1034,13 +1031,8 @@ he:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+4 -9
View File
@@ -1,3 +1,6 @@
# Croatian translations for Ruby on Rails
# by Helix d.o.o. (info@helix.hr)
hr: hr:
direction: ltr direction: ltr
date: date:
@@ -48,9 +51,6 @@ 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"
@@ -1032,13 +1032,8 @@ hr:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -50,9 +50,6 @@
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'
@@ -1048,13 +1045,8 @@
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -46,9 +46,6 @@ 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"
@@ -1035,13 +1032,8 @@ id:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -54,9 +54,6 @@ 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"
@@ -1030,13 +1027,8 @@ it:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+7 -15
View File
@@ -52,9 +52,6 @@ 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}日"
@@ -351,7 +348,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: 送信元メールアドレス
@@ -761,7 +758,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アクセスキー
@@ -1058,14 +1055,9 @@ 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: アカウントが削除されました。 notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: ユーザによるアカウント削除を許可 setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: 自分のアカウントを削除 button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- 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: セッションが失効しました。ログインし直してください。
text_session_expiration_settings: "警告: この設定を変更すると現在有効なセッションが失効する可能性があります。"
setting_session_lifetime: 有効期間の最大値
setting_session_timeout: 無操作タイムアウト
label_session_expiration: セッション有効期間
+1 -9
View File
@@ -49,9 +49,6 @@ 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}일"
@@ -1079,13 +1076,8 @@ ko:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -58,9 +58,6 @@ 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ų"
@@ -1089,13 +1086,8 @@ lt:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -45,9 +45,6 @@ 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"
@@ -1023,13 +1020,8 @@ lv:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -49,9 +49,6 @@ 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} дена"
@@ -1029,13 +1026,8 @@ mk:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -48,9 +48,6 @@ 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} өдөр"
@@ -1029,13 +1026,8 @@ mn:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -48,9 +48,6 @@ 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 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dag" one: "1 dag"
other: "%{count} dagen" other: "%{count} dagen"
@@ -1011,13 +1008,8 @@ nl:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -43,9 +43,6 @@
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"
@@ -1019,13 +1016,8 @@
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -81,9 +81,6 @@ 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"
@@ -1046,13 +1043,8 @@ pl:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+6 -13
View File
@@ -1,4 +1,5 @@
pt-BR: pt-BR:
# formatos de data e hora
direction: ltr direction: ltr
date: date:
formats: formats:
@@ -18,10 +19,10 @@ pt-BR:
time: time:
formats: formats:
default: "%A, %d de %B de %Y, %H:%M h" default: "%A, %d de %B de %Y, %H:%M hs"
time: "%H:%M h" time: "%H:%M hs"
short: "%d/%m, %H:%M h" short: "%d/%m, %H:%M hs"
long: "%A, %d de %B de %Y, %H:%M h" long: "%A, %d de %B de %Y, %H:%M hs"
only_second: "%S" only_second: "%S"
datetime: datetime:
formats: formats:
@@ -52,9 +53,6 @@ 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'
@@ -1051,13 +1049,8 @@ pt-BR:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -50,9 +50,6 @@ 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"
@@ -1034,13 +1031,8 @@ pt:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -46,9 +46,6 @@ 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"
@@ -1026,13 +1023,8 @@ ro:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+34 -42
View File
@@ -116,9 +116,6 @@ ru:
few: "около %{count} часов" few: "около %{count} часов"
many: "около %{count} часов" many: "около %{count} часов"
other: "около %{count} часа" other: "около %{count} часа"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "%{count} день" one: "%{count} день"
few: "%{count} дня" few: "%{count} дня"
@@ -1092,11 +1089,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: Порядок сортировки description_query_sort_criteria_direction: Sort direction
description_project_scope: Search scope description_project_scope: Search scope
description_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: Enter start date
description_message_content: Message content description_message_content: Message content
@@ -1104,23 +1101,23 @@ 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: Примечания description_notes: Notes
description_date_range_list: Выберите диапазон из списка description_date_range_list: Choose range from list
description_choose_project: Проекты description_choose_project: Projects
description_date_to: Введите дату выполнения description_date_to: Enter end date
description_query_sort_criteria_attribute: Критерий сортировки description_query_sort_criteria_attribute: Sort attribute
description_wiki_subpages_reassign: Выбрать новую родительскую страницу description_wiki_subpages_reassign: Choose new parent page
description_selected_columns: Выбранные столбцы description_selected_columns: Selected Columns
label_parent_revision: Родительский label_parent_revision: Parent
label_child_revision: Дочерний label_child_revision: Child
error_scm_annotate_big_text_file: Комментарий невозможен из-за превышения максимального размера текстового файла. 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: Использовать текущую дату в качестве даты начала для новых задач setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
button_edit_section: Редактировать эту секцию button_edit_section: Edit this section
setting_repositories_encodings: Кодировка вложений и хранилищ setting_repositories_encodings: Attachments and repositories encodings
description_all_columns: Все столбцы description_all_columns: All Columns
button_export: Экспорт button_export: Export
label_export_options: "%{export_format} параметры экспорта" label_export_options: "%{export_format} export options"
error_attachment_too_big: Этот файл нельзя загрузить из-за превышения максимального размера файла (%{max_size}) 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}." 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 Задач zero: 0 Задач
@@ -1128,27 +1125,22 @@ ru:
few: "%{count} Задач" few: "%{count} Задач"
many: "%{count} Задач" many: "%{count} Задач"
other: "%{count} Задач" other: "%{count} Задач"
label_repository_new: Новое хранилище label_repository_new: New repository
field_repository_is_default: Хранилище по умолчанию field_repository_is_default: Main repository
label_copy_attachments: Копировать вложения label_copy_attachments: Copy attachments
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Завершенные версии label_completed_versions: Completed versions
text_project_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.<br />После сохранения идентификатор изменить нельзя. 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: Множественные значения field_multiple: Multiple values
setting_commit_cross_project_ref: Разрешить ссылаться и исправлять задачи во всех остальных проектах setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: Добавить мои примечания и отказаться от моих изменений text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: Применить мои изменения (все предыдущие замечания будут сохранены, но некоторые изменения могут быть перезаписаны) text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: Кто-то изменил задачу, пока вы ее редактировали. notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: Отменить мои изменения и показать задачу заново %{link} text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: Управление связанными задачами permission_manage_related_issues: Manage related issues
field_ldap_filter: Фильтр LDAP field_ldap_filter: LDAP filter
label_search_for_watchers: Найти наблюдателей label_search_for_watchers: Search for watchers to add
notice_account_deleted: "Ваша учетная запись полностью удалена" notice_account_deleted: "Ваша учетная запись полностью удалена"
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
button_delete_my_account: "Удалить мою учетную запись" button_delete_my_account: "Удалить мою учетную запись"
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
error_session_expired: 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 -9
View File
@@ -48,9 +48,6 @@ 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í"
@@ -1029,13 +1026,8 @@ sk:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -49,9 +49,6 @@ 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"
@@ -1029,13 +1026,8 @@ sl:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
File diff suppressed because it is too large Load Diff
+1 -9
View File
@@ -50,9 +50,6 @@ 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"
@@ -1029,13 +1026,8 @@ sr-YU:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -50,9 +50,6 @@ 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} дана"
@@ -1030,13 +1027,8 @@ sr:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+56 -61
View File
@@ -78,9 +78,6 @@ 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"
@@ -206,8 +203,7 @@ 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} valda: %{ids}." notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valt: %{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."
@@ -217,14 +213,11 @@ 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").'
@@ -238,7 +231,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"
@@ -365,9 +358,6 @@ 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
@@ -394,7 +384,6 @@ 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
@@ -427,9 +416,6 @@ 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
@@ -488,7 +474,6 @@ 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
@@ -639,10 +624,6 @@ 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
@@ -703,7 +684,6 @@ 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"
@@ -756,7 +736,6 @@ 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
@@ -885,13 +864,6 @@ 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
@@ -939,9 +911,6 @@ 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
@@ -969,7 +938,6 @@ 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."
@@ -1017,16 +985,11 @@ 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
@@ -1054,26 +1017,58 @@ 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_search: Sökfält description_user_mail_notification: Mail notification settings
description_choose_project: Projekt description_date_from: Enter start date
description_project_scope: Sökomfång description_message_content: Message content
description_notes: Anteckningar description_available_columns: Available Columns
description_message_content: Meddelandeinnehåll description_date_range_interval: Choose range by selecting start and end date
description_query_sort_criteria_attribute: Sorteringsattribut description_issue_category_reassign: Choose issue category
description_query_sort_criteria_direction: Sorteringsriktning description_search: Searchfield
description_user_mail_notification: Mailnotifieringsinställningar description_notes: Notes
description_available_columns: Tillgängliga Kolumner description_date_range_list: Choose range from list
description_selected_columns: Valda Kolumner description_choose_project: Projects
description_all_columns: Alla kolumner description_date_to: Enter end date
description_issue_category_reassign: Välj ärendekategori description_query_sort_criteria_attribute: Sort attribute
description_wiki_subpages_reassign: Välj ny föräldersida description_wiki_subpages_reassign: Choose new parent page
description_date_range_list: Välj intervall från listan description_selected_columns: Selected Columns
description_date_range_interval: Ange intervall genom att välja start- och slutdatum label_parent_revision: Parent
description_date_from: Ange startdatum label_child_revision: Child
description_date_to: Ange slutdatum error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
error_session_expired: Your session has expired. Please login again. setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." button_edit_section: Edit this section
setting_session_lifetime: Session maximum lifetime setting_repositories_encodings: Attachments and repositories encodings
setting_session_timeout: Session inactivity timeout description_all_columns: All Columns
label_session_expiration: Session expiration button_export: Export
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
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.
+1 -9
View File
@@ -48,9 +48,6 @@ 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"
@@ -1026,13 +1023,8 @@ th:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -55,9 +55,6 @@ 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'
@@ -1048,13 +1045,8 @@ tr:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
-8
View File
@@ -48,9 +48,6 @@ 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"
@@ -1029,8 +1026,3 @@ uk:
setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи" setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи"
button_delete_my_account: "Видалити мій обліковий запис" button_delete_my_account: "Видалити мій обліковий запис"
text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?" text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?"
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+1 -9
View File
@@ -79,9 +79,6 @@ 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"
@@ -1080,13 +1077,8 @@ vi:
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
+7 -15
View File
@@ -120,9 +120,6 @@
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} 天"
@@ -258,7 +255,6 @@
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: "在儲存機制中找不到這個項目或修訂版。"
@@ -279,7 +275,6 @@
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 網站密碼
@@ -470,9 +465,6 @@
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: 建立子專案
@@ -934,8 +926,6 @@
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: 送出
@@ -985,7 +975,6 @@
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: 註冊完成
@@ -1070,10 +1059,6 @@
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: 開發人員
@@ -1119,3 +1104,10 @@
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
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.
+20 -28
View File
@@ -51,9 +51,6 @@ 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} 天"
@@ -1010,34 +1007,29 @@ zh:
button_export: 导出 button_export: 导出
label_export_options: "%{export_format} 导出选项" label_export_options: "%{export_format} 导出选项"
error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size}) error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size})
notice_failed_to_save_time_entries: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{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 问题 zero: 0 问题
one: 1 问题 one: 1 问题
other: "%{count} 问题" other: "%{count} 问题"
label_repository_new: 新建版本库 label_repository_new: New repository
field_repository_is_default: 主版本库 field_repository_is_default: Main repository
label_copy_attachments: 复制附件 label_copy_attachments: Copy attachments
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: 已完成的版本 label_completed_versions: Completed versions
text_project_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。<br />一旦保存,标识无法修改。 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: 多重取值 field_multiple: Multiple values
setting_commit_cross_project_ref: 允许引用/修复所有其他项目的问题 setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: 添加说明并取消我的其他变更处理。 text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: 直接套用我的变更 (先前的说明将被保留,但是某些变更内容可能会被覆盖) text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: 当您正在编辑这个问题的时候,它已经被其他人抢先一步更新过了。 notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: 取消我所有的变更并重新刷新显示 %{link} 。 text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: 相关问题管理 permission_manage_related_issues: Manage related issues
field_ldap_filter: LDAP 过滤器 field_ldap_filter: LDAP filter
label_search_for_watchers: 通过查找方式添加跟踪者 label_search_for_watchers: Search for watchers to add
notice_account_deleted: 您的账号已被永久删除(账号已无法恢复)。 notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: 允许用户退订 setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: 删除我的账号 button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- 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: 您的会话已过期。请重新登陆。
text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。"
setting_session_lifetime: 会话最大有效时间
setting_session_timeout: 会话闲置超时
label_session_expiration: 会话过期
+2 -4
View File
@@ -259,8 +259,7 @@ 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)/,
@@ -291,8 +290,7 @@ 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)/,
-8
View File
@@ -36,14 +36,6 @@ unsubscribe:
password_min_length: password_min_length:
format: int format: int
default: 4 default: 4
# Maximum lifetime of user sessions in minutes
session_lifetime:
format: int
default: 0
# User session timeout in minutes
session_timeout:
format: int
default: 0
attachment_max_size: attachment_max_size:
format: int format: int
default: 5120 default: 5120
-61
View File
@@ -4,67 +4,6 @@ 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/
== 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 == 2012-04-20 v1.4.1
* Defect #8574: Time report: date range fields not enabled when using the calendar popup * Defect #8574: Time report: date range fields not enabled when using the calendar popup
+105 -63
View File
@@ -1,9 +1,64 @@
#!/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 'optparse' require 'getoptlong'
require 'rdoc/usage'
module Net module Net
class HTTPS < HTTP class HTTPS < HTTP
@@ -23,68 +78,64 @@ module Net
end end
class RedmineMailHandler class RedmineMailHandler
VERSION = '0.2' VERSION = '0.1'
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 = {}
optparse = OptionParser.new do |opts| opts = GetoptLong.new(
opts.banner = "Usage: rdm-mailhandler.rb [options] --url=<Redmine URL> --key=<API key>" [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
opts.separator("") [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
opts.separator("Reads an email from standard input and forward it to a Redmine server through a HTTP request.") [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
opts.separator("") [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
opts.separator("Required arguments:") [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
opts.on("-u", "--url URL", "URL of the Redmine server") {|v| self.url = v} [ '--key-file', GetoptLong::REQUIRED_ARGUMENT],
opts.on("-k", "--key KEY", "Redmine API key") {|v| self.key = v} [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
opts.separator("") [ '--status', '-s', GetoptLong::REQUIRED_ARGUMENT ],
opts.separator("General options:") [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
opts.on("--unknown-user ACTION", "how to handle emails from an unknown user", [ '--category', GetoptLong::REQUIRED_ARGUMENT],
"ACTION can be one of the following values:", [ '--priority', GetoptLong::REQUIRED_ARGUMENT],
"* ignore: email is ignored (default)", [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
"* accept: accept as anonymous user", [ '--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
"* create: create a user account") {|v| self.unknown_user = v} [ '--no-permission-check', GetoptLong::NO_ARGUMENT],
opts.on("--no-permission-check", "disable permission checking when receiving", [ '--no-check-certificate', GetoptLong::NO_ARGUMENT]
"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.summary_width = 27 opts.each do |opt, arg|
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!
unless url && key RDoc.usage if url.nil?
puts "Some arguments are missing. Use `rdm-mailhandler.rb --help` for getting help."
exit 1
end
end end
def submit(email) def submit(email)
@@ -130,15 +181,6 @@ 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
+2 -9
View File
@@ -366,19 +366,12 @@ 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 => $bind_as, binddn => $rowldap[3] ? $rowldap[3] : "",
bindpw => $bind_pw, bindpw => $rowldap[4] ? $rowldap[4] : "",
filter => "(".$rowldap[6]."=%s)" filter => "(".$rowldap[6]."=%s)"
); );
my $method = $r->method; my $method = $r->method;
+114 -80
View File
@@ -1,13 +1,96 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
require 'optparse' # == Synopsis
#
# 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.4" Version = "1.3"
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 = ''
@@ -50,84 +133,36 @@ module SCM
end end
def read_key_from_file(filename) begin
begin opts.each do |opt, arg|
$api_key = File.read(filename).strip case opt
rescue Exception => e when '--svn-dir'; $repos_base = arg.dup
$stderr.puts "Unable to read the key from #{filename}: #{e.message}" when '--redmine-host'; $redmine_host = arg.dup
exit 1 when '--key'; $api_key = arg.dup
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
@@ -144,8 +179,7 @@ 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?)
puts "Some arguments are missing. Use reposman.rb --help for getting help." RDoc::usage
exit 1
end end
unless File.directory?($repos_base) unless File.directory?($repos_base)
+3 -3
View File
@@ -138,21 +138,21 @@ module Redmine
# Add list and boolean custom fields as available criteria # Add list and boolean custom fields as available criteria
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields) custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf| custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id ORDER BY c.value LIMIT 1)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end if @project end if @project
# Add list and boolean time entry custom fields # Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id ORDER BY c.value LIMIT 1)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end end
# Add list and boolean time entry activity custom fields # Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id ORDER BY c.value LIMIT 1)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end end
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 1 MAJOR = 1
MINOR = 4 MINOR = 4
TINY = 5 TINY = 1
# Branch values: # Branch values:
# * official release: nil # * official release: nil
+1 -1
View File
@@ -29,7 +29,7 @@ module Redmine
end end
def method_missing(sym, *args, &block) def method_missing(sym, *args, &block)
if args.size == 1 && args.first.is_a?(::Time) if args.size == 1 && args.first.is_a?(Time)
__send__ sym, args.first.xmlschema, &block __send__ sym, args.first.xmlschema, &block
else else
super super
@@ -69,7 +69,7 @@ module Redmine
l = 1 l = 1
started = false started = false
ended = false ended = false
text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level| text.scan(/(((?:.*?)(\A|\r?\n\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level|
if heading.nil? if heading.nil?
if ended if ended
after << all after << all
+1 -1
View File
@@ -176,7 +176,7 @@ END_DESC
ActionMailer::Base.raise_delivery_errors = true ActionMailer::Base.raise_delivery_errors = true
begin begin
Mailer.deliver_test_email(user) Mailer.deliver_test_email(User.current)
puts l(:notice_email_sent, user.mail) puts l(:notice_email_sent, user.mail)
rescue Exception => e rescue Exception => e
abort l(:notice_email_error, e.message) abort l(:notice_email_error, e.message)
@@ -1,126 +0,0 @@
// ** I18N
// Calendar SQ language
// Encoding: any
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
Calendar._DN = new Array
("Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// Calendar._SDN_len = N; // short day name length
// Calendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
Calendar._SDN = new Array
("Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun");
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
Calendar._FD = 0;
// full month names
Calendar._MN = new Array
("January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December");
// short month names
Calendar._SMN = new Array
("Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec");
// tooltips
Calendar._TT = {};
Calendar._TT["INFO"] = "About the calendar";
Calendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
"\n\n" +
"Date selection:\n" +
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
Calendar._TT["GO_TODAY"] = "Go Today";
Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
Calendar._TT["SEL_DATE"] = "Select date";
Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
Calendar._TT["PART_TODAY"] = " (today)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
Calendar._TT["DAY_FIRST"] = "Display %s first";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
Calendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "Close";
Calendar._TT["TODAY"] = "Today";
Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
Calendar._TT["WK"] = "wk";
Calendar._TT["TIME"] = "Time:";
@@ -1,16 +1,16 @@
jsToolBar.strings = {}; jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Получер'; jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Курсив'; jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Подчертан'; jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Изтрит'; jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Вграден код'; jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Заглавие 1'; jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Заглавие 2'; jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Заглавие 3'; jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Неподреден списък'; jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Подреден списък'; jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Цитат'; jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Премахване на цитат'; jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text'; jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Връзка до Wiki страница'; jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Изображение'; jsToolBar.strings['Image'] = 'Image';
@@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';
+1 -1
View File
@@ -4,7 +4,7 @@ table.revision-info td {
padding: 0px; padding: 0px;
} }
div.revision-graph { position: absolute; min-width: 1px; } div.revision-graph { position: absolute; }
div.changeset-changes ul { margin: 0; padding: 0; } div.changeset-changes ul { margin: 0; padding: 0; }
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; } div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
-1
View File
@@ -21,7 +21,6 @@ custom_fields_002:
min_length: 1 min_length: 1
regexp: "" regexp: ""
is_for_all: true is_for_all: true
is_filter: true
type: IssueCustomField type: IssueCustomField
max_length: 100 max_length: 100
possible_values: "" possible_values: ""
-4
View File
@@ -4,19 +4,16 @@ enumerations_001:
id: 1 id: 1
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 1
enumerations_002: enumerations_002:
name: User documentation name: User documentation
id: 2 id: 2
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 2
enumerations_003: enumerations_003:
name: Technical documentation name: Technical documentation
id: 3 id: 3
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 3
enumerations_004: enumerations_004:
name: Low name: Low
id: 4 id: 4
@@ -95,4 +92,3 @@ enumerations_016:
id: 16 id: 16
type: DocumentCategory type: DocumentCategory
active: false active: false
position: 4
@@ -96,13 +96,8 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_save_diff_type def test_save_diff_type
user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin @request.session[:user_id] = 1 # admin
user = User.find(1)
get :show, :id => 5 get :show, :id => 5
assert_response :success assert_response :success
assert_template 'diff' assert_template 'diff'
+4 -23
View File
@@ -18,9 +18,7 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class DocumentsControllerTest < ActionController::TestCase class DocumentsControllerTest < ActionController::TestCase
fixtures :projects, :users, :roles, :members, :member_roles, fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations
:enabled_modules, :documents, :enumerations,
:groups_users, :attachments
def setup def setup
User.current = nil User.current = nil
@@ -97,16 +95,16 @@ LOREM
def test_create_with_one_attachment def test_create_with_one_attachment
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'document_added'
@request.session[:user_id] = 2 @request.session[:user_id] = 2
set_tmp_attachments_directory set_tmp_attachments_directory
with_settings :notified_events => %w(document_added) do post :create, :project_id => 'ecookbook',
post :create, :project_id => 'ecookbook',
:document => { :title => 'DocumentsControllerTest#test_post_new', :document => { :title => 'DocumentsControllerTest#test_post_new',
:description => 'This is a new document', :description => 'This is a new document',
:category_id => 2}, :category_id => 2},
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
end
assert_redirected_to '/projects/ecookbook/documents' assert_redirected_to '/projects/ecookbook/documents'
document = Document.find_by_title('DocumentsControllerTest#test_post_new') document = Document.find_by_title('DocumentsControllerTest#test_post_new')
@@ -126,23 +124,6 @@ LOREM
assert_template 'new' assert_template 'new'
end end
def test_create_non_default_category
@request.session[:user_id] = 2
category2 = Enumeration.find_by_name('User documentation')
category2.update_attributes(:is_default => true)
category1 = Enumeration.find_by_name('Uncategorized')
post :create,
:project_id => 'ecookbook',
:document => { :title => 'no default',
:description => 'This is a new document',
:category_id => category1.id }
assert_redirected_to '/projects/ecookbook/documents'
doc = Document.find_by_title('no default')
assert_not_nil doc
assert_equal category1.id, doc.category_id
assert_equal category1, doc.category
end
def test_edit def test_edit
@request.session[:user_id] = 2 @request.session[:user_id] = 2
get :edit, :id => 1 get :edit, :id => 1
+6 -6
View File
@@ -58,14 +58,13 @@ class FilesControllerTest < ActionController::TestCase
def test_create_file def test_create_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
with_settings :notified_events => %w(file_added) do assert_difference 'Attachment.count' do
assert_difference 'Attachment.count' do post :create, :project_id => 1, :version_id => '',
post :create, :project_id => 1, :version_id => '', :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} assert_response :redirect
assert_response :redirect
end
end end
assert_redirected_to '/projects/ecookbook/files' assert_redirected_to '/projects/ecookbook/files'
a = Attachment.find(:first, :order => 'created_on DESC') a = Attachment.find(:first, :order => 'created_on DESC')
@@ -81,6 +80,7 @@ class FilesControllerTest < ActionController::TestCase
def test_create_version_file def test_create_version_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
assert_difference 'Attachment.count' do assert_difference 'Attachment.count' do
post :create, :project_id => 1, :version_id => '2', post :create, :project_id => 1, :version_id => '2',
@@ -1305,7 +1305,6 @@ class IssuesControllerTest < ActionController::TestCase
:tag => 'input', :tag => 'input',
:attributes => {:type => 'file', :name => 'attachments[1][file]'} :attributes => {:type => 'file', :name => 'attachments[1][file]'}
} }
assert_select 'input[name=?][maxlength=255]', 'attachments[1][description]'
end end
def test_get_new_should_prefill_the_form_from_params def test_get_new_should_prefill_the_form_from_params
+2 -3
View File
@@ -91,12 +91,11 @@ class MessagesControllerTest < ActionController::TestCase
def test_post_new def test_post_new
@request.session[:user_id] = 2 @request.session[:user_id] = 2
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events = ['message_posted']
with_settings :notified_events => %w(message_posted) do post :new, :board_id => 1,
post :new, :board_id => 1,
:message => { :subject => 'Test created message', :message => { :subject => 'Test created message',
:content => 'Message body'} :content => 'Message body'}
end
message = Message.find_by_subject('Test created message') message = Message.find_by_subject('Test created message')
assert_not_nil message assert_not_nil message
assert_redirected_to "/boards/1/topics/#{message.to_param}" assert_redirected_to "/boards/1/topics/#{message.to_param}"
+3 -4
View File
@@ -82,13 +82,12 @@ class NewsControllerTest < ActionController::TestCase
def test_post_create def test_post_create
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
@request.session[:user_id] = 2 Setting.notified_events << 'news_added'
with_settings :notified_events => %w(news_added) do @request.session[:user_id] = 2
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest', post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
:description => 'This is the description', :description => 'This is the description',
:summary => '' } :summary => '' }
end
assert_redirected_to '/projects/ecookbook/news' assert_redirected_to '/projects/ecookbook/news'
news = News.find_by_title('NewsControllerTest') news = News.find_by_title('NewsControllerTest')
@@ -53,48 +53,11 @@ class RepositoriesGitControllerTest < ActionController::TestCase
if @char_1.respond_to?(:force_encoding) if @char_1.respond_to?(:force_encoding)
@char_1.force_encoding('UTF-8') @char_1.force_encoding('UTF-8')
end end
end
def test_create_and_update Setting.default_language = 'en'
@request.session[:user_id] = 1
assert_difference 'Repository.count' do
post :create, :project_id => 'subproject1',
:repository_scm => 'Git',
:repository => {
:url => '/test',
:is_default => '0',
:identifier => 'test-create',
:extra_report_last_commit => '1',
}
end
assert_response 302
repository = Repository.first(:order => 'id DESC')
assert_kind_of Repository::Git, repository
assert_equal '/test', repository.url
assert_equal true, repository.extra_report_last_commit
put :update, :id => repository.id,
:repository => {
:extra_report_last_commit => '0',
:identifier => 'test-update',
}
assert_response 302
repo2 = Repository.find(repository.id)
assert_equal 'test-update', repo2.identifier
assert_equal false, repo2.extra_report_last_commit
end end
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
## Ruby uses ANSI api to fork a process on Windows.
## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
## and these are incompatible with ASCII.
## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
## http://code.google.com/p/msysgit/issues/detail?id=80
## So, Latin-1 path tests fail on Japanese Windows
WINDOWS_PASS = (Redmine::Platform.mswin? &&
Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
def test_get_new def test_get_new
@request.session[:user_id] = 1 @request.session[:user_id] = 1
@project.repository.destroy @project.repository.destroy
@@ -222,8 +185,6 @@ class RepositoriesGitControllerTest < ActionController::TestCase
def test_entry_show_latin_1 def test_entry_show_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
elsif WINDOWS_PASS
puts WINDOWS_SKIP_STR
elsif JRUBY_SKIP elsif JRUBY_SKIP
puts JRUBY_SKIP_STR puts JRUBY_SKIP_STR
else else
@@ -263,8 +224,6 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
def test_diff def test_diff
assert_equal true, @repository.is_default
assert_nil @repository.identifier
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
@project.reload @project.reload
@@ -287,55 +246,26 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
end end
def test_diff_with_rev_and_path
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
with_settings :diff_max_lines_displayed => 1000 do
# Full diff of changeset 2f9c0091
['inline', 'sbs'].each do |dt|
get :diff,
:id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:type => dt
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_tag :tag => 'th',
:content => '22',
:sibling => { :tag => 'td',
:attributes => { :class => /diff_out/ },
:content => /def remove/ }
assert_tag :tag => 'h2', :content => /2f9c0091/
end
end
end
def test_diff_truncated def test_diff_truncated
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
@project.reload @project.reload
assert_equal NUM_REV, @repository.changesets.count assert_equal NUM_REV, @repository.changesets.count
Setting.diff_max_lines_displayed = 5
with_settings :diff_max_lines_displayed => 5 do # Truncated diff of changeset 2f9c0091
# Truncated diff of changeset 2f9c0091 with_cache do
with_cache do get :diff, :id => PRJ_ID, :type => 'inline',
with_settings :default_language => 'en' do :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
get :diff, :id => PRJ_ID, :type => 'inline', assert_response :success
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' assert @response.body.include?("... This diff was truncated")
assert_response :success
assert @response.body.include?("... This diff was truncated") Setting.default_language = 'fr'
end get :diff, :id => PRJ_ID, :type => 'inline',
with_settings :default_language => 'fr' do :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
get :diff, :id => PRJ_ID, :type => 'inline', assert_response :success
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' assert ! @response.body.include?("... This diff was truncated")
assert_response :success assert @response.body.include?("... Ce diff")
assert ! @response.body.include?("... This diff was truncated")
assert @response.body.include?("... Ce diff")
end
end
end end
end end
@@ -355,55 +285,9 @@ class RepositoriesGitControllerTest < ActionController::TestCase
diff = assigns(:diff) diff = assigns(:diff)
assert_not_nil diff assert_not_nil diff
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/ assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/revisions/" +
"61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
end end
end end
def test_diff_path_in_subrepo
repo = Repository::Git.create(
:project => @project,
:url => REPOSITORY_PATH,
:identifier => 'test-diff-path',
:path_encoding => 'ISO-8859-1'
);
assert repo
assert_equal false, repo.is_default
assert_equal 'test-diff-path', repo.identifier
get :diff,
:id => PRJ_ID,
:repository_id => 'test-diff-path',
:rev => '61b685fbe55ab05b',
:rev_to => '2f9c0091c754a91a',
:type => 'inline'
assert_response :success
assert_template 'diff'
diff = assigns(:diff)
assert_not_nil diff
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/test-diff-path/" +
"revisions/61b685fbe55ab05b/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91a'
}
end
def test_diff_latin_1 def test_diff_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
@@ -435,13 +319,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
def test_save_diff_type def test_save_diff_type
user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin @request.session[:user_id] = 1 # admin
user = User.find(1)
get :diff, get :diff,
:id => PRJ_ID, :id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
@@ -527,8 +406,6 @@ class RepositoriesGitControllerTest < ActionController::TestCase
def test_annotate_latin_1 def test_annotate_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
elsif WINDOWS_PASS
puts WINDOWS_SKIP_STR
elsif JRUBY_SKIP elsif JRUBY_SKIP
puts JRUBY_SKIP_STR puts JRUBY_SKIP_STR
else else
@@ -547,21 +424,6 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
end end
def test_revisions
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
get :revisions, :id => PRJ_ID
assert_response :success
assert_template 'revisions'
assert_tag :tag => 'form',
:attributes => {
:method => 'get',
:action => '/projects/subproject1/repository/revision'
}
end
def test_revision def test_revision
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
-113
View File
@@ -1,113 +0,0 @@
# Redmine - project management software
# Copyright (C) 2006-2012 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.expand_path('../../test_helper', __FILE__)
class SessionStartTest < ActionController::TestCase
tests AccountController
def test_login_should_set_session_timestamps
post :login, :username => 'jsmith', :password => 'jsmith'
assert_response 302
assert_equal 2, session[:user_id]
assert_not_nil session[:ctime]
assert_not_nil session[:atime]
end
end
class SessionsTest < ActionController::TestCase
tests WelcomeController
def test_atime_from_user_session_should_be_updated
created = 2.hours.ago.utc.to_i
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
assert_response :success
assert_equal created, session[:ctime]
assert_not_equal created, session[:atime]
assert session[:atime] > created
end
def test_user_session_should_not_be_reset_if_lifetime_and_timeout_disabled
with_settings :session_lifetime => '0', :session_timeout => '0' do
get :index, {}, {:user_id => 2}
assert_response :success
end
end
def test_user_session_without_ctime_should_be_reset_if_lifetime_enabled
with_settings :session_lifetime => '720' do
get :index, {}, {:user_id => 2}
assert_redirected_to '/login'
end
end
def test_user_session_with_expired_ctime_should_be_reset_if_lifetime_enabled
with_settings :session_timeout => '720' do
get :index, {}, {:user_id => 2, :atime => 2.days.ago.utc.to_i}
assert_redirected_to '/login'
end
end
def test_user_session_with_valid_ctime_should_not_be_reset_if_lifetime_enabled
with_settings :session_timeout => '720' do
get :index, {}, {:user_id => 2, :atime => 3.hours.ago.utc.to_i}
assert_response :success
end
end
def test_user_session_without_atime_should_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2}
assert_redirected_to '/login'
end
end
def test_user_session_with_expired_atime_should_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2, :atime => 4.hours.ago.utc.to_i}
assert_redirected_to '/login'
end
end
def test_user_session_with_valid_atime_should_not_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2, :atime => 10.minutes.ago.utc.to_i}
assert_response :success
end
end
def test_expired_user_session_should_be_restarted_if_autologin
with_settings :session_lifetime => '720', :session_timeout => '60', :autologin => 7 do
token = Token.create!(:user_id => 2, :action => 'autologin', :created_on => 1.day.ago)
@request.cookies['autologin'] = token.value
created = 2.hours.ago.utc.to_i
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
assert_equal 2, session[:user_id]
assert_response :success
assert_not_equal created, session[:ctime]
assert session[:ctime] >= created
end
end
def test_anonymous_session_should_not_be_reset
with_settings :session_lifetime => '720', :session_timeout => '60' do
get :index
assert_response :success
end
end
end
@@ -57,7 +57,6 @@ class SettingsControllerTest < ActionController::TestCase
assert !Setting.bcc_recipients? assert !Setting.bcc_recipients?
assert_equal %w(issue_added issue_updated news_added), Setting.notified_events assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
assert_equal 'Test footer', Setting.emails_footer assert_equal 'Test footer', Setting.emails_footer
Setting.clear_cache
end end
def test_get_plugin_settings def test_get_plugin_settings
-4
View File
@@ -33,10 +33,6 @@ class SysControllerTest < ActionController::TestCase
Setting.enabled_scm = %w(Subversion Git) Setting.enabled_scm = %w(Subversion Git)
end end
def teardown
Setting.clear_cache
end
def test_projects_with_repository_enabled def test_projects_with_repository_enabled
get :projects get :projects
assert_response :success assert_response :success

Some files were not shown because too many files have changed in this diff Show More